summaryrefslogtreecommitdiffstats
path: root/doc
diff options
context:
space:
mode:
Diffstat (limited to 'doc')
-rw-r--r--doc/.cvsignore16
-rw-r--r--doc/ChangeLog628
-rw-r--r--doc/FAQ/.cvsignore33
-rw-r--r--doc/FAQ/FAQ.texi117
-rw-r--r--doc/FAQ/Makefile.am83
-rw-r--r--doc/FAQ/basic.t212
-rw-r--r--doc/FAQ/bsp.t35
-rw-r--r--doc/FAQ/build45.t418
-rw-r--r--doc/FAQ/concepts.t19
-rw-r--r--doc/FAQ/debug.t158
-rw-r--r--doc/FAQ/endoftime.t111
-rw-r--r--doc/FAQ/entry60
-rw-r--r--doc/FAQ/freesw.t169
-rw-r--r--doc/FAQ/hwdebugaids.t110
-rw-r--r--doc/FAQ/projects.t113
-rw-r--r--doc/FAQ/tools.t71
-rw-r--r--doc/HELP.html21
-rw-r--r--doc/Makefile.am41
-rw-r--r--doc/README56
-rw-r--r--doc/TODO95
-rw-r--r--doc/acinclude.m418
-rw-r--r--doc/ada_user/.cvsignore28
-rw-r--r--doc/ada_user/Makefile.am55
-rw-r--r--doc/ada_user/ada_user.texi166
-rw-r--r--doc/ada_user/example.texi21
-rw-r--r--doc/bsp_howto/.cvsignore43
-rw-r--r--doc/bsp_howto/Makefile.am127
-rw-r--r--doc/bsp_howto/adaintr.t81
-rw-r--r--doc/bsp_howto/analog.t166
-rw-r--r--doc/bsp_howto/ata.t199
-rw-r--r--doc/bsp_howto/bsp_howto.texi128
-rw-r--r--doc/bsp_howto/clock.t132
-rw-r--r--doc/bsp_howto/console.t377
-rw-r--r--doc/bsp_howto/discrete.t186
-rw-r--r--doc/bsp_howto/ide-ctrl.t153
-rw-r--r--doc/bsp_howto/init.t430
-rw-r--r--doc/bsp_howto/intro.t57
-rw-r--r--doc/bsp_howto/linkcmds.t425
-rw-r--r--doc/bsp_howto/makefiles.t226
-rw-r--r--doc/bsp_howto/nvmem.t234
-rw-r--r--doc/bsp_howto/rtc.t188
-rw-r--r--doc/bsp_howto/shmsupp.t269
-rw-r--r--doc/bsp_howto/support.t257
-rw-r--r--doc/bsp_howto/target.t212
-rw-r--r--doc/bsp_howto/timer.t121
-rw-r--r--doc/common/.cvsignore3
-rw-r--r--doc/common/cpright.texi40
-rw-r--r--doc/common/rtems.texi.in17
-rw-r--r--doc/common/setup.texi63
-rw-r--r--doc/common/timemac.texi36
-rw-r--r--doc/common/timetbl.t1330
-rw-r--r--doc/common/timing.t396
-rw-r--r--doc/common/treedef.tex317
-rw-r--r--doc/common/wksheets.t409
-rw-r--r--doc/configure.ac230
-rw-r--r--doc/develenv/.cvsignore22
-rw-r--r--doc/develenv/Makefile.am41
-rw-r--r--doc/develenv/develenv.texi114
-rw-r--r--doc/develenv/direct.t696
-rw-r--r--doc/develenv/intro.texi58
-rw-r--r--doc/develenv/sample.t328
-rw-r--r--doc/develenv/utils.t260
-rw-r--r--doc/filesystem/.cvsignore32
-rw-r--r--doc/filesystem/Makefile.am69
-rw-r--r--doc/filesystem/filesystem.texi109
-rw-r--r--doc/filesystem/fsrequirements.t1183
-rw-r--r--doc/filesystem/imfs.t2038
-rw-r--r--doc/filesystem/init.t113
-rw-r--r--doc/filesystem/miniimfs.t16
-rw-r--r--doc/filesystem/mounting.t171
-rw-r--r--doc/filesystem/patheval.t109
-rw-r--r--doc/filesystem/preface.texi83
-rw-r--r--doc/filesystem/syscalls.t1130
-rw-r--r--doc/filesystem/tftp.t14
-rw-r--r--doc/gnu_docs/.cvsignore2
-rw-r--r--doc/gnu_docs/ChangeLog24
-rw-r--r--doc/gnu_docs/Makefile.am5
-rw-r--r--doc/gnu_docs/Tool_Doc_Instructions42
-rw-r--r--doc/gnu_docs/gen_docs164
-rw-r--r--doc/gnu_docs/gnu_footer.html1
-rw-r--r--doc/gnu_docs/gnu_header.html5
-rw-r--r--doc/gnu_docs/index.html143
-rw-r--r--doc/gnu_docs/mk_install_dir29
-rw-r--r--doc/gnu_docs/refcard.html13
-rw-r--r--doc/gnu_docs/rtems_tools_index.html15
-rw-r--r--doc/images/dir-arrow.gifbin0 -> 2609 bytes
-rw-r--r--doc/images/dvi.gifbin0 -> 156 bytes
-rw-r--r--doc/images/missing-arrow.gifbin0 -> 166 bytes
-rw-r--r--doc/images/next-arrow.gifbin0 -> 275 bytes
-rw-r--r--doc/images/oaronly.jpgbin0 -> 1584 bytes
-rw-r--r--doc/images/pdf.gifbin0 -> 249 bytes
-rw-r--r--doc/images/pdf1.gifbin0 -> 173 bytes
-rw-r--r--doc/images/prev-arrow.gifbin0 -> 279 bytes
-rw-r--r--doc/images/ps.gifbin0 -> 244 bytes
-rw-r--r--doc/images/rtems_logo.jpgbin0 -> 14586 bytes
-rw-r--r--doc/images/up-arrow.gifbin0 -> 264 bytes
-rw-r--r--doc/index.html.in281
-rw-r--r--doc/itron3.0/.cvsignore38
-rw-r--r--doc/itron3.0/Makefile.am103
-rw-r--r--doc/itron3.0/config.t187
-rw-r--r--doc/itron3.0/eventflags.t860
-rw-r--r--doc/itron3.0/fixedblock.t389
-rw-r--r--doc/itron3.0/gen_all4
-rw-r--r--doc/itron3.0/gen_section191
-rw-r--r--doc/itron3.0/gen_status_shell230
-rw-r--r--doc/itron3.0/interrupt.t306
-rw-r--r--doc/itron3.0/itron.texi143
-rw-r--r--doc/itron3.0/mailbox.t338
-rw-r--r--doc/itron3.0/memorypool.t401
-rw-r--r--doc/itron3.0/msgbuffer.t826
-rw-r--r--doc/itron3.0/network.t162
-rw-r--r--doc/itron3.0/preface.texi14
-rw-r--r--doc/itron3.0/rendezvous.t395
-rw-r--r--doc/itron3.0/semaphore.t642
-rw-r--r--doc/itron3.0/status.t943
-rw-r--r--doc/itron3.0/task.t767
-rw-r--r--doc/itron3.0/tasksync.t388
-rw-r--r--doc/itron3.0/time.t310
-rw-r--r--doc/main.am9
-rw-r--r--doc/networking/.cvsignore31
-rw-r--r--doc/networking/Makefile.am71
-rw-r--r--doc/networking/PCIreg.eps319
-rw-r--r--doc/networking/PCIreg.jpgbin0 -> 48116 bytes
-rw-r--r--doc/networking/decdriver.t292
-rw-r--r--doc/networking/driver.t342
-rw-r--r--doc/networking/networkapp.t838
-rw-r--r--doc/networking/networkflow.eps1343
-rw-r--r--doc/networking/networkflow.jpgbin0 -> 36969 bytes
-rw-r--r--doc/networking/networkflow.pngbin0 -> 12933 bytes
-rw-r--r--doc/networking/networking.texi105
-rw-r--r--doc/networking/networktasks.t55
-rw-r--r--doc/networking/preface.texi58
-rw-r--r--doc/networking/recvbd.eps181
-rw-r--r--doc/networking/recvbd.jpgbin0 -> 11100 bytes
-rw-r--r--doc/networking/servers.t118
-rw-r--r--doc/networking/testing.t257
-rw-r--r--doc/new_chapters/.cvsignore33
-rw-r--r--doc/new_chapters/ChangeLog64
-rw-r--r--doc/new_chapters/Makefile.am77
-rw-r--r--doc/new_chapters/STATUS9
-rw-r--r--doc/new_chapters/TODO4
-rw-r--r--doc/new_chapters/adminiface.t129
-rw-r--r--doc/new_chapters/base.t62
-rw-r--r--doc/new_chapters/confspace.t1351
-rw-r--r--doc/new_chapters/cpuuse.t142
-rw-r--r--doc/new_chapters/dumpcontrol.t98
-rw-r--r--doc/new_chapters/error.t164
-rw-r--r--doc/new_chapters/eventlog.t1265
-rw-r--r--doc/new_chapters/gen_section238
-rw-r--r--doc/new_chapters/monitor.t224
-rw-r--r--doc/new_chapters/new_chapters.texi131
-rw-r--r--doc/new_chapters/rtmonuse.t294
-rw-r--r--doc/new_chapters/stackchk.t192
-rw-r--r--doc/porting/.cvsignore34
-rw-r--r--doc/porting/Makefile.am82
-rw-r--r--doc/porting/codetuning.t155
-rw-r--r--doc/porting/cpuinit.t150
-rw-r--r--doc/porting/cpumodels.t138
-rw-r--r--doc/porting/developtools.t26
-rw-r--r--doc/porting/idlethread.t116
-rw-r--r--doc/porting/interrupts.t418
-rw-r--r--doc/porting/miscellaneous.t175
-rw-r--r--doc/porting/porting.texi138
-rw-r--r--doc/porting/preface.texi42
-rw-r--r--doc/porting/prioritybitmap.t199
-rw-r--r--doc/porting/sourcecode.t23
-rw-r--r--doc/porting/taskcontext.t531
-rw-r--r--doc/posix1003.1/.cvsignore44
-rw-r--r--doc/posix1003.1/Makefile.am129
-rw-r--r--doc/posix1003.1/ch01.t40
-rw-r--r--doc/posix1003.1/ch02.t279
-rw-r--r--doc/posix1003.1/ch03.t203
-rw-r--r--doc/posix1003.1/ch04.t181
-rw-r--r--doc/posix1003.1/ch05.t222
-rw-r--r--doc/posix1003.1/ch06.t175
-rw-r--r--doc/posix1003.1/ch07.t207
-rw-r--r--doc/posix1003.1/ch08.t288
-rw-r--r--doc/posix1003.1/ch09.t38
-rw-r--r--doc/posix1003.1/ch10.t68
-rw-r--r--doc/posix1003.1/ch11.t133
-rw-r--r--doc/posix1003.1/ch12.t77
-rw-r--r--doc/posix1003.1/ch13.t132
-rw-r--r--doc/posix1003.1/ch14.t71
-rw-r--r--doc/posix1003.1/ch15.t72
-rw-r--r--doc/posix1003.1/ch16.t72
-rw-r--r--doc/posix1003.1/ch17.t31
-rw-r--r--doc/posix1003.1/ch18.t66
-rw-r--r--doc/posix1003.1/compliance_list368
-rw-r--r--doc/posix1003.1/posix1003_1.texi132
-rw-r--r--doc/posix1003.1/preface.texi29
-rwxr-xr-xdoc/posix1003.1/summarize202
-rw-r--r--doc/posix_users/.cvsignore48
-rw-r--r--doc/posix_users/Makefile.am143
-rw-r--r--doc/posix_users/cancel.t239
-rw-r--r--doc/posix_users/clock.t369
-rw-r--r--doc/posix_users/cond.t383
-rw-r--r--doc/posix_users/cspecific.t749
-rw-r--r--doc/posix_users/device.t540
-rw-r--r--doc/posix_users/files.t2410
-rw-r--r--doc/posix_users/gen_size_report213
-rw-r--r--doc/posix_users/io.t1144
-rw-r--r--doc/posix_users/key.t152
-rw-r--r--doc/posix_users/libc.t348
-rw-r--r--doc/posix_users/libm.t58
-rw-r--r--doc/posix_users/memorymgmt.t375
-rw-r--r--doc/posix_users/message.t695
-rw-r--r--doc/posix_users/mutex.t744
-rw-r--r--doc/posix_users/posix_users.texi160
-rw-r--r--doc/posix_users/preface.texi36
-rw-r--r--doc/posix_users/procenv.t964
-rw-r--r--doc/posix_users/process.t496
-rw-r--r--doc/posix_users/sched.t219
-rw-r--r--doc/posix_users/semaphores.t596
-rw-r--r--doc/posix_users/signal.t945
-rw-r--r--doc/posix_users/status.t61
-rw-r--r--doc/posix_users/systemdb.t307
-rw-r--r--doc/posix_users/thread.t1332
-rw-r--r--doc/posix_users/timer.t196
-rw-r--r--doc/project.am86
-rw-r--r--doc/relnotes/.cvsignore22
-rw-r--r--doc/relnotes/ChangeLog69
-rw-r--r--doc/relnotes/Makefile.am22
-rw-r--r--doc/relnotes/install.texi174
-rw-r--r--doc/relnotes/intro.texi198
-rw-r--r--doc/relnotes/probrep.texi62
-rw-r--r--doc/relnotes/relnotes.texi113
-rw-r--r--doc/relnotes/status.texi190
-rw-r--r--doc/rgdb_specs/.cvsignore35
-rw-r--r--doc/rgdb_specs/Makefile.am80
-rw-r--r--doc/rgdb_specs/comm.t115
-rw-r--r--doc/rgdb_specs/conclusion.t51
-rw-r--r--doc/rgdb_specs/daemon.t437
-rw-r--r--doc/rgdb_specs/gdbinternals.t309
-rw-r--r--doc/rgdb_specs/interfacing.t79
-rw-r--r--doc/rgdb_specs/intro.t39
-rw-r--r--doc/rgdb_specs/layers.eps359
-rw-r--r--doc/rgdb_specs/layers.jpgbin0 -> 31318 bytes
-rw-r--r--doc/rgdb_specs/objectives.t307
-rw-r--r--doc/rgdb_specs/process.eps672
-rw-r--r--doc/rgdb_specs/process.jpgbin0 -> 136532 bytes
-rw-r--r--doc/rgdb_specs/revision.t42
-rw-r--r--doc/rgdb_specs/rgdb_specs.texi109
-rw-r--r--doc/rgdb_specs/seqbreak.eps311
-rw-r--r--doc/rgdb_specs/seqbreak.jpgbin0 -> 79883 bytes
-rw-r--r--doc/rgdb_specs/seqdetach.eps167
-rw-r--r--doc/rgdb_specs/seqdetach.jpgbin0 -> 24799 bytes
-rw-r--r--doc/rgdb_specs/seqinit.eps204
-rw-r--r--doc/rgdb_specs/seqinit.jpgbin0 -> 34525 bytes
-rw-r--r--doc/rtems_footer.html.in1
-rw-r--r--doc/rtems_gdb/.cvsignore28
-rw-r--r--doc/rtems_gdb/Makefile.am61
-rw-r--r--doc/rtems_gdb/commands.t51
-rw-r--r--doc/rtems_gdb/example.t88
-rw-r--r--doc/rtems_gdb/intro.t22
-rw-r--r--doc/rtems_gdb/rtems_gdb.texi105
-rw-r--r--doc/rtems_gdb/started.t53
-rw-r--r--doc/rtems_gdb/swarch.t32
-rw-r--r--doc/rtems_gdb/trouble.t46
-rw-r--r--doc/rtems_header.html.in5
-rw-r--r--doc/started/.cvsignore33
-rw-r--r--doc/started/Makefile.am93
-rw-r--r--doc/started/binaries.t153
-rw-r--r--doc/started/buildc.t952
-rw-r--r--doc/started/buildrt.t178
-rw-r--r--doc/started/intro.t189
-rw-r--r--doc/started/nextstep.t150
-rw-r--r--doc/started/nt.t158
-rw-r--r--doc/started/pictures/bit_ada.jpgbin0 -> 30320 bytes
-rw-r--r--doc/started/pictures/bit_ada.vsdbin0 -> 15360 bytes
-rw-r--r--doc/started/pictures/bit_c.jpgbin0 -> 29778 bytes
-rw-r--r--doc/started/pictures/bit_c.vsdbin0 -> 14336 bytes
-rw-r--r--doc/started/pictures/scfile10.jpgbin0 -> 12972 bytes
-rw-r--r--doc/started/pictures/scfile10.vsdbin0 -> 26112 bytes
-rw-r--r--doc/started/pictures/scfile11.jpgbin0 -> 45560 bytes
-rw-r--r--doc/started/pictures/scfile11.vsdbin0 -> 24576 bytes
-rw-r--r--doc/started/pictures/scfile12.jpgbin0 -> 12972 bytes
-rw-r--r--doc/started/pictures/scfile12.vsdbin0 -> 11776 bytes
-rw-r--r--doc/started/pictures/scfile13.jpgbin0 -> 33103 bytes
-rw-r--r--doc/started/pictures/scfile13.vsdbin0 -> 15360 bytes
-rw-r--r--doc/started/pictures/scsfile1.jpgbin0 -> 88599 bytes
-rw-r--r--doc/started/pictures/scsfile1.vsdbin0 -> 25088 bytes
-rw-r--r--doc/started/pictures/scsfile2.jpgbin0 -> 175286 bytes
-rw-r--r--doc/started/pictures/scsfile2.vsdbin0 -> 26624 bytes
-rw-r--r--doc/started/pictures/scsfile3.jpgbin0 -> 87075 bytes
-rw-r--r--doc/started/pictures/scsfile3.vsdbin0 -> 19456 bytes
-rw-r--r--doc/started/pictures/scsfile4.jpgbin0 -> 97380 bytes
-rw-r--r--doc/started/pictures/scsfile4.vsdbin0 -> 16896 bytes
-rw-r--r--doc/started/pictures/scsfile5.jpgbin0 -> 22942 bytes
-rw-r--r--doc/started/pictures/scsfile5.vsdbin0 -> 13824 bytes
-rw-r--r--doc/started/pictures/scsfile6.jpgbin0 -> 34989 bytes
-rw-r--r--doc/started/pictures/scsfile6.vsdbin0 -> 13824 bytes
-rw-r--r--doc/started/pictures/scsfile7.jpgbin0 -> 99516 bytes
-rw-r--r--doc/started/pictures/scsfile7.vsdbin0 -> 19456 bytes
-rw-r--r--doc/started/pictures/scsfile8.jpgbin0 -> 52638 bytes
-rw-r--r--doc/started/pictures/scsfile8.vsdbin0 -> 16896 bytes
-rw-r--r--doc/started/pictures/scsfile9.jpgbin0 -> 62821 bytes
-rw-r--r--doc/started/pictures/scsfile9.vsdbin0 -> 13824 bytes
-rw-r--r--doc/started/pictures/sfile12c.jpgbin0 -> 11663 bytes
-rw-r--r--doc/started/pictures/sfile12c.vsdbin0 -> 11264 bytes
-rw-r--r--doc/started/require.t219
-rw-r--r--doc/started/sample.t274
-rw-r--r--doc/started/started.texi113
-rw-r--r--doc/started/tversions.texi.in91
-rw-r--r--doc/started_ada/.cvsignore28
-rw-r--r--doc/started_ada/Makefile.am56
-rw-r--r--doc/started_ada/buildada.t699
-rw-r--r--doc/started_ada/gdb.t235
-rw-r--r--doc/started_ada/intro.t162
-rw-r--r--doc/started_ada/require.t122
-rw-r--r--doc/started_ada/sample.t57
-rw-r--r--doc/started_ada/started_ada.texi109
-rw-r--r--doc/started_ada/tversions.texi86
-rw-r--r--doc/supplements/.cvsignore2
-rw-r--r--doc/supplements/Makefile.am14
-rw-r--r--doc/supplements/arm/.cvsignore38
-rw-r--r--doc/supplements/arm/BSP_TIMES247
-rw-r--r--doc/supplements/arm/ChangeLog83
-rw-r--r--doc/supplements/arm/Makefile.am110
-rw-r--r--doc/supplements/arm/arm.texi115
-rw-r--r--doc/supplements/arm/bsp.t93
-rw-r--r--doc/supplements/arm/callconv.t73
-rw-r--r--doc/supplements/arm/cpumodel.t85
-rw-r--r--doc/supplements/arm/cputable.t109
-rw-r--r--doc/supplements/arm/fatalerr.t37
-rw-r--r--doc/supplements/arm/intr_NOTIMES.t122
-rw-r--r--doc/supplements/arm/memmodel.t38
-rw-r--r--doc/supplements/arm/preface.texi49
-rw-r--r--doc/supplements/arm/timeBSP.t113
-rw-r--r--doc/supplements/c4x/.cvsignore38
-rw-r--r--doc/supplements/c4x/BSP_TIMES247
-rw-r--r--doc/supplements/c4x/ChangeLog49
-rw-r--r--doc/supplements/c4x/Makefile.am108
-rw-r--r--doc/supplements/c4x/bsp.t93
-rw-r--r--doc/supplements/c4x/c4x.texi116
-rw-r--r--doc/supplements/c4x/callconv.t161
-rw-r--r--doc/supplements/c4x/cpumodel.t82
-rw-r--r--doc/supplements/c4x/cputable.t109
-rw-r--r--doc/supplements/c4x/fatalerr.t31
-rw-r--r--doc/supplements/c4x/intr_NOTIMES.t196
-rw-r--r--doc/supplements/c4x/memmodel.t160
-rw-r--r--doc/supplements/c4x/preface.texi64
-rw-r--r--doc/supplements/c4x/timeBSP.t108
-rw-r--r--doc/supplements/i386/.cvsignore38
-rw-r--r--doc/supplements/i386/ChangeLog72
-rw-r--r--doc/supplements/i386/FORCE386_TIMES247
-rw-r--r--doc/supplements/i386/Makefile.am111
-rw-r--r--doc/supplements/i386/bsp.t109
-rw-r--r--doc/supplements/i386/callconv.t90
-rw-r--r--doc/supplements/i386/cpumodel.t72
-rw-r--r--doc/supplements/i386/cputable.t119
-rw-r--r--doc/supplements/i386/fatalerr.t31
-rw-r--r--doc/supplements/i386/i386.texi114
-rw-r--r--doc/supplements/i386/intr_NOTIMES.t168
-rw-r--r--doc/supplements/i386/memmodel.t72
-rw-r--r--doc/supplements/i386/preface.texi41
-rw-r--r--doc/supplements/i386/timeFORCE386.t101
-rw-r--r--doc/supplements/i960/.cvsignore36
-rw-r--r--doc/supplements/i960/CVME961_TIMES247
-rw-r--r--doc/supplements/i960/ChangeLog76
-rw-r--r--doc/supplements/i960/Makefile.am110
-rw-r--r--doc/supplements/i960/bsp.t54
-rw-r--r--doc/supplements/i960/callconv.t97
-rw-r--r--doc/supplements/i960/cpumodel.t62
-rw-r--r--doc/supplements/i960/cputable.t121
-rw-r--r--doc/supplements/i960/fatalerr.t30
-rw-r--r--doc/supplements/i960/i960.texi114
-rw-r--r--doc/supplements/i960/intr_NOTIMES.t193
-rw-r--r--doc/supplements/i960/memmodel.t40
-rw-r--r--doc/supplements/i960/preface.texi40
-rw-r--r--doc/supplements/i960/timeCVME961.t88
-rw-r--r--doc/supplements/m68k/.cvsignore38
-rw-r--r--doc/supplements/m68k/ChangeLog86
-rw-r--r--doc/supplements/m68k/MVME136_TIMES247
-rw-r--r--doc/supplements/m68k/Makefile.am111
-rw-r--r--doc/supplements/m68k/bsp.t93
-rw-r--r--doc/supplements/m68k/callconv.t92
-rw-r--r--doc/supplements/m68k/cpumodel.t91
-rw-r--r--doc/supplements/m68k/cputable.t109
-rw-r--r--doc/supplements/m68k/fatalerr.t31
-rw-r--r--doc/supplements/m68k/intr_NOTIMES.t266
-rw-r--r--doc/supplements/m68k/m68k.texi115
-rw-r--r--doc/supplements/m68k/memmodel.t39
-rw-r--r--doc/supplements/m68k/preface.texi60
-rw-r--r--doc/supplements/m68k/timeMVME136.t112
-rw-r--r--doc/supplements/m68k/timedata.t154
-rw-r--r--doc/supplements/mips/.cvsignore38
-rw-r--r--doc/supplements/mips/BSP_TIMES247
-rw-r--r--doc/supplements/mips/ChangeLog76
-rw-r--r--doc/supplements/mips/Makefile.am111
-rw-r--r--doc/supplements/mips/bsp.t93
-rw-r--r--doc/supplements/mips/callconv.t92
-rw-r--r--doc/supplements/mips/cpumodel.t68
-rw-r--r--doc/supplements/mips/cputable.t109
-rw-r--r--doc/supplements/mips/fatalerr.t31
-rw-r--r--doc/supplements/mips/intr_NOTIMES.t196
-rw-r--r--doc/supplements/mips/memmodel.t39
-rw-r--r--doc/supplements/mips/mips.texi114
-rw-r--r--doc/supplements/mips/preface.texi57
-rw-r--r--doc/supplements/mips/timeBSP.t112
-rw-r--r--doc/supplements/powerpc/.cvsignore40
-rw-r--r--doc/supplements/powerpc/ChangeLog72
-rw-r--r--doc/supplements/powerpc/DMV177_TIMES248
-rw-r--r--doc/supplements/powerpc/Makefile.am125
-rw-r--r--doc/supplements/powerpc/PSIM_TIMES248
-rw-r--r--doc/supplements/powerpc/bsp.t76
-rw-r--r--doc/supplements/powerpc/callconv.t229
-rw-r--r--doc/supplements/powerpc/cpumodel.t156
-rw-r--r--doc/supplements/powerpc/cputable.t155
-rw-r--r--doc/supplements/powerpc/fatalerr.t47
-rw-r--r--doc/supplements/powerpc/intr_NOTIMES.t184
-rw-r--r--doc/supplements/powerpc/memmodel.t110
-rw-r--r--doc/supplements/powerpc/powerpc.texi115
-rw-r--r--doc/supplements/powerpc/preface.texi94
-rw-r--r--doc/supplements/powerpc/timeDMV177.t113
-rw-r--r--doc/supplements/powerpc/timePSIM.t97
-rw-r--r--doc/supplements/sh/.cvsignore38
-rw-r--r--doc/supplements/sh/BSP_TIMES247
-rw-r--r--doc/supplements/sh/ChangeLog76
-rw-r--r--doc/supplements/sh/Makefile.am111
-rw-r--r--doc/supplements/sh/bsp.t93
-rw-r--r--doc/supplements/sh/callconv.t102
-rw-r--r--doc/supplements/sh/cpumodel.t68
-rw-r--r--doc/supplements/sh/cputable.t109
-rw-r--r--doc/supplements/sh/fatalerr.t31
-rw-r--r--doc/supplements/sh/intr_NOTIMES.t196
-rw-r--r--doc/supplements/sh/memmodel.t39
-rw-r--r--doc/supplements/sh/preface.texi55
-rw-r--r--doc/supplements/sh/sh.texi114
-rw-r--r--doc/supplements/sh/timeBSP.t112
-rw-r--r--doc/supplements/sparc/.cvsignore38
-rw-r--r--doc/supplements/sparc/ChangeLog72
-rw-r--r--doc/supplements/sparc/ERC32_TIMES247
-rw-r--r--doc/supplements/sparc/Makefile.am108
-rw-r--r--doc/supplements/sparc/bsp.t87
-rw-r--r--doc/supplements/sparc/callconv.t392
-rw-r--r--doc/supplements/sparc/cpumodel.t128
-rw-r--r--doc/supplements/sparc/cputable.t102
-rw-r--r--doc/supplements/sparc/fatalerr.t32
-rw-r--r--doc/supplements/sparc/intr_NOTIMES.t199
-rw-r--r--doc/supplements/sparc/memmodel.t104
-rw-r--r--doc/supplements/sparc/preface.texi91
-rw-r--r--doc/supplements/sparc/sparc.texi113
-rw-r--r--doc/supplements/sparc/timeERC32.t120
-rw-r--r--doc/supplements/supplement.am16
-rw-r--r--doc/supplements/template/.cvsignore38
-rw-r--r--doc/supplements/template/BSP_TIMES247
-rw-r--r--doc/supplements/template/ChangeLog76
-rw-r--r--doc/supplements/template/Makefile.am110
-rw-r--r--doc/supplements/template/bsp.t93
-rw-r--r--doc/supplements/template/callconv.t92
-rw-r--r--doc/supplements/template/cpumodel.t68
-rw-r--r--doc/supplements/template/cputable.t109
-rw-r--r--doc/supplements/template/fatalerr.t31
-rw-r--r--doc/supplements/template/intr_NOTIMES.t196
-rw-r--r--doc/supplements/template/memmodel.t39
-rw-r--r--doc/supplements/template/preface.texi55
-rw-r--r--doc/supplements/template/template.texi115
-rw-r--r--doc/supplements/template/timeBSP.t112
-rw-r--r--doc/tools/.cvsignore14
-rw-r--r--doc/tools/ChangeLog90
-rw-r--r--doc/tools/Makefile.am6
-rw-r--r--doc/tools/bmenu/.cvsignore5
-rw-r--r--doc/tools/bmenu/ChangeLog20
-rw-r--r--doc/tools/bmenu/Makefile.am12
-rw-r--r--doc/tools/bmenu/address.h110
-rw-r--r--doc/tools/bmenu/address.inl105
-rw-r--r--doc/tools/bmenu/base.h113
-rw-r--r--doc/tools/bmenu/bmenu2.c1045
-rw-r--r--doc/tools/bmenu/chain.c207
-rw-r--r--doc/tools/bmenu/chain.h347
-rw-r--r--doc/tools/bmenu/chain.inl271
-rw-r--r--doc/tools/bmenu/isr.h18
-rw-r--r--doc/tools/bmenu/system.h35
-rw-r--r--doc/tools/configure.ac28
-rw-r--r--doc/tools/texi2www/.cvsignore2
-rw-r--r--doc/tools/texi2www/ChangeLog23
-rw-r--r--doc/tools/texi2www/Makefile.am17
-rw-r--r--doc/tools/texi2www/dir-arrow.gifbin0 -> 2609 bytes
-rw-r--r--doc/tools/texi2www/missing-arrow.gifbin0 -> 166 bytes
-rw-r--r--doc/tools/texi2www/next-arrow.gifbin0 -> 275 bytes
-rw-r--r--doc/tools/texi2www/prev-arrow.gifbin0 -> 279 bytes
-rw-r--r--doc/tools/texi2www/texi2dvi218
-rwxr-xr-xdoc/tools/texi2www/texi2www1304
-rw-r--r--doc/tools/texi2www/texi2www.texi708
-rw-r--r--doc/tools/texi2www/up-arrow.gifbin0 -> 264 bytes
-rw-r--r--doc/tools/word-replace2101
-rw-r--r--doc/user/.cvsignore51
-rw-r--r--doc/user/Makefile.am166
-rw-r--r--doc/user/bsp.t318
-rw-r--r--doc/user/c_user.texi165
-rw-r--r--doc/user/clock.t438
-rw-r--r--doc/user/concepts.t361
-rw-r--r--doc/user/conf.t2028
-rw-r--r--doc/user/datatypes.t311
-rw-r--r--doc/user/dirstat.texi42
-rw-r--r--doc/user/dpmem.t364
-rw-r--r--doc/user/event.t343
-rw-r--r--doc/user/example.texi88
-rw-r--r--doc/user/fatal.t172
-rw-r--r--doc/user/glossary.texi771
-rw-r--r--doc/user/init.t416
-rw-r--r--doc/user/intr.t469
-rw-r--r--doc/user/io.t741
-rw-r--r--doc/user/mp.t621
-rw-r--r--doc/user/msg.t834
-rw-r--r--doc/user/overview.t532
-rw-r--r--doc/user/part.t453
-rw-r--r--doc/user/preface.texi192
-rw-r--r--doc/user/region.t665
-rw-r--r--doc/user/rtemsarc.gifbin0 -> 7653 bytes
-rw-r--r--doc/user/rtemsarc.pngbin0 -> 5698 bytes
-rw-r--r--doc/user/rtemspie.eps2164
-rw-r--r--doc/user/rtemspie.gifbin0 -> 31070 bytes
-rw-r--r--doc/user/rtemspie.pngbin0 -> 31984 bytes
-rw-r--r--doc/user/rtmon.t1183
-rw-r--r--doc/user/schedule.t407
-rw-r--r--doc/user/sem.t832
-rw-r--r--doc/user/signal.t389
-rw-r--r--doc/user/states.eps13822
-rw-r--r--doc/user/states.gifbin0 -> 31256 bytes
-rw-r--r--doc/user/states.pngbin0 -> 22036 bytes
-rw-r--r--doc/user/task.t1770
-rw-r--r--doc/user/timer.t729
-rw-r--r--doc/user/userext.t727
524 files changed, 114161 insertions, 0 deletions
diff --git a/doc/.cvsignore b/doc/.cvsignore
new file mode 100644
index 0000000000..46bb161a00
--- /dev/null
+++ b/doc/.cvsignore
@@ -0,0 +1,16 @@
+aclocal.m4
+autom4te*.cache
+config.*
+configure
+depcomp
+index.html
+install-sh
+Makefile
+Makefile.in
+mdate-sh
+missing
+mkinstalldirs
+rtems_footer.html
+rtems_header.html
+rtems_support.html
+texinfo.tex
diff --git a/doc/ChangeLog b/doc/ChangeLog
new file mode 100644
index 0000000000..e27e0b347c
--- /dev/null
+++ b/doc/ChangeLog
@@ -0,0 +1,628 @@
+2004-05-21 Joel Sherrill <joel@OARcorp.com>
+
+ PR 627/doc
+ * user/task.t: Behavior documented for an rtems_task_create with
+ stacksize < minimum was not the implemented behavior.
+
+2004-05-06 Joel Sherrill <joel@OARcorp.com>
+
+ PR 618/rtems
+ * user/clock.t, user/dpmem.t, user/event.t, user/msg.t, user/part.t,
+ user/region.t, user/sem.t, user/task.t, user/timer.t: Add NULL
+ checks.
+
+2004-03-31 Ralf Corsepius <ralf_corsepius@rtems.org>
+
+ * started/buildc.t: Use tar xjf for bzip'ed files.
+ * started/buildrt.t: Use tar xjf to unzip rtems.
+
+2004-03-05 Joel Sherrill <joel@OARcorp.com>
+
+ PR 576/doc
+ * FAQ/FAQ.texi, FAQ/Makefile.am: Remove embedded information as it was
+ out of date and frequently duplicated information available from
+ other public sources like the CrossGCC Wiki.
+ * FAQ/embeddedinfo.t: Removed.
+
+2004-02-17 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * develenv/Makefile.am: Put *.texi into the builddir.
+
+2004-02-14 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * started/tversions.texi: Remove (Bogus).
+
+2004-02-05 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * ChangeLog: Merge-in supplements/ChangeLog.
+ * ChangeLog: Merge-in ada_user/ChangeLog.
+ * ChangeLog: Merge-in started_ada/ChangeLog.
+ * ChangeLog: Merge-in bsp_howto/ChangeLog.
+ * ChangeLog: Merge-in porting/ChangeLog.
+ * ChangeLog: Merge-in rgdb_specs/ChangeLog.
+ * ChangeLog: Merge-in rtems_gdb/ChangeLog.
+ * ChangeLog: Merge-in filesystem/ChangeLog.
+ * ChangeLog: Merge-in networking/ChangeLog.
+ * ChangeLog: Merge-in posix_users/ChangeLog.
+ * ChangeLog: Merge-in posix1003.1/ChangeLog.
+ * ChangeLog: Merge-in itron3.0/ChangeLog.
+ * ChangeLog: Merge-in FAQ/ChangeLog.
+ * ChangeLog: Merge-in user/ChangeLog.
+ * posix_users/ChangeLog, posix1003.1/ChangeLog, itron3.0/ChangeLog,
+ supplements/ChangeLog, bsp_howto/ChangeLog, porting/ChangeLog,
+ rgdb_specs/ChangeLog, rtems_gdb/ChangeLog, ada_user/ChangeLog,
+ started_ada/ChangeLog, filesystem/ChangeLog, networking/ChangeLog,
+ FAQ/ChangeLog, user/ChangeLog: Remove.
+
+2004-02-03 Joel Sherrill <joel@OARcorp.com>
+
+ * HELP.html, index.html.in, rtems_footer.html.in, rtems_header.html.in,
+ FAQ/basic.t, gnu_docs/gnu_footer.html, gnu_docs/index.html,
+ gnu_docs/refcard.html, gnu_docs/rtems_tools_index.html,
+ started/binaries.t, started/buildc.t, started/buildrt.t,
+ started/intro.t, started/require.t, started/sample.t,
+ started/tversions.texi.in: Incorporating changes from pre-4.6.0 review.
+
+2004-02-01 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * configure.ac, common/rtems.texi.in, started/binaries.t: Add
+ RTEMSRPMGROUP.
+ * ChangeLog: Merge-in started/ChangeLog.
+ * started/ChangeLog: Remove.
+ * configure.ac: Add RTEMS_ENABLE_RPMPREFIX. Add RTEMSRPMPREFIX.
+ * common/rtems.texi.in: Add RTEMSRPMPREFIX.
+
+2004-01-23 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * ChangeLog: Reformat. Merge-in develenv/ChangeLog.
+ * develenv/ChangeLog: Remove.
+
+2004-01-17 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Remove AUTOMAKE_FILES. Add ../scripts/setup.def
+ ../COPYING to EXTRA_DIST. Add rtems.html.in to EXTRA_DIST.
+ * develenv/Makefile.am: Add direct.t sample.t utils.t to EXTRA_DIST.
+ * bsp_howto/Makefile.am: Add ata.t, ide_ctrl.t to EXTRA_DIST.
+
+2004-01-09 Joel Sherrill <joel@OARcorp.com>
+
+ PR 464/doc
+ * posix_users/clock.t, posix_users/signal.t: Add documentation for
+ usleep() and ualarm(). Also fixed a couple of calls which have the wrong
+ .h files per the OpenGroup site documentation.
+
+2004-01-07 Joel Sherrill <joel@OARcorp.com>
+
+ * configure.ac, index.html.in, started_ada/buildada.t,
+ supplements/Makefile.am: mips64orion port removed as mips port more
+ completely covers the MIPS family.
+ * rtems_support.html.in, supplements/mips64orion/.cvsignore,
+ supplements/mips64orion/BSP_TIMES, supplements/mips64orion/ChangeLog,
+ supplements/mips64orion/Makefile.am, supplements/mips64orion/bsp.t,
+ supplements/mips64orion/callconv.t, supplements/mips64orion/cpumodel.t,
+ supplements/mips64orion/cputable.t, supplements/mips64orion/fatalerr.t,
+ supplements/mips64orion/intr_NOTIMES.t,
+ supplements/mips64orion/memmodel.t,
+ supplements/mips64orion/mips64orion.texi,
+ supplements/mips64orion/preface.texi, supplements/mips64orion/timeBSP.t:
+ Removed.
+
+2003-12-12 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * configure.ac: Require automake >= 1.8, autoconf >= 2.59.
+ * develenv/Makefile.am, user/Makefile.am, FAQ/Makefile.am,
+ posix_users/Makefile.am, posix1003.1/Makefile.am, itron3.0/Makefile.am,
+ filesystem/Makefile.am, networking/Makefile.am, bsp_howto/Makefile.am,
+ porting/Makefile.am, rgdb_specs/Makefile.am, rtems_gdb/Makefile.am,
+ ada_user/Makefile.am, started_ada/Makefile.am, supplements/Makefile.am:
+ Cosmetics.
+
+2003-12-11 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * develenv/Makefile.am, user/Makefile.am, FAQ/Makefile.am,
+ posix_users/Makefile.am, posix1003.1/Makefile.am, itron3.0/Makefile.am,
+ filesystem/Makefile.am, networking/Makefile.am, bsp_howto/Makefile.am,
+ porting/Makefile.am, rgdb_specs/Makefile.am, rtems_gdb/Makefile.am,
+ ada_user/Makefile.am, started_ada/Makefile.am, supplements/Makefile.am:
+ Cosmetics.
+
+2003-11-26 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * project.am: Remove $(PROJECT).info* from CLEANFILES (Doesn't work with
+ automake-1.7f/1.8 anymore).
+ * develenv/Makefile.am, user/Makefile.am, FAQ/Makefile.am,
+ posix_users/Makefile.am, posix1003.1/Makefile.am, itron3.0/Makefile.am,
+ filesystem/Makefile.am, networking/Makefile.am, bsp_howto/Makefile.am,
+ porting/Makefile.am, rgdb_specs/Makefile.am, rtems_gdb/Makefile.am,
+ ada_user/Makefile.am, started_ada/Makefile.am: Add *.info to CLEANFILES
+ to accomodate automake-1.7f/1.8 breaking building infos.
+
+2003-11-25 Joel Sherrill <joel@OARcorp.com>
+
+ PR 528/rtems_misc
+ * user/task.t: Fix Ada binding for task variable calls.
+
+2003-11-23 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Add missing '\'. Reformat.
+
+2003-11-21 Joel Sherrill <joel@OARcorp.com>
+
+ PR 521/doc
+ * user/sem.t: Default attributes were wrong for semaphores.
+
+2003-10-22 Joel Sherrill <joel@OARcorp.com>
+
+ PR 513/doc
+ * Makefile.am, index.html.in: Rename Getting Started to be non-language
+ specific and remove link to Ada Getting Started. Also install missing
+ graphic.
+
+2003-10-02 Gene Smith <gene.smith@siemens.com>
+
+ * networking/networkapp.t, networking/preface.texi: Improve
+ documentation for SO_RCVWAKEUP and SO_SNDWAKEUP and update the
+ references in the preface.
+
+2003-09-29 Joel Sherrill <joel@OARcorp.com>
+
+ * user/preface.texi: Eliminate references to HPPA.
+
+2003-09-26 Joel Sherrill <joel@OARcorp.com>
+
+ * FAQ/basic.t, FAQ/entry, porting/cpumodels.t: Obsoleting HP PA-RISC
+ port and removing all references.
+ * supplements/hppa1_1/.cvsignore, supplements/hppa1_1/ChangeLog,
+ supplements/hppa1_1/Makefile.am, supplements/hppa1_1/SIMHPPA_TIMES,
+ supplements/hppa1_1/bsp.t, supplements/hppa1_1/callconv.t,
+ supplements/hppa1_1/cpumodel.t, supplements/hppa1_1/cputable.t,
+ supplements/hppa1_1/fatalerr.t, supplements/hppa1_1/hppa1_1.texi,
+ supplements/hppa1_1/intr_NOTIMES.t, supplements/hppa1_1/memmodel.t,
+ supplements/hppa1_1/preface.texi, supplements/hppa1_1/timeSIMHPPA.t:
+ Removed.
+
+2003-09-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * ChangeLog: Merge images/ChangeLog.
+ * ChangeLog: Merge common/ChangeLog.
+ * images/ChangeLog, common/ChangeLog: Removed.
+ * rtems_support.html.in, index.html.in: Purge hppa1.1.
+ * common/.cvsignore: Add rtems.texi, rtems.sed.
+ * configure.ac: Merger from rtems-4-6-branch. Purge hppa1.1.
+ * Makefile.am, project.am, develenv/Makefile.am, user/Makefile.am,
+ FAQ/Makefile.am, posix_users/Makefile.am, posix1003.1/Makefile.am,
+ itron3.0/Makefile.am, filesystem/Makefile.am, networking/Makefile.am,
+ bsp_howto/Makefile.am, porting/Makefile.am, rgdb_specs/Makefile.am,
+ rtems_gdb/Makefile.am, ada_user/Makefile.am, started_ada/Makefile.am:
+ Merger from rtems-4-6-branch.
+
+2003-09-20 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * supplements/supplement.am: Add -I $(top_builddir) TEXI2WWW_ARGS.
+ * supplements/Makefile.am: Purge hppa1.1.
+
+2003-09-19 Joel Sherrill <joel@OARcorp.com>
+
+ * common/rtems.texi.in: New file.
+ * acinclude.m4, images/rtems_logo.jpg: New files.
+ * SUPPORT, tools/texi2www/archive/texi2www-960103.tgz: Removed.
+ * HELP.html, index.html.in, rtems_footer.html.in, rtems_header.html.in,
+ rtems_support.html.in, ada_user/ada_user.texi, common/cpright.texi,
+ common/setup.texi, develenv/develenv.texi, develenv/direct.t,
+ develenv/sample.t, develenv/utils.t, user/c_user.texi, user/fatal.t,
+ user/preface.texi, user/rtmon.t, FAQ/FAQ.texi, FAQ/basic.t,
+ FAQ/build45.t, FAQ/entry, FAQ/tools.t, posix_users/posix_users.texi,
+ posix1003.1/ch07.t, posix1003.1/posix1003_1.texi,
+ posix1003.1/preface.texi, itron3.0/itron.texi,
+ filesystem/filesystem.texi, networking/networking.texi,
+ bsp_howto/analog.t, bsp_howto/bsp_howto.texi, bsp_howto/discrete.t,
+ bsp_howto/nvmem.t, bsp_howto/target.t, porting/porting.texi,
+ rgdb_specs/rgdb_specs.texi, rtems_gdb/rtems_gdb.texi,
+ started_ada/intro.t, started_ada/started_ada.texi,
+ started_ada/tversions.texi: Merge from branch.
+
+2003-09-04 Joel Sherrill <joel@OARcorp.com>
+
+ PR 466/doc
+ * posix_users/io.t: Added sync().
+
+2003-08-27 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * started_ada/buildada.t, started_ada/gdb.t, started_ada/tversions.texi:
+ Don't use VARIABLEs containing '-' in @set and @value (violates
+ texi-syntax).
+
+2003-08-22 Joel Sherrill <joel@OARcorp.com>
+
+ * bsp_howto/adaintr.t, bsp_howto/ata.t, bsp_howto/target.t,
+ porting/cpumodels.t, porting/sourcecode.t: Reconcile differences between
+ CVS trunk and 4.6 branch.
+
+2003-08-13 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * bsp_howto/ide-ctrl.t: Merger from 4.6-branch.
+
+2003-08-11 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * configure.ac: Use rtems-bugs@rtems.com as bug report email address.
+
+2003-05-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * user/fatal.t: Reflect c/src/exec having moved to cpukit.
+ * FAQ/build45.t: Fix typo (config.long).
+ * rgdb_specs/daemon.t, rtems_gdb/example.t: Reflect c/src/exec having
+ moved to cpukit.
+
+2003-04-29 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * develenv/develenv.texi: Fix @setfilename to develenv.info.
+
+2003-04-16 Joel Sherrill <joel@OARcorp.com>
+
+ * develenv/Makefile.am, develenv/develenv.texi: Remove unused file.
+ * develenv/compile.texi: Removed.
+ * develenv/Makefile.am: Fix next/previous section names.
+
+2003-04-11 Joel Sherrill <joel@OARcorp.com>
+
+ * index.html.in: Development Environment Guide should be updated now.
+
+2003-03-24 Joel Sherrill <joel@OARcorp.com>
+
+ * develenv/direct.t, develenv/sample.t, develenv/utils.t: Significantly
+ updated.
+
+2003-02-28 Joel Sherrill <joel@OARcorp.com>
+
+ * develenv/.cvsignore: Add newly generated .texi files.
+
+2003-02-18 Joel Sherrill <joel@OARcorp.com>
+
+ * Makefile.am, configure.ac: Remove src2html references.
+ * index.html.in: Update to reflect partial update of Development
+ Environment Guide.
+ * develenv/Makefile.am, develenv/develenv.texi: Relect generating .texi
+ from .t's.
+ * develenv/direct.t, develenv/sample.t, develenv/utils.t: New files.
+ * develenv/direct.texi, develenv/sample.texi, develenv/utils.texi:
+ Removed. Now generated from corresponding .t files which are in the
+ process of being updated.
+
+2003-02-14 Joel Sherrill <joel@OARcorp.com>
+
+ * index.html.in: Removed a29k reference.
+ * FAQ/basic.t, FAQ/entry, porting/cpumodels.t: Remove a29k references
+ and update.
+
+2003-02-11 Mike Siers <mikes@poliac.com>
+
+ * networking/networkapp.t: Add an example code snippet for adding an IP
+ alias.
+
+2003-02-11 Joel Sherrill <joel@OARcorp.com>
+
+ * porting/interrupts.t: Rework logic that decides when to call
+ _Thread_Dispatch. Analysis by Sergei Organov <osv@javad.ru> determined
+ that _ISR_Signals_to_thread_executing was not being honored and/or
+ cleared properly.
+
+2003-02-11 Jay Monkman <jtm@smoothsmoothie.com>
+
+ * networking/networkapp.t: Add an example code snippet for adding a
+ default route.
+
+2003-02-03 Steven Johnson <sjohnson@neurizon.net>
+
+ PR 338/filesystem
+ * user/io.t: Document the API change that fixed reentrancy problem with
+ rtems_io_lookup_name().
+
+2003-02-03 Joel Sherrill <joel@OARcorp.com>
+
+ PR 338/filesystem
+ * user/io.t: Fix Ada binding as side-effect of fixing reentrancy problem
+ with rtems_io_lookup_name() (API change).
+
+2003-01-28 Joel Sherrill <joel@OARcorp.com>
+
+ * bsp_howto/makefiles.t, bsp_howto/support.t: Updated to reflect use of
+ automake in addition to autoconf.
+
+2003-01-27 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * index.html.in: Fix duplicate c4x entry.
+
+2003-01-25 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * index.html.in, configure.ac: Add c4x.
+ * project.am: Add version.texi hack.
+ * develenv/develenv.texi: Set @setfilename develenv.info.
+ * user/c_user.texi: Set @setfilename c_user.info.
+ * FAQ/FAQ.texi: Set @setfilename FAQ.info.
+ * posix_users/posix_users.texi: Set @setfilename posix_users.info.
+ * posix1003.1/posix1003_1.texi: Set @setfilename posix1003_1.info.
+ * itron3.0/itron.texi: Set @setfilename itron.info.
+ * filesystem/filesystem.texi: Set @setfilename filesystem.info.
+ * networking/networking.texi: Set @setfilename networking.info.
+ * bsp_howto/bsp_howto.texi: Set @setfilename bsp_howto.info.
+ * porting/porting.texi: Set @setfilename porting.info.
+ * rgdb_specs/rgdb_specs.texi: Set @setfilename rgdb_specs.info.
+ * rtems_gdb/rtems_gdb.texi: Set @setfilename rtems_gdb.info.
+ * ada_user/ada_user.texi: Set @setfilename ada_user.info.
+ * started_ada/started_ada.texi: Set @setfilename started_ada.info.
+ * supplements/Makefile.am: Add c4x, cosmetical changes.
+
+2003-01-24 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * main.am: Remove AM_MAKEINFOFLAGS, TEXI2DVI, TEXI2PDF. Append -I
+ $(top_builddir) to TEXI2WWW_ARGS.
+ * project.am: Add AM_MAKEINFOFLAGS, TEXI2DVI, TEXI2PDF. Override
+ automake's .dvi.ps:-rule.
+ * user/Makefile.am, FAQ/Makefile.am, posix_users/Makefile.am,
+ posix1003.1/Makefile.am, itron3.0/Makefile.am, filesystem/Makefile.am,
+ networking/Makefile.am, bsp_howto/Makefile.am, porting/Makefile.am,
+ rgdb_specs/Makefile.am, rtems_gdb/Makefile.am, ada_user/Makefile.am,
+ started_ada/Makefile.am: Put GENERATED_FILES into $builddir.
+ * supplements/supplements.am: Remove AM_MAKEINFOFLAGS, TEXI2DVI,
+ TEXI2PDF.
+
+2003-01-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * project.am, main.am: Use automake rules to build ps, pdf, info.
+ Various minor changes.
+ * project.am: Append $($(PROJECT)_TEXINFOS) to html-dependencies.
+ * configure.ac: Require autoconf-2.57. Require automake-1.7.2. Remove
+ started/pictures/Makefile.
+ * started/Makefile.am: Merge-in pictures/Makefile.am .
+ * started/pictures/Makefile.am: Remove.
+ * FAQ/build45.t: Fix typo in previous patch.
+ * FAQ/build45.t: Several fixes and additions.
+ * FAQ/FAQ.texi: Rename section "Building RTEMS 4.5" into "Building
+ RTEMS". build45.t: Remove references to 4.5. Several minor updates.
+ * develenv/.cvsignore, FAQ/.cvsignore, posix_users/.cvsignore,
+ posix1003.1/.cvsignore, itron3.0/.cvsignore, filesystem/.cvsignore,
+ networking/.cvsignore, bsp_howto/.cvsignore, porting/.cvsignore,
+ rgdb_specs/.cvsignore, rtems_gdb/.cvsignore, started_ada/.cvsignore,
+ ada_user/.cvsignore, user/.cvsignore: Add version.texi. Add stamp-vti.
+ Re-sort.
+ * develenv/version.texi, develenv/stamp-vti, user/version.texi,
+ user/stamp-vti, FAQ/version.texi, FAQ/stamp-vti,
+ posix_users/version.texi, posix_users/stamp-vti,
+ posix1003.1/version.texi, posix1003.1/stamp-vti, itron3.0/version.texi,
+ itron3.0/stamp-vti, filesystem/version.texi, filesystem/stamp-vti,
+ networking/version.texi, networking/stamp-vti, bsp_howto/version.texi,
+ bsp_howto/stamp-vti, porting/version.texi, porting/stamp-vti,
+ rgdb_specs/version.texi, rgdb_specs/stamp-vti, rtems_gdb/version.texi,
+ rtems_gdb/stamp-vti, ada_user/version.texi, ada_user/stamp-vti,
+ started_ada/version.texi, started_ada/stamp-vti: Remove from CVS.
+ * supplements/supplements.am: Use automake rules to build ps, pdf, info.
+ Various minor changes.
+
+2003-01-21 Joel Sherrill <joel@OARcorp.com>
+
+ * develenv/stamp-vti, develenv/version.texi, user/stamp-vti,
+ user/version.texi, FAQ/stamp-vti, FAQ/version.texi,
+ posix_users/stamp-vti, posix_users/version.texi, posix1003.1/stamp-vti,
+ posix1003.1/version.texi, itron3.0/stamp-vti, itron3.0/version.texi,
+ filesystem/stamp-vti, filesystem/version.texi, networking/stamp-vti,
+ networking/version.texi, bsp_howto/stamp-vti, bsp_howto/version.texi,
+ porting/stamp-vti, porting/version.texi, rgdb_specs/stamp-vti,
+ rgdb_specs/version.texi, rtems_gdb/stamp-vti, rtems_gdb/version.texi,
+ ada_user/stamp-vti, ada_user/version.texi, started_ada/stamp-vti,
+ started_ada/version.texi: Regenerated.
+
+2002-12-08 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Merge-in images/Makefile.am, common/Makefile.am.
+ * images/Makefile.am, common/Makefile.am: Remove.
+ * configure.ac: Reflect changes above.
+ * main.am, supplements/supplement.am: Append -I $(topsrc_dir) to
+ AM_MAKEINFOFLAGS.
+
+2002-11-13 Joel Sherrill <joel@OARcorp.com>
+
+ * index.html.in: Note that the Getting Started with GNAT/RTEMS manual
+ is largely obsolete now that GNAT is in GCC.
+ * develenv/stamp-vti, develenv/version.texi, user/stamp-vti,
+ user/version.texi, FAQ/stamp-vti, FAQ/version.texi,
+ posix_users/stamp-vti, posix_users/version.texi, posix1003.1/stamp-vti,
+ posix1003.1/version.texi, itron3.0/stamp-vti, itron3.0/version.texi,
+ filesystem/stamp-vti, filesystem/version.texi, networking/stamp-vti,
+ networking/version.texi, bsp_howto/stamp-vti, bsp_howto/version.texi,
+ porting/stamp-vti, porting/version.texi, rgdb_specs/stamp-vti,
+ rgdb_specs/version.texi, rtems_gdb/stamp-vti, rtems_gdb/version.texi,
+ ada_user/stamp-vti, ada_user/version.texi: Regenerated.
+ * started_ada/Makefile.am: Corrected link.
+ * started_ada/stamp-vti, started_ada/version.texi: Regenerated.
+
+2002-10-24 Joel Sherrill <joel@OARcorp.com>
+
+ * index.html.in: Add links to multiple missing CPU supplements.
+ * develenv/stamp-vti, develenv/version.texi, user/stamp-vti,
+ user/version.texi, FAQ/stamp-vti, FAQ/version.texi,
+ posix_users/stamp-vti, posix_users/version.texi, posix1003.1/stamp-vti,
+ posix1003.1/version.texi, itron3.0/stamp-vti, itron3.0/version.texi,
+ filesystem/stamp-vti, filesystem/version.texi, networking/stamp-vti,
+ networking/version.texi, bsp_howto/stamp-vti, bsp_howto/version.texi,
+ porting/stamp-vti, porting/version.texi, rgdb_specs/stamp-vti,
+ rgdb_specs/version.texi, rtems_gdb/stamp-vti, rtems_gdb/version.texi,
+ ada_user/stamp-vti, ada_user/version.texi, started_ada/stamp-vti,
+ started_ada/version.texi: Regenerated.
+
+2002-10-24 Eugeny S. Mints <Eugeny.Mints@oktet.ru>
+
+ * bsp_howto/ata.t, bsp_howto/ide-ctrl.t: New file.
+ * bsp_howto/.cvsignore: Added new .texi files.
+ * bsp_howto/Makefile.am: Added new files to generate.
+ * bsp_howto/bsp_howto.texi: Added new chapters.
+ * bsp_howto/stamp-vti, bsp_howto/version.texi: Regenerated.
+
+2002-10-21 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * .cvsignore: Reformat. Add autom4te*cache. Remove autom4te.cache.
+
+2002-08-27 Joel Sherrill <joel@OARcorp.com>
+
+ * user/io.t: Correct Ada bindings.
+
+2002-08-01 Joel Sherrill <joel@OARcorp.com>
+
+ * porting/stamp-vti, porting/version.texi: Regenerated.
+
+2002-07-30 Joel Sherrill <joel@OARcorp.com>
+
+ * configure.ac: Added supplements/arm/Makefile.
+ * README: Updated.
+ * user/stamp-vti, user/version.texi: Regenerated.
+ * porting/miscellaneous.t: Added some markups for fonts and clarified
+ some places.
+ * supplements/Makefile.am: Added arm subdirectory.
+
+2002-06-28 Joel Sherrill <joel@OARcorp.com>
+
+ * user/userext.t: Per PR228, correct the prototype of the task create
+ user extension to indicate it returns a boolean and augment the
+ documentation to explain the purpose of the boolean return value.
+
+2002-06-14 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * project.am: Use PATH_SEPARATOR to setup TEXINPUTS.
+
+2002-04-12 Chris Johns <ccj@acm.org>
+
+ * user/doc/user/userext.t: Per PR138, updated the documentation to show
+ how to obtain an extension table index. Also provided some extra
+ background on the user extension API.
+
+2002-04-10 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * VERSION, bootstrap: Removed as unneeded.
+
+2002-04-06 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * bootstrap, VERSION: Remove.
+ * Makefile.am: Remove bootstrap. Add ACLOCAL_AMFLAGS.
+ * configure.ac: Add RTEMS_TOP.
+
+2002-04-03 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * user/io.t: Fix typo @sybsection.
+
+2002-03-27 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * common/Makefile.am: Remove AUTOMAKE_OPTIONS.
+ * configure.ac: AC_INIT(package,_RTEMS_VERSION,_RTEMS_BUGS).
+ AM_INIT_AUTOMAKE([no-define foreign 1.6]).
+ * Makefile.am, images/Makefile.am, develenv/Makefile.am,
+ user/Makefile.am, FAQ/Makefile.am, posix_users/Makefile.am,
+ posix1003.1/Makefile.am, itron3.0/Makefile.am, filesystem/Makefile.am,
+ networking/Makefile.am, bsp_howto/Makefile.am, porting/Makefile.am,
+ rgdb_specs/Makefile.am, rtems_gdb/Makefile.am, ada_user/Makefile.am,
+ started_ada/Makefile.am, supplements/Makefile.am: Remove
+ AUTOMAKE_OPTIONS.
+
+2002-03-27 Eric Norum <eric.norum@usask.ca>
+
+ * user/intr.t: Per PR165, now correctly states that passing a NULL
+ pointer for the return argument is an error.
+ * PR161
+ * user/rtmon.t: Add rtems_ prefix to directives in the example.
+
+2002-03-22 Chris Johns <ccj@acm.org>
+
+ * user/io.t, user/conf.t: PR 160. Added the IO Manager's register and
+ unregister interface documentation.
+
+2002-03-15 Eric Norum <eric.norum@usask.ca>
+
+ * user/rtmon.t: Correct example and correctly used ensure not insure.
+
+2002-01-21 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * .cvsignore: Reworked.
+ * Makefile.am: Remove texinfo/texinfo.tex.
+ * bootstrap: Removed.
+ * configure.ac: Add pkgdocdir. Let htmldir be rooted at pkgdocdir.
+ * main.am: Remove TEXINFO_TEX.
+ * project.am: Let dvidir, psdir, pdfdir be rooted at pkgdocdir. Remove
+ commented out make-variables.
+
+2002-01-19 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * .cvsignore: Add autom4te.cache, install-sh, mdate-sh, missing,
+ mkinstalldirs, texinfo.tex.
+ * Makefile.am: Add main.am to AUTOMAKE_FILES.
+ * configure.ac: Add AC_CONFIG_AUX_DIR([.]).
+ * project.am: Remove custom .texi and stamp-vti rules.
+ * main.am, supplements/supplement.am: Replace TEXI_COMMON with
+ AM_MAKEINFOFLAGS.
+
+2002-01-18 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Require automake-1.5.
+ * project.am: Reworked.
+ * main.am, configure.ac: New.
+ * configure.in: Removed.
+ * bootstrap: Sync with RTEMS's toplevel bootstrap.sh.
+ * common/Makefile.am, images/Makefile.am: Require automake-1.5.
+ * develenv/Makefile.am, user/Makefile.am, FAQ/Makefile.am,
+ posix_users/Makefile.am, posix1003.1/Makefile.am, itron3.0/Makefile.am,
+ filesystem/Makefile.am, networking/Makefile.am, bsp_howto/Makefile.am,
+ porting/Makefile.am, rgdb_specs/Makefile.am, rtems_gdb/Makefile.am,
+ ada_user/Makefile.am, started_ada/Makefile.am: include main.am, require
+ automake-1.5.
+ * supplements/Makefile.am: Require automake-1.5.
+
+2002-01-17 Joel Sherrill <joel@OARcorp.com>
+
+ * VERSION: Updated to rtems-doc-ss-20010117.
+ * VERSION: Updated to rtems-doc-eng-20010816b-d1.
+
+2001-10-30 Joel Sherrill <joel@OARcorp.com>
+
+ * VERSION: New file.
+
+2001-06-28 Joel Sherrill <joel@OARcorp.com>
+
+ * posix_users/preface.texi, posix_users/procenv.t,
+ posix_users/process.t, posix_users/signal.t, posix_users/stamp-vti,
+ posix_users/version.texi: Updated as part of starting a sweep on the
+ POSIX User's Guide.
+
+2001-02-14 Joel Sherrill <joel@OARcorp.com>
+
+ * configure.ac: New mips supplement.
+ * supplements/mips: New supplement.
+
+2001-01-17 Joel Sherrill <joel@OARcorp.com>
+
+ * configure.in: Changed the version to eng-20010816b.
+ * SUPPORT, LICENSE: New files.
+ * Numerous files touched as part of merging the 4.5 branch onto the
+ mainline development trunk and ensuring that the script that cuts
+ snapshots and releases works on the documentation.
+ * develenv/.cvsignore, user/.cvsignore: Added rtems_header.html and
+ rtems_footer.html.
+ * user/timer.t: Added task-based timer information including the new
+ directives rtems_timer_initiate(), rtems_timer_server_fire_after(), and
+ rtems_timer_server_fire_when().
+ * FAQ/.cvsignore, posix_users/.cvsignore, posix1003.1/.cvsignore,
+ itron3.0/.cvsignore, filesystem/.cvsignore, networking/.cvsignore,
+ bsp_howto/.cvsignore, porting/.cvsignore, rgdb_specs/.cvsignore,
+ rtems_gdb/.cvsignore, ada_user/.cvsignore, started_ada/.cvsignore: Added
+ rtems_header.html and rtems_footer.html.
+
+2000-09-22 Joel Sherrill <joel@OARcorp.com>
+
+ * Makefile.am, develenv/Makefile.am: Removed GENERATED_FILES from list
+ of TEXINFOS.
+
+2000-08-10 Joel Sherrill <joel@OARcorp.com>
+
+ * ChangeLog, develenv/ChangeLog, user/ChangeLog, FAQ/ChangeLog,
+ posix_users/ChangeLog, posix1003.1/ChangeLog, itron3.0/ChangeLog,
+ filesystem/ChangeLog, networking/ChangeLog, bsp_howto/ChangeLog,
+ porting/ChangeLog, rgdb_specs/ChangeLog, rtems_gdb/ChangeLog,
+ ada_user/ChangeLog, started_ada/ChangeLog, supplements/ChangeLog: New
+ file.
+
diff --git a/doc/FAQ/.cvsignore b/doc/FAQ/.cvsignore
new file mode 100644
index 0000000000..aa5ab8bdbd
--- /dev/null
+++ b/doc/FAQ/.cvsignore
@@ -0,0 +1,33 @@
+basic.texi
+bsp.texi
+build45.texi
+concepts.texi
+debug.texi
+embeddedinfo.texi
+endoftime.texi
+FAQ
+FAQ.aux
+FAQ.cp
+FAQ.dvi
+FAQ.fn
+FAQ*.html
+FAQ.ky
+FAQ.log
+FAQ.pdf
+FAQ.pg
+FAQ.ps
+FAQ.toc
+FAQ.tp
+FAQ.vr
+freesw.texi
+hwdebugaids.texi
+index.html
+Makefile
+Makefile.in
+mdate-sh
+projects.texi
+rtems_footer.html
+rtems_header.html
+stamp-vti
+tools.texi
+version.texi
diff --git a/doc/FAQ/FAQ.texi b/doc/FAQ/FAQ.texi
new file mode 100644
index 0000000000..3fe6996529
--- /dev/null
+++ b/doc/FAQ/FAQ.texi
@@ -0,0 +1,117 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename FAQ.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the RTEMS FAQ
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS On-Line Manual
+@direntry
+* RTEMS FAQ: (FAQ). Frequently Asked Questions.
+@end direntry
+@end ifset
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage RTEMS Frequently Asked Questions
+
+@setchapternewpage odd
+@settitle RTEMS Frequently Asked Questions
+@titlepage
+@finalout
+
+@title RTEMS Frequently Asked Questions
+@subtitle Edition @value{EDITION}, for @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include basic.texi
+@include tools.texi
+@include concepts.texi
+@include build45.texi
+@include bsp.texi
+@include debug.texi
+@include freesw.texi
+@include hwdebugaids.texi
+@include projects.texi
+@include endoftime.texi
+
+@ifinfo
+@node Top, Basic Information, (dir), (dir)
+@top FAQ
+
+This document is the RTEMS FAQ. FAQ is an acronym for Frequently
+Asked Questions and we sincerely hope that this contains the answers
+to some of the questions most frequently asked about RTEMS.
+
+Common questions have been divided into the following categories.
+
+
+@menu
+* Basic Information::
+* General Development Tool Hints::
+* RTEMS Concepts::
+* Building RTEMS::
+* BSP Questions::
+* Debugging Hints::
+* Free Software that Works with RTEMS::
+* Hardware to Ease Debugging::
+* RTEMS Projects::
+* Date/Time Issues in Systems Using RTEMS::
+@end menu
+
+@c * Command and Variable Index::
+@c * Concept Index::
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@c @node Command and Variable Index, Concept Index, Installing GCC AND NEWLIB, Top
+@c @unnumbered Command and Variable Index
+
+@c There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@c @node Concept Index, , Command and Variable Index, Top
+@c @unnumbered Concept Index
+
+@c There are currently no Concept Index entries.
+@c @printindex cp
+
+@contents
+@bye
+
diff --git a/doc/FAQ/Makefile.am b/doc/FAQ/Makefile.am
new file mode 100644
index 0000000000..d4d86847ad
--- /dev/null
+++ b/doc/FAQ/Makefile.am
@@ -0,0 +1,83 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = FAQ
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/main.am
+
+GENERATED_FILES = basic.texi tools.texi concepts.texi build45.texi bsp.texi \
+ debug.texi freesw.texi hwdebugaids.texi projects.texi \
+ endoftime.texi
+
+COMMON_FILES += $(top_srcdir)/common/cpright.texi
+
+FILES =
+
+info_TEXINFOS = FAQ.texi
+FAQ_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+#
+# Process Automatically Generated Files
+#
+
+basic.texi: basic.t
+ $(BMENU2) -c -p "Top" \
+ -u "Top" \
+ -n "" < $< > $@
+
+tools.texi: tools.t
+ $(BMENU2) -c -p "Top" \
+ -u "Top" \
+ -n "" < $< > $@
+
+concepts.texi: concepts.t
+ $(BMENU2) -c -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+build45.texi: build45.t
+ $(BMENU2) -c -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+bsp.texi: bsp.t
+ $(BMENU2) -c -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+debug.texi: debug.t
+ $(BMENU2) -c -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+freesw.texi: freesw.t
+ $(BMENU2) -c -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+hwdebugaids.texi: hwdebugaids.t
+ $(BMENU2) -c -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+projects.texi: projects.t
+ $(BMENU2) -c -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+endoftime.texi: endoftime.t
+ $(BMENU2) -c -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+CLEANFILES += FAQ.info FAQ.info-?
+
+EXTRA_DIST = entry basic.t bsp.t build45.t concepts.t debug.t \
+ endoftime.t freesw.t hwdebugaids.t projects.t tools.t
diff --git a/doc/FAQ/basic.t b/doc/FAQ/basic.t
new file mode 100644
index 0000000000..f05fad39c1
--- /dev/null
+++ b/doc/FAQ/basic.t
@@ -0,0 +1,212 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Basic Information
+
+The questions in this category are basic questions about RTEMS. Where
+did it come from, why is it, what is it, when should you use it, etc.?
+
+@section What does RTEMS stand for?
+
+RTEMS is an an acronym for the Real-Time Executive for Multiprocessor
+Systems.
+
+Initially RTEMS stood for the Real-Time Executive for Missile Systems
+but as it became clear that the application domains that could use
+RTEMS extended far beyond missiles, the "M" changed to mean Military.
+At one point, there were both Ada and C implementations of RTEMS. The
+C version changed the "M" to mean Multiprocessor while the Ada version
+remained with the "M" meaning Military.
+
+@section What is RTEMS?
+
+RTEMS is a real-time executive which provides a high performance
+environment for embedded military applications including many
+features. The following is just a short list of the features
+available in RTEMS. If you are interested in something that
+is not on this list, please contact the RTEMS Team. Features
+are being added continuously.
+
+@itemize @bullet
+
+@item Standards Compliant
+@itemize @bullet
+@item POSIX 1003.1b API including threads
+@item RTEID/ORKID based Classic API
+@end itemize
+
+@item TCP/IP Stack
+@itemize @bullet
+@item high performance port of FreeBSD TCP/IP stack
+@item UDP, TCP
+@item ICMP, DHCP, RARP
+@item TFTP
+@item RPC
+@item FTPD
+@item HTTPD
+@item CORBA
+@end itemize
+
+@item Debugging
+@itemize @bullet
+@item GNU debugger (gdb)
+@item DDD GUI interface to GDB
+@item thread aware
+@item debug over Ethernet
+@item debug over Serial Port
+@end itemize
+
+@item Filesystem Support
+@itemize @bullet
+@item In-Memory Filesystem (IMFS)
+@item TFTP Client Filesystem
+@end itemize
+
+@item Basic Kernel Features
+@itemize @bullet
+@item multitasking capabilities
+@item homogeneous and heterogeneous multiprocessor systems
+@item event-driven, priority-based, preemptive scheduling
+@item optional rate monotonic scheduling
+@item intertask communication and synchronization
+@item priority inheritance
+@item responsive interrupt management
+@item dynamic memory allocation
+@item high level of user configurability
+@end itemize
+
+@end itemize
+
+
+@section What standards does RTEMS support?
+
+The original "Classic" RTEMS API is based on the Real-Time Executive
+Interface Definition (RTEID) and the Open Real-Time Kernel Interface
+Definition (ORKID). RTEMS also includes support for POSIX threads
+and real-time extensions.
+
+With the addition of file system infrastructure, RTEMS supports
+about 70% of the POSIX 1003.1b-1996 standard. This standard
+defines the programming interfaces of standard UNIX. This means
+that much source code that works on UNIX, also works on RTEMS.
+
+@section What processors is RTEMS available for?
+
+RTEMS is available for the following processor families:
+
+@itemize @bullet
+@item Motorola MC68xxx
+@item Motorola MC683xx
+@item Motorola ColdFire
+@item ARM
+@item Hitachi H8/300
+@item Hitachi SH
+@item Intel i386
+@item Intel i960
+@item MIPS
+@item PowerPC
+@item SPARC
+@item Texas Instruments C3x/C4x
+@item OpenCores OR32
+@end itemize
+
+In addition, there is a port to UNIX which can be used as a prototyping
+and simulation environment.
+
+@section Executive vs. Kernel vs. Operating System (RTOS)
+
+The developers of RTEMS developers use the terms executive and kernel
+interchangeably. In the embedded system community, the terms executive
+or kernel are generally used to refer to small operating systems.
+So we consider it proper to refer to RTEMS as an executive, a kernel,
+or an operating system.
+
+@section Where/why was it developed?
+
+RTEMS was developed by On-Line Applications Research Corporation (OAR)
+for the U.S. Army Missile Command prior to that organizations merger
+with the Aviation Command that resulted in the new command, U. S. Army
+Aviation and Missile command (AMCOM). The original goal of RTEMS was
+to provide a portable, standards-based real-time executive for which
+source code was available and royalties were paid.
+
+In other words, RTEMS was open source before open source was cool.
+
+Since the initial release to the world, the RTEMS Community has
+grown enormously and contributed significantly to RTEMS. Important
+additions such as the TCP/IP stack, FAT filesystem, multiple ports,
+device drivers, and most BSPs have come from users like yourself.
+
+@section Are there no similar commercial products?
+
+Yes, but not all are based on standards and the open source philosophy.
+
+@section How can I get RTEMS?
+
+RTEMS is distributed from @uref{@value{RTEMSHTTPURL},@value{RTEMSHTTPURL}}.
+This is a server dedicated to the RTEMS Project which was donated by and
+hosted by @uref{http://www.oarcorp.com,OAR Corporation} to provide
+a focal point for all RTEMS activities. Point your
+favorite browser at the following URL and following the link:
+
+@uref{@value{RTEMSHTTPURL},@value{RTEMSHTTPURL}}
+
+But if you are already reading this, you probably already found it. :)
+
+@section What about support?
+
+RTEMS development and support services are available from a number
+of firms. See
+@uref{@value{RTEMSHTTPURL}/support.html,@value{RTEMSHTTPURL}/support.html}
+for the current list of RTEMS service providers.
+
+Remember that RTEMS maintenance is funded by users. If you are
+using RTEMS on a commercial project, please get support.
+
+@section Are there any mailing lists?
+
+The primary RTEMS mailing list is @code{@value{RTEMSUSERS}}. This
+list is for general RTEMS discussions, questions, design help, advice,
+etc.. Subscribe by sending an empty mail
+message to @code{@value{RTEMSUSERSSUBSCRIBE}}. This
+mailing list is archived at:
+
+@example
+http://www.rtems.com/ml/rtems-users
+@end example
+
+The @code{@value{RTEMSSNAPSHOTS}} mailing list is for those
+interested in taking a more active role in the design, development,
+and maintenance of RTEMS. Discussions on this list tend to focus
+on problems in the development source, design of new features, problem
+reports, etc.. Subscribe by sending an empty mail
+message to @code{@value{RTEMSSNAPSHOTSSUBSCRIBE}}.
+mailing list is archived at:
+
+@example
+http://www.rtems.com/ml/rtems-snapshots
+@end example
+
+The archives for both mailing lists include discussions back
+to 1997.
+
+@section Are there any license restrictions?
+
+RTEMS is licensed under a modified version of the GNU General Public License
+(GPL). The modification places no restrictions on the applications which
+use RTEMS but protects the interests of those who work on RTEMS.
+
+The TCP/IP network stack included with RTEMS is a port of the FreeBSD
+network stack and is licensed under different terms that also do not
+place restrictions on the application.
+
+@section Are there any export restrictions?
+
+No.
+
+
diff --git a/doc/FAQ/bsp.t b/doc/FAQ/bsp.t
new file mode 100644
index 0000000000..f4305be9ba
--- /dev/null
+++ b/doc/FAQ/bsp.t
@@ -0,0 +1,35 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter BSP Questions
+
+The items in this category provide answers to questions
+commonly asked about BSPs.
+
+@section What is a BSP?
+
+BSP is an acronym for Board Support Package.
+
+A BSP is a collection of device drivers, startup code, linker scripts,
+and compiler support files (specs files) that tailor RTEMS for a
+particular target hardware environment.
+
+@section What has to be in a BSP?
+
+The basic set of items is the linker script, bsp_specs, and startup code.
+If you want standard IO, then you need a console driver. This is needed
+to run any of the RTEMS tests. If you want to measure passage of time,
+you need a clock tick driver. This driver is needed for all RTEMS tests
+EXCEPT hello world and the timing tests. The timer driver is a benchmark
+timer and is needed for the tmtests (timing tests). Sometimes you will
+see a shmsupp directory which is for shared memory multiprocessing
+systems. The network driver and real-time clock drivers are optional
+and not required by any RTEMS tests.
+
+
+
diff --git a/doc/FAQ/build45.t b/doc/FAQ/build45.t
new file mode 100644
index 0000000000..a88dc124dc
--- /dev/null
+++ b/doc/FAQ/build45.t
@@ -0,0 +1,418 @@
+@c
+@c $Id$
+@c
+
+@chapter Building RTEMS
+
+Building any package in a cross-compilation fashion can be difficult,
+but configuring and building a real-time operating system that
+supports many CPU families and target boards can be confusing. The
+RTEMS development team has made every effort to make this process as
+straight forward as possible but there are going to be questions.
+
+Moreover, between RTEMS 4.0 and 4.5, the configure and Makefile system in RTEMS
+was changed to be more compatible with GNU standards. This transition
+has lead to a number of subtle differences.
+
+This section of the FAQ tries to address the more frequently asked
+questions about building RTEMS. Thanks to Ralf Corsepius for
+compiling this section from excerpts from various postings to the
+rtems-users mailing list.
+
+@section Required Tools
+
+@subsection Which tools are required to build RTEMS?
+
+@itemize @bullet
+
+@item A native C-Toolchain, gcc prefered
+@item GNU-Bash and shell utils
+@item GNU-make.
+@item A target (typically cross) C- and (optional) C++-Toolchain.
+@item autoconf/automake (optional, recommended)
+@item Perl (optional, recommended, needed by automake and some tools within RTEMS)
+@item m4 (optional, recommended, needed by autoconf, GNU-m4 preferred)
+
+@end itemize
+
+@subsection Do I need autoconf and automake to build RTEMS?
+
+No, you don't. Or to be more accurate, you won't need them until you
+modify something in RTEMS's Makefile.ams/configure.acs or start to develop
+with RTEMS.
+
+I.e. you won't need them to get started, but you will need them when getting
+serious.
+
+@subsection Do I need a native gcc on my host?
+
+No, you should be able to use any native, ansi-compliant C-compiler, but
+using a native gcc is highly recommended.
+
+@subsection Can I use a non-gcc cross-toolchain?
+
+Generally speaking, it should be possible.
+However, most RTEMS development has taken place using gcc, therefore
+getting it working may not be easy.
+
+@subsection Do I need gcc-2.9x for cross compilation?
+
+[FIXME: Partially obsolete]
+
+Not necessarily, but gcc-2.9x is highly recommended, because most development
+has taken place using gcc-2.9x and previous versions of gcc are not actively
+supported in RTEMS anymore (@ref{Can I use a non-gcc cross-toolchain?}).
+
+@subsection Where to get autoconf automake ld gcc etc.?
+
+The sources of all gnutools are available at any
+@uref{ftp://ftp.gnu.org,GNU} mirror.
+Native Linux binaries should come with any Linux distribution.
+Native Cygwin binaries should be available at Cygnus.
+
+GNU-Toolchain binaries (gcc, binutils etc.) for Linux and patches required
+to build them from source are available from
+@uref{@value{RTEMSFTPURL},the RTEMS ftp site}.
+
+
+@section Issues when building RTEMS
+
+@subsection When running ./configure weird thing start to happen
+
+You are probably trying to build within the source-tree.
+RTEMS requires a separate build directory. I.e. if the
+sources are located at @code{/usr/local/src/rtems-@value{VERSION}},
+use something similar to this to configure RTEMS:
+
+@example
+cd somewhere
+mkdir build
+cd build
+/usr/local/src/rtems-@value{VERSION}/configure [options]
+@end example
+
+@subsection When running bootstrap weird thing start to happen
+
+Many possibile causes: Most likely one of these:
+@itemize @bullet
+@item You are trying to build RTEMS with insufficient or incompatible
+versions of autoconf and automake.
+@item The autotools can't be found because your $PATH might not be set up
+correctly (Cf. @ref{How to set up $PATH?})
+@item You have used configure-script options which interfer with RTEMS
+configuration (Cf. @ref{configure --program-[prefix|suffix|transform-name]})
+@item You have tripped over a bug in RTEMS ;)
+@end itemize
+
+@subsection configure xxx cannot create executables
+
+While running a configure script, you see a message like this:
+@example
+checking for m68k-rtems-gcc... (cached) m68k-rtems-gcc
+checking for C compiler default output... configure: error: C compiler cannot create executables
+configure: error: /bin/sh '../../../../rtems-ss-@value{VERSION}/c/make/configure'
+failed for c/make
+@end example
+This kind of error message typically indicates a broken toolchain, broken
+toolchain installation or broken user environment.
+
+Examinating the @code{config.log} corresponding to the the failing
+configure script should provide further information of what
+actually goes wrong (In the example above: @code{<target>/c/<BSP>/make/config.log})
+
+@subsection Why can I not build RTEMS inside of the source tree?
+
+The build-directory hierarchy is setup dynamically at configuration time.
+
+Configuring inside of the source tree would prevent being able to configure
+for multiple targets simultaneously.
+
+Using a separate build-tree simplifies Makefiles and configure scripts
+significantly.
+
+Adaptation to GNU/Cygnus conventions.
+
+@subsection Which environment variables to set?
+
+None. Unlike for previous releases, it is not recommended anymore to set any
+RTEMS related environment variable (Exception: $PATH, cf.
+@ref{How to set up $PATH?}).
+
+
+@subsection Compiler /Assembler /Linker report errors
+
+If you see a bunch of the error messages related to invalid instructions
+or similar, then probably your @code{$PATH} environment variable is not
+set up correctly (cf. @ref{How to set up $PATH?}). Otherwise you might
+have found a bug either in RTEMS or parts of the toolchain.
+
+@subsection How to set up $PATH?
+
+All target tools are supposed to be prefixed with a target-canonicalization
+prefix, eg. i386-rtems-gcc, m68k-rtems-ld are target tools.
+
+Host tools are supposed not to be prefixed.
+e.g.: cc, ld, gcc, autoconf, automake, aclocal etc.
+
+If using the pre-built tool binaries provided by the RTEMS project,
+simply prepend @code{@value{RTEMSPREFIX}} to @code{$PATH}.
+
+@subsection Can I build RTEMS Canadian Cross?
+
+RTEMS >= 4.6.0 configuration is prepared for building RTEMS Canadian Cross,
+however building RTEMS Canadian Cross is known to be in its infancy, so
+your mileage may vary (See @code{README.cdn-X} in the toplevel directory of
+RTEMS's source tree for details.)
+
+@subsection Building RTEMS is slow
+
+RTEMS has become fairly large :).
+
+In comparison to building previous versions, building RTEMS is slow,
+ but that's the tradeoff to pay for simplier and safer configuration.
+
+If using Cygwin, remember that Cygwin is emulating one OS ontop of another
+ -- this necessarily must be significantly slower than using U*nix on the
+ same hardware.
+
+@subsection Building my pre-4.5.x BSPs does not work anymore
+
+See @ref{How to merge pre-RTEMS-4.5.0 BSPs into RTEMS-4.5.0?}.
+
+@subsection make debug_install / make profile_install
+
+[FIXME:Partially obsolete]
+
+These make targets are not supported anymore. Instead, use:
+
+@example
+make VARIANT=DEBUG install
+make VARIANT=PROFILE install
+@end example
+
+@subsection make debug / make profile
+
+[FIXME:Partially obsolete]
+
+These make targets are not supported anymore.
+Instead, use:
+
+@example
+make VARIANT=DEBUG all
+make VARIANT=PROFILE all
+@end example
+
+
+@subsection Building RTEMS does not honor XXX_FOR_TARGET
+
+RTEMS < 4.6.0 did not support passing flags from the environment.
+If using RTEMS < 4.6.0, editing your BSP's @code{make/custom/mybsp.cfg} and
+setting appropriate flags there is required.
+
+RTEMS >= 4.6.0 honors several XXX_FOR_TARGET environment variables.
+Run @code{<path-to-rtems>/configure --help} for a full list of supported variables.
+
+@subsection Editing Makefile.in Makefile configure
+
+These files are generated by auto* tools, cf.
+@ref{Editing auto* generated files}).
+
+@subsection Editing auto* generated files
+
+RTEMS uses automake, therefore @b{never}, @b{ever}, @b{ever}
+edit Makefile.ins, Makefiles, configure or other auto* generated files.
+Changes to them will be swapped away soon and will get lost.
+
+Instead edit the sources (eg.: Makefile.ams, configure.acs) auto* generated
+files are generated from directly.
+
+If sending patches always send Makefile.ams and configure.acs.
+Sending Makefile.ins, Makefiles and configure scripts is pretty much useless.
+If sending larger patches, consider removing all auto* generated files
+by running @code{bootstrap -c} (cf. See @ref{./bootstrap})
+before running diff to cut a patch.
+
+If you don't understand what this is all about, try start getting familiar
+with auto* tools by reading autoconf.info and automake.info, or feel free
+to ask for assistance on the RTEMS Mailing List
+(See @ref{Are there any mailing lists?}.
+
+@section Host Operating Systems and RTEMS
+
+@subsection Can I use Windows or DOS?
+
+
+No, plain DOS and plain Win will not work, but Cygwin should.
+Other U*nix emulations, such as Mingw and DJGPP are not supported and very
+likely will not work.
+Cywin / WinNT is known to work, but at the time of writing this, there
+seem to persist non-RTEMS related issues with Cygwin under Win9x which
+seem to prevent success on those systems.
+
+@subsection Do I need Linux?
+
+
+No, you should be able to build RTEMS on any U*ix OS and under Cygwin/NT
+(cf. @ref{Can I use Windows or DOS?}).
+
+@subsection Which Linux distribution is recommended?
+
+None, any recent U*nix should work, i.e.
+any recent Linux distribution should work, too.
+
+@section Development related questions
+
+@subsection How to merge pre-RTEMS-4.5.0 BSPs into RTEMS-4.5.0?
+
+[FIXME:Partially obsolete]
+
+The simple answer is that between 4.0 and 4.5.0, RTEMS has moved to automake
+and greater compliance with GNU conventions.
+In 4.0, there was a single configure script at the top of the tree.
+Now RTEMS is configured more like other GNU tools -- as a collection of
+configurable entities.
+
+Each BSP now has its own configure script.
+I highly recommend you look at the Makefile.am's, configure.ac, of a similar
+BSP. You might even want to consider running "bootstrap -c" from the top of
+the tree and looking at what is left. bootstrap (cf. @ref{./bootstrap})
+generates/removes all automatically generated files.
+
+@subsection What is no_bsp / no_cpu?
+
+@code{no_bsp} is a fictional BSP for a fictional CPU of type
+@code{no_cpu}. @code{no_cpu/no_bsp} support files in RTEMS can be used as
+templates when implementing BSPs or porting RTEMS to new CPUs.
+
+@subsection What is the bare-BSP?
+
+At the time being RTEMS is build per BSP, with all support files being build
+separately for each BSP. This can become unhandy when using several similar
+but not identical boards (e.g. a PC with different peripherial cards plugged
+in), because this in general requires to implement a BSP for each setup.
+The bare BSP is a general, setup independent BSP which can be used when
+keeping all BSP specific parts external from RTEMS.
+
+At present time the bare BSP is in its infancy.
+It is known that it can be build for most CPUs RTEMS supports.
+It is also known to work in individual cases, but your mileage may vary.
+
+@subsection What is the cpukit?
+
+[FIXME:To be extended]
+
+One major change having been introduced to RTEMS-4.6.0 is the cpukit,
+located below the directory @code{cpukit/} in RTEMS's toplevel directory.
+
+@subsection Multilib vs. RTEMS CPU-variants
+
+The GNU toolchain applies a specific classification of similar CPUs into
+CPU variants (eg. SH1, SH2 etc.) to provide better support for each CPU variant.
+
+RTEMS uses a different classification because it internally requires more
+details about a specific CPU than the GNU toolchain's multilib classification
+provides.
+
+@subsection Keeping auto* generated files in CVS
+
+When using CVS to archive source code, problems arise from keeping generated
+files in CVS. In general, two possible solutions exist:
+
+@itemize @bullet
+
+@item Find a way to get correct timestamps after checking out the sources
+from CVS. Some people try to achieve this by
+
+@itemize @bullet
+@item carefully checking in files into CVS in appropriate order
+@item applying scripts to fix timestamps accordingling (eg. by applying
+@code{touch} and @code{find}).
+@end itemize
+
+@item Not keeping generated files in CVS, but regenerate them after
+having checked them out from CVS.
+
+@end itemize
+
+RTEMS favors the the latter variant, because it appears to be less error-prone
+and easier to handle (cf. @ref{./bootstrap} for details).
+
+@subsection Importing RTEMS into CVS/RCS
+
+When importing RTEMS into CVS/RCS or similar, we recommend not to import
+auto* generated files (cf. @ref{Keeping auto* generated files in CVS}).
+
+To remove them before importing, run
+
+@example
+./bootstrap -c
+@end example
+
+from the toplevel directory of the source tree (cf. @ref{./bootstrap}).
+
+@subsection ./bootstrap
+
+
+@code{bootstrap} is a simple shell script which automatically generates all
+auto* generated files within RTEMS's source tree (Other packages use the name
+@code{autogen.sh} for similar scripts). You will need to have autoconf,
+automake and further underlying packages installed to apply it.
+
+It typically should be applied when having:
+
+@itemize @bullet
+
+@item checked out RTEMS sources from a CVS repository which does
+not contain generated files.
+
+@item added new automake / autoconf files to the source tree (eg.
+having added a new BSP), and when not being sure about what needs to be
+updated.
+
+@end itemize
+
+Once all autoconf/automake generated files are present, you will rarely
+need to run @code{bootstrap}, because automake automatically updates
+generated files when it detects some files need to be updated (Cf.
+@ref{configure --enable-maintainer-mode}).
+
+@subsection configure --enable-maintainer-mode
+
+When working within the source-tree, consider to append
+@code{--enable-maintainer-mode} to the options passed to configure RTEMS.
+
+@example
+<path>/rtems-@value{VERSION}/configure <options> --enable-maintainer-mode
+@end example
+
+This will enable the maintainer-mode in automake generated Makefiles, which
+will let automake take care about dependencies between auto* generated
+files. I.e. auto* generated files will get automatically updated.
+
+Configuring RTEMS in maintainer-mode will require to have autoconf, automake
+and underlying tools installed (Cf. @ref{Required Tools}).
+
+@subsection configure --program-[prefix|suffix|transform-name]
+
+These are generic configure script options automatically added by autoconf.
+RTEMS configuration does not support these, worse, they interfer with
+RTEMS's configuration -- i.e. @b{do not use them}.
+
+@subsection configure.ac vs. configure.in
+
+autoconf < 2.50 used the name @code{configure.in} for it's input files.
+autoconf >= 2.50 recommends using the name @code{configure.ac}, instead.
+
+RTEMS > 4.5.0 applies autoconf >= 2.50, therefore all former RTEMS's
+@code{configure.in}'s have been renamed into @code{configure.ac} and
+have been adapted to autoconf >= 2.50 demands.
+
+@subsection Reporting bugs
+
+Several possibilities (In decreasing preference):
+@itemize @bullet
+@item File a bug report at @uref{@value{RTEMSGNATS},RTEMS's GNATS}
+@item Send an email to @uref{mailto:@value{RTEMSBUGS},@value{RTEMSBUGS}}
+@item Report your problem to one of the RTEMS mailing lists
+(Cf. @ref{Are there any mailing lists?}).
+@end itemize
diff --git a/doc/FAQ/concepts.t b/doc/FAQ/concepts.t
new file mode 100644
index 0000000000..87fa454ab0
--- /dev/null
+++ b/doc/FAQ/concepts.t
@@ -0,0 +1,19 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter RTEMS Concepts
+
+The questions in this category are hints that help basic understanding.
+
+@section RTEMS Workspace versus Program Heap
+
+The RTEMS Workspace is used to allocate space for objects created
+by RTEMS such as tasks, semaphores, message queues, etc.. It is
+primarily used during system initialization although task stacks
+and message buffer areas are also allocated from here.
+@ref{How do I determine how much memory is left?}.
diff --git a/doc/FAQ/debug.t b/doc/FAQ/debug.t
new file mode 100644
index 0000000000..08f3b991fc
--- /dev/null
+++ b/doc/FAQ/debug.t
@@ -0,0 +1,158 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Debugging Hints
+
+The questions in this category are hints that can ease debugging.
+
+@section Executable Size
+
+@subsection Why is my executable so big?
+
+There are two primary causes for this. The most common is that
+you are doing an @code{ls -l} and looking at the actual file
+size -- not the size of the code in the target image. This
+file could be in an object format such as ELF or COFF and
+contain debug information. If this is the case, it could
+be an order of magnitude larger than the required code space.
+Use the strip command in your cross toolset to remove debugging
+information.
+
+The following example was done using the i386-rtems cross toolset
+and the pc386 BSP. Notice that with symbolic information included
+the file @code{hello.exe} is almost a megabyte and would barely fit
+on a boot floppy. But there is actually only about 93K of code
+and initialized data. The other 800K is symbolic information
+which is not required to execute the application.
+
+@example
+$ ls -l hello.exe
+-rwxrwxr-x 1 joel users 930515 May 2 09:50 hello.exe
+$ i386-rtems-size hello.exe
+ text data bss dec hex filename
+ 88605 3591 11980 104176 196f0 hello.exe
+$ i386-rtems-strip hello.exe
+$ ls -l hello.exe
+-rwxrwxr-x 1 joel users 106732 May 2 10:02 hello.exe
+$ i386-rtems-size hello.exe
+ text data bss dec hex filename
+ 88605 3591 11980 104176 196f0 hello.exe
+@end example
+
+Another alternative is that the executable file is in an ASCII
+format such as Motorola Srecords. In this case, there is
+no debug information in the file but each byte in the target
+image requires two bytes to represent. On top of that, there
+is some overhead required to specify the addresses where the image
+is to be placed in target memory as well as checksum information.
+In this case, it is not uncommon to see executable files
+that are between two and three times larger than the actual
+space required in target memory.
+
+Remember, the debugging information is required to do symbolic
+debugging with gdb. Normally gdb obtains its symbolic information
+from the same file that it gets the executable image from. However,
+gdb does not require that the executable image and symbolic
+information be obtained from the same file. So you might
+want to create a @code{hello_with_symbols.exe}, copy that
+file to @code{hello_without_symbols.exe}, and strip
+@code{hello_without_symbols.exe}. Then gdb would have to
+be told to read symbol information from @code{hello_with_symbols.exe}.
+The gdb command line option @code{-symbols} or command
+@code{symbol-file} may be used to specify the file read
+for symbolic information.
+
+
+@section Malloc
+
+@subsection Is malloc reentrant?
+
+Yes. The RTEMS Malloc implementation is reentrant. It is
+implemented as calls to the Region Manager in the Classic API.
+
+@subsection When is malloc initialized?
+
+During BSP initialization, the @code{bsp_libc_init} routine
+is called. This routine initializes the heap as well as
+the RTEMS system call layer (open, read, write, etc.) and
+the RTEMS reentrancy support for the Cygnus newlib Standard C
+Library.
+
+The @code{bsp_libc_init} routine is passed the size and starting
+address of the memory area to be used for the program heap as well
+as the amount of memory to ask @code{sbrk} for when the heap is
+exhausted. For most BSPs, all memory available is placed in the
+program heap thus it can not be extended dynamically by calls to
+@code{sbrk}.
+
+@section How do I determine how much memory is left?
+
+First there are two types of memory: RTEMS Workspace and Program Heap.
+The RTEMS Workspace is the memory used by RTEMS to allocate control
+structures for system objects like tasks and semaphores, task
+stacks, and some system data structures like the ready chains.
+The Program Heap is where "malloc'ed" memory comes from.
+
+Both are essentially managed as heaps based on the Heap Manager
+in the RTEMS SuperCore. The RTEMS Workspace uses the Heap Manager
+directly while the Program Heap is actually based on an RTEMS Region
+from the Classic API. RTEMS Regions are in turn based on the Heap
+Manager in the SuperCore.
+
+@subsection How much memory is left in the RTEMS Workspace?
+
+An executive workspace overage can be fairly easily spotted with a
+debugger. Look at _Workspace_Area. If first == last, then there is only
+one free block of memory in the workspace (very likely if no task
+deletions). Then do this:
+
+(gdb) p *(Heap_Block *)_Workspace_Area->first
+$3 = @{back_flag = 1, front_flag = 68552, next = 0x1e260, previous = 0x1e25c@}
+
+In this case, I had 68552 bytes left in the workspace.
+
+@subsection How much memory is left in the Heap?
+
+The C heap is a region so this should work:
+
+(gdb) p *((Region_Control *)_Region_Information->local_table[1])->Memory->first
+$9 = @{back_flag = 1, front_flag = 8058280, next = 0x7ea5b4,
+ previous = 0x7ea5b0@}
+
+In this case, the first block on the C Heap has 8,058,280 bytes left.
+
+@section How do I convert an executable to IEEE-695?
+
+This section is based on an email from Andrew Bythell
+<abythell@@nortelnetworks.com> in July 1999.
+
+Using Objcopy to convert m68k-coff to IEEE did not work. The new IEEE
+object could not be read by tools like the XRay BDM Debugger.
+
+The exact nature of this problem is beyond me, but I did narrow it down to a
+problem with objcopy in binutils 2-9.1. To no surprise, others have
+discovered this problem as well, as it has been fixed in later releases.
+
+I compiled a snapshot of the development sources from 07/26/99 and
+everything now works as it should. The development sources are at
+@uref{http://sourceware.cygnus.com/binutils} (thanks Ian!)
+
+Additional notes on converting an m68k-coff object for use with XRay (and
+others):
+
+@enumerate
+
+
+@item The m68k-coff object must be built with the -gstabs+ flag. The -g flag
+alone didn't work for me.
+
+@item Run Objcopy with the --debugging flag to copy debugging information.
+
+@end enumerate
+
+
diff --git a/doc/FAQ/endoftime.t b/doc/FAQ/endoftime.t
new file mode 100644
index 0000000000..9ba5436aef
--- /dev/null
+++ b/doc/FAQ/endoftime.t
@@ -0,0 +1,111 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Date/Time Issues in Systems Using RTEMS
+
+This section provides technical information regarding
+date/time representation issues and RTEMS. The Y2K problem has
+lead numerous people to ask these questions. The answer to
+these questions are actually more complicated than most
+people asking the question expect. RTEMS supports multiple
+standards and each of these standards has its own epoch and
+time representation. These standards include both programming
+API and programming language standards.
+
+In addition to the issues inside RTEMS
+itself, there is the complicating factor that the Board
+Support Package or application itself may interface with hardware
+or software that has its own set of date/time representation
+issues.
+
+In conclusion, viewing date/time representation as "the Y2K problem"
+is very short-sighted. Date/time representation should be viewed as
+a systems level issue for the system you are building. Each software
+and hardware component in the system as well as the systems being
+connected to is a factor in the equation.
+
+@section Hardware Issues
+
+Numerous Real-Time Clock (RTC) controllers provide only a two-digit
+Binary Coded Decimal (BCD) representation for the current year. Without
+software correction, these chips are a classic example of the Y2K problem.
+When the RTC rolls the year register over from 99 to 00, the device
+has no idea whether the year is 1900 or 2000. It is the responsibility
+of the device driver to recognize this condition and correct for it.
+The most common technique used is to assume that all years prior
+to either the existence of the board or RTEMS are past 2000. The
+starting year (epoch) for RTEMS is 1988. Thus,
+
+@itemize @bullet
+@item Chip year values 88-99 are interpreted as years 1988-2002.
+@item Chip year values 00-87 are interpreted as years 2000-2087.
+@end itemize
+
+Using this technique, a RTC using a
+two-digit BCD representation of the current year will overflow on
+January 1, 2088.
+
+@section RTEMS Specific Issues
+
+Internally, RTEMS uses an unsigned thirty-two bit integer to represent the
+number of seconds since midnight January 1, 1988. This counter will
+overflow on February 5, 2124.
+
+The time/date services in the Classic API will overflow when the
+RTEMS internal date/time representation overflows.
+
+The POSIX API uses the type @i{time_t} to represent the number of
+seconds since January 1, 1970. Many traditional UNIX systems as
+well as RTEMS define @i{time_t} as a signed thirty-two bit integer.
+This representation overflows on January 18, 2038. The solution
+usually proposed is to define @i{time_t} as a sixty-four bit
+integer. This solution is appropriate for for UNIX workstations
+as many of them already support sixty-four bit integers natively.
+At this time, this imposes a burden on embedded systems which are
+still primarily using processors with native integers of thirty-two
+bits or less.
+
+@section Language Specific Issues
+
+The Ada95 Language Reference Manual requires that the @i{Ada.Calendar}
+package support years through the year 2099. However, just as the
+hardware is layered on top of hardware and may inherit its limits,
+the Ada tasking and run-time support is layered on top of an operating
+system. Thus, if the operating system or underlying hardware fail
+to correctly report dates after 2099, then it is possible for the
+@i{Ada.Calendar} package to fail prior to 2099.
+
+@section Date/Time Conclusion
+
+Each embedded system could be impacted by a variety of date/time
+representation issues. Even whether a particular date/time
+representation issue impacts a system is questionable. A system
+using only the RTEMS Classic API is not impacted by the
+date/time representation issues in POSIX. A system not using
+date/time at all is not impacted by any of these issues. Also
+the planned end of life for a system may make these issues
+moot.
+
+The following is a timeline of the date/time representation
+issues presented in this section:
+
+@itemize @bullet
+
+@item 2000 - Two BCD Digit Real-Time Clock Rollover
+
+@item 2038 - POSIX @i{time_t} Rollover
+
+@item 2088 - Correction for Two BCD Digit Real-Time Clock Rollover
+
+@item 2099 - Ada95 @i{Ada.Calendar} Rollover
+
+@item 2124 - RTEMS Internal Seconds Counter Rollover
+
+@end itemize
+
+
diff --git a/doc/FAQ/entry b/doc/FAQ/entry
new file mode 100644
index 0000000000..d671352e62
--- /dev/null
+++ b/doc/FAQ/entry
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+This is the RTEMS entry in the Crossgcc FAQ at @uref{http://www.objsw.com}.
+As of 8/19/99, it has been submitted twice and the FAQ not updated.
+
+RTEMS is a freely available, royalty free real-time executive with
+multiprocessor capabilities. RTEMS' design provides performance and
+capabilities are comparable to those of the best commercial executives.
+The directive execution times and other critical performance measures such
+as interrupt latency are best of class. RTEMS was developed by On-Line
+Applications Research Corporation (OAR) under contract to the U.S. Army
+Missile Command.
+
+
+RTEMS includes support for multiple APIs. Currently RTEMS supports a
+POSIX threads API, and an RTEID based API which is similar to pSOS+.
+RTEMS includes a number of advanced real-time features including optional
+rate monotonic scheduling support, binary semapahores with priority
+inheritance, and watchdog timer functions.
+
+RTEMS includes a port of the FreeBSD TCP/IP stack that has high
+performance on very modest hardware. A remote debug server is supported
+on some targets that allows debugging across the network.
+
+RTEMS provides a rich run-time environment with a reentrant C library,
+POSIX 1003.1b support, and file system support. It also includes optional
+debug aids like stack overflow and heap integrity checking.
+
+RTEMS is built using GNU autoconf and can be built on any host supporting
+the GNU tools including GNU/Linux, FreeBSD, NetBSD, Solaris, and MS-Windows
+to name but a few. The current RTEMS release supports the following CPU
+families:
+
+ Motorola m680x0, m683xx, and ColdFire
+ Motorola and IBM PowerPC (4xx, 5xx, 6xx, 7xx, 8xx, and 84xx)
+ Hitachi SH-1, SH-2, SH-4
+ Hitachi H8
+ ARM
+ Intel i386, i486, Pentium, and i960
+ SPARC
+ MIPS
+ Texas Instruments C3x/C4x
+ OpenCores OR32
+
+There are over 35 Board Support Packages included with RTEMS including
+BSPs for a standard PC as well as the SPARC, MIPS, PowerPC simulators
+included with gdb. There are numerous BSPs for CPUs targetting the
+embedded market such as the Motorola m683xx, ppc4xx, and mpc8xx series
+which support the on-CPU peripherals.
+
+WWW:
+
+@uref{http://www.rtems.com}
+
+E-mail:
+
+@code{rtems-info@@OARcorp.com}
+
diff --git a/doc/FAQ/freesw.t b/doc/FAQ/freesw.t
new file mode 100644
index 0000000000..acf580d328
--- /dev/null
+++ b/doc/FAQ/freesw.t
@@ -0,0 +1,169 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Free Software that Works with RTEMS
+
+This section describes other free software packages that are known to work
+with RTEMS.
+
+@section Development Tools
+
+@subsection Basic Development Environment
+
+The standard RTEMS development environment consists of the following GNU
+components:
+
+@itemize @bullet
+
+@item gcc
+@item binutils
+@item gdb
+
+@end itemize
+
+Although not from the Free Software Foundation, the Cygnus newlib C
+library integrates well with the GNU tools and is a standard part of the
+RTEMS development environment.
+
+@subsection GNU Ada
+
+For those interested in using the Ada95 programming language, the GNU Ada
+compiler (GNAT) is available and has excellent support for RTEMS.
+
+@subsection DDD - Data Display Debugger
+
+By far the easiest way to use DDD if you are on a Redhat or SuSE Linux system
+is to retrieve the RPM package for your OS version. In general, it is
+easier to install a static binary since doing so avoids all problems
+with dynamic library versions.
+
+Some versions of DDD have had trouble with Lesstif. If you
+are using Lesstif, you will need version 0.88 or newer. It
+is also available as an RPM at the popular sites. Another Motif
+clone is Motive and versions 1.2 and newer known to work with DDD
+on popular distributions of Linux including RedHat and Slackware.
+
+Installed as RPMs, DDD in conjunction with either Lesstif or Motive
+should work out-of-the-box.
+
+User comments indicate that both Lesstif and DDD can be built
+from scratch without any problems. Instructions on installing DDD
+are at @uref{http://www.cs.tu-bs.de/softech/ddd/}. They
+indicate that
+
+@itemize @bullet
+LessTif should be used in (default) Motif 1.2 compatibility mode.
+
+The Motif 2.0 compatibility mode of LessTif is still incomplete.
+@end itemize
+
+So configure lesstif with --enable-default-12.
+
+The configure script is broken (see www.lesstif.org --> known problems)
+for 0.88.1. I didn't fix the script as they show, so I just have links
+in /usr/local/lib (also shown).
+
+Watch out: Lesstif installs its libraries in /usr/local/Lesstif. You
+will need to update /etc/ld.so.conf and regenerate the cache of shared
+library paths to point to the Motif 1.2 library.
+
+The following notes are from an RTEMS user who uses DDD in conjunction
+with Lesstif. Configure DDD "--with-motif-libraries=/usr/local/lib
+--with-motif-includes=/usr/local/include" DDD needs gnuplot 3.7.
+@uref{ftp://ftp.dartmouth.edu/pub/gnuplot/gnuplot-3.7.tar.gz}. Build and
+install from scratch.
+
+DDD can be started from a script that specifies the cross debugger.
+This simplifies the invocation. The following example shows what
+a script doing this looks like.
+
+@example
+#!/bin/bash
+ddd --debugger m68k-elf-gdb $1
+@end example
+
+Under many flavors of UNIX, you will likely have to relax permissions.
+
+On Linux, to get gdb to use the serial ports while running as a
+normal user, edit /etc/security/console.perms, and create a <serial>
+class (call it whatever you want).
+
+@example
+<serial>=/dev/ttyS* /dev/cua*
+@end example
+
+Now enable the change of ownership of these devices when users log in
+from the console:
+
+@example
+<console> 0600 <serial> 0600 root
+@end example
+
+Users report using minicom to communicate with the target to initiate a TFTP
+download. They then suspend minicom, launch DDD, and begin debugging.
+
+The procedure should be the same on other platforms, modulo the choice
+of terminal emulator program and the scheme used to access the serial
+ports. From problem reports on the cygwin mailing list, it appears that
+GDB has some problems communicating over serial lines on that platform.
+
+NOTE: GDB does not like getting lots of input from the program under test
+over the serial line. Actually, it does not care, but it looses
+characters. It would appear that flow control is not re-enabled when it
+resumes program execution. At times, it looked like the test were
+failing, but everything was OK. We modified the MVME167 serial driver to
+send test output to another serial port. Using two serial ports is
+usually the easiest way to get test output while retaining a reliable debug
+connection regardless of the debugger/target combination.
+
+NOTE: Enabling gdb's remote cache might prevent this (Observed with SH1
+boards, but may also be valid for targets):
+@example
+gdb > set remotecache
+@end example
+
+Information provided by Charles-Antoine Gauthier (charles.gauthier@@iit.nrc.ca)
+Jiri Gaisler (jgais@@ws.estec.esa.nl) and Ralf Cors@'epius
+(corsepiu@@faw.uni-ulm.de)
+
+
+@section omniORB
+
+omniORB is a GPL'ed CORBA which has been ported to RTEMS. It is
+available from
+(@uref{http://www.uk.research.att.com/omniORB/omniORB.html,http://www.uk.research.att.com/omniORB/omniORB.html})
+.
+
+For information on the RTEMS port of omniORB to RTEMS, see the following
+URL
+(@uref{http://www.connecttel.com/corba/rtems_omni.html,http://www.connecttel.com/corba/rtems_omni.html}).
+
+C++ exceptions must work properly on your target for omniORB to work.
+
+The port of omniORB to RTEMS was done by Rosimildo DaSilva
+<rdasilva@@connecttel.com>.
+
+@section TCL
+
+Tool Command Language.
+
+ditto
+
+@section ncurses
+
+Free version of curses.
+
+ditto
+
+
+@section zlib
+
+Free compression/decompression library.
+
+ditto
+
diff --git a/doc/FAQ/hwdebugaids.t b/doc/FAQ/hwdebugaids.t
new file mode 100644
index 0000000000..5283e43251
--- /dev/null
+++ b/doc/FAQ/hwdebugaids.t
@@ -0,0 +1,110 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Hardware to Ease Debugging
+
+The items in this category provide information on various hardware
+debugging assistants that are available.
+
+@section MC683xx BDM Support for GDB
+
+Eric Norum (eric@@skatter.usask.ca) has a driver for a parallel
+port interface to a BDM module. This driver has a long history
+and is based on a driver by Gunter Magin (magin@@skil.camelot.de)
+which in turn was based on BD32 for DOS by Scott Howard. Eric Norum
+and Chris Johns (ccj@@acm.org) have put together a package containing
+everything you need to use this BDM driver including software, PCB layouts,
+and machining drawings. From the README:
+
+"This package contains everything you need to be able to run GDB on
+Linux and control a Motorola CPU32+ (68360) or Coldfire (5206, 5206e, or
+5207) target through a standard PC parallel port."
+
+Information on this BDM driver is available at the following URL:
+
+@example
+http://www.calm.hw.ac.uk/davidf/coldfire/gdb-bdm-linux.htm
+@end example
+
+The package is officially hosted at Eric Norum's ftp site:
+
+@example
+ftp://skatter.usask.ca/pub/eric/BDM-Linux-gdb/
+@end example
+
+Peter Shoebridge (peter@@zeecube.com) has ported the Linux
+parallel port BDM driver from Eric Norum to Windows NT. It is
+available at http://www.zeecube.com/bdm.
+
+The efi332 project has a home-built BDM module and gdb backend for
+Linux. See http://efi332.eng.ohio-state.edu/efi332/hardware.html)
+for details. The device driver and gdb backend are based on those
+by Gunter Magin (magin@@skil.camelot.de) available from
+ftp.lpr.e-technik.tu-muenchen.de.
+
+Pavel Pisa (pisa@@cmp.felk.cvut.cz) has one available at
+http://cmp.felk.cvut.cz/~pisa/m683xx/bdm_driver.html.
+
+Huntsville Microsystems (HMI) has GDB support for their BDM module
+available upon request. It is also available from their ftp site:
+ftp://ftp.hmi.com/pub/gdb
+
+The Macraigor OCD BDM module has a driver for Linux
+written by Gunter Magin (magin@@skil.camelot.de).
+No URLs yet.
+
+Finally, there is a overview of BDM at the following URL:
+http://cmp.felk.cvut.cz/~pisa/m683xx/bdm_driver.html.
+
+Information in this section from:
+
+@itemize @bullet
+@item Brendan Simon <brendan@@dgs.monash.edu.au>
+@item W Gerald Hicks <wghicks@@bellsouth.net>
+@item Chris Johns <ccj@@acm.org>
+@item Eric Norum <eric@@skatter.usask.ca>
+@item Gunter Magin <magin@@skil.camelot.de>
+
+@end itemize
+
+
+@section MPC8xx BDM Support for GDB
+
+@c "Adrian Bocaniciu" <a.bocaniciu@computer.org> has a driver
+@c for NT and is willing to share it but he needs to be emailed
+@c privately since he needs to explain somethings about it.
+@c It has been used for over a year as of 08/18/99.
+
+Christian Haan <chn@@intego.de> has written a driver for FreeBSD
+based for"a slightly changed ICD BDM module (because of changes
+in the BDM interface on the PowerPC)" that "probably will work with
+the PD module too." His work is based on the M68K BDM work by
+Gunter Magin (Gunter.Magin@@skil.camelot.de) and
+the PPC BDM for Linux work by Sergey Drazhnikov (swd@@agua.comptek.ru).
+This is not yet publicly available.
+
+Sergey Drazhnikov (swd@@agua.comptek.ru) has written a PPC BDM driver for
+Linux. Information is available at http://cyclone.parad.ru/ppcbdm.
+
+Huntsville Microsystems (HMI) has GDB support for their BDM module
+available upon request. It is also available from their ftp site:
+ftp://ftp.hmi.com/pub/gdb
+
+GDB includes support for a set of primitives to support the Macraigor
+Wiggler (OCD BDM). Unfortunately, this requires the use of a
+proprietary interface and is supported only on Windows. This forces
+one to use CYGWIN. Reports are that this results in a slow
+interface. Scott Howard (http://www.objsw.com) has announced
+that support for the gdb+wiggler combination under DJGPP which should
+run significantly faster.
+
+@itemize @bullet
+@item Leon Pollak <leonp@@plris.com>
+@item Christian Haan <chn@@intego.de>
+@end itemize
+
diff --git a/doc/FAQ/projects.t b/doc/FAQ/projects.t
new file mode 100644
index 0000000000..bf1abaa974
--- /dev/null
+++ b/doc/FAQ/projects.t
@@ -0,0 +1,113 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter RTEMS Projects
+
+The questions in this category are regarding things that people
+are working on or that the RTEMS community would like to see work on.
+
+There are multiple ways to support the RTEMS Project. Financial support
+is always welcomed. This can be via sponsorship of a specific project
+such as one of the ones listed here or via volunteering in some
+capacity.
+
+@section Other Filesystems
+
+This is a list of the filesystems that would be nice to have support
+for in RTEMS. For each filsystem, status and contact information is
+provided for those who have expressed interest in helping out or are actively
+working on it.
+
+@itemize @bullet
+@item TFTP client - read only, no write capability
+@itemize @bullet
+@item No Contact
+@end itemize
+
+@item DOS Filesystem - ???
+@itemize @bullet
+@item Peter Shoebridge <peter@@zeecube.com>
+@item Victor V. Vengerov <vvv@@tepkom.ru>
+@end itemize
+
+@item CD-ROM Filesystem - ???
+@itemize @bullet
+@item Peter Shoebridge <peter@@zeecube.com>
+@end itemize
+
+@item Flash Filesystem(s) - ???
+@itemize @bullet
+@item Rod Barman <rodb@@ieee.org>
+@item Victor V. Vengerov <vvv@@tepkom.ru>
+@end itemize
+
+@item Remote Host Filesystem - ???
+@itemize @bullet
+@item Wayne Bullaughey <wayne@@wmi.com>
+@end itemize
+
+@item NFS client - ???
+@itemize @bullet
+@item No Contact
+@end itemize
+
+@end itemize
+
+@section Java
+
+@subsection Kaffe
+
+This porting effort is underway and active.
+
+@itemize @bullet
+@item Jiri Gaisler <jgais@@ws.estec.esa.nl>
+@item Oscar Martinez de la Torre <omt@@wm.estec.esa.nl>
+@end itemize
+
+NOTE: An older version of Kaffe was ported to a pre-4.0 version of RTEMS.
+The network support in RTEMS was immature at that port and Kaffe had
+portability problems. Together these resulted in an unclean port which
+was never merged.
+
+@subsection GNU Java Compiler (gjc)
+
+This porting effort is underway and active.
+
+@itemize @bullet
+@item Charles-Antoine Gauthier <charles.gauthier@@iit.nrc.ca>
+@end itemize
+
+@section CORBA
+
+@subsection TAO
+
+This porting effort is pending testing. Erik ported the code but then
+discovered that his target board did not have enough memory to run
+any TAO tests.
+
+@itemize @bullet
+@item Erik Ivanenko <erik.ivanenko@@utoronto.ca>
+@end itemize
+
+@section APIs
+
+@subsection POSIX 1003.1b
+
+Support for POSIX 1003.1b is mature but there are a few remaining
+items including a handful of services, performance tests, and
+documentation. Please refer to the Status chapter of the
+@i{POSIX API User's Guide} for more details.
+
+@subsection ITRON 3.0
+
+Support for ITRON 3.0 is in its beginning stages. There are
+numerous managers left to implement, both functional and
+performance tests to write, and much documentation remaining.
+Please refer to the Status chapter of the @i{ITRON 3.0 API User's Guide}
+for specific details.
+
diff --git a/doc/FAQ/tools.t b/doc/FAQ/tools.t
new file mode 100644
index 0000000000..4af175bcc9
--- /dev/null
+++ b/doc/FAQ/tools.t
@@ -0,0 +1,71 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter General Development Tool Hints
+
+The questions in this category are related to the GNU development tools
+in a non-language specific way.
+
+@section What is GNU?
+
+Take a look at @uref{http://www.gnu.org,http://www.gnu.org} for information on the GNU Project.
+
+@section How do I generate a patch?
+
+The RTEMS patches to the development tools are generated using a
+command like this
+
+@example
+diff -N -P -r -c TOOL-original-image TOOL-with-changes >PATCHFILE
+@end example
+
+where the options are:
+
+@itemize @bullet
+
+@item -N and -P take care of adding and removing files (be careful not to
+include junk files like file.mybackup)
+
+@item -r tells diff to recurse through subdirectories
+
+@item -c is a context diff (easy to read for humans)
+
+@end itemize
+
+Please look at the generated PATCHFILE and make sure it does not
+contain anything you did not intend to send to the maintainers.
+It is easy to accidentally leave a backup file in the modified
+source tree or have a spurious change that should not be
+in the PATCHFILE.
+
+If you end up with the entire contents of a file in the patch
+and can't figure out why, you may have different CR/LF scheme
+in the two source files. The GNU open-source packages usually have
+UNIX style CR/LF. If you edit on a Windows platform, the line
+terminators may have been transformed by the editor into Windows
+style.
+
+@section How do I apply a patch?
+
+Patches generated with the @code{diff} program are fed into the
+@code{patch} program as follows:
+
+@example
+patch -p1 <PATCHFILE
+@end example
+
+where the options are:
+
+@itemize @bullet
+
+@item -pNUM tells @code{patch} to strip off NUM slashes from the
+pathname.
+
+@end itemize
+
+If @code{patch} prompts for a file to patch, you may need to adjust NUM.
diff --git a/doc/HELP.html b/doc/HELP.html
new file mode 100644
index 0000000000..1d8dac4d4d
--- /dev/null
+++ b/doc/HELP.html
@@ -0,0 +1,21 @@
+<HTML>
+<HEAD><TITLE>RTEMS 4.0.0 On-Line Library</TITLE></HEAD>
+<BODY BGCOLOR="FFFFFF">
+<A HREF="http://www.rtems.com" target="Text Frame">
+ <IMG align=right BORDER=0 SRC="rtems_logo.jpg" ALT="RTEMS Logo"> </A>
+<H1>RTEMS On-Line Library</H1>
+<HR>
+<BODY>
+The following supplement manuals do not currently exist:
+<MENU>
+ <LI>RTEMS MIPS Applications Supplement</LI>
+ <LI>RTEMS Hitachi SH Applications Supplement</LI>
+ <LI>RTEMS UNIX Port Applications Supplement</LI>
+</MENU>
+<p>If you have knowledge of the processors used in the above ports and
+want to contribute to RTEMS, please contact a member of the
+RTEMS Steering Committee.</p>
+
+<HR>
+Copyright &copy; 1988-2004 <A HREF="http://www.rtems.com" target="Text Frame">OAR Corporation</A>
+</BODY></HTML>
diff --git a/doc/Makefile.am b/doc/Makefile.am
new file mode 100644
index 0000000000..237b956b19
--- /dev/null
+++ b/doc/Makefile.am
@@ -0,0 +1,41 @@
+#
+# $Id$
+#
+
+ACLOCAL_AMFLAGS = -I ../aclocal
+
+# NOTE: The order of the directories is essential.
+# + tools, common and images are shared across many documents
+
+SUBDIRS = tools FAQ started user bsp_howto porting develenv posix_users \
+ posix1003.1 filesystem itron3.0 networking ada_user started_ada \
+ rtems_gdb rgdb_specs new_chapters relnotes supplements gnu_docs
+
+if USE_HTML
+html_DATA = index.html HELP.html
+endif
+
+EXTRA_DIST = HELP.html rtems_header.html.in rtems_footer.html.in
+
+EXTRA_DIST += common/cpright.texi common/setup.texi common/timemac.texi \
+ common/timetbl.t common/treedef.tex common/wksheets.t common/timing.t \
+ common/rtems.texi.in
+
+html_imagesdir = $(htmldir)/images
+
+HTML_IMAGES = images/dir-arrow.gif images/dvi.gif images/missing-arrow.gif \
+ images/next-arrow.gif images/oaronly.jpg images/pdf.gif images/pdf1.gif \
+ images/rtems_logo.jpg images/prev-arrow.gif images/ps.gif \
+ images/up-arrow.gif
+
+if USE_HTML
+html_images_DATA = $(HTML_IMAGES)
+endif
+
+EXTRA_DIST += $(HTML_IMAGES)
+
+CLEANFILES = common/rtems.texi
+DISTCLEANFILES = common/rtems.sed
+
+# HACK: This should not be here, but it makes "make distcheck" work.
+EXTRA_DIST += ../scripts/setup.def ../COPYING
diff --git a/doc/README b/doc/README
new file mode 100644
index 0000000000..8cd557e9ce
--- /dev/null
+++ b/doc/README
@@ -0,0 +1,56 @@
+#
+# $Id$
+#
+
+Tools Required
+==============
+The following tools are used in the production of this documentation:
+
+TeX
+texinfo 4.0
+texi2www-960103 (included in tree)
+
+This was used by the authors to generate the directory tree figure
+in the texinfo printed version:
+
+tree (from the CTAN Archives -- see http://jasper.ora.com/ctan.html)
+
+Changing the Version Number and Timestamp
+=========================================
+
+RTEMS Version number is in configure.in. Edit that file and run bootstrap.
+
+Documentation date is in common/setup.texi.in and also must be modified
+by hand. bootstrap does not have to be run after modifying this file.
+
+Making the Documentation
+========================
+
+cd rtems-XXX/doc
+../bootstrap
+./configure --enable-maintainer-mode
+cd tools ; make
+cd ..
+make info
+make all
+make install
+
+Cleaning
+========
+
+make clean
+make distclean
+make maintainer-clean
+
+Making a Source Distribution
+============================
+This generates a rtems-<version>.tar.gz in the toplevel directory.
+
+Making a Preformatted Distribution
+==================================
+Install and tar it up. :)
+
+Common Problems
+===============
+
+TeX pool_size too small.
diff --git a/doc/TODO b/doc/TODO
new file mode 100644
index 0000000000..e1249d768e
--- /dev/null
+++ b/doc/TODO
@@ -0,0 +1,95 @@
+#
+# $Id$
+#
+
+This is a collection of things which need to be done to the various
+manuals.
+
+General Issues
+==============
+May need a Documentation Roadmap - for now, the "Where to
+go from here" chapter in Getting Started is it.
+
+Need a description of hello world and writing an application.
+
+More automatic handling of version, date, revision, release, etc.
+
+Eliminate use of gifs. [NOTE: ps, pdf, and dvi.gif are from
+http://www.cit.gu.edu.au/images and the various arrow and
+bookshelf icons came with texi2www.]
+
+Redraw pictures as appropriate in open source tools.
+
+
+Getting Started (C and Ada versions)
+====================================
+Switch back to using @url{} when pdf generation error is fixed.
+
+Classic Users Guide
+===================
+May need to enhance descriptions in Primitive Data Types Chapter
+
+POSIX User Notes
+================
+
+Add pages for network services.
+
+Add timer() services if we have any.
+
+
+Development Environment Guide
+=============================
+Either rename to "A Tour of the RTEMS Source Tree" or include
+more information on the GNU tools.
+
+The "C Suites" section is oddly named and the directory
+tree included is wrong in that make is no longer under
+the c directory. I think the build-tools make have
+moved as well.
+
+All the paths should be provided as relative paths
+from the top of the RTEMS source tree. It wastes
+valuable screen space to do otherwise.
+
+The last paragraph of "C Suites" is vague and could
+be written better. It should include the subdirectory
+names as part of the textual description.
+
+Should this documentation even use the phrase "C Implementation"
+any longer?
+
+Directory names should be in @code -- not "quoted".
+
+In "Support Library Source Directory", look for "which installed"
+
+In the latter part of the "libbsp" paragraph in "Support
+Library Source Directory", there is reference to the
+stubdr directory which is no longer there.
+
+Update this section to include discussion of the shared
+subdirectory and its relationship to the BSPs. Write this
+in such a way that it can be passed on to Geoffroy Montel.
+
+In the section, "Test Suite Source Directory", there is a
+numeric count of the number of tests in each suite. This
+should be eliminated for maintenance purposes.
+
+The psxtest directory is not mentioned. Check that no others
+have been forgotten.
+
+There should probably be no reference to the Ada sample
+applications. This document used to cover both implementations.
+This now seems inappropriate.
+
+The hello world sample test discussion mentions that it provides
+a rudiementary test of the BSP startup code and the "RTEMS
+C Library". This should be rewritten to tell mroe about what
+this test shows (actually a lot). It should mention that this
+test tries to avoid using interrupts.
+
+The ticker test should mention that in contrast to hello, it
+does use interrupts. :) It can be used to tune the clock
+tick.
+
+The ticker test documentation says it calls "tm_get" -- jeez
+how old is this manual.
diff --git a/doc/acinclude.m4 b/doc/acinclude.m4
new file mode 100644
index 0000000000..219d8042ab
--- /dev/null
+++ b/doc/acinclude.m4
@@ -0,0 +1,18 @@
+## _RTEMS_UPDATE_CONDITIONAL(FINAL,TMP)
+AC_DEFUN([_RTEMS_UPDATE_CONDITIONAL],[
+ AS_IF([test -f $1],[
+ AS_IF([cmp -s $1 $2 2>/dev/null],
+ [
+ AC_MSG_NOTICE([$1 is unchanged])
+ rm -f $$2
+ ],[
+ AC_MSG_NOTICE([creating $1])
+ rm -f $1
+ mv $2 $1
+ ])
+ ],[
+ AC_MSG_NOTICE([creating $1])
+ rm -f $1
+ mv $2 $1
+ ])
+])
diff --git a/doc/ada_user/.cvsignore b/doc/ada_user/.cvsignore
new file mode 100644
index 0000000000..850320249b
--- /dev/null
+++ b/doc/ada_user/.cvsignore
@@ -0,0 +1,28 @@
+ada_user
+ada_user-?
+ada_user-??
+ada_user.aux
+ada_user.cp
+ada_user.cps
+ada_user.dvi
+ada_user.fn
+ada_user.fns
+ada_user*.html
+ada_user.ky
+ada_user.log
+ada_user.pdf
+ada_user.pg
+ada_user.ps
+ada_user.toc
+ada_user.tp
+ada_user.vr
+index.html
+Makefile
+Makefile.in
+mdate-sh
+rtems_footer.html
+rtems_header.html
+rtemspie.pdf
+stamp-vti
+states.pdf
+version.texi
diff --git a/doc/ada_user/Makefile.am b/doc/ada_user/Makefile.am
new file mode 100644
index 0000000000..df6cc42744
--- /dev/null
+++ b/doc/ada_user/Makefile.am
@@ -0,0 +1,55 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = ada_user
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/main.am
+
+COMMON_FILES += $(top_builddir)/user/bsp.texi \
+ $(top_builddir)/user/clock.texi $(top_builddir)/user/concepts.texi \
+ $(top_builddir)/user/datatypes.texi $(top_builddir)/user/conf.texi \
+ $(top_builddir)/user/dirstat.texi $(top_builddir)/user/dpmem.texi \
+ $(top_builddir)/user/event.texi $(top_builddir)/user/fatal.texi \
+ $(top_builddir)/user/glossary.texi $(top_builddir)/user/init.texi \
+ $(top_builddir)/user/intr.texi $(top_builddir)/user/io.texi \
+ $(top_builddir)/user/mp.texi $(top_builddir)/user/msg.texi \
+ $(top_builddir)/user/overview.texi $(top_builddir)/user/part.texi \
+ $(top_builddir)/user/preface.texi $(top_builddir)/user/region.texi \
+ $(top_builddir)/user/rtmon.texi $(top_builddir)/user/schedule.texi \
+ $(top_builddir)/user/sem.texi $(top_builddir)/user/signal.texi \
+ $(top_builddir)/user/task.texi $(top_builddir)/user/timer.texi \
+ $(top_builddir)/user/userext.texi $(top_srcdir)/common/cpright.texi
+
+FILES = example.texi
+
+rtemspie.eps: $(top_srcdir)/user/rtemspie.eps
+ $(LN_S) $<
+states.eps: $(top_srcdir)/user/states.eps
+ $(LN_S) $<
+CLEANFILES += rtemspie.eps states.eps rtemsarc.png rtemspie.png states.png
+
+rtemsarc.png: $(top_srcdir)/user/rtemsarc.png
+ $(LN_S) $<
+rtemspie.png: $(top_srcdir)/user/rtemspie.png
+ $(LN_S) $<
+states.png: $(top_srcdir)/user/states.png
+ $(LN_S) $<
+
+info_TEXINFOS = ada_user.texi
+ada_user_TEXINFOS = $(FILES) $(COMMON_FILES)
+
+if USE_HTML
+html_project_DATA += rtemsarc.png rtemspie.png states.png
+endif
+
+$(PROJECT).dvi: rtemspie.eps states.eps
+PDF_IMAGES = rtemspie.pdf states.pdf
+
+CLEANFILES += ada_user.info ada_user.info-? ada_user.info-??
diff --git a/doc/ada_user/ada_user.texi b/doc/ada_user/ada_user.texi
new file mode 100644
index 0000000000..6e72c57e7a
--- /dev/null
+++ b/doc/ada_user/ada_user.texi
@@ -0,0 +1,166 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename ada_user.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the Ada User's Guide
+@c
+
+@c Joel's Questions
+@c
+@c 1. Why does paragraphindent only impact makeinfo?
+@c 2. Why does paragraphindent show up in HTML?
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS On-Line Manual
+@direntry
+* RTEMS Ada User: (ada_user). The Ada User's Guide
+@end direntry
+@end ifset
+
+
+@c variable substitution info:
+@c
+@clear is-C
+@set is-Ada
+@set LANGUAGE Ada
+@set STRUCTURE record
+@set ROUTINE subprogram
+@set OR or
+@set RPREFIX RTEMS.
+@set DIRPREFIX rtems.
+@c the language is @value{LANGUAGE}
+@c NOTE: don't use underscore in the name
+@c
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage RTEMS Applications Ada User's Guide
+
+@setchapternewpage odd
+@settitle RTEMS Ada User's Guide
+@titlepage
+@finalout
+
+@title RTEMS Applications Ada User's Guide
+@subtitle Edition @value{EDITION}, for RTEMS @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include user/preface.texi
+@include user/overview.texi
+@include user/concepts.texi
+@include user/datatypes.texi
+@include user/init.texi
+@include user/task.texi
+@include user/intr.texi
+@include user/clock.texi
+@include user/timer.texi
+@include user/sem.texi
+@include user/msg.texi
+@include user/event.texi
+@include user/signal.texi
+@include user/part.texi
+@include user/region.texi
+@include user/dpmem.texi
+@include user/io.texi
+@include user/fatal.texi
+@include user/schedule.texi
+@include user/rtmon.texi
+@include user/bsp.texi
+@include user/userext.texi
+@include user/conf.texi
+@include user/mp.texi
+@include user/dirstat.texi
+@include example.texi
+@include user/glossary.texi
+@ifinfo
+@node Top, Preface, (dir), (dir)
+@top ada_user
+
+This is the online version of the RTEMS Ada User's Guide.
+
+@menu
+* Preface::
+* Overview::
+* Key Concepts::
+* RTEMS Data Types::
+* Initialization Manager::
+* Task Manager::
+* Interrupt Manager::
+* Clock Manager::
+* Timer Manager::
+* Semaphore Manager::
+* Message Manager::
+* Event Manager::
+* Signal Manager::
+* Partition Manager::
+* Region Manager::
+* Dual-Ported Memory Manager::
+* I/O Manager::
+* Fatal Error Manager::
+* Scheduling Concepts::
+* Rate Monotonic Manager::
+* Board Support Packages::
+* User Extensions Manager::
+* Configuring a System::
+* Multiprocessing Manager::
+* Directive Status Codes::
+* Example Application::
+* Glossary::
+* Command and Variable Index::
+* Concept Index::
+@end menu
+
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@node Command and Variable Index, Concept Index, Glossary, Top
+@unnumbered Command and Variable Index
+
+@c There are currently no Command and Variable Index entries.
+
+@printindex fn
+
+@node Concept Index, , Command and Variable Index, Top
+@unnumbered Concept Index
+
+@c There are currently no Concept Index entries.
+@printindex cp
+
+@contents
+@bye
+
diff --git a/doc/ada_user/example.texi b/doc/ada_user/example.texi
new file mode 100644
index 0000000000..39f807f238
--- /dev/null
+++ b/doc/ada_user/example.texi
@@ -0,0 +1,21 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Example Application, Glossary, Directive Status Codes, Top
+@end ifinfo
+@chapter Example Application
+
+@example
+
+Currently there is no example Ada application provided.
+
+@end example
+
+
+
diff --git a/doc/bsp_howto/.cvsignore b/doc/bsp_howto/.cvsignore
new file mode 100644
index 0000000000..175a69b6e2
--- /dev/null
+++ b/doc/bsp_howto/.cvsignore
@@ -0,0 +1,43 @@
+adaintr.texi
+analog.texi
+ata.texi
+bsp_howto
+bsp_howto-?
+bsp_howto-??
+bsp_howto.aux
+bsp_howto.cp
+bsp_howto.dvi
+bsp_howto.fn
+bsp_howto*.html
+bsp_howto.ky
+bsp_howto.log
+bsp_howto.pdf
+bsp_howto.pg
+bsp_howto.ps
+bsp_howto.toc
+bsp_howto.tp
+bsp_howto.vr
+clock.texi
+console.texi
+discrete.texi
+ide-ctrl.texi
+index.html
+init.texi
+intro.texi
+linkcmds.texi
+Makefile
+Makefile.in
+makefiles.texi
+mdate-sh
+network.t
+network.texi
+nvmem.texi
+rtc.texi
+rtems_footer.html
+rtems_header.html
+shmsupp.texi
+stamp-vti
+support.texi
+target.texi
+timer.texi
+version.texi
diff --git a/doc/bsp_howto/Makefile.am b/doc/bsp_howto/Makefile.am
new file mode 100644
index 0000000000..6126214326
--- /dev/null
+++ b/doc/bsp_howto/Makefile.am
@@ -0,0 +1,127 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = bsp_howto
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/main.am
+
+GENERATED_FILES = intro.texi target.texi makefiles.texi linkcmds.texi \
+ support.texi adaintr.texi init.texi console.texi clock.texi timer.texi \
+ rtc.texi ata.texi ide-ctrl.texi nvmem.texi network.texi shmsupp.texi \
+ analog.texi discrete.texi
+
+COMMON_FILES += $(top_srcdir)/common/cpright.texi
+
+FILES =
+
+info_TEXINFOS = bsp_howto.texi
+bsp_howto_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+#
+# Process Automatically Generated Files
+#
+
+intro.texi: intro.t
+ $(BMENU2) -p "Top" \
+ -u "Top" \
+ -n "Target Dependent Files" < $< > $@
+
+target.texi: target.t
+ $(BMENU2) -p "Introduction" \
+ -u "Top" \
+ -n "Makefiles" < $< > $@
+
+makefiles.texi: makefiles.t
+ $(BMENU2) -p "Target Dependent Files Board Support Package Structure" \
+ -u "Top" \
+ -n "Linker Script" < $< > $@
+
+linkcmds.texi: linkcmds.t
+ $(BMENU2) -p "Makefiles Creating a New BSP Make Customization File" \
+ -u "Top" \
+ -n "Ada95 Interrupt Support" < $< > $@
+
+adaintr.texi: adaintr.t
+ $(BMENU2) -p "Linker Script Initialized Data" \
+ -u "Top" \
+ -n "Miscellaneous Support Files" < $< > $@
+
+support.texi: support.t
+ $(BMENU2) -p "Ada95 Interrupt Support Version Requirements" \
+ -u "Top" \
+ -n "" < $< > $@
+
+init.texi: init.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+console.texi: console.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+clock.texi: clock.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+timer.texi: timer.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+rtc.texi: rtc.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+ata.texi: ata.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+ide-ctrl.texi: ide-ctrl.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+nvmem.texi: nvmem.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+#
+# Grab the chapter on writing a network device driver.
+#
+network.texi: ../networking/driver.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+shmsupp.texi: shmsupp.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+analog.texi: analog.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+discrete.texi: discrete.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+CLEANFILES += bsp_howto.info bsp_howto.info-?
+
+EXTRA_DIST = adaintr.t analog.t ata.t clock.t console.t discrete.t \
+ ide-ctrl.t init.t intro.t linkcmds.t makefiles.t nvmem.t rtc.t shmsupp.t \
+ support.t target.t timer.t
diff --git a/doc/bsp_howto/adaintr.t b/doc/bsp_howto/adaintr.t
new file mode 100644
index 0000000000..e3980b2fef
--- /dev/null
+++ b/doc/bsp_howto/adaintr.t
@@ -0,0 +1,81 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Ada95 Interrupt Support
+
+@section Introduction
+
+This chapter describes what is required to enable Ada interrupt
+and error exception handling when using GNAT over RTEMS.
+
+The GNAT Ada95 interrupt support RTEMS was developed by
+Jiri Gaisler <jgais@@ws.estec.esa.nl> who also wrote this
+chapter.
+
+@section Mapping Interrupts to POSIX Signals
+
+In Ada95, interrupts can be attached with the interrupt_attach pragma.
+For most systems, the gnat run-time will use POSIX signal to implement
+the interrupt handling, mapping one signal per interrupt. For interrupts
+to be propagated to the attached Ada handler, the corresponding signal
+must be raised when the interrupt occurs.
+
+The same mechanism is used to generate Ada error exceptions.
+Three error exceptions are defined: program, constraint and storage
+error. These are generated by raising the predefined signals: SIGILL,
+SIGFPE and SIGSEGV. These signals should be raised when a spurious
+or erroneous trap occurs.
+
+To enable gnat interrupt and error exception support for a particular
+BSP, the following has to be done:
+
+@enumerate
+
+@item Write an interrupt/trap handler that will raise the corresponding
+signal depending on the interrupt/trap number.
+
+@item Install the interrupt handler for all interrupts/traps that will be
+handled by gnat (including spurious).
+
+@item At startup, gnat calls @code{__gnat_install_handler()}. The BSP
+must provide this function which installs the interrupt/trap handlers.
+
+@end enumerate
+
+Which CPU-interrupt will generate which signal is implementation
+defined. There are 32 POSIX signals (1 - 32), and all except the
+three error signals (SIGILL, SIGFPE and SIGSEGV) can be used. I
+would suggest to use the upper 16 (17 - 32) which do not
+have an assigned POSIX name.
+
+Note that the pragma interrupt_attach will only bind a signal
+to a particular Ada handler - it will not unmask the
+interrupt or do any other things to enable it. This have to be
+done separately, typically by writing various device register.
+
+@section Example Ada95 Interrupt Program
+
+An example program (@code{irq_test}) is included in the
+Ada examples package to show how interrupts can be handled
+in Ada95. Note that generation of the test interrupt
+(@code{irqforce.c}) is BSP specific and must be edited.
+
+NOTE: The @code{irq_test} example was written for the SPARC/ERC32
+BSP.
+
+@section Version Requirements
+
+With RTEMS 4.0, a patch was required to psignal.c in RTEMS
+sources (to correct a bug associated to the default action of
+signals 15-32). The SPARC/ERC32 RTEMS BSP includes the
+@code{gnatsupp} subdirectory that can be used as an example
+for other BSPs.
+
+With GNAT 3.11p, a patch is required for @code{a-init.c} to invoke
+the BSP specific routine that installs the exception handlers.
+
diff --git a/doc/bsp_howto/analog.t b/doc/bsp_howto/analog.t
new file mode 100644
index 0000000000..21ed892265
--- /dev/null
+++ b/doc/bsp_howto/analog.t
@@ -0,0 +1,166 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Analog Driver
+
+The Analog driver is responsible for providing an
+interface to Digital to Analog Converters (DACs) and
+Analog to Digital Converters (ADCs). The capabilities provided
+by this class of device driver are:
+
+@itemize @bullet
+@item Initialize an Analog Board
+@item Open a Particular Analog
+@item Close a Particular Analog
+@item Read from a Particular Analog
+@item Write to a Particular Analog
+@item Reset DACs
+@item Reinitialize DACS
+@end itemize
+
+Most analog devices are found on I/O cards that support multiple
+DACs or ADCs on a single card.
+
+There are currently no analog device drivers included in the
+RTEMS source tree. The information provided in this chapter
+is based on drivers developed for applications using RTEMS.
+It is hoped that this driver model information can form the
+basis for a standard analog driver model that can be supported
+in future RTEMS distribution.
+
+@section Major and Minor Numbers
+
+The @b{major} number of a device driver is its index in the
+RTEMS Device Address Table.
+
+A @b{minor} number is associated with each device instance
+managed by a particular device driver. An RTEMS minor number
+is an @code{unsigned32} entity. Convention calls
+dividing the bits in the minor number down into categories
+like the following:
+
+@itemize @bullet
+
+@item @b{board} - indicates the board a particular device is located on
+@item @b{port} - indicates the particular device on a board.
+
+@end itemize
+
+From the above, it should be clear that a single device driver
+can support multiple copies of the same board in a single system.
+The minor number is used to distinguish the devices.
+
+@section Analog Driver Configuration
+
+There is not a standard analog driver configuration table but some
+fields are common across different drivers. The analog driver
+configuration table is typically an array of structures with each
+structure containing the information for a particular board.
+The following is a list of the type of information normally required
+to configure an analog board:
+
+@table @b
+@item board_offset
+is the base address of a board.
+
+@item DAC_initial_values
+is an array of the voltages that should be written to each DAC
+during initialization. This allows the driver to start the board
+in a known state.
+
+@end table
+
+@section Initialize an Analog Board
+
+At system initialization, the analog driver's initialization entry point
+will be invoked. As part of initialization, the driver will perform
+whatever board initialization is required and then set all
+outputs to their configured initial state.
+
+The analog driver may register a device name for each DAC and ADC in
+the system.
+
+@section Open a Particular Analog
+
+This is the driver open call. Usually this call does nothing other than
+validate the minor number.
+
+With some drivers, it may be necessary to allocate memory when a particular
+device is opened. If that is the case, then this is often the place
+to do this operation.
+
+@section Close a Particular Analog
+
+This is the driver close call. Usually this call does nothing.
+
+With some drivers, it may be necessary to allocate memory when a particular
+device is opened. If that is the case, then this is the place
+where that memory should be deallocated.
+
+@section Read from a Particular Analog
+
+This corresponds to the driver read call. After validating the minor
+number and arguments, this call reads the indicated device. Most analog
+devices store the last value written to a DAC. Since DACs are output
+only devices, saving the last written value gives the appearance that
+DACs can be read from also. If the device is an ADC, then it is sampled.
+
+@b{NOTE:} Many boards have multiple analog inputs but only one ADC. On
+these boards, it will be necessary to provide some type of mutual exclusion
+during reads. On these boards, there is a MUX which must be switched
+before sampling the ADC. After the MUX is switched, the driver must
+delay some short period of time (usually microseconds) before the
+signal is stable and can be sampled. To make matters worse, some ADCs
+cannot respond to wide voltage swings in a single sample. On these
+ADCs, one must do two samples when the voltage swing is too large.
+On a practical basis, this means that the driver usually ends up
+double sampling the ADC on these systems.
+
+The value returned is a single precision floating point number
+representing the voltage read. This value is stored in the
+@code{argument_block} passed in to the call. By returning the
+voltage, the caller is freed from having to know the number of
+bits in the analog and board dependent conversion algorithm.
+
+@section Write to a Particular Analog
+
+This corresponds to the driver write call. After validating the minor
+number and arguments, this call writes the indicated device. If the
+specified device is an ADC, then an error is usually returned.
+
+The value written is a single precision floating point number
+representing the voltage to be written to the specified DAC.
+This value is stored in the @code{argument_block} passed in to the
+call. By passing the voltage to the device driver, the caller is
+freed from having to know the number of bits in the analog
+and board dependent conversion algorithm.
+
+@section Reset DACs
+
+This is one of the IOCTL functions supported by the I/O control
+device driver entry point. When this IOCTL function is invoked,
+all of the DACs are written to 0.0 volts.
+
+@section Reinitialize DACS
+
+This is one of the IOCTL functions supported by the I/O control
+device driver entry point. When this IOCTL function is invoked,
+all of the DACs are written with the initial value configured
+for this device.
+
+@section Get Last Written Values
+
+This is one of the IOCTL functions supported by the I/O control
+device driver entry point. When this IOCTL function is invoked,
+the following information is returned to the caller:
+
+@itemize @bullet
+@item last value written to the specified DAC
+@item timestamp of when the last write was performed
+@end itemize
+
diff --git a/doc/bsp_howto/ata.t b/doc/bsp_howto/ata.t
new file mode 100644
index 0000000000..851a41ee3b
--- /dev/null
+++ b/doc/bsp_howto/ata.t
@@ -0,0 +1,199 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter ATA Driver
+
+@section Terms
+
+ATA device - physical device attached to an IDE controller
+
+@section Introduction
+
+ATA driver provides generic interface to an ATA device. ATA driver is
+hardware independent implementation of ATA standard defined in working draft
+"AT Attachment Interface with Extensions (ATA-2)" X3T10/0948D revision 4c,
+March 18, 1996. ATA Driver based on IDE Controller Driver and may be used for
+computer systems with single IDE controller and with multiple as well. Although
+current implementation has several restrictions detailed below ATA driver
+architecture allows easily extend the driver. Current restrictions are:
+
+@itemize @bullet
+@item Only mandatory (see draft p.29) and two optional (READ/WRITE MULTIPLE)
+commands are implemented
+@item Only PIO mode is supported but both poll and interrupt driven
+@end itemize
+
+The reference implementation for ATA driver can be found in
+@code{cpukit/libblock/src/ata.c}.
+
+@section Initialization
+
+The @code{ata_initialize} routine is responsible for ATA driver
+initialization. The main goal of the initialization is to detect and
+register in the system all ATA devices attached to IDE controllers
+successfully initialized by the IDE Controller driver.
+
+In the implementation of the driver, the following actions are performed:
+
+@example
+@group
+rtems_device_driver ata_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
+)
+@{
+ initialize internal ATA driver data structure
+
+ for each IDE controller successfully initialized by the IDE Controller
+ driver
+ if the controller is interrupt driven
+ set up interrupt handler
+
+ obtain information about ATA devices attached to the controller
+ with help of EXECUTE DEVICE DIAGNOSTIC command
+
+ for each ATA device detected on the controller
+ obtain device parameters with help of DEVICE IDENTIFY command
+
+ register new ATA device as new block device in the system
+@}
+@end group
+@end example
+
+Special processing of ATA commands is required because of absence of
+multitasking environment during the driver initialization.
+
+Detected ATA devices are registered in the system as physical block devices
+(see libblock library description). Device names are formed based on IDE
+controller minor number device is attached to and device number on the
+controller (0 - Master, 1 - Slave). In current implementation 64 minor
+numbers are reserved for each ATA device which allows to support up to 63
+logical partitions per device.
+
+@example
+@group
+controller minor device number device name ata device minor
+ 0 0 hda 0
+ 0 1 hdb 64
+ 1 0 hdc 128
+ 1 1 hdd 172
+ ... ... ...
+@end group
+@end example
+
+@section ATA Driver Architecture
+
+@subsection ATA Driver Main Internal Data Structures
+
+ATA driver works with ATA requests. ATA request is described by the
+following structure:
+
+@example
+@group
+/* ATA request */
+typedef struct ata_req_s @{
+ Chain_Node link; /* link in requests chain */
+ char type; /* request type */
+ ata_registers_t regs; /* ATA command */
+ rtems_unsigned32 cnt; /* Number of sectors to be exchanged */
+ rtems_unsigned32 cbuf; /* number of current buffer from breq in use */
+ rtems_unsigned32 pos; /* current position in 'cbuf' */
+ blkdev_request *breq; /* blkdev_request which corresponds to the
+ * ata request
+ */
+ rtems_id sema; /* semaphore which is used if synchronous
+ * processing of the ata request is required
+ */
+ rtems_status_code status; /* status of ata request processing */
+ int error; /* error code */
+@} ata_req_t;
+@end group
+@end example
+
+ATA driver supports separate ATA requests queues for each IDE
+controller (one queue per controller). The following structure contains
+information about controller's queue and devices attached to the controller:
+
+@example
+@group
+/*
+ * This structure describes controller state, devices configuration on the
+ * controller and chain of ATA requests to the controller.
+ */
+typedef struct ata_ide_ctrl_s @{
+ rtems_boolean present; /* controller state */
+ ata_dev_t device[2]; /* ata devices description */
+ Chain_Control reqs; /* requests chain */
+@} ata_ide_ctrl_t;
+@end group
+@end example
+
+Driver uses array of the structures indexed by the controllers minor
+number.
+
+The following structure allows to map an ATA device to the pair (IDE
+controller minor number device is attached to, device number
+on the controller):
+
+@example
+@group
+/*
+ * Mapping of rtems ATA devices to the following pairs:
+ * (IDE controller number served the device, device number on the controller)
+ */
+typedef struct ata_ide_dev_s @{
+ int ctrl_minor;/* minor number of IDE controller serves rtems ATA device */
+ int device; /* device number on IDE controller (0 or 1) */
+@} ata_ide_dev_t;
+@end group
+@end example
+
+Driver uses array of the structures indexed by the ATA devices minor
+number.
+
+ATA driver defines the following internal events:
+
+@example
+@group
+/* ATA driver events */
+typedef enum ata_msg_type_s @{
+ ATA_MSG_GEN_EVT = 1, /* general event */
+ ATA_MSG_SUCCESS_EVT, /* success event */
+ ATA_MSG_ERROR_EVT, /* error event */
+ ATA_MSG_PROCESS_NEXT_EVT /* process next ata request event */
+@} ata_msg_type_t;
+@end group
+@end example
+
+@subsection Brief ATA Driver Core Overview
+
+All ATA driver functionality is available via ATA driver ioctl. Current
+implementation supports only two ioctls: BLKIO_REQUEST and
+ATAIO_SET_MULTIPLE_MODE. Each ATA driver ioctl() call generates an
+ATA request which is appended to the appropriate controller queue depending
+on ATA device the request belongs to. If appended request is single request in
+the controller's queue then ATA driver event is generated.
+
+ATA driver task which manages queue of ATA driver events is core of ATA
+driver. In current driver version queue of ATA driver events implemented
+as RTEMS message queue. Each message contains event type, IDE controller
+minor number on which event happened and error if an error occurred. Events
+may be generated either by ATA driver ioctl call or by ATA driver task itself.
+Each time ATA driver task receives an event it gets controller minor number
+from event, takes first ATA request from controller queue and processes it
+depending on request and event types. An ATA request processing may also
+includes sending of several events. If ATA request processing is finished
+the ATA request is removed from the controller queue. Note, that in current
+implementation maximum one event per controller may be queued at any moment
+of the time.
+
+(This part seems not very clear, hope I rewrite it soon)
+
+
+
diff --git a/doc/bsp_howto/bsp_howto.texi b/doc/bsp_howto/bsp_howto.texi
new file mode 100644
index 0000000000..6ca1110193
--- /dev/null
+++ b/doc/bsp_howto/bsp_howto.texi
@@ -0,0 +1,128 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename bsp_howto.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the Getting Started (C) Guide
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS On-Line Manual
+@direntry
+* RTEMS BSP-Howto: (bsp_howto). BSP and Device Driver Development Guide.
+@end direntry
+@end ifset
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage BSP and Device Driver Development Guide
+
+@setchapternewpage odd
+@settitle BSP and Device Driver Development Guide
+@titlepage
+@finalout
+
+@title BSP and Device Driver Development Guide
+@subtitle Edition @value{EDITION}, for @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include intro.texi
+@include target.texi
+@include makefiles.texi
+@include linkcmds.texi
+@include support.texi
+@include adaintr.texi
+@include init.texi
+@include console.texi
+@include clock.texi
+@include timer.texi
+@include rtc.texi
+@include ata.texi
+@include ide-ctrl.texi
+@include nvmem.texi
+@include network.texi
+@include shmsupp.texi
+@include analog.texi
+@include discrete.texi
+
+@ifinfo
+@node Top, Introduction, (dir), (dir)
+@top bsp_howto
+
+This is the online version of the RTEMS BSP and Device Driver Development Guide.
+
+@menu
+* Introduction::
+* Target Dependent Files::
+* Makefiles::
+* Linker Script::
+* Miscellaneous Support Files::
+* Ada95 Interrupt Support::
+* Initialization Code::
+* Console Driver::
+* Clock Driver::
+* Timer Driver::
+* Real-Time Clock Driver::
+* ATA Driver::
+* IDE Controller Driver::
+* Networking Driver::
+* Non-Volatile Memory Driver::
+* Shared Memory Support Driver::
+* Analog Driver::
+* Discrete Driver::
+* Command and Variable Index::
+* Concept Index::
+@end menu
+
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@node Command and Variable Index, Concept Index, , Top
+@unnumbered Command and Variable Index
+
+There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@node Concept Index, , Command and Variable Index, Top
+@unnumbered Concept Index
+
+There are currently no Concept Index entries.
+@c @printindex cp
+
+@contents
+@bye
+
diff --git a/doc/bsp_howto/clock.t b/doc/bsp_howto/clock.t
new file mode 100644
index 0000000000..ee80ed228b
--- /dev/null
+++ b/doc/bsp_howto/clock.t
@@ -0,0 +1,132 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Clock Driver
+
+@section Introduction
+
+The purpose of the clock driver is to provide a steady time
+basis to the kernel, so that the RTEMS primitives that need
+a clock tick work properly. See the @code{Clock Manager} chapter
+of the @b{RTEMS Application C User's Guide} for more details.
+
+The clock driver is located in the @code{clock} directory of the BSP.
+
+@section Clock Driver Global Variables
+
+This section describes the global variables expected to be provided by
+this driver.
+
+@subsection Major and Minor Number
+
+The major and minor numbers of the clock driver are made available via
+the following variables.
+
+@itemize @bullet
+@item rtems_device_major_number rtems_clock_major;
+@item rtems_device_minor_number rtems_clock_minor;
+@end itemize
+
+The clock device driver is responsible for declaring and
+initializing these variables. These variables are used
+by other RTEMS components -- notably the Shared Memory Driver.
+
+@b{NOTE:} In a future RTEMS version, these variables may be replaced
+with the clock device driver registering @b{/dev/clock}.
+
+@subsection Ticks Counter
+
+Most of the clock device drivers provide a global variable
+that is simply a count of the number of clock driver interrupt service
+routines that have occured. This information is valuable when debugging
+a system. This variable is declared as follows:
+
+@example
+volatile rtems_unsigned32 Clock_driver_ticks;
+@end example
+
+@section Initialization
+
+The initialization routine is responsible for
+programming the hardware that will periodically
+generate an interrupt. A programmable interval timer is commonly
+used as the source of the clock tick.
+
+The device should be programmed such that an interrupt is generated
+every @i{m} microseconds, where @i{m} is equal to
+@code{BSP_Configuration.microseconds_per_tick}. Sometimes the periodic interval
+timer can use a prescaler so you have to look carefully at your user's
+manual to determine the correct value.
+
+You must use the RTEMS primitive @code{rtems_interrupt_catch} to install
+your clock interrupt service routine:
+
+@example
+rtems_interrupt_catch (Clock_ISR, CLOCK_VECTOR, &old_handler);
+@end example
+
+Since there is currently not a driver entry point invoked at system
+shutdown, many clock device drivers use the @code{atexit} routine
+to schedule their @code{Clock_exit} routine to execute when the
+system is shutdown.
+
+By convention, many of the clock drivers do not install the clock
+tick if the @code{ticks_per_timeslice} field of the Configuration
+Table is 0.
+
+@section System shutdown
+
+Many drivers provide the routine @code{Clock_exit} that is scheduled
+to be run during system shutdown via the @code{atexit} routine.
+The @code{Clock_exit} routine will disable the clock tick source
+if it was enabled. This can be used to prevent clock ticks after the
+system is shutdown.
+
+@section Clock Interrupt Subroutine
+
+It only has to inform the kernel that a ticker has elapsed, so call :
+
+@example
+@group
+rtems_isr Clock_isr( rtems_vector_number vector )
+@{
+ invoke the rtems_clock_tick() directive to announce the tick
+ if necessary for this hardware
+ reload the programmable timer
+@}
+@end group
+@end example
+
+@section IO Control
+
+The clock driver must supply a handler for the IO control device driver
+entry point. This functionality is used by other components -- notably
+the Shared Memory Driver to install a wrapper for the clock interrupt
+service routine. The following shows the functionality required:
+
+@example
+@group
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+@{
+ error check the argument pointer parameter
+
+ if the command is "ISR"
+ invoke the clock interrupt service routine
+ else if the command is "NEW"
+ install the requested handler
+@}
+@end group
+@end example
+
+
+
+
diff --git a/doc/bsp_howto/console.t b/doc/bsp_howto/console.t
new file mode 100644
index 0000000000..95a0916ec1
--- /dev/null
+++ b/doc/bsp_howto/console.t
@@ -0,0 +1,377 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Console Driver
+
+@section Introduction
+
+This chapter describes the operation of a console driver using
+the RTEMS POSIX Termios support. Traditionally RTEMS has referred
+to all serial device drivers as console device drivers. A
+console driver can be used to do raw data processing in addition
+to the "normal" standard input and output device functions required
+of a console.
+
+The serial driver may be called as the consequence of a C Library
+call such as @code{printf} or @code{scanf} or directly via the
+@code{read} or @code{write} system calls.
+There are two main functioning modes:
+
+@itemize @bullet
+
+@item console: formatted input/output, with special characters (end of
+line, tabulations, etc.) recognition and processing,
+
+@item raw: permits raw data processing.
+
+@end itemize
+
+One may think that two serial drivers are needed to handle these two types
+of data, but Termios permits having only one driver.
+
+@section Termios
+
+Termios is a standard for terminal management, included in the POSIX 1003.1b
+standard. It is commonly provided on UNIX implementations.
+Having RTEMS support for Termios is beneficial:
+
+@itemize @bullet
+
+@item from the user's side because it provides standard primitive operations
+to access the terminal and change configuration settings. These operations
+are the same under Unix and Rtems.
+
+@item from the BSP developer's side because it frees the
+developer from dealing with buffer states and mutual exclusions on them.
+Early RTEMS console device drivers also did their own special
+character processing.
+
+@end itemize
+
+Termios support includes:
+
+@itemize @bullet
+
+@item raw and console handling,
+
+@item blocking or non-blocking characters receive, with or without
+Timeout.
+
+@end itemize
+
+At this time, RTEMS documentation does not include a thorough discussion
+of the Termios functionality. For more information on Termios,
+type @code{man termios} on a Unix box or point a web browser
+at
+@uref{http://www.freebsd.org/cgi/man.cgi}.
+
+@section Driver Functioning Modes
+
+There are generally two main functioning modes for an UART (Universal
+Asynchronous Receiver-Transmitter, i.e. the serial chip):
+
+@itemize @bullet
+
+@item polled mode
+@item interrupt driven mode
+
+@end itemize
+
+In polled mode, the processor blocks on sending/receiving characters.
+This mode is not the most efficient way to utilize the UART. But
+polled mode is usually necessary when one wants to print an
+error message in the event of a fatal error such as a fatal error
+in the BSP. This is also the simplest mode to
+program. Polled mode is generally preferred if the serial port is
+to be used primarily as a debug console. In a simple polled driver,
+the software will continuously check the status of the UART when
+it is reading or writing to the UART. Termios improves on this
+by delaying the caller for 1 clock tick between successive checks
+of the UART on a read operation.
+
+In interrupt driven mode, the processor does not block on sending/receiving
+characters. Data is buffered between the interrupt service routine
+and application code. Two buffers are used to insulate the application
+from the relative slowness of the serial device. One of the buffers is
+used for incoming characters, while the other is used for outgoing characters.
+
+An interrupt is raised when a character is received by the UART.
+The interrupt subroutine places the incoming character at the end
+of the input buffer. When an application asks for input,
+the characters at the front of the buffer are returned.
+
+When the application prints to the serial device, the outgoing characters
+are placed at the end of the output buffer. The driver will place
+one or more characters in the UART (the exact number depends on the UART)
+An interrupt will be raised when all the characters have been transmitted.
+The interrupt service routine has to send the characters
+remaining in the output buffer the same way. When the transmitting side
+of the UART is idle, it is typically necessary to prime the transmitter
+before the first interrupt will occur.
+
+@section Serial Driver Functioning Overview
+
+The following Figure shows how a Termios driven serial driver works:
+
+@example
+Figure not included in this draft
+@end example
+
+The following list describes the basic flow.
+
+@itemize @bullet
+
+@item the application programmer uses standard C library call (printf,
+scanf, read, write, etc.),
+
+@item C library (in fact that's Cygnus Newlib) calls RTEMS
+system call interface. This code can be found in the
+@code{c/src/lib/libc} directory.
+
+@item Glue code calls the serial driver entry routines.
+
+@end itemize
+
+@subsection Termios and Polled I/O
+
+The following functions are provided by the driver and invoked by
+Termios for simple character input/output. The specific names of
+these routines are not important as Termios invokes them indirectly
+via function pointers.
+
+@subsubsection pollWrite
+
+The @code{pollWrite} routine is responsible for writing @code{len} characters
+from @code{buf} to the serial device specified by @code{minor}.
+
+@example
+@group
+int pollWrite (int minor, const char *buf, int len)
+@{
+ for (i=0; i<len; i++) @{
+ put buf[i] into the UART channel minor
+ wait for the character to be transmitted
+ on the serial line
+ @}
+ return 0
+@}
+@end group
+@end example
+
+@subsubsection pollRead
+
+The @code{pollRead} routine is responsible for reading a single character
+from the serial device specified by @code{minor}. If no character is
+available, then the routine should return -1.
+
+@example
+@group
+int pollRead(int minor)
+@{
+ read status of UART
+ if status indicates a character is available
+ return character
+ return -1
+@}
+@end group
+@end example
+
+@subsection Termios and Interrupt Driven I/O
+
+The UART generally generates interrupts when it is ready to accept or to
+emit a number of characters. In this mode, the interrupt subroutine is the
+core of the driver.
+
+@subsubsection InterruptHandler
+
+The @code{InterruptHandler} is responsible for processing asynchronous
+interrupts from the UART. There may be multiple interrupt handlers for
+a single UART. Some UARTs can generate a unique interrupt vector for
+each interrupt source such as a character has been received or the
+transmitter is ready for another character.
+
+In the simplest case, the @code{InterruptHandler} will have to check
+the status of the UART and determine what caused the interrupt.
+The following describes the operation of an @code{InterruptHandler}
+which has to do this:
+
+@example
+@group
+rtems_isr InterruptHandler (rtems_vector_number v)
+@{
+ check whether there was an error
+
+ if some characters were received:
+ Ask Termios to put them on his input buffer
+
+ if some characters have been transmitted
+ (i.e. the UART output buffer is empty)
+ Tell TERMIOS that the characters have been
+ transmitted. The TERMIOS routine will call
+ the InterruptWrite function with the number
+ of characters not transmitted yet if it is
+ not zero.
+@}
+@end group
+@end example
+
+@subsubsection InterruptWrite
+
+The @code{InterruptWrite} is responsible for telling the UART
+that the @code{len} characters at @code{buf} are to be transmitted.
+
+@example
+static int InterruptWrite(int minor, const char *buf, int len)
+@{
+ tell the UART to transmit len characters from buf
+ return 0
+@}
+@end example
+
+The driver has to put the @i{n} first buf characters in the UART channel minor
+buffer (@i{n} is the UART channel size, @i{n}=1 on the MC68640). Generally, an
+interrupt is raised after these @i{n} characters being transmitted. So
+UART interrupts may have to be enabled after putting the characters in the
+UART.
+
+
+@subsection Initialization
+
+The driver initialization is called once during the RTEMS initialization
+process.
+
+The @code{console_initialize} function has to:
+
+@itemize @bullet
+
+@item initialize Termios support: call @code{rtems_termios_initialize()}. If
+Termios has already been initialized by another device driver, then
+this call will have no effect.
+
+@item Initialize the UART: This procedure should
+be described in the UART manual. This procedure @b{MUST} be
+followed precisely. This procedure varies but
+usually consists of:
+
+@itemize @bullet
+@item reinitialize the UART channels
+
+@item set the channels configuration to the Termios default:
+9600 bauds, no parity, 1 stop bit, and 8 bits per character
+@end itemize
+
+@item If interrupt driven, register the console interrupt routine to RTEMS:
+
+@example
+rtems_interrupt_catch(
+ InterruptHandler, CONSOLE_VECTOR, &old_handler);
+@end example
+
+@item enable the UART channels.
+
+@item register the device name: in order to use the console (i.e. being
+able to do printf/scanf on stdin, stdout, and stderr), some device
+must be registered as "/dev/console":
+
+@example
+rtems_io_register_name ("dev/console", major, i);
+@end example
+
+@end itemize
+
+@subsection Opening a serial device
+
+The @code{console_open} function is called whenever a serial
+device is opened. The device registered as @code{"/dev/console"}
+is opened automatically during RTEMS initialization.
+For instance, if UART channel 2 is registered as "/dev/tty1",
+the @code{console_open} entry point will be called as
+the result of an @code{fopen("/dev/tty1", mode)} in the
+application.
+
+The @code{console_open} function has to inform Termios of the low-level
+functions for serial line support; the "callbacks".
+
+The gen68340 BSP defines two sets of callback tables:
+
+@itemize @bullet
+
+@item one with functions for polled input/output
+
+@item another with functions for interrupt driven input/output
+
+@end itemize
+
+This code can be found in the file @code{$BSPROOT/console/console.c}.
+
+@subsubsection Polled I/O
+
+Termios must be told the addresses of the functions that are to be
+used for simple character input/output, i.e. pointers to the
+@code{pollWrite} and @code{pollRead} functions
+defined earlier in @ref{Console Driver Termios and Polled I/O}.
+
+@subsubsection Interrupt Driven I/O
+
+Driver functioning is quite different in this mode. There is no
+device driver read function to be passed to Termios. Indeed a
+@code{console_read} call returns the contents of Termios input buffer.
+This buffer is filled in the driver interrupt subroutine
+(see @ref{Console Driver Termios and Interrupt Driven I/O}).
+
+The driver is responsible for providing a pointer to the
+@code{InterruptWrite} function.
+
+@subsection Closing a Serial Device
+
+The @code{console_close} is invoked when the serial device is to
+be closed. This entry point corresponds to the device driver
+close entry point.
+
+This routine is responsible for notifying Termios that the serial
+device was closed. This is done with a call to @code{rtems_termios_close}.
+
+@subsection Reading Characters From a Serial Device
+
+The @code{console_read} is invoked when the serial device is to
+be read from. This entry point corresponds to the device driver
+read entry point.
+
+This routine is responsible for returning the content of the
+Termios input buffer. This is done by invoking the
+@code{rtems_termios_read} routine.
+
+@subsection Writing Characters to a Serial Device
+
+The @code{console_write} is invoked when the serial device is to
+be written to. This entry point corresponds to the device driver
+write entry point.
+
+This routine is responsible for adding the requested characters to
+the Termios output queue for this device. This is done by
+calling the routine @code{rtems_termios_write}
+to add the characters at the end of the Termios output
+buffer.
+
+@subsection Changing Serial Line Parameters
+
+The @code{console_control} is invoked when the line parameters
+for a particular serial device are to be changed.
+This entry point corresponds to the device driver
+io_control entry point.
+
+The application write is able to control the serial line configuration
+with Termios calls (such as the @code{ioctl} command, see
+the Termios documentation for
+more details). If the driver is to support dynamic configuration, then
+is must have the @code{console_control} piece of code. Refer to the gen68340
+BSP for an example of how it is done. Basically @code{ioctl}
+commands call @code{console_control} with the serial line
+configuration in a Termios defined data structure. The driver
+is responsible for reinitializing the UART with the correct settings.
+
diff --git a/doc/bsp_howto/discrete.t b/doc/bsp_howto/discrete.t
new file mode 100644
index 0000000000..dcbb0da076
--- /dev/null
+++ b/doc/bsp_howto/discrete.t
@@ -0,0 +1,186 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Discrete Driver
+
+The Discrete driver is responsible for providing an
+interface to Discrete Input/Outputs. The capabilities provided
+by this class of device driver are:
+
+@itemize @bullet
+@item Initialize a Discrete I/O Board
+@item Open a Particular Discrete Bitfield
+@item Close a Particular Discrete Bitfield
+@item Read from a Particular Discrete Bitfield
+@item Write to a Particular Discrete Bitfield
+@item Reset DACs
+@item Reinitialize DACS
+@end itemize
+
+Most discrete I/O devices are found on I/O cards that support many
+bits of discrete I/O on a single card. This driver model is centered
+on the notion of reading bitfields from the card.
+
+There are currently no discrete I/O device drivers included in the
+RTEMS source tree. The information provided in this chapter
+is based on drivers developed for applications using RTEMS.
+It is hoped that this driver model information can form the
+discrete I/O driver model that can be supported in future RTEMS
+distribution.
+
+@section Major and Minor Numbers
+
+The @b{major} number of a device driver is its index in the
+RTEMS Device Address Table.
+
+A @b{minor} number is associated with each device instance
+managed by a particular device driver. An RTEMS minor number
+is an @code{unsigned32} entity. Convention calls for
+dividing the bits in the minor number down into categories
+that specify a particular bitfield. This results in categories
+like the following:
+
+@itemize @bullet
+
+@item @b{board} - indicates the board a particular bitfield is located on
+@item @b{word} - indicates the particular word of discrete bits the
+bitfield is located within
+@item @b{start} - indicates the starting bit of the bitfield
+@item @b{width} - indicates the width of the bitfield
+
+@end itemize
+
+From the above, it should be clear that a single device driver
+can support multiple copies of the same board in a single system.
+The minor number is used to distinguish the devices.
+
+By providing a way to easily access a particular bitfield from
+the device driver, the application is insulated with knowing how
+to mask fields in and out of a discrete I/O.
+
+@section Discrete I/O Driver Configuration
+
+There is not a standard discrete I/O driver configuration table but some
+fields are common across different drivers. The discrete I/O driver
+configuration table is typically an array of structures with each
+structure containing the information for a particular board.
+The following is a list of the type of information normally required
+to configure an discrete I/O board:
+
+@table @b
+@item board_offset
+is the base address of a board.
+
+@item relay_initial_values
+is an array of the values that should be written to each output
+word on the board during initialization. This allows the driver
+to start with the board's output in a known state.
+
+@end table
+
+@section Initialize a Discrete I/O Board
+
+At system initialization, the discrete I/O driver's initialization entry point
+will be invoked. As part of initialization, the driver will perform
+whatever board initializatin is required and then set all
+outputs to their configured initial state.
+
+The discrete I/O driver may register a device name for bitfields of
+particular interest to the system. Normally this will be restricted
+to the names of each word and, if the driver supports it, an "all words".
+
+@section Open a Particular Discrete Bitfield
+
+This is the driver open call. Usually this call does nothing other than
+validate the minor number.
+
+With some drivers, it may be necessary to allocate memory when a particular
+device is opened. If that is the case, then this is often the place
+to do this operation.
+
+@section Close a Particular Discrete Bitfield
+
+This is the driver close call. Usually this call does nothing.
+
+With some drivers, it may be necessary to allocate memory when a particular
+device is opened. If that is the case, then this is the place
+where that memory should be deallocated.
+
+@section Read from a Particular Discrete Bitfield
+
+This corresponds to the driver read call. After validating the minor
+number and arguments, this call reads the indicated bitfield. A
+discrete I/O devices may have to store the last value written to
+a discrete output. If the bitfield is output only, saving the last
+written value gives the appearance that it can be read from also.
+If the bitfield is input, then it is sampled.
+
+@b{NOTE:} Many discrete inputs have a tendency to bounce. The application
+may have to take account for bounces.
+
+The value returned is an @code{unsigned32} number
+representing the bitfield read. This value is stored in the
+@code{argument_block} passed in to the call.
+
+@b{NOTE:} Some discrete I/O drivers have a special minor number
+used to access all discrete I/O bits on the board. If this special
+minor is used, then the area pointed to by @code{argument_block} must
+be the correct size.
+
+@section Write to a Particular Discrete Bitfield
+
+This corresponds to the driver write call. After validating the minor
+number and arguments, this call writes the indicated device. If the
+specified device is an ADC, then an error is usually returned.
+
+The value written is an @code{unsigned32} number
+representing the value to be written to the specified
+bitfield. This value is stored in the
+@code{argument_block} passed in to the call.
+
+@b{NOTE:} Some discrete I/O drivers have a special minor number
+used to access all discrete I/O bits on the board. If this special
+minor is used, then the area pointed to by @code{argument_block} must
+be the correct size.
+
+@section Disable Discrete Outputs
+
+This is one of the IOCTL functions supported by the I/O control
+device driver entry point. When this IOCTL function is invoked,
+the discrete outputs are disabled.
+
+@b{NOTE:} It may not be possible to disable/enable discrete output on all
+discrete I/O boards.
+
+@section Enable Discrete Outputs
+
+This is one of the IOCTL functions supported by the I/O control
+device driver entry point. When this IOCTL function is invoked,
+the discrete outputs are enabled.
+
+@b{NOTE:} It may not be possible to disable/enable discrete output on all
+discrete I/O boards.
+
+@section Reinitialize Outputs
+
+This is one of the IOCTL functions supported by the I/O control
+device driver entry point. When this IOCTL function is invoked,
+the discrete outputs are rewritten with the configured initial
+output values.
+
+@section Get Last Written Values
+
+This is one of the IOCTL functions supported by the I/O control
+device driver entry point. When this IOCTL function is invoked,
+the following information is returned to the caller:
+
+@itemize @bullet
+@item last value written to the specified output word
+@item timestamp of when the last write was performed
+@end itemize
+
diff --git a/doc/bsp_howto/ide-ctrl.t b/doc/bsp_howto/ide-ctrl.t
new file mode 100644
index 0000000000..f5ece8507d
--- /dev/null
+++ b/doc/bsp_howto/ide-ctrl.t
@@ -0,0 +1,153 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter IDE Controller Driver
+
+@section Introduction
+
+The IDE Controller driver is responsible for providing an
+interface to an IDE Controller. The capabilities provided by this
+driver are:
+
+@itemize @bullet
+@item Read IDE Controller register
+@item Write IDE Controller register
+@item Read data block through IDE Controller Data Register
+@item Write data block through IDE Controller Data Register
+@end itemize
+
+The reference implementation for an IDE Controller driver can
+be found in @code{$RTEMS_SRC_ROOT/c/src/libchip/ide}. This driver
+is based on the libchip concept and allows to work with any of the IDE
+Controller chips simply by appropriate configuration of BSP. Drivers for a
+particular IDE Controller chips locate in the following directories: drivers
+for well-known IDE Controller chips locate into
+@code{$RTEMS_SRC_ROOT/c/src/libchip/ide}, drivers for IDE Controller chips
+integrated with CPU locate into
+@code{$RTEMS_SRC_ROOT/c/src/lib/libcpu/myCPU} and
+drivers for custom IDE Controller chips (for example, implemented on FPGA)
+locate into @code{$RTEMS_SRC_ROOT/c/src/lib/libbsp/myBSP}.
+There is a README file in these directories for each supported
+IDE Controller chip. Each of these README explains how to configure a BSP
+for that particular IDE Controller chip.
+
+@section Initialization
+
+IDE Controller chips used by a BSP are statically configured into
+@code{IDE_Controller_Table}. The @code{ide_controller_initialize} routine is
+responsible for initialization of all configured IDE controller chips.
+Initialization order of the chips based on the order the chips are defined in
+the @code{IDE_Controller_Table}.
+
+The following actions are performed by the IDE Controller driver
+initialization routine:
+
+@example
+@group
+rtems_device_driver ide_controller_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor_arg,
+ void *arg
+)
+@{
+ for each IDE Controller chip configured in IDE_Controller_Table
+ if (BSP dependent probe(if exists) AND device probe for this IDE chip
+ indicates it is present)
+ perform initialization of the particular chip
+ register device with configured name for this chip
+@}
+@end group
+@end example
+
+@section Read IDE Controller Register
+
+The @code{ide_controller_read_register} routine reads the content of the IDE
+Controller chip register. IDE Controller chip is selected via the minor
+number. This routine is not allowed to be called from an application.
+
+@example
+@group
+void ide_controller_read_register(rtems_device_minor_number minor,
+ unsigned32 reg, unsigned32 *value)
+@{
+ get IDE Controller chip configuration information from
+ IDE_Controller_Table by minor number
+
+ invoke read register routine for the chip
+@}
+@end group
+@end example
+
+@section Write IDE Controller Register
+
+The @code{ide_controller_write_register} routine writes IDE Controller chip
+register with specified value. IDE Controller chip is selected via the minor
+number. This routine is not allowed to be called from an application.
+
+@example
+@group
+void ide_controller_write_register(rtems_device_minor_number minor,
+ unsigned32 reg, unsigned32 value)
+@{
+ get IDE Controller chip configuration information from
+ IDE_Controller_Table by minor number
+
+ invoke write register routine for the chip
+@}
+@end group
+@end example
+
+@section Read Data Block Through IDE Controller Data Register
+
+The @code{ide_controller_read_data_block} provides multiple consequent read
+of the IDE Controller Data Register. IDE Controller chip is selected via the
+minor number. The same functionality may be achieved via separate multiple
+calls of @code{ide_controller_read_register} routine but
+@code{ide_controller_read_data_block} allows to escape functions call
+overhead. This routine is not allowed to be called from an application.
+
+@example
+@group
+void ide_controller_read_data_block(rtems_device_minor_number minor,
+ unsigned16 block_size,
+ blkdev_sg_buffer *bufs,
+ rtems_unsigned32 *cbuf,
+ rtems_unsigned32 *pos)
+@{
+ get IDE Controller chip configuration information from
+ IDE_Controller_Table by minor number
+
+ invoke read data block routine for the chip
+@}
+@end group
+@end example
+
+@section Write Data Block Through IDE Controller Data Register
+
+The @code{ide_controller_write_data_block} provides multiple consequent write
+into the IDE Controller Data Register. IDE Controller chip is selected via the
+minor number. The same functionality may be achieved via separate multiple
+calls of @code{ide_controller_write_register} routine but
+@code{ide_controller_write_data_block} allows to escape functions call
+overhead. This routine is not allowed to be called from an application.
+
+@example
+@group
+void ide_controller_write_data_block(rtems_device_minor_number minor,
+ unsigned16 block_size,
+ blkdev_sg_buffer *bufs,
+ rtems_unsigned32 *cbuf,
+ rtems_unsigned32 *pos)
+@{
+ get IDE Controller chip configuration information from
+ IDE_Controller_Table by minor number
+
+ invoke write data block routine for the chip
+@}
+@end group
+@end example
diff --git a/doc/bsp_howto/init.t b/doc/bsp_howto/init.t
new file mode 100644
index 0000000000..991f69c0da
--- /dev/null
+++ b/doc/bsp_howto/init.t
@@ -0,0 +1,430 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Initialization Code
+
+@section Introduction
+
+The initialization code is the first piece of code executed when there's a
+reset/reboot. Its purpose is to initialize the board for the application.
+This chapter contains a narrative description of the initialization
+process followed by a description of each of the files and routines
+commonly found in the BSP related to initialization. The remainder of
+this chapter covers special issues which require attention such
+as interrupt vector table and chip select initialization.
+
+Most of the examples in this chapter will be based on the gen68340 BSP
+initialization code. Like most BSPs, the initialization for this
+BSP is divided into two subdirectories under the BSP source directory.
+The gen68340 BSP source code is in the following directory:
+
+@example
+c/src/lib/libbsp/m68k/gen68340
+@end example
+
+The following source code files are in this subdirectory.
+
+@itemize @bullet
+
+@item @code{start340}: assembly language code which contains early
+initialization routines
+
+@item @code{startup}: C code with higher level routines (RTEMS
+initialization related)
+
+@end itemize
+
+@b{NOTE:} The directory @code{start340} is simply named @code{start} or
+start followed by a BSP designation.
+
+In the @code{start340} directory are two source files. The file
+@code{startfor340only.s} is the simpler of these files as it only has
+initialization code for a MC68340 board. The file @code{start340.s}
+contains initialization for a 68349 based board as well.
+
+@section Required Global Variables
+
+Although not strictly part of initialization, there are a few global
+variables assumed to exist by many support components. These
+global variables are usually declared in the file @code{startup/bspstart.c}
+that provides most of the BSP specific initialization. The following is
+a list of these global variables:
+
+@itemize @bullet
+@item @code{BSP_Configuration} is the BSP's writable copy of the RTEMS
+Configuration Table.
+
+@item @code{Cpu_table} is the RTEMS CPU Dependent Information Table.
+
+@item @code{bsp_isr_level} is the interrupt level that is set at
+system startup. It will be restored when the executive returns
+control to the BSP.
+
+@end itemize
+
+@section Board Initialization
+
+This section describes the steps an application goes through from the
+time the first BSP code is executed until the first application task
+executes. The routines invoked during this will be discussed and
+their location in the RTEMS source tree pointed out.
+
+@subsection Start Code - Assembly Language Initialization
+
+The assembly language code in the directory @code{start} is
+the first part of the application to execute. It is
+responsible for initializing the processor and board enough to execute
+the rest of the BSP. This includes:
+
+@itemize @bullet
+@item initializing the stack
+@item zeroing out the uninitialized data section @code{.bss}
+@item disabling external interrupts
+@item copy the initialized data from ROM to RAM
+@end itemize
+
+The general rule of thumb is that the
+start code in assembly should do the minimum necessary to allow C code
+to execute to complete the initialization sequence.
+
+The initial assembly language start code completes its execution by
+invoking the shared routine @code{boot_card()}.
+
+The label (symbolic name) associated with the starting address of the
+program is typically called @code{start}. The start object file
+is the first object file linked into the program image so it is insured
+that the start code is at offset 0 in the @code{.text} section. It is
+the responsibility of the linker script in conjunction with the
+compiler specifications file to put the start code in the correct location
+in the application image.
+
+@subsection boot_card() - Boot the Card
+
+The @code{boot_card()} is the first C code invoked. Most of the BSPs
+use the same shared version of @code{boot_card()} which is located in
+the following file:
+
+@example
+c/src/lib/libbsp/shared/main.c
+@end example
+
+The @code{boot_card()} routine performs the following functions:
+
+@itemize @bullet
+
+@item initializes the shared fields of the CPU Configuration Table
+(variable name @code{Cpu_table}) to a default state,
+
+@item copies the application's RTEMS Configuration Table
+(variable name @code{Configuration}) to the BSP's Configuration
+Table (variable name @code{BSP_Configuration}) so it can be modified
+as necessary without copying the original table,
+
+@item invokes the BSP specific routine @code{bsp_start()},
+
+@item invokes the RTEMS directive @code{rtems_initialize_executive_early()}
+to initialize the executive, C Library, and all device drivers but
+return without initiating multitasking or enabling interrupts,
+
+@item invokes the shared @code{main()} in the same file as
+@code{boot_card()} which does not return until the
+@code{rtems_shutdown_executive} directive is called, and
+
+@item invokes the BSP specific routine @code{bsp_cleanup()} to perform
+any necessary board specific shutdown actions.
+
+@end itemize
+
+It is important to note that the executive and much of the
+support environment must be initialized before invoking @code{main()}.
+
+@subsection bsp_start() - BSP Specific Initialization
+
+This is the first BSP specific C routine to execute during system
+initialization. This routine often performs required fundamental
+hardware initialization such as setting bus controller registers
+that do not have a direct impact on whether or not C code can execute.
+The source code for this routine is usually found in the following
+file:
+
+@example
+c/src/lib/libbsp/CPU/BSP/startup/bspstart.c
+@end example
+
+This routine is also responsible for overriding the default settings
+in the CPU Configuration Table and setting port specific entries
+in this table. This may include increasing the maximum number
+of some types of RTEMS system objects to reflect the needs of
+the BSP and the base set of device drivers. This routine will
+typically also install routines for one or more of the following
+initialization hooks:
+
+@itemize @bullet
+@item BSP Pretasking Hook
+@item BSP Predriver Hook
+@item BSP Postdriver Hook
+@end itemize
+
+One of the most important functions performed by this routine
+is determining where the RTEMS Workspace is to be
+located in memory. All RTEMS objects and task stacks will be
+allocated from this Workspace. The RTEMS Workspace is distinct
+from the application heap used for @code{malloc()}. Many BSPs
+place the RTEMS Workspace area at the end of RAM although this is
+certainly not a requirement.
+
+After completing execution, this routine returns to the
+@code{boot_card()} routine.
+
+@subsection main() - C Main
+
+This routine is the C main entry point. This is a special routine
+and the GNU Compiler Suite treats it as such. The GNU C Compiler
+recognizes @code{main()} and automatically inserts a call to the
+compiler run-time support routine @code{__main()} as the first
+code executed in @code{main()}.
+
+The routine @code{__main()} initializes the compiler's basic run-time
+support library and, most importantly, invokes the C++ global
+constructors.
+
+The precise placement of when @code{main()} is invoked in the
+RTEMS initialization sequence insures that C Library and non-blocking
+calls can be made in global C++ constructors.
+
+The shared implementation of this routine is located in the following file:
+
+@example
+c/src/lib/libbsp/shared/main.c
+@end example
+
+In addition to the implicit invocation of @code{__main}, this
+routine performs some explicit initialization. This routine
+sets the variable @code{rtems_progname} and initiates
+multitasking via a call to the RTEMS directive
+@code{rtems_initialize_executive_late}. It is important to note
+that the executive does not return to this routine until the
+RTEMS directive @code{rtems_shutdown_executive} is invoked.
+
+The RTEMS initialization procedure is described in the @b{Initialization
+Manager} chapter of the @b{RTEMS Application C User's Guide}.
+Please refer to that manual for more information.
+
+@subsection RTEMS Pretasking Callback
+
+The @code{pretasking_hook} entry in the RTEMS CPU Configuration
+Table may be the address of a user provided routine that is
+invoked once RTEMS API initialization is complete but before interrupts
+and tasking are enabled. No tasks -- not even the IDLE task -- have
+been created when this hook is invoked. The pretasking hook is optional.
+
+Although optional, most of the RTEMS BSPs provide a pretasking hook
+callback. This routine is usually called @code{bsp_pretasking_hook}
+and is found in the file:
+
+@example
+c/src/lib/libbsp/CPU/BSP/startup/bspstart.c
+@end example
+
+The @code{bsp_pretasking_hook()} routine is the appropriate place to
+initialize any support components which depend on the RTEMS APIs.
+Most BSPs set the debug level for the system and initialize the
+RTEMS C Library support in their
+implementation of @code{bsp_pretasking_hook()}. This initialization
+includes the application heap used by the @code{malloc} family
+of routines as well as the reentrancy support for the C Library.
+
+The routine @code{bsp_libc_init} routine invoked from the
+@code{bsp_pretasking_hook()} routine is passed the starting
+address, length, and growth amount passed to @code{sbrk}.
+This "sbrk amount" is only used if the heap runs out of
+memory. In this case, the RTEMS malloc implementation will
+invoked @code{sbrk} to obtain more memory. See
+@ref{Miscellaneous Support Files sbrk() Implementation} for more details.
+
+@subsection RTEMS Predriver Callback
+
+The @code{predriver_hook} entry in the RTEMS CPU Configuration
+Table may be the address of a user provided routine that is
+is invoked immediately before the the device drivers and MPCI
+are initialized. RTEMS
+initialization is complete but interrupts and tasking are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+Most BSPs do not use this callback.
+
+@subsection Device Driver Initialization
+
+At this point in the initialization sequence, the initialization
+routines for all of the device drivers specified in the Device
+Driver Table are invoked. The initialization routines are invoked
+in the order they appear in the Device Driver Table.
+
+The Driver Address Table is part of the RTEMS Configuration Table. It
+defines device drivers entry points (initialization, open, close, read,
+write, and control). For more information about this table, please
+refer to the @b{Configuring a System} chapter in the
+@b{RTEMS Application C User's Guide}.
+
+The RTEMS initialization procedure calls the initialization function for
+every driver defined in the RTEMS Configuration Table (this allows
+one to include only the drivers needed by the application).
+
+All these primitives have a major and a minor number as arguments:
+
+@itemize @bullet
+
+@item the major number refers to the driver type,
+
+@item the minor number is used to control two peripherals with the same
+driver (for instance, we define only one major number for the serial
+driver, but two minor numbers for channel A and B if there are two
+channels in the UART).
+
+@end itemize
+
+@subsection RTEMS Postdriver Callback
+
+The @code{postdriver_hook} entry in the RTEMS CPU Configuration
+Table may be the address of a user provided routine that is
+invoked immediately after the the device drivers and MPCI are initialized.
+Interrupts and tasking are disabled. The postdriver hook is optional.
+
+Although optional, most of the RTEMS BSPs provide a postdriver hook
+callback. This routine is usually called @code{bsp_postdriver_hook}
+and is found in the file:
+
+@example
+c/src/lib/libbsp/CPU/BSP/startup/bsppost.c
+@end example
+
+The @code{bsp_postdriver_hook()} routine is the appropriate place to
+perform initialization that must be performed before the first task
+executes but requires that a device driver be initialized. The
+shared implementation of the postdriver hook opens the default
+standard in, out, and error files and associates them with
+@code{/dev/console}.
+
+@section The Interrupt Vector Table
+
+The Interrupt Vector Table is called different things on different
+processor families but the basic functionality is the same. Each
+entry in the Table corresponds to the handler routine for a particular
+interrupt source. When an interrupt from that source occurs, the
+specified handler routine is invoked. Some context information is
+saved by the processor automatically when this happens. RTEMS saves
+enough context information so that an interrupt service routine
+can be implemented in a high level language.
+
+On some processors, the Interrupt Vector Table is at a fixed address. If
+this address is in RAM, then usually the BSP only has to initialize
+it to contain pointers to default handlers. If the table is in ROM,
+then the application developer will have to take special steps to
+fill in the table.
+
+If the base address of the Interrupt Vector Table can be dynamically
+changed to an arbitrary address, then the RTEMS port to that processor
+family will usually allocate its own table and install it. For example,
+on some members of the Motorola MC68xxx family, the Vector Base Register
+(@code{vbr}) contains this base address.
+
+@subsection Interrupt Vector Table on the gen68340 BSP
+
+The gen68340 BSP provides a default Interrupt Vector Table in the
+file @code{$BSP_ROOT/start340/start340.s}. After the @code{entry}
+label is the definition of space reserved for the table of
+interrupts vectors. This space is assigned the symbolic name
+of @code{__uhoh} in the @code{gen68340} BSP.
+
+At @code{__uhoh} label is the default interrupt handler routine. This
+routine is only called when an unexpected interrupts is raised. One can
+add their own routine there (in that case there's a call to a routine -
+$BSP_ROOT/startup/dumpanic.c - that prints which address caused the
+interrupt and the contents of the registers, stack, etc.), but this should
+not return.
+
+@section Chip Select Initialization
+
+When the microprocessor accesses a memory area, address decoding is
+handled by an address decoder, so that the microprocessor knows which
+memory chip(s) to access. The following figure illustrates this:
+
+@example
+@group
+ +-------------------+
+ ------------| |
+ ------------| |------------
+ ------------| Address |------------
+ ------------| Decoder |------------
+ ------------| |------------
+ ------------| |
+ +-------------------+
+ CPU Bus Chip Select
+@end group
+@end example
+
+
+The Chip Select registers must be programmed such that they match
+the @code{linkcmds} settings. In the gen68340 BSP, ROM and RAM
+addresses can be found in both the @code{linkcmds} and initialization
+code, but this is not a great way to do this. It is better to
+define addresses in the linker script.
+
+@section Integrated Processor Registers Initialization
+
+The CPUs used in many embedded systems are highly complex devices
+with multiple peripherals on the CPU itself. For these devices,
+there are always some specific integrated processor registers
+that must be initialized. Refer to the processors' manuals for
+details on these registers and be VERY careful programming them.
+
+@section Data Section Recopy
+
+The next initialization part can be found in
+@code{$BSP340_ROOT/start340/init68340.c}. First the Interrupt
+Vector Table is copied into RAM, then the data section recopy is initiated
+(_CopyDataClearBSSAndStart in @code{$BSP340_ROOT/start340/startfor340only.s}).
+
+This code performs the following actions:
+
+@itemize @bullet
+
+@item copies the .data section from ROM to its location reserved in RAM
+(see @ref{Linker Script Initialized Data} for more details about this copy),
+
+@item clear @code{.bss} section (all the non-initialized
+data will take value 0).
+
+@end itemize
+
+@section RTEMS-Specific Initialization
+
+@section The RTEMS configuration table
+
+The RTEMS configuration table contains the maximum number of objects RTEMS
+can handle during the application (e.g. maximum number of tasks,
+semaphores, etc.). It's used to allocate the size for the RTEMS inner data
+structures.
+
+The RTEMS configuration table is application dependent, which means that
+one has to provide one per application. It is usually defined
+by defining macros and including the header file @code{<confdefs.h>}.
+In simple applications such as the tests provided with RTEMS, it is
+commonly found in the main module of the application. For more complex
+applications, it may be in a file by itself.
+
+The header file @code{<confdefs.h>} defines a constant table named
+@code{Configuration}. It is common practice for the BSP to copy
+this table into a modifiable copy named @code{BSP_Configuration}.
+This copy of the table is modified to define the base address of the
+RTEMS Executive Workspace as well as to reflect any BSP and
+device driver requirements not automatically handled by the application.
+
+For more information on the RTEMS Configuration Table, refer to the
+@b{RTEMS Application C User's Guide}.
+
diff --git a/doc/bsp_howto/intro.t b/doc/bsp_howto/intro.t
new file mode 100644
index 0000000000..cce6302277
--- /dev/null
+++ b/doc/bsp_howto/intro.t
@@ -0,0 +1,57 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Introduction
+
+Before reading this documentation, it is strongly advised to read the
+RTEMS Development Environment Guide to get acquainted with the RTEMS
+directory structure. This document describes how to do a RTEMS Board
+Support Package, i.e. how to port RTEMS on a new target board. Discussions
+are provided for the following topics:
+
+@itemize @bullet
+
+@item RTEMS Board Support Package Organization
+
+@item Makefiles and the Linker Command Script
+
+@item Board Initialization Sequence
+
+@item Device Drivers Including:
+
+@itemize @bullet
+
+@item Console Driver
+
+@item Clock Driver
+
+@item Timer Driver
+
+@item Real-Time Clock Driver
+
+@item Non-Volatile Memory Driver
+
+@item Networking Driver
+
+@item Shared Memory Support Driver
+
+@item Analog Driver
+
+@item Discrete Driver
+
+@end itemize
+
+@end itemize
+
+The original version of this manual was written by Geoffroy Montel
+<g_montel@@yahoo.com>. When he started development of the gen68340
+BSP, this manual did not exist. He wrote the initial version of
+this manual as the result of his experiences. At that time, this
+document was viewed internally as the most important "missing manual"
+in the RTEMS documentation set.
+
diff --git a/doc/bsp_howto/linkcmds.t b/doc/bsp_howto/linkcmds.t
new file mode 100644
index 0000000000..cd4ee631ea
--- /dev/null
+++ b/doc/bsp_howto/linkcmds.t
@@ -0,0 +1,425 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Linker Script
+
+@section What is a "linkcmds" file?
+
+The @code{linkcmds} file is a script which is passed to the linker at linking
+time. This file describes the memory configuration of the board as needed
+to link the program. Specifically it specifies where the code and data
+for the application will reside in memory.
+
+@section Program Sections
+
+An embedded systems programmer must be much more aware of the
+placement of their executable image in memory than the average
+applications programmer. A program destined to be embedded as well
+as the target system have some specific properties that must be
+taken into account. Embedded machines often mean average performances
+and small memory usage. It is the memory usage that concerns us
+when examining the linker command file.
+
+Two types of memories have to be distinguished:
+
+@itemize @bullet
+@item RAM - volatile offering read and write access
+@item ROM - non-volatile but read only
+@end itemize
+
+Even though RAM and ROM can be found in every personal computer,
+one generally doesn't care about them. In a personal computer,
+a program is nearly always stored on disk and executed in RAM. Things
+are a bit different for embedded targets: the target will execute the
+program each time it is rebooted or switched on. The application
+program is stored in non-volatile memory such as ROM, PROM, EEPROM,
+or Flash. On the other hand, data processing occurs in RAM.
+
+This leads us to the structure of an embedded program. In rough terms,
+an embedded program is made of sections. It is the responsibility of
+the application programmer to place these sections in the appropriate
+place in target memory. To make this clearer, if using the COFF
+object file format on the Motorola m68k family of microprocessors,
+the following sections will be present:
+
+@itemize @bullet
+
+@item @b{code (@code{.text}) section}:
+is the program's code and it should not be modified.
+This section may be placed in ROM.
+
+@item @b{non-initialized data (@code{.bss}) section}:
+holds uninitialized variables of the program. It can stay in RAM.
+
+@item @b{initialized data (@code{.data}) section}:
+holds the initialized program data which may be modified during the
+program's life. This means they have to be in RAM.
+On the other hand, these variables must be set to predefined values, and
+those predefined values have to be stored in ROM.
+
+@end itemize
+
+@b{NOTE:} Many programs and support libraries unknowingly assume that the
+@code{.bss} section and, possibly, the application heap are initialized
+to zero at program start. This is not required by the ISO/ANSI C Standard
+but is such a common requirement that most BSPs do this.
+
+That brings us up to the notion of the image of an executable: it consists
+of the set of the sections that together constitute the application.
+
+@section Image of an Executable
+
+As a program executable has many sections (note that the user can define
+their own, and that compilers define theirs without any notice), one has to
+specify the placement of each section as well as the type of memory
+(RAM or ROM) the sections will be placed into.
+For instance, a program compiled for a Personal Computer will see all the
+sections to go to RAM, while a program destined to be embedded will see
+some of his sections going into the ROM.
+
+The connection between a section and where that section is loaded into
+memory is made at link time. One has to let the linker know where
+the different sections are to be placed once they are in memory.
+
+The following example shows a simple layout of program sections. With
+some object formats, there are many more sections but the basic
+layout is conceptually similar.
+
+@example
+@group
+ +-----------------+
+ | .text | RAM or ROM
+ +-----------------+
+ | .data | RAM
+ +-----------------+
+ | .bss | RAM
+ +-----------------+
+@end group
+@end example
+
+@section Example Linker Command Script
+
+The GNU linker has a command language to specify the image format. This
+command language can be quite complicated but most of what is required
+can be learned by careful examination of a well-documented example.
+The following is a heavily commented version of the linker script
+used with the the @code{gen68340} BSP This file can be found at
+$BSP340_ROOT/startup/linkcmds.
+
+@example
+/*
+ * Specify that the output is to be coff-m68k regardless of what the
+ * native object format is.
+ */
+
+OUTPUT_FORMAT(coff-m68k)
+
+/*
+ * Set the amount of RAM on the target board.
+ *
+ * NOTE: The default may be overridden by passing an argument to ld.
+ */
+
+RamSize = DEFINED(RamSize) ? RamSize : 4M;
+
+/*
+ * Set the amount of RAM to be used for the application heap. Objects
+ * allocated using malloc() come from this area. Having a tight heap
+ * size is somewhat difficult and multiple attempts to squeeze it may
+ * be needed reducing memory usage is important. If all objects are
+ * allocated from the heap at system initialization time, this eases
+ * the sizing of the application heap.
+ *
+ * NOTE 1: The default may be overridden by passing an argument to ld.
+ *
+ * NOTE 2: The TCP/IP stack requires additional memory in the Heap.
+ *
+ * NOTE 3: The GNAT/RTEMS run-time requires additional memory in
+ * the Heap.
+ */
+
+HeapSize = DEFINED(HeapSize) ? HeapSize : 0x10000;
+
+/*
+ * Set the size of the starting stack used during BSP initialization
+ * until first task switch. After that point, task stacks allocated
+ * by RTEMS are used.
+ *
+ * NOTE: The default may be overridden by passing an argument to ld.
+ */
+
+StackSize = DEFINED(StackSize) ? StackSize : 0x1000;
+
+/*
+ * Starting addresses and length of RAM and ROM.
+ *
+ * The addresses must be valid addresses on the board. The
+ * Chip Selects should be initialized such that the code addresses
+ * are valid.
+ */
+
+MEMORY @{
+ ram : ORIGIN = 0x10000000, LENGTH = 4M
+ rom : ORIGIN = 0x01000000, LENGTH = 4M
+@}
+
+/*
+ * This is for the network driver. See the Networking documentation
+ * for more details.
+ */
+
+ETHERNET_ADDRESS =
+ DEFINED(ETHERNET_ADDRESS) ? ETHERNET_ADDRESS : 0xDEAD12;
+
+/*
+ * The following defines the order in which the sections should go.
+ * It also defines a number of variables which can be used by the
+ * application program.
+ *
+ * NOTE: Each variable appears with 1 or 2 leading underscores to
+ * ensure that the variable is accessible from C code with a
+ * single underscore. Some object formats automatically add
+ * a leading underscore to all C global symbols.
+ */
+
+SECTIONS @{
+
+ /*
+ * Make the RomBase variable available to the application.
+ */
+
+ _RamSize = RamSize;
+ __RamSize = RamSize;
+
+ /*
+ * Boot PROM - Set the RomBase variable to the start of the ROM.
+ */
+
+ rom : @{
+ _RomBase = .;
+ __RomBase = .;
+ @} >rom
+
+ /*
+ * Dynamic RAM - set the RamBase variable to the start of the RAM.
+ */
+
+ ram : @{
+ _RamBase = .;
+ __RamBase = .;
+ @} >ram
+
+ /*
+ * Text (code) goes into ROM
+ */
+
+ .text : @{
+ /*
+ * Create a symbol for each object (.o).
+ */
+
+ CREATE_OBJECT_SYMBOLS
+
+ /*
+ * Put all the object files code sections here.
+ */
+
+ *(.text)
+
+ . = ALIGN (16); /* go to a 16-byte boundary */
+
+ /*
+ * C++ constructors and destructors
+ *
+ * NOTE: See the CROSSGCC mailing-list FAQ for
+ * more details about the "[......]".
+ */
+
+ __CTOR_LIST__ = .;
+ [......]
+ __DTOR_END__ = .;
+
+ /*
+ * Declares where the .text section ends.
+ */
+
+ etext = .;
+ _etext = .;
+ @} >rom
+
+ /*
+ * Exception Handler Frame section
+ */
+
+ .eh_fram : @{
+ . = ALIGN (16);
+ *(.eh_fram)
+ @} >ram
+
+ /*
+ * GCC Exception section
+ */
+
+ .gcc_exc : @{
+ . = ALIGN (16);
+ *(.gcc_exc)
+ @} >ram
+
+ /*
+ * Special variable to let application get to the dual-ported
+ * memory.
+ */
+
+ dpram : @{
+ m340 = .;
+ _m340 = .;
+ . += (8 * 1024);
+ @} >ram
+
+ /*
+ * Initialized Data section goes in RAM
+ */
+
+ .data : @{
+ copy_start = .;
+ *(.data)
+
+ . = ALIGN (16);
+ _edata = .;
+ copy_end = .;
+ @} >ram
+
+ /*
+ * Uninitialized Data section goes in ROM
+ */
+
+ .bss : @{
+ /*
+ * M68K specific: Reserve some room for the Vector Table
+ * (256 vectors of 4 bytes).
+ */
+
+ M68Kvec = .;
+ _M68Kvec = .;
+ . += (256 * 4);
+
+ /*
+ * Start of memory to zero out at initialization time.
+ */
+
+ clear_start = .;
+
+ /*
+ * Put all the object files uninitialized data sections
+ * here.
+ */
+
+ *(.bss)
+
+ *(COMMON)
+
+ . = ALIGN (16);
+ _end = .;
+
+ /*
+ * Start of the Application Heap
+ */
+
+ _HeapStart = .;
+ __HeapStart = .;
+ . += HeapSize;
+
+ /*
+ * The Starting Stack goes after the Application Heap.
+ * M68K stack grows down so start at high address.
+ */
+
+ . += StackSize;
+ . = ALIGN (16);
+ stack_init = .;
+
+ clear_end = .;
+
+ /*
+ * The RTEMS Executive Workspace goes here. RTEMS
+ * allocates tasks, stacks, semaphores, etc. from this
+ * memory.
+ */
+
+ _WorkspaceBase = .;
+ __WorkspaceBase = .;
+ @} >ram
+@}
+@end example
+
+@section Initialized Data
+
+Now there's a problem with the initialized data: the @code{.data} section
+has to be in RAM as this data may be modified during the program execution.
+But how will the values be initialized at boot time?
+
+One approach is to place the entire program image in RAM and reload
+the image in its entirety each time the program is run. This is fine
+for use in a debug environment where a high-speed connection is available
+between the development host computer and the target. But even in this
+environment, it is cumbersome.
+
+The solution is to place a copy of the initialized data in a separate
+area of memory and copy it into the proper location each time the
+program is started. It is common practice to place a copy of the initialized
+@code{.data} section at the end of the code (@code{.text}) section
+in ROM when building a PROM image. The GNU tool @code{objcopy}
+can be used for this purpose.
+
+The following figure illustrates the steps a linked program goes through
+to become a downloadable image.
+
+@example
+@group
++--------------+ +--------------------+
+| .data RAM | | .data RAM |
++--------------+ +--------------------+
+| .bss RAM | | .bss RAM |
++--------------+ +--------------------+ +----------------+
+| .text ROM | | .text ROM | | .text |
++--------------+ +--------------------+ +----------------+
+ | copy of .data ROM | | copy of .data |
+ +--------------------+ +----------------+
+
+ Step 1 Step 2 Step 3
+@end group
+@end example
+
+In Step 1, the program is linked together using the BSP linker script.
+
+In Step 2, a copy is made of the @code{.data} section and placed
+after the @code{.text} section so it can be placed in PROM. This step
+is done after the linking time. There is an example
+of doing this in the file $RTEMS_ROOT/make/custom/gen68340.cfg:
+
+@example
+# make a PROM image using objcopy
+m68k-rtems-objcopy \
+--adjust-section-vma .data= \
+
+`m68k-rtems-objdump --section-headers \
+$(basename $@@).exe \
+| awk '[...]` \
+$(basename $@@).exe
+@end example
+
+NOTE: The address of the "copy of @code{.data} section" is
+created by extracting the last address in the @code{.text}
+section with an @code{awk} script. The details of how
+this is done are not relevant.
+
+Step 3 shows the final executable image as it logically appears in
+the target's non-volatile program memory. The board initialization
+code will copy the ""copy of @code{.data} section" (which are stored in
+ROM) to their reserved location in RAM.
+
diff --git a/doc/bsp_howto/makefiles.t b/doc/bsp_howto/makefiles.t
new file mode 100644
index 0000000000..f27c77cf32
--- /dev/null
+++ b/doc/bsp_howto/makefiles.t
@@ -0,0 +1,226 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Makefiles
+
+This chapter discusses the Makefiles associated with a BSP. It does not
+describe the process of configuring, building, and installing RTEMS.
+This chapter will not provide detailed information about this process.
+Nonetheless, it is important to remember that the general process consists
+of three parts:
+
+@itemize @bullet
+@item configure
+@item build
+@item install
+@end itemize
+
+During the configure phase, a number of files are generated. These
+generated files are tailored for the specific host/target combination
+by the configure script. This set of files includes the Makefiles used
+to actually compile and install RTEMS.
+
+During the build phase, the source files are compiled into object files
+and libraries are built.
+
+During the install phase, the libraries, header files, and other support
+files are copied to the BSP specific installation point. After installation
+is successfully completed, the files generated by the configure and build
+phases may be removed.
+
+@section Makefiles Used During The BSP Building Process
+
+RTEMS uses the @b{GNU automake} and @b{GNU autoconf} automatic
+configuration package. Consequently, there are a number of
+automatically generated files in each directory in the RTEMS
+source tree. The @code{bootstrap} script found in the top level
+directory of the RTEMS source tree is executed to produce the
+automatically generated files. That script must be run from
+a directory with a @code{configure.ac} file in it.
+
+There is a file named @code{Makefile.am} in each directory of a BSP.
+This file is used by @b{automake} to produce the file
+named @code{Makefile.in} which is also found in each directory of a BSP.
+The configure process specializes the @code{Makefile.in} files at
+the time that RTEMS
+is configured for a specific development host and target. Makefiles
+are automatically generated from the @code{Makefile.in} files. It is
+necessary for the BSP developer to provide the @code{Makefile.am}
+files and generate the @code{Makefile.in} files. Most of the
+time, it is possible to copy the @code{Makefile.am} from another
+similar directory and edit it.
+
+The @code{Makefile} files generated are processed when configuring
+and building RTEMS for a given BSP.
+
+The BSP developer is responsible for generating @code{Makefile.am}
+files which properly build all the files associated with their BSP.
+There are generally three types of Makefiles in a BSP source tree:
+
+
+@itemize @bullet
+@item Directory Makefiles
+@item Source Directory Makefiles
+@item Wrapup Makefile
+@end itemize
+
+@subsection Directory Makefiles
+
+The Directory class of Makefiles directs the build process through
+a set of subdirectories in a particular order. This order is usually
+chosen to insure that build dependencies are properly processed.
+Most BSPs only have one Directory class Makefile. The @code{Makefile.am}
+in the BSP root directory (@code{c/src/lib/libbsp/CPU/BSP}) specifies
+following Makefile fragment shows how a BSP would specify the
+directories to be built and their order:
+
+@example
+SUB_DIRS=include start340 startup clock console timer \
+ network wrapup
+@end example
+
+@subsection Source Directory Makefiles
+
+There is a @code{Makefile.am} in most of the directories in a BSP. This
+class of Makefile lists the files to be built as part of the driver.
+When adding new files to an existing directory, Do not forget to add
+the new files to the list of files to be built in the @code{Makefile.am}
+and run @code{bootstrap}.
+
+@b{NOTE:} The @code{Makefile.am} files are ONLY processed by
+@code{bootstrap} and the resulting @code{Makefile.in} files are
+only processed during the configure
+process of a RTEMS build. Therefore, when developing
+a BSP and adding a new file to a @code{Makefile.am}, the
+already generated @code{Makefile} will not automatically
+include the new references unless you configured RTEMS with the
+@code{--enable-maintainer-mode} option.
+Otherwise, the new file not being be taken into account!
+
+If adding a new directory, be sure to add it to the list of
+automatically generated files in the BSP's @code{configure.ac}
+script.
+
+@subsection Wrapup Makefile
+
+This class of Makefiles produces a library. The BSP wrapup Makefile
+is responsible for producing the library @code{libbsp.a} which is later
+merged into the @code{librtemsall.a} library. This Makefile specifies
+which BSP components are to be placed into the library as well as which
+components from the CPU dependent support code library. For example,
+this component may choose to use a default exception handler from the
+CPU dependent support code or provide its own.
+
+This Makefile makes use of the @code{foreach} construct in @b{GNU make}
+to pick up the required components:
+
+@example
+BSP_PIECES=startup clock console timer
+CPU_PIECES=
+GENERIC_PIECES=
+
+# bummer; have to use $foreach since % pattern subst
+# rules only replace 1x
+OBJS=$(foreach piece, $(BSP_PIECES), ../$(piece)/$(ARCH)/$(piece).o) \
+ $(foreach piece, $(CPU_PIECES), \
+ ../../../../libcpu/$(RTEMS_CPU)/$(piece)/$(ARCH)/$(piece).o) \
+ $(wildcard \
+ ../../../../libcpu/$(RTEMS_CPU)/$(RTEMS_CPU_MODEL)/fpsp/$(ARCH)/fpsp.rel) \
+ $(foreach piece, \
+ $(GENERIC_PIECES), ../../../$(piece)/$(ARCH)/$(piece).o)
+@end example
+
+The variable @code{OBJS} is the list of "pieces" expanded to include
+path information to the appropriate object files. The @code{wildcard}
+function is used on pieces of @code{libbsp.a} which are optional and
+may not be present based upon the configuration options.
+
+@section Makefiles Used Both During The BSP Design and its Use
+
+When building a BSP or an application using that BSP, it is necessary
+to tailor the compilation arguments to account for compiler flags, use
+custom linker scripts, include the RTEMS libraries, etc.. The BSP
+must be built using this information. Later, once the BSP is installed
+with the toolset, this same information must be used when building the
+application. So a BSP must include a build configuration file. The
+configuration file is @code{make/custom/BSP.cfg}.
+
+The configuration file is taken into account when building one's
+application using the RTEMS template Makefiles (@code{make/templates}).
+It is strongly advised to use these template Makefiles since they
+encapsulate a number of build rules along with the compile and link
+time options necessary to execute on the target board.
+
+There is a template Makefile provided for each of class of RTEMS
+Makefiles. The purpose of each class of RTEMS Makefile is to:
+
+@itemize @bullet
+@item call recursively the makefiles in the directories beneath
+the current one,
+
+@item build a library, or
+
+@item build an executable.
+
+@end itemize
+
+The following is a shortened and heavily commented version of the
+make customization file for the gen68340 BSP. The original source
+for this file can be found in the @code{make/custom} directory.
+
+@example
+
+# The RTEMS CPU Family and Model
+RTEMS_CPU=m68k
+RTEMS_CPU_MODEL=mcpu32
+
+include $(RTEMS_ROOT)/make/custom/default.cfg
+
+# The name of the BSP directory used for the actual source code.
+# This allows for build variants of the same BSP source.
+RTEMS_BSP_FAMILY=gen68340
+
+# CPU flag to pass to GCC
+CPU_CFLAGS = -mcpu32
+
+# optimization flag to pass to GCC
+CFLAGS_OPTIMIZE_V=-O4 -fomit-frame-pointer
+
+# The name of the start file to be linked with. This file is the first
+# part of the BSP which executes.
+START_BASE=start340
+
+# This make-exe macro is used in template makefiles to build the
+# final executable. Any other commands to follow, just as using
+# objcopy to build a PROM image or converting the executable to binary.
+
+define make-exe
+ $(CC) $(CFLAGS) $(CFLAGS_LD) -o $(basename $@@).exe $(LINK_OBJS)
+ $(NM) -g -n $(basename $@@).exe > $(basename $@@).num
+ $(SIZE) $(basename $@@).exe
+endif
+@end example
+
+@subsection Creating a New BSP Make Customization File
+
+The basic steps for creating a @code{make/custom} file for a new BSP
+are as follows:
+
+@itemize @bullet
+
+@item copy any @code{.cfg} file to @code{BSP.cfg}
+
+@item modify RTEMS_CPU, RTEMS_CPU_MODEL, RTEMS_BSP_FAMILY,
+RTEMS_BSP, CPU_CFLAGS, START_BASE, and make-exe rules.
+
+@end itemize
+
+It is generally easier to copy a @code{make/custom} file from a
+BSP similar to the one being developed.
+
+
diff --git a/doc/bsp_howto/nvmem.t b/doc/bsp_howto/nvmem.t
new file mode 100644
index 0000000000..2c1063b8c3
--- /dev/null
+++ b/doc/bsp_howto/nvmem.t
@@ -0,0 +1,234 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Non-Volatile Memory Driver
+
+The Non-Volatile driver is responsible for providing an
+interface to various types of non-volatile memory. These
+types of memory include, but are not limited to, Flash, EEPROM,
+and battery backed RAM. The capabilities provided
+by this class of device driver are:
+
+@itemize @bullet
+@item Initialize the Non-Volatile Memory Driver
+@item Optional Disable Read and Write Handlers
+@item Open a Particular Memory Partition
+@item Close a Particular Memory Partition
+@item Read from a Particular Memory Partition
+@item Write to a Particular Memory Partition
+@item Erase the Non-Volatile Memory Area
+@end itemize
+
+There is currently only one non-volatile device driver included in the
+RTEMS source tree. The information provided in this chapter
+is based on drivers developed for applications using RTEMS.
+It is hoped that this driver model information can form the
+basis for a standard non-volatile memory driver model that
+can be supported in future RTEMS distribution.
+
+@section Major and Minor Numbers
+
+The @b{major} number of a device driver is its index in the
+RTEMS Device Address Table.
+
+A @b{minor} number is associated with each device instance
+managed by a particular device driver. An RTEMS minor number
+is an @code{unsigned32} entity. Convention calls
+dividing the bits in the minor number down into categories
+that specify an area of non-volatile memory and a partition
+with that area. This results in categories
+like the following:
+
+@itemize @bullet
+
+@item @b{area} - indicates a block of non-volatile memory
+@item @b{partition} - indicates a particular address range with an area
+
+@end itemize
+
+From the above, it should be clear that a single device driver
+can support multiple types of non-volatile memory in a single system.
+The minor number is used to distinguish the types of memory and
+blocks of memory used for different purposes.
+
+@section Non-Volatile Memory Driver Configuration
+
+There is not a standard non-volatile driver configuration table but some
+fields are common across different drivers. The non-volatile memory driver
+configuration table is typically an array of structures with each
+structure containing the information for a particular area of
+non-volatile memory.
+The following is a list of the type of information normally required
+to configure each area of non-volatile memory.
+
+@table @b
+@item memory_type
+is the type of memory device in this area. Choices are battery backed RAM,
+EEPROM, Flash, or an optional user-supplied type. If the user-supplied type
+is configured, then the user is responsible for providing a set of
+routines to program the memory.
+
+@item memory
+is the base address of this memory area.
+
+@item attributes
+is a pointer to a memory type specific attribute block. Some of
+the fields commonly contained in this memory type specific attribute
+structure area:
+
+@table @b
+@item use_protection_algorithm
+is set to TRUE to indicate that the protection (i.e. locking) algorithm
+should be used for this area of non-volatile memory. A particular
+type of non-volatile memory may not have a protection algorithm.
+
+@item access
+is an enumerated type to indicate the organization of the memory
+devices in this memory area. The following is a list of the
+access types supported by the current driver implementation:
+
+@itemize @bullet
+@item simple unsigned8
+@item simple unsigned16
+@item simple unsigned32
+@item simple unsigned64
+@item single unsigned8 at offset 0 in an unsigned16
+@item single unsigned8 at offset 1 in an unsigned16
+@item single unsigned8 at offset 0 in an unsigned32
+@item single unsigned8 at offset 1 in an unsigned32
+@item single unsigned8 at offset 2 in an unsigned32
+@item single unsigned8 at offset 3 in an unsigned32
+@end itemize
+
+@item depth
+is the depth of the progamming FIFO on this particular chip. Some
+chips, particularly EEPROMs, have the same programming algorithm but
+vary in the depth of the amount of data that can be programmed in a single
+block.
+
+@end table
+
+@item number_of_partitions
+is the number of logical partitions within this area.
+
+@item Partitions
+is the address of the table that contains an entry to describe each
+partition in this area. Fields within each element of this
+table are defined as follows:
+
+@table @b
+
+@item offset
+is the offset of this partition from the base address of this area.
+
+@item length
+is the length of this partition.
+
+@end table
+@end table
+
+By dividing an area of memory into multiple partitions, it is possible
+to easily divide the non-volatile memory for different purposes.
+
+@section Initialize the Non-Volatile Memory Driver
+
+At system initialization, the non-volatile memory driver's
+initialization entry point will be invoked. As part of
+initialization, the driver will perform
+whatever initializatin is required on each non-volatile memory area.
+
+The discrete I/O driver may register device names for memory
+partitions of particular interest to the system. Normally this
+will be restricted to the device "/dev/nv_memory" to indicate
+the entire device driver.
+
+@section Disable Read and Write Handlers
+
+Depending on the target's non-volatile memory configuration, it may be
+possible to write to a status register and make the memory area completely
+inaccessible. This is target dependent and beyond the standard capabilities
+of any memory type. The user has the optional capability to provide
+handlers to disable and enable access to a partiticular memory area.
+
+@section Open a Particular Memory Partition
+
+This is the driver open call. Usually this call does nothing other than
+validate the minor number.
+
+With some drivers, it may be necessary to allocate memory when a particular
+device is opened. If that is the case, then this is often the place
+to do this operation.
+
+@section Close a Particular Memory Partition
+
+This is the driver close call. Usually this call does nothing.
+
+With some drivers, it may be necessary to allocate memory when a particular
+device is opened. If that is the case, then this is the place
+where that memory should be deallocated.
+
+@section Read from a Particular Memory Partition
+
+This corresponds to the driver read call. After validating the minor
+number and arguments, this call enables reads from the specified
+memory area by invoking the user supplied "enable reads handler"
+and then reads the indicated memory area. When
+invoked the @code{argument_block} is actually a pointer to the following
+structure type:
+
+@example
+@group
+typedef struct @{
+ rtems_unsigned32 offset;
+ void *buffer;
+ rtems_unsigned32 length;
+ rtems_unsigned32 status;
+@} Non_volatile_memory_Driver_arguments;
+@end group
+@end example
+
+The driver reads @code{length} bytes starting at @code{offset} into
+the partition and places them at @code{buffer}. The result is returned
+in @code{status}.
+
+After the read operation is complete, the user supplied "disable reads handler"
+is invoked to protect the memory area again.
+
+@section Write to a Particular Memory Partition
+
+This corresponds to the driver write call. After validating the minor
+number and arguments, this call enables writes to the specified
+memory area by invoking the "enable writes handler", then unprotecting
+the memory area, and finally actually writing to the indicated memory
+area. When invoked the @code{argument_block} is actually a pointer to
+the following structure type:
+
+@example
+@group
+typedef struct @{
+ rtems_unsigned32 offset;
+ void *buffer;
+ rtems_unsigned32 length;
+ rtems_unsigned32 status;
+@} Non_volatile_memory_Driver_arguments;
+@end group
+@end example
+
+The driver writes @code{length} bytes from @code{buffer} and
+writes them to the non-volatile memory starting at @code{offset} into
+the partition. The result is returned in @code{status}.
+
+After the write operation is complete, the "disable writes handler"
+is invoked to protect the memory area again.
+
+@section Erase the Non-Volatile Memory Area
+
+This is one of the IOCTL functions supported by the I/O control
+device driver entry point. When this IOCTL function is invoked,
+the specified area of non-volatile memory is erased.
+
diff --git a/doc/bsp_howto/rtc.t b/doc/bsp_howto/rtc.t
new file mode 100644
index 0000000000..942c57748c
--- /dev/null
+++ b/doc/bsp_howto/rtc.t
@@ -0,0 +1,188 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Real-Time Clock Driver
+
+@section Introduction
+
+The Real-Time Clock (@b{RTC}) driver is responsible for providing an
+interface to an @b{RTC} device. [NOTE: In this chapter, the abbreviation
+@b{TOD} is used for @b{Time of Day}.] The capabilities provided by this
+driver are:
+
+@itemize @bullet
+@item Set the RTC TOD to RTEMS TOD
+@item Set the RTEMS TOD to the RTC TOD
+@item Get the RTC TOD
+@item Set the RTC TOD to the Specified TOD
+@item Get the Difference Between the RTEMS and RTC TOD
+@end itemize
+
+The reference implementation for a real-time clock driver can
+be found in @code{c/src/lib/libbsp/shared/tod.c}. This driver
+is based on the libchip concept and can be easily configured
+to work with any of the RTC chips supported by the RTC
+chip drivers in the directory @code{c/src/lib/lib/libchip/rtc}.
+There is a README file in this directory for each supported
+RTC chip. Each of these README explains how to configure the
+shared libchip implementation of the RTC driver for that particular
+RTC chip.
+
+The DY-4 DMV177 BSP uses the shared libchip implementation of the RTC
+driver. Its @code{RTC_Table} configuration table can be found in
+@code{c/src/lib/libbsp/powerpc/dmv177/tod/config.c}.
+
+@section Initialization
+
+The @code{rtc_initialize} routine is responsible for initializing the
+RTC chip so it can be used. The shared libchip implementation of this
+driver supports multiple RTCs and bases its initialization order on
+the order the chips are defined in the @code{RTC_Table}. Each chip
+defined in the table may or may not be present on this particular board.
+It is the responsibility of the @code{deviceProbe} to indicate the
+presence of a particular RTC chip. The first RTC found to be present
+is considered the preferred RTC.
+
+In the shared libchip based implementation
+of the driver, the following actions are performed:
+
+@example
+@group
+rtems_device_driver rtc_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor_arg,
+ void *arg
+)
+@{
+ for each RTC configured in RTC_Table
+ if the deviceProbe for this RTC indicates it is present
+ set RTC_Minor to this device
+ set RTC_Present to TRUE
+ break out of this loop
+
+ if RTC_Present is not TRUE
+ return RTEMS_INVALID_NUMBER to indicate that no RTC is present
+
+ register this minor number as the "/dev/rtc"
+
+ perform the deviceInitialize routine for the preferred RTC chip
+
+ for RTCs past this one in the RTC_Table
+ if the deviceProbe for this RTC indicates it is present
+ perform the deviceInitialize routine for this RTC chip
+ register the configured name for this RTC
+@}
+@end group
+@end example
+
+The @code{deviceProbe} routine returns TRUE if the device
+configured by this entry in the @code{RTC_Table} is present.
+This configuration scheme allows one to support multiple versions
+of the same board with a single BSP. For example, if the first
+generation of a board had Vendor A's RTC chip and the second
+generation had Vendor B's RTC chip, RTC_Table could contain
+information for both. The @code{deviceProbe} configured
+for Vendor A's RTC chip would need to return TRUE if the
+board was a first generation one. The @code{deviceProbe}
+routines are very board dependent and must be provided by
+the BSP.
+
+@section setRealTimeToRTEMS
+
+The @code{setRealTimeToRTEMS} routine sets the current RTEMS TOD to that
+of the preferred RTC.
+
+@example
+@group
+void setRealTimeToRTEMS(void)
+@{
+ if no RTCs are present
+ return
+
+ invoke the deviceGetTime routine for the preferred RTC
+ set the RTEMS TOD using rtems_clock_set
+@}
+@end group
+@end example
+
+@section setRealTimeFromRTEMS
+
+The @code{setRealTimeFromRTEMS} routine sets the preferred RTC TOD to the
+current RTEMS TOD.
+
+@example
+@group
+void setRealTimeFromRTEMS(void)
+@{
+ if no RTCs are present
+ return
+
+ obtain the RTEMS TOD using rtems_clock_get
+ invoke the deviceSetTime routine for the preferred RTC
+@}
+@end group
+@end example
+
+@section getRealTime
+
+The @code{getRealTime} returns the preferred RTC TOD to the
+caller.
+
+@example
+@group
+void getRealTime( rtems_time_of_day *tod )
+@{
+ if no RTCs are present
+ return
+
+ invoke the deviceGetTime routine for the preferred RTC
+@}
+@end group
+@end example
+
+@section setRealTime
+
+The @code{setRealTime} routine sets the preferred RTC TOD to the
+TOD specified by the caller.
+
+@example
+@group
+void setRealTime( rtems_time_of_day *tod )
+@{
+ if no RTCs are present
+ return
+
+ invoke the deviceSetTime routine for the preferred RTC
+@}
+@end group
+@end example
+
+@section checkRealTime
+
+The @code{checkRealTime} routine returns the number of seconds
+difference between the RTC TOD and the current RTEMS TOD.
+
+@example
+@group
+int checkRealTime( void )
+@{
+ if no RTCs are present
+ return -1
+
+
+ obtain the RTEMS TOD using rtems_clock_get
+ get the TOD from the preferred RTC using the deviceGetTime routine
+
+ convert the RTEMS TOD to seconds
+ convert the RTC TOD to seconds
+
+ return the RTEMS TOD in seconds - RTC TOD in seconds
+@}
+@end group
+@end example
+
diff --git a/doc/bsp_howto/shmsupp.t b/doc/bsp_howto/shmsupp.t
new file mode 100644
index 0000000000..3c087ca6cd
--- /dev/null
+++ b/doc/bsp_howto/shmsupp.t
@@ -0,0 +1,269 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Shared Memory Support Driver
+
+The Shared Memory Support Driver is responsible for providing glue
+routines and configuration information required by the Shared
+Memory Multiprocessor Communications Interface (MPCI). The
+Shared Memory Support Driver tailors the portable Shared
+Memory Driver to a particular target platform.
+
+This driver is only required in shared memory multiprocessing
+systems that use the RTEMS mulitprocessing support. For more
+information on RTEMS multiprocessing capabilities and the
+MPCI, refer to the @b{Multiprocessing Manager} chapter
+of the @b{RTEMS Application C User's Guide}.
+
+@section Shared Memory Configuration Table
+
+The Shared Memory Configuration Table is defined in the following
+structure:
+
+@example
+@group
+typedef volatile rtems_unsigned32 vol_u32;
+
+typedef struct @{
+ vol_u32 *address; /* write here for interrupt */
+ vol_u32 value; /* this value causes interrupt */
+ vol_u32 length; /* for this length (0,1,2,4) */
+@} Shm_Interrupt_information;
+
+struct shm_config_info @{
+ vol_u32 *base; /* base address of SHM */
+ vol_u32 length; /* length (in bytes) of SHM */
+ vol_u32 format; /* SHM is big or little endian */
+ vol_u32 (*convert)(); /* neutral conversion routine */
+ vol_u32 poll_intr; /* POLLED or INTR driven mode */
+ void (*cause_intr)( rtems_unsigned32 );
+ Shm_Interrupt_information Intr; /* cause intr information */
+@};
+
+typedef struct shm_config_info shm_config_table;
+@end group
+@end example
+
+where the fields are defined as follows:
+
+@table @b
+@item base
+is the base address of the shared memory buffer used to pass
+messages between the nodes in the system.
+
+@item length
+is the length (in bytes) of the shared memory buffer used to pass
+messages between the nodes in the system.
+
+@item format
+is either SHM_BIG or SHM_LITTLE to indicate that the neutral format
+of the shared memory area is big or little endian. The format
+of the memory should be chosen to match most of the inter-node traffic.
+
+@item convert
+is the address of a routine which converts from native format to
+neutral format. Ideally, the neutral format is the same as the
+native format so this routine is quite simple.
+
+@item poll_intr
+is either INTR_MODE or POLLED_MODE to indicate how the node will be
+informed of incoming messages.
+
+@item cause_intr
+
+@item Intr
+is the information required to cause an interrupt on a node. This
+structure contains the following fields:
+@table @b
+@item address
+is the address to write at to cause an interrupt on that node.
+For a polled node, this should be NULL.
+
+@item value
+is the value to write to cause an interrupt.
+
+@item length
+is the length of the entity to write on the node to cause an interrupt.
+This can be 0 to indicate polled operation, 1 to write a byte, 2 to
+write a sixteen-bit entity, and 4 to write a thirty-two bit entity.
+@end table
+@end table
+
+@section Primitives
+
+@subsection Convert Address
+
+The @code{Shm_Convert_address} is responsible for converting an address
+of an entity in the shared memory area into the address that should be
+used from this node. Most targets will simply return the address
+passed to this routine. However, some target boards will have a special
+window onto the shared memory. For example, some VMEbus boards have
+special address windows to access addresses that are normally reserved
+in the CPU's address space.
+
+@example
+@group
+void *Shm_Convert_address( void *address )
+@{
+ return the local address version of this bus address
+@}
+@end group
+@end example
+
+@subsection Get Configuration
+
+The @code{Shm_Get_configuration} routine is responsible for filling in the
+Shared Memory Configuration Table passed to it.
+
+@example
+@group
+void Shm_Get_configuration(
+ rtems_unsigned32 localnode,
+ shm_config_table **shmcfg
+)
+@{
+ fill in the Shared Memory Configuration Table
+@}
+@end group
+@end example
+
+@subsection Locking Primitives
+
+This is a collection of routines that are invoked by the portable
+part of the Shared Memory Driver to manage locks in the shared
+memory buffer area. Accesses to the shared memory must be
+atomic. Two nodes in a multiprocessor system must not be manipulating
+the shared data structures simultaneously. The locking primitives
+are used to insure this.
+
+To avoid deadlock, local processor interrupts should be disabled the entire
+time the locked queue is locked.
+
+The locking primitives operate on the lock
+@code{field} of the @code{Shm_Locked_queue_Control}
+data structure. This structure is defined as follows:
+
+@example
+@group
+typedef struct @{
+ vol_u32 lock; /* lock field for this queue */
+ vol_u32 front; /* first envelope on queue */
+ vol_u32 rear; /* last envelope on queue */
+ vol_u32 owner; /* receiving (i.e. owning) node */
+@} Shm_Locked_queue_Control;
+@end group
+@end example
+
+where each field is defined as follows:
+
+@table @b
+@item lock
+is the lock field. Every node in the system must agree on how this
+field will be used. Many processor families provide an atomic
+"test and set" instruction that is used to manage this field.
+
+@item front
+is the index of the first message on this locked queue.
+
+@item rear
+is the index of the last message on this locked queue.
+
+@item owner
+is the node number of the node that currently has this structure locked.
+
+@end table
+
+@subsubsection Initializing a Shared Lock
+
+The @code{Shm_Initialize_lock} routine is responsible for
+initializing the lock field. This routines usually is implemented
+as follows:
+
+@example
+@group
+void Shm_Initialize_lock(
+ Shm_Locked_queue_Control *lq_cb
+)
+@{
+ lq_cb->lock = LQ_UNLOCKED;
+@}
+@end group
+@end example
+
+@subsubsection Acquiring a Shared Lock
+
+The @code{Shm_Lock} routine is responsible for
+acquiring the lock field. Interrupts should be
+disabled while that lock is acquired. If the lock
+is currently unavailble, then the locking routine
+should delay a few microseconds to allow the other
+node to release the lock. Doing this reduces bus contention
+for the lock. This routines usually is implemented as follows:
+
+@example
+@group
+void Shm_Lock(
+ Shm_Locked_queue_Control *lq_cb
+)
+@{
+ disable processor interrupts
+ set Shm_isrstat to previous interrupt disable level
+
+ while ( TRUE ) @{
+ atomically attempt to acquire the lock
+ if the lock was acquired
+ return
+ delay some small period of time
+ @}
+@}
+@end group
+@end example
+
+@subsubsection Releasing a Shared Lock
+
+The @code{Shm_Unlock} routine is responsible for
+releasing the lock field and reenabling processor
+interrupts. This routines usually is implemented as follows:
+
+@example
+@group
+void Shm_Unlock(
+ Shm_Locked_queue_Control *lq_cb
+)
+@{
+ set the lock to the unlocked value
+ reenable processor interrupts to their level prior
+ to the lock being acquired. This value was saved
+ in the global variable Shm_isrstat
+@}
+@end group
+@end example
+
+@section Installing the MPCI ISR
+
+The @code{Shm_setvec} is invoked by the portable portion
+of the shared memory to install the interrupt service routine
+that is invoked when an incoming message is announced. Some
+target boards support an interprocessor interrupt or mailbox
+scheme and this is where the ISR for that interrupt would be
+installed.
+
+On an interrupt driven node, this routine would be implemented
+as follows:
+
+@example
+@group
+void Shm_setvec( void )
+@{
+ install the interprocessor communications ISR
+@}
+@end group
+@end example
+
+On a polled node, this routine would be empty.
+
diff --git a/doc/bsp_howto/support.t b/doc/bsp_howto/support.t
new file mode 100644
index 0000000000..f9548d2b96
--- /dev/null
+++ b/doc/bsp_howto/support.t
@@ -0,0 +1,257 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Miscellaneous Support Files
+
+@section GCC Compiler Specifications File
+
+The file @code{bsp_specs} defines the start files and libraries
+that are always used with this BSP. The format of this file
+is admittedly cryptic and this document will make no attempt
+to explain it completely. Below is the @code{bsp_specs}
+file from the PowerPC psim BSP:
+
+@example
+@group
+%rename cpp old_cpp
+%rename lib old_lib
+%rename endfile old_endfile
+%rename startfile old_startfile
+%rename link old_link
+
+*cpp:
+%(old_cpp) %@{qrtems: -D__embedded__@} -Asystem(embedded)
+
+*lib:
+%@{!qrtems: %(old_lib)@} %@{qrtems: --start-group \
+%@{!qrtems_debug: -lrtemsall@} %@{qrtems_debug: -lrtemsall_g@} \
+-lc -lgcc --end-group ecrtn%O%s \
+%@{!qnolinkcmds: -T linkcmds%s@}@}
+
+*startfile:
+%@{!qrtems: %(old_startfile)@} %@{qrtems: ecrti%O%s \
+%@{!qrtems_debug: startsim.o%s@} \
+%@{qrtems_debug: startsim_g.o%s@}@}
+
+*link:
+%@{!qrtems: %(old_link)@} %@{qrtems: -Qy -dp -Bstatic \
+-T linkcmds%s -e _start -u __vectors@}
+@end group
+@end example
+
+The first section of this file renames the built-in definition of
+some specification variables so they can be augmented without
+embedded their original definition. The subsequent sections
+specify what behavior is expected when the @code{-qrtems} or
+@code{-qrtems_debug} option is specified.
+
+The @code{*cpp} definition specifies that when @code{-qrtems}
+is specified, predefine the preprocessor symbol @code{__embedded__}.
+
+The @code{*lib} section insures that the RTEMS library, BSP specific
+linker script, gcc support library, and the EABI specific @code{ecrtn}
+file are used.
+
+The @code{*startfile} section specifies that the BSP specific file
+@code{startsim.o} will be used instead of @code{crt0.o}. In addition,
+the EABI specific file @code{ecrti.o} will be linked in with the
+executable.
+
+The @code{*link} section specifies the arguments that will be passed to
+the linker.
+
+The format of this file is specific to the GNU Compiler Suite. The
+argument used to override and extend the compiler built-in specifications
+is relatively new to the toolset. The @code{-specs} option is present
+in all @code{egcs} distributions and @code{gcc} distributions starting
+with version 2.8.0.
+
+@section README Files
+
+Most BSPs provide one or more @code{README} files. Generally, there
+is a @code{README} file at the top of the BSP source. This file
+describes the board and its hardware configuration, provides vendor
+information, local configuration information, information on downloading
+code to the board, debugging, etc.. The intent of this
+file is to help someone begin to use the BSP faster.
+
+A @code{README} file in a BSP subdirectory typically explains something
+about the contents of that subdirectory in greater detail. For example,
+it may list the documentation available for a particular peripheral
+controller and how to obtain that documentation. It may also explain some
+particularly cryptic part of the software in that directory or provide
+rationale on the implementation.
+
+@section times
+
+This file contains the results of the RTEMS Timing Test Suite. It is
+in a standard format so that results from one BSP can be easily compared
+with those of another target board.
+
+If a BSP supports multiple variants, then there may be multiple @code{times}
+files. Usually these are named @code{times.VARIANTn}.
+
+@section Tools Subdirectory
+
+Some BSPs provide additional tools that aid in using the target board.
+These tools run on the development host and are built as part of building
+the BSP. Most common is a script to automate running the RTEMS Test Suites
+on the BSP. Examples of this include:
+
+@itemize @bullet
+
+@item @code{powerpc/psim} includes scripts to ease use of the simulator
+
+@item @code{m68k/mvme162} includes a utility to download across the
+VMEbus into target memory if the host is a VMEbus board in the same
+chasis.
+
+@item @code{unix/posix} includes scripts to run the tests automatically
+on this BSP.
+
+@end itemize
+
+@section bsp.h Include File
+
+The file @code{include/bsp.h} contains prototypes and definitions
+specific to this board. Every BSP is required to provide a @code{bsp.h}.
+The best approach to writing a @code{bsp.h} is copying an existing one
+as a starting point.
+
+Many @code{bsp.h} files provide prototypes of variables defined
+in the linker script (@code{linkcmds}).
+
+There are a number of fields in this file that are used only by the
+RTEMS Test Suites. The following is a list of these:
+
+@itemize @bullet
+@item @code{MAX_LONG_TEST_DURATION} - the longest length of time a
+"long running" test should run.
+
+@item @code{MAX_SHORT_TEST_DURATION} - the longest length of time a
+"short running" test should run.
+
+@item @code{MUST_WAIT_FOR_INTERRUPT} - modifies behavior of @code{tm27}.
+
+@item @code{Install_tm27_vector} - installs the interrupt service
+routine for the Interrupt Benchmark Test (@code{tm27}).
+
+@item @code{Cause_tm27_intr} - generates the interrupt source
+used in the Interrupt Benchmark Test (@code{tm27}).
+
+@item @code{Clear_tm27_intr} - clears the interrupt source
+used in the Interrupt Benchmark Test (@code{tm27}).
+
+@item @code{Lower_tm27_intr} - lowers the interrupt mask so the
+interrupt source used in the Interrupt Benchmark Test (@code{tm27})
+can generate a nested interrupt.
+
+@end itemize
+
+@section Calling Overhead File
+
+The file @code{include/coverhd.h} contains the overhead associated
+with invoking each directive. This overhead consists of the execution
+time required to package the parameters as well as to execute the "jump to
+subroutine" and "return from subroutine" sequence. The intent of this
+file is to help separate the calling overhead from the actual execution
+time of a directive. This file is only used by the tests in the
+RTEMS Timing Test Suite.
+
+The numbers in this file are obtained by running the "Timer Overhead"
+@code{tmoverhd} test. The numbers in this file may be 0 and no
+overhead is subtracted from the directive execution times reported by
+the Timing Suite.
+
+@section sbrk() Implementation
+
+If the BSP wants to dynamically extend the heap used by the
+C Library memory allocation routines (i.e. @code{malloc} family),
+then this routine must be functional. The following is the
+prototype for this routine:
+
+@example
+void * sbrk(size_t increment)
+@end example
+
+The @code{increment} amount is based upon the @code{sbrk_amount}
+parameter passed to the @code{RTEMS_Malloc_Initialize} during system
+initialization.
+See @ref{Initialization Code RTEMS Pretasking Callback} for more
+information.
+
+There is a default implementation which returns an error to indicate
+that the heap can not be extended. This implementation can be
+found in @code{c/src/lib/libbsp/shared/sbrk.c}. Many of the BSPs
+use this shared implementation. In order to use this implementation,
+the file @code{Makefile.am} in the BSP's @code{startup} directory
+must be modified so that the @code{$VPATH} variable searches
+both the @code{startup} directory and the shared directory. The following
+illustates the @code{VPATH} setting in the PowerPC psim BSP's
+@code{startup/Makefile.am}:
+
+@example
+VPATH = @@srcdir@@:@@srcdir@@/../../../shared
+@end example
+
+This instructs make to look in all of the directories in the @code{VPATH}
+for the source files. The directories will be examined in the order
+they are specified.
+
+@section bsp_cleanup() - Cleanup the Hardware
+
+The @code{bsp_cleanup()} is the last C code invoked. Most of the BSPs
+use the same shared version of @code{bsp_cleanup()} that does nothing.
+This implementation is located in the following file:
+
+@example
+c/src/lib/libbsp/shared/bspclean.c
+@end example
+
+The @code{bsp_cleanup()} routine can be used to return to a ROM monitor,
+insure that interrupt sources are disabled, etc.. This routine is the
+last place to insure a clean shutdown of the hardware.
+
+@section set_vector() - Install an Interrupt Vector
+
+The @code{set_vector} routine is responsible for installing an interrupt
+vector. It invokes the support routines necessary to install an
+interrupt handler as either a "raw" or an RTEMS interrupt handler. Raw
+handlers bypass the RTEMS interrupt structure and are responsible for
+saving and restoring all their own registers. Raw handlers are useful
+for handling traps, debug vectors, etc..
+
+The @code{set_vector} routine is a central place to perform
+interrupt controller manipulation and encapsulate that information.
+It is usually implemented as follows:
+
+@example
+@group
+rtems_isr_entry set_vector( /* returns old vector */
+ rtems_isr_entry handler, /* isr routine */
+ rtems_vector_number vector, /* vector number */
+ int type /* RTEMS or RAW intr */
+)
+@{
+ if the type is RAW
+ install the raw vector
+ else
+ use rtems_interrupt_catch to install the vector
+
+ perform any interrupt controller necessary to unmask
+ the interrupt source
+
+ return the previous handler
+@}
+@end group
+@end example
+
+
+@b{NOTE:} @code{set_vector} is provided by the majority of BSPs but
+not all. In particular, the i386 BSPs use a different scheme.
+
diff --git a/doc/bsp_howto/target.t b/doc/bsp_howto/target.t
new file mode 100644
index 0000000000..29bd69ff26
--- /dev/null
+++ b/doc/bsp_howto/target.t
@@ -0,0 +1,212 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Target Dependent Files
+
+RTEMS has a multi-layered approach to portability. This is done to
+maximize the amount of software that can be reused. Much of the
+RTEMS source code can be reused on all RTEMS platforms. Other parts
+of the executive are specific to hardware in some sense.
+RTEMS classifies target dependent code based upon its dependencies
+into one of the following categories.
+
+@itemize @bullet
+@item CPU dependent
+@item Board dependent
+@item Peripheral dependent
+@end itemize
+
+@section CPU Dependent
+
+This class of code includes the foundation
+routines for the executive proper such as the context switch and
+the interrupt subroutine implementations. Sources for the supported
+processor families can be found in @code{cpukit/score/cpu}.
+A good starting point for a new family of processors is the
+@code{no_cpu} directory, which holds both prototypes and
+descriptions of each needed CPU dependent function.
+
+CPU dependent code is further subcategorized if the implementation is
+dependent on a particular CPU model. For example, the MC68000 and MC68020
+processors are both members of the m68k CPU family but there are significant
+differences between these CPU models which RTEMS must take into account.
+
+@section Board Dependent
+
+This class of code provides the most specific glue between RTEMS and
+a particular board. This code is represented by the Board Support Packages
+and associated Device Drivers. Sources for the BSPs included in the
+RTEMS distribution are located in the directory @code{c/src/lib/libbsp}.
+The BSP source directory is further subdivided based on the CPU family
+and BSP.
+
+Some BSPs may support multiple board models within a single board family.
+This is necessary when the board supports multiple variants on a
+single base board. For example, the Motorola MVME162 board family has a
+fairly large number of variations based upon the particular CPU model
+and the peripherals actually placed on the board.
+
+@section Peripheral Dependent
+
+This class of code provides a reusable library of peripheral device
+drivers which can be tailored easily to a particular board. The
+libchip library is a collection of reusable software objects that
+correspond to standard controllers. Just as the hardware engineer
+chooses a standard controller when designing a board, the goal of
+this library is to let the software engineer do the same thing.
+
+The source code for the reusable peripheral driver library may be found
+in the directory @code{c/src/lib/libchip}. The source code is further
+divided based upon the class of hardware. Example classes include serial
+communications controllers, real-time clocks, non-volatile memory, and
+network controllers.
+
+@section Questions to Ask
+
+When evaluating what is required to support RTEMS applications on
+a particular target board, the following questions should be asked:
+
+@itemize @bullet
+
+@item Does a BSP for this board exist?
+
+@item Does a BSP for a similar board exists?
+
+@item Is the board's CPU supported?
+
+@end itemize
+
+If there is already a BSP for the board, then things may already be ready
+to start developing application software. All that remains is to verify
+that the existing BSP provides device drivers for all the peripherals
+on the board that the application will be using. For example, the application
+in question may require that the board's Ethernet controller be used and
+the existing BSP may not support this.
+
+If the BSP does not exist and the board's CPU model is supported, then
+examine the reusable chip library and existing BSPs for a close match.
+Other BSPs and libchip provide starting points for the development
+of a new BSP. It is often possible to copy existing components in
+the reusable chip library or device drivers from BSPs from different
+CPU families as the starting point for a new device driver.
+This will help reduce the development effort required.
+
+If the board's CPU family is supported but the particular CPU model on
+that board is not, then the RTEMS port to that CPU family will have to
+be augmented. After this is done, development of the new BSP can proceed.
+
+Otherwise both CPU dependent code and the BSP will have to be written.
+
+This type of development often requires specialized skills. If
+you need help in making these modifications to RTEMS, please
+consider using one of the RTEMS Service Providers. The current
+list of these is at @uref{@value{RTEMSHTTPURL}/support.html}.
+
+@section CPU Dependent Executive Files
+
+The CPU dependent files in the RTEMS executive source code are found
+in the following directory:
+
+@example
+cpukit/score/cpu/@i{CPU}
+@end example
+
+where @i{CPU} is replaced with the CPU family name.
+
+Within each CPU dependent directory inside the executive proper is a
+file named @code{@i{CPU}.h} which contains information about each of the
+supported CPU models within that family.
+
+@section CPU Dependent Support Files
+
+The CPU dependent support files contain routines which aid in the development
+of applications using that CPU family. For example, the support routines
+may contain standard trap handlers for alignment or floating point exceptions
+or device drivers for peripheral controllers found on the CPU itself.
+This class of code may be found in the following directory:
+
+@example
+c/src/lib/libcpu/@i{CPU}
+@end example
+
+CPU model dependent support code is found in the following directory:
+
+@example
+c/src/lib/libcpu/@i{CPU}/@i{CPU_MODEL}
+@end example
+
+@section Board Support Package Structure
+
+The BSPs are all under the c/src/lib/libbsp directory. Below this
+directory, there is a subdirectory for each CPU family. Each BSP
+is found under the subdirectory for the appropriate processor
+family (m68k, powerpc, etc.). In addition, there is source code
+available which may be shared across all BSPs regardless of
+the CPU family or just across BSPs within a single CPU family. This
+results in a BSP using the following directories:
+
+@example
+c/src/lib/libbsp/shared
+c/src/lib/libbsp/@i{CPU}/shared
+c/src/lib/libbsp/@i{CPU}/@i{BSP}
+@end example
+
+Under each BSP specific directory, there is a collection of
+subdirectories. For commonly provided functionality, the BSPs
+follow a convention on subdirectory naming. The following list
+describes the commonly found subdirectories under each BSP.
+
+@itemize @bullet
+
+@item @b{console}:
+is technically the serial driver for the BSP rather
+than just a console driver, it deals with the board
+UARTs (i.e. serial devices).
+
+@item @b{clock}:
+support for the clock tick -- a regular time basis to the kernel.
+
+@item @b{timer}:
+support of timer devices.
+
+@item @b{rtc}:
+support for the hardware real-time clock.
+
+@item @b{nvmem}:
+support for non-volatile memory such as EEPROM or Flash.
+
+@item @b{network}:
+the Ethernet driver.
+
+@item @b{shmsupp}:
+support of shared memory driver MPCI layer in a multiprocessor system,
+
+@item @b{include}:
+include files for this BSP.
+
+@item @b{wrapup}:
+bundles all the components necessary to construct the BSP library.
+
+@end itemize
+
+The build order of the BSP is determined by the Makefile structure.
+This structure is discussed in more detail in the @ref{Makefiles}
+chapter.
+
+@b{NOTE:} This manual refers to the gen68340 BSP for numerous concrete
+examples. You should have a copy of the gen68340 BSP available while
+reading this piece of documentation. This BSP is located in the
+following directory:
+
+@example
+c/src/lib/libbsp/m68k/gen68340
+@end example
+
+Later in this document, the $BSP340_ROOT label will be used
+to refer to this directory.
+
diff --git a/doc/bsp_howto/timer.t b/doc/bsp_howto/timer.t
new file mode 100644
index 0000000000..b9752f53ef
--- /dev/null
+++ b/doc/bsp_howto/timer.t
@@ -0,0 +1,121 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Timer Driver
+
+The timer driver is primarily used by the RTEMS Timing Tests.
+This driver provides as accurate a benchmark timer as possible.
+It typically reports its time in microseconds, CPU cycles, or
+bus cycles. This information can be very useful for determining
+precisely what pieces of code require optimization and to measure the
+impact of specific minor changes.
+
+The gen68340 BSP also uses the Timer Driver to support a high performance
+mode of the on-CPU UART.
+
+@section Benchmark Timer
+
+The RTEMS Timing Test Suite requires a benchmark timer. The
+RTEMS Timing Test Suite is very helpful for determining
+the performance of target hardware and comparing its performance
+to that of other RTEMS targets.
+
+This section describes the routines which are assumed to exist by
+the RTEMS Timing Test Suite. The names used are @b{EXACTLY} what
+is used in the RTEMS Timing Test Suite so follow the naming convention.
+
+@subsection Timer_initialize
+
+Initialize the timer source.
+
+@example
+void Timer_initialize(void)
+@{
+ initialize the benchmark timer
+@}
+@end example
+
+@subsection Read_timer
+
+The @code{Read_timer} routine
+returns the number of benchmark time units (typically microseconds)
+that have elapsed since the last call to @code{Timer_initialize}.
+
+@example
+int Read_timer(void)
+@{
+ stop time = read the hardware timer
+ if the subtract overhead feature is enabled
+ subtract overhead from stop time
+ return the stop time
+@}
+@end example
+
+Many implementations of this routine subtract the overhead required
+to initialize and read the benchmark timer. This makes the times reported
+more accurate.
+
+Some implementations report 0 if the harware timer value change is
+sufficiently small. This is intended to indicate that the execution time
+is below the resolution of the timer.
+
+@subsection An Empty Function
+
+This routine is invoked by the RTEMS Timing Test Suite to measure
+the cost of invoking a subroutine.
+
+@example
+rtems_status_code Empty_function (void)
+@{
+ return RTEMS_SUCCESSFUL;
+@}
+@end example
+
+@subsection Set_find_average_overhead
+
+This routine is invoked by the "Check Timer" (@code{tmck}) test in the
+RTEMS Timing Test Suite. It makes the @code{Read_timer}
+routine NOT subtract the overhead required
+to initialize and read the benchmark timer. This is used
+by the @code{tmoverhd} test to determine the overhead
+required to initialize and read the timer.
+
+@example
+void Set_find_average_overhead(rtems_boolean find_flag)
+@{
+ disable the subtract overhead feature
+@}
+@end example
+
+The @code{Timer_driver_Find_average_overhead} variable is usually
+used to indicate the state of the "subtract overhead feature".
+
+@section gen68340 UART FIFO Full Mode
+
+The gen68340 BSP is an example of the use of the timer to support the UART
+input FIFO full mode (FIFO means First In First Out and roughly means
+buffer). This mode consists in the UART raising an interrupt when n
+characters have been received (@i{n} is the UART's FIFO length). It results
+in a lower interrupt processing time, but the problem is that a scanf
+primitive will block on a receipt of less than @i{n} characters. The solution
+is to set a timer that will check whether there are some characters
+waiting in the UART's input FIFO. The delay time has to be set carefully
+otherwise high rates will be broken:
+
+@itemize @bullet
+
+@item if no character was received last time the interrupt subroutine was
+entered, set a long delay,
+
+@item otherwise set the delay to the delay needed for @i{n} characters
+receipt.
+
+@end itemize
+
+
+
diff --git a/doc/common/.cvsignore b/doc/common/.cvsignore
new file mode 100644
index 0000000000..769af62338
--- /dev/null
+++ b/doc/common/.cvsignore
@@ -0,0 +1,3 @@
+setup.texi
+rtems.texi
+rtems.sed
diff --git a/doc/common/cpright.texi b/doc/common/cpright.texi
new file mode 100644
index 0000000000..8a93b9eefe
--- /dev/null
+++ b/doc/common/cpright.texi
@@ -0,0 +1,40 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c The following puts a space somewhere on an otherwise empty page so we
+@c can force the copyright description onto a left hand page.
+@c
+
+@tex
+{\parskip=0pt \hfill On-Line Applications Research Corporation\par \hfill
+\TeX{}info \texinfoversion\par }
+@end tex
+
+@vskip 0pt plus 1filll
+COPYRIGHT @copyright{} 1988 - 2003.@*
+On-Line Applications Research Corporation (OAR).@*
+
+The authors have used their best efforts in preparing
+this material. These efforts include the development, research,
+and testing of the theories and programs to determine their
+effectiveness. No warranty of any kind, expressed or implied,
+with regard to the software or the material contained in this
+document is provided. No liability arising out of the
+application or use of any product described in this document is
+assumed. The authors reserve the right to revise this material
+and to make changes from time to time in the content hereof
+without obligation to notify anyone of such revision or changes.
+
+The RTEMS Project is hosted at @uref{http://www.rtems.com}.
+Any inquiries concerning RTEMS, its related support
+components, its documentation, or any custom services
+for RTEMS should be directed to the contacts listed on
+that site. A current list of RTEMS Support Providers
+is at @uref{http://www.rtems.com/support.html}.
+
diff --git a/doc/common/rtems.texi.in b/doc/common/rtems.texi.in
new file mode 100644
index 0000000000..a309204001
--- /dev/null
+++ b/doc/common/rtems.texi.in
@@ -0,0 +1,17 @@
+@c
+@c $Id$
+@c
+
+@set RTEMSHTTPSITE www.rtems.com
+@set RTEMSUSERS rtems-users@@rtems.com
+@set RTEMSUSERSSUBSCRIBE rtems-users-subscribe@@rtems.com
+@set RTEMSSNAPSHOTS rtems-snapshots@@rtems.com
+@set RTEMSSNAPSHOTSSUBSCRIBE rtems-snapshots-subscribe@@rtems.com
+@set RTEMSBUGS rtems-bugs@@rtems.com
+@set RTEMSFTPURL ftp://www.rtems.com
+@set RTEMSHTTPURL http://www.rtems.com
+@set RTEMSGNATS @value{RTEMSHTTPURL}/cgi-bin/gnatsweb.pl
+@set RTEMSPREFIX @RTEMSPREFIX@
+@set RTEMSAPI @RTEMSAPI@
+@set RTEMSRPMPREFIX @RTEMSRPMPREFIX@
+@set RTEMSRPMGROUP @RTEMSRPMGROUP@
diff --git a/doc/common/setup.texi b/doc/common/setup.texi
new file mode 100644
index 0000000000..b41cd63cb9
--- /dev/null
+++ b/doc/common/setup.texi
@@ -0,0 +1,63 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c The following determines which set of the tables and figures we will use.
+@c We default to ASCII but if available TeX or HTML versions will
+@c be used instead.
+@c
+
+@set use-ascii
+@c @clear use-html
+@c @clear use-tex
+
+@iftex
+@clear use-ascii
+@clear use-html
+@set use-tex
+@end iftex
+
+@ifhtml
+@clear use-ascii
+@clear use-tex
+@set use-html
+@end ifhtml
+
+@c
+@c The following variable says to use texinfo or html for the two column
+@c texinfo tables. For somethings the format does not look good in html.
+@c With our adjustment to the left column in TeX, it nearly always looks
+@c good printed.
+@c
+@ifset use-ascii
+@set use-texinfo-tables
+@end ifset
+@ifset use-tex
+@set use-texinfo-tables
+@end ifset
+@ifset use-html
+@clear use-texinfo-tables
+@end ifset
+
+@c
+@c Custom whitespace adjustments. We could fiddle a bit more.
+@c
+@tex
+\global\parindent 0in
+\global\chapheadingskip = 15pt plus 4pt minus 2pt
+\global\secheadingskip = 12pt plus 4pt minus 2pt
+\global\subsecheadingskip = 9pt plus 4pt minus 2pt
+\global\hbadness = 10000
+\global\tolerance = 6000
+\global\tableindent = 1.5in
+\global\itemindent = 0.5in
+
+@ifclear smallbook
+\global\parskip 6pt plus 1pt
+@end ifclear
+@end tex
diff --git a/doc/common/timemac.texi b/doc/common/timemac.texi
new file mode 100644
index 0000000000..7c327a6075
--- /dev/null
+++ b/doc/common/timemac.texi
@@ -0,0 +1,36 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+@c
+@c Macros to help with the tables in this file
+@c
+
+@tex
+\global\advance \smallskipamount by -4pt
+
+\global\def\rtemstimetable{
+\vrule\strut##&
+\hbox to 3.0in{\enskip##\hfil}&
+\hbox to 0.75in{\enskip##\hfil}&
+\vrule##\cr
+\noalign{\hrule}
+}
+
+\global\def\rtemsendtimetable{}
+\global\def\rtemsonecase#1#2{
+& \bf #1\hfil& #2 & \cr\noalign{\hrule}
+}
+
+\global\def\rtemsdirective#1{
+& \bf #1 \hfil& & \cr\noalign{\hrule}
+}
+
+\global\def\rtemscase#1#2{
+& \hskip 0.3in #1\hfil& #2 & \cr\noalign{\hrule}
+}
+
+@end tex
diff --git a/doc/common/timetbl.t b/doc/common/timetbl.t
new file mode 100644
index 0000000000..32df2a898c
--- /dev/null
+++ b/doc/common/timetbl.t
@@ -0,0 +1,1330 @@
+@c ****** This comment is here to remind you not to edit the timetbl.t
+@c ****** in any directory but common.
+@c
+@c Time Table Template
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifset use-tex
+@sp 1
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\span\rtemstimetable
+\rtemsonecase{No Floating Point Contexts}{RTEMS_NO_FP_CONTEXTS}
+\rtemsdirective{Floating Point Contexts}
+\rtemscase{restore first FP task}{RTEMS_RESTORE_1ST_FP_TASK}
+\rtemscase{save initialized, restore initialized}{RTEMS_SAVE_INIT_RESTORE_INIT}
+\rtemscase{save idle, restore initialized}{RTEMS_SAVE_IDLE_RESTORE_INIT}
+\rtemscase{save idle, restore idle}{RTEMS_SAVE_IDLE_RESTORE_IDLE}
+\rtemsendtimetable
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-ascii
+@ifinfo
+@itemize @bullet
+@item No Floating Point Contexts
+@itemize -
+@item only case: RTEMS_NO_FP_CONTEXTS
+@end itemize
+@item Floating Point Contexts
+@itemize -
+@item restore first FP task: RTEMS_RESTORE_1ST_FP_TASK
+@item save initialized, restore initialized: RTEMS_SAVE_INIT_RESTORE_INIT
+@item save idle, restore initialized: RTEMS_SAVE_IDLE_RESTORE_INIT
+@item save idle, restore idle: RTEMS_SAVE_IDLE_RESTORE_INIT
+@end itemize
+@end itemize
+@end ifinfo
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=2 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=left><STRONG>No Floating Point Contexts</STRONG></TD>
+ <TD ALIGN=center>RTEMS_NO_FP_CONTEXTS</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>Floating Point Contexts</TR>
+ <TR><TD ALIGN=left><dd>restore first FP task</TD>
+ <TD ALIGN=center>RTEMS_RESTORE_1ST_FP_TASK</TD>
+ <TR><TD ALIGN=left><dd>save initialized, restore initialized</TD>
+ <TD ALIGN=center>RTEMS_SAVE_INIT_RESTORE_INIT</TD>
+ <TR><TD ALIGN=left><dd>save idle, restore initialized</TD>
+ <TD ALIGN=center>RTEMS_SAVE_IDLE_RESTORE_INIT</TD>
+ <TR><TD ALIGN=left><dd>save idle, restore idle</TD>
+ <TD ALIGN=center>RTEMS_SAVE_IDLE_RESTORE_IDLE</TD>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+@section Directive Times
+
+This sections is divided into a number of
+subsections, each of which contains a table listing the
+execution times of that manager's directives.
+
+@page
+@section Task Manager
+
+@ifset use-tex
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\span\rtemstimetable
+\rtemsonecase{TASK\_CREATE}{RTEMS_TASK_CREATE_ONLY}
+\rtemsonecase{TASK\_IDENT}{RTEMS_TASK_IDENT_ONLY}
+\rtemsonecase{TASK\_START}{RTEMS_TASK_START_ONLY}
+\rtemsdirective{TASK\_RESTART}
+\rtemscase{calling task}{RTEMS_TASK_RESTART_CALLING_TASK}
+\rtemscase{suspended task -- returns to caller}
+ {RTEMS_TASK_RESTART_SUSPENDED_RETURNS_TO_CALLER}
+\rtemscase{blocked task -- returns to caller}
+ {RTEMS_TASK_RESTART_BLOCKED_RETURNS_TO_CALLER}
+\rtemscase{ready task -- returns to caller}
+ {RTEMS_TASK_RESTART_READY_RETURNS_TO_CALLER}
+\rtemscase{suspended task -- preempts caller}
+ {RTEMS_TASK_RESTART_SUSPENDED_PREEMPTS_CALLER}
+\rtemscase{blocked task -- preempts caller}
+ {RTEMS_TASK_RESTART_BLOCKED_PREEMPTS_CALLER}
+\rtemscase{ready task -- preempts caller}
+ {RTEMS_TASK_RESTART_READY_PREEMPTS_CALLER}
+\rtemsdirective{TASK\_DELETE}
+\rtemscase{calling task}{RTEMS_TASK_DELETE_CALLING_TASK}
+\rtemscase{suspended task}{RTEMS_TASK_DELETE_SUSPENDED_TASK}
+\rtemscase{blocked task}{RTEMS_TASK_DELETE_BLOCKED_TASK}
+\rtemscase{ready task}{RTEMS_TASK_DELETE_READY_TASK}
+\rtemsdirective{TASK\_SUSPEND}
+\rtemscase{calling task}{RTEMS_TASK_SUSPEND_CALLING_TASK}
+\rtemscase{returns to caller}{RTEMS_TASK_SUSPEND_RETURNS_TO_CALLER}
+\rtemsdirective{TASK\_RESUME}
+\rtemscase{task readied -- returns to caller}
+ {RTEMS_TASK_RESUME_TASK_READIED_RETURNS_TO_CALLER}
+\rtemscase{task readied -- preempts caller}
+ {RTEMS_TASK_RESUME_TASK_READIED_PREEMPTS_CALLER}
+\rtemsdirective{TASK\_SET\_PRIORITY}
+\rtemscase{obtain current priority}
+ {RTEMS_TASK_SET_PRIORITY_OBTAIN_CURRENT_PRIORITY}
+\rtemscase{returns to caller}{RTEMS_TASK_SET_PRIORITY_RETURNS_TO_CALLER}
+\rtemscase{preempts caller}{RTEMS_TASK_SET_PRIORITY_PREEMPTS_CALLER}
+\rtemsdirective{TASK\_MODE}
+\rtemscase{obtain current mode}{RTEMS_TASK_MODE_OBTAIN_CURRENT_MODE}
+\rtemscase{no reschedule}{RTEMS_TASK_MODE_NO_RESCHEDULE}
+\rtemscase{reschedule -- returns to caller}
+ {RTEMS_TASK_MODE_RESCHEDULE_RETURNS_TO_CALLER}
+\rtemscase{reschedule -- preempts caller}
+ {RTEMS_TASK_MODE_RESCHEDULE_PREEMPTS_CALLER}
+\rtemsonecase{TASK\_GET\_NOTE}{RTEMS_TASK_GET_NOTE_ONLY}
+\rtemsonecase{TASK\_SET\_NOTE}{RTEMS_TASK_SET_NOTE_ONLY}
+\rtemsdirective{TASK\_WAKE\_AFTER}
+\rtemscase{yield -- returns to caller}
+ {RTEMS_TASK_WAKE_AFTER_YIELD_RETURNS_TO_CALLER}
+\rtemscase{yield -- preempts caller}
+ {RTEMS_TASK_WAKE_AFTER_YIELD_PREEMPTS_CALLER}
+\rtemsonecase{TASK\_WAKE\_WHEN}{RTEMS_TASK_WAKE_WHEN_ONLY}
+\rtemsendtimetable
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-ascii
+@ifinfo
+@itemize @bullet
+
+@item TASK_CREATE
+@itemize -
+@item only case: RTEMS_TASK_CREATE_ONLY
+@end itemize
+
+@item TASK_IDENT
+@itemize -
+@item only case: RTEMS_TASK_IDENT_ONLY
+@end itemize
+
+@item TASK_START
+@itemize -
+@item only case: RTEMS_TASK_START_ONLY
+@end itemize
+
+@item TASK_RESTART
+@itemize -
+@item calling task: RTEMS_TASK_RESTART_CALLING_TASK
+@item suspended task -- returns to caller: RTEMS_TASK_RESTART_SUSPENDED_RETURNS_TO_CALLER
+@item blocked task -- returns to caller: RTEMS_TASK_RESTART_BLOCKED_RETURNS_TO_CALLER
+@item ready task -- returns to caller: RTEMS_TASK_RESTART_READY_RETURNS_TO_CALLER
+@item suspended task -- preempts caller: RTEMS_TASK_RESTART_SUSPENDED_PREEMPTS_CALLER
+@item blocked task -- preempts caller: RTEMS_TASK_RESTART_BLOCKED_PREEMPTS_CALLER
+@item ready task -- preempts caller: RTEMS_TASK_RESTART_READY_PREEMPTS_CALLER
+@end itemize
+
+@item TASK_DELETE
+@itemize -
+@item calling task: RTEMS_TASK_DELETE_CALLING_TASK
+@item suspended task: RTEMS_TASK_DELETE_SUSPENDED_TASK
+@item blocked task: RTEMS_TASK_DELETE_BLOCKED_TASK
+@item ready task: RTEMS_TASK_DELETE_READY_TASK
+@end itemize
+
+@item TASK_SUSPEND
+@itemize -
+@item calling task: RTEMS_TASK_SUSPEND_CALLING_TASK
+@item returns to caller: RTEMS_TASK_SUSPEND_RETURNS_TO_CALLER
+@end itemize
+
+@item TASK_RESUME
+@itemize -
+@item task readied -- returns to caller: RTEMS_TASK_RESUME_TASK_READIED_RETURNS_TO_CALLER
+@item task readied -- preempts caller: RTEMS_TASK_RESUME_TASK_READIED_PREEMPTS_CALLER
+@end itemize
+
+@item TASK_SET_PRIORITY
+@itemize -
+@item obtain current priority: RTEMS_TASK_SET_PRIORITY_OBTAIN_CURRENT_PRIORITY
+@item returns to caller: RTEMS_TASK_SET_PRIORITY_RETURNS_TO_CALLER
+@item preempts caller: RTEMS_TASK_SET_PRIORITY_PREEMPTS_CALLER
+@end itemize
+
+@item TASK_MODE
+@itemize -
+@item obtain current mode: RTEMS_TASK_MODE_OBTAIN_CURRENT_MODE
+@item no reschedule: RTEMS_TASK_MODE_NO_RESCHEDULE
+@item reschedule -- returns to caller: RTEMS_TASK_MODE_RESCHEDULE_RETURNS_TO_CALLER
+@item reschedule -- preempts caller: RTEMS_TASK_MODE_RESCHEDULE_PREEMPTS_CALLER
+@end itemize
+
+@item TASK_GET_NOTE
+@itemize -
+@item only case: RTEMS_TASK_GET_NOTE_ONLY
+@end itemize
+
+@item TASK_SET_NOTE
+@itemize -
+@item only case: RTEMS_TASK_SET_NOTE_ONLY
+@end itemize
+
+@item TASK_WAKE_AFTER
+@itemize -
+@item yield -- returns to caller: RTEMS_TASK_WAKE_AFTER_YIELD_RETURNS_TO_CALLER
+@item yield -- preempts caller: RTEMS_TASK_WAKE_AFTER_YIELD_PREEMPTS_CALLER
+@end itemize
+
+@item TASK_WAKE_WHEN
+@itemize -
+@item only case: RTEMS_TASK_WAKE_WHEN_ONLY
+@end itemize
+
+@end itemize
+@end ifinfo
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=2 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=left><STRONG>TASK_CREATE</STRONG></TD>
+ <TD ALIGN=center>RTEMS_TASK_CREATE_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>TASK_IDENT</STRONG></TD>
+ <TD ALIGN=center>RTEMS_TASK_IDENT_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>TASK_START</STRONG></TD>
+ <TD ALIGN=center>RTEMS_TASK_START_ONLY</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>TASK_RESTART</STRONG></TD></TR>
+ <TR><TD ALIGN=left><dd>calling task</TD>
+ <TD ALIGN=center>RTEMS_TASK_RESTART_CALLING_TASK</TD></TR>
+ <TR><TD ALIGN=left><dd>suspended task -- returns to caller</TD>
+ <TD ALIGN=center>RTEMS_TASK_RESTART_SUSPENDED_RETURNS_TO_CALLER</TD></TR>
+ <TR><TD ALIGN=left><dd>blocked task -- returns to caller</TD>
+ <TD ALIGN=center>RTEMS_TASK_RESTART_BLOCKED_RETURNS_TO_CALLER</TD></TR>
+ <TR><TD ALIGN=left><dd>ready task -- returns to caller</TD>
+ <TD ALIGN=center>RTEMS_TASK_RESTART_READY_RETURNS_TO_CALLER</TD></TR>
+ <TR><TD ALIGN=left><dd>suspended task -- preempts caller</TD>
+ <TD ALIGN=center>RTEMS_TASK_RESTART_SUSPENDED_PREEMPTS_CALLER</TD></TR>
+ <TR><TD ALIGN=left><dd>blocked task -- preempts caller</TD>
+ <TD ALIGN=center>RTEMS_TASK_RESTART_BLOCKED_PREEMPTS_CALLER</TD></TR>
+ <TR><TD ALIGN=left><dd>ready task -- preempts caller</TD>
+ <TD ALIGN=center>RTEMS_TASK_RESTART_READY_PREEMPTS_CALLER</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>TASK_DELETE</STRONG></TD></TR>
+ <TR><TD ALIGN=left><dd>calling task</TD>
+ <TD ALIGN=center>RTEMS_TASK_DELETE_CALLING_TASK</TD></TR>
+ <TR><TD ALIGN=left><dd>suspended task</TD>
+ <TD ALIGN=center>RTEMS_TASK_DELETE_SUSPENDED_TASK</TD></TR>
+ <TR><TD ALIGN=left><dd>blocked task</TD>
+ <TD ALIGN=center>RTEMS_TASK_DELETE_BLOCKED_TASK</TD></TR>
+ <TR><TD ALIGN=left><dd>ready task</TD>
+ <TD ALIGN=center>RTEMS_TASK_DELETE_READY_TASK</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>TASK_SUSPEND</STRONG></TD></TR>
+ <TR><TD ALIGN=left><dd>calling task</TD>
+ <TD ALIGN=center>RTEMS_TASK_SUSPEND_CALLING_TASK</TD></TR>
+ <TR><TD ALIGN=left><dd>returns to caller</TD>
+ <TD ALIGN=center>RTEMS_TASK_SUSPEND_RETURNS_TO_CALLER</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>TASK_RESUME</STRONG></TD></TR>
+ <TR><TD ALIGN=left><dd>task readied -- returns to caller</TD>
+ <TD ALIGN=center>RTEMS_TASK_RESUME_TASK_READIED_RETURNS_TO_CALLER</TD></TR>
+ <TR><TD ALIGN=left><dd>task readied -- preempts caller</TD>
+ <TD ALIGN=center>RTEMS_TASK_RESUME_TASK_READIED_PREEMPTS_CALLER</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>TASK_SET_PRIORITY</STRONG></TD></TR>
+ <TR><TD ALIGN=left><dd>obtain current priority</TD>
+ <TD ALIGN=center>RTEMS_TASK_SET_PRIORITY_OBTAIN_CURRENT_PRIORITY</TD></TR>
+ <TR><TD ALIGN=left><dd>returns to caller</TD>
+ <TD ALIGN=center>RTEMS_TASK_SET_PRIORITY_RETURNS_TO_CALLER</TD></TR>
+ <TR><TD ALIGN=left><dd>preempts caller</TD>
+ <TD ALIGN=center>RTEMS_TASK_SET_PRIORITY_PREEMPTS_CALLER</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>TASK_MODE</STRONG></TD></TR>
+ <TR><TD ALIGN=left><dd>obtain current mode</TD>
+ <TD ALIGN=center>RTEMS_TASK_MODE_OBTAIN_CURRENT_MODE</TD></TR>
+ <TR><TD ALIGN=left><dd>no reschedule</TD>
+ <TD ALIGN=center>RTEMS_TASK_MODE_NO_RESCHEDULE</TD></TR>
+ <TR><TD ALIGN=left><dd>reschedule -- returns to caller</TD>
+ <TD ALIGN=center>RTEMS_TASK_MODE_RESCHEDULE_RETURNS_TO_CALLER</TD></TR>
+ <TR><TD ALIGN=left><dd>reschedule -- preempts caller</TD>
+ <TD ALIGN=center>RTEMS_TASK_MODE_RESCHEDULE_PREEMPTS_CALLER</TD></TR>
+<TR><TD ALIGN=left><STRONG>TASK_GET_NOTE</STRONG></TD>
+ <TD ALIGN=center>RTEMS_TASK_GET_NOTE_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>TASK_SET_NOTE</STRONG></TD>
+ <TD ALIGN=center>RTEMS_TASK_SET_NOTE_ONLY</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>TASK_WAKE_AFTER</STRONG></TD></TR>
+ <TR><TD ALIGN=left><dd>yield -- returns to caller</TD>
+ <TD ALIGN=center>RTEMS_TASK_WAKE_AFTER_YIELD_RETURNS_TO_CALLER</TD></TR>
+ <TR><TD ALIGN=left><dd>yield -- preempts caller</TD>
+ <TD ALIGN=center>RTEMS_TASK_WAKE_AFTER_YIELD_PREEMPTS_CALLER</TD></TR>
+<TR><TD ALIGN=left><STRONG>TASK_WAKE_WHEN</STRONG></TD>
+ <TD ALIGN=center>RTEMS_TASK_WAKE_WHEN_ONLY</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+@page
+@section Interrupt Manager
+
+It should be noted that the interrupt entry times
+include vectoring the interrupt handler.
+
+@ifset use-tex
+@sp 1
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\span\rtemstimetable
+\rtemsdirective{Interrupt Entry Overhead}
+\rtemscase{returns to nested interrupt}{RTEMS_INTR_ENTRY_RETURNS_TO_NESTED}
+\rtemscase{returns to interrupted task}
+ {RTEMS_INTR_ENTRY_RETURNS_TO_INTERRUPTED_TASK}
+\rtemscase{returns to preempting task}
+ {RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK}
+\rtemsdirective{Interrupt Exit Overhead}
+\rtemscase{returns to nested interrupt}{RTEMS_INTR_EXIT_RETURNS_TO_NESTED}
+\rtemscase{returns to interrupted task}
+ {RTEMS_INTR_EXIT_RETURNS_TO_INTERRUPTED_TASK}
+\rtemscase{returns to preempting task}
+ {RTEMS_INTR_EXIT_RETURNS_TO_PREEMPTING_TASK}
+\rtemsendtimetable
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-ascii
+@ifinfo
+@itemize @bullet
+
+@item Interrupt Entry Overhead
+@itemize -
+@item returns to nested interrupt: RTEMS_INTR_ENTRY_RETURNS_TO_NESTED
+@item returns to interrupted task: RTEMS_INTR_ENTRY_RETURNS_TO_INTERRUPTED_TASK
+@item returns to preempting task: RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK
+@end itemize
+
+@item Interrupt Exit Overhead
+@itemize -
+@item returns to nested interrupt: RTEMS_INTR_EXIT_RETURNS_TO_NESTED
+@item returns to interrupted task: RTEMS_INTR_EXIT_RETURNS_TO_INTERRUPTED_TASK
+@item returns to preempting task: RTEMS_INTR_EXIT_RETURNS_TO_PREEMPTING_TASK
+@end itemize
+
+@end itemize
+@end ifinfo
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=2 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>Interrupt Entry Overhead</STRONG></TD></TR>
+ <TR><TD ALIGN=left><dd>returns to nested interrupt</TD>
+ <TD ALIGN=center>RTEMS_INTR_ENTRY_RETURNS_TO_NESTED</TD></TR>
+ <TR><TD ALIGN=left><dd>returns to interrupted task</TD>
+ <TD ALIGN=center>RTEMS_INTR_ENTRY_RETURNS_TO_INTERRUPTED_TASK</TD></TR>
+ <TR><TD ALIGN=left><dd>returns to preempting task</TD>
+ <TD ALIGN=center>RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>Interrupt Exit Overhead</STRONG></TD></TR>
+ <TR><TD ALIGN=left><dd>returns to nested interrupt</TD>
+ <TD ALIGN=center>RTEMS_INTR_EXIT_RETURNS_TO_NESTED</TD></TR>
+ <TR><TD ALIGN=left><dd>returns to interrupted task</TD>
+ <TD ALIGN=center>RTEMS_INTR_EXIT_RETURNS_TO_INTERRUPTED_TASK</TD></TR>
+ <TR><TD ALIGN=left><dd>returns to preempting task</TD>
+ <TD ALIGN=center>RTEMS_INTR_EXIT_RETURNS_TO_PREEMPTING_TASK</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+
+@section Clock Manager
+
+@ifset use-tex
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\span\rtemstimetable
+\rtemsonecase{CLOCK\_SET}{RTEMS_CLOCK_SET_ONLY}
+\rtemsonecase{CLOCK\_GET}{RTEMS_CLOCK_GET_ONLY}
+\rtemsonecase{CLOCK\_TICK}{RTEMS_CLOCK_TICK_ONLY}
+\rtemsendtimetable
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-ascii
+@ifinfo
+@itemize @bullet
+
+@item CLOCK_SET
+@itemize -
+@item only case: RTEMS_CLOCK_SET_ONLY
+@end itemize
+
+@item CLOCK_GET
+@itemize -
+@item only case: RTEMS_CLOCK_GET_ONLY
+@end itemize
+
+@item CLOCK_TICK
+@itemize -
+@item only case: RTEMS_CLOCK_TICK_ONLY
+@end itemize
+
+@end itemize
+@end ifinfo
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=2 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=left><STRONG>CLOCK_SET</STRONG></TD>
+ <TD ALIGN=center>RTEMS_CLOCK_SET_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>CLOCK_GET</STRONG></TD>
+ <TD ALIGN=center>RTEMS_CLOCK_GET_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>CLOCK_TICK</STRONG></TD>
+ <TD ALIGN=center>RTEMS_CLOCK_TICK_ONLY</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+@section Timer Manager
+
+@ifset use-tex
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\span\rtemstimetable
+\rtemsonecase{TIMER\_CREATE}{RTEMS_TIMER_CREATE_ONLY}
+\rtemsonecase{TIMER\_IDENT}{RTEMS_TIMER_IDENT_ONLY}
+\rtemsdirective{TIMER\_DELETE}
+\rtemscase{inactive}{RTEMS_TIMER_DELETE_INACTIVE}
+\rtemscase{active}{RTEMS_TIMER_DELETE_ACTIVE}
+\rtemsdirective{TIMER\_FIRE\_AFTER}
+\rtemscase{inactive}{RTEMS_TIMER_FIRE_AFTER_INACTIVE}
+\rtemscase{active}{RTEMS_TIMER_FIRE_AFTER_ACTIVE}
+\rtemsdirective{TIMER\_FIRE\_WHEN}
+\rtemscase{inactive}{RTEMS_TIMER_FIRE_WHEN_INACTIVE}
+\rtemscase{active}{RTEMS_TIMER_FIRE_WHEN_ACTIVE}
+\rtemsdirective{TIMER\_RESET}
+\rtemscase{inactive}{RTEMS_TIMER_RESET_INACTIVE}
+\rtemscase{active}{RTEMS_TIMER_RESET_ACTIVE}
+\rtemsdirective{TIMER\_CANCEL}
+\rtemscase{inactive}{RTEMS_TIMER_CANCEL_INACTIVE}
+\rtemscase{active}{RTEMS_TIMER_CANCEL_ACTIVE}
+\rtemsendtimetable
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-ascii
+@ifinfo
+@itemize @bullet
+
+@item TIMER_CREATE
+@itemize -
+@item only case: RTEMS_TIMER_CREATE_ONLY
+@end itemize
+
+@item TIMER_IDENT
+@itemize -
+@item only case: RTEMS_TIMER_IDENT_ONLY
+@end itemize
+
+@item TIMER_DELETE
+@itemize -
+@item inactive: RTEMS_TIMER_DELETE_INACTIVE
+@item active: RTEMS_TIMER_DELETE_ACTIVE
+@end itemize
+
+@item TIMER_FIRE_AFTER
+@itemize -
+@item inactive: RTEMS_TIMER_FIRE_AFTER_INACTIVE
+@item active: RTEMS_TIMER_FIRE_AFTER_ACTIVE
+@end itemize
+
+@item TIMER_FIRE_WHEN
+@itemize -
+@item inactive: TIMER_FIRE_WHEN_INACTIVE
+@item active: TIMER_FIRE_WHEN_ACTIVE
+@end itemize
+
+@item TIMER_RESET
+@itemize -
+@item inactive: TIMER_RESET_INACTIVE
+@item active: TIMER_RESET_ACTIVE
+@end itemize
+
+@item TIMER_CANCEL
+@itemize -
+@item inactive: TIMER_CANCEL_INACTIVE
+@item active: TIMER_CANCEL_ACTIVE
+@end itemize
+
+@end itemize
+@end ifinfo
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=2 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=left><STRONG>TIMER_CREATE</STRONG></TD>
+ <TD ALIGN=center>RTEMS_TIMER_CREATE_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>TIMER_IDENT</STRONG></TD>
+ <TD ALIGN=center>RTEMS_TIMER_IDENT_ONLY</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>TIMER_DELETE</STRONG></TD></TR>
+ <TR><TD ALIGN=left><dd>inactive</TD>
+ <TD ALIGN=center>RTEMS_TIMER_DELETE_INACTIVE</TD></TR>
+ <TR><TD ALIGN=left><dd>active</TD>
+ <TD ALIGN=center>RTEMS_TIMER_DELETE_ACTIVE</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>TIMER_FIRE_AFTER</STRONG></TD></TR>
+ <TR><TD ALIGN=left><dd>inactive</TD>
+ <TD ALIGN=center>RTEMS_TIMER_FIRE_AFTER_INACTIVE</TD></TR>
+ <TR><TD ALIGN=left><dd>active</TD>
+ <TD ALIGN=center>RTEMS_TIMER_FIRE_AFTER_ACTIVE</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>TIMER_FIRE_WHEN</STRONG></TD></TR>
+ <TR><TD ALIGN=left><dd>inactive</TD>
+ <TD ALIGN=center>RTEMS_TIMER_FIRE_WHEN_INACTIVE</TD></TR>
+ <TR><TD ALIGN=left><dd>active</TD>
+ <TD ALIGN=center>RTEMS_TIMER_FIRE_WHEN_ACTIVE</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>TIMER_RESET</STRONG></TD></TR>
+ <TR><TD ALIGN=left><dd>inactive</TD>
+ <TD ALIGN=center>RTEMS_TIMER_RESET_INACTIVE</TD></TR>
+ <TR><TD ALIGN=left><dd>active</TD>
+ <TD ALIGN=center>RTEMS_TIMER_RESET_ACTIVE</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>TIMER_CANCEL</STRONG></TD></TR>
+ <TR><TD ALIGN=left><dd>inactive</TD>
+ <TD ALIGN=center>RTEMS_TIMER_CANCEL_INACTIVE</TD></TR>
+ <TR><TD ALIGN=left><dd>active</TD>
+ <TD ALIGN=center>RTEMS_TIMER_CANCEL_ACTIVE</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+@page
+@section Semaphore Manager
+
+@ifset use-tex
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\span\rtemstimetable
+\rtemsonecase{SEMAPHORE\_CREATE}{RTEMS_SEMAPHORE_CREATE_ONLY}
+\rtemsonecase{SEMAPHORE\_IDENT}{RTEMS_SEMAPHORE_IDENT_ONLY}
+\rtemsonecase{SEMAPHORE\_DELETE}{RTEMS_SEMAPHORE_DELETE_ONLY}
+\rtemsdirective{SEMAPHORE\_OBTAIN}
+\rtemscase{available}{RTEMS_SEMAPHORE_OBTAIN_AVAILABLE}
+\rtemscase{not available -- NO\_WAIT}
+ {RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_NO_WAIT}
+\rtemscase{not available -- caller blocks}
+ {RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_CALLER_BLOCKS}
+\rtemsdirective{SEMAPHORE\_RELEASE}
+\rtemscase{no waiting tasks}{RTEMS_SEMAPHORE_RELEASE_NO_WAITING_TASKS}
+\rtemscase{task readied -- returns to caller}
+ {RTEMS_SEMAPHORE_RELEASE_TASK_READIED_RETURNS_TO_CALLER}
+\rtemscase{task readied -- preempts caller}
+ {RTEMS_SEMAPHORE_RELEASE_TASK_READIED_PREEMPTS_CALLER}
+\rtemsendtimetable
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-ascii
+@ifinfo
+@itemize @bullet
+
+@item SEMAPHORE_CREATE
+@itemize -
+@item only case: RTEMS_SEMAPHORE_CREATE_ONLY
+@end itemize
+
+@item SEMAPHORE_IDENT
+@itemize -
+@item only case: RTEMS_SEMAPHORE_IDENT_ONLY
+@end itemize
+
+@item SEMAPHORE_DELETE
+@itemize -
+@item only case: RTEMS_SEMAPHORE_DELETE_ONLY
+@end itemize
+
+@item SEMAPHORE_OBTAIN
+@itemize -
+@item available: RTEMS_SEMAPHORE_OBTAIN_AVAILABLE
+@item not available -- NO_WAIT: RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_NO_WAIT
+@item not available -- caller blocks: RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_CALLER_BLOCKS
+@end itemize
+
+@item SEMAPHORE_RELEASE
+@itemize -
+@item no waiting tasks: RTEMS_SEMAPHORE_RELEASE_NO_WAITING_TASKS
+@item task readied -- returns to caller: RTEMS_SEMAPHORE_RELEASE_TASK_READIED_RETURNS_TO_CALLER
+@item task readied -- preempts caller: RTEMS_SEMAPHORE_RELEASE_TASK_READIED_PREEMPTS_CALLER
+@end itemize
+
+@end itemize
+@end ifinfo
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=2 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=left><STRONG>SEMAPHORE_CREATE</STRONG></TD>
+ <TD ALIGN=center>RTEMS_SEMAPHORE_CREATE_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>SEMAPHORE_IDENT</STRONG></TD>
+ <TD ALIGN=center>RTEMS_SEMAPHORE_IDENT_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>SEMAPHORE_DELETE</STRONG></TD>
+ <TD ALIGN=center>RTEMS_SEMAPHORE_DELETE_ONLY</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>SEMAPHORE_OBTAIN</STRONG></TD></TR>
+ <TR><TD ALIGN=left><dd>available</TD>
+ <TD ALIGN=center>RTEMS_SEMAPHORE_OBTAIN_AVAILABLE</TD></TR>
+ <TR><TD ALIGN=left><dd>not available -- NO_WAIT</TD>
+ <TD ALIGN=center>RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_NO_WAIT</TD></TR>
+ <TR><TD ALIGN=left><dd>not available -- caller blocks</TD>
+ <TD ALIGN=center>RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_CALLER_BLOCKS</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>SEMAPHORE_RELEASE</STRONG></TD></TR>
+ <TR><TD ALIGN=left><dd>no waiting tasks</TD>
+ <TD ALIGN=center>RTEMS_SEMAPHORE_RELEASE_NO_WAITING_TASKS</TD></TR>
+ <TR><TD ALIGN=left><dd>task readied -- returns to caller</TD>
+ <TD ALIGN=center>RTEMS_SEMAPHORE_RELEASE_TASK_READIED_RETURNS_TO_CALLER</TD></TR>
+ <TR><TD ALIGN=left><dd>task readied -- preempts caller</TD>
+ <TD ALIGN=center>RTEMS_SEMAPHORE_RELEASE_TASK_READIED_PREEMPTS_CALLER</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+@section Message Manager
+
+@ifset use-tex
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\span\rtemstimetable
+\rtemsonecase{MESSAGE\_QUEUE\_CREATE}{RTEMS_MESSAGE_QUEUE_CREATE_ONLY}
+\rtemsonecase{MESSAGE\_QUEUE\_IDENT}{RTEMS_MESSAGE_QUEUE_IDENT_ONLY}
+\rtemsonecase{MESSAGE\_QUEUE\_DELETE}{RTEMS_MESSAGE_QUEUE_DELETE_ONLY}
+\rtemsdirective{MESSAGE\_QUEUE\_SEND}
+\rtemscase{no waiting tasks}
+ {RTEMS_MESSAGE_QUEUE_SEND_NO_WAITING_TASKS}
+\rtemscase{task readied -- returns to caller}
+ {RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_RETURNS_TO_CALLER}
+\rtemscase{task readied -- preempts caller}
+ {RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_PREEMPTS_CALLER}
+\rtemsdirective{MESSAGE\_QUEUE\_URGENT}
+\rtemscase{no waiting tasks}{RTEMS_MESSAGE_QUEUE_URGENT_NO_WAITING_TASKS}
+\rtemscase{task readied -- returns to caller}
+ {RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_RETURNS_TO_CALLER}
+\rtemscase{task readied -- preempts caller}
+ {RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_PREEMPTS_CALLER}
+\rtemsdirective{MESSAGE\_QUEUE\_BROADCAST}
+\rtemscase{no waiting tasks}{RTEMS_MESSAGE_QUEUE_BROADCAST_NO_WAITING_TASKS}
+\rtemscase{task readied -- returns to caller}
+ {RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_RETURNS_TO_CALLER}
+\rtemscase{task readied -- preempts caller}
+ {RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_PREEMPTS_CALLER}
+\rtemsdirective{MESSAGE\_QUEUE\_RECEIVE}
+\rtemscase{available}{RTEMS_MESSAGE_QUEUE_RECEIVE_AVAILABLE}
+\rtemscase{not available -- NO\_WAIT}
+ {RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_NO_WAIT}
+\rtemscase{not available -- caller blocks}
+ {RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS}
+\rtemsdirective{MESSAGE\_QUEUE\_FLUSH}
+\rtemscase{no messages flushed}{RTEMS_MESSAGE_QUEUE_FLUSH_NO_MESSAGES_FLUSHED}
+\rtemscase{messages flushed}{RTEMS_MESSAGE_QUEUE_FLUSH_MESSAGES_FLUSHED}
+\rtemsendtimetable
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-ascii
+@ifinfo
+@itemize @bullet
+
+@item MESSAGE_QUEUE_CREATE
+@itemize -
+@item only case: RTEMS_MESSAGE_QUEUE_CREATE_ONLY
+@end itemize
+
+@item MESSAGE_QUEUE_IDENT
+@itemize -
+@item only case: RTEMS_MESSAGE_QUEUE_IDENT_ONLY
+@end itemize
+
+@item MESSAGE_QUEUE_DELETE
+@itemize -
+@item only case: RTEMS_MESSAGE_QUEUE_DELETE_ONLY
+@end itemize
+
+@item MESSAGE_QUEUE_SEND
+@itemize -
+@item no waiting tasks: RTEMS_MESSAGE_QUEUE_SEND_NO_WAITING_TASKS
+@item task readied -- returns to caller: RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_RETURNS_TO_CALLER
+@item task readied -- preempts caller: RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_PREEMPTS_CALLER
+@end itemize
+
+@item MESSAGE_QUEUE_URGENT
+@itemize -
+@item no waiting tasks: RTEMS_MESSAGE_QUEUE_URGENT_NO_WAITING_TASKS
+@item task readied -- returns to caller: RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_RETURNS_TO_CALLER
+@item task readied -- preempts caller: RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_PREEMPTS_CALLER
+@end itemize
+
+@item MESSAGE_QUEUE_BROADCAST
+@itemize -
+@item no waiting tasks: RTEMS_MESSAGE_QUEUE_BROADCAST_NO_WAITING_TASKS
+@item task readied -- returns to caller: RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_RETURNS_TO_CALLER
+@item task readied -- preempts caller: RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_PREEMPTS_CALLER
+@end itemize
+
+@item MESSAGE_QUEUE_RECEIVE
+@itemize -
+@item available: RTEMS_MESSAGE_QUEUE_RECEIVE_AVAILABLE
+@item not available -- NO_WAIT: RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_NO_WAIT
+@item not available -- caller blocks: RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS
+@end itemize
+
+@item MESSAGE_QUEUE_FLUSH
+@itemize -
+@item no messages flushed: RTEMS_MESSAGE_QUEUE_FLUSH_NO_MESSAGES_FLUSHED
+@item messages flushed: RTEMS_MESSAGE_QUEUE_FLUSH_MESSAGES_FLUSHED
+@end itemize
+
+@end itemize
+@end ifinfo
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=2 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=left><STRONG>MESSAGE_QUEUE_CREATE</STRONG></TD>
+ <TD ALIGN=center>RTEMS_MESSAGE_QUEUE_CREATE_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>MESSAGE_QUEUE_IDENT</STRONG></TD>
+ <TD ALIGN=center>RTEMS_MESSAGE_QUEUE_IDENT_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>MESSAGE_QUEUE_DELETE</STRONG></TD>
+ <TD ALIGN=center>RTEMS_MESSAGE_QUEUE_DELETE_ONLY</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>MESSAGE_QUEUE_SEND</STRONG></TD></TR>
+ <TR><TD ALIGN=left><dd>no waiting tasks</TD>
+ <TD ALIGN=center>RTEMS_MESSAGE_QUEUE_SEND_NO_WAITING_TASKS</TD></TR>
+ <TR><TD ALIGN=left><dd>task readied -- returns to caller</TD>
+ <TD ALIGN=center>RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_RETURNS_TO_CALLER</TD></TR>
+ <TR><TD ALIGN=left><dd>task readied -- preempts caller</TD>
+ <TD ALIGN=center>RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_PREEMPTS_CALLER</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>MESSAGE_QUEUE_URGENT</STRONG></TD></TR>
+ <TR><TD ALIGN=left><dd>no waiting tasks</TD>
+ <TD ALIGN=center>RTEMS_MESSAGE_QUEUE_URGENT_NO_WAITING_TASKS</TD></TR>
+ <TR><TD ALIGN=left><dd>task readied -- returns to caller</TD>
+ <TD ALIGN=center>RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_RETURNS_TO_CALLER</TD></TR>
+ <TR><TD ALIGN=left><dd>task readied -- preempts caller</TD>
+ <TD ALIGN=center>RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_PREEMPTS_CALLER</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>MESSAGE_QUEUE_BROADCAST</STRONG></TD></TR>
+ <TR><TD ALIGN=left><dd>no waiting tasks</TD>
+ <TD ALIGN=center>RTEMS_MESSAGE_QUEUE_BROADCAST_NO_WAITING_TASKS</TD></TR>
+ <TR><TD ALIGN=left><dd>task readied -- returns to caller</TD>
+ <TD ALIGN=center>RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_RETURNS_TO_CALLER</TD></TR>
+ <TR><TD ALIGN=left><dd>task readied -- preempts caller</TD>
+ <TD ALIGN=center>RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_PREEMPTS_CALLER</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>MESSAGE_QUEUE_RECEIVE</STRONG></TD></TR>
+ <TR><TD ALIGN=left><dd>available</TD>
+ <TD ALIGN=center>RTEMS_MESSAGE_QUEUE_RECEIVE_AVAILABLE</TD></TR>
+ <TR><TD ALIGN=left><dd>not available -- NO_WAIT</TD>
+ <TD ALIGN=center>RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_NO_WAIT</TD></TR>
+ <TR><TD ALIGN=left><dd>not available -- caller blocks</TD>
+ <TD ALIGN=center>RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>MESSAGE_QUEUE_FLUSH</STRONG></TD></TR>
+ <TR><TD ALIGN=left><dd>no messages flushed</TD>
+ <TD ALIGN=center>RTEMS_MESSAGE_QUEUE_FLUSH_NO_MESSAGES_FLUSHED</TD></TR>
+ <TR><TD ALIGN=left><dd>messages flushed</TD>
+ <TD ALIGN=center>RTEMS_MESSAGE_QUEUE_FLUSH_MESSAGES_FLUSHED</TD></TR>
+
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+@page
+@section Event Manager
+
+@ifset use-tex
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\span\rtemstimetable
+\rtemsdirective{EVENT\_SEND}
+\rtemscase{no task readied}{RTEMS_EVENT_SEND_NO_TASK_READIED}
+\rtemscase{task readied -- returns to caller}
+ {RTEMS_EVENT_SEND_TASK_READIED_RETURNS_TO_CALLER}
+\rtemscase{task readied -- preempts caller}
+ {RTEMS_EVENT_SEND_TASK_READIED_PREEMPTS_CALLER}
+\rtemsdirective{EVENT\_RECEIVE}
+\rtemscase{obtain current events}{RTEMS_EVENT_RECEIVE_OBTAIN_CURRENT_EVENTS}
+\rtemscase{available}{RTEMS_EVENT_RECEIVE_AVAILABLE}
+\rtemscase{not available -- NO\_WAIT}{RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_NO_WAIT}
+\rtemscase{not available -- caller blocks}
+ {RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS}
+\rtemsendtimetable
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-ascii
+@ifinfo
+@itemize @bullet
+
+@item EVENT_SEND
+@itemize -
+@item no task readied: RTEMS_EVENT_SEND_NO_TASK_READIED
+@item task readied -- returns to caller: RTEMS_EVENT_SEND_TASK_READIED_RETURNS_TO_CALLER
+@item task readied -- preempts caller: RTEMS_EVENT_SEND_TASK_READIED_PREEMPTS_CALLER
+@end itemize
+
+@item EVENT_RECEIVE
+@itemize -
+@item obtain current events: RTEMS_EVENT_RECEIVE_OBTAIN_CURRENT_EVENTS
+@item available: RTEMS_EVENT_RECEIVE_AVAILABLE
+@item not available -- NO_WAIT: RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_NO_WAIT
+@item not available -- caller blocks: RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS
+@end itemize
+
+@end itemize
+@end ifinfo
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=2 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>EVENT_SEND</STRONG></TD></TR>
+ <TR><TD ALIGN=left><dd>no task readied</TD>
+ <TD ALIGN=center>RTEMS_EVENT_SEND_NO_TASK_READIED</TD></TR>
+ <TR><TD ALIGN=left><dd>task readied -- returns to caller</TD>
+ <TD ALIGN=center>RTEMS_EVENT_SEND_TASK_READIED_RETURNS_TO_CALLER</TD></TR>
+ <TR><TD ALIGN=left><dd>task readied -- preempts caller</TD>
+ <TD ALIGN=center>RTEMS_EVENT_SEND_TASK_READIED_PREEMPTS_CALLER</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>EVENT_RECEIVE</STRONG></TD></TR>
+ <TR><TD ALIGN=left><dd>obtain current events</TD>
+ <TD ALIGN=center>RTEMS_EVENT_RECEIVE_OBTAIN_CURRENT_EVENTS</TD></TR>
+ <TR><TD ALIGN=left><dd>available</TD>
+ <TD ALIGN=center>RTEMS_EVENT_RECEIVE_AVAILABLE</TD></TR>
+ <TR><TD ALIGN=left><dd>not available -- NO_WAIT</TD>
+ <TD ALIGN=center>RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_NO_WAIT</TD></TR>
+ <TR><TD ALIGN=left><dd>not available -- caller blocks</TD>
+ <TD ALIGN=center>RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS</TD></TR>
+
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+@section Signal Manager
+
+@ifset use-tex
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\span\rtemstimetable
+\rtemsonecase{SIGNAL\_CATCH}{RTEMS_SIGNAL_CATCH_ONLY}
+\rtemsdirective{SIGNAL\_SEND}
+\rtemscase{returns to caller}{RTEMS_SIGNAL_SEND_RETURNS_TO_CALLER}
+\rtemscase{signal to self}{RTEMS_SIGNAL_SEND_SIGNAL_TO_SELF}
+\rtemsdirective{EXIT ASR OVERHEAD}
+\rtemscase{returns to calling task}
+ {RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_CALLING_TASK}
+\rtemscase{returns to preempting task}
+ {RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_PREEMPTING_TASK}
+\rtemsendtimetable
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-ascii
+@ifinfo
+@itemize @bullet
+@item SIGNAL_CATCH
+@itemize -
+@item only case: RTEMS_SIGNAL_CATCH_ONLY
+@end itemize
+
+@item SIGNAL_SEND
+@itemize -
+@item returns to caller: RTEMS_SIGNAL_SEND_RETURNS_TO_CALLER
+@item signal to self: RTEMS_SIGNAL_SEND_SIGNAL_TO_SELF
+@end itemize
+
+@item EXIT ASR OVERHEAD
+@itemize -
+@item returns to calling task: RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_CALLING_TASK
+@item returns to preempting task: RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_PREEMPTING_TASK
+@end itemize
+
+@end itemize
+@end ifinfo
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=2 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=left><STRONG>SIGNAL_CATCH</STRONG></TD>
+ <TD ALIGN=center>RTEMS_SIGNAL_CATCH_ONLY</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>SIGNAL_SEND</TD></TR>
+ <TR><TD ALIGN=left><dd>returns to caller</TD>
+ <TD ALIGN=center>RTEMS_SIGNAL_SEND_RETURNS_TO_CALLER</TD></TR>
+ <TR><TD ALIGN=left><dd>signal to self</TD>
+ <TD ALIGN=center>RTEMS_SIGNAL_SEND_SIGNAL_TO_SELF</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>EXIT ASR OVERHEAD</TD></TR>
+ <TR><TD ALIGN=left><dd>returns to calling task</TD>
+ <TD ALIGN=center>
+ RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_CALLING_TASK</TD></TR>
+ <TR><TD ALIGN=left><dd>returns to preempting task</TD>
+ <TD ALIGN=center>
+ RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_PREEMPTING_TASK</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+@section Partition Manager
+
+@ifset use-tex
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\span\rtemstimetable
+\rtemsonecase{PARTITION\_CREATE}{RTEMS_PARTITION_CREATE_ONLY}
+\rtemsonecase{PARTITION\_IDENT}{RTEMS_PARTITION_IDENT_ONLY}
+\rtemsonecase{PARTITION\_DELETE}{RTEMS_PARTITION_DELETE_ONLY}
+\rtemsdirective{PARTITION\_GET\_BUFFER}
+\rtemscase{available}{RTEMS_PARTITION_GET_BUFFER_AVAILABLE}
+\rtemscase{not available}{RTEMS_PARTITION_GET_BUFFER_NOT_AVAILABLE}
+\rtemsonecase{PARTITION\_RETURN\_BUFFER}
+ {RTEMS_PARTITION_GET_BUFFER_NOT_AVAILABLE}
+\rtemsendtimetable
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-ascii
+@ifinfo
+@itemize @bullet
+
+@item PARTITION_CREATE
+@itemize -
+@item only case: RTEMS_PARTITION_CREATE_ONLY
+@end itemize
+
+@item PARTITION_IDENT
+@itemize -
+@item only case: RTEMS_PARTITION_IDENT_ONLY
+@end itemize
+
+@item PARTITION_DELETE
+@itemize -
+@item only case: RTEMS_PARTITION_DELETE_ONLY
+@end itemize
+
+@item PARTITION_GET_BUFFER
+@itemize -
+@item available: RTEMS_PARTITION_GET_BUFFER_AVAILABLE
+@item not available: RTEMS_PARTITION_GET_BUFFER_NOT_AVAILABLE
+@end itemize
+
+@item PARTITION_RETURN_BUFFER
+@itemize -
+@item only case: RTEMS_PARTITION_RETURN_BUFFER_ONLY
+@end itemize
+
+@end itemize
+@end ifinfo
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=2 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=left><STRONG>PARTITION_CREATE</STRONG></TD>
+ <TD ALIGN=center>RTEMS_PARTITION_CREATE_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>PARTITION_IDENT</STRONG></TD>
+ <TD ALIGN=center>RTEMS_PARTITION_IDENT_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>PARTITION_DELETE</STRONG></TD>
+ <TD ALIGN=center>RTEMS_PARTITION_DELETE_ONLY</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>PARTITION_GET_BUFFER</STRONG></TD></TR>
+ <TR><TD ALIGN=left><dd>available</TD>
+ <TD ALIGN=center>RTEMS_PARTITION_GET_BUFFER_AVAILABLE</TD></TR>
+ <TR><TD ALIGN=left><dd>not available</TD>
+ <TD ALIGN=center>RTEMS_PARTITION_GET_BUFFER_NOT_AVAILABLE</TD></TR>
+ <TR><TD ALIGN=left><STRONG>PARTITION_RETURN_BUFFER</STRONG></TD>
+ <TD ALIGN=center>RTEMS_PARTITION_GET_BUFFER_NOT_AVAILABLE</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+@page
+@section Region Manager
+
+@ifset use-tex
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\span\rtemstimetable
+\rtemsonecase{REGION\_CREATE}{RTEMS_REGION_CREATE_ONLY}
+\rtemsonecase{REGION\_IDENT}{RTEMS_REGION_IDENT_ONLY}
+\rtemsonecase{REGION\_DELETE}{RTEMS_REGION_DELETE_ONLY}
+\rtemsdirective{REGION\_GET\_SEGMENT}
+\rtemscase{available}{RTEMS_REGION_GET_SEGMENT_AVAILABLE}
+\rtemscase{not available -- NO\_WAIT}
+ {RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_NO_WAIT}
+\rtemscase{not available -- caller blocks}
+ {RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_CALLER_BLOCKS}
+\rtemsdirective{REGION\_RETURN\_SEGMENT}
+\rtemscase{no waiting tasks}{RTEMS_REGION_RETURN_SEGMENT_NO_WAITING_TASKS}
+\rtemscase{task readied -- returns to caller}
+ {RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_RETURNS_TO_CALLER}
+\rtemscase{task readied -- preempts caller}
+ {RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_PREEMPTS_CALLER}
+\rtemsendtimetable
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-ascii
+@ifinfo
+@itemize @bullet
+
+@item REGION_CREATE
+@itemize -
+@item only case: RTEMS_REGION_CREATE_ONLY
+@end itemize
+
+@item REGION_IDENT
+@itemize -
+@item only case: RTEMS_REGION_IDENT_ONLY
+@end itemize
+
+@item REGION_DELETE
+@itemize -
+@item only case: RTEMS_REGION_DELETE_ONLY
+@end itemize
+
+@item REGION_GET_SEGMENT
+@itemize -
+@item available: RTEMS_REGION_GET_SEGMENT_AVAILABLE
+@item not available -- NO_WAIT: RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_NO_WAIT
+@item not available -- caller blocks: RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_CALLER_BLOCKS
+@end itemize
+
+@item REGION_RETURN_SEGMENT
+@itemize -
+@item no waiting tasks: RTEMS_REGION_RETURN_SEGMENT_NO_WAITING_TASKS
+@item task readied -- returns to caller: RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_RETURNS_TO_CALLER
+@item task readied -- preempts caller: RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_PREEMPTS_CALLER
+@end itemize
+
+@end itemize
+@end ifinfo
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=2 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=left><STRONG>REGION_CREATE</STRONG></TD>
+ <TD ALIGN=center>RTEMS_REGION_CREATE_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>REGION_IDENT</STRONG></TD>
+ <TD ALIGN=center>RTEMS_REGION_IDENT_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>REGION_DELETE</STRONG></TD>
+ <TD ALIGN=center>RTEMS_REGION_DELETE_ONLY</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>REGION_GET_SEGMENT</TD></TR>
+ <TR><TD ALIGN=left><dd>available</TD>
+ <TD ALIGN=center>RTEMS_REGION_GET_SEGMENT_AVAILABLE</TD></TR>
+ <TR><TD ALIGN=left><dd>not available -- NO_WAIT</TD>
+ <TD ALIGN=center>
+ RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_NO_WAIT</TD></TR>
+ <TR><TD ALIGN=left><dd>not available -- caller blocks</TD>
+ <TD ALIGN=center>
+ RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_CALLER_BLOCKS</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>REGION_RETURN_SEGMENT</TD></TR>
+ <TR><TD ALIGN=left><dd>no waiting tasks</TD>
+ <TD ALIGN=center>RTEMS_REGION_RETURN_SEGMENT_NO_WAITING_TASKS</TD></TR>
+ <TR><TD ALIGN=left><dd>task readied -- returns to caller</TD>
+ <TD ALIGN=center>
+ RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_RETURNS_TO_CALLER</TD></TR>
+ <TR><TD ALIGN=left><dd>task readied -- preempts caller</TD>
+ <TD ALIGN=center>
+ RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_PREEMPTS_CALLER</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+@section Dual-Ported Memory Manager
+
+@ifset use-tex
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\span\rtemstimetable
+\rtemsonecase{PORT\_CREATE}{RTEMS_PORT_CREATE_ONLY}
+\rtemsonecase{PORT\_IDENT}{RTEMS_PORT_IDENT_ONLY}
+\rtemsonecase{PORT\_DELETE}{RTEMS_PORT_DELETE_ONLY}
+\rtemsonecase{PORT\_INTERNAL\_TO\_EXTERNAL}
+ {RTEMS_PORT_INTERNAL_TO_EXTERNAL_ONLY}
+\rtemsonecase{PORT\_EXTERNAL\_TO\_INTERNAL}
+ {RTEMS_PORT_EXTERNAL_TO_INTERNAL_ONLY}
+\rtemsendtimetable
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-ascii
+@ifinfo
+@itemize @bullet
+
+@item PORT_CREATE
+@itemize -
+@item only case: RTEMS_PORT_CREATE_ONLY
+@end itemize
+
+@item PORT_IDENT
+@itemize -
+@item only case: RTEMS_PORT_IDENT_ONLY
+@end itemize
+
+@item PORT_DELETE
+@itemize -
+@item only case: RTEMS_PORT_DELETE_ONLY
+@end itemize
+
+@item PORT_INTERNAL_TO_EXTERNAL
+@itemize -
+@item only case: RTEMS_PORT_INTERNAL_TO_EXTERNAL_ONLY
+@end itemize
+
+@item PORT_EXTERNAL_TO_INTERNAL
+@itemize -
+@item only case: RTEMS_PORT_EXTERNAL_TO_INTERNAL_ONLY
+@end itemize
+
+@end itemize
+@end ifinfo
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=2 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=left><STRONG>PORT_CREATE</STRONG></TD>
+ <TD ALIGN=center>RTEMS_PORT_CREATE_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>PORT_IDENT</STRONG></TD>
+ <TD ALIGN=center>RTEMS_PORT_IDENT_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>PORT_DELETE</STRONG></TD>
+ <TD ALIGN=center>RTEMS_PORT_DELETE_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>PORT_INTERNAL_TO_EXTERNAL</STRONG></TD>
+ <TD ALIGN=center>RTEMS_PORT_INTERNAL_TO_EXTERNAL_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>PORT_EXTERNAL_TO_INTERNAL</STRONG></TD>
+ <TD ALIGN=center>RTEMS_PORT_EXTERNAL_TO_INTERNAL_ONLY</TD></TR>
+
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+@section I/O Manager
+
+@ifset use-tex
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\span\rtemstimetable
+\rtemsonecase{IO\_INITIALIZE}{RTEMS_IO_INITIALIZE_ONLY}
+\rtemsonecase{IO\_OPEN}{RTEMS_IO_OPEN_ONLY}
+\rtemsonecase{IO\_CLOSE}{RTEMS_IO_CLOSE_ONLY}
+\rtemsonecase{IO\_READ}{RTEMS_IO_READ_ONLY}
+\rtemsonecase{IO\_WRITE}{RTEMS_IO_WRITE_ONLY}
+\rtemsonecase{IO\_CONTROL}{RTEMS_IO_CONTROL_ONLY}
+\rtemsendtimetable
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-ascii
+@ifinfo
+@itemize @bullet
+
+@item IO_INITIALIZE
+@itemize -
+@item only case: RTEMS_IO_INITIALIZE_ONLY
+@end itemize
+
+@item IO_OPEN
+@itemize -
+@item only case: RTEMS_IO_OPEN_ONLY
+@end itemize
+
+@item IO_CLOSE
+@itemize -
+@item only case: RTEMS_IO_CLOSE_ONLY
+@end itemize
+
+@item IO_READ
+@itemize -
+@item only case: RTEMS_IO_READ_ONLY
+@end itemize
+
+@item IO_WRITE
+@itemize -
+@item only case: RTEMS_IO_WRITE_ONLY
+@end itemize
+
+@item IO_CONTROL
+@itemize -
+@item only case: RTEMS_IO_CONTROL_ONLY
+@end itemize
+
+@end itemize
+@end ifinfo
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=2 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=left><STRONG>IO_INITIALIZE</STRONG></TD>
+ <TD ALIGN=center>RTEMS_IO_INITIALIZE_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>IO_OPEN</STRONG></TD>
+ <TD ALIGN=center>RTEMS_IO_OPEN_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>IO_CLOSE</STRONG></TD>
+ <TD ALIGN=center>RTEMS_IO_CLOSE_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>IO_READ</STRONG></TD>
+ <TD ALIGN=center>RTEMS_IO_READ_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>IO_WRITE</STRONG></TD>
+ <TD ALIGN=center>RTEMS_IO_WRITE_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>IO_CONTROL</STRONG></TD>
+ <TD ALIGN=center>RTEMS_IO_CONTROL_ONLY</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+@section Rate Monotonic Manager
+
+@ifset use-tex
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\span\rtemstimetable
+\rtemsonecase{RATE\_MONOTONIC\_CREATE}{RTEMS_RATE_MONOTONIC_CREATE_ONLY}
+\rtemsonecase{RATE\_MONOTONIC\_IDENT}{RTEMS_RATE_MONOTONIC_IDENT_ONLY}
+\rtemsonecase{RATE\_MONOTONIC\_CANCEL}{RTEMS_RATE_MONOTONIC_CANCEL_ONLY}
+\rtemsdirective{RATE\_MONOTONIC\_DELETE}
+\rtemscase{active}{RTEMS_RATE_MONOTONIC_DELETE_ACTIVE}
+\rtemscase{inactive}{RTEMS_RATE_MONOTONIC_DELETE_INACTIVE}
+\rtemsdirective{RATE\_MONOTONIC\_PERIOD}
+\rtemscase{initiate period -- returns to caller}
+ {RTEMS_RATE_MONOTONIC_PERIOD_INITIATE_PERIOD_RETURNS_TO_CALLER}
+\rtemscase{conclude period -- caller blocks}
+ {RTEMS_RATE_MONOTONIC_PERIOD_CONCLUDE_PERIOD_CALLER_BLOCKS}
+\rtemscase{obtain status}{RTEMS_RATE_MONOTONIC_PERIOD_OBTAIN_STATUS}
+\rtemsendtimetable
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-ascii
+@ifinfo
+@itemize @bullet
+
+@item RATE_MONOTONIC_CREATE
+@itemize -
+@item only case: RTEMS_RATE_MONOTONIC_CREATE_ONLY
+@end itemize
+
+@item RATE_MONOTONIC_IDENT
+@itemize -
+@item only case: RTEMS_RATE_MONOTONIC_IDENT_ONLY
+@end itemize
+
+@item RATE_MONOTONIC_CANCEL
+@itemize -
+@item only case: RTEMS_RATE_MONOTONIC_CANCEL_ONLY
+@end itemize
+
+@item RATE_MONOTONIC_DELETE
+@itemize -
+@item active: RTEMS_RATE_MONOTONIC_DELETE_ACTIVE
+@item inactive: RTEMS_RATE_MONOTONIC_DELETE_INACTIVE
+@end itemize
+
+@item RATE_MONOTONIC_PERIOD
+@itemize -
+@item initiate period -- returns to caller: RTEMS_RATE_MONOTONIC_PERIOD_INITIATE_PERIOD_RETURNS_TO_CALLER
+@item conclude period -- caller blocks: RTEMS_RATE_MONOTONIC_PERIOD_CONCLUDE_PERIOD_CALLER_BLOCKS
+@item obtain status: RTEMS_RATE_MONOTONIC_PERIOD_OBTAIN_STATUS
+@end itemize
+
+@end itemize
+@end ifinfo
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=2 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=left><STRONG>RATE_MONOTONIC_CREATE</STRONG></TD>
+ <TD ALIGN=center>RTEMS_RATE_MONOTONIC_CREATE_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>RATE_MONOTONIC_IDENT</STRONG></TD>
+ <TD ALIGN=center>RTEMS_RATE_MONOTONIC_IDENT_ONLY</TD></TR>
+<TR><TD ALIGN=left><STRONG>RATE_MONOTONIC_CANCEL</STRONG></TD>
+ <TD ALIGN=center>RTEMS_RATE_MONOTONIC_CANCEL_ONLY</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>RATE_MONOTONIC_DELETE</TD></TR>
+ <TR><TD ALIGN=left><dd>active</TD>
+ <TD ALIGN=center>RTEMS_RATE_MONOTONIC_DELETE_ACTIVE</TD></TR>
+ <TR><TD ALIGN=left><dd>inactive</TD>
+ <TD ALIGN=center>RTEMS_RATE_MONOTONIC_DELETE_INACTIVE</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2><STRONG>RATE_MONOTONIC_PERIOD</TD></TR>
+ <TR><TD ALIGN=left><dd>initiate period -- returns to caller</TD>
+ <TD ALIGN=center>
+ RTEMS_RATE_MONOTONIC_PERIOD_INITIATE_PERIOD_RETURNS_TO_CALLER</TD></TR>
+ <TR><TD ALIGN=left><dd>conclude period -- caller blocks</TD>
+ <TD ALIGN=center>
+ RTEMS_RATE_MONOTONIC_PERIOD_CONCLUDE_PERIOD_CALLER_BLOCKS</TD></TR>
+ <TR><TD ALIGN=left><dd>obtain status</TD>
+ <TD ALIGN=center>RTEMS_RATE_MONOTONIC_PERIOD_OBTAIN_STATUS</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+@tex
+\global\advance \smallskipamount by 4pt
+@end tex
diff --git a/doc/common/timing.t b/doc/common/timing.t
new file mode 100644
index 0000000000..7d9f9a415f
--- /dev/null
+++ b/doc/common/timing.t
@@ -0,0 +1,396 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Timing Specification
+
+@section Introduction
+
+This chapter provides information pertaining to the
+measurement of the performance of RTEMS, the methods of
+gathering the timing data, and the usefulness of the data. Also
+discussed are other time critical aspects of RTEMS that affect
+an applications design and ultimate throughput. These aspects
+include determinancy, interrupt latency and context switch times.
+
+@section Philosophy
+
+Benchmarks are commonly used to evaluate the
+performance of software and hardware. Benchmarks can be an
+effective tool when comparing systems. Unfortunately,
+benchmarks can also be manipulated to justify virtually any
+claim. Benchmarks of real-time executives are difficult to
+evaluate for a variety of reasons. Executives vary in the
+robustness of features and options provided. Even when
+executives compare favorably in functionality, it is quite
+likely that different methodologies were used to obtain the
+timing data. Another problem is that some executives provide
+times for only a small subset of directives, This is typically
+justified by claiming that these are the only time-critical
+directives. The performance of some executives is also very
+sensitive to the number of objects in the system. To obtain any
+measure of usefulness, the performance information provided for
+an executive should address each of these issues.
+
+When evaluating the performance of a real-time
+executive, one typically considers the following areas:
+determinancy, directive times, worst case interrupt latency, and
+context switch time. Unfortunately, these areas do not have
+standard measurement methodologies. This allows vendors to
+manipulate the results such that their product is favorably
+represented. We have attempted to provide useful and meaningful
+timing information for RTEMS. To insure the usefulness of our
+data, the methodology and definitions used to obtain and
+describe the data are also documented.
+
+@subsection Determinancy
+
+The correctness of data in a real-time system must
+always be judged by its timeliness. In many real-time systems,
+obtaining the correct answer does not necessarily solve the
+problem. For example, in a nuclear reactor it is not enough to
+determine that the core is overheating. This situation must be
+detected and acknowledged early enough that corrective action
+can be taken and a meltdown avoided.
+
+Consequently, a system designer must be able to
+predict the worst-case behavior of the application running under
+the selected executive. In this light, it is important that a
+real-time system perform consistently regardless of the number
+of tasks, semaphores, or other resources allocated. An
+important design goal of a real-time executive is that all
+internal algorithms be fixed-cost. Unfortunately, this goal is
+difficult to completely meet without sacrificing the robustness
+of the executive's feature set.
+
+Many executives use the term deterministic to mean
+that the execution times of their services can be predicted.
+However, they often provide formulas to modify execution times
+based upon the number of objects in the system. This usage is
+in sharp contrast to the notion of deterministic meaning fixed
+cost.
+
+Almost all RTEMS directives execute in a fixed amount
+of time regardless of the number of objects present in the
+system. The primary exception occurs when a task blocks while
+acquiring a resource and specifies a non-zero timeout interval.
+
+Other exceptions are message queue broadcast,
+obtaining a variable length memory block, object name to ID
+translation, and deleting a resource upon which tasks are
+waiting. In addition, the time required to service a clock tick
+interrupt is based upon the number of timeouts and other
+"events" which must be processed at that tick. This second
+group is composed primarily of capabilities which are inherently
+non-deterministic but are infrequently used in time critical
+situations. The major exception is that of servicing a clock
+tick. However, most applications have a very small number of
+timeouts which expire at exactly the same millisecond (usually
+none, but occasionally two or three).
+
+@subsection Interrupt Latency
+
+Interrupt latency is the delay between the CPU's
+receipt of an interrupt request and the execution of the first
+application-specific instruction in an interrupt service
+routine. Interrupts are a critical component of most real-time
+applications and it is critical that they be acted upon as
+quickly as possible.
+
+Knowledge of the worst case interrupt latency of an
+executive aids the application designer in determining the
+maximum period of time between the generation of an interrupt
+and an interrupt handler responding to that interrupt. The
+interrupt latency of an system is the greater of the executive's
+and the applications's interrupt latency. If the application
+disables interrupts longer than the executive, then the
+application's interrupt latency is the system's worst case
+interrupt disable period.
+
+The worst case interrupt latency for a real-time
+executive is based upon the following components:
+
+@itemize @bullet
+@item the longest period of time interrupts are disabled
+by the executive,
+
+@item the overhead required by the executive at the
+beginning of each ISR,
+
+@item the time required for the CPU to vector the
+interrupt, and
+
+@item for some microprocessors, the length of the longest
+instruction.
+@end itemize
+
+The first component is irrelevant if an interrupt
+occurs when interrupts are enabled, although it must be included
+in a worst case analysis. The third and fourth components are
+particular to a CPU implementation and are not dependent on the
+executive. The fourth component is ignored by this document
+because most applications use only a subset of a
+microprocessor's instruction set. Because of this the longest
+instruction actually executed is application dependent. The
+worst case interrupt latency of an executive is typically
+defined as the sum of components (1) and (2). The second
+component includes the time necessry for RTEMS to save registers
+and vector to the user-defined handler. RTEMS includes the
+third component, the time required for the CPU to vector the
+interrupt, because it is a required part of any interrupt.
+
+Many executives report the maximum interrupt disable
+period as their interrupt latency and ignore the other
+components. This results in very low worst-case interrupt
+latency times which are not indicative of actual application
+performance. The definition used by RTEMS results in a higher
+interrupt latency being reported, but accurately reflects the
+longest delay between the CPU's receipt of an interrupt request
+and the execution of the first application-specific instruction
+in an interrupt service routine.
+
+The actual interrupt latency times are reported in
+the Timing Data chapter of this supplement.
+
+@subsection Context Switch Time
+
+An RTEMS context switch is defined as the act of
+taking the CPU from the currently executing task and giving it
+to another task. This process involves the following components:
+
+@itemize @bullet
+@item Saving the hardware state of the current task.
+
+@item Optionally, invoking the TASK_SWITCH user extension.
+
+@item Restoring the hardware state of the new task.
+@end itemize
+
+RTEMS defines the hardware state of a task to include
+the CPU's data registers, address registers, and, optionally,
+floating point registers.
+
+Context switch time is often touted as a performance
+measure of real-time executives. However, a context switch is
+performed as part of a directive's actions and should be viewed
+as such when designing an application. For example, if a task
+is unable to acquire a semaphore and blocks, a context switch is
+required to transfer control from the blocking task to a new
+task. From the application's perspective, the context switch is
+a direct result of not acquiring the semaphore. In this light,
+the context switch time is no more relevant than the performance
+of any other of the executive's subroutines which are not
+directly accessible by the application.
+
+In spite of the inappropriateness of using the
+context switch time as a performance metric, RTEMS context
+switch times for floating point and non-floating points tasks
+are provided for comparison purposes. Of the executives which
+actually support floating point operations, many do not report
+context switch times for floating point context switch time.
+This results in a reported context switch time which is
+meaningless for an application with floating point tasks.
+
+The actual context switch times are reported in the
+Timing Data chapter of this supplement.
+
+@subsection Directive Times
+
+Directives are the application's interface to the
+executive, and as such their execution times are critical in
+determining the performance of the application. For example, an
+application using a semaphore to protect a critical data
+structure should be aware of the time required to acquire and
+release a semaphore. In addition, the application designer can
+utilize the directive execution times to evaluate the
+performance of different synchronization and communication
+mechanisms.
+
+The actual directive execution times are reported in
+the Timing Data chapter of this supplement.
+
+@section Methodology
+
+@subsection Software Platform
+
+The RTEMS timing suite is written in C. The overhead
+of passing arguments to RTEMS by C is not timed. The times
+reported represent the amount of time from entering to exiting
+RTEMS.
+
+The tests are based upon one of two execution models:
+(1) single invocation times, and (2) average times of repeated
+invocations. Single invocation times are provided for
+directives which cannot easily be invoked multiple times in the
+same scenario. For example, the times reported for entering and
+exiting an interrupt service routine are single invocation
+times. The second model is used for directives which can easily
+be invoked multiple times in the same scenario. For example,
+the times reported for semaphore obtain and semaphore release
+are averages of multiple invocations. At least 100 invocations
+are used to obtain the average.
+
+@subsection Hardware Platform
+
+Since RTEMS supports a variety of processors, the
+hardware platform used to gather the benchmark times must also
+vary. Therefore, for each processor supported the hardware
+platform must be defined. Each definition will include a brief
+description of the target hardware platform including the clock
+speed, memory wait states encountered, and any other pertinent
+information. This definition may be found in the processor
+dependent timing data chapter within this supplement.
+
+@subsection What is measured?
+
+An effort was made to provide execution times for a
+large portion of RTEMS. Times were provided for most directives
+regardless of whether or not they are typically used in time
+critical code. For example, execution times are provided for
+all object create and delete directives, even though these are
+typically part of application initialization.
+
+The times include all RTEMS actions necessary in a
+particular scenario. For example, all times for blocking
+directives include the context switch necessary to transfer
+control to a new task. Under no circumstances is it necessary
+to add context switch time to the reported times.
+
+The following list describes the objects created by
+the timing suite:
+
+@itemize @bullet
+@item All tasks are non-floating point.
+
+@item All tasks are created as local objects.
+
+@item No timeouts are used on blocking directives.
+
+@item All tasks wait for objects in FIFO order.
+
+@end itemize
+
+In addition, no user extensions are configured.
+
+@subsection What is not measured?
+
+The times presented in this document are not intended
+to represent best or worst case times, nor are all directives
+included. For example, no times are provided for the initialize
+executive and fatal_error_occurred directives. Other than the
+exceptions detailed in the Determinancy section, all directives
+will execute in the fixed length of time given.
+
+Other than entering and exiting an interrupt service
+routine, all directives were executed from tasks and not from
+interrupt service routines. Directives invoked from ISRs, when
+allowable, will execute in slightly less time than when invoked
+from a task because rescheduling is delayed until the interrupt
+exits.
+
+@subsection Terminology
+
+The following is a list of phrases which are used to
+distinguish individual execution paths of the directives taken
+during the RTEMS performance analysis:
+
+@table @b
+@item another task
+The directive was performed
+on a task other than the calling task.
+
+@item available
+A task attempted to obtain a resource and
+immediately acquired it.
+
+@item blocked task
+The task operated upon by the
+directive was blocked waiting for a resource.
+
+@item caller blocks
+The requested resoure was not
+immediately available and the calling task chose to wait.
+
+@item calling task
+The task invoking the directive.
+
+@item messages flushed
+One or more messages was flushed
+from the message queue.
+
+@item no messages flushed
+No messages were flushed from
+the message queue.
+
+@item not available
+A task attempted to obtain a resource
+and could not immediately acquire it.
+
+@item no reschedule
+The directive did not require a
+rescheduling operation.
+
+@item NO_WAIT
+A resource was not available and the
+calling task chose to return immediately via the NO_WAIT option
+with an error.
+
+@item obtain current
+The current value of something was
+requested by the calling task.
+
+@item preempts caller
+The release of a resource caused a
+task of higher priority than the calling to be readied and it
+became the executing task.
+
+@item ready task
+The task operated upon by the directive
+was in the ready state.
+
+@item reschedule
+The actions of the directive
+necessitated a rescheduling operation.
+
+@item returns to caller
+The directive succeeded and
+immediately returned to the calling task.
+
+@item returns to interrupted task
+The instructions
+executed immediately following this interrupt will be in the
+interrupted task.
+
+@item returns to nested interrupt
+The instructions
+executed immediately following this interrupt will be in a
+previously interrupted ISR.
+
+@item returns to preempting task
+The instructions
+executed immediately following this interrupt or signal handler
+will be in a task other than the interrupted task.
+
+@item signal to self
+The signal set was sent to the
+calling task and signal processing was enabled.
+
+@item suspended task
+The task operated upon by the
+directive was in the suspended state.
+
+@item task readied
+The release of a resource caused a
+task of lower or equal priority to be readied and the calling
+task remained the executing task.
+
+@item yield
+The act of attempting to voluntarily release
+the CPU.
+
+@end table
+
diff --git a/doc/common/treedef.tex b/doc/common/treedef.tex
new file mode 100644
index 0000000000..26eda0c28c
--- /dev/null
+++ b/doc/common/treedef.tex
@@ -0,0 +1,317 @@
+% treedef.tex
+%
+% These definitions for tree macros are taken from "Trees in TeX",
+% by David Eppstein, as published in TUGboat 6#1, March 1985.
+% David Eppstein's address (as of 15 June 1988) is
+% Computer Science Department
+% Columbia University
+% New York, NY 10027
+% Eppstein@cs.Columbia.edu
+%
+% Tree -- a macro to make aligned (horizontal) trees in TeX
+%
+% Input is of the form
+% \tree
+% item
+% \subtree
+% \leaf{item}
+% .
+% .
+% .
+% \endsubtree
+% \subtree
+% .
+% .
+% .
+% \endsubtree
+% \endsubtree
+% \endtree
+%
+% Nesting is to any level. \leaf is defined as a subtree of one item:
+% \def\leaf#1{\subtree#1\endsubtree}.
+%
+% A structure:
+% \subtree
+% item_part1
+% item_part2
+% .
+% .
+% .
+%
+% will print item_part2 directly below item_part1 as a single item
+% as if they were in a \box.
+%
+% The macro is a 3-pass macro. On the first pass it sets up a data
+% structure from the \subtree ... \endsubtree definitions. On the second pass
+% it recursively calculates the width of each level of the tree. On the third
+% pass it sets up the boxes, glue and rules.
+%
+% By David Eppstein, TUGboat, vol. 6 (1985), no. 1, pp. 31--35.
+% Transcribed by Margaret Kromer (peg), Feb., 1986.
+%
+% Pass 1
+% At the end of pass 1, the tree is coded as a nested collection of \hboxes
+% and \vboxes.
+\newbox\treebox\newcount\treeboxcnt
+\def\tree{\message{Begin tree}\treeboxcnt=1\global\setbox\treebox=\boxtree}
+\def\subtree{\ettext \advance\treeboxcnt by 1 \boxtree}
+\def\leaf#1{\subtree#1\endsubtree}
+\def\endsubtree{\ettext \egroup \advance\treeboxcnt-1{}%
+ \ifnum\treeboxcnt=-1 \treeerrora\fi}
+\def\endtree{\endsubtree \ifnum\treeboxcnt>0 \treeerrorb\fi%
+ \settreesizes \typesettree \message{-- end tree}}
+% Error messages for unbalanced tree
+\def\treeerrora{\errhelp=\treeerrorahelp%
+ \errmessage{Unbalanced tree -- too many endsubtrees}}
+\newhelp\treeerrorahelp{There are more subtrees closed than opened}
+\def\treeerrorb{\errhelp=\treeerrorbhelp%
+ \errmessage{Unbalanced tree -- not enough endsubtrees}}
+\newhelp\treeerrorbhelp{Not all the subtrees of the tree are closed.
+If you continue, you'll get some mysterious secondary errors.}
+% Set up \vbox containing root of tree
+\newif\iftreetext\treetextfalse % Whether still aligning text
+\def\boxtree{\hbox\bgroup % Start outer box of tree or subtree
+ \baselineskip 2.5ex % Narrow line spacing slightly
+ \tabskip 0pt % No spurious glue in alignment
+ \vbox\bgroup % Start inner text \vbox
+ \treetexttrue % Remember for \ettext
+ \let\par\crcr \obeylines % New line breaks without explicit \cr
+ \halign\bgroup##\hfil\cr} % Start alignment with simple template
+\def\ettext{\iftreetext % Are we still in inner text \vbox?
+ \crcr\egroup \egroup \fi} % Yes, end alignment and box
+% Pass 2
+% Recursively calculate widths of tree with \setsizes; keep results in
+% \treesizes; \treewidth contains total width calculated so far. \treeworkbox
+% is workspace containing subtree being sized.
+\newbox\treeworkbox
+\def\cons#1#2{\edef#2{\xmark #1#2}} % Add something to start of list
+\def\car#1{\expandafter\docar#1\docar} % Take first element of list
+\def\docar\xmark#1\xmark#2\docar{#1} % ..by ignoring rest in expansion
+\def\cdr#1{\expandafter\docdr#1\docdr#1}% Similarly, drop first element
+\def\docdr\xmark#1\xmark#2\docdr#3{\def#3{\xmark #2}}
+\def\xmark{\noexpand\xmark} % List separator expands to self
+\def\nil{\xmark} % Empty list is just separator
+\def\settreesizes{\setbox\treeworkbox=\copy\treebox%
+ \global\let\treesizes\nil \setsizes}
+\newdimen\treewidth % Width of this part of the tree
+\def\setsizes{\setbox\treeworkbox=\hbox\bgroup% Get a horiz list as a workspace
+ \unhbox\treeworkbox\unskip % Take tree, unpack it into horiz list
+ \inittreewidth % Get old width at this level
+ \sizesubtrees % Recurse through all subtrees
+ \sizelevel % Now set width from remaining \vbox
+ \egroup} % All done, finish our \hbox
+\def\inittreewidth{\ifx\treesizes\nil % If this is the first at this level
+ \treewidth=0pt % ..then we have no previous max width
+ \else \treewidth=\car\treesizes % Otherwise take old max level width
+ \global\cdr\treesizes % ..and advance level width storage
+ \fi} % ..in preparation for next level.
+\def\sizesubtrees{\loop % For each box in horiz list (subtree)
+ \setbox\treeworkbox=\lastbox \unskip % ..pull it off list and flush glue
+ \ifhbox\treeworkbox \setsizes % If hbox, it's a subtree - recurse
+ \repeat} % ..and loop; end loop on tree text
+\def\sizelevel{%
+ \ifdim\treewidth<\wd\treeworkbox % If greater than previous maximum
+ \treewidth=\wd\treeworkbox \fi % Then set max to new high
+ \global\cons{\the\treewidth}\treesizes}% In either case, put back on list
+% Pass 3
+% Recursively typeset tree with \maketree by adding an \hbox containing
+% a subtree (in \treebox) to the horizontal list.
+\newdimen\treeheight % Height of this part of the tree
+\newif\ifleaf % Tree has no subtrees (is a leaf)
+\newif\ifbotsub % Bottom subtree of parent
+\newif\iftopsub % Top subtree of parent
+\def\typesettree{\medskip\maketree\medskip} % Make whole tree
+\def\maketree{\hbox{\treewidth=\car\treesizes % Get width at this level
+ \cdr\treesizes % Set up width list for recursion
+ \makesubtreebox\unskip % Set \treebox to text, make subtrees
+ \ifleaf \makeleaf % No subtrees, add glue
+ \else \makeparent \fi}} % Have subtrees, stick them at right
+{\catcode`@=11 % Be able to use \voidb@x
+\gdef\makesubtreebox{\unhbox\treebox % Open up tree or subtree
+ \unskip\global\setbox\treebox\lastbox % Pick up very last box
+ \ifvbox\treebox % If we're already at the \vbox
+ \global\leaftrue \let\next\relax % ..then this is a leaf
+ \else \botsubtrue % Otherwise, we have subtrees
+ \setbox\treeworkbox\box\voidb@x % Init stack of processed subs
+ \botsubtrue \let\next\makesubtree % ..and call \maketree on them
+ \fi \next}} % Finish up for whichever it was
+\def\makesubtree{\setbox1\maketree % Call \maketree on this subtree
+ \unskip\global\setbox\treebox\lastbox % Pick up box before it
+ \treeheight=\ht1 % Get height of subtree we made
+ \advance\treeheight 2ex % Add some room around the edges
+ \ifhbox\treebox \topsubfalse % If picked up box is a \vbox,
+ \else \topsubtrue \fi % ..this is the top, otherwise not
+ \addsubtreebox % Stack subtree with the rest
+ \iftopsub \global\leaffalse % If top, remember not a leaf
+ \let\next\relax \else % ..(after recursion), set return
+ \botsubfalse \let\next\makesubtree % Otherwise, we have more subtrees
+ \fi \next} % Do tail recursion or return
+\def\addsubtreebox{\setbox\treeworkbox=\vbox{\subtreebox\unvbox\treeworkbox}}
+\def\subtreebox{\hbox\bgroup % Start \hbox of tree and lines
+ \vbox to \treeheight\bgroup % Start \vbox for vertical rules
+ \ifbotsub \iftopsub \vfil % If both bottom and top subtree
+ \hrule width 0.4pt % ..vertical rule is just a dot
+ \else \treehalfrule \fi \vfil % Bottom gets half-height rule
+ \else \iftopsub \vfil \treehalfrule % Top gets half-height the other way
+ \else \hrule width 0.4pt height \treeheight \fi\fi % Middle, full height
+ \egroup % Finish vertical rule \vbox
+ \treectrbox{\hrule width 1em}\hskip 0.2em\treectrbox{\box1}\egroup}
+\def\treectrbox#1{\vbox to \treeheight{\vfil #1\vfil}}
+\def\treehalfrule{\dimen\treeworkbox=\treeheight % Get total height
+ \divide\dimen\treeworkbox 2%
+ \advance\dimen\treeworkbox 0.2pt % Divide by two, add half horiz height
+ \hrule width 0.4pt height \dimen\treeworkbox}% Make a vertical rule that high
+\def\makeleaf{\box\treebox} % Add leaf box to horiz list
+\def\makeparent{\ifdim\ht\treebox>%
+ \ht\treeworkbox % If text is higher than subtrees
+ \treeheight=\ht\treebox % ..use that height
+ \else \treeheight=\ht\treeworkbox \fi % Otherwise use height of subtrees
+ \advance\treewidth-\wd\treebox % Take remainder of level width
+ \advance\treewidth 1em % ..after accounting for text and glue
+ \treectrbox{\box\treebox}\hskip 0.2em % Add text, space before connection
+\treectrbox{\hrule width \treewidth}%
+ \treectrbox{\box\treeworkbox}} % Add \hrule, subs
+
+************************************************
+% Plain TeX driver for tree.tex
+
+\def\uncatcodespecials{\catcode`@=12\def\do##1{\catcode`##1=12}\dospecials}
+\def\setupverbatim{\tt\obeylines\uncatcodespecials\obeyspaces}
+{\obeyspaces\global\let =\ }
+\def\beginshowoff{\par\begingroup\setupverbatim\doverbatim}
+{\catcode`\!=0 \catcode`\\=12
+!obeylines!gdef!doverbatim^^M#1\endshowoff{#1!endgroup!medbreak!filbreak%
+!smallskip}}
+
+% see The TeXbook, exercise 22.14
+%\input tree.tex
+\centerline{\bf TREE TREE}
+\bigskip
+\tree
+ {Tree}
+ Uses
+ \subtree
+ Computer
+ Science
+ \subtree
+ Data
+ Structures
+ \leaf{Search Tree}
+ \leaf{Priority Queue}
+ \endsubtree
+ \subtree
+ Parsing
+ \leaf{Parse Tree}
+ \leaf{Symbol Table}
+ \endsubtree
+ \subtree
+ Structured
+ Programming
+ \endsubtree
+ \endsubtree
+ \subtree
+ Genealogy
+ \leaf{Ancestors}
+ \leaf{Descendants}
+ \endsubtree
+ \subtree
+ Electrical
+ Engineering
+ \subtree
+ Paper
+ \leaf{{\it Vitae}}
+ \leaf{Announcements}
+ \leaf{Proposals}
+ \leaf{\TeX{} Samples}
+ \endsubtree
+ \endsubtree
+ \subtree
+ Construction
+ \leaf{Fences}
+ \subtree
+ Buildings
+ \subtree
+ Houses
+ \leaf{Human}
+ \leaf{Dog}
+ \leaf{Bird}
+ \leaf{Tree}
+ \endsubtree
+ \leaf{Barns}
+ \leaf{Other}
+ \endsubtree
+ \leaf{\dots}
+ \endsubtree
+ \subtree
+ Taxonomies
+ \leaf{Tree Uses}
+ \endsubtree
+\endtree
+
+\vskip.5truein
+\beginshowoff
+% see The TeXbook, exercise 22.14
+\input tree.tex
+\centerline{TREE TREE}
+\bigskip
+\tree
+ Tree
+ Uses
+ \subtree
+ Computer
+ Science
+ \subtree
+ Data
+ Structures
+ \leaf{Search Tree}
+ \leaf{Priority Queue}
+ \endsubtree
+ \subtree
+ Parsing
+ \leaf{Parse Tree}
+ \leaf{Symbol Table}
+ \endsubtree
+ \subtree
+ Structured
+ Programming
+ \endsubtree
+ \endsubtree
+ \subtree
+ Genealogy
+ \leaf{Ancestors}
+ \leaf{Descendants}
+ \endsubtree
+ \subtree
+ Electrical
+ Engineering
+ \subtree
+ Paper
+ \leaf{{\it Vitae}}
+ \leaf{Announcements}
+ \leaf{Proposals}
+ \leaf{\TeX{} Samples}
+ \endsubtree
+ \endsubtree
+ \subtree
+ Construction
+ \leaf{Fences}
+ \subtree
+ Buildings
+ \subtree
+ Houses
+ \leaf{Human}
+ \leaf{Dog}
+ \leaf{Bird}
+ \leaf{Tree}
+ \endsubtree
+ \leaf{Barns}
+ \leaf{Other}
+ \endsubtree
+ \leaf{\dots}
+ \endsubtree
+ \subtree
+ Taxonomies
+ \leaf{Tree Uses}
+ \endsubtree
+\endtree
+\endshowoff
diff --git a/doc/common/wksheets.t b/doc/common/wksheets.t
new file mode 100644
index 0000000000..e60bf116db
--- /dev/null
+++ b/doc/common/wksheets.t
@@ -0,0 +1,409 @@
+@c ****** This comment is here to remind you not to edit the wksheets.t
+@c ****** in any directory but common.
+@c
+@c Figures ...
+@c RTEMS RAM Workspace Worksheet
+@c RTEMS Code Space Worksheet
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Memory Requirements
+
+@section Introduction
+
+Memory is typically a limited resource in real-time
+embedded systems, therefore, RTEMS can be configured to utilize
+the minimum amount of memory while meeting all of the
+applications requirements. Worksheets are provided which allow
+the RTEMS application developer to determine the amount of RTEMS
+code and RAM workspace which is required by the particular
+configuration. Also provided are the minimum code space,
+maximum code space, and the constant data space required by
+RTEMS.
+
+@section Data Space Requirements
+
+RTEMS requires a small amount of memory for its
+private variables. This data area must be in RAM and is
+separate from the RTEMS RAM Workspace. The following
+illustrates the data space required for all configurations of
+RTEMS:
+
+@itemize @bullet
+@item Data Space: RTEMS_DATA_SPACE
+@end itemize
+
+@section Minimum and Maximum Code Space Requirements
+
+A maximum configuration of RTEMS includes the core
+and all managers, including the multiprocessing manager.
+Conversely, a minimum configuration of RTEMS includes only the
+core and the following managers: initialization, task, interrupt
+and fatal error. The following illustrates the code space
+required by these configurations of RTEMS:
+
+@itemize @bullet
+@item Minimum Configuration: RTEMS_MINIMUM_CONFIGURATION
+@item Maximum Configuration: RTEMS_MAXIMUM_CONFIGURATION
+@end itemize
+
+@section RTEMS Code Space Worksheet
+
+The RTEMS Code Space Worksheet is a tool provided to
+aid the RTEMS application designer to accurately calculate the
+memory required by the RTEMS run-time environment. RTEMS allows
+the custom configuration of the executive by optionally
+excluding managers which are not required by a particular
+application. This worksheet provides the included and excluded
+size of each manager in tabular form allowing for the quick
+calculation of any custom configuration of RTEMS. The RTEMS
+Code Space Worksheet is below:
+
+@ifset use-ascii
+@page
+@end ifset
+@ifset use-tex
+@page
+@end ifset
+
+@page
+@center @b{RTEMS Code Space Worksheet}
+@sp 1
+
+@ifset use-ascii
+
+The following is a list of the components of the RTEMS code space. The first
+number in parentheses is the size when the component is included,
+while the second number indicates its size when not included. If the second
+number is "NA", then the component must always be included.
+
+@itemize @bullet
+@item Core (RTEMS_CORE_CODE_SIZE, NA)
+@item Initialization (RTEMS_INITIALIZATION_CODE_SIZE, NA)
+@item Task (RTEMS_TASK_CODE_SIZE, NA)
+@item Interrupt (RTEMS_INTERRUPT_CODE_SIZE, NA)
+@item Clock (RTEMS_CLOCK_CODE_SIZE, NA)
+@item Timer (RTEMS_TIMER_CODE_SIZE, RTEMS_TIMER_CODE_OPTSIZE)
+@item Semaphore (RTEMS_SEMAPHORE_CODE_SIZE, RTEMS_SEMAPHORE_CODE_OPTSIZE)
+@item Message (RTEMS_MESSAGE_CODE_SIZE, RTEMS_MESSAGE_CODE_OPTSIZE)
+@item Event (RTEMS_EVENT_CODE_SIZE, RTEMS_EVENT_CODE_OPTSIZE)
+@item Signal (RTEMS_SIGNAL_CODE_SIZE, RTEMS_SIGNAL_CODE_OPTSIZE)
+@item Partition (RTEMS_PARTITION_CODE_SIZE, RTEMS_PARTITION_CODE_OPTSIZE)
+@item Region (RTEMS_REGION_CODE_SIZE, RTEMS_REGION_CODE_OPTSIZE)
+@item Dual Ported Memory (RTEMS_DPMEM_CODE_SIZE, RTEMS_DPMEM_CODE_OPTSIZE)
+@item I/O (RTEMS_IO_CODE_SIZE, RTEMS_IO_CODE_OPTSIZE)
+@item Fatal Error (RTEMS_FATAL_ERROR_CODE_SIZE, NA)
+@item Rate Monotonic (RTEMS_RATE_MONOTONIC_CODE_SIZE, RTEMS_RATE_MONOTONIC_CODE_OPTSIZE)
+@item Multiprocessing (RTEMS_MULTIPROCESSING_CODE_SIZE, RTEMS_MULTIPROCESSING_CODE_OPTSIZE)
+@end itemize
+@end ifset
+
+@ifset use-tex
+
+@tex
+\line{\hskip 0.50in\vbox{\offinterlineskip\halign{
+\vrule\strut#&
+\hbox to 2.25in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 1.00in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 1.00in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 1.25in{\enskip\hfil#\hfil}&
+\vrule#\cr
+\noalign{\hrule}
+&\bf Component && \bf Included && \bf Not Included && \bf Size &\cr\noalign{\hrule}
+&Core && RTEMS_CORE_CODE_SIZE && NA && &\cr\noalign{\hrule}
+&Initialization && RTEMS_INITIALIZATION_CODE_SIZE && NA && &\cr\noalign{\hrule}
+&Task && RTEMS_TASK_CODE_SIZE && NA && &\cr\noalign{\hrule}
+&Interrupt && RTEMS_INTERRUPT_CODE_SIZE && NA && &\cr\noalign{\hrule}
+&Clock && RTEMS_CLOCK_CODE_SIZE && NA && &\cr\noalign{\hrule}
+&Timer && RTEMS_TIMER_CODE_SIZE && RTEMS_TIMER_CODE_OPTSIZE && &\cr\noalign{\hrule}
+&Semaphore && RTEMS_SEMAPHORE_CODE_SIZE && RTEMS_SEMAPHORE_CODE_OPTSIZE && &\cr\noalign{\hrule}
+&Message && RTEMS_MESSAGE_CODE_SIZE && RTEMS_MESSAGE_CODE_OPTSIZE && &\cr\noalign{\hrule}
+&Event && RTEMS_EVENT_CODE_SIZE && RTEMS_EVENT_CODE_OPTSIZE && &\cr\noalign{\hrule}
+&Signal && RTEMS_SIGNAL_CODE_SIZE && RTEMS_SIGNAL_CODE_OPTSIZE && &\cr\noalign{\hrule}
+&Partition && RTEMS_PARTITION_CODE_SIZE && RTEMS_PARTITION_CODE_OPTSIZE && &\cr\noalign{\hrule}
+&Region && RTEMS_REGION_CODE_SIZE && RTEMS_REGION_CODE_OPTSIZE && &\cr\noalign{\hrule}
+&Dual Ported Memory && RTEMS_DPMEM_CODE_SIZE && RTEMS_DPMEM_CODE_OPTSIZE && &\cr\noalign{\hrule}
+&I/O && RTEMS_IO_CODE_SIZE && RTEMS_IO_CODE_OPTSIZE && &\cr\noalign{\hrule}
+&Fatal Error && RTEMS_FATAL_ERROR_CODE_SIZE && NA && &\cr\noalign{\hrule}
+&Rate Monotonic && RTEMS_RATE_MONOTONIC_CODE_SIZE && RTEMS_RATE_MONOTONIC_CODE_OPTSIZE && &\cr\noalign{\hrule}
+&Multiprocessing && RTEMS_MULTIPROCESSING_CODE_SIZE && RTEMS_MULTIPROCESSING_CODE_OPTSIZE && &\cr\noalign{\hrule}
+&\multispan 5 \bf\hfil Total Code Space Requirements\qquad\hfil&&&\cr\noalign{\hrule}
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=4 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=center><STRONG>Component</STRONG></TD>
+ <TD ALIGN=center><STRONG>Included</STRONG></TD>
+ <TD ALIGN=center><STRONG>Not Included</STRONG></TD>
+ <TD ALIGN=center><STRONG>Size</STRONG></TD></TR>
+<TR><TD ALIGN=center>Core</TD>
+ <TD ALIGN=center>RTEMS_CORE_CODE_SIZE</TD>
+ <TD ALIGN=center>NA</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=center>Initialization</TD>
+ <TD ALIGN=center>RTEMS_INITIALIZATION_CODE_SIZE</TD>
+ <TD ALIGN=center>NA</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=center>Task</TD>
+ <TD ALIGN=center>RTEMS_TASK_CODE_SIZE</TD>
+ <TD ALIGN=center>NA</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=center>Interrupt</TD>
+ <TD ALIGN=center>RTEMS_INTERRUPT_CODE_SIZE</TD>
+ <TD ALIGN=center>NA</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=center>Clock</TD>
+ <TD ALIGN=center>RTEMS_CLOCK_CODE_SIZE</TD>
+ <TD ALIGN=center>NA</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=center>Timer</TD>
+ <TD ALIGN=center>RTEMS_TIMER_CODE_SIZE</TD>
+ <TD ALIGN=center>RTEMS_TIMER_CODE_OPTSIZE</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=center>Semaphore</TD>
+ <TD ALIGN=center>RTEMS_SEMAPHORE_CODE_SIZE</TD>
+ <TD ALIGN=center>RTEMS_SEMAPHORE_CODE_OPTSIZE</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=center>Message</TD>
+ <TD ALIGN=center>RTEMS_MESSAGE_CODE_SIZE</TD>
+ <TD ALIGN=center>RTEMS_MESSAGE_CODE_OPTSIZE</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=center>Event</TD>
+ <TD ALIGN=center>RTEMS_EVENT_CODE_SIZE</TD>
+ <TD ALIGN=center>RTEMS_EVENT_CODE_OPTSIZE</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=center>Signal</TD>
+ <TD ALIGN=center>RTEMS_SIGNAL_CODE_SIZE</TD>
+ <TD ALIGN=center>RTEMS_SIGNAL_CODE_OPTSIZE</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=center>Partition</TD>
+ <TD ALIGN=center>RTEMS_PARTITION_CODE_SIZE</TD>
+ <TD ALIGN=center>RTEMS_PARTITION_CODE_OPTSIZE</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=center>Region</TD>
+ <TD ALIGN=center>RTEMS_REGION_CODE_SIZE</TD>
+ <TD ALIGN=center>RTEMS_REGION_CODE_OPTSIZE</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=center>Dual Ported Memory</TD>
+ <TD ALIGN=center>RTEMS_DPMEM_CODE_SIZE</TD>
+ <TD ALIGN=center>RTEMS_DPMEM_CODE_OPTSIZE</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=center>I/O</TD>
+ <TD ALIGN=center>RTEMS_IO_CODE_SIZE</TD>
+ <TD ALIGN=center>RTEMS_IO_CODE_OPTSIZE</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=center>Fatal Error</TD>
+ <TD ALIGN=center>RTEMS_FATAL_ERROR_CODE_SIZE</TD>
+ <TD ALIGN=center>NA</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=center>Rate Monotonic</TD>
+ <TD ALIGN=center>RTEMS_RATE_MONOTONIC_CODE_SIZE</TD>
+ <TD ALIGN=center>RTEMS_RATE_MONOTONIC_CODE_OPTSIZE</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=center>Multiprocessing</TD>
+ <TD ALIGN=center>RTEMS_MULTIPROCESSING_CODE_SIZE</TD>
+ <TD ALIGN=center>RTEMS_MULTIPROCESSING_CODE_OPTSIZE</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=center COLSPAN=3>
+ <STRONG>Total Code Space Requirements</STRONG></TD>
+ <TD><BR></TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+@page
+
+@c ****** Next node is set by a sed script in the document Makefile.
+@c ****** This comment is here to remind you not to edit the wksheets.t
+@c ****** in any directory but common.
+
+@section RTEMS RAM Workspace Worksheet
+
+The RTEMS RAM Workspace Worksheet is a tool provided
+to aid the RTEMS application designer to accurately calculate
+the minimum memory block to be reserved for RTEMS use. This
+worksheet provides equations for calculating the amount of
+memory required based upon the number of objects configured,
+whether for single or multiple processor versions of the
+executive. This information is presented in tabular form, along
+with the fixed system requirements, allowing for quick
+calculation of any application defined configuration of RTEMS.
+The RTEMS RAM Workspace Worksheet is provided below:
+
+@ifset use-ascii
+@page
+@end ifset
+@ifset use-tex
+@sp 2
+@end ifset
+
+@center @b{RTEMS RAM Workspace Worksheet}
+@sp 2
+
+@ifset use-ascii
+The total RTEMS RAM Workspace required is the sum of the following:
+
+@itemize @bullet
+@item maximum_tasks * RTEMS_BYTES_PER_TASK
+@item maximum_timers * RTEMS_BYTES_PER_TIMER
+@item maximum_semaphores * RTEMS_BYTES_PER_SEMAPHORE
+@item maximum_message_queues * RTEMS_BYTES_PER_MESSAGE_QUEUE
+@item maximum_regions * RTEMS_BYTES_PER_REGION
+@item maximum_partitions * RTEMS_BYTES_PER_PARTITION
+@item maximum_ports * RTEMS_BYTES_PER_PORT
+@item maximum_periods * RTEMS_BYTES_PER_PERIOD
+@item maximum_extensions * RTEMS_BYTES_PER_EXTENSION
+@item Floating Point Tasks * RTEMS_BYTES_PER_FP_TASK
+@item Task Stacks
+@item maximum_nodes * RTEMS_BYTES_PER_NODE
+@item maximum_global_objects * RTEMS_BYTES_PER_GLOBAL_OBJECT
+@item maximum_proxies * RTEMS_BYTES_PER_PROXY
+@item Fixed System Requirements of RTEMS_BYTES_OF_FIXED_SYSTEM_REQUIREMENTS
+@end itemize
+@end ifset
+
+@ifset use-tex
+@tex
+\line{\hskip 0.75in\vbox{\offinterlineskip\halign{
+\vrule\strut#&
+\hbox to 3.0in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 0.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 1.25in{\enskip\hfil#\hfil}&
+\vrule#\cr
+\noalign{\hrule}
+& \bf Description && \bf Equation && \bf Bytes Required &\cr\noalign{\hrule}
+& maximum\_tasks && * RTEMS_BYTES_PER_TASK = &&&\cr\noalign{\hrule}
+& maximum\_timers && * RTEMS_BYTES_PER_TIMER = &&&\cr\noalign{\hrule}
+& maximum\_semaphores && * RTEMS_BYTES_PER_SEMAPHORE = &&&\cr\noalign{\hrule}
+& maximum\_message\_queues && * RTEMS_BYTES_PER_MESSAGE_QUEUE = &&&\cr\noalign{\hrule}
+& maximum\_regions && * RTEMS_BYTES_PER_REGION = &&&\cr\noalign{\hrule}
+& maximum\_partitions && * RTEMS_BYTES_PER_PARTITION = &&&\cr\noalign{\hrule}
+& maximum\_ports && * RTEMS_BYTES_PER_PORT = &&&\cr\noalign{\hrule}
+& maximum\_periods && * RTEMS_BYTES_PER_PERIOD = &&&\cr\noalign{\hrule}
+& maximum\_extensions && * RTEMS_BYTES_PER_EXTENSION = &&&\cr\noalign{\hrule}
+& Floating Point Tasks && * RTEMS_BYTES_PER_FP_TASK = &&&\cr\noalign{\hrule}
+& Task Stacks &&\hskip 2.3em=&&&\cr\noalign{\hrule}
+& Total Single Processor Requirements &&&&&\cr\noalign{\hrule}
+}}\hfil}
+
+\line{\hskip 0.75in\vbox{\offinterlineskip\halign{
+\vrule\strut#&
+\hbox to 3.0in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 0.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 1.25in{\enskip\hfil#\hfil}&
+\vrule#\cr
+\noalign{\hrule}
+& \bf Description && \bf Equation && \bf Bytes Required &\cr\noalign{\hrule}
+& maximum\_nodes && * RTEMS_BYTES_PER_NODE = &&&\cr\noalign{\hrule}
+& maximum\_global\_objects && * RTEMS_BYTES_PER_GLOBAL_OBJECT = &&&\cr\noalign{\hrule}
+& maximum\_proxies && * RTEMS_BYTES_PER_PROXY = &&&\cr\noalign{\hrule}
+}}\hfil}
+
+\line{\hskip 0.75in\vbox{\offinterlineskip\halign{
+\vrule\strut#&
+\hbox to 3.0in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 0.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 1.25in{\enskip\hfil#\hfil}&
+\vrule#\cr
+\noalign{\hrule}
+& Total Multiprocessing Requirements &&&&&\cr\noalign{\hrule}
+& Fixed System Requirements && RTEMS_BYTES_OF_FIXED_SYSTEM_REQUIREMENTS &&&\cr\noalign{\hrule}
+& Total Single Processor Requirements &&&&&\cr\noalign{\hrule}
+& Total Multiprocessing Requirements &&&&&\cr\noalign{\hrule}
+& Minimum Bytes for RTEMS Workspace &&&&&\cr\noalign{\hrule}
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=3 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=center><STRONG>Description</STRONG></TD>
+ <TD ALIGN=center><STRONG>Equation</STRONG></TD>
+ <TD ALIGN=center><STRONG>Bytes Required</STRONG></TD></TR>
+<TR><TD ALIGN=left>maximum_tasks</TD>
+ <TD ALIGN=right>* RTEMS_BYTES_PER_TASK =</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=left>maximum_timers</TD>
+ <TD ALIGN=right>* RTEMS_BYTES_PER_TIMER =</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=left>maximum_semaphores</TD>
+ <TD ALIGN=right>* RTEMS_BYTES_PER_SEMAPHORE =</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=left>maximum_message_queues</TD>
+ <TD ALIGN=right>* RTEMS_BYTES_PER_MESSAGE_QUEUE =</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=left>maximum_regions</TD>
+ <TD ALIGN=right>* RTEMS_BYTES_PER_REGION =</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=left>maximum_partitions</TD>
+ <TD ALIGN=right>* RTEMS_BYTES_PER_PARTITION =</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=left>maximum_ports</TD>
+ <TD ALIGN=right>* RTEMS_BYTES_PER_PORT =</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=left>maximum_periods</TD>
+ <TD ALIGN=right>* RTEMS_BYTES_PER_PERIOD =</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=left>maximum_extensions</TD>
+ <TD ALIGN=right>* RTEMS_BYTES_PER_EXTENSION =</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=left>Floating Point Tasks</TD>
+ <TD ALIGN=right>* RTEMS_BYTES_PER_FP_TASK =</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=left COLSPAN=2>Task Stacks</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=left COLSPAN=2>
+ <STRONG>Total Single Processor Requirements</STRONG></TD>
+ <TD><BR></TD></TR>
+<TR></TR>
+<TR><TD ALIGN=center><STRONG>Description</STRONG></TD>
+ <TD ALIGN=center><STRONG>Equation</STRONG></TD>
+ <TD ALIGN=center><STRONG>Bytes Required</STRONG></TD></TR>
+<TR><TD ALIGN=left>maximum_nodes</TD>
+ <TD ALIGN=right>* RTEMS_BYTES_PER_NODE =</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=left>maximum_global_objects</TD>
+ <TD ALIGN=right>* RTEMS_BYTES_PER_GLOBAL_OBJECT =</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=left>maximum_proxies</TD>
+ <TD ALIGN=right>* RTEMS_BYTES_PER_PROXY =</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=left COLSPAN=2>
+ <STRONG>Total Multiprocessing Requirements</STRONG></TD>
+ <TD><BR></TD></TR>
+<TR></TR>
+<TR><TD ALIGN=left COLSPAN=2>Fixed System Requirements</TD>
+ <TD ALIGN=center>RTEMS_BYTES_OF_FIXED_SYSTEM_REQUIREMENTS</TD></TR>
+<TR><TD ALIGN=left COLSPAN=2>Total Single Processor Requirements</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=left COLSPAN=2>Total Multiprocessing Requirements</TD>
+ <TD><BR></TD></TR>
+<TR><TD ALIGN=left COLSPAN=2>
+ <STRONG>Minimum Bytes for RTEMS Workspace</STRONG></TD>
+ <TD><BR></TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
diff --git a/doc/configure.ac b/doc/configure.ac
new file mode 100644
index 0000000000..173fc2345a
--- /dev/null
+++ b/doc/configure.ac
@@ -0,0 +1,230 @@
+dnl Process this file with autoconf to produce a configure script.
+
+AC_PREREQ(2.59)
+
+AC_INIT([rtems-doc],[_RTEMS_VERSION],[rtems-bugs@rtems.com])
+AC_CONFIG_SRCDIR([project.am])
+RTEMS_TOP([..])
+
+AM_INIT_AUTOMAKE([no-define foreign 1.8])
+AM_MAINTAINER_MODE
+
+RTEMS_ENABLE_RPMPREFIX
+
+AC_ARG_ENABLE(html,
+[ --disable-html disable html support ],
+[case $enableval in
+yes) ;;
+no) ;;
+*) AC_MSG_ERROR("invalid value");;
+esac],
+[enable_html="yes"]
+)
+
+AC_ARG_ENABLE(dvi,
+[ --disable-dvi disable dvi support ],
+[case $enableval in
+yes) ;;
+no) ;;
+*) AC_MSG_ERROR("invalid value");;
+esac],
+[enable_dvi="yes"]
+)
+
+AC_ARG_ENABLE(pdf,
+[ --disable-pdf disable pdf support ],
+[case $enableval in
+yes) ;;
+no) ;;
+*) AC_MSG_ERROR("invalid value");;
+esac],
+[enable_pdf="yes"]
+)
+
+AC_ARG_ENABLE(ps,
+[ --disable-ps disable ps support ],
+[case $enableval in
+yes) ;;
+no) ;;
+*) AC_MSG_ERROR("invalid value");;
+esac],
+[enable_ps="yes"]
+)
+
+AC_ARG_ENABLE(papersize,
+[ --enable-papersize=[letter|a4|] set papersize [default:system defaults]],
+[case $enableval in
+a4) papersize=a4 ;;
+letter) papersize=letter ;;
+yes) papersize= ;;
+no) papersize= ;;
+*) AC_MSG_ERROR([Invalid papersize])
+;;
+esac],
+[papersize=]
+)
+
+pkgdocdir="\$(datadir)/rtems"
+AC_SUBST(pkgdocdir)
+
+htmldir="\$(pkgdocdir)/html"
+AC_SUBST(htmldir)
+
+dnl Checks for programs.
+AC_PROG_LN_S
+
+AC_CHECK_PROGS(PERL,perl)
+
+TEXI2WWW='$(PERL) $(top_srcdir)/tools/texi2www/texi2www'
+AC_SUBST(TEXI2WWW)
+
+AC_CHECK_PROGS(GS,gs)
+AM_CONDITIONAL(GS,test x"$GS" != x"")
+
+AC_CHECK_PROGS(TEXI2DVI,texi2dvi)
+AM_CONDITIONAL(TEXI2DVI,test x"$TEXI2DVI" != x"")
+
+AC_CHECK_PROGS(EPSTOPDF,epstopdf)
+AM_CONDITIONAL(EPSTOPDF,
+ test "$enable_pdf" = "yes" \
+ && test x"$EPSTOPDF" != x"" )
+
+AC_CHECK_PROGS(TEXI2PDF,texi2pdf)
+AM_CONDITIONAL(TEXI2PDF,
+ test "$enable_pdf" = "yes" \
+ && test x"$TEXI2PDF" != x"")
+
+AM_CONDITIONAL(USE_HTML,
+ test "$enable_html" = "yes" \
+ && test x"PERL" != x"" )
+
+AM_CONDITIONAL(USE_DVI,
+ test "$enable_dvi" = "yes" \
+ && test x"$TEXI2DVI" != x"" )
+
+AM_CONDITIONAL(USE_PS,
+ test "$enable_ps" = "yes" \
+ && test x"$TEXI2DVI" != x"" )
+
+AM_CONDITIONAL(USE_PDF,
+ test "$enable_pdf" = "yes" \
+ && test x"$TEXI2DVI" != x"" \
+ && test x"$TEXI2PDF" != x"" )
+
+case $papersize in
+a4)
+ TEXI2DVI="${TEXI2DVI} --texinfo=@afourpaper"
+ TEXI2PDF="${TEXI2PDF} --texinfo=@afourpaper"
+ DVIPS="dvips -t a4"
+;;
+letter)
+ DVIPS="dvips -t letter"
+ ;;
+*)
+ DVIPS="dvips"
+;;
+esac
+AC_SUBST(DVIPS)
+
+BMENU2='$(top_builddir)/tools/bmenu/bmenu2'
+AC_SUBST(BMENU2)
+
+dnl Checks for libraries.
+
+dnl Checks for header files.
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+
+dnl Checks for library functions.
+
+AC_MSG_CHECKING([for ../scripts/setup.def])
+AS_IF([test -f ${srcdir}/../scripts/setup.def],[
+. ${srcdir}/../scripts/setup.def
+AC_MSG_RESULT([done])
+],[
+AC_MSG_ERROR([missing])
+])
+
+AS_IF([test -z "$binutils_patch_version"],
+[set_binutils_patch="@clear BINUTILSPATCHVERSION"],
+[set_binutils_patch="@set BINUTILSPATCHVERSION $binutils_patch_version"])
+
+AS_IF([test -z "$gcc3newlib_patch_version"],
+[set_newlib_patch="@clear NEWLIBPATCHVERSION"],
+[set_newlib_patch="@set NEWLIBPATCHVERSION $gcc3newlib_patch_version"])
+
+AS_IF([test -z "$gcc3_patch_version"],
+[set_gcc3_patch="@clear GCCPATCHVERSION"],
+[set_gcc_patch="@set GCCPATCHVERSION $gcc3_patch_version"])
+
+AS_IF([test -z "$gdb_patch_version"],
+[set_gdb_patch="@clear GDBPATCHVERSION"],
+[set_gdb_patch="@set GDBPATCHVERSION $gdb_patch_version"])
+
+AC_CONFIG_SUBDIRS(tools)
+
+AC_CONFIG_FILES([Makefile],[],[
+test -d common || mkdir common
+cat << EOF > common/rtems.sed~
+:t
+s/@RTEMSAPI@/RTEMS_API/;t t
+s,@RTEMSPREFIX@,$prefix,;t t
+s,@RTEMSRPMPREFIX@,$rpmprefix,;t t
+s,@RTEMSRPMGROUP@,RTEMS/]RTEMS_API[,;t t
+EOF
+_RTEMS_UPDATE_CONDITIONAL([common/rtems.sed],[common/rtems.sed~])
+])
+
+AC_CONFIG_FILES([
+index.html
+FAQ/Makefile
+develenv/Makefile
+user/Makefile
+bsp_howto/Makefile])
+
+AC_CONFIG_FILES([started/Makefile],[],[
+test -d started || mkdir started
+cat << EOF > started/tversions.sed~
+:t
+s/@GCCVERSION@/$gcc3_version/;t t
+s/@BINUTILSVERSION@/$binutils_version/;t t
+s/@NEWLIBVERSION@/$gcc3newlib_version/;t t
+s/@GDBVERSION@/$gdb_version/;t t
+s/@SETBINUTILSPATCHVERSION@/$set_binutils_patch/;t t
+s/@SETGCCPATCHVERSION@/$set_gcc_patch/;t t
+s/@SETNEWLIBPATCHVERSION@/$set_newlib_patch/;t t
+s/@SETGDBPATCHVERSION@/$set_gdb_patch/;t t
+s/@GCCRPMRELEASE@/$gcc3newlib_rpm_release/;t t
+s/@BINUTILSRPMRELEASE@/$binutils_rpm_release/;t t
+s/@GDBRPMRELEASE@/$gdb_rpm_release/;t t
+EOF
+_RTEMS_UPDATE_CONDITIONAL([started/tversions.sed],[started/tversions.sed~])
+])
+
+AC_CONFIG_FILES([
+porting/Makefile
+networking/Makefile
+posix_users/Makefile
+posix1003.1/Makefile
+filesystem/Makefile
+itron3.0/Makefile
+ada_user/Makefile
+started_ada/Makefile
+rtems_gdb/Makefile
+rgdb_specs/Makefile
+relnotes/Makefile
+new_chapters/Makefile
+supplements/Makefile
+supplements/arm/Makefile
+supplements/c4x/Makefile
+supplements/i386/Makefile
+supplements/i960/Makefile
+supplements/m68k/Makefile
+supplements/mips/Makefile
+supplements/powerpc/Makefile
+supplements/sh/Makefile
+supplements/sparc/Makefile
+supplements/template/Makefile
+gnu_docs/Makefile
+])
+AC_OUTPUT
diff --git a/doc/develenv/.cvsignore b/doc/develenv/.cvsignore
new file mode 100644
index 0000000000..c3b9831dda
--- /dev/null
+++ b/doc/develenv/.cvsignore
@@ -0,0 +1,22 @@
+develenv
+develenv.aux
+develenv.cp
+develenv.dvi
+develenv.fn
+develenv*.html
+develenv.ky
+develenv.log
+develenv.pdf
+develenv.pg
+develenv.ps
+develenv.toc
+develenv.tp
+develenv.vr
+index.html
+Makefile
+Makefile.in
+mdate-sh
+rtems_footer.html
+rtems_header.html
+stamp-vti
+version.texi
diff --git a/doc/develenv/Makefile.am b/doc/develenv/Makefile.am
new file mode 100644
index 0000000000..a1d7f75a10
--- /dev/null
+++ b/doc/develenv/Makefile.am
@@ -0,0 +1,41 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = develenv
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/main.am
+
+FILES = direct.texi intro.texi sample.texi utils.texi
+
+GENERATED_FILES = direct.texi sample.texi utils.texi
+
+COMMON_FILES += $(top_srcdir)/common/cpright.texi
+
+info_TEXINFOS = develenv.texi
+develenv_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+direct.texi: direct.t
+ $(BMENU2) -p "Introduction" \
+ -u "Top" \
+ -n "Sample Applications" < $< > $@
+
+sample.texi: sample.t
+ $(BMENU2) -p "Directory Structure Documentation Directory" \
+ -u "Top" \
+ -n "RTEMS Specific Utilities" < $< > $@
+
+utils.texi: utils.t
+ $(BMENU2) -p "Sample Applications Network Loopback Test" \
+ -u "Top" \
+ -n "Command and Variable Index" < $< > $@
+
+CLEANFILES += develenv.info
+
+EXTRA_DIST = direct.t sample.t utils.t
diff --git a/doc/develenv/develenv.texi b/doc/develenv/develenv.texi
new file mode 100644
index 0000000000..2416b5bd6a
--- /dev/null
+++ b/doc/develenv/develenv.texi
@@ -0,0 +1,114 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename develenv.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file
+@c
+
+@c Joel's Questions
+@c
+@c 1. Why does paragraphindent only impact makeinfo?
+@c 2. Why does paragraphindent show up in HTML?
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS On-Line Manual
+@direntry
+* RTEMS Development Environment Guide: (develenv).
+@end direntry
+@end ifset
+
+
+@c variable substitution info:
+@c
+@c @set LANGUAGE C
+@c the language is @value{LANGUAGE}
+@c NOTE: don't use underscore in the name
+@c
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage RTEMS Development Environment Guide
+
+@setchapternewpage odd
+@settitle RTEMS Development Environment Guide
+@titlepage
+@finalout
+
+@title RTEMS Development Environment Guide
+@subtitle Edition @value{EDITION}, for RTEMS @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include intro.texi
+@include direct.texi
+@include sample.texi
+@include utils.texi
+
+@ifinfo
+@node Top, Introduction, (dir), (dir)
+@top develenv
+
+This is the online version of the RTEMS Development Environment Guide.
+
+@menu
+* Introduction::
+* Directory Structure::
+* Sample Applications::
+* RTEMS Specific Utilities::
+* Command and Variable Index::
+* Concept Index::
+@end menu
+
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@node Command and Variable Index, Concept Index, RTEMS Specific Utilities size_rtems - report RTEMS size information, Top
+@unnumbered Command and Variable Index
+
+There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@node Concept Index, , Command and Variable Index, Top
+@unnumbered Concept Index
+
+There are currently no Concept Index entries.
+@c @printindex cp
+
+@contents
+@bye
+
diff --git a/doc/develenv/direct.t b/doc/develenv/direct.t
new file mode 100644
index 0000000000..50de20f42c
--- /dev/null
+++ b/doc/develenv/direct.t
@@ -0,0 +1,696 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Directory Structure
+
+The RTEMS directory structure is designed to meet
+the following requirements:
+
+@itemize @bullet
+@item encourage development of modular components.
+
+@item isolate processor and target dependent code, while
+allowing as much common source code as possible to be shared
+across multiple processors and target boards.
+
+@item allow multiple RTEMS users to perform simultaneous
+compilation of RTEMS and its support facilities for different
+processors and targets.
+@end itemize
+
+The resulting directory structure has processor and
+board dependent source files isolated from generic files. When
+RTEMS is configured and built, object directories and
+an install point will be automatically created based upon
+the target CPU family and BSP selected.
+
+The placement of object files based upon the selected BSP name
+ensures that object files are not mixed across CPUs or targets.
+This in combination with the makefiles allows the specific
+compilation options to be tailored for a particular target
+board. For example, the efficiency of the memory subsystem for
+a particular target board may be sensitive to the alignment of
+data structures, while on another target board with the same
+processor memory may be very limited. For the first target, the
+options could specify very strict alignment requirements, while
+on the second the data structures could be @i{packed} to conserve
+memory. It is impossible to achieve this degree of flexibility
+without providing source code.
+
+The RTEMS source tree is organized based on the following variables:
+
+@itemize @bullet
+
+@item functionality,
+@item target processor family,
+@item target processor model,
+@item peripherals, and
+@item target board.
+
+@end itemize
+
+Each of the following sections will describe the
+contents of the directories in the RTEMS source
+tree. The top of the tree will be referenced
+as @code{$@{RTEMS_ROOT@}} in this discussion.
+
+@c
+@c Top Level Tree
+@c
+
+@c @ifset use-ascii
+@example
+@group
+ rtems-VERSION
+ |
+ +--------+----+----+----+--+-----+---+------+-----+
+ | | | | | | | | |
+aclocal automake c contrib cpukit doc make scripts tools
+@end group
+@end example
+@c @end ifset
+
+@ifset use-tex
+@end ifset
+
+@ifset use-html
+@html
+@end html
+@end ifset
+
+@table @code
+@item $@{RTEMS_ROOT@}/aclocal/
+This directory contains the custom M4 macros which are available to
+the various GNU autoconf @code{configure.ac} scripts throughout
+the RTEMS source tree. GNU autoconf interprets @code{configure.ac}
+files to produce the @code{configure} files used to tailor
+RTEMS build for a particular host and target environment. The
+contents of this directory will not be discussed further in this
+document.
+
+@item $@{RTEMS_ROOT@}/automake/
+This directory contains the custom GNU automake fragments
+which are used to support the various @code{Makefile.am}
+files throughout the RTEMS source tree. The
+contents of this directory will not be discussed
+further in this document.
+
+@item $@{RTEMS_ROOT@}/c/
+This directory is the root of the portions of the RTEMS source
+tree which must be built tailored for a particular CPU model
+or BSP. The contents of this directory will be discussed
+in the @ref{Directory Structure c/ Directory} section.
+
+@item $@{RTEMS_ROOT@}/contrib/
+This directory contains contributed support software. Currently
+this directory contains the RPM specifications for cross-compilers
+hosted on GNU/Linux that target Cygwin and Solaris. The
+cross-compilers produced using these specifications are then
+used in a Canadian cross build procedure to produce the Cygwin
+and Solaris hosted RTEMS toolsets on a GNU/Linux host. This
+directory will not be discussed further in this document.
+
+@item $@{RTEMS_ROOT@}/cpukit/
+This directory is the root for all of the "multilib'able"
+portions of RTEMS. This is a GNU way of saying the the
+contents of this directory can be compiled like the
+C Library (@code{libc.a}) and the functionality is
+neither CPU model nor BSP specific. The source code
+for most RTEMS services reside under this directory.
+The contents of this directory will be discussed
+in the @ref{Directory Structure CPUKit Directory} section.
+
+@item $@{RTEMS_ROOT@}/doc/
+This directory is the root for all RTEMS documentation.
+The source for RTEMS is written in GNU TeXinfo and
+used to produce HTML, PDF, and "info" files.
+The RTEMS documentation is configured, built,
+and installed separately from the RTEMS executive and tests.
+The contents of this directory will be discussed
+in the @ref{Directory Structure Documentation Directory} section.
+
+@item $@{RTEMS_ROOT@}/make/
+This directory contains files which support the
+RTEMS Makefile's. From a user's perspective, the
+most important parts are found in the @code{custom/}
+subdirectory. Each ".cfg" file in this directory
+is associated with a specific BSP and describes
+the CPU model, compiler flags, and procedure to
+a produce an executable for the target board.
+These files are described in detail in the
+@b{RTEMS BSP and Device Driver Development Guide}
+and will not be discussed further in this document.
+
+@item $@{RTEMS_ROOT@}/scripts/
+This directory contains the RPM specifications for the
+prebuilt cross-compilation toolsets provided by the
+RTEMS project. There are separate subdirectories
+for each of the components in the RTEMS Cross Compilation
+Environment including @code{binutils/}, @code{gcc3newlib/},
+and @code{gdb/}. This directory is configured, built,
+and installed separately from the RTEMS executive
+and tests. This directory will not be discussed further
+in this document.
+
+@item $@{RTEMS_ROOT@}/tools/
+This directory contains RTEMS specific support utilities which
+execute on the development host. These utilities are divided
+into subdirectories based upon whether they are used in the process
+of building RTEMS and applications, are CPU specific, or are
+used to assist in updating the RTEMS source tree and applications.
+The support utilities used in the process of building RTEMS are
+described in @ref{RTEMS Specific Utilities}. These are the
+only components of this subtree that will be discussed in this
+document.
+
+@end table
+
+
+
+@c
+@c c/ Directions
+@c
+@section c/ Directory
+
+The @code{$@{RTEMS_ROOT@}/c/} directory was formerly
+the root directory of all RTEMS source code. At this time, it contains
+the root directory for only those RTEMS components
+which must be compiled or linked in a way that is specific to a
+particular CPU model or board. This directory contains the
+following subdirectories:
+
+@table @code
+@item $@{RTEMS_ROOT@}/c/src/
+This directory is logically the root for the RTEMS components
+which are CPU model or board dependent. Thus this directory
+is the root for the BSPs and the various Test Suites as well
+as CPU model and BSP dependent libraries. The contents of
+this directory are discussed in the
+@ref{Directory Structure c/src/ Directory} section.
+
+@item $@{RTEMS_ROOT@}/c/make/
+This directory is used to generate the file @code{target.cfg}
+which is installed as part of the Application Makefiles. This
+file contains settings for various Makefile variables to
+tailor them to the particular CPU model and BSP configured.
+
+@end table
+
+@c
+@c c/src/ Directory
+@c
+@subsection c/src/ Directory
+
+As mentioned previously, this directory is logically
+the root for the RTEMS components
+which are CPU model or board dependent. The
+following is a list of the subdirectories in this
+directorie and a description of each.
+
+@table @code
+@item $@{RTEMS_ROOT@}/c/src/ada-tests/
+This directory contains the test suite for the Ada
+language bindings to the Classic API.
+
+@item $@{RTEMS_ROOT@}/c/src/lib/
+This directory contains the directories @code{libbsp}
+and @code{libcpu/} which contain the source code for
+the Board Support Packages (BSPs) and CPU Model
+specific source code for RTEMS.
+
+The @code{libbsp/} is organized based upon the CPU
+family and boards BSPs. The contents of @code{libbsp/}
+are discussed briefly in
+@ref{Directory Structure c/src/lib/libbsp BSP Directory}
+and presented in detail in the
+@b{RTEMS BSP and Device Driver Development Guide}.
+
+The @code{libcpu/} directory is also organized by
+CPU family with further divisions based upon CPU
+model and features that are shared across CPU models
+such as caching and DMA.
+
+@item $@{RTEMS_ROOT@}/c/src/libchip/
+This directory contains device drivers for various
+peripheral chips which are designed to be CPU and
+board dependent. This directory contains a variety
+of drivers for serial devices, network interface
+controllers, and real-time clocks.
+
+@item $@{RTEMS_ROOT@}/c/src/libmisc/
+This directory contains support facilities which
+are RTEMS specific but otherwise unclassified. In
+general, they do not adhere to a standard API.
+Among the support facilities in this directory are
+a @code{/dev/null} device driver, the Stack
+Overflow Checker, a mini-shell, the CPU and
+rate monotonic period usage monitoring libraries,
+and a utility to "dump a buffer" in a nicely
+formatted way similar to many ROM monitors.
+
+@item $@{RTEMS_ROOT@}/c/src/libnetworking/
+This directory contains the networking components which
+might be tailored based upon the particular BSP. This
+includes the RTEMS telnetd, httpd, and ftpd servers.
+
+@item $@{RTEMS_ROOT@}/c/src/librdbg/
+This directory contains the Ethernet-based remote debugging
+stub. This software must be built to be intimately aware
+of a particular CPU model.
+
+@item $@{RTEMS_ROOT@}/c/src/librtems++/
+This directory contains C++ classes which map to the RTEMS
+Classic API.
+
+@item $@{RTEMS_ROOT@}/c/src/make/
+This directory is used to generate the bulk of the supporting
+rules files which are installed as part of the Application Makefiles.
+This file contains settings for various Makefile variables to
+tailor them to the particular CPU model and BSP configured.
+
+@item $@{RTEMS_ROOT@}/c/src/optman/
+This directory contains stubs for the RTEMS Classic API
+Managers which are considered optional and whose use
+may be explicitly forbidden by an application. All of the
+directive implementations in this Optional Managers
+return @code{E_NOTCONFIGURED}.
+
+@item $@{RTEMS_ROOT@}/c/src/tests/
+This directory contains the test suites for the
+various RTEMS APIs and support libraries. This
+contents of this directory are discussed in the
+@ref{Directory Structure c/src/tests/ Test Suites} section.
+
+@item $@{RTEMS_ROOT@}/c/src/wrapup/
+This directory is responsible for taking the individual
+libraries and objects built in each of the components
+in the RTEMS source tree and bundling them together to form
+the single RTEMS library @code{librtemsbsp.a}. This
+library contains all BSP and CPU model specific software.
+
+@end table
+
+@c
+@c c/src/lib/libbsp BSP Directory
+@c
+
+@subsubsection c/src/lib/libbsp BSP Directory
+
+The "libbsp" directory contains a directory for each CPU family supported
+by RTEMS. Beneath each CPU directory is a directory for each BSP for that
+processor family.
+
+@c
+@c Tree 7 - C BSP Library
+@c
+
+The "libbsp" directory provides all the BSPs provided with this
+release of the RTEMS executive. The subdirectories are
+divided, as discussed previously, based on specific processor
+family, then further breaking down into specific target board
+environments. The "shmdr" subdirectory provides the
+implementation of a shared memory driver which supports the
+multiprocessing portion of the executive. In addition, two
+starting point subdirectories are provided for reference. The
+"no_cpu" subdirectory provides a template BSP which can be used
+to develop a specific BSP for an unsupported target board. The
+"stubdr" subdirectory provides stubbed out BSPs. These files
+may aid in preliminary testing of the RTEMS development
+environment that has been built for no particular target in mind.
+
+Below each CPU dependent directory is a directory for each target BSP
+supported in this release.
+
+Each BSP provides the modules which comprise an RTEMS BSP. The
+modules are separated into the subdirectories "clock", "console",
+"include", "shmsupp", "startup", and "timer" as shown in the following
+figure:
+
+@c
+@c Tree 8 - Each BSP
+@c
+
+@c @ifset use-ascii
+@example
+@group
+ Each BSP
+ |
+ +-----------+----------+-----+-----+----------+----------+
+ | | | | | |
+clock console include shmsupp startup timer
+@end group
+@end example
+@c @end ifset
+
+@c
+@c c/src/tests/ Test Suites
+@c
+@subsection c/src/tests/ Test Suites
+
+This directory provides all of the RTEMS Test Suite
+except those for the Classic API Ada95 binding
+This includes the single processor tests, multiprocessor tests,
+timing tests, library tests, and sample tests. Additionally,
+subdirectories for support functions and test related header
+files are provided. The following table lists the test suites
+currently included with the RTEMS and the directory in which
+they may be located:
+
+@table @code
+
+@item $@{RTEMS_ROOT@}/c/src/tests/itrontests/
+This directory contains the test suite for the
+RTEMS ITRON API.
+
+@item $@{RTEMS_ROOT@}/c/src/tests/libtests/
+This directory contains the test suite for the
+various RTEMS support components.
+
+@item $@{RTEMS_ROOT@}/c/src/tests/mptests/
+This directory contains the test suite for the
+multiprocessor support in the Classic API.
+The tests provided address two node configurations
+and provide coverage for the multiprocessor code found
+in RTEMS.
+
+@item $@{RTEMS_ROOT@}/c/src/tests/psxtests/
+This directory contains the test suite for the
+RTEMS POSIX API.
+
+@item $@{RTEMS_ROOT@}/c/src/tests/samples/
+This directory provides sample application tests
+which aid in the testing a newly built RTEMS environment, a new
+BSP, or as starting points for the development of an application
+using the RTEMS executive. They are discussed in
+@ref{Sample Applications}.
+
+@item $@{RTEMS_ROOT@}/c/src/tests/sptests/
+This directory contains the test suite for the RTEMS
+Classic API when executing on a single processor.
+The tests were originally designed to provide
+near complete test coverage for the the entire
+executive code. With the addition of multiple APIs,
+this is no longer the case as some SuperCore functionality
+is not available through the Classic API. Thus
+some functionality in the SuperCore is only covered
+by tests in the POSIX API and ITRON API Test Suites.
+
+@item $@{RTEMS_ROOT@}/c/src/tests/support/
+This directory contains support software and header files
+for the various test suites.
+
+@item $@{RTEMS_ROOT@}/c/src/tests/tmitrontests/
+This directory contains the timing test suite for
+the RTEMS ITRON API.
+
+@item $@{RTEMS_ROOT@}/c/src/tests/tmtests/
+This directory contains the timing test suite for
+the RTEMS Classic API. This include tests that
+benchmark each directive in the Classic API
+as well as a set of critical SuperCore functions.
+These tests are important for helping to verify
+that RTEMS performs as expected on your target hardware.
+It is not uncommon to discover mistakes in board
+initialization such as caching being disabled as
+a side-effect of analyzing the results of these tests.
+
+@item $@{RTEMS_ROOT@}/c/src/tests/tools/
+This directory contains tools which execute on
+the development host and aid in executing and
+evaluating the results of the test suite. The
+tools @code{difftest} compares the output of one
+or more tests with the expected output. If you
+place the output of all the @code{tmtests/} in
+a single file, then the utility @code{sorttimes}
+will be able to produce a report organizing the
+execution times by manager.
+
+@end table
+
+
+@c
+@c CPUKit Directory
+@c
+@section CPUKit Directory
+
+@c The @code{cpukit/} directory structure is as follows:
+
+@c
+@c CPUKit Tree
+@c
+
+@c @ifset use-ascii
+@c @example
+@c @group
+@c CPUKit
+@c |
+@c +-----------+----------+-----------+----------+
+@c | | | | |
+@c posix rtems sapi score wrapup
+@c @end group
+@c @end example
+@c @end ifset
+
+The @code{cpukit/} directory contains a set of subdirectories which
+contains the source files comprising the executive portion of
+the RTEMS development environment as well as portable support
+libraries such as support for the C Library and filesystems.
+The API specific and "SuperCore" (e.g. @code{score/} directory)
+source code files are separated into distinct directory trees.
+
+The following is a description of each of the subdirectories
+under @code{cpukit/}:
+
+@table @code
+
+@item $@{RTEMS_ROOT@}/cpukit/aclocal/
+This directory contains the custom M4 macros which are available to
+the various GNU autoconf @code{configure.ac} scripts throughout
+the CPU Kit portion of the RTEMS source tree.
+GNU autoconf interprets @code{configure.ac}
+files to produce the @code{configure} files used to tailor
+RTEMS build for a particular host and target environment. The
+contents of this directory will not be discussed further in this
+document.
+
+@item $@{RTEMS_ROOT@}/cpukit/ada/
+This directory contains the Ada95 language bindings to the
+RTEMS Classic API.
+
+@item $@{RTEMS_ROOT@}/cpukit/automake/
+This directory contains files which are "Makefile fragments."
+They are included as required by the various @code{Makefile.am}
+files throughout the CPU Kit portion of the RTEMS source tree.
+
+@item $@{RTEMS_ROOT@}/cpukit/include/
+This directory contains header files which are private to
+RTEMS and not considered to be owned by any other component
+in the CPU Kit.
+
+@item $@{RTEMS_ROOT@}/cpukit/itron/
+This directory contains the implementation of the
+ITRON API.
+
+@item $@{RTEMS_ROOT@}/cpukit/libblock/
+This directory contains support code for using
+Block Devices such as hard drives, floppies, and
+CD-ROMs. It includes the generic IO primitives
+for block device drivers, disk caching support,
+and a RAM disk block device driver.
+
+@item $@{RTEMS_ROOT@}/cpukit/libcsupport/
+This directory contains the RTEMS specific support routines
+for the Newlib C Library. This includes what are referred
+to as system calls and found in section 2 of the traditional
+UNIX manual. In addition, it contains a thread-safe
+implementation of the Malloc family of routines as well
+as BSD and POSIX services not found in Newlib.
+
+@item $@{RTEMS_ROOT@}/cpukit/libfs/
+This directory contains the various non-networked
+filesystem implementations for RTEMS. It includes
+the In-Memory FileSystem (IMFS), the mini-IMFS,
+and FAT filesystems.
+
+@item $@{RTEMS_ROOT@}/cpukit/libnetworking/
+This directory contains the port of the FreeBSD
+TCP/IP stack to RTEMS.
+
+@item $@{RTEMS_ROOT@}/cpukit/librpc/
+This directory contains the port of the FreeBSD
+RPC/XDR source to RTEMS.
+
+@item $@{RTEMS_ROOT@}/cpukit/posix/
+This directory contains the RTEMS implementation
+of the threading portions of the POSIX API.
+
+@item $@{RTEMS_ROOT@}/cpukit/rtems/
+This directory contains the implementation of the
+Classic API.
+
+@item $@{RTEMS_ROOT@}/cpukit/sapi/
+This directory contains the implementation of RTEMS
+services which are required but beyond the realm
+of any standardization efforts. It includes
+initialization, shutdown, and IO services.
+
+@item $@{RTEMS_ROOT@}/cpukit/score/
+This directory contains the "SuperCore" of RTEMS.
+All APIs are implemented in terms of SuperCore services.
+For example, Classic API tasks, POSIX threads, and ITRON
+tasks are all implemented in terms of SuperCore threads.
+This provides a common infrastructure and a high degree
+of interoperability between the APIs. For example,
+services from all APIs may be used by any task/thread
+independent of the API used to create it.
+
+Within the @code{score/} directory the CPU dependent modules are found.
+The @code{score/cpu/} subdirectory contains a subdirectory for each
+target CPU supported by the @value{RELEASE} release of the RTEMS
+executive. Each processor directory contains the CPU dependent
+code necessary to host RTEMS. The @code{no_cpu} directory provides a
+starting point for developing a new port to an unsupported
+processor. The files contained within the @code{no_cpu} directory
+may also be used as a reference for the other ports to specific
+processors.
+
+@item $@{RTEMS_ROOT@}/cpukit/wrapup/
+This directory is responsible for taking the individual
+libraries and objects built in each of the components
+in the RTEMS CPU Kit source tree and bundling them
+together to form the single RTEMS library @code{librtemscpu.a}. This
+library contains all BSP and CPU model specific software.
+
+@end table
+
+@c
+@c Documentation Directory
+@c
+@section Documentation Directory
+
+This directory contains the source code for all RTEMS documentation
+in @code{TexInfo} format as well as utilities used in the generation
+of the RTEMS documentation set. This source code is used to produce
+the RTEMS documentation in various formats including PDF, HTML,
+and PostScript.
+
+@table @code
+
+@item $@{RTEMS_ROOT@}/doc/FAQ/
+This directory contains the source code for the @cite{RTEMS Frequently Asked
+Questions (FAQ) Collection}.
+
+@item $@{RTEMS_ROOT@}/doc/user/
+This directory contains the source code for the @cite{RTEMS
+Applications C User's Guide} which documents the Classic API.
+
+@item $@{RTEMS_ROOT@}/doc/ada_user/
+This directory contains the source code for the @cite{RTEMS
+Applications Ada User's Guide} which documents the Ada95
+binding to the Classic API. This manual is produced from
+from the same source base as the @cite{RTEMS Application
+C User's Guide}.
+
+@item $@{RTEMS_ROOT@}/doc/bsp_howto/
+This directory contains the source code for the
+@cite{RTEMS BSP and Device Driver Development Guide}.
+
+@item $@{RTEMS_ROOT@}/doc/common/
+This directory contains the source code for the files which
+are shared across multiple manuals in the RTEMS Documentation Set.
+This includes the copyright page as well as the timing
+tables which can be filled in on a per BSP basis in the
+CPU supplements.
+
+@item $@{RTEMS_ROOT@}/doc/develenv/
+This directory contains the source code for the
+@cite{RTEMS Development Environment Guide}. This is
+the document you are currently reading.
+
+@item $@{RTEMS_ROOT@}/doc/filesystem/
+This directory contains the source code for the
+@cite{RTEMS Filesystem Design Guide}. This manual
+is a continuous work in process as it attempts to
+capture the design of the interface between system
+calls and filesystem implementations as well as the
+information required by those implementing filesystems.
+
+@item $@{RTEMS_ROOT@}/doc/gnu_docs/
+This directory contains the scripts which assist in
+generating HTML for the GNU tools in the RTEMS Cross
+Development Environment set.
+
+@item $@{RTEMS_ROOT@}/doc/images/
+This directory contains the source code for the graphics
+used in the HTML version of the RTEMS Documentation.
+
+@item $@{RTEMS_ROOT@}/doc/itron3.0/
+This directory contains the source code for the
+@cite{RTEMS ITRON 3.0 API User's Guide}.
+
+@item $@{RTEMS_ROOT@}/doc/networking/
+This directory contains the source code for the
+@cite{RTEMS Network Supplement}.
+
+@item $@{RTEMS_ROOT@}/doc/new_chapters/
+This directory contains the source code for the new documentation
+components which have not yet been collected into a new manual or
+merged into an existing document. Currently, this primarily
+contains draft documentation for some portions of
+the facilities implemented in @code{$@{RTEMS_ROOT@}/c/src/libmisc/}.
+
+@item $@{RTEMS_ROOT@}/doc/porting/
+This directory contains the source code for the
+@cite{RTEMS Porting Guide}.
+
+@item $@{RTEMS_ROOT@}/doc/posix1003.1/
+This directory contains the source code for the
+@cite{RTEMS POSIX 1003.1 Compliance Guide}.
+
+@item $@{RTEMS_ROOT@}/doc/posix_users/
+This directory contains the source code for the
+@cite{RTEMS POSIX API User's Guide}. It is important to
+note that RTEMS' support for POSIX is a combination of
+functionality provided by RTEMS and the Newlib C Library
+so some functionality is documented by Newlib.
+
+@item $@{RTEMS_ROOT@}/doc/relnotes/
+This directory contains the source code for a formally
+release notes document. This has not been used for
+recent RTEMS releases.
+
+@item $@{RTEMS_ROOT@}/doc/rgdb_specs/
+This directory contains the source code for the
+@cite{RTEMS Remote Debugger Server Specifications}.
+
+@item $@{RTEMS_ROOT@}/doc/rtems_gdb/
+This directory contains the source code for the
+@cite{RTEMS/GDB User's Guide}.
+
+@item $@{RTEMS_ROOT@}/doc/started/
+This directory contains the source code for the
+@cite{Getting Started with RTEMS for C/C++ Users} manual.
+
+@item $@{RTEMS_ROOT@}/doc/started_ada/
+This directory contains the source code for the
+@cite{Getting Started with RTEMS for Ada Users} manual.
+
+@item $@{RTEMS_ROOT@}/doc/supplements/
+This directory contains the source code for the various
+RTEMS CPU Supplements.
+the
+
+@item $@{RTEMS_ROOT@}/doc/tools/
+This directory contains the source code for the tools
+used on the development host to assist in producing the
+RTEMS Documentation. The most important of these tools
+is @code{bmenu} which generates the hierarchical node
+linking commands based upon chapter, section, and
+subsection organization.
+
+@end table
diff --git a/doc/develenv/intro.texi b/doc/develenv/intro.texi
new file mode 100644
index 0000000000..7ae7e307a1
--- /dev/null
+++ b/doc/develenv/intro.texi
@@ -0,0 +1,58 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Introduction, Directory Structure, Top, Top
+@end ifinfo
+@chapter Introduction
+
+This document describes the RTEMS development
+environment. Discussions are provided for the following topics:
+
+@itemize @bullet
+@item the directory structure used by RTEMS,
+
+@item usage of the GNU Make utility within the RTEMS
+development environment,
+
+@item sample applications, and
+
+@item the RTEMS specific utilities.
+@end itemize
+
+RTEMS was designed as a reusable software component.
+Highly reusable software such as RTEMS is typically distributed
+in the form of source code without providing any support tools.
+RTEMS is the foundation for a complex family of facilities
+including board support packages, device drivers, and support
+libraries. The RTEMS Development Environment is not a CASE
+tool. It is a collection of tools designed to reduce the
+complexity of using and enhancing the RTEMS family. Tools are
+provided which aid in the management of the development,
+maintenance, and usage of RTEMS, its run-time support
+facilities, and applications which utilize the executive.
+
+A key component of the RTEMS development environment
+is the GNU family of free tools. This is robust set of
+development and POSIX compatible tools for which source code is
+freely available. The primary compilers, assemblers, linkers,
+and make utility used by the RTEMS development team are the GNU
+tools. They are highly portable supporting a wide variety of
+host computers and, in the case of the development tools, a wide
+variety of target processors.
+
+It is recommended that the RTEMS developer become
+familiar with the RTEMS Development Environment before
+proceeding with any modifications to the executive source tree.
+The source code for the executive is very modular and source
+code is divided amongst directories based upon functionality as
+well as dependencies on CPU and target board. This organization
+is aimed at isolating and minimizing non-portable code. This
+has the immediate result that adding support for a new CPU or
+target board requires very little "wandering" around the source
+tree.
diff --git a/doc/develenv/sample.t b/doc/develenv/sample.t
new file mode 100644
index 0000000000..7bb6ecc167
--- /dev/null
+++ b/doc/develenv/sample.t
@@ -0,0 +1,328 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Sample Applications
+
+@section Introduction
+
+The RTEMS source distribution includes a set of sample applications
+that are located in the @code{$@{RTEMS_ROOT@}/c/src/tests/samples/}
+directory. These applications are intended to illustrate the
+basic format of RTEMS single and multiple processor
+applications and the use of some features. In addition, these
+relatively simple applications can be used to test locally
+developed board support packages and device drivers as they
+exercise a critical subset of RTEMS functionality that is often
+broken in new BSPs.
+
+Each of the following sample applications will be listed in
+more detail in the following sections:
+
+@table @b
+@item Hello World
+The RTEMS Hello World test is provided in
+the subdirectory @code{$@{RTEMS_ROOT@}/c/src/tests/samples/hello/}.
+This test is helpful when testing new
+versions of RTEMS, BSPs, or modifications to any portion of the
+RTEMS development environment.
+
+@item Clock Tick
+The @code{$@{RTEMS_ROOT@}/c/src/tests/samples/ticker/}
+subdirectory provides a test for verification of clock chip
+device drivers of BSPs.
+
+@item Base Single Processor
+A simple single processor test similar to those in the
+single processor test suite is provided in
+@code{$@{RTEMS_ROOT@}/c/src/tests/samples/base_sp/}.
+
+@item Base Multiple Processor
+A simple two node multiprocessor test capable of testing an newly
+developed MPCI layer is provided in
+@code{$@{RTEMS_ROOT@}/c/src/tests/samples/base_mp/}.
+
+@item Constructor/Destructor C++ Test
+The @code{$@{RTEMS_ROOT@}/c/src/tests/samples/cdtest/}
+subdirectory provides a simple C++ application using
+constructors and destructors. It is only built when
+C++ is enabled.
+
+
+@item Paranoia Floating Point Test
+The directory @code{$@{RTEMS_ROOT@}/c/src/tests/samples/paranoia/}
+contains the public domain floating point and math library test.
+
+@item Minimum Size Test
+The directory
+@code{$@{RTEMS_ROOT@}/c/src/tests/samples/minimum/}
+contains a simple RTEMS program that results in a non-functional
+executable. It is intended to show the size of a minimum footprint
+application based upon the current RTEMS configuration.
+
+@item Unlimited Object Allocation
+The @code{$@{RTEMS_ROOT@}/c/src/tests/samples/unlimited/}
+directory contains a sample test that demonstrates the use of the
+@i{unlimited} object allocation configuration option to RTEMS.
+
+@item Network Loopback Test
+The @code{$@{RTEMS_ROOT@}/c/src/tests/samples/loopback/}
+directory contains a sample test that demonstrates the use of
+sockets and the loopback network device. It does not require
+the presence of network hardware in order to run.
+It is only built if RTEMS was configured with networking enabled.
+
+@end table
+
+The sample tests are written using the Classic API so the reader
+should be familiar with the terms used and
+material presented in the @b{RTEMS Applications Users Guide}.
+
+@section Hello World
+
+This sample application is in the following directory:
+
+@example
+$@{RTEMS_ROOT@}/tests/samples/hello/
+@end example
+
+It provides a rudimentary test of the BSP start up
+code and the console output routine. The C version of this
+sample application uses the printf function from the RTEMS
+Standard C Library to output messages. The Ada version of this
+sample use the TEXT_IO package to output the hello messages.
+The following messages are printed:
+
+@example
+@group
+*** HELLO WORLD TEST ***
+Hello World
+*** END OF HELLO WORLD TEST ***
+@end group
+@end example
+
+These messages are printed from the application's
+single initialization task. If the above messages are not
+printed correctly, then either the BSP start up code or the
+console output routine is not operating properly.
+
+@section Clock Tick
+
+This sample application is in the following directory:
+
+@example
+$@{RTEMS_ROOT@}/tests/samples/ticker/
+@end example
+
+This application is designed as a simple test of the
+clock tick device driver. In addition, this application also
+tests the printf function from the RTEMS Standard C Library by
+using it to output the following messages:
+
+@example
+@group
+*** CLOCK TICK TEST ***
+TA1 - tm_get - 09:00:00 12/31/1988
+TA2 - tm_get - 09:00:00 12/31/1988
+TA3 - tm_get - 09:00:00 12/31/1988
+TA1 - tm_get - 09:00:05 12/31/1988
+TA1 - tm_get - 09:00:10 12/31/1988
+TA2 - tm_get - 09:00:10 12/31/1988
+TA1 - tm_get - 09:00:15 12/31/1988
+TA3 - tm_get - 09:00:15 12/31/1988
+TA1 - tm_get - 09:00:20 12/31/1988
+TA2 - tm_get - 09:00:20 12/31/1988
+TA1 - tm_get - 09:00:25 12/31/1988
+TA1 - tm_get - 09:00:30 12/31/1988
+TA2 - tm_get - 09:00:30 12/31/1988
+TA3 - tm_get - 09:00:30 12/31/1988
+*** END OF CLOCK TICK TEST ***
+@end group
+@end example
+
+The clock tick sample application utilizes a single
+initialization task and three copies of the single application
+task. The initialization task prints the test herald, sets the
+time and date, and creates and starts the three application
+tasks before deleting itself. The three application tasks
+generate the rest of the output. Every five seconds, one or
+more of the tasks will print the current time obtained via the
+tm_get directive. The first task, TA1, executes every five
+seconds, the second task, TA2, every ten seconds, and the third
+task, TA3, every fifteen seconds. If the time printed does not
+match the above output, then the clock device driver is not
+operating properly.
+
+@section Base Single Processor Application
+
+This sample application is in the following directory:
+
+@example
+$@{RTEMS_ROOT@}/tests/samples/base_sp/
+@end example
+
+It provides a framework from which a single processor
+RTEMS application can be developed. The use of the task argument
+is illustrated. This sample application uses the printf
+function from the RTEMS Standard C Library or TEXT_IO functions
+when using the Ada version to output the following messages:
+
+@example
+@group
+*** SAMPLE SINGLE PROCESSOR APPLICATION ***
+Creating and starting an application task
+Application task was invoked with argument (0) and has id of 0x10002
+*** END OF SAMPLE SINGLE PROCESSOR APPLICATION ***
+@end group
+@end example
+
+The first two messages are printed from the
+application's single initialization task. The final messages
+are printed from the single application task.
+
+@section Base Multiple Processor Application
+
+This sample application is in the following directory:
+
+@example
+$@{RTEMS_ROOT@}/tests/samples/base_mp/
+@end example
+
+It provides a framework from which a multiprocessor
+RTEMS application can be developed. This directory has a
+subdirectory for each node in the multiprocessor system. The
+task argument is used to distinguish the node on which the
+application task is executed. The first node will print the
+following messages:
+
+@example
+@group
+*** SAMPLE MULTIPROCESSOR APPLICATION ***
+Creating and starting an application task
+This task was invoked with the node argument (1)
+This task has the id of 0x10002
+*** END OF SAMPLE MULTIPROCESSOR APPLICATION ***
+@end group
+@end example
+
+The second node will print the following messages:
+
+@example
+@group
+*** SAMPLE MULTIPROCESSOR APPLICATION ***
+Creating and starting an application task
+This task was invoked with the node argument (2)
+This task has the id of 0x20002
+*** END OF SAMPLE MULTIPROCESSOR APPLICATION ***
+@end group
+@end example
+
+The herald is printed from the application's single
+initialization task on each node. The final messages are
+printed from the single application task on each node.
+
+In this sample application, all source code is shared
+between the nodes except for the node dependent configuration
+files. These files contains the definition of the node number
+used in the initialization of the RTEMS Multiprocessor
+Configuration Table. This file is not shared because the node
+number field in the RTEMS Multiprocessor Configuration Table
+must be unique on each node.
+
+@section Constructor/Destructor C++ Application
+
+This sample application is in the following directory:
+
+@example
+$@{RTEMS_ROOT@}/tests/samples/cdtest/
+@end example
+
+This sample application demonstrates that RTEMS is
+compatible with C++ applications. It uses constructors,
+destructor, and I/O stream output in testing these various
+capabilities. The board support package responsible for this
+application must support a C++ environment.
+
+This sample application uses the printf function from
+the RTEMS Standard C Library to output the following messages:
+
+@example
+@group
+Hey I'M in base class constructor number 1 for 0x400010cc.
+Hey I'M in base class constructor number 2 for 0x400010d4.
+Hey I'M in derived class constructor number 3 for 0x400010d4.
+*** CONSTRUCTOR/DESTRUCTOR TEST ***
+Hey I'M in base class constructor number 4 for 0x4009ee08.
+Hey I'M in base class constructor number 5 for 0x4009ee10.
+Hey I'M in base class constructor number 6 for 0x4009ee18.
+Hey I'M in base class constructor number 7 for 0x4009ee20.
+Hey I'M in derived class constructor number 8 for 0x4009ee20.
+Testing a C++ I/O stream
+Hey I'M in derived class constructor number 8 for 0x4009ee20.
+Derived class - Instantiation order 8
+Hey I'M in base class constructor number 7 for 0x4009ee20.
+Instantiation order 8
+Hey I'M in base class constructor number 6 for 0x4009ee18.
+Instantiation order 6
+Hey I'M in base class constructor number 5 for 0x4009ee10.
+Instantiation order 5
+Hey I'M in base class constructor number 4 for 0x4009ee08.
+Instantiation order 5
+*** END OF CONSTRUCTOR/DESTRUCTOR TEST ***
+Hey I'M in base class constructor number 3 for 0x400010d4.
+Hey I'M in base class constructor number 2 for 0x400010d4.
+Hey I'M in base class constructor number 1 for 0x400010cc.
+@end group
+@end example
+
+@section Minimum Size Test
+
+This sample application is in the following directory:
+
+@example
+$@{RTEMS_ROOT@}/tests/samples/minimum/
+@end example
+
+This sample application is designed to produce the
+minimum code space required for any RTEMS application
+based upon the current RTEMS configuration and
+BSP. In many situations, the bulk of this executable
+consists of hardware and RTEMS initialization, basic
+infrastructure such as malloc(), and RTEMS and
+hardware shutdown support.
+
+@section Paranoia Floating Point Application
+
+This sample application is in the following directory:
+
+@example
+$@{RTEMS_ROOT@}/tests/samples/paranoia/
+@end example
+
+This sample application uses a public domain floating
+point and math library test to verify these capabilities of the
+RTEMS executive. Deviations between actual and expected results
+are reported to the screen. This is a very extensive test which
+tests all mathematical and number conversion functions.
+Paranoia is also very large and requires a long period of time
+to run. Problems which commonly prevent this test from
+executing to completion include stack overflow and FPU exception
+handlers not installed.
+
+@section Network Loopback Test
+
+This sample application is in the following directory:
+
+@example
+$@{RTEMS_ROOT@}/tests/samples/loopback/
+@end example
+
+This sample application uses the network loopback device to
+demonstrate the use of the RTEMS TCP/IP stack. This sample
+test illustrates the basic configuration and initialization
+of the TCP/IP stack as well as simple socket usage.
+
diff --git a/doc/develenv/utils.t b/doc/develenv/utils.t
new file mode 100644
index 0000000000..13029a2e14
--- /dev/null
+++ b/doc/develenv/utils.t
@@ -0,0 +1,260 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter RTEMS Specific Utilities
+
+This section describes the additional commands
+available within the @b{RTEMS Development Environment}. Although
+some of these commands are of general use, most are included to
+provide some capability necessary to perform a required function
+in the development of the RTEMS executive, one of its support
+components, or an RTEMS based application.
+
+Some of the commands are implemented as C programs.
+However, most commands are implemented as Bourne shell scripts.
+Even if the current user has selected a different shell, the
+scripts will automatically invoke the Bourne shell during their
+execution lifetime.
+
+The commands are presented in UNIX manual page style
+for compatibility and convenience. A standard set of paragraph
+headers were used for all of the command descriptions. If a
+section contained no data, the paragraph header was omitted to
+conserve space. Each of the permissible paragraph headers and
+their contents are described below:
+
+@table @code
+@item SYNOPSIS
+describes the command syntax
+
+@item DESCRIPTION
+a full description of the command
+
+@item OPTIONS
+describes each of the permissible options for the command
+
+@item NOTES
+lists any special noteworthy comments about the command
+
+@item ENVIRONMENT
+describes all environment variables utilized by the command
+
+@item EXAMPLES
+illustrates the use of the command with specific examples
+
+@item FILES
+provides a list of major files that the command references
+
+@item SEE ALSO
+lists any relevant commands which can be consulted
+@end table
+
+Most environment variables referenced by the commands
+are defined for the RTEMS Development Environment during the
+login procedure. During login, the user selects a default RTEMS
+environment through the use of the Modules package. This tool
+effectively sets the environment variables to provide a
+consistent development environment for a specific user.
+Additional environment variables within the RTEMS environment
+were set by the system administrator during installation. When
+specifying paths, a command description makes use of these
+environment variables.
+
+When referencing other commands in the SEE ALSO
+paragraph, the following notation is used: command(code).
+Where command is the name of a related command, and code is a
+section number. Valid section numbers are as follows:
+
+@table @code
+@item 1
+Section 1 of the standard UNIX documentation
+
+@item 1G
+Section 1 of the GNU documentation
+
+@item 1R
+a manual page from this document, the RTEMS Development Environment Guide
+@end table
+
+For example, ls(1) means see the standard ls command
+in section 1 of the UNIX documentation. gcc020(1G) means see
+the description of gcc020 in section 1 of the GNU documentation.
+
+@c
+@c packhex
+@c
+@section packhex - Compress Hexadecimal File
+
+@subheading SYNOPSIS
+
+@example
+packhex <source >destination
+@end example
+
+@subheading DESCRIPTION
+
+packhex accepts Intel Hexadecimal or Motorola Srecord
+on its standard input and attempts to pack as many contiguous
+bytes as possible into a single hexadecimal record. Many
+programs output hexadecimal records which are less than 80 bytes
+long (for human viewing). The overhead required by each
+unnecessary record is significant and packhex can often reduce
+the size of the download image by 20%. packhex attempts to
+output records which are as long as the hexadecimal format
+allows.
+
+@subheading OPTIONS
+
+This command has no options.
+
+@subheading EXAMPLES
+
+Assume the current directory contains the Motorola
+Srecord file download.sr. Then executing the command:
+
+@example
+packhex <download.sr >packed.sr
+@end example
+
+will generate the file packed.sr which is usually
+smaller than download.sr.
+
+@subheading CREDITS
+
+The source for packhex first appeared in the May 1993
+issue of Embedded Systems magazine. The code was downloaded
+from their BBS. Unfortunately, the author's name was not
+provided in the listing.
+
+@c
+@c unhex
+@c
+@section unhex - Convert Hexadecimal File into Binary Equivalent
+
+@subheading SYNOPSIS
+
+@example
+unhex [-valF] [-o file] [file [file ...] ]
+@end example
+
+@subheading DESCRIPTION
+
+unhex accepts Intel Hexadecimal, Motorola Srecord, or
+TI 'B' records and converts them to their binary equivalent.
+The output may sent to standout or may be placed in a specified
+file with the -o option. The designated output file may not be
+an input file. Multiple input files may be specified with their
+outputs logically concatenated into the output file.
+
+@subheading OPTIONS
+
+This command has the following options:
+
+@table @code
+@item v
+Verbose
+
+@item a base
+First byte of output corresponds with base
+address
+
+@item l
+Linear Output
+
+@item o file
+Output File
+
+@item F k_bits
+Fill holes in input with 0xFFs up to k_bits * 1024 bits
+@end table
+
+@subheading EXAMPLES
+
+The following command will create a binary equivalent
+file for the two Motorola S record files in the specified output
+file binary.bin:
+
+@example
+unhex -o binary.bin downloadA.sr downloadB.sr
+@end example
+
+@c
+@c size_rtems
+@c
+@section size_rtems - report RTEMS size information
+
+@subheading SYNOPSIS
+
+@example
+size_rtems
+@end example
+
+@subheading DESCRIPTION
+
+size_rtems analyzes RTEMS and determines all of the
+critical sizing information which is reported in the related
+documentation.
+
+@subheading EXAMPLES
+
+To generate the RTEMS size report for the currently
+configured processor, execute the following command:
+
+@example
+size_rtems
+@end example
+
+Although the actual size information will differ, a
+report of the following format will be output:
+
+@example
+ RTEMS SIZE REPORT
+
+CODE DATA BSS
+==================
+MANAGERS: 15988 0 0
+CORE : 4568 0 0
+CPU : 364 0 0
+OVERALL : 20556 0 0
+MINIMUM : 8752 0 0
+
+init : 1592 0 0
+tasks : 2440 0 0
+intr : 64 0 0
+clock : 2252 0 0
+sem : 876 0 0
+msg : 1624 0 0
+event : 604 0 0
+signal : 212 0 0
+part : 872 0 0
+region : 844 0 0
+dpmem : 532 0 0
+timer : 424 0 0
+io : 288 0 0
+fatal : 40 0 0
+rtmon : 764 0 0
+mp : 2984 0 0
+
+sem : 4 0 0
+msg : 4 0 0
+event : 4 0 0
+signal : 4 0 0
+part : 4 0 0
+region : 4 0 0
+timer : 4 0 0
+dpmem : 4 0 0
+io : 4 0 0
+rtmon : 4 0 0
+mp : 8 0 0
+@end example
+
+@subheading SEE ALSO
+
+gsize020(1G), gsize386(1G), gsize960(1G)
+
+
diff --git a/doc/filesystem/.cvsignore b/doc/filesystem/.cvsignore
new file mode 100644
index 0000000000..f71d5d90c0
--- /dev/null
+++ b/doc/filesystem/.cvsignore
@@ -0,0 +1,32 @@
+filesystem
+filesystem-?
+filesystem-??
+filesystem.aux
+filesystem.cp
+filesystem.dvi
+filesystem.fn
+filesystem*.html
+filesystem.ky
+filesystem.log
+filesystem.pdf
+filesystem.pg
+filesystem.ps
+filesystem.toc
+filesystem.tp
+filesystem.vr
+fsrequirements.texi
+imfs.texi
+index.html
+init.texi
+Makefile
+Makefile.in
+mdate-sh
+miniimfs.texi
+mounting.texi
+patheval.texi
+rtems_footer.html
+rtems_header.html
+stamp-vti
+syscalls.texi
+tftp.texi
+version.texi
diff --git a/doc/filesystem/Makefile.am b/doc/filesystem/Makefile.am
new file mode 100644
index 0000000000..e249a071ce
--- /dev/null
+++ b/doc/filesystem/Makefile.am
@@ -0,0 +1,69 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = filesystem
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/main.am
+
+BMENU2 += -c
+
+GENERATED_FILES = patheval.texi init.texi mounting.texi syscalls.texi \
+ fsrequirements.texi imfs.texi miniimfs.texi tftp.texi
+COMMON_FILES += $(top_srcdir)/common/cpright.texi
+
+FILES = preface.texi
+
+info_TEXINFOS = filesystem.texi
+filesystem_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+patheval.texi: patheval.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+init.texi: init.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+mounting.texi: mounting.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+syscalls.texi: syscalls.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+fsrequirements.texi: fsrequirements.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+imfs.texi: imfs.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+miniimfs.texi: miniimfs.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+tftp.texi: tftp.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+EXTRA_DIST = fsrequirements.t imfs.t init.t miniimfs.t mounting.t patheval.t \
+ syscalls.t tftp.t
+
+CLEANFILES += filesystem.info filesystem.info-?
diff --git a/doc/filesystem/filesystem.texi b/doc/filesystem/filesystem.texi
new file mode 100644
index 0000000000..6565eeb5e4
--- /dev/null
+++ b/doc/filesystem/filesystem.texi
@@ -0,0 +1,109 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename filesystem.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the Filesystem Design Guide
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS On-Line Manual
+@direntry
+* RTEMS Filesystem Design Guide: (filesystem).
+@end direntry
+@end ifset
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage RTEMS Filesystem Design Guide
+
+@setchapternewpage odd
+@settitle RTEMS Filesystem Design Guide
+@titlepage
+@finalout
+
+@title RTEMS Filesystem Design Guide
+@subtitle Edition @value{EDITION}, for RTEMS @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include preface.texi
+@include patheval.texi
+@include init.texi
+@include mounting.texi
+@include syscalls.texi
+@include fsrequirements.texi
+@include imfs.texi
+@include miniimfs.texi
+@include tftp.texi
+@ifinfo
+@node Top, Preface, (dir), (dir)
+@top filesystem
+
+This is the online version of the RTEMS Filesystem Design Guide.
+
+@menu
+* Preface::
+* Pathname Evaluation::
+* System Initialization::
+* Mounting and Unmounting Filesystems::
+* System Call Development Notes::
+* Filesystem Implementation Requirements::
+* In-Memory Filesystem::
+* Miniature In-Memory Filesystem::
+* Trivial FTP Client Filesystem::
+* Command and Variable Index::
+* Concept Index::
+@end menu
+
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@node Command and Variable Index, Concept Index, , Top
+@unnumbered Command and Variable Index
+
+There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@node Concept Index, , Command and Variable Index, Top
+@unnumbered Concept Index
+
+There are currently no Concept Index entries.
+@c @printindex cp
+
+@contents
+@bye
+
diff --git a/doc/filesystem/fsrequirements.t b/doc/filesystem/fsrequirements.t
new file mode 100644
index 0000000000..03d19266d6
--- /dev/null
+++ b/doc/filesystem/fsrequirements.t
@@ -0,0 +1,1183 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+
+@chapter Filesystem Implementation Requirements
+
+This chapter details the behavioral requirements that all filesystem
+implementations must adhere to.
+
+@section General
+
+The RTEMS filesystem framework was intended to be compliant with the
+POSIX Files and Directories interface standard. The following filesystem
+characteristics resulted in a functional switching layer.
+
+@example
+Figure of the Filesystem Functional Layering goes here.
+This figure includes networking and disk caching layering.
+@end example
+
+@ifset use-ascii
+@example
+@group
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@c @image{FunctionalLayerCake,6in,4in}
+@end ifset
+
+@ifset use-html
+@end ifset
+
+@enumerate
+
+@item Application programs are presented with a standard set of POSIX
+compliant functions that allow them to interface with the files, devices
+and directories in the filesystem. The interfaces to these routines do
+not reflect the type of subordinate filesystem implementation in which
+the file will be found.
+
+@item The filesystem framework developed under RTEMS allows for mounting
+filesystem of different types under the base filesystem.
+
+@item The mechanics of locating file information may be quite different
+between filesystem types.
+
+@item The process of locating a file may require crossing filesystem
+boundaries.
+
+@item The transitions between filesystem and the processing required to
+access information in different filesystem is not visible at the level
+of the POSIX function call.
+
+@item The POSIX interface standard provides file access by character
+pathname to the file in some functions and through an integer file
+descriptor in other functions.
+
+@item The nature of the integer file descriptor and its associated
+processing is operating system and filesystem specific.
+
+@item Directory and device information must be processed with some of the
+same routines that apply to files.
+
+@item The form and content of directory and device information differs
+greatly from that of a regular file.
+
+@item Files, directories and devices represent elements (nodes) of a tree
+hierarchy.
+
+@item The rules for processing each of the node types that exist under the
+filesystem are node specific but are still not reflected in the POSIX
+interface routines.
+
+@end enumerate
+
+
+@example
+Figure of the Filesystem Functional Layering goes here.
+This figure focuses on the Base Filesystem and IMFS.
+@end example
+
+@example
+Figure of the IMFS Memfile control blocks
+@end example
+
+@section File and Directory Removal Constraints
+
+The following POSIX constraints must be honored by all filesystems.
+
+@itemize @bullet
+
+@item If a node is a directory with children it cannot be removed.
+
+@item The root node of any filesystem, whether the base filesystem or a
+mounted filesystem, cannot be removed.
+
+@item A node that is a directory that is acting as the mount point of a file
+system cannot be removed.
+
+@item On filesystems supporting hard links, a link count is maintained.
+Prior to node removal, the node's link count is decremented by one. The
+link count must be less than one to allow for removal of the node.
+
+@end itemize
+
+@c
+@c
+@c
+@section API Layering
+
+@subsection Mapping of Generic System Calls to Filesystem Specific Functions
+
+The list of generic system calls includes the routines open(), read(),
+write(), close(), etc..
+
+The Files and Directories section of the POSIX Application Programs
+Interface specifies a set of functions with calling arguments that are
+used to gain access to the information in a filesystem. To the
+application program, these functions allow access to information in any
+mounted filesystem without explicit knowledge of the filesystem type or
+the filesystem mount configuration. The following are functions that are
+provided to the application:
+
+@enumerate
+@item access()
+@item chdir()
+@item chmod()
+@item chown()
+@item close()
+@item closedir()
+@item fchmod()
+@item fcntl()
+@item fdatasync()
+@item fpathconf()
+@item fstat()
+@item fsync()
+@item ftruncate()
+@item link()
+@item lseek()
+@item mkdir()
+@item mknod()
+@item mount()
+@item open()
+@item opendir()
+@item pathconf()
+@item read()
+@item readdir()
+@item rewinddir()
+@item rmdir()
+@item rmnod()
+@item scandir()
+@item seekdir()
+@item stat()
+@item telldir()
+@item umask()
+@item unlink()
+@item unmount()
+@item utime()
+@item write()
+@end enumerate
+
+The filesystem's type as well as the node type within the filesystem
+determine the nature of the processing that must be performed for each of
+the functions above. The RTEMS filesystem provides a framework that
+allows new filesystem to be developed and integrated without alteration
+to the basic framework.
+
+To provide the functional switching that is required, each of the POSIX
+file and directory functions have been implemented as a shell function.
+The shell function adheres to the POSIX interface standard. Within this
+functional shell, filesystem and node type information is accessed which
+is then used to invoke the appropriate filesystem and node type specific
+routine to process the POSIX function call.
+
+@subsection File/Device/Directory function access via file control block - rtems_libio_t structure
+
+The POSIX open() function returns an integer file descriptor that is used
+as a reference to file control block information for a specific file. The
+file control block contains information that is used to locate node, file
+system, mount table and functional handler information. The diagram in
+Figure 8 depicts the relationship between and among the following
+components.
+
+@enumerate
+
+@item File Descriptor Table
+
+This is an internal RTEMS structure that tracks all currently defined file
+descriptors in the system. The index that is returned by the file open()
+operation references a slot in this table. The slot contains a pointer to
+the file descriptor table entry for this file. The rtems_libio_t structure
+represents the file control block.
+
+@item Allocation of entry in the File Descriptor Table
+
+Access to the file descriptor table is controlled through a semaphore that
+is implemented using the rtems_libio_allocate() function. This routine
+will grab a semaphore and then scan the file control blocks to determine
+which slot is free for use. The first free slot is marked as used and the
+index to this slot is returned as the file descriptor for the open()
+request. After the alterations have been made to the file control block
+table, the semaphore is released to allow further operations on the table.
+
+@item Maximum number of entries in the file descriptor table is
+configurable through the src/exec/sapi/headers/confdefs.h file. If the
+CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS constant is defined its value
+will represent the maximum number of file descriptors that are allowed.
+If CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS is not specified a default
+value of 20 will be used as the maximum number of file descriptors
+allowed.
+
+@item File control block - rtems_libio_t structure
+
+@example
+struct rtems_libio_tt @{
+ rtems_driver_name_t *driver;
+ off_t size;
+ off_t offset;
+ unsigned32 flags;
+ rtems_filesystem_location_info_t pathinfo;
+ Objects_Id sem;
+ unsigned32 data0;
+ void data1;
+ void file_info;
+ rtems_filesystem_file_handlers_r handlers;
+@};
+@end example
+
+A file control block can exist for regular files, devices and directories.
+The following fields are important for regular file and directory access:
+
+@itemize @bullet
+
+@item Size - For a file this represents the number of bytes currently
+stored in a file. For a directory this field is not filled in.
+
+@item Offset - For a file this is the byte file position index relative to
+the start of the file. For a directory this is the byte offset into a
+sequence of dirent structures.
+
+@item Pathinfo - This is a structure that provides a pointer to node
+information, OPS table functions, Handler functions and the mount table
+entry associated with this node.
+
+@item file_info - A pointer to node information that is used by Handler
+functions
+
+@item handlers - A pointer to a table of handler functions that operate on
+a file, device or directory through a file descriptor index
+
+@end itemize
+
+@end enumerate
+
+@subsection File/Directory function access via rtems_filesystem_location_info_t structure
+
+The rtems_filesystem_location_info_tt structure below provides sufficient
+information to process nodes under a mounted filesystem.
+
+@example
+struct rtems_filesystem_location_info_tt @{
+ void *node_access;
+ rtems_filesystem_file_handlers_r *handlers;
+ rtems_filesystem_operations_table *ops;
+ rtems_filesystem_mount_table_entry_t *mt_entry;
+@};
+@end example
+
+It contains a void pointer to filesystem specific nodal structure,
+pointers to the OPS table for the filesystem that contains the node, the
+node type specific handlers for the node and a reference pointer to the
+mount table entry associated with the filesystem containing the node
+
+@section Operation Tables
+
+Filesystem specific operations are invoked indirectly. The set of
+routines that implement the filesystem are configured into two tables.
+The Filesystem Handler Table has routines that are specific to a
+filesystem but remain constant regardless of the actual file type.
+The File Handler Table has routines that are both filesystem and file type
+specific.
+
+@subsection Filesystem Handler Table Functions
+
+OPS table functions are defined in a @code{rtems_filesystem_operations_table}
+structure. It defines functions that are specific to a given filesystem.
+One table exists for each filesystem that is supported in the RTEMS
+configuration. The structure definition appears below and is followed by
+general developmental information on each of the functions contained in this
+function management structure.
+
+@example
+typedef struct @{
+ rtems_filesystem_evalpath_t evalpath;
+ rtems_filesystem_evalmake_t evalformake;
+ rtems_filesystem_link_t link;
+ rtems_filesystem_unlink_t unlink;
+ rtems_filesystem_node_type_t node_type;
+ rtems_filesystem_mknod_t mknod;
+ rtems_filesystem_rmnod_t rmnod;
+ rtems_filesystem_chown_t chown;
+ rtems_filesystem_freenode_t freenod;
+ rtems_filesystem_mount_t mount;
+ rtems_filesystem_fsmount_me_t fsmount_me;
+ rtems_filesystem_unmount_t unmount;
+ rtems_filesystem_fsunmount_me_t fsunmount_me;
+ rtems_filesystem_utime_t utime;
+ rtems_filesystem_evaluate_link_t eval_link;
+ rtems_filesystem_symlink_t symlink;
+@} rtems_filesystem_operations_table;
+@end example
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection evalpath Handler
+
+@subheading Corresponding Structure Element:
+
+evalpath
+
+@subheading Arguments:
+
+@example
+ const char *pathname, /* IN */
+ int flags, /* IN */
+ rtems_filesystem_location_info_t *pathloc /* IN/OUT */
+@end example
+
+@subheading Description:
+
+This routine is responsible for evaluating the pathname passed in
+based upon the flags and the valid @code{rthems_filesystem_location_info_t}.
+Additionally, it must make any changes to pathloc necessary to identify
+the pathname node. This should include calling the evalpath for a mounted
+filesystem, if the given filesystem supports the mount command.
+
+This routine returns a 0 if the evaluation was successful.
+Otherwise, it returns a -1 and sets errno to the correct error.
+
+This routine is required and should NOT be set to NULL.
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection evalformake Handler
+
+@subheading Corresponding Structure Element:
+
+evalformake
+
+@subheading Arguments:
+
+@example
+ const char *path, /* IN */
+ rtems_filesystem_location_info_t *pathloc, /* IN/OUT */
+ const char **name /* OUT */
+@end example
+
+@subheading Description:
+
+This method is given a path to evaluate and a valid start location. It
+is responsible for finding the parent node for a requested make command,
+setting pathloc information to identify the parent node, and setting
+the name pointer to the first character of the name of the new node.
+Additionally, if the filesystem supports the mount command, this method
+should call the evalformake routine for the mounted filesystem.
+
+This routine returns a 0 if the evaluation was successful. Otherwise, it
+returns a -1 and sets errno to the correct error.
+
+This routine is required and should NOT be set to NULL. However, if
+the filesystem does not support user creation of a new node, it may
+set errno to ENOSYS and return -1.
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection link Handler
+
+@subheading Corresponding Structure Element:
+
+link
+
+@subheading Arguments:
+
+
+@example
+rtems_filesystem_location_info_t *to_loc, /* IN */
+rtems_filesystem_location_info_t *parent_loc, /* IN */
+const char *token /* IN */
+@end example
+
+@subheading Description:
+
+
+This routine is used to create a hard-link.
+
+It will first examine the st_nlink count of the node that we are trying to.
+If the link count exceeds LINK_MAX an error will be returned.
+
+The name of the link will be normalized to remove extraneous separators from
+the end of the name.
+
+This routine is not required and may be set to NULL.
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection unlink Handler
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection node_type Handler
+
+@subheading Corresponding Structure Element:
+
+node_type()
+
+@subheading Arguments:
+
+@example
+rtems_filesystem_location_info_t *pathloc /* IN */
+@end example
+
+@subheading Description:
+
+XXX
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection mknod Handler
+
+@subheading Corresponding Structure Element:
+
+mknod()
+
+@subheading Arguments:
+
+@example
+const char *token, /* IN */
+mode_t mode, /* IN */
+dev_t dev, /* IN */
+rtems_filesystem_location_info_t *pathloc /* IN/OUT */
+@end example
+
+@subheading Description:
+
+XXX
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection rmnod Handler
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection chown Handler
+
+@subheading Corresponding Structure Element:
+
+chown()
+
+@subheading Arguments:
+
+@example
+rtems_filesystem_location_info_t *pathloc /* IN */
+uid_t owner /* IN */
+gid_t group /* IN */
+@end example
+
+@subheading Description:
+
+XXX
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection freenod Handler
+
+@subheading Corresponding Structure Element:
+
+freenod()
+
+@subheading Arguments:
+
+@example
+rtems_filesystem_location_info_t *pathloc /* IN */
+@end example
+
+@subheading Description:
+
+This routine is used by the generic code to allow memory to be allocated
+during the evaluate routines, and set free when the generic code is finished
+accessing a node. If the evaluate routines allocate memory to identify
+a node this routine should be utilized to free that memory.
+
+This routine is not required and may be set to NULL.
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection mount Handler
+
+@subheading Corresponding Structure Element:
+
+mount()
+
+@subheading Arguments:
+
+@example
+rtems_filesystem_mount_table_entry_t *mt_entry
+@end example
+
+@subheading Description:
+
+XXX
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection fsmount_me Handler
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+@example
+rtems_filesystem_mount_table_entry_t *mt_entry
+@end example
+
+@subheading Description:
+
+This function is provided with a filesystem to take care of the internal
+filesystem management details associated with mounting that filesystem
+under the RTEMS environment.
+
+It is not responsible for the mounting details associated the filesystem
+containing the mount point.
+
+The rtems_filesystem_mount_table_entry_t structure contains the key elements
+below:
+
+rtems_filesystem_location_info_t *mt_point_node,
+
+This structure contains information about the mount point. This
+allows us to find the ops-table and the handling functions
+associated with the filesystem containing the mount point.
+
+rtems_filesystem_location_info_t *fs_root_node,
+
+This structure contains information about the root node in the file
+system to be mounted. It allows us to find the ops-table and the
+handling functions associated with the filesystem to be mounted.
+
+rtems_filesystem_options_t options,
+
+Read only or read/write access
+
+void *fs_info,
+
+This points to an allocated block of memory the will be used to
+hold any filesystem specific information of a global nature. This
+allocated region if important because it allows us to mount the
+same filesystem type more than once under the RTEMS system.
+Each instance of the mounted filesystem has its own set of global
+management information that is separate from the global
+management information associated with the other instances of the
+mounted filesystem type.
+
+rtems_filesystem_limits_and_options_t pathconf_info,
+
+The table contains the following set of values associated with the
+mounted filesystem:
+
+@itemize @bullet
+
+@item link_max
+
+@item max_canon
+
+@item max_input
+
+@item name_max
+
+@item path_max
+
+@item pipe_buf
+
+@item posix_async_io
+
+@item posix_chown_restrictions
+
+@item posix_no_trunc
+
+@item posix_prio_io
+
+@item posix_sync_io
+
+@item posix_vdisable
+
+@end itemize
+
+These values are accessed with the pathconf() and the fpathconf ()
+functions.
+
+const char *dev
+
+The is intended to contain a string that identifies the device that contains
+the filesystem information. The filesystems that are currently implemented
+are memory based and don't require a device specification.
+
+If the mt_point_node.node_access is NULL then we are mounting the base file
+system.
+
+The routine will create a directory node for the root of the IMFS file
+system.
+
+The node will have read, write and execute permissions for owner, group and
+others.
+
+The node's name will be a null string.
+
+A filesystem information structure(fs_info) will be allocated and
+initialized for the IMFS filesystem. The fs_info pointer in the mount table
+entry will be set to point the filesystem information structure.
+
+The pathconf_info element of the mount table will be set to the appropriate
+table of path configuration constants (LIMITS_AND_OPTIONS).
+
+The fs_root_node structure will be filled in with the following:
+
+@itemize @bullet
+
+@item pointer to the allocated root node of the filesystem
+
+@item directory handlers for a directory node under the IMFS filesystem
+
+@item OPS table functions for the IMFS
+
+@end itemize
+
+A 0 will be returned to the calling routine if the process succeeded,
+otherwise a 1 will be returned.
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection unmount Handler
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection fsunmount_me Handler
+
+@subheading Corresponding Structure Element:
+
+imfs_fsunmount_me()
+
+@subheading Arguments:
+
+@example
+rtems_filesystem_mount_table_entry_t *mt_entry
+@end example
+
+@subheading Description:
+
+XXX
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection utime Handler
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection eval_link Handler
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection symlink Handler
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+@c
+@c
+@c
+@c @page
+@subsection File Handler Table Functions
+
+Handler table functions are defined in a @code{rtems_filesystem_file_handlers_r}
+structure. It defines functions that are specific to a node type in a given
+filesystem. One table exists for each of the filesystem's node types. The
+structure definition appears below. It is followed by general developmental
+information on each of the functions associated with regular files contained
+in this function management structure.
+
+@example
+typedef struct @{
+ rtems_filesystem_open_t open;
+ rtems_filesystem_close_t close;
+ rtems_filesystem_read_t read;
+ rtems_filesystem_write_t write;
+ rtems_filesystem_ioctl_t ioctl;
+ rtems_filesystem_lseek_t lseek;
+ rtems_filesystem_fstat_t fstat;
+ rtems_filesystem_fchmod_t fchmod;
+ rtems_filesystem_ftruncate_t ftruncate;
+ rtems_filesystem_fpathconf_t fpathconf;
+ rtems_filesystem_fsync_t fsync;
+ rtems_filesystem_fdatasync_t fdatasync;
+ rtems_filesystem_fcntl_t fcntl;
+@} rtems_filesystem_file_handlers_r;
+@end example
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection open Handler
+
+@subheading Corresponding Structure Element:
+
+open()
+
+@subheading Arguments:
+
+@example
+rtems_libio_t *iop,
+const char *pathname,
+unsigned32 flag,
+unsigned32 mode
+@end example
+
+@subheading Description:
+
+XXX
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection close Handler
+
+@subheading Corresponding Structure Element:
+
+close()
+
+@subheading Arguments:
+
+@example
+rtems_libio_t *iop
+@end example
+
+@subheading Description:
+
+XXX
+
+@subheading NOTES:
+
+XXX
+
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection read Handler
+
+@subheading Corresponding Structure Element:
+
+read()
+
+@subheading Arguments:
+
+@example
+rtems_libio_t *iop,
+void *buffer,
+unsigned32 count
+@end example
+
+@subheading Description:
+
+XXX
+
+@subheading NOTES:
+
+XXX
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection write Handler
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+@subheading Description:
+
+XXX
+
+@subheading NOTES:
+
+XXX
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection ioctl Handler
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+@example
+rtems_libio_t *iop,
+unsigned32 command,
+void *buffer
+@end example
+
+@subheading Description:
+
+XXX
+
+@subheading NOTES:
+
+XXX
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection lseek Handler
+
+@subheading Corresponding Structure Element:
+
+lseek()
+
+@subheading Arguments:
+
+@example
+rtems_libio_t *iop,
+off_t offset,
+int whence
+@end example
+
+@subheading Description:
+
+XXX
+
+@subheading NOTES:
+
+XXX
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection fstat Handler
+
+@subheading Corresponding Structure Element:
+
+fstat()
+
+@subheading Arguments:
+
+@example
+rtems_filesystem_location_info_t *loc,
+struct stat *buf
+@end example
+
+@subheading Description:
+
+The following information is extracted from the filesystem
+specific node and placed in the @code{stat} structure:
+
+@itemize @bullet
+
+@item st_mode
+
+@item st_nlink
+
+@item st_ino
+
+@item st_uid
+
+@item st_gid
+
+@item st_atime
+
+@item st_mtime
+
+@item st_ctime
+
+@end itemize
+
+
+@subheading NOTES:
+
+Both the @code{stat()} and @code{lstat()} services are
+implemented directly using the @code{fstat()} handler. The
+difference in behavior is determined by how the path is evaluated
+prior to this handler being called on a particular
+file entity.
+
+The @code{fstat()} system call is implemented directly
+on top of this filesystem handler.
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection fchmod Handler
+
+@subheading Corresponding Structure Element:
+
+fchmod()
+
+@subheading Arguments:
+
+@example
+rtems_libio_t *iop
+mode_t mode
+@end example
+
+@subheading Description:
+
+XXX
+
+
+@subheading NOTES:
+
+XXX
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection ftruncate Handler
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+@subheading Description:
+
+XXX
+
+@subheading NOTES:
+
+XXX
+
+@subsubsection fpathconf Handler
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+@subheading NOTES:
+
+XXX
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection fsync Handler
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+@subheading Description:
+
+XXX
+
+@subheading NOTES:
+
+XXX
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection fdatasync Handler
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+@subheading NOTES:
+
+XXX
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection fcntl Handler
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+@subheading NOTES:
+
+XXX
diff --git a/doc/filesystem/imfs.t b/doc/filesystem/imfs.t
new file mode 100644
index 0000000000..c6dd6d2535
--- /dev/null
+++ b/doc/filesystem/imfs.t
@@ -0,0 +1,2038 @@
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter In-Memory Filesystem
+
+This chapter describes the In-Memory FileSystem (IMFS). The IMFS is a
+full featured POSIX filesystem that keeps all information in memory.
+
+@section IMFS Per Node Data Structure
+
+Each regular file, device, hard link, and directory is represented by a data
+structure called a @code{jnode}. The @code{jnode} is formally represented by the
+structure:
+
+@example
+struct IMFS_jnode_tt @{
+ Chain_Node Node; /* for chaining them together */
+ IMFS_jnode_t *Parent; /* Parent node */
+ char name[NAME_MAX+1]; /* "basename" */
+ mode_t st_mode; /* File mode */
+ nlink_t st_nlink; /* Link count */
+ ino_t st_ino; /* inode */
+
+ uid_t st_uid; /* User ID of owner */
+ gid_t st_gid; /* Group ID of owner */
+ time_t st_atime; /* Time of last access */
+ time_t st_mtime; /* Time of last modification */
+ time_t st_ctime; /* Time of last status change */
+ IMFS_jnode_types_t type; /* Type of this entry */
+ IMFS_typs_union info;
+@};
+@end example
+
+The key elements of this structure are listed below together with a brief
+explanation of their role in the filesystem.
+
+@table @b
+
+@item Node
+exists to allow the entire @code{jnode} structure to be included in a chain.
+
+@item Parent
+is a pointer to another @code{jnode} structure that is the logical parent of the
+node in which it appears. This field may be NULL if the file associated with
+this node is deleted but there are open file descriptors on this file or
+there are still hard links to this node.
+
+@item name
+is the name of this node within the filesystem hierarchical tree. Example: If
+the fully qualified pathname to the @code{jnode} was @code{/a/b/c}, the
+@code{jnode} name field would contain the null terminated string @code{"c"}.
+
+@item st_mode
+is the standard Unix access permissions for the file or directory.
+
+@item st_nlink
+is the number of hard links to this file. When a @code{jnode} is first created
+its link count is set to 1. A @code{jnode} and its associated resources
+cannot be deleted unless its link count is less than 1.
+
+@item st_ino
+is a unique node identification number
+
+@item st_uid
+is the user ID of the file's owner
+
+@item st_gid
+is the group ID of the file's owner
+
+@item st_atime
+is the time of the last access to this file
+
+@item st_mtime
+is the time of the last modification of this file
+
+@item st_ctime
+is the time of the last status change to the file
+
+@item type
+is the indication of node type must be one of the following states:
+
+@itemize @bullet
+@item IMFS_DIRECTORY
+@item IMFS_MEMORY_FILE
+@item IMFS_HARD_LINK
+@item IMFS_SYM_LINK
+@item IMFS_DEVICE
+@end itemize
+
+
+@item info
+is this contains a structure that is unique to file type (See IMFS_typs_union
+in imfs.h).
+
+@itemize @bullet
+
+@item IMFS_DIRECTORY
+
+An IMFS directory contains a dynamic chain structure that
+records all files and directories that are subordinate to the directory node.
+
+@item IMFS_MEMORY_FILE
+
+Under the in memory filesystem regular files hold data. Data is dynamically
+allocated to the file in 128 byte chunks of memory. The individual chunks of
+memory are tracked by arrays of pointers that record the address of the
+allocated chunk of memory. Single, double, and triple indirection pointers
+are used to record the locations of all segments of the file. The
+memory organization of an IMFS file are discussed elsewhere in this manual.
+
+@item IMFS_HARD_LINK
+
+The IMFS filesystem supports the concept of hard links to other nodes in the
+IMFS filesystem. These hard links are actual pointers to other nodes in the
+same filesystem. This type of link cannot cross-filesystem boundaries.
+
+@item IMFS_SYM_LINK
+
+The IMFS filesystem supports the concept of symbolic links to other nodes in
+any filesystem. A symbolic link consists of a pointer to a character string
+that represents the pathname to the target node. This type of link can
+cross-filesystem boundaries. Just as with most versions of UNIX supporting
+symbolic links, a symbolic link can point to a non-existent file.
+
+@item IMFS_DEVICE
+
+All RTEMS devices now appear as files under the in memory filesystem. On
+system initialization, all devices are registered as nodes under the file
+system.
+
+@end itemize
+
+@end table
+
+@section Miscellaneous IMFS Information
+
+@section Memory associated with the IMFS
+
+A memory based filesystem draws its resources for files and directories
+from the memory resources of the system. When it is time to un-mount the
+filesystem, the memory resources that supported filesystem are set free.
+In order to free these resources, a recursive walk of the filesystems
+tree structure will be performed. As the leaf nodes under the filesystem
+are encountered their resources are freed. When directories are made empty
+by this process, their resources are freed.
+
+@subsection Node removal constraints for the IMFS
+
+The IMFS conforms to the general filesystem requirements for node
+removal. See @ref{File and Directory Removal Constraints}.
+
+@subsection IMFS General Housekeeping Notes
+
+The following is a list of odd housekeeping notes for the IMFS.
+
+@itemize @bullet
+
+@item If the global variable rtems_filesystem_current refers to the node that
+we are trying to remove, the node_access element of this structure must be
+set to NULL to invalidate it.
+
+@item If the node was of IMFS_MEMORY_FILE type, free the memory associated
+with the memory file before freeing the node. Use the IMFS_memfile_remove()
+function.
+
+@end itemize
+
+@section IMFS Operation Tables
+
+@subsection IMFS Filesystem Handler Table Functions
+
+OPS table functions are defined in a rtems_filesystem_operations_table
+structure. It defines functions that are specific to a given filesystem.
+One table exists for each filesystem that is supported in the RTEMS
+configuration. The structure definition appears below and is followed by
+general developmental information on each of the functions contained in this
+function management structure.
+
+@example
+rtems_filesystem_operations_table IMFS_ops = @{
+ IMFS_eval_path,
+ IMFS_evaluate_for_make,
+ IMFS_link,
+ IMFS_unlink,
+ IMFS_node_type,
+ IMFS_mknod,
+ IMFS_rmnod,
+ IMFS_chown,
+ IMFS_freenodinfo,
+ IMFS_mount,
+ IMFS_initialize,
+ IMFS_unmount,
+ IMFS_fsunmount,
+ IMFS_utime,
+ IMFS_evaluate_link,
+ IMFS_symlink,
+ IMFS_readlink
+@};
+@end example
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_evalpath()
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+
+@subheading File:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_evalformake()
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+
+@subheading File:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_link()
+
+@subheading Corresponding Structure Element:
+
+link
+
+@subheading Arguments:
+
+
+@example
+rtems_filesystem_location_info_t *to_loc, /* IN */
+rtems_filesystem_location_info_t *parent_loc, /* IN */
+const char *token /* IN */
+@end example
+
+@subheading File:
+
+imfs_link.c
+
+@subheading Description:
+
+
+This routine is used in the IMFS filesystem to create a hard-link.
+
+It will first examine the st_nlink count of the node that we are trying to.
+If the link count exceeds LINK_MAX an error will be returned.
+
+The name of the link will be normalized to remove extraneous separators from
+the end of the name.
+
+IMFS_create_node will be used to create a filesystem node that will have the
+following characteristics:
+
+@itemize @bullet
+
+@item parent that was determined in the link() function in file link.c
+
+@item Type will be set to IMFS_HARD_LINK
+
+@item name will be set to the normalized name
+
+@item mode of the hard-link will be set to the mode of the target node
+
+@end itemize
+
+If there was trouble allocating memory for the new node an error will be
+returned.
+
+The st_nlink count of the target node will be incremented to reflect the new
+link.
+
+The time fields of the link will be set to reflect the creation time of the
+hard-link.
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_unlink()
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+
+@subheading File:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_node_type()
+
+@subheading Corresponding Structure Element:
+
+IMFS_node_type()
+
+@subheading Arguments:
+
+@example
+rtems_filesystem_location_info_t *pathloc /* IN */
+@end example
+
+@subheading File:
+
+imfs_ntype.c
+
+@subheading Description:
+
+This routine will locate the IMFS_jnode_t structure that holds ownership
+information for the selected node in the filesystem.
+
+This structure is pointed to by pathloc->node_access.
+
+The IMFS_jnode_t type element indicates one of the node types listed below:
+
+@itemize @bullet
+
+@item RTEMS_FILESYSTEM_DIRECTORY
+
+@item RTEMS_FILESYSTEM_DEVICE
+
+@item RTEMS_FILESYSTEM_HARD_LINK
+
+@item RTEMS_FILESYSTEM_MEMORY_FILE
+
+@end itemize
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_mknod()
+
+@subheading Corresponding Structure Element:
+
+IMFS_mknod()
+
+@subheading Arguments:
+
+@example
+const char *token, /* IN */
+mode_t mode, /* IN */
+dev_t dev, /* IN */
+rtems_filesystem_location_info_t *pathloc /* IN/OUT */
+@end example
+
+@subheading File:
+
+imfs_mknod.c
+
+@subheading Description:
+
+This routine will examine the mode argument to determine is we are trying to
+create a directory, regular file and a device node. The creation of other
+node types is not permitted and will cause an assert.
+
+Memory space will be allocated for a @code{jnode} and the node will be set up
+according to the nodal type that was specified. The IMFS_create_node()
+function performs the allocation and setup of the node.
+
+The only problem that is currently reported is the lack of memory when we
+attempt to allocate space for the @code{jnode} (ENOMEN).
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_rmnod()
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+
+@subheading File:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_chown()
+
+@subheading Corresponding Structure Element:
+
+IMFS_chown()
+
+@subheading Arguments:
+
+@example
+rtems_filesystem_location_info_t *pathloc /* IN */
+uid_t owner /* IN */
+gid_t group /* IN */
+@end example
+
+@subheading File:
+
+imfs_chown.c
+
+@subheading Description:
+
+This routine will locate the IMFS_jnode_t structure that holds ownership
+information for the selected node in the filesystem.
+
+This structure is pointed to by pathloc->node_access.
+
+The st_uid and st_gid fields of the node are then modified. Since this is a
+memory based filesystem, no further action is required to alter the
+ownership of the IMFS_jnode_t structure.
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_freenod()
+
+@subheading Corresponding Structure Element:
+
+IMFS_freenod()
+
+@subheading Arguments:
+
+@example
+rtems_filesystem_location_info_t *pathloc /* IN */
+@end example
+
+@subheading File:
+
+imfs_free.c
+
+@subheading Description:
+
+This method is a private function to the IMFS. It is called by IMFS routines
+to free nodes that have been allocated. Examples of where this routine
+may be called from are unlink and rmnod.
+
+Note: This routine should not be confused with the filesystem callback
+freenod. The IMFS allocates memory until the node no longer exists.
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_freenodinfo()
+
+@subheading Corresponding Structure Element:
+
+IMFS_freenodinfo()
+
+@subheading Arguments:
+
+@example
+rtems_filesystem_location_info_t *pathloc /* IN */
+@end example
+
+@subheading File:
+
+imfs_free.c
+
+@subheading Description:
+
+The In-Memory File System does not need to allocate memory during the
+evaluate routines. Therefore, this routine simply routines PASS.
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_mount()
+
+@subheading Corresponding Structure Element:
+
+IMFS_mount()
+
+@subheading Arguments:
+
+@example
+rtems_filesystem_mount_table_entry_t *mt_entry
+@end example
+
+@subheading File:
+
+imfs_mount.c
+
+@subheading Description:
+
+This routine provides the filesystem specific processing required to mount a
+filesystem for the system that contains the mount point. It will determine
+if the point that we are trying to mount onto is a node of IMFS_DIRECTORY
+type.
+
+If it is the node's info element is altered so that the info.directory.mt_fs
+element points to the mount table chain entry that is associated with the
+mounted filesystem at this point. The info.directory.mt_fs element can be
+examined to determine if a filesystem is mounted at a directory. If it is
+NULL, the directory does not serve as a mount point. A non-NULL entry
+indicates that the directory does serve as a mount point and the value of
+info.directory.mt_fs can be used to locate the mount table chain entry that
+describes the filesystem mounted at this point.
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_fsmount_me()
+
+@subheading Corresponding Structure Element:
+
+IMFS_initialize()
+
+@subheading Arguments:
+
+@example
+rtems_filesystem_mount_table_entry_t *mt_entry
+@end example
+
+@subheading File:
+
+imfs_init.c
+
+@subheading Description:
+
+This function is provided with a filesystem to take care of the internal
+filesystem management details associated with mounting that filesystem
+under the RTEMS environment.
+
+It is not responsible for the mounting details associated the filesystem
+containing the mount point.
+
+The rtems_filesystem_mount_table_entry_t structure contains the key elements
+below:
+
+rtems_filesystem_location_info_t *mt_point_node,
+
+This structure contains information about the mount point. This
+allows us to find the ops-table and the handling functions
+associated with the filesystem containing the mount point.
+
+rtems_filesystem_location_info_t *fs_root_node,
+
+This structure contains information about the root node in the file
+system to be mounted. It allows us to find the ops-table and the
+handling functions associated with the filesystem to be mounted.
+
+rtems_filesystem_options_t options,
+
+Read only or read/write access
+
+void *fs_info,
+
+This points to an allocated block of memory the will be used to
+hold any filesystem specific information of a global nature. This
+allocated region if important because it allows us to mount the
+same filesystem type more than once under the RTEMS system.
+Each instance of the mounted filesystem has its own set of global
+management information that is separate from the global
+management information associated with the other instances of the
+mounted filesystem type.
+
+rtems_filesystem_limits_and_options_t pathconf_info,
+
+The table contains the following set of values associated with the
+mounted filesystem:
+
+@itemize @bullet
+
+@item link_max
+
+@item max_canon
+
+@item max_input
+
+@item name_max
+
+@item path_max
+
+@item pipe_buf
+
+@item posix_async_io
+
+@item posix_chown_restrictions
+
+@item posix_no_trunc
+
+@item posix_prio_io
+
+@item posix_sync_io
+
+@item posix_vdisable
+
+@end itemize
+
+These values are accessed with the pathconf() and the fpathconf ()
+functions.
+
+const char *dev
+
+The is intended to contain a string that identifies the device that contains
+the filesystem information. The filesystems that are currently implemented
+are memory based and don't require a device specification.
+
+If the mt_point_node.node_access is NULL then we are mounting the base file
+system.
+
+The routine will create a directory node for the root of the IMFS file
+system.
+
+The node will have read, write and execute permissions for owner, group and
+others.
+
+The node's name will be a null string.
+
+A filesystem information structure(fs_info) will be allocated and
+initialized for the IMFS filesystem. The fs_info pointer in the mount table
+entry will be set to point the filesystem information structure.
+
+The pathconf_info element of the mount table will be set to the appropriate
+table of path configuration constants ( IMFS_LIMITS_AND_OPTIONS ).
+
+The fs_root_node structure will be filled in with the following:
+
+@itemize @bullet
+
+@item pointer to the allocated root node of the filesystem
+
+@item directory handlers for a directory node under the IMFS filesystem
+
+@item OPS table functions for the IMFS
+
+@end itemize
+
+A 0 will be returned to the calling routine if the process succeeded,
+otherwise a 1 will be returned.
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_unmount()
+
+@subheading Corresponding Structure Element:
+
+IMFS_unmount()
+
+@subheading Arguments:
+
+@example
+rtems_filesystem_mount_table_entry_t *mt_entry
+@end example
+
+@subheading File:
+
+imfs_unmount.c
+
+@subheading Description:
+
+This routine allows the IMFS to unmount a filesystem that has been
+mounted onto a IMFS directory.
+
+The mount entry mount point node access is verified to be a mounted
+directory. It's mt_fs is set to NULL. This identifies to future
+calles into the IMFS that this directory node is no longer a mount
+point. Additionally, it will allow any directories that were hidden
+by the mounted system to again become visible.
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_fsunmount()
+
+@subheading Corresponding Structure Element:
+
+imfs_fsunmount()
+
+@subheading Arguments:
+
+@example
+rtems_filesystem_mount_table_entry_t *mt_entry
+@end example
+
+@subheading File:
+
+imfs_init.c
+
+@subheading Description:
+
+This method unmounts this instance of the IMFS file system. It is the
+counterpart to the IMFS_initialize routine. It is called by the generic
+code under the fsunmount_me callback.
+
+All method loops finding the first encountered node with no children and
+removing the node from the tree, thus returning allocated resources. This
+is done until all allocated nodes are returned.
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_utime()
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+
+@subheading File:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_eval_link()
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+
+@subheading File:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+@c
+@c
+@c
+@c @page
+@subsection Regular File Handler Table Functions
+
+Handler table functions are defined in a rtems_filesystem_file_handlers_r
+structure. It defines functions that are specific to a node type in a given
+filesystem. One table exists for each of the filesystem's node types. The
+structure definition appears below. It is followed by general developmental
+information on each of the functions associated with regular files contained
+in this function management structure.
+
+@example
+rtems_filesystem_file_handlers_r IMFS_memfile_handlers = @{
+ memfile_open,
+ memfile_close,
+ memfile_read,
+ memfile_write,
+ memfile_ioctl,
+ memfile_lseek,
+ IMFS_stat,
+ IMFS_fchmod,
+ memfile_ftruncate,
+ NULL, /* fpathconf */
+ NULL, /* fsync */
+ IMFS_fdatasync,
+ IMFS_fcntl
+@};
+@end example
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection memfile_open() for Regular Files
+
+@subheading Corresponding Structure Element:
+
+memfile_open()
+
+@subheading Arguments:
+
+@example
+rtems_libio_t *iop,
+const char *pathname,
+unsigned32 flag,
+unsigned32 mode
+@end example
+
+@subheading File:
+
+memfile.c
+
+@subheading Description:
+
+Currently this function is a shell. No meaningful processing is performed and
+a success code is always returned.
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection memfile_close() for Regular Files
+
+@subheading Corresponding Structure Element:
+
+memfile_close()
+
+@subheading Arguments:
+
+@example
+rtems_libio_t *iop
+@end example
+
+@subheading File:
+
+memfile.c
+
+@subheading Description:
+
+This routine is a dummy for regular files under the base filesystem. It
+performs a capture of the IMFS_jnode_t pointer from the file control block
+and then immediately returns a success status.
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection memfile_read() for Regular Files
+
+@subheading Corresponding Structure Element:
+
+memfile_read()
+
+@subheading Arguments:
+
+@example
+rtems_libio_t *iop,
+void *buffer,
+unsigned32 count
+@end example
+
+@subheading File:
+
+memfile.c
+
+@subheading Description:
+
+This routine will determine the @code{jnode} that is associated with this file.
+
+It will then call IMFS_memfile_read() with the @code{jnode}, file position index,
+buffer and transfer count as arguments.
+
+IMFS_memfile_read() will do the following:
+
+@itemize @bullet
+
+@item Verify that the @code{jnode} is associated with a memory file
+
+@item Verify that the destination of the read is valid
+
+@item Adjust the length of the read if it is too long
+
+@item Acquire data from the memory blocks associated with the file
+
+@item Update the access time for the data in the file
+
+@end itemize
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection memfile_write() for Regular Files
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+@subheading File:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection memfile_ioctl() for Regular Files
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+@example
+rtems_libio_t *iop,
+unsigned32 command,
+void *buffer
+@end example
+
+@subheading File:
+
+memfile.c
+
+@subheading Description:
+
+The current code is a placeholder for future development. The routine returns
+a successful completion status.
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection memfile_lseek() for Regular Files
+
+@subheading Corresponding Structure Element:
+
+Memfile_lseek()
+
+@subheading Arguments:
+
+@example
+rtems_libio_t *iop,
+off_t offset,
+int whence
+@end example
+
+@subheading File:
+
+memfile.c
+
+@subheading Description:
+
+This routine make sure that the memory based file is sufficiently large to
+allow for the new file position index.
+
+The IMFS_memfile_extend() function is used to evaluate the current size of
+the memory file and allocate additional memory blocks if required by the new
+file position index. A success code is always returned from this routine.
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_stat() for Regular Files
+
+@subheading Corresponding Structure Element:
+
+IMFS_stat()
+
+@subheading Arguments:
+
+@example
+rtems_filesystem_location_info_t *loc,
+struct stat *buf
+@end example
+
+@subheading File:
+
+imfs_stat.c
+
+@subheading Description:
+
+This routine actually performs status processing for both devices and regular
+files.
+
+The IMFS_jnode_t structure is referenced to determine the type of node under
+the filesystem.
+
+If the node is associated with a device, node information is extracted and
+transformed to set the st_dev element of the stat structure.
+
+If the node is a regular file, the size of the regular file is extracted from
+the node.
+
+This routine rejects other node types.
+
+The following information is extracted from the node and placed in the stat
+structure:
+
+@itemize @bullet
+
+@item st_mode
+
+@item st_nlink
+
+@item st_ino
+
+@item st_uid
+
+@item st_gid
+
+@item st_atime
+
+@item st_mtime
+
+@item st_ctime
+
+@end itemize
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_fchmod() for Regular Files
+
+@subheading Corresponding Structure Element:
+
+IMFS_fchmod()
+
+@subheading Arguments:
+
+@example
+rtems_libio_t *iop
+mode_t mode
+@end example
+
+@subheading File:
+
+imfs_fchmod.c
+
+@subheading Description:
+
+This routine will obtain the pointer to the IMFS_jnode_t structure from the
+information currently in the file control block.
+
+Based on configuration the routine will acquire the user ID from a call to
+getuid() or from the IMFS_jnode_t structure.
+
+It then checks to see if we have the ownership rights to alter the mode of
+the file. If the caller does not, an error code is returned.
+
+An additional test is performed to verify that the caller is not trying to
+alter the nature of the node. If the caller is attempting to alter more than
+the permissions associated with user group and other, an error is returned.
+
+If all the preconditions are met, the user, group and other fields are set
+based on the mode calling parameter.
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection memfile_ftruncate() for Regular Files
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+@subheading File:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+
+@subsubsection No pathconf() for Regular Files
+
+@subheading Corresponding Structure Element:
+
+NULL
+
+@subheading Arguments:
+
+Not Implemented
+
+@subheading File:
+
+Not Implemented
+
+@subheading Description:
+
+Not Implemented
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection No fsync() for Regular Files
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+@subheading File:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_fdatasync() for Regular Files
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+@subheading File:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+@c
+@c
+@c
+@c @page
+@subsection Directory Handler Table Functions
+
+Handler table functions are defined in a rtems_filesystem_file_handlers_r
+structure. It defines functions that are specific to a node type in a given
+filesystem. One table exists for each of the filesystem's node types. The
+structure definition appears below. It is followed by general developmental
+information on each of the functions associated with directories contained in
+this function management structure.
+
+@example
+rtems_filesystem_file_handlers_r IMFS_directory_handlers = @{
+ IMFS_dir_open,
+ IMFS_dir_close,
+ IMFS_dir_read,
+ NULL, /* write */
+ NULL, /* ioctl */
+ IMFS_dir_lseek,
+ IMFS_dir_fstat,
+ IMFS_fchmod,
+ NULL, /* ftruncate */
+ NULL, /* fpathconf */
+ NULL, /* fsync */
+ IMFS_fdatasync,
+ IMFS_fcntl
+@};
+@end example
+
+
+@c
+@c
+@c
+@c @page
+@subsubsection IMFS_dir_open() for Directories
+
+@subheading Corresponding Structure Element:
+
+imfs_dir_open()
+
+@subheading Arguments:
+
+@example
+rtems_libio_t *iop,
+const char *pathname,
+unsigned32 flag,
+unsigned32 mode
+@end example
+
+@subheading File:
+
+imfs_directory.c
+
+@subheading Description:
+
+This routine will look into the file control block to find the @code{jnode} that
+is associated with the directory.
+
+The routine will verify that the node is a directory. If its not a directory
+an error code will be returned.
+
+If it is a directory, the offset in the file control block will be set to 0.
+This allows us to start reading at the beginning of the directory.
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_dir_close() for Directories
+
+@subheading Corresponding Structure Element:
+
+imfs_dir_close()
+
+@subheading Arguments:
+
+@example
+rtems_libio_t *iop
+@end example
+
+@subheading File:
+
+imfs_directory.c
+
+@subheading Description:
+
+This routine is a dummy for directories under the base filesystem. It
+immediately returns a success status.
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_dir_read() for Directories
+
+@subheading Corresponding Structure Element:
+
+imfs_dir_read
+
+@subheading Arguments:
+
+@example
+rtems_libio_t *iop,
+void *buffer,
+unsigned32 count
+@end example
+
+@subheading File:
+
+imfs_directory.c
+
+@subheading Description:
+
+This routine will read a fixed number of directory entries from the current
+directory offset. The number of directory bytes read will be returned from
+this routine.
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection No write() for Directories
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+
+@subheading File:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection No ioctl() for Directories
+
+@subheading Corresponding Structure Element:
+
+ioctl
+
+@subheading Arguments:
+
+
+@subheading File:
+
+Not supported
+
+@subheading Description:
+
+XXX
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_dir_lseek() for Directories
+
+@subheading Corresponding Structure Element:
+
+imfs_dir_lseek()
+
+@subheading Arguments:
+
+@example
+rtems_libio_t *iop,
+off_t offset,
+int whence
+@end example
+
+@subheading File:
+
+imfs_directory.c
+
+@subheading Description:
+
+This routine alters the offset in the file control block.
+
+No test is performed on the number of children under the current open
+directory. The imfs_dir_read() function protects against reads beyond the
+current size to the directory by returning a 0 bytes transfered to the
+calling programs whenever the file position index exceeds the last entry in
+the open directory.
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_dir_fstat() for Directories
+
+@subheading Corresponding Structure Element:
+
+imfs_dir_fstat()
+
+@subheading Arguments:
+
+
+@example
+rtems_filesystem_location_info_t *loc,
+struct stat *buf
+@end example
+
+@subheading File:
+
+imfs_directory.c
+
+@subheading Description:
+
+The node access information in the rtems_filesystem_location_info_t structure
+is used to locate the appropriate IMFS_jnode_t structure. The following
+information is taken from the IMFS_jnode_t structure and placed in the stat
+structure:
+
+@itemize @bullet
+@item st_ino
+@item st_mode
+@item st_nlink
+@item st_uid
+@item st_gid
+@item st_atime
+@item st_mtime
+@item st_ctime
+@end itemize
+
+The st_size field is obtained by running through the chain of directory
+entries and summing the sizes of the dirent structures associated with each
+of the children of the directory.
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_fchmod() for Directories
+
+@subheading Corresponding Structure Element:
+
+IMFS_fchmod()
+
+@subheading Arguments:
+
+@example
+rtems_libio_t *iop
+mode_t mode
+@end example
+
+@subheading File:
+
+imfs_fchmod.c
+
+@subheading Description:
+
+This routine will obtain the pointer to the IMFS_jnode_t structure from the
+information currently in the file control block.
+
+Based on configuration the routine will acquire the user ID from a call to
+getuid() or from the IMFS_jnode_t structure.
+
+It then checks to see if we have the ownership rights to alter the mode of
+the file. If the caller does not, an error code is returned.
+
+An additional test is performed to verify that the caller is not trying to
+alter the nature of the node. If the caller is attempting to alter more than
+the permissions associated with user group and other, an error is returned.
+
+If all the preconditions are met, the user, group and other fields are set
+based on the mode calling parameter.
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection No ftruncate() for Directories
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+
+@subheading File:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection No fpathconf() for Directories
+
+@subheading Corresponding Structure Element:
+
+fpathconf
+
+@subheading Arguments:
+
+Not Implemented
+
+@subheading File:
+
+Not Implemented
+
+@subheading Description:
+
+Not Implemented
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection No fsync() for Directories
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+@subheading File:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_fdatasync() for Directories
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+
+@subheading File:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+@c
+@c
+@c
+@c @page
+@subsection Device Handler Table Functions
+
+Handler table functions are defined in a rtems_filesystem_file_handlers_r
+structure. It defines functions that are specific to a node type in a given
+filesystem. One table exists for each of the filesystem's node types. The
+structure definition appears below. It is followed by general developmental
+information on each of the functions associated with devices contained in
+this function management structure.
+
+@example
+typedef struct @{
+ rtems_filesystem_open_t open;
+ rtems_filesystem_close_t close;
+ rtems_filesystem_read_t read;
+ rtems_filesystem_write_t write;
+ rtems_filesystem_ioctl_t ioctl;
+ rtems_filesystem_lseek_t lseek;
+ rtems_filesystem_fstat_t fstat;
+ rtems_filesystem_fchmod_t fchmod;
+ rtems_filesystem_ftruncate_t ftruncate;
+ rtems_filesystem_fpathconf_t fpathconf;
+ rtems_filesystem_fsync_t fsync;
+ rtems_filesystem_fdatasync_t fdatasync;
+@} rtems_filesystem_file_handlers_r;
+@end example
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection device_open() for Devices
+
+@subheading Corresponding Structure Element:
+
+device_open()
+
+@subheading Arguments:
+
+@example
+rtems_libio_t *iop,
+const char *pathname,
+unsigned32 flag,
+unsigned32 mode
+@end example
+
+@subheading File:
+
+deviceio.c
+
+@subheading Description:
+
+This routine will use the file control block to locate the node structure for
+the device.
+
+It will extract the major and minor device numbers from the @code{jnode}.
+
+The major and minor device numbers will be used to make a rtems_io_open()
+function call to open the device driver. An argument list is sent to the
+driver that contains the file control block, flags and mode information.
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection device_close() for Devices
+
+@subheading Corresponding Structure Element:
+
+device_close()
+
+@subheading Arguments:
+
+@example
+rtems_libio_t *iop
+@end example
+
+@subheading File:
+
+deviceio.c
+
+@subheading Description:
+
+This routine extracts the major and minor device driver numbers from the
+IMFS_jnode_t that is referenced in the file control block.
+
+It also forms an argument list that contains the file control block.
+
+A rtems_io_close() function call is made to close the device specified by the
+major and minor device numbers.
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection device_read() for Devices
+
+@subheading Corresponding Structure Element:
+
+device_read()
+
+@subheading Arguments:
+
+@example
+rtems_libio_t *iop,
+void *buffer,
+unsigned32 count
+@end example
+
+@subheading File:
+
+deviceio.c
+
+@subheading Description:
+
+This routine will extract the major and minor numbers for the device from the -
+jnode- associated with the file descriptor.
+
+A rtems_io_read() call will be made to the device driver associated with the file
+descriptor. The major and minor device number will be sent as arguments as well
+as an argument list consisting of:
+
+@itemize @bullet
+@item file control block
+
+@item file position index
+
+@item buffer pointer where the data read is to be placed
+
+@item count indicating the number of bytes that the program wishes to read
+from the device
+
+@item flags from the file control block
+
+@end itemize
+
+On return from the rtems_io_read() the number of bytes that were actually
+read will be returned to the calling program.
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection device_write() for Devices
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+@subheading File:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection device_ioctl() for Devices
+
+@subheading Corresponding Structure Element:
+
+ioctl
+
+@subheading Arguments:
+
+@example
+rtems_libio_t *iop,
+unsigned32 command,
+void *buffer
+@end example
+
+@subheading File:
+
+deviceio.c
+
+@subheading Description:
+
+This handler will obtain status information about a device.
+
+The form of status is device dependent.
+
+The rtems_io_control() function uses the major and minor number of the device
+to obtain the status information.
+
+rtems_io_control() requires an rtems_libio_ioctl_args_t argument list which
+contains the file control block, device specific command and a buffer pointer
+to return the device status information.
+
+The device specific command should indicate the nature of the information
+that is desired from the device.
+
+After the rtems_io_control() is processed, the buffer should contain the
+requested device information.
+
+If the device information is not obtained properly a -1 will be returned to
+the calling program, otherwise the ioctl_return value is returned.
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection device_lseek() for Devices
+
+@subheading Corresponding Structure Element:
+
+device_lseek()
+
+@subheading Arguments:
+
+@example
+rtems_libio_t *iop,
+off_t offset,
+int whence
+@end example
+
+@subheading File:
+
+deviceio.c
+
+@subheading Description:
+
+At the present time this is a placeholder function. It always returns a
+successful status.
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_stat() for Devices
+
+@subheading Corresponding Structure Element:
+
+IMFS_stat()
+
+@subheading Arguments:
+
+@example
+rtems_filesystem_location_info_t *loc,
+struct stat *buf
+@end example
+
+@subheading File:
+
+imfs_stat.c
+
+@subheading Description:
+
+This routine actually performs status processing for both devices and regular files.
+
+The IMFS_jnode_t structure is referenced to determine the type of node under the
+filesystem.
+
+If the node is associated with a device, node information is extracted and
+transformed to set the st_dev element of the stat structure.
+
+If the node is a regular file, the size of the regular file is extracted from the node.
+
+This routine rejects other node types.
+
+The following information is extracted from the node and placed in the stat
+structure:
+
+@itemize @bullet
+
+@item st_mode
+
+@item st_nlink
+
+@item st_ino
+
+@item st_uid
+
+@item st_gid
+
+@item st_atime
+
+@item st_mtime
+
+@item st_ctime
+
+@end itemize
+
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection IMFS_fchmod() for Devices
+
+@subheading Corresponding Structure Element:
+
+IMFS_fchmod()
+
+@subheading Arguments:
+
+@example
+rtems_libio_t *iop
+mode_t mode
+@end example
+
+@subheading File:
+
+imfs_fchmod.c
+
+@subheading Description:
+
+This routine will obtain the pointer to the IMFS_jnode_t structure from the
+information currently in the file control block.
+
+Based on configuration the routine will acquire the user ID from a call to
+getuid() or from the IMFS_jnode_t structure.
+
+It then checks to see if we have the ownership rights to alter the mode of
+the file. If the caller does not, an error code is returned.
+
+An additional test is performed to verify that the caller is not trying to
+alter the nature of the node. If the caller is attempting to alter more than
+the permissions associated with user group and other, an error is returned.
+
+If all the preconditions are met, the user, group and other fields are set
+based on the mode calling parameter.
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection No ftruncate() for Devices
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+@subheading File:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection No fpathconf() for Devices
+
+@subheading Corresponding Structure Element:
+
+fpathconf
+
+@subheading Arguments:
+
+Not Implemented
+
+@subheading File:
+
+Not Implemented
+
+@subheading Description:
+
+Not Implemented
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection No fsync() for Devices
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+
+@subheading File:
+
+XXX
+
+@subheading Description:
+
+XXX
+
+
+@c
+@c
+@c
+@c @page
+
+@subsubsection No fdatasync() for Devices
+
+Not Implemented
+
+@subheading Corresponding Structure Element:
+
+XXX
+
+@subheading Arguments:
+
+XXX
+
+@subheading File:
+
+XXX
+
+@subheading Description:
+
+XXX
+
diff --git a/doc/filesystem/init.t b/doc/filesystem/init.t
new file mode 100644
index 0000000000..7dff1867ce
--- /dev/null
+++ b/doc/filesystem/init.t
@@ -0,0 +1,113 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter System Initialization
+
+After the RTEMS initialization is performed, the application's
+initialization will be performed. Part of initialization is a call to
+rtems_filesystem_initialize(). This routine will mount the `In Memory File
+System' as the base filesystem. Mounting the base filesystem consists
+of the following:
+
+@itemize @bullet
+
+@item Initialization of mount table chain control structure
+
+@item Allocation of a @code{jnode} structure that will server as the root node
+of the `In Memory Filesystem'
+
+@item Initialization of the allocated @code{jnode} with the appropriate OPS,
+directory handlers and pathconf limits and options.
+
+@item Allocation of a memory region for filesystem specific global
+management variables
+
+@item Creation of first mount table entry for the base filesystem
+
+@item Initialization of the first mount table chain entry to indicate that
+the mount point is NULL and the mounted filesystem is the base file
+system
+
+@end itemize
+
+
+After the base filesystem has been mounted, the following operations are
+performed under its directory structure:
+
+@itemize @bullet
+
+@item Creation of the /dev directory
+
+@item Registration of devices under /dev directory
+
+@end itemize
+
+@section Base Filesystem
+
+RTEMS initially mounts a RAM based file system known as the base file system.
+The root directory of this file system tree serves as the logical root of the
+directory hierarchy (Figure 3). Under the root directory a `/dev' directory
+is created under which all I/O device directories and files are registered as
+part of the file system hierarchy.
+
+@example
+Figure of the tree structure goes here.
+@end example
+
+A RAM based file system draws its management resources from memory. File and
+directory nodes are simply allocated blocks of memory. Data associated with
+regular files is stored in collections of memory blocks. When the system is
+turned off or restarted all memory-based components of the file system are
+lost.
+
+The base file system serves as a starting point for the mounting of file
+systems that are resident on semi-permanent storage media. Examples of such
+media include non- volatile memory, flash memory and IDE hard disk drives
+(Figure 3). File systems of other types will be mounted onto mount points
+within the base file system or other file systems that are subordinate to the
+base file system. The framework set up under the base file system will allow
+for these new file system types and the unique data and functionality that is
+required to manage the future file systems.
+
+@subsection Base Filesystem Mounting
+
+At present, the first file system to be mounted is the `In Memory File
+System'. It is mounted using a standard MOUNT() command in which the mount
+point is NULL. This flags the mount as the first file system to be
+registered under the operating system and appropriate initialization of file
+system management information is performed (See figures 4 and 5). If a
+different file system type is desired as the base file system, alterations
+must be made to base_fs.c. This routine handles the mount of the base file
+system.
+
+
+@example
+Figure of the mount table chain goes here.
+@end example
+
+
+Once the root of the base file system has been established and it has been
+recorded as the mount point of the base file system, devices are integrated
+into the base file system. For every device that is configured into the
+system (See ioman.c) a device registration process is performed. Device
+registration produces a unique dev_t handle that consists of a major and
+minor device number. In addition, the configuration information for each
+device contains a text string that represents the fully qualified pathname to
+that device's place in the base file system's hierarchy. A file system node
+is created for the device along the specified registration path.
+
+
+@example
+Figure of the Mount Table Processing goes here.
+@end example
+
+
+Note: Other file systems can be mounted but they are mounted onto points
+(directory mount points) in the base file system.
+
+
diff --git a/doc/filesystem/miniimfs.t b/doc/filesystem/miniimfs.t
new file mode 100644
index 0000000000..cc6a45a5f0
--- /dev/null
+++ b/doc/filesystem/miniimfs.t
@@ -0,0 +1,16 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Miniature In-Memory Filesystem
+
+This chapter describes the Miniature In-Memory FileSystem (miniIMFS).
+The miniIMFS is a reduced feature version of the IMFS designed to
+provide minimal functionality and have a low memory footprint.
+
+This chapter should be written after the IMFS chapter is completed
+and describe the implementation of the mini-IMFS.
diff --git a/doc/filesystem/mounting.t b/doc/filesystem/mounting.t
new file mode 100644
index 0000000000..c0d1243580
--- /dev/null
+++ b/doc/filesystem/mounting.t
@@ -0,0 +1,171 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Mounting and Unmounting Filesystems
+
+@section Mount Points
+
+The following is the list of the characteristics of a mount point:
+
+@itemize @bullet
+
+@item The mount point must be a directory. It may have files and other
+directories under it. These files and directories will be hidden when the
+filesystem is mounted.
+
+@item The task must have read/write/execute permissions to the mount point
+or the mount attempt will be rejected.
+
+@item Only one filesystem can be mounted to a single mount point.
+
+@item The Root of the mountable filesystem will be referenced by the name
+of the mount point after the mount is complete.
+
+@end itemize
+
+@section Mount Table Chain
+
+The mount table chain is a dynamic list of structures that describe
+mounted filesystems a specific points in the filesystem hierarchy. It is
+initialized to an empty state during the base filesystem initialization.
+The mount operation will add entries to the mount table chain. The
+un-mount operation will remove entries from the mount table chain.
+
+Each entry in the mount table chain is of the following type:
+
+@example
+struct rtems_filesystem_mount_table_entry_tt
+@{
+ Chain_Node Node;
+ rtems_filesystem_location_info_t mt_point_node;
+ rtems_filesystem_location_info_t mt_fs_root;
+ int options;
+ void *fs_info;
+
+ rtems_filesystem_limits_and_options_t pathconf_limits_and_options;
+
+ /*
+ * When someone adds a mounted filesystem on a real device,
+ * this will need to be used.
+ *
+ * The best option long term for this is probably an
+ * open file descriptor.
+ */
+ char *dev;
+@};
+@end example
+
+@table @b
+@item Node
+The Node is used to produce a linked list of mount table entry nodes.
+
+@item mt_point_node
+The mt_point_node contains all information necessary to access the
+directory where a filesystem is mounted onto. This element may contain
+memory that is allocated during a path evaluation of the filesystem
+containing the mountpoint directory. The generic code allows this
+memory to be returned by unmount when the filesystem identified by
+mt_fs_root is unmounted.
+
+@item mt_fs_root
+The mt_fs_root contains all information necessary to identify the root
+of the mounted filesystem. The user is never allowed access to this
+node by the generic code, but it is used to identify to the mounted
+filesystem where to start evaluation of pathnames at.
+
+@item options
+XXX
+
+@item fs_info
+The fs_info element is a location available for use by the mounted file
+system to identify unique things applicable to this instance of the file
+system. For example the IMFS uses this space to provide node
+identification that is unique for each instance (mounting) of the filesystem.
+
+@item pathconf_limits_and_options
+XXX
+
+@item dev
+This character string represents the device where the filesystem will reside.
+
+@end table
+
+@section Adding entries to the chain during mount
+
+When a filesystem is mounted, its presence and location in the file
+system hierarchy is recorded in a dynamic list structure known as a chain.
+A unique rtems_filesystem_mount_table_entry_tt structure is logged for
+each filesystem that is mounted. This includes the base filesystem.
+
+@section Removing entries from the chain during unmount
+
+When a filesystem is dismounted its entry in the mount table chain is
+extracted and the memory for this entry is freed.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/filesystem/patheval.t b/doc/filesystem/patheval.t
new file mode 100644
index 0000000000..bdc9c1d210
--- /dev/null
+++ b/doc/filesystem/patheval.t
@@ -0,0 +1,109 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Pathname Evaluation
+
+This chapter describes the pathname evaluation process for the
+RTEMS Filesystem Infrastructure.
+
+@example
+XXX Include graphic of the path evaluation process
+@end example
+
+@section Pathname Evaluation Handlers
+
+There are two pathname evaluation routines. The handler patheval()
+is called to find, verify privlages on and return information on a node
+that exists. The handler evalformake() is called to find, verify
+permissions, and return information on a node that is to become a parent.
+Additionally, evalformake() returns a pointer to the start of the name of
+the new node to be created.
+
+Pathname evaluation is specific to a filesystem.
+Each filesystem is required to provide both a patheval() and an evalformake()
+routine. Both of these routines gets a name to evaluate and a node indicating
+where to start the evaluation.
+
+@section Crossing a Mount Point During Path Evaluation
+
+If the filesystem supports the mount command, the evaluate routines
+must handle crossing the mountpoint. The evaluate routine should evaluate
+the name upto the first directory node where the new filesystem is mounted.
+The filesystem may process terminator characters prior to calling the
+evaluate routine for the new filesystem. A pointer to the portion of the
+name which has not been evaluated along with the root node of the new
+file system ( gotten from the mount table entry ) is passed to the correct
+mounted filesystem evaluate routine.
+
+
+@section The rtems_filesystem_location_info_t Structure
+
+The @code{rtems_filesystem_location_info_t} structure contains all information
+necessary for identification of a node.
+
+The generic rtems filesystem code defines two global
+rtems_filesystem_location_info_t structures, the
+@code{rtems_filesystem_root} and the @code{rtems_filesystem_current}.
+Both are initially defined to be the root node of the base filesystem.
+Once the chdir command is correctly used the @code{rtems_filesystem_current}
+is set to the location specified by the command.
+
+The filesystem generic code peeks at the first character in the name to be
+evaluated. If this character is a valid seperator, the
+@code{rtems_filesystem_root} is used as the node to start the evaluation
+with. Otherwise, the @code{rtems_filesystem_current} node is used as the
+node to start evaluating with. Therefore, a valid
+rtems_filesystem_location_info_t is given to the evaluate routine to start
+evaluation with. The evaluate routines are then responsible for making
+any changes necessary to this structure to correspond to the name being
+parsed.
+
+@example
+struct rtems_filesystem_location_info_tt @{
+ void *node_access;
+ rtems_filesystem_file_handlers_r *handlers;
+ rtems_filesystem_operations_table *ops;
+ rtems_filesystem_mount_table_entry_t *mt_entry;
+@};
+@end example
+
+@table @b
+
+@item node_access
+This element is filesystem specific. A filesystem can define and store
+any information necessary to identify a node at this location. This element
+is normally filled in by the filesystem's evaluate routine. For the
+filesystem's root node, the filesystem's initilization routine should
+fill this in, and it should remain valid until the instance of the
+filesystem is unmounted.
+
+@item handlers
+This element is defined as a set of routines that may change within a
+given filesystem based upon node type. For example a directory and a
+memory file may have to completely different read routines. This element
+is set to an initialization state defined by the mount table, and may
+be set to the desired state by the evaluation routines.
+
+@item ops
+This element is defined as a set of routines that remain static for the
+filesystem. This element identifies entry points into the filesystem
+to the generic code.
+
+@item mt_entry
+This element identifies the mount table entry for this instance of the
+filesystem.
+
+@end table
+
+
+
+
+
+
+
+
diff --git a/doc/filesystem/preface.texi b/doc/filesystem/preface.texi
new file mode 100644
index 0000000000..726a5b13fc
--- /dev/null
+++ b/doc/filesystem/preface.texi
@@ -0,0 +1,83 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Preface, , Top, Top
+@end ifinfo
+@unnumbered Preface
+
+This document describes the implementation of the RTEMS filesystem
+infrastructure. This infrastructure supports the following
+capabilities:
+
+@itemize @bullet
+
+@item Mountable file systems
+
+@item Hierarchical file system directory structure
+
+@item POSIX compliant set of routines for the manipulation of files and directories
+
+@item Individual file and directory support for the following:
+
+@enumerate
+
+@item Permissions for read, write and execute
+
+@item User ID
+
+@item Group ID
+
+@item Access time
+
+@item Modification time
+
+@item Creation time
+
+@end enumerate
+
+@item Hard links to files and directories
+
+@item Symbolic links to files and directories
+
+@end itemize
+
+This has been implemented to provide the framework for a UNIX-like
+file system support. POSIX file and directory functions have been
+implemented that allow a standard method of accessing file, device and
+directory information within file systems. The file system concept that
+has been implemented allows for expansion and adaptation of the file
+system to a variety of existing and future data storage devices. To this
+end, file system mount and unmount capabilities have been included in this
+RTEMS framework.
+
+This framework slightly alters the manner in which devices are handled
+under RTEMS from that of public release 4.0.0 and earlier. Devices that
+are defined under a given RTEMS configuration will now be registered as
+files in a mounted file system. Access to these device drivers and their
+associated devices may now be performed through the traditional file system
+open(), read(), write(), lseek(), fstat() and ioctl() functions in addition
+to the interface provided by the IO Manager in the RTEMS Classic API.
+
+An In-Memory File System (IMFS) is included which provides full POSIX
+filesystem functionality yet is RAM based. The IMFS maintains a
+node structure for each file, device, and directory in each mounted
+instantiation of its file system. The node structure is used to
+manage ownership, access rights, access time, modification time,
+and creation time. A union of structures within the IMFS nodal
+structure provide for manipulation of file data, device selection,
+or directory content as required by the nodal type. Manipulation of
+these properties is accomplished through the POSIX set of file and
+directory functions. In addition to being useful in its own right,
+the IMFS serves as a full featured example filesystem.
+
+The intended audience for this document is those persons implementing
+their own filesystem. Users of the filesystem may find information
+on the implementation useful. But the user interface to the filesystem
+is through the ISO/ANSI C Library and POSIX 1003.1b file and directory
+APIs.
diff --git a/doc/filesystem/syscalls.t b/doc/filesystem/syscalls.t
new file mode 100644
index 0000000000..9dcabc777c
--- /dev/null
+++ b/doc/filesystem/syscalls.t
@@ -0,0 +1,1130 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter System Call Development Notes
+
+This set of routines represents the application's interface to files and directories
+under the RTEMS filesystem. All routines are compliant with POSIX standards if a
+specific interface has been established. The list below represents the routines that have
+been included as part of the application's interface.
+
+@enumerate
+@item access()
+@item chdir()
+@item chmod()
+@item chown()
+@item close()
+@item closedir()
+@item dup()
+@item dup2()
+@item fchmod()
+@item fcntl()
+@item fdatasync()
+@item fpathconf()
+@item fstat()
+@item ioctl()
+@item link()
+@item lseek()
+@item mkdir()
+@item mkfifo()
+@item mknod()
+@item mount()
+@item open()
+@item opendir()
+@item pathconf()
+@item read()
+@item readdir()
+@item unmount()
+@end enumerate
+
+The sections that follow provide developmental information concerning each
+of these functions.
+
+
+@c @page
+@section access
+
+@subheading File:
+
+access.c
+
+@subheading Processing:
+
+This routine is layered on the stat() function. It acquires the current
+status information for the specified file and then determines if the
+caller has the ability to access the file for read, write or execute
+according to the mode argument to this function.
+
+@subheading Development Comments:
+
+This routine is layered on top of the stat() function. As long as the
+st_mode element in the returned structure follow the standard UNIX
+conventions, this function should support other filesystems without
+alteration.
+
+@c @page
+@section chdir
+
+@subheading File:
+
+chdir.c
+
+
+@subheading Processing:
+
+This routine will determine if the pathname that we are attempting to make
+that current directory exists and is in fact a directory. If these
+conditions are met the global indication of the current directory
+(rtems_filesystem_current) is set to the rtems_filesystem_location_info_t
+structure that is returned by the rtems_filesystem_evaluate_path()
+routine.
+
+@subheading Development Comments:
+
+This routine is layered on the rtems_filesystem_evaluate_path() routine
+and the filesystem specific OP table function node_type().
+
+The routine node_type() must be a routine provided for each filesystem
+since it must access the filesystems node information to determine which
+of the following types the node is:
+
+@itemize @bullet
+@item RTEMS_FILESYSTEM_DIRECTORY
+@item RTEMS_FILESYSTEM_DEVICE
+@item RTEMS_FILESYSTEM_HARD_LINK
+@item RTEMS_FILESYSTEM_MEMORY_FILE
+@end itemize
+
+This acknowledges that the form of the node management information can
+vary from one filesystem implementation to another.
+
+RTEMS has a special global structure that maintains the current directory
+location. This global variable is of type rtems_filesystem_location_info_t
+and is called rtems_filesystem_current. This structure is not always
+valid. In order to determine if the structure is valid, you must first
+test the node_access element of this structure. If the pointer is NULL,
+then the structure does not contain a valid indication of what the current
+directory is.
+
+@c @page
+@section chmod
+
+@subheading File:
+
+chmod.c
+
+@subheading Processing:
+
+This routine is layered on the open(), fchmod() and close() functions. As
+long as the standard interpretation of the mode_t value is maintained,
+this routine should not need modification to support other filesystems.
+
+@subheading Development Comments:
+
+The routine first determines if the selected file can be open with
+read/write access. This is required to allow modification of the mode
+associated with the selected path.
+
+The fchmod() function is used to actually change the mode of the path
+using the integer file descriptor returned by the open() function.
+
+After mode modification, the open file descriptor is closed.
+
+@c @page
+@section chown
+
+@subheading File:
+
+chown.c
+
+@subheading Processing:
+
+This routine is layered on the rtems_filesystem_evaluate_path() and the
+file system specific chown() routine that is specified in the OPS table
+for the file system.
+
+@subheading Development Comments:
+
+rtems_filesystem_evaluate_path() is used to determine if the path
+specified actually exists. If it does a rtems_filesystem_location_info_t
+structure will be obtained that allows the shell function to locate the
+OPS table that is to be used for this filesystem.
+
+It is possible that the chown() function that should be in the OPS table
+is not defined. A test for a non-NULL OPS table chown() entry is performed
+before the function is called.
+
+If the chown() function is defined in the indicated OPS table, the
+function is called with the rtems_filesystem_location_info_t structure
+returned from the path evaluation routine, the desired owner, and group
+information.
+
+@c @page
+@section close
+
+@subheading File:
+
+close.c
+
+@subheading Processing:
+
+This routine will allow for the closing of both network connections and
+file system devices. If the file descriptor is associated with a network
+device, the appropriate network function handler will be selected from a
+table of previously registered network functions (rtems_libio_handlers)
+and that function will be invoked.
+
+If the file descriptor refers to an entry in the filesystem, the
+appropriate handler will be selected using information that has been
+placed in the file control block for the device (rtems_libio_t structure).
+
+@subheading Development Comments:
+
+rtems_file_descriptor_type examines some of the upper bits of the file
+descriptor index. If it finds that the upper bits are set in the file
+descriptor index, the device referenced is a network device.
+
+Network device handlers are obtained from a special registration table
+(rtems_libio_handlers) that is set up during network initialization. The
+network handler invoked and the status of the network handler will be
+returned to the calling process.
+
+If none of the upper bits are set in the file descriptor index, the file
+descriptor refers to an element of the RTEMS filesystem.
+
+The following sequence will be performed for any filesystem file
+descriptor:
+
+@enumerate
+
+@item Use the rtems_libio_iop() function to obtain the rtems_libio_t
+structure for the file descriptor
+
+@item Range check the file descriptor using rtems_libio_check_fd()
+
+@item Determine if there is actually a function in the selected handler
+table that processes the close() operation for the filesystem and node
+type selected. This is generally done to avoid execution attempts on
+functions that have not been implemented.
+
+@item If the function has been defined it is invoked with the file control
+block pointer as its argument.
+
+@item The file control block that was associated with the open file
+descriptor is marked as free using rtems_libio_free().
+
+@item The return code from the close handler is then passed back to the
+calling program.
+
+@end enumerate
+
+@c @page
+@section closedir
+
+@subheading File:
+
+closedir.c
+
+@subheading Processing:
+
+The code was obtained from the BSD group. This routine must clean up the
+memory resources that are required to track an open directory. The code is
+layered on the close() function and standard memory free() functions. It
+should not require alterations to support other filesystems.
+
+@subheading Development Comments:
+
+The routine alters the file descriptor and the index into the DIR
+structure to make it an invalid file descriptor. Apparently the memory
+that is about to be freed may still be referenced before it is
+reallocated.
+
+The dd_buf structure's memory is reallocated before the control structure
+that contains the pointer to the dd_buf region.
+
+DIR control memory is reallocated.
+
+The close() function is used to free the file descriptor index.
+
+
+@c @page
+@section dup() Unimplemented
+
+@subheading File:
+
+dup.c
+
+@subheading Processing:
+
+
+@subheading Development Comments:
+
+
+
+
+
+@c @page
+@section dup2() Unimplemented
+
+@subheading File:
+
+dup2.c
+
+@subheading Processing:
+
+
+@subheading Development Comments:
+
+
+
+
+
+
+@c @page
+@section fchmod
+
+@subheading File:
+
+fchmod.c
+
+@subheading Processing:
+
+This routine will alter the permissions of a node in a filesystem. It is
+layered on the following functions and macros:
+
+@itemize @bullet
+@item rtems_file_descriptor_type()
+
+@item rtems_libio_iop()
+
+@item rtems_libio_check_fd()
+
+@item rtems_libio_check_permissions()
+
+@item fchmod() function that is referenced by the handler table in the
+file control block associated with this file descriptor
+
+@end itemize
+
+@subheading Development Comments:
+
+The routine will test to see if the file descriptor index is associated
+with a network connection. If it is, an error is returned from this
+routine.
+
+The file descriptor index is used to obtain the associated file control
+block.
+
+The file descriptor value is range checked.
+
+The file control block is examined to determine if it has write
+permissions to allow us to alter the mode of the file.
+
+A test is made to determine if the handler table that is referenced in the
+file control block contains an entry for the fchmod() handler function. If
+it does not, an error is returned to the calling routine.
+
+If the fchmod() handler function exists, it is called with the file
+control block and the desired mode as parameters.
+
+@c @page
+@section fcntl()
+
+@subheading File:
+
+fcntl.c
+
+@subheading Processing:
+
+This routine currently only interacts with the file control block. If the
+structure of the file control block and the associated meanings do not
+change, the partial implementation of fcntl() should remain unaltered for
+other filesystem implementations.
+
+@subheading Development Comments:
+
+The only commands that have been implemented are the F_GETFD and F_SETFD.
+The commands manipulate the LIBIO_FLAGS_CLOSE_ON_EXEC bit in the
+@code{flags} element of the file control block associated with the file
+descriptor index.
+
+The current implementation of the function performs the sequence of
+operations below:
+
+@enumerate
+
+@item Test to see if we are trying to operate on a file descriptor
+associated with a network connection
+
+@item Obtain the file control block that is associated with the file
+descriptor index
+
+@item Perform a range check on the file descriptor index.
+
+@end enumerate
+
+
+
+@c @page
+@section fdatasync
+
+@subheading File:
+
+fdatasync.c
+
+@subheading Processing:
+
+This routine is a template in the in memory filesystem that will route us to the
+appropriate handler function to carry out the fdatasync() processing. In the in
+memory filesystem this function is not necessary. Its function in a disk based file
+system that employs a memory cache is to flush all memory based data buffers to
+disk. It is layered on the following functions and macros:
+
+@itemize @bullet
+
+@item rtems_file_descriptor_type()
+
+@item rtems_libio_iop()
+
+@item rtems_libio_check_fd()
+
+@item rtems_libio_check_permissions()
+
+@item fdatasync() function that is referenced by the handler table in the
+file control block associated with this file descriptor
+
+@end itemize
+
+@subheading Development Comments:
+
+The routine will test to see if the file descriptor index is associated
+with a network connection. If it is, an error is returned from this
+routine.
+
+The file descriptor index is used to obtain the associated file control
+block.
+
+The file descriptor value is range checked.
+
+The file control block is examined to determine if it has write
+permissions to the file.
+
+A test is made to determine if the handler table that is referenced in the
+file control block contains an entry for the fdatasync() handler function.
+If it does not an error is returned to the calling routine.
+
+If the fdatasync() handler function exists, it is called with the file
+control block as its parameter.
+
+@c @page
+@section fpathconf
+
+@subheading File:
+
+fpathconf.c
+
+@subheading Processing:
+
+This routine is layered on the following functions and macros:
+
+@itemize @bullet
+
+@item rtems_file_descriptor_type()
+
+@item rtems_libio_iop()
+
+@item rtems_libio_check_fd()
+
+@item rtems_libio_check_permissions()
+
+@end itemize
+
+When a filesystem is mounted, a set of constants is specified for the
+filesystem. These constants are stored with the mount table entry for the
+filesystem. These constants appear in the POSIX standard and are listed
+below.
+
+@itemize @bullet
+
+@item PCLINKMAX
+
+@item PCMAXCANON
+
+@item PCMAXINPUT
+
+@item PCNAMEMAX
+
+@item PCPATHMAX
+
+@item PCPIPEBUF
+
+@item PCCHOWNRESTRICTED
+
+@item PCNOTRUNC
+
+@item PCVDISABLE
+
+@item PCASYNCIO
+
+@item PCPRIOIO
+
+@item PCSYNCIO
+
+
+@end itemize
+
+This routine will find the mount table information associated the file
+control block for the specified file descriptor parameter. The mount table
+entry structure contains a set of filesystem specific constants that can
+be accessed by individual identifiers.
+
+@subheading Development Comments:
+
+The routine will test to see if the file descriptor index is associated
+with a network connection. If it is, an error is returned from this
+routine.
+
+The file descriptor index is used to obtain the associated file control
+block.
+
+The file descriptor value is range checked.
+
+The file control block is examined to determine if it has read permissions
+to the file.
+
+Pathinfo in the file control block is used to locate the mount table entry
+for the filesystem associated with the file descriptor.
+
+The mount table entry contains the pathconf_limits_and_options element.
+This element is a table of constants that is associated with the
+filesystem.
+
+The name argument is used to reference the desired constant from the
+pathconf_limits_and_options table.
+
+
+@c @page
+@section fstat
+
+@subheading File:
+
+fstat.c
+
+@subheading Processing:
+
+This routine will return information concerning a file or network
+connection. If the file descriptor is associated with a network
+connection, the current implementation of @code{fstat()} will return a
+mode set to @code{S_IFSOCK}. In a later version, this routine will map the
+status of a network connection to an external handler routine.
+
+If the file descriptor is associated with a node under a filesystem, the
+fstat() routine will map to the fstat() function taken from the node
+handler table.
+
+@subheading Development Comments:
+
+This routine validates that the struct stat pointer is not NULL so that
+the return location is valid.
+
+The struct stat is then initialized to all zeros.
+
+rtems_file_descriptor_type() is then used to determine if the file
+descriptor is associated with a network connection. If it is, network
+status processing is performed. In the current implementation, the file
+descriptor type processing needs to be improved. It currently just drops
+into the normal processing for file system nodes.
+
+If the file descriptor is associated with a node under a filesystem, the
+following steps are performed:
+
+@enumerate
+
+@item Obtain the file control block that is associated with the file descriptor
+index.
+
+@item Range check the file descriptor index.
+
+@item Test to see if there is a non-NULL function pointer in the handler
+table for the fstat() function. If there is, invoke the function with the
+file control block and the pointer to the stat structure.
+
+@end enumerate
+
+@c @page
+@section ioctl
+
+@subheading File:
+
+ioctl.c
+
+@subheading Processing:
+
+Not defined in the POSIX 1003.1b standard but commonly supported in most
+UNIX and POSIX system. Ioctl() is a catchall for I/O operations. Routine
+is layered on external network handlers and filesystem specific handlers.
+The development of new filesystems should not alter the basic processing
+performed by this routine.
+
+@subheading Development Comments:
+
+
+The file descriptor is examined to determine if it is associated with a
+network device. If it is processing is mapped to an external network
+handler. The value returned by this handler is then returned to the
+calling program.
+
+File descriptors that are associated with a filesystem undergo the
+following processing:
+
+@enumerate
+
+@item The file descriptor index is used to obtain the associated file
+control block.
+
+@item The file descriptor value is range checked.
+
+@item A test is made to determine if the handler table that is referenced
+in the file control block contains an entry for the ioctl() handler
+function. If it does not, an error is returned to the calling routine.
+
+@item If the ioctl() handler function exists, it is called with the file
+control block, the command and buffer as its parameters.
+
+@item The return code from this function is then sent to the calling
+routine.
+
+@end enumerate
+
+
+@c @page
+@section link
+
+@subheading File:
+
+link.c
+
+@subheading Processing:
+
+This routine will establish a hard link to a file, directory or a device.
+The target of the hard link must be in the same filesystem as the new link
+being created. A link to an existing link is also permitted but the
+existing link is evaluated before the new link is made. This implies that
+links to links are reduced to links to files, directories or devices
+before they are made.
+
+@subheading Development Comments:
+
+Calling parameters:
+const char *existing
+ const char *new
+
+link() will determine if the target of the link actually exists using
+rtems_filesystem_evaluate_path()
+
+rtems_filesystem_get_start_loc() is used to determine where to start the
+path evaluation of the new name. This macro examines the first characters
+of the name to see if the name of the new link starts with a
+rtems_filesystem_is_separator. If it does the search starts from the root
+of the RTEMS filesystem; otherwise the search will start from the current
+directory.
+
+The OPS table evalformake() function for the parent's filesystem is used
+to locate the node that will be the parent of the new link. It will also
+locate the start of the new path's name. This name will be used to define
+a child under the parent directory.
+
+If the parent is found, the routine will determine if the hard link that
+we are trying to create will cross a filesystem boundary. This is not
+permitted for hard-links.
+
+If the hard-link does not cross a filesystem boundary, a check is
+performed to determine if the OPS table contains an entry for the link()
+function.
+
+If a link() function is defined, the OPS table link() function will be
+called to establish the actual link within the filesystem.
+
+The return code from the OPS table link() function is returned to the
+calling program.
+
+@c @page
+@section lseek
+
+@subheading File:
+
+lseek.c
+
+@subheading Processing:
+
+This routine is layered on both external handlers and filesystem / node
+type specific handlers. This routine should allow for the support of new
+filesystems without modification.
+
+@subheading Development Comments:
+
+This routine will determine if the file descriptor is associated with a
+network device. If it is lseek will map to an external network handler.
+The handler will be called with the file descriptor, offset and whence as
+its calling parameters. The return code from the external handler will be
+returned to the calling routine.
+
+If the file descriptor is not associated with a network connection, it is
+associated with a node in a filesystem. The following steps will be
+performed for filesystem nodes:
+
+@enumerate
+
+@item The file descriptor is used to obtain the file control block for the
+node.
+
+@item The file descriptor is range checked.
+
+@item The offset element of the file control block is altered as indicated
+by the offset and whence calling parameters
+
+@item The handler table in the file control block is examined to determine
+if it contains an entry for the lseek() function. If it does not an error
+is returned to the calling program.
+
+@item The lseek() function from the designated handler table is called
+with the file control block, offset and whence as calling arguments
+
+@item The return code from the lseek() handler function is returned to the
+calling program
+
+@end enumerate
+
+
+@c @page
+@section mkdir
+
+@subheading File:
+
+mkdir.c
+
+@subheading Processing:
+
+This routine attempts to create a directory node under the filesystem. The
+routine is layered the mknod() function.
+
+@subheading Development Comments:
+
+See mknod() for developmental comments.
+
+@c @page
+@section mkfifo
+
+@subheading File:
+
+mkfifo.c
+
+@subheading Processing:
+
+This routine attempts to create a FIFO node under the filesystem. The
+routine is layered the mknod() function.
+
+@subheading Development Comments:
+
+See mknod() for developmental comments
+
+@c @page
+@section mknod
+
+@subheading File:
+
+mknod.c
+
+@subheading Processing:
+
+This function will allow for the creation of the following types of nodes
+under the filesystem:
+
+@itemize @bullet
+
+@item directories
+
+@item regular files
+
+@item character devices
+
+@item block devices
+
+@item fifos
+
+@end itemize
+
+At the present time, an attempt to create a FIFO will result in an ENOTSUP
+error to the calling function. This routine is layered the filesystem
+specific routines evalformake and mknod. The introduction of a new
+filesystem must include its own evalformake and mknod function to support
+the generic mknod() function. Under this condition the generic mknod()
+function should accommodate other filesystem types without alteration.
+
+@subheading Development Comments:
+
+Test for nodal types - I thought that this test should look like the
+following code:
+
+@example
+if ( (mode & S_IFDIR) = = S_IFDIR) ||
+ (mode & S_IFREG) = = S_IFREG) ||
+ (mode & S_IFCHR) = = S_IFCHR) ||
+ (mode & S_IFBLK) = = S_IFBLK) ||
+ (mode & S_IFIFO) = = S_IFIFO))
+ Set_errno_and_return_minus_one (EINVAL);
+
+@end example
+
+Where:
+
+@itemize @bullet
+@item S_IFREG (0100000) - Creation of a regular file
+@item S_IFCHR (0020000) - Creation of a character device
+@item S_IFBLK (0060000) - Creation of a block device
+@item S_IFIFO (0010000) - Creation of a FIFO
+@end itemize
+
+Determine if the pathname that we are trying to create starts at the root
+directory or is relative to the current directory using the
+rtems_filesystem_get_start_loc() function.
+
+Determine if the pathname leads to a valid directory that can be accessed
+for the creation of a node.
+
+If the pathname is a valid location to create a node, verify that a
+filesystem specific mknod() function exists.
+
+If the mknod() function exists, call the filesystem specific mknod()
+function. Pass the name, mode, device type and the location information
+associated with the directory under which the node will be created.
+
+@c @page
+@section mount
+
+@subheading File:
+
+mount.c
+
+
+Arguments (Not a standard POSIX call):
+
+rtems_filesystem_mount_table_entry_t **mt_entry,
+
+If the mount operation is successful, this pointer to a pointer will be
+set to reference the mount table chain entry that has been allocated for
+this file system mount.
+
+rtems_filesystem_operations_table *fs_ops,
+
+This is a pointer to a table of functions that are associated with the
+file system that we are about to mount. This is the mechanism to selected
+file system type without keeping a dynamic database of all possible file
+system types that are valid for the mount operation. Using this method, it
+is only necessary to configure the filesystems that we wish to use into
+the RTEMS build. Unused filesystems types will not be drawn into the
+build.
+
+char *fsoptions,
+
+This argument points to a string that selects mounting for read only
+access or read/write access. Valid states are "RO" and "RW"
+
+char *device,
+
+This argument is reserved for the name of a device that will be used to
+access the filesystem information. Current filesystem implementations are
+memory based and do not require a device to access filesystem information.
+
+char *mount_point
+
+This is a pathname to a directory in a currently mounted filesystem that
+allows read, write and execute permissions. If successful, the node found
+by evaluating this name, is stored in the mt_entry.
+
+@subheading Processing:
+
+This routine will handle the mounting of a filesystem on a mount point. If
+the operation is successful, a pointer to the mount table chain entry
+associated with the mounted filesystem will be returned to the calling
+function. The specifics about the processing required at the mount point
+and within the filesystem being mounted is isolated in the filesystem
+specific mount() and fsmount_me() functions. This allows the generic
+mount() function to remain unaltered even if new filesystem types are
+introduced.
+
+
+
+@subheading Development Comments:
+
+This routine will use get_file_system_options() to determine if the mount
+options are valid ("RO" or "RW").
+
+It confirms that a filesystem ops-table has been selected.
+
+Space is allocated for a mount table entry and selective elements of the
+temporary mount table entry are initialized.
+
+If a mount point is specified: The mount point is examined to determine
+that it is a directory and also has the appropriate permissions to allow a
+filesystem to be mounted.
+
+The current mount table chain is searched to determine that there is not
+another filesystem mounted at the mount point we are trying to mount onto.
+
+If a mount function is defined in the ops table for the filesystem
+containing the mount point, it is called at this time.
+
+If no mount point is specified: Processing if performed to set up the
+mount table chain entry as the base filesystem.
+
+If the fsmount_me() function is specified for ops-table of the filesystem
+being mounted, that function is called to initialize for the new
+filesystem.
+
+On successful completion, the temporary mount table entry will be placed
+on the mount table chain to record the presence of the mounted filesystem.
+
+@c @page
+@section open
+
+@subheading File:
+
+open.c
+
+@subheading Processing:
+
+This routine is layered on both RTEMS calls and filesystem specific
+implementations of the open() function. These functional interfaces should
+not change for new filesystems and therefore this code should be stable as
+new file systems are introduced.
+
+@subheading Development Comments:
+
+This routine will allocate a file control block for the file or device
+that we are about to open.
+
+It will then test to see if the pathname exists. If it does a
+rtems_filesystem_location_info_t data structure will be filled out. This
+structure contains information that associates node information,
+filesystem specific functions and mount table chain information with the
+pathname.
+
+If the create option has been it will attempt to create a node for a
+regular file along the specified path. If a file already exists along this
+path, an error will be generated; otherwise, a node will be allocated for
+the file under the filesystem that contains the pathname. When a new node
+is created, it is also evaluated so that an appropriate
+rtems_filesystem_location_info_t data structure can be filled out for the
+newly created node.
+
+If the file exists or the new file was created successfully, the file
+control block structure will be initialized with handler table
+information, node information and the rtems_filesystem_location_info_t
+data structure that describes the node and filesystem data in detail.
+
+If an open() function exists in the filesystem specific handlers table for
+the node that we are trying to open, it will be called at this time.
+
+If any error is detected in the process, cleanup is performed. It consists
+of freeing the file control block structure that was allocated at the
+beginning of the generic open() routine.
+
+On a successful open(), the index into the file descriptor table will be
+calculated and returned to the calling routine.
+
+@c @page
+@section opendir
+
+@subheading File:
+
+opendir.c
+
+@subheading Processing:
+
+This routine will attempt to open a directory for read access. It will
+setup a DIR control structure that will be used to access directory
+information. This routine is layered on the generic open() routine and
+filesystem specific directory processing routines.
+
+@subheading Development Comments:
+
+The BSD group provided this routine.
+
+@c @page
+@section pathconf
+
+@subheading File:
+
+pathconf.c
+
+@subheading Processing:
+
+This routine will obtain the value of one of the path configuration
+parameters and return it to the calling routine. It is layered on the
+generic open() and fpathconf() functions. These interfaces should not
+change with the addition of new filesystem types.
+
+@subheading Development Comments:
+
+This routine will try to open the file indicated by path.
+
+If successful, the file descriptor will be used to access the pathconf
+value specified by @code{name} using the fpathconf() function.
+
+The file that was accessed is then closed.
+
+@c @page
+@section read
+
+@subheading File:
+
+deviceio.c
+
+@subheading Processing:
+
+This routine is layered on a set of RTEMS calls and filesystem specific
+read operations. The functions are layered in such a way as to isolate
+them from change as new filesystems are introduced.
+
+@subheading Development Comments:
+
+This routine will examine the type of file descriptor it is sent.
+
+If the file descriptor is associated with a network device, the read
+function will be mapped to a special network handler. The return code from
+the network handler will then be sent as the return code from generic
+read() function.
+
+For file descriptors that are associated with the filesystem the following
+sequence will be performed:
+
+@enumerate
+
+@item Obtain the file control block associated with the file descriptor
+
+@item Range check the file descriptor
+
+@item Determine that the buffer pointer is not invalid
+
+@item Check that the count is not zero
+
+@item Check the file control block to see if we have permissions to read
+
+@item If there is a read function in the handler table, invoke the handler
+table read() function
+
+@item Use the return code from the handler table read function(number of
+bytes read) to increment the offset element of the file control block
+
+@item Return the number of bytes read to the calling program
+
+@end enumerate
+
+@c @page
+@section readdir
+
+@subheading File:
+
+readdir.c
+
+@subheading Processing:
+
+This routine was acquired from the BSD group. It has not been altered from
+its original form.
+
+@subheading Development Comments:
+
+The routine calls a customized getdents() function that is provided by the
+user. This routine provides the filesystem specific aspects of reading a
+directory.
+
+It is layered on the read() function in the directory handler table. This
+function has been mapped to the Imfs_dir_read() function.
+
+@c @page
+@section unmount
+
+@subheading File:
+
+unmount.c
+
+@subheading Processing:
+
+This routine will attempt to dismount a mounted filesystem and then free
+all resources that were allocated for the management of that filesystem.
+
+@subheading Development Comments:
+
+@itemize @bullet
+
+@item This routine will determine if there are any filesystems currently
+mounted under the filesystem that we are trying to dismount. This would
+prevent the dismount of the filesystem.
+
+@item It will test to see if the current directory is in the filesystem
+that we are attempting to dismount. This would prevent the dismount of the
+filesystem.
+
+@item It will scan all the currently open file descriptors to determine is
+there is an open file descriptor to a file in the filesystem that we are
+attempting to unmount().
+
+@end itemize
+
+If the above preconditions are met then the following sequence is
+performed:
+
+@enumerate
+
+@item Call the filesystem specific unmount() function for the filesystem
+that contains the mount point. This routine should indicate that the mount
+point no longer has a filesystem mounted below it.
+
+@item Call the filesystem specific fsunmount_me() function for the mounted
+filesystem that we are trying to unmount(). This routine should clean up
+any resources that are no longer needed for the management of the file
+system being un-mounted.
+
+@item Extract the mount table entry for the filesystem that was just
+dismounted from the mount table chain.
+
+@item Free the memory associated with the extracted mount table entry.
+
+@end enumerate
+
+@c @page
+@section eval
+
+@subheading File:
+
+XXX
+
+@subheading Processing:
+
+XXX
+
+@subheading Development Comments:
+
+XXX
+
+@c @page
+@section getdentsc
+
+@subheading File:
+
+XXX
+
+@subheading Processing:
+
+XXX
+
+@subheading Development Comments:
+
+XXX
+
diff --git a/doc/filesystem/tftp.t b/doc/filesystem/tftp.t
new file mode 100644
index 0000000000..965e3e8edc
--- /dev/null
+++ b/doc/filesystem/tftp.t
@@ -0,0 +1,14 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Trivial FTP Client Filesystem
+
+This chapter describes the Trivial FTP (TFTP) Client Filesystem.
+
+This chapter should be written after the IMFS chapter is completed
+and describe the implementation of the TFTP.
diff --git a/doc/gnu_docs/.cvsignore b/doc/gnu_docs/.cvsignore
new file mode 100644
index 0000000000..282522db03
--- /dev/null
+++ b/doc/gnu_docs/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/doc/gnu_docs/ChangeLog b/doc/gnu_docs/ChangeLog
new file mode 100644
index 0000000000..00202c15a7
--- /dev/null
+++ b/doc/gnu_docs/ChangeLog
@@ -0,0 +1,24 @@
+2003-12-12 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-12-11 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-09-19 Joel Sherrill <joel@OARcorp.com>
+
+ * gnu_footer.html, gnu_header.html, index.html, refcard.html,
+ rtems_tools_index.html: Merge from branch.
+
+2002-03-27 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Remove AUTOMAKE_OPTIONS.
+
+2002-01-18 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Require automake-1.5.
+
+2000-08-10 Joel Sherrill <joel@OARcorp.com>
+
+ * ChangeLog: New file.
diff --git a/doc/gnu_docs/Makefile.am b/doc/gnu_docs/Makefile.am
new file mode 100644
index 0000000000..ea8a0584bc
--- /dev/null
+++ b/doc/gnu_docs/Makefile.am
@@ -0,0 +1,5 @@
+## $Id$
+
+EXTRA_DIST = gnu_footer.html mk_install_dir Tool_Doc_Instructions \
+ gnu_header.html refcard.html gen_docs index.html rtems_tools_index.html \
+ gen_docs
diff --git a/doc/gnu_docs/Tool_Doc_Instructions b/doc/gnu_docs/Tool_Doc_Instructions
new file mode 100644
index 0000000000..7c2890982b
--- /dev/null
+++ b/doc/gnu_docs/Tool_Doc_Instructions
@@ -0,0 +1,42 @@
+#
+# $Id$
+#
+
+Apparently, the tool documentation is tough to build without configuring
+in the tool source directory. So you need to do some magic to make
+this happen. In addition, the makefiles included with the tools
+only support building dvi and info. So this directory is
+trying to help finish out building the tool documentation.
+
+# Odd Notes:
+#
+# binutils/ld: May have to copy bfdsumm.texi from config/bfd to ld
+# gcc: no rule to build java.dvi
+
+# for binutils, gcc, and gdb
+mkdir doc_build
+cp -r binutils-XXX gcc-XXX gdb-XXX newlib-XXX doc_build
+cd TOOL-XXX
+./configure --target=i386-rtems --prefix=/usr3/tmp/DOCTMP
+make info dvi
+
+# for newlib we have to do the build differently. It actually needs
+# to be configured and built for an RTEMS target so pick something
+# you have tools installed for. Hopefully, this will be a target
+# without many multilib variants. The actual target is not relevant
+# since the documentation is always the same.
+
+mkdir b
+cd b
+../newlib-1.8.2/configure --target=i386-rtems --prefix=/usr3/tmp/DOCTMP
+make
+make info dvi
+cd ../newlib-1.8.2
+find newlib/ -name "*.t*" | cpio -pdum ../b/i386-rtems/
+find etc/ -name "*.t*" | cpio -pdum ../b
+cd ../b
+# run the script
+
+
+
+
diff --git a/doc/gnu_docs/gen_docs b/doc/gnu_docs/gen_docs
new file mode 100644
index 0000000000..65365f7581
--- /dev/null
+++ b/doc/gnu_docs/gen_docs
@@ -0,0 +1,164 @@
+#! /bin/sh
+#
+# This script is intended to be run in the build directory of a software
+# package including documentation in texinfo format. The basic operation
+# of this script is to:
+# + find all ".dvi" files from the current directory down,
+# + for each dvi file
+# + install the dvi file
+# + generate PostScript files for the dvi file
+# + install the PostScript file
+# + if there is texinfo source for this dvi file
+# install the info files
+# generate PDF from the texinfo source
+# install the PDF file
+# generate HTML from the texinfo source
+# install the HTML file
+#
+#
+
+# Ralf... where do these come from using autoconf?
+srcdir=/usr1/rtems/work/rtems-doc/
+texi2www=${srcdir}/tools/texi2www/texi2www
+gnu_docs=${srcdir}/gnu_docs
+images=${srcdir}/images
+
+install_base=/home/httpd/html/rtems/rtemsdoc-4.5.1-pre3
+install_share=/home/httpd/html/rtems/rtemsdoc-4.5.1-pre3/share/toolsdoc
+install_info=/home/httpd/html/rtems/rtemsdoc-4.5.1-pre3/info
+
+
+#if [ $? -ne 1 ] ; then
+# echo "Usage: $0 install_directory"
+# exit 1
+#fi
+
+if [ ! -d ${install} ] ; then
+ echo "${install} is not a directory"
+ exit 1
+fi
+
+#ECHO=echo
+
+STARTDIR=`pwd`
+find . -name "*.dvi" | while read file
+do
+ cd $STARTDIR
+ cd `dirname $file`
+ echo $file
+ i=`basename $file`
+####
+ b=`echo $i | cut -d'.' -f1`
+ echo $b
+
+ if [ -d ${install}/${b} ] ; then
+ echo "Cleaning install point for ${b}"
+ ${ECHO} rm -rf ${install}/html/${b}
+ fi
+
+ for dir_to_do in ${install_info} \
+ ${install_share}/ps \
+ ${install_share}/pdf ${install_share}/dvi \
+ ${install_share}/html/${b}
+ do
+ test -d ${dir_to_do} || mkdir -p ${dir_to_do}
+ done
+
+ echo "Copying DVI for ${b}"
+ echo "+ cp ${b}.dvi ${install_share}/dvi/${b}.dvi"
+ ${ECHO} cp ${b}.dvi ${install_share}/dvi/${b}.dvi
+
+ echo "Generating PS for ${b}"
+ echo "+ dvips -o ${install_share}/ps/${b}.ps ${b}.dvi"
+ ${ECHO} dvips -o ${install_share}/ps/${b}.ps ${b}.dvi
+
+ # unfortunately the .dvi names are not always the same. :(
+ case ${b} in
+ history) tsrc=hist ;;
+ readline) tsrc=rlman ;;
+ *) tsrc=${b} ;;
+ esac
+
+ case ${b} in
+ refcard)
+ cp ${gnu_docs}/refcard.html ${install_share}/${b}
+ ;;
+ *)
+ # for some reason chill installs the dvi 1 directory up.
+ test ${b} = "chill" && cd ch
+
+ if [ -r ${tsrc}.texi ] ; then
+ ext=texi
+ elif [ -r ${tsrc}.texinfo ] ; then
+ ext=texinfo
+ else
+ echo "***
+ echo "*** Cannot find a texi or texinfo file for ${b}"
+ echo "***
+ exit 1
+ fi
+
+ echo "Copying INFO for ${b}"
+ ${ECHO} cp ${b}.info* ${install_info}
+
+ case ${b} in
+ g77) bad_for_pdf="yes" ;;
+ *) bad_for_pdf="no" ;;
+ esac
+
+ case ${b} in
+ gdb) extraargs_for_pdf="-I ../../readline/doc" ;;
+ *) extraargs_for_pdf="" ;;
+ esac
+ if [ ${bad_for_pdf} = "yes" ] ; then
+ echo "*** "
+ echo "*** Skipping PDF for ${b}"
+ echo "*** "
+ else
+ echo "Generating PDF for ${b}"
+ ${ECHO} texi2pdf ${extraargs_for_pdf} ${tsrc}.${ext} && \
+ ${ECHO} cp ${tsrc}.pdf ${install_share}/pdf/${b}.pdf
+ fi
+
+ # until texi2www is modified to take a search path
+ case ${b} in
+ gdb)
+ sed -e 's/^ @/@/' <../../readline/doc/rluser.texinfo >rluser.texinfo
+ cp ../../readline/doc/inc-hist.texi .
+ ;;
+ readline)
+ cp rluser.texinfo rluser.texinfo.tmp
+ sed -e 's/^ @/@/' <../../readline/doc/rluser.texinfo >rluser.texinfo
+ rm -f rluser.texinfo.tmp
+ ;;
+ *) ;;
+ esac
+ echo "Generating HTML for ${b}"
+ ${ECHO} ${texi2www} \
+ -dirfile ../index.html \
+ -header ${gnu_docs}/gnu_header.html \
+ -footer ${gnu_docs}/gnu_footer.html \
+ -icons ../images -dir ${install_share}/html/${b} \
+ ${tsrc}.${ext}
+ ;;
+ esac
+done
+
+echo "Installing graphics"
+
+test -d ${install_share}/html/images || mkdir ${install_share}/html/images
+cd ${images}
+for f in dir-arrow.gif dvi.gif missing-arrow.gif next-arrow.gif oaronly.jpg \
+ pdf.gif pdf1.gif prev-arrow.gif ps.gif up-arrow.gif
+do
+ cp ${f} ${install_share}/html/images/${f}
+done
+echo "Installing top level HTML indices"
+cp ${gnu_docs}/index.html ${install_share}/html/index.html
+cp ${gnu_docs}/rtems_tools_index.html ${install_share}/../index.html
+
+# Now deal with the reference card
+set -x
+test -d ${install_share}/html/refcard || mkdir ${install_share}/html/refcard
+cp ${gnu_docs}/refcard.html ${install_share}/html/refcard/refcard.html
+exit 0
diff --git a/doc/gnu_docs/gnu_footer.html b/doc/gnu_docs/gnu_footer.html
new file mode 100644
index 0000000000..81b9b63194
--- /dev/null
+++ b/doc/gnu_docs/gnu_footer.html
@@ -0,0 +1 @@
+<P>Each document is copyright by its author(s). See <A HREF="http://www.gnu.org" target="Text Frame">Free Software Foundation</A> for information.
diff --git a/doc/gnu_docs/gnu_header.html b/doc/gnu_docs/gnu_header.html
new file mode 100644
index 0000000000..b026963f13
--- /dev/null
+++ b/doc/gnu_docs/gnu_header.html
@@ -0,0 +1,5 @@
+<BODY BGCOLOR="FFFFFF">
+<A HREF="http://www.rtems.com" target="Text Frame">
+ <IMG align=right BORDER=0 SRC="../images/rtems_logo.jpg" ALT="RTEMS Logo"></A>
+<H1>RTEMS GNU Tools On-Line Library</H1>
+<HR>
diff --git a/doc/gnu_docs/index.html b/doc/gnu_docs/index.html
new file mode 100644
index 0000000000..f044d867ad
--- /dev/null
+++ b/doc/gnu_docs/index.html
@@ -0,0 +1,143 @@
+<HTML>
+<HEAD><TITLE>RTEMS GNU Tools On-Line Library</TITLE></HEAD>
+<BODY BGCOLOR="FFFFFF">
+<A HREF="http://www.rtems.com" target="Text Frame">
+ <IMG align=right BORDER=0 SRC="images/rtems_logo.jpg" ALT="RTEMS Logo"> </A>
+<H1>RTEMS GNU Tools On-Line Library</H1>
+<HR>
+<BODY>
+<MENU>
+ <LI>GNU Compiler Collection (GCC) 2.95.2
+ <MENU>
+ <LI><A HREF="../pdf/gcc.pdf"><IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/gcc.ps"><IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/gcc.dvi"><IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="gcc/index.html">
+ Using and Porting the GNU Compiler Collection (GCC)</A></LI>
+ <LI><A HREF="../pdf/cpp.pdf"><IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/cpp.ps"><IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/cpp.dvi"><IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="cpp/index.html">
+ The C Preprocessor</A></LI>
+ <LI><A HREF="../pdf/chill.pdf"><IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/chill.ps"><IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/chill.dvi"><IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="chill/index.html">
+ Guide to GNU Chill</A></LI>
+ <LI><A HREF="BAD.html"><IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/g77.ps"><IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/g77.dvi"><IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="g77/index.html">
+ Using and Porting GNU Fortran</A></LI>
+ </MENU>
+ </LI>
+
+ <LI>GNU binutils 2.9.5.0.24
+ <MENU>
+ <LI><A HREF="../pdf/binutils.pdf">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/binutils.ps">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/binutils.dvi">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="binutils/index.html">
+ GNU Binary Utilities</A></LI>
+ <LI><A HREF="../pdf/as.pdf"><IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/as.ps"><IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/as.dvi"><IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="as/index.html">
+ Using the GNU Assembler</A></LI>
+ <LI><A HREF="../pdf/gasp.pdf"><IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/gasp.ps"><IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/gasp.dvi"><IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="gasp/index.html">
+ GNU Preprocessor for Assembly Programs (gasp)</A></LI>
+ <LI><A HREF="../pdf/ld.pdf"><IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/ld.ps"><IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/ld.dvi"><IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="ld/index.html">
+ Using the GNU Linker (ld)</A></LI>
+ </MENU>
+ </LI>
+
+ <LI>GNU gdb 4.18
+ <MENU>
+ <LI><A HREF="../pdf/gdb.pdf"><IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/gdb.ps"><IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/gdb.dvi"><IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="gdb/index.html">
+ Debugging with GDB</A></LI>
+ <LI><A HREF="../pdf/gdbint.pdf"><IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/gdbint.ps"><IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/gdbint.dvi"><IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="gdbint/index.html">
+ GDB Internals</A></LI>
+ <LI><A HREF="../pdf/stabs.pdf"><IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/stabs.ps"><IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/stabs.dvi"><IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="stabs/index.html">
+ STABS Debugging Format</A></LI>
+ <LI><A HREF="refcard/refcard.html"><IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/refcard.ps"><IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/refcard.dvi"><IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="refcard/refcard.html">
+ GDB Quick Reference Card</A></LI>
+ </MENU>
+ </LI>
+
+ <LI>Newlib 1.8.2
+ <MENU>
+ <LI><A HREF="../pdf/libc.pdf"><IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/libc.ps"><IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/libc.dvi"><IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="libc/index.html">
+ libc</A></LI>
+ <LI><A HREF="../pdf/libm.pdf"><IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/libm.ps"><IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/libm.dvi"><IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="libm/index.html">
+ libm</A></LI>
+ </MENU>
+ </LI>
+
+ <LI>GNU Libraries Used by Multiple Tools
+ <MENU>
+ <LI><A HREF="../pdf/history.pdf"><IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/history.ps"><IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/history.dvi"><IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="history/index.html">
+ GNU History Library</A></LI>
+ <LI><A HREF="../pdf/readline.pdf"><IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/readline.ps"><IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/readline.dvi"><IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="readline/index.html">
+ GNU Readline Library</A></LI>
+ <LI><A HREF="../pdf/mmalloc.pdf"><IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/mmalloc.ps"><IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/mmalloc.dvi"><IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="mmalloc/index.html">
+ GNU Memory-Mapped Malloc Library (mmalloc)</A></LI>
+ <LI><A HREF="../pdf/bfd.pdf"><IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/bfd.ps"><IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/bfd.dvi"><IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="bfd/index.html">
+ GNU Binary File Descriptor (libbfd)</A></LI>
+ </MENU>
+
+ </LI>
+ <LI>General GNU Project Documentation
+ <MENU>
+ <LI><A HREF="../pdf/standards.pdf">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/standards.ps">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/standards.dvi">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="standards/index.html">
+ GNU Coding Standards</A></LI>
+ </MENU>
+ </LI>
+</MENU>
+<HR>
+Copyright &copy; 1988-2004 <A HREF="http://www.oarcorp.com" target="Text Frame">OAR Corporation</A>
+</BODY></HTML>
diff --git a/doc/gnu_docs/mk_install_dir b/doc/gnu_docs/mk_install_dir
new file mode 100644
index 0000000000..52ef35287b
--- /dev/null
+++ b/doc/gnu_docs/mk_install_dir
@@ -0,0 +1,29 @@
+#! /bin/sh
+#
+# This script creates the install infrastructure for the GNU tools
+# documentation.
+#
+
+install=/usr3/rtems_cds/test_cd/doc/tools
+
+#if [ $? -ne 1 ] ; then
+# echo "Usage: $0 install_directory"
+# exit 1
+#fi
+
+rm -rf ${install}
+mkdir ${install}
+mkdir ${install}/info
+mkdir ${install}/html
+
+cp rtems_tools_index.html ${install}/../index.html
+cp index.html ${install}/html
+cp ../BAD.html ${install}/html
+cp ../tools/texi2www/*.gif ${install}/html
+cp ../common/*arrow.gif ${install}/html
+cp ../common/up-arrow.gif ${install}/html
+cp ../common/oaronly.jpg ${install}/html
+cp ../common/dvi.gif ${install}/html
+cp ../common/pdf.gif ${install}/html
+cp ../common/pdf1.gif ${install}/html
+cp ../common/ps.gif ${install}/html
diff --git a/doc/gnu_docs/refcard.html b/doc/gnu_docs/refcard.html
new file mode 100644
index 0000000000..5001ec7c88
--- /dev/null
+++ b/doc/gnu_docs/refcard.html
@@ -0,0 +1,13 @@
+<HTML>
+<HEAD><TITLE>GDB Reference Card</TITLE></HEAD>
+<BODY BGCOLOR="FFFFFF">
+<A HREF="http://www.rtems.com" target="Text Frame">
+ <IMG align=right BORDER=0 SRC="../rtems_logo.jpg" ALT="RTEMS Logo"> </A>
+<H1>RTEMS On-Line Library</H1>
+<HR>
+<BODY>
+The GDB Reference card is not written in texinfo file. There is currently
+no HTML or PDF version of this file.
+<HR>
+Copyright &copy; 1988-2004 <A HREF="http://www.oarcorp.com" target="Text Frame">OAR Corporation</A>
+</BODY></HTML>
diff --git a/doc/gnu_docs/rtems_tools_index.html b/doc/gnu_docs/rtems_tools_index.html
new file mode 100644
index 0000000000..92ddd2b1b8
--- /dev/null
+++ b/doc/gnu_docs/rtems_tools_index.html
@@ -0,0 +1,15 @@
+<HTML>
+<HEAD><TITLE>RTEMS and Tools On-Line Library</TITLE></HEAD>
+<BODY BGCOLOR="FFFFFF">
+<A HREF="http://www.rtems.com" target="Text Frame">
+ <IMG align=right BORDER=0 SRC="rtemsdoc/html/images/rtems_logo.jpg" ALT="RTEMS Logo"> </A>
+<H1>RTEMS and Tools On-Line Library</H1>
+<HR>
+<BODY>
+<MENU>
+ <LI><A HREF="rtemsdoc/html/index.html">RTEMS Documentation</A></LI>
+ <LI><A HREF="toolsdoc/html/index.html">GNU Documentation</A></LI>
+</MENU>
+<HR>
+Copyright &copy; 1988-2004 <A HREF="http://www.oarcorp.com" target="Text Frame">OAR Corporation</A>
+</BODY></HTML>
diff --git a/doc/images/dir-arrow.gif b/doc/images/dir-arrow.gif
new file mode 100644
index 0000000000..5d661527cc
--- /dev/null
+++ b/doc/images/dir-arrow.gif
Binary files differ
diff --git a/doc/images/dvi.gif b/doc/images/dvi.gif
new file mode 100644
index 0000000000..163a5d52b5
--- /dev/null
+++ b/doc/images/dvi.gif
Binary files differ
diff --git a/doc/images/missing-arrow.gif b/doc/images/missing-arrow.gif
new file mode 100644
index 0000000000..c686c80b5f
--- /dev/null
+++ b/doc/images/missing-arrow.gif
Binary files differ
diff --git a/doc/images/next-arrow.gif b/doc/images/next-arrow.gif
new file mode 100644
index 0000000000..57f5cddb81
--- /dev/null
+++ b/doc/images/next-arrow.gif
Binary files differ
diff --git a/doc/images/oaronly.jpg b/doc/images/oaronly.jpg
new file mode 100644
index 0000000000..c87c151404
--- /dev/null
+++ b/doc/images/oaronly.jpg
Binary files differ
diff --git a/doc/images/pdf.gif b/doc/images/pdf.gif
new file mode 100644
index 0000000000..c88fd777c4
--- /dev/null
+++ b/doc/images/pdf.gif
Binary files differ
diff --git a/doc/images/pdf1.gif b/doc/images/pdf1.gif
new file mode 100644
index 0000000000..784fe2ac8c
--- /dev/null
+++ b/doc/images/pdf1.gif
Binary files differ
diff --git a/doc/images/prev-arrow.gif b/doc/images/prev-arrow.gif
new file mode 100644
index 0000000000..350785be10
--- /dev/null
+++ b/doc/images/prev-arrow.gif
Binary files differ
diff --git a/doc/images/ps.gif b/doc/images/ps.gif
new file mode 100644
index 0000000000..0f565bc1db
--- /dev/null
+++ b/doc/images/ps.gif
Binary files differ
diff --git a/doc/images/rtems_logo.jpg b/doc/images/rtems_logo.jpg
new file mode 100644
index 0000000000..485b80bc8a
--- /dev/null
+++ b/doc/images/rtems_logo.jpg
Binary files differ
diff --git a/doc/images/up-arrow.gif b/doc/images/up-arrow.gif
new file mode 100644
index 0000000000..82aa8ccc68
--- /dev/null
+++ b/doc/images/up-arrow.gif
Binary files differ
diff --git a/doc/index.html.in b/doc/index.html.in
new file mode 100644
index 0000000000..6237a78c21
--- /dev/null
+++ b/doc/index.html.in
@@ -0,0 +1,281 @@
+<HTML>
+<HEAD><TITLE>RTEMS @VERSION@ On-Line Library</TITLE></HEAD>
+<BODY BGCOLOR="FFFFFF">
+<A HREF="http://www.rtems.com" target="Text Frame">
+ <IMG align=right BORDER=0 SRC="images/rtems_logo.jpg" ALT="RTEMS Logo"> </A>
+<H1>RTEMS @VERSION@ On-Line Library</H1>
+<HR>
+<BODY>
+<MENU>
+ <LI>
+ <A HREF="../pdf/FAQ.pdf">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/FAQ.ps">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/FAQ.dvi">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="FAQ/index.html">RTEMS FAQ</A>
+ </LI>
+ <LI>C/C++ Manuals</LI>
+ <MENU>
+ <LI><A HREF="../pdf/started.pdf">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/started.ps">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/started.dvi">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="started/index.html">
+ Getting Started with RTEMS</A>
+ </LI>
+
+ <LI><A HREF="../pdf/c_user.pdf">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/c_user.ps">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/c_user.dvi">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="c_user/index.html">
+ RTEMS Applications C User's Guide</A>
+ </LI>
+
+ <LI><A HREF="../pdf/posix_users.pdf">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/posix_users.ps">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/posix_users.dvi">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="posix_users/index.html">
+ RTEMS POSIX API User's Guide</A>
+ </LI>
+
+ <LI><A HREF="../pdf/itron.pdf">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/itron.ps">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/itron.dvi">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="itron/index.html">
+ RTEMS ITRON 3.0 API User's Guide</A>
+ </LI>
+
+ <LI><A HREF="../pdf/networking.pdf">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/networking.ps">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/networking.dvi">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="networking/index.html">
+ RTEMS Network Supplement</A>
+ </LI>
+ </MENU>
+ <LI>Ada Manuals</LI>
+ <MENU>
+ <LI><A HREF="../pdf/ada_user.pdf">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/ada_user.ps">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/ada_user.dvi">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="ada_user/index.html">
+ RTEMS Applications Ada User's Guide</A>
+ </LI>
+ </MENU>
+ <LI>Miscellaneous Manuals</LI>
+ <MENU>
+ <LI><A HREF="../pdf/develenv.pdf">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/develenv.ps">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/develenv.dvi">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="develenv/index.html">
+ RTEMS Development Environment Guide</A>
+ </LI>
+
+ <LI><A HREF="../pdf/rtems_gdb.pdf">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/rtems_gdb.ps">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/rtems_gdb.dvi">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="rtems_gdb/index.html">
+ RTEMS/GDB User's Guide</A>
+ </LI>
+
+ <LI><A HREF="../pdf/rgdb_specs.pdf">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/rgdb_specs.ps">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/rgdb_specs.dvi">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="rgdb_specs/index.html">
+ RTEMS Remote Debugger Server Specifications</A>
+ </LI>
+
+ <LI><A HREF="../pdf/bsp_howto.pdf">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/bsp_howto.ps">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/bsp_howto.dvi">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="bsp_howto/index.html">
+ RTEMS BSP and Device Driver Development Guide</A>
+ </LI>
+
+ <LI><A HREF="../pdf/porting.pdf">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/porting.ps">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/porting.dvi">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="porting/index.html">
+ RTEMS Porting Guide</A>
+ </LI>
+
+ <LI><A HREF="../pdf/filesystem.pdf">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/filesystem.ps">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/filesystem.dvi">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="filesystem/index.html">
+ RTEMS Filesystem Design Guide</A>
+ </LI>
+
+ <LI><A HREF="../pdf/posix1003_1.pdf">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/posix1003_1.ps">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/posix1003_1.dvi">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="posix1003_1/index.html">
+ RTEMS POSIX 1003.1 Compliance Guide</A>
+ </LI>
+ </MENU>
+
+
+<LI>CPU Supplements for Primary Ports
+
+ <MENU>
+
+ <LI><A HREF="HELP.html">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="HELP.html">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="HELP.html">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="HELP.html">
+ RTEMS Hitachi H8/300 Applications Supplement</A>
+ </LI>
+
+ <LI><A HREF="../pdf/i386.pdf">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/i386.ps">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/i386.dvi">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="supplements/i386/index.html">
+ RTEMS Intel i386 Applications Supplement</A>
+ </LI>
+
+ <LI><A HREF="../pdf/i960.pdf">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/i960.ps">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/i960.dvi">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="supplements/i960/index.html">
+ RTEMS Intel i960 Applications Supplement</A>
+ </LI>
+
+ <LI><A HREF="../pdf/m68k.pdf">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/m68k.ps">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/m68k.dvi">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="supplements/m68k/index.html">
+ RTEMS Motorola MC68xxx Applications Supplement</A>
+ </LI>
+
+ <LI><A HREF="../pdf/mips.pdf">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/mips.ps">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/mips.dvi">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="supplements/mips/index.html">
+ RTEMS MIPS Applications Supplement</A>
+ </LI>
+
+ <LI><A HREF="HELP.html">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="HELP.html">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="HELP.html">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="HELP.html">
+ RTEMS OpenCores OR32 Applications Supplement</A>
+ </LI>
+
+ <LI><A HREF="../pdf/powerpc.pdf">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/powerpc.ps">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/powerpc.dvi">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="supplements/powerpc/index.html">
+ RTEMS PowerPC Applications Supplement</A>
+ </LI>
+
+ <LI><A HREF="../pdf/sh.pdf">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/sh.ps">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/sh.dvi">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="supplements/sh/index.html">
+ RTEMS Hitachi SH Applications Supplement</A>
+ </LI>
+
+ <LI><A HREF="../pdf/sparc.pdf">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/sparc.ps">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/sparc.dvi">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="supplements/sparc/index.html">
+ RTEMS SPARC Applications Supplement</A>
+ </LI>
+
+ <LI><A HREF="HELP.html">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="HELP.html">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="HELP.html">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="HELP.html">
+ RTEMS UNIX Port Applications Supplement</A>
+ </LI>
+
+ </MENU>
+
+<LI>CPU Supplements for Secondary Ports
+
+ <MENU>
+ <LI><A HREF="../pdf/c4x.pdf">
+ <IMG SRC="images/pdf1.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../ps/c4x.ps">
+ <IMG SRC="images/ps.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="../dvi/c4x.dvi">
+ <IMG SRC="images/dvi.gif" HEIGHT=18 WIDTH=16></A>
+ <A HREF="supplements/c4x/index.html">
+ RTEMS Texas Instruments C3x/C4x Applications Supplement</A>
+ </LI>
+ </MENU>
+</LI>
+
+</MENU>
+<HR>
+Copyright &copy; 1988-2004 <A HREF="http://www.oarcorp.com" target="Text Frame">OAR Corporation</A>
+</BODY></HTML>
diff --git a/doc/itron3.0/.cvsignore b/doc/itron3.0/.cvsignore
new file mode 100644
index 0000000000..be839f9417
--- /dev/null
+++ b/doc/itron3.0/.cvsignore
@@ -0,0 +1,38 @@
+config.texi
+eventflags.texi
+fixedblock.texi
+index.html
+interrupt.texi
+itron
+itron-?
+itron-??
+itron.aux
+itron.cp
+itron.dvi
+itron.fn
+itron*.html
+itron.ky
+itron.log
+itron.pdf
+itron.pg
+itron.ps
+itron.toc
+itron.tp
+itron.vr
+mailbox.texi
+Makefile
+Makefile.in
+mdate-sh
+memorypool.texi
+msgbuffer.texi
+network.texi
+rendezvous.texi
+rtems_footer.html
+rtems_header.html
+semaphore.texi
+stamp-vti
+status.texi
+tasksync.texi
+task.texi
+time.texi
+version.texi
diff --git a/doc/itron3.0/Makefile.am b/doc/itron3.0/Makefile.am
new file mode 100644
index 0000000000..e74e61f363
--- /dev/null
+++ b/doc/itron3.0/Makefile.am
@@ -0,0 +1,103 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = itron
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/main.am
+
+GENERATED_FILES = status.texi task.texi tasksync.texi semaphore.texi \
+ eventflags.texi mailbox.texi msgbuffer.texi rendezvous.texi \
+ interrupt.texi memorypool.texi fixedblock.texi time.texi config.texi \
+ network.texi
+
+COMMON_FILES += $(top_srcdir)/common/cpright.texi
+
+FILES = preface.texi
+
+info_TEXINFOS = itron.texi
+itron_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+status.texi: status.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+task.texi: task.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+tasksync.texi: tasksync.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+semaphore.texi: semaphore.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+eventflags.texi: eventflags.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+mailbox.texi: mailbox.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+msgbuffer.texi: msgbuffer.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+rendezvous.texi: rendezvous.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+interrupt.texi: interrupt.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+memorypool.texi: memorypool.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+fixedblock.texi: fixedblock.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+time.texi: time.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+config.texi: config.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+network.texi: network.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+noinst_SCRIPTS = gen_all gen_section gen_status_shell
+
+EXTRA_DIST = config.t eventflags.t fixedblock.t interrupt.t mailbox.t \
+ memorypool.t msgbuffer.t network.t rendezvous.t semaphore.t status.t \
+ task.t tasksync.t time.t $(noinst_SCRIPTS)
+
+CLEANFILES += itron.info itron.info-?
diff --git a/doc/itron3.0/config.t b/doc/itron3.0/config.t
new file mode 100644
index 0000000000..ddfd61fcef
--- /dev/null
+++ b/doc/itron3.0/config.t
@@ -0,0 +1,187 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c This is the chapter from the RTEMS ITRON User's Guide that
+@c documents the services provided by the system
+@c manager.
+@c
+@c $Id$
+@c
+
+@chapter System Manager
+
+@section Introduction
+
+The
+system manager is ...
+
+The services provided by the system manager are:
+
+@itemize @bullet
+@item @code{get_ver} - Get Version Information
+@item @code{ref_sys} - Reference Semaphore Status
+@item @code{ref_cfg} - Reference Configuration Information
+@item @code{def_svc} - Define Extended SVC Handler
+@item @code{def_exc} - Define Exception Handler
+@end itemize
+
+@section Background
+
+@section Operations
+
+@section System Calls
+
+This section details the system manager's services.
+A subsection is dedicated to each of this manager's services
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+
+@c
+@c get_ver
+@c
+
+@page
+@subsection get_ver - Get Version Information
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER get_ver(
+ T_VER *pk_ver
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c ref_sys
+@c
+
+@page
+@subsection ref_sys - Reference Semaphore Status
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ref_sys(
+ T_RSYS *pk_rsys
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c ref_cfg
+@c
+
+@page
+@subsection ref_cfg - Reference Configuration Information
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ref_cfg(
+ T_RCFG *pk_rcfg
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c def_svc
+@c
+
+@page
+@subsection def_svc - Define Extended SVC Handler
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER def_svc(
+ FN s_fncd,
+ T_DSVC *pk_dsvc
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c def_exc
+@c
+
+@page
+@subsection def_exc - Define Exception Handler
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER def_exc(
+ UINT exckind,
+ T_DEXC *pk_dexc
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
diff --git a/doc/itron3.0/eventflags.t b/doc/itron3.0/eventflags.t
new file mode 100644
index 0000000000..1d9d134fe2
--- /dev/null
+++ b/doc/itron3.0/eventflags.t
@@ -0,0 +1,860 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c This is the chapter from the RTEMS ITRON User's Guide that
+@c documents the services provided by the eventflags
+@c manager.
+@c
+@c $Id$
+@c
+
+@chapter Eventflags Manager
+
+@section Introduction
+
+The eventflag manager provides a high performance method of intertask communication and synchronization. The directives provided by the eventflag manager are:
+
+The services provided by the eventflags manager are:
+
+@itemize @bullet
+@item @code{cre_flg} - Create Eventflag
+@item @code{del_flg} - Delete Eventflag
+@item @code{set_flg} - Set Eventflag
+@item @code{clr_flg} - Clear Eventflag
+@item @code{wai_flg} - Wait on Eventflag
+@item @code{pol_flg} - Wait for Eventflag (Polling)
+@item @code{twai_flg} - Wait on Eventflag with Timeout
+@item @code{ref_flg} - Reference Eventflag Status
+@end itemize
+
+@section Background
+
+@subsection Event sets
+
+An eventflag is used by a task (or ISR) to inform another task of the
+occurrence of a significant situation. One word bit-field is associated with each eventflags. The application developer should remember the
+following key characteristics of event operations when utilizing the event
+manager:
+
+@itemize @bullet
+@item Events provide a simple synchronization facility.
+@item Events are aimed at tasks.
+@item Tasks can wait on more than one event simultaneously.
+@item Events are independent of one another.
+@item Events do not hold or transport data.
+@item Events are not queued. In other words, if an event is sent more than once to a task before being received, the second and subsequent send operations to that same task have no effect.
+@end itemize
+
+A pending event is an event that has been set. An
+event condition is used to specify the events which the task desires to
+receive and the algorithm which will be used to determine when the request
+is satisfied. An event condition is satisfied based upon one of two
+algorithms which are selected by the user. The @code{TWF_ORW} algorithm
+states that an event condition is satisfied when at least a single
+requested event is posted. The @code{TWF_ANDW} algorithm states that an
+event condition is satisfied when every requested event is posted.
+
+An eventflags or condition is built by a bitwise OR of the desired events.
+If an event is not explicitly specified in the set or condition, then it
+is not present. Events are specifically designed to be mutually exclusive,
+therefore bitwise OR and addition operations are equivalent as long as
+each event appears exactly once in the event set list.
+
+@subsection T_CFLG Structure
+
+The T_CFLG structire is used to define the characteristics of an eventflag
+and passed as an argument to the @code{cre_flg} service. The structure is
+defined as follows:
+
+@example
+
+/*
+ * Create Eventflags (cre_flg) Structure
+ */
+
+typedef struct t_cflg @{
+ VP exinf; /* extended information */
+ ATR flgatr; /* eventflag attribute */
+ UINT iflgptn; /* initial eventflag */
+ /* additional implementation dependent information may be included */
+@} T_CFLG;
+
+/*
+ * flgatr - Eventflag Attribute Values
+ */
+
+
+/* multiple tasks are not allowed to wait (Wait Single Task)*/
+
+#define TA_WSGL 0x00
+
+/* multiple tasks are allowed to wait (Wait Multiple Task) */
+
+#define TA_WMUL 0x08
+
+/* wfmode */
+#define TWF_ANDW 0x00 /* AND wait */
+#define TWF_ORW 0x02 /* OR wait */
+#define TWF_CLR 0x01 /* clear specification */
+@end example
+
+where the meaning of each field is:
+
+@table @b
+
+@item exinf
+
+may be used freely by the user for including extended information about
+the eventflag to be created. Information set here may be accessed by
+@code{ref_flg}. If a larger region is desired for including user information, or
+if the user wishes to change the contents of this information, the usr
+should allocate memory area and set the address of this memory packet to
+@code{exinf}. The OS does not take care of the contents of @code{exinf}. This
+implementation does not use this field.
+
+@item flgatr
+
+is the attributes for this eventflag. The lower bits of flgatr represent
+system attributes, while the upper bits represent implementation-dependent
+attributes.
+
+@item iflgptn
+
+is the initial eventflag pattern.
+(CPU and/or implementation-dependent information may also be included)
+
+@end table
+
+@subsection T_RFLG Structure
+
+The T_RFLG structire is used to define the characteristics of an eventflag
+and passed as an argument to the @code{ref_flg} service. The structure is
+defined as follows:
+
+@example
+/* Reference Eventflags (ref_flg) Structure */
+typedef struct t_rflg @{
+ VP exinf; /* extended information */
+ BOOL_ID wtsk; /* indicates whether or not there is a waiting task */
+ UINT flgptn; /* eventflag bit pattern */
+ /* additional implementation dependent information may be included */
+@} T_RFLG;
+@end example
+
+@table @b
+
+@item exinf
+
+see @code{T_CFLG}.
+
+@item wtsk
+
+indicates whether or not there is a task waiting for the eventflag in
+question. If there is no waiting task, @code{wtsk} is returned as FALSE = 0.
+If there is a waiting task, @code{wtsk} is returned as a value other than 0.
+
+@item flgptn
+
+is the eventflag pattern.
+
+@end table
+
+@section Operations
+
+@section System Calls
+
+This section details the eventflags manager's services. A subsection is
+dedicated to each of this manager's services and describes the calling
+sequence, related constants, usage, and status codes.
+
+
+@c
+@c cre_flg
+@c
+
+@page
+@subsection cre_flg - Create Eventflag
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER cre_flg(
+ ID flgid,
+ T_CFLG *pk_cflg
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_NOMEM} - Insufficient memory (Memory for control block cannot be
+allocated)
+
+@code{E_ID} - Invalid ID number (flgid was invalid or could not be used)
+
+@code{E_RSATR} - Reserved attribute (flgatr was invalid or could not be
+used)
+
+@code{E_OBJ} - Invalid object state (an eventflag of the same ID already
+exists)
+
+@code{E_OACV} - Object access violation (A flgid less than -4 was
+specified from a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (pk_cflg is invalid)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the
+target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system call
+was issued from a task in dispatch disabled state or from a
+task-independent portion
+
+@code{EN_PAR}- A value outside the range supported by the target node
+and/or transmission packet format was specified as a parameter (a value
+outside supported range was specified for exinf, flgatr and/or iflgptn)
+
+@subheading DESCRIPTION:
+
+This system call creates the eventflag specified by @code{flgid}.
+Specifically, a control block for the eventflag to be created is allocated
+and the associated flag pattern is initialized using @code{iflgptn}. A
+single eventflag handles one word's worth of bits of the processor in
+question as a group. All operations are done in single word units.
+
+User eventflags have positive ID numbers, while system eventflags have
+negative ID numbers. User tasks (tasks having positive task IDs) cannot
+access system eventflags. An @code{E_OACV} error will result if a user
+task issues a system call on a system eventflag, but error detection is
+implementation dependent.
+
+Eventflags having ID numbers from -4 through 0 cannot be created. An
+@code{E_ID} error will result if a value in this range is specified for
+@code{flgid}.
+
+The system attribute part of @code{flgatr} may be specified as @code{TA_WSGL}
+(Wait Single Task) or @code{TA_WMUL} (Wait Multiple Tasks)
+
+@subheading NOTES:
+
+Multiprocessing is not supported. Thus none of the "@code{EN_}" status
+codes will be returned.
+
+All memory is preallocated for @code{RTEMS ITRON} objects. Thus, no
+dynamic memory allocation is performed by @code{cre_flg} and the
+@code{E_NOMEM} error can not be returned.
+
+@c
+@c del_flg
+@c
+
+@page
+@subsection del_flg - Delete Eventflag
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER del_flg(
+ ID flgid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (flgid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the eventflag specified by flgid
+does not exist)
+
+@code{E_OACV} - Object access violation (A flgid less than -4 was
+specified from a user task. This is implementation dependent.)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the
+target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system call
+was issued from a task in dispatch disabled state or from a
+task-independent portion
+
+@subheading DESCRIPTION:
+
+This system call deletes the eventflag specified by @code{flgid}.
+
+Issuing this system call causes memory used for the control block of the
+associated eventflag to be released. After this system call is invoked,
+another eventflag having the same ID number can be created.
+
+This system call will complete normally even if there are tasks waiting
+for the eventflag. In that case, an @code{E_DLT} error will be returned
+to each waiting task.
+
+@subheading NOTES:
+
+Multiprocessing is not supported. Thus none of the "@code{EN_}" status
+codes will be returned.
+
+When an eventflag being waited for by more than one tasks is deleted, the
+order of tasks on the ready queue after the WAIT state is cleared is
+implementation dependent in the case of tasks having the same priority.
+
+@c
+@c set_flg
+@c
+
+@page
+@subsection set_flg - Set Eventflag
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER set_flg(
+ ID flgid,
+ UINT setptn
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (flgid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the eventflag specified by flgid
+does not exist)
+
+@code{E_OACV} - Object access violation (A flgid less than -4 was
+specified from a user task. This is implementation dependent.)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the
+target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system call
+was issued from a task in dispatch disabled state or from a
+task-independent portion
+
+@code{EN_PAR} - A value outside the range supported by the target node
+and/or transmission packet format was specified as a parameter (a value
+outside supported range was specified for setptn or clrptn)
+
+@subheading DESCRIPTION:
+
+The @code{set_flg} system call sets the bits specified by @code{setptn} of the
+one word eventflag specified by @code{flgid}. In other words, a logical
+sum is taken for the values of the eventflag specified by @code{flgid} with the
+value of @code{setptn}.
+
+If the eventflag value is changed by @code{set_flg} and the new eventflag
+value satisfies the condition to release the WAIT state of the task which
+issued @code{wai_flg} on the eventflag, the WAIT state of that task will
+be released and the task will be put into RUN or READY state (or SUSPEND
+state if the task was in WAIT-SUSPEND).
+
+Nothing will happen to the target eventflag if all bits of @code{setptn}
+are specified as 0 with @code{set_flg}. No error will result in either
+case.
+
+Multiple tasks can wait for a single eventflag if that eventflags has the
+@code{TA_WMUL} attribute. This means that even eventflags can make queues
+for tasks to wait on. When such eventflags are used, a single
+@code{set_flg} call may result in the release of multiple waiting tasks.
+In this case, the order of tasks on the ready queue after the WAIT state
+is cleared is preserved for tasks having the same priority.
+
+@subheading NOTES:
+
+Multiprocessing is not supported. Thus none of the "@code{EN_}" status
+codes will be returned.
+
+@c
+@c clr_flg
+@c
+
+@page
+@subsection clr_flg - Clear Eventflag
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER clr_flg(
+ ID flgid,
+ UINT clrptn
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (flgid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the eventflag specified by flgid
+does not exist)
+
+@code{E_OACV} - Object access violation (A flgid less than -4 was
+specified from a user task. This is implementation dependent.)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the
+target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system call
+was issued from a task in dispatch disabled state or from a
+task-independent portion
+
+@code{EN_PAR} - A value outside the range supported by the target node
+and/or transmission packet format was specified as a parameter (a value
+outside supported range was specified for setptn or clrptn)
+
+@subheading DESCRIPTION:
+
+The @code{clr_flg} system call clears the bits of the one word eventflag
+based on the corresponding zero bits of @code{clrptn}. In other words, a
+logical product is taken for the values of the eventflag specified by
+@code{flgid} with the value of @code{clrptn}.
+
+Issuing @code{clr_flg} never results in wait conditions being released on
+a task waiting for the specified eventflag. In other words, dispatching
+never occurs with @code{clr_flg}.
+
+Nothing will happen to the target eventflag if all bits of @code{clrptn}
+are specified as 1 with @code{clr_flg}. No error will result.
+
+@subheading NOTES:
+
+Multiprocessing is not supported. Thus none of the "@code{EN_}" status
+codes will be returned.
+
+@c
+@c wai_flg
+@c
+
+@page
+@subsection wai_flg - Wait on Eventflag
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER wai_flg(
+ UINT *p_flgptn,
+ ID flgid,
+ UINT waiptn,
+ UINT wfmode
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (flgid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the eventflag specified by flgid
+does not exist)
+
+@code{E_OACV} - Object access violation (A flgid less than -4 was
+specified from a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (waiptn = 0, wfmode invalid, or tmout is -2
+or less)
+
+@code{E_OBJ} - Invalid object state (multiple tasks waiting for an
+eventflag with the TA_WSGL attribute)
+
+@code{E_DLT} - The object being waited for was deleted (the specified
+eventflag was deleted while waiting)
+
+@code{E_RLWAI} - WAIT state was forcibly released (rel_wai was received
+while waiting)
+
+@code{E_TMOUT} - Polling failure or timeout exceeded
+
+@code{E_CTX} - Context error (issued from task-independent portions or a
+task in dispatch disabled state)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the
+target node is specified.
+
+@code{EN_PAR} - A value outside the range supported by the target node
+and/or transmission packet format was specified as a parameter (a value
+outside supported range was specified for waiptn and tmout)
+
+@code{EN_RPAR} - A value outside the range supported by the requesting
+node and/or transmission packet format was specified as a parameter (a
+value exceeding the range for the requesting node was specified for
+flgptn)
+
+@subheading DESCRIPTION:
+
+The @code{wai_flg} system call waits for the eventflag specified by
+@code{flgid} to be set to satisfy the wait release condition specified by
+@code{wfmode}. The Eventflags bit-pattern will be returned with a pointer @code{p_flgptn}.
+
+If the eventflag specified by @code{flgid} already satisfies the wait
+release conditions given by @code{wfmode}, the issuing task will continue
+execution without waiting. @code{wfmode} may be specified as follows.
+
+@example
+ wfmode = TWF_ANDW (or TWF_ORW) | TWF_CLR(optional)
+@end example
+
+If @code{TWF_ORW} is specified, the issuing task will wait for any of the
+bits specified by @code{waiptn} to be set for the eventflag given by
+@code{flgid} (OR wait). If @code{TWF_ANDW} is specified, the issuing task
+will wait for all of the bits specified by @code{waiptn} to be set for the
+eventflag given by @code{flgid} (AND wait).
+
+If the @code{TWF_CLR} specification is not present, the eventflag value
+will remain unchanged even after the wait conditions have been satisfied
+and the task has been released from the WAIT state. If @code{TWF_CLR} is
+specified, all bits of the eventflag will be cleared to 0 once the wait
+conditions of the waiting task have been satisfied.
+
+The return parameter @code{flgptn} returns the value of the eventflag after the
+wait state of a task has been released due to this system call. If
+@code{TWF_CLR} was specified, the value before eventflag bits were cleared
+is returned. The value returned by @code{flgptn} fulfills the wait
+release conditions of this system call.
+
+An @code{E_PAR} parameter error will result if @code{waiptn} is 0.
+
+A task can not execute any of @code{wai_flg, twai_flg} or @code{pol_flg}
+on an eventflag having the @code{TA_WSGL} attribute if another task is
+already waiting for that eventflag. An @code{E_OBJ} error will be
+returned to a task which executes @code{wai_flg} at a later time
+regardless as to whether or not the task that executes @code{wai_flg} or
+@code{twai_flg} later will be placed in a WAIT state (conditions for
+releasing wait state be satisfied). An @code{E_OBJ} error will be
+returned even to tasks which just execute @code{pol_flg}, again regardless
+as to whether or not wait release conditions for that task were satisfied.
+
+On the other hand, multiple tasks can wait at the same time for the same
+eventflag if that eventflag has the @code{TA_WMUL} attribute. This means
+that event flags can make queues for tasks to wait on. When such
+eventflags are used, a single @code{set_flg} call may release multiple
+waiting tasks.
+
+The following processing takes place if a queue for allowing multiple
+tasks to wait has been created for an eventflag with the @code{TA_WMUL}
+attribute.
+
+@itemize @bullet
+
+@item The waiting order on the queue is FIFO. (However, depending on
+@code{waiptn} and @code{wfmode}, task at the head of the queue will not
+always be released from waiting.)
+
+@item If a task specifying that the eventflag be cleared is on the queue,
+the flag is cleared when that task is released from waiting.
+
+@item Since any tasks behind a task which clears the eventflag (by
+specifying @code{TWF_CLR}) will check the eventflag after it is cleared,
+they will not be released from waiting.
+
+@end itemize
+
+If multiple tasks having the same priority are released from waiting
+simultaneously due to @code{set_flg}, the order of tasks on the ready
+queue after release will be the same as their original order on the
+eventflag queue.
+
+@subheading NOTES:
+
+Multiprocessing is not supported. Thus none of the "@code{EN_}" status
+codes will be returned.
+
+
+@c
+@c pol_flg
+@c
+
+@page
+@subsection pol_flg - Wait for Eventflag (Polling)
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER pol_flg(
+ UINT *p_flgptn,
+ ID flgid,
+ UINT waiptn,
+ UINT wfmode
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (flgid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the eventflag specified by flgid
+does not exist)
+
+@code{E_OACV} - Object access violation (A flgid less than -4 was
+specified from a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (waiptn = 0, wfmode invalid, or tmout is -2
+or less)
+
+@code{E_OBJ} - Invalid object state (multiple tasks waiting for an
+eventflag with the TA_WSGL attribute)
+
+@code{E_DLT} - The object being waited for was deleted (the specified
+eventflag was deleted while waiting)
+
+@code{E_RLWAI} - WAIT state was forcibly released (rel_wai was received
+while waiting)
+
+@code{E_TMOUT} - Polling failure or timeout exceeded
+
+@code{E_CTX} - Context error (issued from task-independent portions or a
+task in dispatch disabled state)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the
+target node is specified.
+
+@code{EN_PAR} - A value outside the range supported by the target node
+and/or transmission packet format was specified as a parameter (a value
+outside supported range was specified for waiptn and tmout)
+
+@code{EN_RPAR} - A value outside the range supported by the requesting
+node and/or transmission packet format was specified as a parameter (a
+value exceeding the range for the requesting node was specified for
+flgptn)
+
+@subheading DESCRIPTION:
+
+The @code{pol_flg} system call has the same function as @code{wai_flg}
+except for the waiting feature. @code{pol_flg} polls whether or not the
+task should wait if @code{wai_flg} is executed. The meanings of
+parameters to @code{pol_flg} are the same as for @code{wai_flg}. The
+specific operations by @code{pol_flg} are as follows.
+
+@itemize @bullet
+
+@item If the target eventflag already satisfies the conditions for
+releasing wait given by @code{wfmode}, processing is the same as
+@code{wai_flg}: the eventflag is cleared if @code{TWF_CLR} is specified
+and the system call completes normally.
+
+@item If the target eventflag does not yet satisfy the conditions for
+releasing wait given by @code{wfmode}, an @code{E_TMOUT} error is returned to
+indicate polling failed and the system call finishes. Unlike
+@code{wai_flg}, the issuing task does not wait in this case. The eventflag
+is not cleared in this case even if @code{TWF_CLR} has been specified.
+
+@end itemize
+
+@subheading NOTES:
+
+Multiprocessing is not supported. Thus none of the "@code{EN_}" status
+codes will be returned.
+
+
+@c
+@c twai_flg
+@c
+
+@page
+@subsection twai_flg - Wait on Eventflag with Timeout
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER twai_flg(
+ UINT *p_flgptn,
+ ID flgid,
+ UINT waiptn,
+ UINT wfmode,
+ TMO tmout
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (flgid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the eventflag specified by flgid
+does not exist)
+
+@code{E_OACV} - Object access violation (A flgid less than -4 was
+specified from a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (waiptn = 0, wfmode invalid, or tmout is -2
+or less)
+
+@code{E_OBJ} - Invalid object state (multiple tasks waiting for an
+eventflag with the TA_WSGL attribute)
+
+@code{E_DLT} - The object being waited for was deleted (the specified
+eventflag was deleted while waiting)
+
+@code{E_RLWAI} - WAIT state was forcibly released (rel_wai was received
+while waiting)
+
+@code{E_TMOUT} - Polling failure or timeout exceeded
+
+@code{E_CTX} - Context error (issued from task-independent portions or a
+task in dispatch disabled state)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the
+target node is specified.
+
+@code{EN_PAR} - A value outside the range supported by the target node
+and/or transmission packet format was specified as a parameter (a value
+outside supported range was specified for waiptn and tmout)
+
+@code{EN_RPAR} - A value outside the range supported by the requesting
+node and/or transmission packet format was specified as a parameter (a
+value exceeding the range for the requesting node was specified for
+flgptn)
+
+@subheading DESCRIPTION:
+
+The @code{twai_flg} system call has the same function as @code{wai_flg}
+with an additional timeout feature. A maximum wait time (timeout value)
+can be specified using the parameter @code{tmout}. When a timeout is specified,
+a timeout error, @code{E_TMOUT}, will result and the system call will
+finish if the period specified by @code{tmout} elapses without conditions for
+releasing wait being satisfied.
+
+Specifying @code{TMO_POL = 0} to @code{twai_flg} for @code{tmout} indicates that
+a timeout value of 0 be used, resulting in exactly the same processing as
+@code{pol_flg}. Specifying @code{TMO_FEVR = -1} to @code{twai_flg} for
+@code{tmout} indicates that an infinite timeout value be used, resulting in
+exactly the same processing as @code{wai_flg}.
+
+@subheading NOTES:
+
+Multiprocessing is not supported. Thus none of the "@code{EN_}" status
+codes will be returned.
+
+
+@code{Pol_flg} and @code{wai_flg} represent the same processing as
+specifying certain values (@code{TMO_POL} or @code{TMO_FEVR}) to
+@code{twai_flg} for tmout. As such, only @code{twai_flg} is implemented
+in the kernel; @code{pol_flg} and @code{wai_flg} should be implemented as macros
+which call @code{twai_flg}.
+
+@c
+@c ref_flg
+@c
+
+@page
+@subsection ref_flg - Reference Eventflag Status
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ref_flg(
+ T_RFLG *pk_rflg,
+ ID flgid );
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (flgid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the eventflag specified by flgid
+does not exist)
+
+@code{E_OACV} - Object access violation (A flgid less than -4 was
+specified from a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (the packet address for the return
+parameters could not be used)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the
+target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system call
+was issued from a task in dispatch disabled state or from a
+task-independent portion
+
+@code{EN_RPAR} - A value outside the range supported by the requesting
+node and/or transmission packet format was returned as a parameter (a
+value outside supported range was specified for exinf, wtsk and/or flgptn)
+
+@subheading DESCRIPTION:
+
+This system call refers to the state of the eventflag specified by
+@code{flgid}, and returns its current flag pattern (@code{flgptn}),
+waiting task information (@code{wtsk}), and its extended information
+(@code{exinf}).
+
+Depending on the implementation, @code{wtsk} may be returned as the ID
+(non-zero) of the task waiting for the eventflag. If there are multiple
+tasks waiting for the eventflag (only when attribute is @code{TA_WMUL}),
+the ID of the task at the head of the queue is returned.
+
+An @code{E_NOEXS} error will result if the eventflag specified to
+@code{ref_flg} does not exist.
+
+@subheading NOTES:
+
+Multiprocessing is not supported. Thus none of the "@code{EN_}" status
+codes will be returned.
+
+Although both @code{ref_flg} and @code{pol_flg} can be used to find an
+eventflag's pattern (@code{flgptn}) without causing the issuing task to
+wait, @code{ref_flg} simply reads the eventflag's pattern (@code{flgptn})
+while @code{pol_flg} functions is identical to @code{wai_flg} when wait
+release conditions are satisfied (it clears the eventflag if
+@code{TWF_CLR} is specified).
+
+Depending on the implementation, additional information besides
+@code{wtsk} and @code{flgptn} (such as eventflag attributes,
+@code{flgatr}) may also be referred.
diff --git a/doc/itron3.0/fixedblock.t b/doc/itron3.0/fixedblock.t
new file mode 100644
index 0000000000..97270e2636
--- /dev/null
+++ b/doc/itron3.0/fixedblock.t
@@ -0,0 +1,389 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c This is the chapter from the RTEMS ITRON User's Guide that
+@c documents the services provided by the fixed block
+@c manager.
+@c
+@c $Id$
+@c
+
+@chapter Fixed Block Manager
+
+@section Introduction
+
+The fixed block manager provides functions for creating, deleting, getting, polling, getting with timeout, releasing, and referencing the fixed-sized memorypool. This manager is based on ITRON 3.0 standard.
+
+The services provided by the fixed block manager are:
+
+@itemize @bullet
+@item @code{cre_mpf} - Create Fixed-Size Memorypool
+@item @code{del_mpf} - Delete Fixed-Size Memorypool
+@item @code{get_blf} - Get Fixed-Size Memory Block
+@item @code{pget_blf} - Poll and Get Fixed-Size Memory Block
+@item @code{tget_blf} - Get Fixed-Size Memory Block with Timeout
+@item @code{rel_blf} - Release Fixed-Size Memory Block
+@item @code{ref_mpf} - Reference Fixed-Size Memorypool Status
+@end itemize
+
+@section Background
+
+@section Operations
+
+@section System Calls
+
+This section details the fixed block manager's services.
+A subsection is dedicated to each of this manager's services
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+
+@c
+@c cre_mpf
+@c
+
+@page
+@subsection cre_mpf - Create Fixed-Size Memorypool
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER cre_mpf(
+ ID mpfid,
+ T_CMPF *pk_cmpf
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_NOMEM} - Insufficient memory (Memory for control block and/or for
+memorypool cannot be allocated)
+
+@code{E_ID} - Invalid ID number (mpfid was invalid or could not be used)
+
+@code{E_RSATR} - Reserved attribute (mpfatr was invalid or could not be used)
+
+@code{E_OBJ} - Invalid object state (a memorypool of the same ID already exists)
+
+@code{E_OACV} - Object access violation (A mpfid less than -4 was specified from
+a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (pk_cmpf is invalid or mpfsz and/or blfsz is
+negative or invalid)
+
+@subheading DESCRIPTION:
+
+This system call creates a fixed-size memorypool having the ID number specified by mpfid. Specifically, a memory area of a size based on values of mpfcnt and blfsz is reserved for use as a memorypool. A control block for the memorypool being created is also allocated. The get_blf system call specifying the memorypool created by this call can be issued to allocate memory blocks of the size given by blfsz (in bytes).
+
+@subheading NOTES:
+
+The memory area required for creating memorypools and for allocating control blocks for each object is allocated while system initialization. Associated parameters are therefore specified at system configuration.
+
+@c
+@c del_mpf
+@c
+
+@page
+@subsection del_mpf - Delete Fixed-Size Memorypool
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER del_mpf(
+ ID mpfid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (mpfid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the memorypool specified by mpfid does not exist)
+
+@code{E_OACV} - Object access violation (A mpfid less than -4 was specified from a user task. This is implementation dependent.)
+
+@subheading DESCRIPTION:
+
+This system call deletes the fixed-size memorypool specified by mpfid. No check or error report is performed even if there are tasks using memory from the memorypool to be deleted. This system call completes normally even if some of the memory blocks are not returned. Issuing this system call causes memory used for the control block of the associated memorypool and the memory area making up the memorypool itself to be released. After this system call is invoked, another memorypool having the same ID number can be created. This system call will complete normally even if there are tasks waiting to get memory blocks from the memorypool. In that case, an E_DLT error will be returned to each waiting task.
+
+@subheading NOTES:
+
+When a memorypool being waited for by more than one tasks is deleted, the order of tasks on the ready queue after the WAIT state is cleared is implementation dependent in the case of tasks having the same priority.
+
+
+@c
+@c get_blf
+@c
+
+@page
+@subsection get_blf - Get Fixed-Size Memory Block
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER get_blf(
+ VP *p_blf,
+ ID mpfid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (mpfid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the memorypool specified by mpfid does not exist)
+
+@code{E_OACV} - Object access violation (A mpfid less than -4 was specified from
+a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (tmout is -2 or less)
+
+@code{E_DLT} - The object being waited for was deleted (the specified memorypool
+was deleted while waiting)
+
+@code{E_RLWAI} - WAIT state was forcibly released (rel_wai was received while
+waiting)
+
+@code{E_TMOUT} - Polling failure or timeout exceeded
+
+@code{E_CTX} - Context error (issued from task-independent portions or a
+task in dispatch disabled state; implementation dependent for pget_blf and tget_blf(tmout=TMO_POL))
+
+@subheading DESCRIPTION:
+
+A memory block is allocated from the fixed-size memorypool specified by mpfid. The start address of the memory block allocated is returned to blf. The size of the memory block allocated is specified by the blfsz parameter when the fixed-size memorypool was created. The allocated memory block is not cleared to zero. The contents of the allocated memory block are undefined. If the memory block cannot be obtained from the specified memorypool when get_blf is issued, the task issuing get_blf will be placed on the memory allocation queue of the specified memorypool, and wait until it can get the memory it requires. If the object being waited for is deleted (the specified memorypool is deleted while waiting), an E_DLT error will be returned.
+
+@subheading NOTES:
+
+NONE
+
+
+@c
+@c pget_blf
+@c
+
+@page
+@subsection pget_blf - Poll and Get Fixed-Size Memory Block
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ercd =pget_blf(
+ VP *p_blf,
+ ID mpfid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (mpfid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the memorypool specified by mpfid does not exist)
+
+@code{E_OACV} - Object access violation (A mpfid less than -4 was specified from
+a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (tmout is -2 or less)
+
+@code{E_DLT} - The object being waited for was deleted (the specified memorypool
+was deleted while waiting)
+
+@code{E_RLWAI} - WAIT state was forcibly released (rel_wai was received while
+waiting)
+
+@code{E_TMOUT} - Polling failure or timeout exceeded
+
+@code{E_CTX} - Context error (issued from task-independent portions or a
+task in dispatch disabled state; implementation dependent for pget_blf and tget_blf(tmout=TMO_POL))
+
+@subheading DESCRIPTION:
+
+The pget_blf system call has the same function as get_blf except for the waiting feature. Pget_blf polls whether or not the task should wait if get_blf is executed. The meaning of parameters to pget_blf are the same with get_blf. The specific operations by pget_blf are as follows.
+
+ - If there is a free memory block available, processing is the same as
+ get_blf: that is, the requested memory is allocated and the system call
+ completes normally.
+
+ - If there is no free memory block, an E_TMOUT error is returned to
+ indicate polling failed and the system call finishes. Unlike get_blf,
+ the issuing task does not wait in this case. Also, the issuing task
+ does not get any memory.
+
+@subheading NOTES:
+
+NONE
+
+
+@c
+@c tget_blf
+@c
+
+@page
+@subsection tget_blf - Get Fixed-Size Memory Block with Timeout
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ercd =tget_blf(
+ VP *p_blf,
+ ID mpfid,
+ TMO tmout
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (mpfid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the memorypool specified by mpfid does not exist)
+
+@code{E_OACV} - Object access violation (A mpfid less than -4 was specified from
+a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (tmout is -2 or less)
+
+@code{E_DLT} - The object being waited for was deleted (the specified memorypool
+was deleted while waiting)
+
+@code{E_RLWAI} - WAIT state was forcibly released (rel_wai was received while
+waiting)
+
+@code{E_TMOUT} - Polling failure or timeout exceeded
+
+@code{E_CTX} - Context error (issued from task-independent portions or a
+task in dispatch disabled state; implementation dependent for pget_blf and tget_blf(tmout=TMO_POL))
+
+@subheading DESCRIPTION:
+
+The tget_blf system call has the same function as get_blf with an additional timeout feature. A maximum wait time (timeout value) can be specified using the parameter tmout. When a timeout is specified, a timeout error, E_TMOUT, will result and the system call will finish if the period specified by tmout elapses without conditions for releasing wait being satisfied (i.e. without free memory becoming available).
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c rel_blf
+@c
+
+@page
+@subsection rel_blf - Release Fixed-Size Memory Block
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER rel_blf(
+ ID mpfid,
+ VP blf
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (mpfid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the memorypool specified by mpfid does not exist)
+
+@code{E_OACV} - Object access violation (A mpfid less than -4 was specified from
+a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (blf is invalid or an attempt was made to return
+the memory block to the wrong memorypool)
+
+@subheading DESCRIPTION:
+
+This system call releases the memory block specified by blf and returns it to the fixed-size memorypool specified by mpfid. Executing rel_blf allows memory to be allocated to the next task waiting for memory allocation from the memorypool given by mpfid, thus releasing that task from its WAIT state.
+
+@subheading NOTES:
+
+The fixed-size memorypool to which the memory block is returned must be the same memorypool from which it was originally allocated. An E_PAR error will result if an attempt is made to return a memory block to another memorypool than that from which it was originally allocated.
+
+@c
+@c ref_mpf
+@c
+
+@page
+@subsection ref_mpf - Reference Fixed-Size Memorypool Status
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ref_mpf(
+ T_RMPF *pk_rmpf,
+ ID mpfid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (mpfid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist \(the memorypool specified by mpfid does
+not exist.)
+
+@code{E_OACV} - Object access violation (A mpfid less than -4 was specified from
+a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (the packet address for the return parameters
+could not be used)
+
+@subheading DESCRIPTION:
+
+This system call refers to the state of the fixed-size memorypool specified by mpfid, and returns the current number of free blocks (frbcnt), information of a task waiting to be allocated memory (wtsk), and its extended information (exinf). Wtsk indicates whether or not there is a task waiting to be allocated memory from the fixed-size memorypool specified. If there is no waiting task, wtsk is returned as FALSE = 0. If there is a waiting task, wtsk is returned as a value other than 0.
+
+@subheading NOTES:
+
+While the frsz return parameter of ref_mpl returns the total size of free memory, the frbcnt return parameter of ref_mpf returns the number of free blocks.
+
+Depending on the implementation, additional information besides wtsk and frbcnt (such as memorypool attributes, mpfatr) may also be referred.
+
diff --git a/doc/itron3.0/gen_all b/doc/itron3.0/gen_all
new file mode 100644
index 0000000000..6e4e66893f
--- /dev/null
+++ b/doc/itron3.0/gen_all
@@ -0,0 +1,4 @@
+for i in config eventflags fixedblock interrupt mailbox memorypool msgbuffer network rendezvous task tasksync time
+do
+ sh ./gen_section $i | tr -d "\r" >${i}.t
+done
diff --git a/doc/itron3.0/gen_section b/doc/itron3.0/gen_section
new file mode 100644
index 0000000000..cdc1c80f2c
--- /dev/null
+++ b/doc/itron3.0/gen_section
@@ -0,0 +1,191 @@
+#
+# This shell script generates the starting template for a manager chapter.
+#
+
+
+# Set this based on which chapter you want to generate a template for.
+chapter=$1
+
+case ${chapter} in
+ task)
+ CHAPTER_CAPS="Task"
+ CHAPTER_LOWER="task"
+ ROUTINES=" cre_tsk del_tsk sta_tsk ext_tsk exd_tsk ter_tsk \
+ dis_dsp ena_dsp chg_pri rot_rdq rel_wai get_tid ref_tsk"
+ ;;
+
+ tasksync)
+ CHAPTER_CAPS="Task-Dependent Synchronization"
+ CHAPTER_LOWER="task-dependent synchronization"
+ ROUTINES=" sus_tsk rsm_tsk frsm_tsk \
+ slp_tsk tslp_tsk wup_tsk can_wup"
+ ;;
+
+ semaphore)
+ CHAPTER_CAPS="Semaphore"
+ CHAPTER_LOWER="semaphore"
+ ROUTINES="cre_sem del_sem sig_sem wai_sem preq_sem twai_sem ref_sem "
+ ;;
+
+ eventflags)
+ CHAPTER_CAPS="Eventflags"
+ CHAPTER_LOWER="eventflags"
+ ROUTINES=" cre_flg del_flg set_flg clr_flg wai_flg pol_flg \
+ twai_flg ref_flg "
+ ;;
+
+ mailbox)
+ CHAPTER_CAPS="Mailbox"
+ CHAPTER_LOWER="mailbox"
+ ROUTINES="cre_mbx del_mbx snd_msg rcv_msg prcv_msg trcv_msg ref_mbx"
+ ;;
+
+ msgbuffer)
+ CHAPTER_CAPS="Message Buffer"
+ CHAPTER_LOWER="message buffer"
+ ROUTINES=" cre_mbf del_mbf snd_mbf psnd_mbf tsnd_mbf rcv_mbf prcv_mbf \
+ trcv_mbf ref_mbf "
+ ;;
+
+ rendezvous)
+ CHAPTER_CAPS="Rendezvous"
+ CHAPTER_LOWER="rendezvous"
+ ROUTINES=" cre_por del_por cal_por pcal_por tcal_por acp_por pacp_por \
+ tacp_por fwd_por rpl_rdv ref_por"
+ ;;
+
+ interrupt)
+ CHAPTER_CAPS="Interrupt"
+ CHAPTER_LOWER="interrupt"
+ ROUTINES=" def_int ret_int ret_wup loc_cpu unl_cpu dis_int ena_int
+ chg_iXX ref_iXX"
+ ;;
+
+ memorypool)
+ CHAPTER_CAPS="Memory Pool"
+ CHAPTER_LOWER="memory pool"
+ ROUTINES=" cre_mpl del_mpl get_blk pget_blk tget_blk rel_blk ref_mpl"
+ ;;
+
+ fixedblock)
+ CHAPTER_CAPS="Fixed Block"
+ CHAPTER_LOWER="fixed block"
+ ROUTINES=" cre_mpf del_mpf get_blf pget_blf tget_blf rel_blf ref_mpf"
+ ;;
+
+
+ time)
+ CHAPTER_CAPS="Time"
+ CHAPTER_LOWER="time"
+ ROUTINES=" get_tim set_tim dly_tsk \
+ def_cyc act_cyc ref_cyc \
+ def_alm ref_alm ret_tmr"
+ ;;
+
+ config)
+ CHAPTER_CAPS="System"
+ CHAPTER_LOWER="system"
+ ROUTINES=" get_ver ref_sys ref_cfg def_svc def_exc"
+ ;;
+
+ network)
+ CHAPTER_CAPS="Network Support"
+ CHAPTER_LOWER="network support"
+ ROUTINES=" nrea_dat nwri_dat nget_nod nget_ver"
+ ;;
+ psxtimer)
+ CHAPTER_CAPS="Timer"
+ CHAPTER_LOWER="timer"
+ ROUTINES="timer_create timer_delete timer_settime timer_gettime timer_getoverrun"
+ ;;
+ *)
+ echo "Unknown chapter name"
+ exit 1
+ ;;
+esac
+
+if [ "x${CHAPTER_CAPS}" = "x" -o "x${CHAPTER_LOWER}" = "x" \
+ -o "x${ROUTINES}" = "x" ] ; then
+ echo "initialization problem"
+ exit 1
+fi
+
+echo "@c"
+echo "@c This is the chapter from the RTEMS ITRON User's Guide that"
+echo "@c documents the services provided by the ${CHAPTER_LOWER}"
+echo "@c manager."
+echo "@c"
+echo "@c \$Id\$"
+echo "@c"
+echo ""
+echo "@chapter ${CHAPTER_CAPS}" Manager
+echo ""
+echo "@section Introduction"
+echo ""
+echo "The "
+echo "${CHAPTER_LOWER} manager is ..."
+echo ""
+echo "The services provided by the ${CHAPTER_LOWER} manager are:"
+echo ""
+echo "@itemize @bullet"
+
+for routine in ${ROUTINES}
+do
+ description=`grep " ${routine} " ../../itron_spec/itron3-1.txt | grep "]" | cut -d']' -f2 `
+ description=`echo ${description}`
+ echo "@item @code{${routine}} - ${description}"
+done
+echo "@end itemize"
+
+echo ""
+echo "@section Background"
+echo ""
+echo "@section Operations"
+echo ""
+echo "@section System Calls"
+echo ""
+echo "This section details the ${CHAPTER_LOWER} manager's services."
+echo "A subsection is dedicated to each of this manager's services"
+echo "and describes the calling sequence, related constants, usage,"
+echo "and status codes."
+echo ""
+
+for routine in ${ROUTINES}
+do
+ description=`grep ${routine} ../../itron_spec/itron3-1.txt | grep "]" | cut -d']' -f2`
+ description=`echo -n ${description}`
+ echo ""
+ echo "@c"
+ echo "@c ${routine}"
+ echo "@c"
+ echo ""
+ echo "@page"
+ echo "@subsection ${routine} - " ${description}
+ echo ""
+ echo "@subheading CALLING SEQUENCE:"
+ echo ""
+ echo "@ifset is-C"
+ echo "@example"
+ proto=`grep "${routine} (" ../../itron_spec/itron3-6.txt | sed -e 's/ercd = //'` # | sed -e 's/ \\(/(/'`
+
+ echo `echo -n ${proto} | cut -d'(' -f1`"("
+ echo ${proto} | cut -d'(' -f2 | sed -e 's/ .;//'
+ echo ");"
+ # echo "int ${routine}("
+ # echo ");"
+ echo "@end example"
+ echo "@end ifset"
+ echo ""
+ echo "@ifset is-Ada"
+ echo "@end ifset"
+ echo ""
+ echo "@subheading STATUS CODES:"
+ echo ""
+ echo "@code{EXXX} - "
+ echo ""
+ echo "@subheading DESCRIPTION:"
+ echo ""
+ echo "@subheading NOTES:"
+ echo ""
+done
+
diff --git a/doc/itron3.0/gen_status_shell b/doc/itron3.0/gen_status_shell
new file mode 100644
index 0000000000..1f3f8e4c47
--- /dev/null
+++ b/doc/itron3.0/gen_status_shell
@@ -0,0 +1,230 @@
+#
+# This shell script generates the starting template for a manager chapter.
+#
+
+FILES="task tasksync semaphore eventflags mailbox msgbuffer rendezvous interrupt memorypool fixedblock time config network"
+
+
+cat <<EOF
+@c
+@c This is the chapter from the RTEMS ITRON User's Guide that
+@c documents the services provided by the task
+@c manager.
+@c
+@c $Id$
+@c
+
+@chapter ITRON Implementation Status
+
+@section Introduction
+
+This chapter describes the status of the implementation of each
+manager in the RTEMS implementataion of the uITRON 3.0 API. The
+status of each manager is presented in terms of documentation and
+status relative to the extended level (level 'E') of the uITRON 3.0
+API specification. The extended level of the specification is
+the level at which dynamic object creation, deletion, and
+reference services are available. This level is more akin to the other
+APIs supported by RTEMS. This purpose of this chapter is
+to make it clear what is required to bring the RTEMS
+uITRON API implementation into compliance with the
+specification. The following description of the specification
+levels is taken from the uITRON 3.0 API specification.
+
+
+uITRON 3.0 specification is divided into fewer system call levels than was the
+previous uITRON 2.0 specification. There are now just three levels: Level R
+(Required), Level S (Standard) and Level E (Extended). In addition to these
+three levels, there is also Level C for CPU-dependent system calls.
+In addition, the uITRON 3.0 API, defines the network level ('N') which
+represents system calls that support the connection function
+
+@itemize @bullet
+@item [level R] (Required)
+The functions in this level are mandatory for all implementations of
+uITRON 3.0 specification. This includes basic functions for achieving
+a real-time, multitasking OS. These functions can be implemented even
+without a hardware timer. This level corresponds to Levels 1 and 2
+of uITRON 2.0 specification.
+
+@item [level S] (Standard)
+This includes basic functions for achieving a real-time, multitasking
+OS. This level corresponds to Levels 3 and 4 of uITRON 2.0
+specification.
+
+@item [level E] (Extended)
+This includes additional and extended functions. This corresponds to
+functions not included in uITRON 2.0 specification (functions of
+ITRON2 specification). Specifically, this level includes object
+creation and deletion functions, rendezvous functions, memorypools
+and the timer handler.
+
+@item [level C] (CPU dependent)
+This level provides implementation-dependent functions required due to
+the CPU or hardware configuration.
+
+@end itemize
+
+The support level of the connection function is indicated by appending an 'N'
+to the end of the level. For example, connectivity supported at [level S]
+would be referred to as [level SN]. The support level for functions which
+can only send requests for operations on other nodes but offer no system call
+processing on the issuing node itself are indicated by the lower case letter
+'s' or 'e'.
+
+
+EOF
+
+
+for chapter in $FILES
+do
+ case ${chapter} in
+ task)
+ CHAPTER_CAPS="Task"
+ CHAPTER_LOWER="task"
+ ROUTINES=" cre_tsk del_tsk sta_tsk ext_tsk exd_tsk ter_tsk \
+ dis_dsp ena_dsp chg_pri rot_rdq rel_wai get_tid ref_tsk"
+ ;;
+
+ tasksync)
+ CHAPTER_CAPS="Task-Dependent Synchronization"
+ CHAPTER_LOWER="task-dependent synchronization"
+ ROUTINES=" sus_tsk rsm_tsk frsm_tsk \
+ slp_tsk tslp_tsk wup_tsk can_wup"
+ ;;
+
+ semaphore)
+ CHAPTER_CAPS="Semaphore"
+ CHAPTER_LOWER="semaphore"
+ ROUTINES="cre_sem del_sem sig_sem wai_sem preq_sem twai_sem ref_sem "
+ ;;
+
+ eventflags)
+ CHAPTER_CAPS="Eventflags"
+ CHAPTER_LOWER="eventflags"
+ ROUTINES=" cre_flg del_flg set_flg clr_flg wai_flg pol_flg \
+ twai_flg ref_flg "
+ ;;
+
+ mailbox)
+ CHAPTER_CAPS="Mailbox"
+ CHAPTER_LOWER="mailbox"
+ ROUTINES="cre_mbx del_mbx snd_msg rcv_msg prcv_msg trcv_msg ref_mbx"
+ ;;
+
+ msgbuffer)
+ CHAPTER_CAPS="Message Buffer"
+ CHAPTER_LOWER="message buffer"
+ ROUTINES=" cre_mbf del_mbf snd_mbf psnd_mbf tsnd_mbf rcv_mbf prcv_mbf \
+ trcv_mbf ref_mbf "
+ ;;
+
+ rendezvous)
+ CHAPTER_CAPS="Rendezvous"
+ CHAPTER_LOWER="rendezvous"
+ ROUTINES=" cre_por del_por cal_por pcal_por tcal_por acp_por pacp_por \
+ tacp_por fwd_por rpl_rdv ref_por"
+ ;;
+
+ interrupt)
+ CHAPTER_CAPS="Interrupt"
+ CHAPTER_LOWER="interrupt"
+ ROUTINES=" def_int ret_int ret_wup loc_cpu unl_cpu dis_int ena_int
+ chg_iXX ref_iXX"
+ ;;
+
+ memorypool)
+ CHAPTER_CAPS="Memory Pool"
+ CHAPTER_LOWER="memory pool"
+ ROUTINES=" cre_mpl del_mpl get_blk pget_blk tget_blk rel_blk ref_mpl"
+ ;;
+
+ fixedblock)
+ CHAPTER_CAPS="Fixed Block"
+ CHAPTER_LOWER="fixed block"
+ ROUTINES=" cre_mpf del_mpf get_blf pget_blf tget_blf rel_blf ref_mpf"
+ ;;
+
+ time)
+ CHAPTER_CAPS="Time"
+ CHAPTER_LOWER="time"
+ ROUTINES=" get_tim set_tim dly_tsk \
+ def_cyc act_cyc ref_cyc \
+ def_alm ref_alm ret_tmr"
+ ;;
+
+ config)
+ CHAPTER_CAPS="System"
+ CHAPTER_LOWER="system"
+ ROUTINES=" get_ver ref_sys ref_cfg def_svc def_exc"
+ ;;
+
+ network)
+ CHAPTER_CAPS="Network Support"
+ CHAPTER_LOWER="network support"
+ ROUTINES=" nrea_dat nwri_dat nget_nod nget_ver"
+ ;;
+
+ *)
+ echo "Unknown chapter name"
+ exit 1
+ ;;
+ esac
+
+ echo "@c"
+ echo "@c ${CHAPTER_CAPS}"
+ echo "@c"
+ echo
+ echo "@section ${CHAPTER_CAPS} Status"
+cat <<EOF
+
+@itemize @bullet
+
+@item Implementation
+@itemize @bullet
+EOF
+
+ for routine in ${ROUTINES}
+ do
+ echo "@item ${routine} - Stub, Needs to be Fleshed Out"
+ done
+cat <<EOF
+@end itemize
+
+@item Executive Modifications
+@itemize @bullet
+@item None Expected
+@end itemize
+
+@item Testing
+@itemize @bullet
+@item No Tests Written
+@end itemize
+
+@item Documentation
+@itemize @bullet
+@item Shell, Needs to be Fleshed Out
+@end itemize
+
+@item ITRON 3.0 API Conformance
+@itemize @bullet
+@item Level E - Extended Functionality
+@itemize @bullet
+@item
+@end itemize
+
+@item Level C - CPU Dependent Functionality
+@itemize @bullet
+@item NA
+@end itemize
+
+@item Level N - Connection Functionality
+@itemize @bullet
+@item Not implemented
+@end itemize
+@end itemize
+
+@end itemize
+
+EOF
+done
diff --git a/doc/itron3.0/interrupt.t b/doc/itron3.0/interrupt.t
new file mode 100644
index 0000000000..e93e6bc231
--- /dev/null
+++ b/doc/itron3.0/interrupt.t
@@ -0,0 +1,306 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c This is the chapter from the RTEMS ITRON User's Guide that
+@c documents the services provided by the interrupt
+@c manager.
+@c
+@c $Id$
+@c
+
+@chapter Interrupt Manager
+
+@section Introduction
+
+The
+interrupt manager is ...
+
+The services provided by the interrupt manager are:
+
+@itemize @bullet
+@item @code{def_int} - Define Interrupt Handler
+@item @code{ret_int} - Return from Interrupt Handler
+@item @code{ret_wup} - Return and Wakeup Task
+@item @code{loc_cpu} - Lock CPU
+@item @code{unl_cpu} - Unlock CPU
+@item @code{dis_int} - Disable Interrupt
+@item @code{ena_int} - Enable Interrupt
+@item @code{chg_iXX} - Change Interrupt Mask(Level or Priority)
+@item @code{ref_iXX} - Reference Interrupt Mask(Level or Priority)
+@end itemize
+
+@section Background
+
+@section Operations
+
+@section System Calls
+
+This section details the interrupt manager's services.
+A subsection is dedicated to each of this manager's services
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+
+@c
+@c def_int
+@c
+
+@page
+@subsection def_int - Define Interrupt Handler
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER def_int(
+ UINT dintno,
+ T_DINT *pk_dint
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c ret_int
+@c
+
+@page
+@subsection ret_int - Return from Interrupt Handler
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+void ret_int(
+
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c ret_wup
+@c
+
+@page
+@subsection ret_wup - Return and Wakeup Task
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+void ret_wup(
+ ID tskid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c loc_cpu
+@c
+
+@page
+@subsection loc_cpu - Lock CPU
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER loc_cpu(
+
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c unl_cpu
+@c
+
+@page
+@subsection unl_cpu - Unlock CPU
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER unl_cpu(
+
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c dis_int
+@c
+
+@page
+@subsection dis_int - Disable Interrupt
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER dis_int(
+ UINT eintno
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c ena_int
+@c
+
+@page
+@subsection ena_int - Enable Interrupt
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ena_int(
+ UINT eintno
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c chg_iXX
+@c
+
+@page
+@subsection chg_iXX - Change Interrupt Mask(Level or Priority)
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER chg_iXX(
+ UINT iXXXX
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c ref_iXX
+@c
+
+@page
+@subsection ref_iXX - Reference Interrupt Mask(Level or Priority)
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ref_iXX(
+ UINT *p_iXXXX
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
diff --git a/doc/itron3.0/itron.texi b/doc/itron3.0/itron.texi
new file mode 100644
index 0000000000..9bc3517538
--- /dev/null
+++ b/doc/itron3.0/itron.texi
@@ -0,0 +1,143 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename itron.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the RTEMS ITRON 3.0 API User's Guide
+@c
+
+@c Joel's Questions
+@c
+@c 1. Why does paragraphindent only impact makeinfo?
+@c 2. Why does paragraphindent show up in HTML?
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS On-Line Manual
+@direntry
+* RTEMS ITRON 3.0 API User's Guide: (itron).
+ ITRON Guide
+@end direntry
+@end ifset
+
+@c variable substitution info:
+@c
+@c Note: At the moment there is not an Ada interface to ITRON.
+@set is-C
+@clear is-Ada
+@set LANGUAGE C
+@set STRUCTURE structure
+@set ROUTINE function
+@set OR |
+@set RPREFIX RTEMS_
+@set DIRPREFIX rtems_
+@c the language is @value{LANGUAGE}
+@c NOTE: don't use underscore in the name
+@c
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage RTEMS ITRON 3.0 API User's Guide
+
+@setchapternewpage odd
+@settitle RTEMS ITRON 3.0 API User's Guide
+@titlepage
+@finalout
+
+@title RTEMS ITRON 3.0 User's Guide
+@subtitle Edition @value{EDITION}, for RTEMS @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include preface.texi
+@include task.texi
+@include tasksync.texi
+@include semaphore.texi
+@include eventflags.texi
+@include mailbox.texi
+@include msgbuffer.texi
+@include rendezvous.texi
+@include interrupt.texi
+@include memorypool.texi
+@include fixedblock.texi
+@include time.texi
+@include config.texi
+@include network.texi
+@include status.texi
+@ifinfo
+@node Top, , (dir), (dir)
+@top itron
+
+This is the online version of the RTEMS ITRON 3.0 API User's Guide.
+
+@menu
+* Preface::
+* Task Manager::
+* Task-Dependent Synchronization Manager::
+* Semaphore Manager::
+* Eventflags Manager::
+* Mailbox Manager::
+* Message Buffer Manager::
+* Rendezvous Manager::
+* Interrupt Manager::
+* Memory Pool Manager::
+* Fixed Block Manager::
+* Time Manager::
+* System Manager::
+* Network Support Manager::
+* ITRON Implementation Status::
+* Command and Variable Index::
+* Concept Index::
+@end menu
+
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@node Command and Variable Index, Concept Index, , Top
+@unnumbered Command and Variable Index
+
+There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@node Concept Index, , Command and Variable Index, Top
+@unnumbered Concept Index
+
+There are currently no Concept Index entries.
+@c @printindex cp
+
+@contents
+@bye
+
diff --git a/doc/itron3.0/mailbox.t b/doc/itron3.0/mailbox.t
new file mode 100644
index 0000000000..34746c743a
--- /dev/null
+++ b/doc/itron3.0/mailbox.t
@@ -0,0 +1,338 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c This is the chapter from the RTEMS ITRON User's Guide that
+@c documents the services provided by the mailbox
+@c manager.
+@c
+@c $Id$
+@c
+
+
+@chapter Mailbox Manager
+
+@section Introduction
+
+The
+mailbox manager is basically a linked list, hidden by the super core message queue and consists of a control block, a private structure. The control block comprises of the create mailbox structure, the message structure and the reference mailbox structure.
+
+The services provided by the mailbox manager are:
+
+@itemize @bullet
+@item @code{cre_mbx} - Create Mailbox
+@item @code{del_mbx} - Delete Mailbox
+@item @code{snd_msg} - Send Message to Mailbox
+@item @code{rcv_msg} - Receive Message from Mailbox
+@item @code{prcv_msg} - Poll and Receive Message from Mailbox
+@item @code{trcv_msg} - Receive Message from Mailbox with Timeout
+@item @code{ref_mbx} - Reference Mailbox Status
+@end itemize
+
+
+@section Background
+
+@section Operations
+
+@section System Calls
+
+This section details the mailbox manager's services.
+A subsection is dedicated to each of this manager's services
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+
+@c
+@c cre_mbx
+@c
+
+@page
+
+@subsection cre_mbx - Create Mailbox
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER cre_mbx(
+ ID mbxid,
+ T_CMBX *pk_cmbx
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal completion@*
+@code{E_NOMEM} - Insufficient memory@*
+@code{E_ID} - Invalid ID number@*
+@code{E_RSATR} - Reserved attribute@*
+@code{E_OBJ} - Invalid object state@*
+@code{E_OACV} - Object access violation@*
+@code{E_PAR} - Parameter error
+
+
+@subheading DESCRIPTION:
+
+Allocated a control area/buffer space for mailbox with some ID.
+
+@example
+ User area: +ve ids
+ System area: -ve ids
+@end example
+
+User may specify if its FIFO or priority level queue.
+Assumes shared memory b/w communicating processes.
+Initializes core message queue for this mbox.
+
+@subheading NOTES:
+
+NONE
+
+
+@c
+@c del_mbx
+@c
+
+@page
+
+@subsection del_mbx - Delete Mailbox
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER del_mbx(
+ ID mbxid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal completion@*
+@code{E_ID} - Invalid ID number@*
+@code{E_NOEXS} - Object does not exist@*
+@code{E_OACV} - Object access violation
+
+@subheading DESCRIPTION:
+
+Specified by the ID, cleans up all data structures and control blocks.
+
+@subheading NOTES:
+
+NONE
+
+
+@c
+@c snd_msg
+@c
+
+@page
+
+@subsection snd_msg - Send Message to Mailbox
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER snd_msg(
+ ID mbxid,
+ T_MSG *pk_msg
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal completion@*
+@code{E_ID} - Invalid ID number@*
+@code{E_NOEXS} - Object does not exist@*
+@code{E_OACV} - Object access violation@*
+@code{E_QOVR} - Queueing or nesting overflow
+
+@subheading DESCRIPTION:
+
+Sends the address of message to mbox having a given id, any waiting tasks (blocked tasks) will be woken up. It supports non-blocking send.
+
+@subheading NOTES:
+
+NONE
+
+
+@c
+@c rcv_msg
+@c
+
+@page
+
+@subsection rcv_msg - Receive Message from Mailbox
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER rcv_msg(
+ T_MSG **ppk_msg,
+ ID mbxid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal completion@*
+@code{E_ID} - Invalid ID number@*
+@code{E_NOEXS} - Object does not exist@*
+@code{E_OACV} - Object access violation@*
+@code{E_PAR} - Parameter error@*
+@code{E_DLT} - The object being waited for was deleted@*
+@code{E_RLWAI} - WAIT state was forcibly released@*
+@code{E_CTX} - Context error
+
+@subheading DESCRIPTION:
+
+If there is no message then receiver blocks, if not empty then it takes the first message of the queue.
+
+@subheading NOTES:
+
+NONE
+
+
+@c
+@c prcv_msg
+@c
+
+@page
+
+@subsection prcv_msg - Poll and Receive Message from Mailbox
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER prcv_msg(
+ T_MSG **ppk_msg,
+ ID mbxid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal completion@*
+@code{E_ID} - Invalid ID number@*
+@code{E_NOEXS} - Object does not exist@*
+@code{E_OACV} - Object access violation@*
+@code{E_PAR} - Parameter error@*
+@code{E_DLT} - The object being waited for was deleted@*
+@code{E_RLWAI} - WAIT state was forcibly released@*
+@code{E_CTX} - Context error@*
+
+@subheading DESCRIPTION:
+
+Poll and receive message from mailbox.
+
+@subheading NOTES:
+
+NONE
+
+
+@c
+@c trcv_msg
+@c
+
+@page
+
+@subsection trcv_msg - Receive Message from Mailbox with Timeout
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER trcv_msg(
+ T_MSG **ppk_msg,
+ ID mbxid,
+ TMO tmout
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal completion@*
+@code{E_ID} - Invalid ID number@*
+@code{E_NOEXS} - Object does not exist@*
+@code{E_OACV} - Object access violation@*
+@code{E_PAR} - Parameter error@*
+@code{E_DLT} - The object being waited for was deleted@*
+@code{E_RLWAI} - WAIT state was forcibly released@*
+@code{E_CTX} - Context error
+
+@subheading DESCRIPTION:
+
+Blocking receive with a maximum timeout.
+
+@subheading NOTES:
+
+NONE
+
+
+@c
+@c ref_mbx
+@c
+
+@page
+
+@subsection ref_mbx - Reference Mailbox Status
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ref_mbx(
+ T_RMBX *pk_rmbx,
+ ID mbxid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal completion@*
+@code{E_ID} - Invalid ID number@*
+@code{E_NOEXS} - Object does not exist@*
+@code{E_OACV} - Object access violation@*
+@code{E_PAR} - Parameter error
+
+@subheading DESCRIPTION:
+
+Supports non-blocking receive. If there are no messages, it returns -1. Also returns id of the next process waiting on a message.
+
+@subheading NOTES:
+
+NONE
+
+
diff --git a/doc/itron3.0/memorypool.t b/doc/itron3.0/memorypool.t
new file mode 100644
index 0000000000..013c3c30eb
--- /dev/null
+++ b/doc/itron3.0/memorypool.t
@@ -0,0 +1,401 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c This is the chapter from the RTEMS ITRON User's Guide that
+@c documents the services provided by the memory pool
+@c manager.
+@c
+@c $Id$
+@c
+
+@chapter Memory Pool Manager
+
+@section Introduction
+
+The
+memory pool manager is ...
+
+The services provided by the memory pool manager are:
+
+@itemize @bullet
+@item @code{cre_mpl} - Create Variable-Size Memorypool
+@item @code{del_mpl} - Delete Variable-Size Memorypool
+@item @code{get_blk} - Get Variable-Size Memory Block
+@item @code{pget_blk} - Poll and Get Variable-Size Memory Block
+@item @code{tget_blk} - Get Variable-Size Memory Block with Timeout
+@item @code{rel_blk} - Release Variable-Size Memory Block
+@item @code{ref_mpl} - Reference Variable-Size Memorypool Status
+@end itemize
+
+@section Background
+
+Memorypool management functions manage memorypools and allocate memory blocks.
+There are two types of memorypool: fixed-size memorypools and variable-size
+memorypools. Both are considered separate objects and require different
+system calls for manipulation. While the size of memory blocks allocated
+from fixed-size memorypools are all fixed, blocks of any size may be
+specified when allocating memory blocks from variable-size memorypools.
+
+@section Operations
+
+@section System Calls
+
+This section details the memory pool manager's services.
+A subsection is dedicated to each of this manager's services
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+
+@c
+@c cre_mpl
+@c
+
+@page
+@subsection cre_mpl - Create Variable-Size Memorypool
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER cre_mpl(
+ ID mplid,
+ T_CMPL *pk_cmpl
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_NOMEM} - Insufficient memory (Memory for control block and/or for
+memorypool cannot be allocated)
+
+@code{E_ID} - Invalid ID number (mplid was invalid or could not be used)
+
+@code{E_RSATR} - Reserved attribute (mplatr was invalid or could not be used)
+
+@code{E_OBJ} - Invalid object state (a memorypool of the same ID already exists)
+
+@code{E_OACV} - Object access violation (A mplid less than -4 was specified from
+a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (pk_cmpl is invalid or mplsz is negative or
+invalid)
+
+@subheading DESCRIPTION:
+
+The cre_mpl directive creates a variable-size memorypool having the ID number specified by mplid. Specifically, a memory area of the size determined by mplsz is allocated for use as a memorypool. A control block for the memorypool being created is also allocated. User memorypools have positive ID numbers, while system memorypools have negative ID numbers. User tasks (tasks having positive task IDs) cannot access system memorypools (memorypools having negative ID numbers).
+
+@subheading NOTES:
+
+The memory required for creating memorypools and for allocating control blocks for each object is reserved while system initialization. Associated parameters are therefore specified at system configuration.
+
+@c
+@c del_mpl
+@c
+
+@page
+@subsection del_mpl - Delete Variable-Size Memorypool
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER del_mpl(
+ ID mplid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (mplid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the memorypool specified by mplid does not exist)
+
+@code{E_OACV} - Object access violation (A mplid less than -4 was specified from
+a user task. This is implementation dependent.)
+
+@subheading DESCRIPTION:
+
+This system call deletes the variable-size memorypool specified by mplid. No check or error report is performed even if there are tasks using memory from the memorypool to be deleted. This system call completes normally even if some of the memory blocks are not returned. Issuing this system call causes memory used for the control block of the associated memorypool and the memory area making up the memorypool itself to be released. After this system call is invoked, another memorypool having the same ID number can be created.
+
+@subheading NOTES:
+
+When a memorypool being waited for by more than one tasks is deleted, the order of tasks on the ready queue after the WAIT state is cleared is implementation dependent in the case of tasks having the same priority.
+
+@c
+@c get_blk
+@c
+
+@page
+@subsection get_blk - Get Variable-Size Memory Block
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER get_blk(
+ VP *p_blk,
+ ID mplid,
+ INT blksz
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (mplid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the memorypool specified by mplid does not exist)
+
+@code{E_OACV} - Object access violation (A mplid less than -4 was specified from
+a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (tmout is -2 or less, blksz is negative or invalid)
+
+@code{E_DLT} - The object being waited for was deleted (the specified memorypool
+was deleted while waiting)
+
+@code{E_RLWAI} - WAIT state was forcibly released (rel_wai was received while
+waiting)
+
+@code{E_TMOUT} - Polling failure or timeout
+
+@code{E_CTX} - Context error (issued from task-independent portions or a
+task in dispatch disabled state; implementation dependent for
+pget_blk and tget_blk(tmout=TMO_POL))
+
+@subheading DESCRIPTION:
+
+A memory block of the size in bytes given by blksz is allocated from the variable-size memorypool specified by mplid. The start address of the memory block allocated is returned in blk. The allocated memory block is not cleared to zero. The contents of the memory block allocated are undefined. If the memory block cannot be obtained from the specified memorypool when get_blk is issued, the task issuing get_blk will be placed on the memory allocation queue of the specified memorypool, and wait until it can get the memory it requires.
+
+The order in which tasks wait on the queue when waiting to be allocated memory blocks is according to either FIFO or task priority. The specification whereby tasks wait according to task priority is considered an extended function [level X] for which compatibility is not guaranteed. Furthermore, when tasks form a memory allocation queue, it is implementation dependent whether priority is given to tasks requesting the smaller size of memory or those at the head of the queue.
+
+@subheading NOTES:
+
+Pget_blk and get_blk represent the same processing as specifying certain values (TMO_POL or TMO_FEVR) to tget_blk for tmout. It is allowed that only tget_blk is implemented in the kernel and that pget_blk and get_blk are implemented as macros which call tget_blk.
+
+@c
+@c pget_blk
+@c
+
+@page
+@subsection pget_blk - Poll and Get Variable-Size Memory Block
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ercd =pget_blk(
+ VP *p_blk,
+ ID mplid,
+ INT blksz
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (mplid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the memorypool specified by mplid does not exist)
+
+@code{E_OACV} - Object access violation (A mplid less than -4 was specified from
+a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (tmout is -2 or less, blksz is negative or invalid)
+
+@code{E_DLT} - The object being waited for was deleted (the specified memorypool
+was deleted while waiting)
+
+@code{E_RLWAI} - WAIT state was forcibly released (rel_wai was received while
+waiting)
+
+@code{E_TMOUT} - Polling failure or timeout
+
+@code{E_CTX} - Context error (issued from task-independent portions or a
+task in dispatch disabled state; implementation dependent for
+pget_blk and tget_blk(tmout=TMO_POL))
+
+@subheading DESCRIPTION:
+
+The pget_blk system call has the same function as get_blk except for the waiting feature. Pget_blk polls whether or not the task should wait if get_blk is executed. The meaning of parameters to pget_blk are the same with get_blk. The specific operations by pget_blk are as follows.
+
+ - If there is enough free memory to get the memory block of specified size
+ immediately, processing is the same as get_blk: that is, the
+ requested memory is allocated and the system call completes normally.
+
+ - If there is not enough free memory, an E_TMOUT error is returned to
+ indicate polling failed and the system call finishes. Unlike get_blk,
+ the issuing task does not wait in this case. Also, the issuing task
+ does not get any memory.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c tget_blk
+@c
+
+@page
+@subsection tget_blk - Get Variable-Size Memory Block with Timeout
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ercd =tget_blk(
+ VP *p_blk,
+ ID mplid,
+ INT blksz,
+ TMO tmout
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (mplid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the memorypool specified by mplid does not exist)
+
+@code{E_OACV} - Object access violation (A mplid less than -4 was specified from
+a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (tmout is -2 or less, blksz is negative or invalid)
+
+@code{E_DLT} - The object being waited for was deleted (the specified memorypool
+was deleted while waiting)
+
+@code{E_RLWAI} - WAIT state was forcibly released (rel_wai was received while
+waiting)
+
+@code{E_TMOUT} - Polling failure or timeout
+
+@code{E_CTX} - Context error (issued from task-independent portions or a
+task in dispatch disabled state; implementation dependent for
+pget_blk and tget_blk(tmout=TMO_POL))
+
+
+@subheading DESCRIPTION:
+
+The tget_blk system call has the same function as get_blk with an additional timeout feature. A maximum wait time (timeout value) can be specified using the parameter tmout. When a timeout is specified, a timeout error, E_TMOUT, will result and the system call will finish if the period specified by tmout elapses without conditions for releasing wait being satisfied (i.e. without sufficient free memory becoming available).
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c rel_blk
+@c
+
+@page
+@subsection rel_blk - Release Variable-Size Memory Block
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER rel_blk(
+ ID mplid,
+ VP blk
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (mplid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the memorypool specified by mplid does not exist)
+
+@code{E_OACV} - Object access violation (A mplid less than -4 was specified from
+ a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (blk is invalid or an attempt was made to return
+the memory block to the wrong memorypool)
+
+@subheading DESCRIPTION:
+
+This system call releases the memory block specified by blk and returns it to the variable-size memorypool specified by mplid. Executing rel_blk allows memory to be allocated to the next task waiting for memory allocation from the memorypool given by mplid, thus releasing that task from its WAIT state. The variable-size memorypool to which the memory block is returned must be the same memorypool from which it was originally allocated. An E_PAR error will result if an attempt is made to return a memory block to another memorypool than that from which it was originally allocated.
+
+@subheading NOTES:
+
+When memory is returned to a variable-size memorypool for which more than one task is waiting, multiple tasks may be released from waiting at the same time depending on the number of bytes of memory. The order of tasks on the ready queue among tasks having the same priority after being released from waiting for memory is implementation dependent.
+
+@c
+@c ref_mpl
+@c
+
+@page
+@subsection ref_mpl - Reference Variable-Size Memorypool Status
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ref_mpl(
+ T_RMPL *pk_rmpl,
+ ID mplid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (mplid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the memorypool specified by mplid does not exist)
+
+@code{E_OACV} - Object access violation (A mplid less than -4 was specified from
+a user task. This is implementation dependent.) Note: User tasks can issue ref_mpl in order to reference memorypools of mplid = TMPL_OS = -4. Whether or not memorypools of mplid = -3 or -2 may be specified to ref_mpl by user tasks is implementation dependent.
+
+@code{E_PAR} - Parameter error (the packet address for the return parameters
+could not be used)
+
+@subheading DESCRIPTION:
+
+This system call refers to the state of the variable-size memorypool specified by mplid, and returns the total free memory size currently available (frsz), the maximum continuous memory size of readily available free memory (maxsz), information of a task waiting to be allocated memory (wtsk), and its extended information (exinf). Wtsk indicates, whether or not there is a task waiting to be allocated memory from the variable-size memorypool specified. If there is no waiting task, wtsk is returned as FALSE = 0. If there is a waiting task, wtsk is returned as a value other than 0.
+
+@subheading NOTES:
+
+In some implementations, memorypools having mplid = -3 or -2 may be referred with ref_mpl as memorypools used by implementation-dependent parts of the OS (such as those used for the stack only). This system call can provide more detailed information regarding remaining memory if the usage of memorypools having mplid = -3 or -2 is more clearly defined. Whether or not this feature is used and any details regarding information provided are implementation dependent.
+
diff --git a/doc/itron3.0/msgbuffer.t b/doc/itron3.0/msgbuffer.t
new file mode 100644
index 0000000000..fa0704191c
--- /dev/null
+++ b/doc/itron3.0/msgbuffer.t
@@ -0,0 +1,826 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c This is the chapter from the RTEMS ITRON User's Guide that
+@c documents the services provided by the message buffer
+@c manager.
+@c
+@c $Id$
+@c
+
+@chapter Message Buffer Manager
+
+@section Introduction
+
+The message buffer manager provides functions to create, delete, and
+control of message buffers. This manager is based on the ITRON 3.0
+standard.
+
+The services provided by the message buffer manager are:
+
+@itemize @bullet
+@item @code{cre_mbf} - Create MessageBuffer
+@item @code{del_mbf} - Delete MessageBuffer
+@item @code{snd_mbf} - Send Message to MessageBuffer
+@item @code{psnd_mbf} - Poll and Send Message to MessageBuffer
+@item @code{tsnd_mbf} - Send Message to MessageBuffer with Timeout
+@item @code{rcv_mbf} - Receive Message from MessageBuffer
+@item @code{prcv_mbf} - Poll and Receive Message from MessageBuffer
+@item @code{trcv_mbf} - Receive Message from MessageBuffer with Timeout
+@item @code{ref_mbf} - Reference MessageBuffer Status
+@end itemize
+
+@section Background
+
+@subsection T_CMBF Structure
+
+The T_CMBF structure is used to define the characteristics of a message
+buffer and passed as an argument to the @code{cre_mbf} routine. This
+structure is defined as:
+
+@example
+@group
+
+typedef struct t_cmbf @{
+ VP exinf; /* extended information */
+ ATR mbfatr; /* message buffer attributes */
+ INT bufsz; /* buffer size (in bytes) */
+ INT maxmsz; /* maximum message size (in bytes) */
+ /* (CPU and/or implementation-dependent information may also be
+ included) */
+@} T_CMBF;
+
+@end group
+@end example
+
+where the meaning of each field is:
+
+@table @b
+@item exinf
+is for any extended information that the implementation may define. This
+implementation does not use this field.
+
+@item mbfatr
+is the attributes for the message buffer. The only attributes which can
+be specified is whether tasks wait in FIFO (@code{TA_TFIFO}) or priority
+(@code{TA_TPRI}) order.
+
+@item bufsz
+is the size of the message buffer. Since some control data are needed to
+manage each messages in the message buffer, @code{bufsz} is usually
+larger than the total of all message sizes in this buffer.
+
+@item maxmsz
+is the maximum message size.
+
+@end table
+
+@subsection T_RMBF Structure
+
+The T_RMBF structure is filled in by the @code{ref_mbf} routine with
+status and state information of the message buffer. The structure is
+defined as follows:
+
+@example
+@group
+
+typedef struct t_rmbf @{
+ VP exinf; /* extended information */
+ BOOL_ID wtsk; /* waiting task information */
+ BOOL_ID stsk; /* sending task information */
+ INT msgsz; /* message size (in bytes) */
+ INT frbufsz; /* free buffer size (in bytes) */
+ /* (CPU and/or implementation-dependent information is returned) */
+@} T_RMBF;
+
+@end group
+@end example
+
+@table @b
+
+@item exinf
+is for any extended information that the implementation may define.
+This implementation does not use this field.
+
+@item wtsk
+is TRUE when there is one or more tasks waiting on this message buffer
+to send message. It is FALSE when there is no waiting task. The meaning
+of this field is allowed to vary between ITRON implementations. It may
+have the ID of a waiting task, the number of tasks waiting, or a boolean
+indication that one or more tasks are waiting.
+
+@item stsk
+is TRUE when there is one or more tasks waiting on this message buffer
+to receive message. It is FALSE when there is no waiting task. The meaning
+of this field is allowed to vary between ITRON implementations. It may
+have the ID of a waiting task, the number of tasks waiting, or a boolean
+indication that one or more tasks are waiting.
+
+@item msgsz
+is the size of the message that is at the head of the message buffer. If
+there is no message on the message queue, @code{msgsz} will be returned
+as FALSE = 0.
+
+@item frbufsz
+is the amount of free memory in the message buffer.
+
+@end table
+
+@section Operations
+
+@section System Calls
+
+This section details the message buffer manager's services.
+A subsection is dedicated to each of this manager's services
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@c
+@c cre_mbf
+@c
+
+@page
+@subsection cre_mbf - Create MessageBuffer
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER cre_mbf(
+ ID mbfid,
+ T_CMBF *pk_cmbf
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_NOMEM} - Insufficient memory (Memory for control block and/or
+ring buffer cannot be allocted)
+
+@code{E_ID} - Invalid ID number (mbfid was invalid or could not be used)
+
+@code{E_RSATR} - Reserved attribute (mbfatr was invalid or could not be
+used)
+
+@code{E_OBJ} - Invalid object state (a messagebuffer of the same ID
+already exists)
+
+@code{E_OACV} - Object access violation (A mbfid less than -4 was
+specified from a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (pk_cmbf is invalid or bufsz and/or
+maxmsz is negative or invalid)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the
+target node is specified.
+
+
+@code{EN_CTXID} - Specified an object on another node when the system
+call was issued from a task in dispatch disabled state or from a
+task-independent portion
+
+@code{EN_PAR} - A value outside the range supported by the target node
+and/or transmission packet format was specified as a parameter (a value
+outside supported range was specified for exinf, mbfatr, bufsz and/or
+maxmsz)
+
+@subheading DESCRIPTION:
+
+This routine creates a message buffer on the local node. The message
+buffer is initialized based on the attributes specified in the
+@code{pk_cmbf} structure. The buffer size and the maximum message size
+are determined by the @code{bufsz} and @code{maxmsz} fields in this
+structure.
+
+The @code{mbfatr} field represents attributes of the message
+buffer. If @code{TA_TFIFO} is specified, tasks will be put on the queue
+on a First In-First Out basis. If @code{TA_TPRI} is specified, tasks
+will be placed on the queue according to their priority.
+
+@subheading NOTES:
+
+Multiprocessing is not supported. Thus none of the "EN_" status codes
+will be returned.
+
+@c
+@c del_mbf
+@c
+
+@page
+@subsection del_mbf - Delete MessageBuffer
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER del_mbf(
+ ID mbfid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (mbfid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the messagebuffer specified by
+mbfid does not exist)
+
+@code{E_OACV} - Object access violation (A mbfid less than -4 was
+specified from a user task. This is implementation dependent.)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the
+target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system
+call was issued from a task in dispatch disabled state or from a
+task-independent portion
+
+@subheading DESCRIPTION:
+
+This routine deletes the message buffer specified by @code{mbfid}.
+Issuing this system call releases memory area used for the control block of
+the associated message buffer and the buffer area used for storing messages.
+
+This routine will complete normally even if there are tasks waiting to
+send or receive messages at the message buffer. In that case, an
+@code{E_DLT} error will be returned to each waiting task. If there are
+messages still in the message buffer, they will be deleted along with
+the message buffer and no error will result.
+
+@subheading NOTES:
+
+Multiprocessing is not supported. Thus none of the "EN_" status codes
+will be returned.
+
+@c
+@c snd_mbf
+@c
+
+@page
+@subsection snd_mbf - Send Message to Message Buffer
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER snd_mbf(
+ ID mbfid,
+ VP msg,
+ INT msgsz
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (mbfid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the message buffer specified by
+mbfid does not exist)
+
+@code{E_OACV} - Object access violation (A mbfid less than -4 was
+specified from a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (msgsz is 0 or less; msgsz is larger than
+maxmsz; values unsuitable for msg; tmout is -2 or less)
+
+@code{E_DLT} - The object being waited for was deleted (the
+message buffer of interest was deleted while waiting)
+
+@code{E_RLWAI} - WAIT state was forcibly released (rel_wai was received
+while waiting)
+
+@code{E_CTX} - Context error (issued from task-independent portions or a
+task in dispatch disabled state; implementation dependent for psnd_mbf
+and tsnd_mbf(tmout=TMO_POL))
+
+@code{EN_OBJNO} - An object number which could not be accessed on the
+target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system
+call was issued from a task in dispatch disabled state or from a
+task-independent portion (implementation-dependent; applicable to
+psnd_mbf and tsnd_mbf (tmout=TMO_POL) only)
+
+@code{EN_PAR} - A value outside the range supported by the target node
+and/or transmission packet format was specified as a parameter (a value
+outside supported range was specified for msgsz and/or tmout)
+
+@subheading DESCRIPTION:
+
+This routine sends the message stored at the address given by @code{msg}
+to the message buffer specified by @code{mbfid}. The size of the
+message is specified by @code{msgsz}; that is, @code{msgsz} number of
+bytes beginning from @code{msg} are copied to the message buffer
+specified by @code{mbfid}. If the available space in the buffer is not
+enough to include the message given by @code{msg}, the task issuing this
+system call will wait on a send wait queue until more buffer space
+becomes available.
+
+@subheading NOTES:
+
+Multiprocessing is not supported. Thus none of the "EN_" status codes
+will be returned.
+
+@c
+@c psnd_mbf
+@c
+
+@page
+@subsection psnd_mbf - Poll and Send Message to Message Buffer
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ercd =psnd_mbf(
+ ID mbfid,
+ VP msg,
+ INT msgsz
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (mbfid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the message buffer specified by
+mbfid does not exist)
+
+@code{E_OACV} - Object access violation (A mbfid less than -4 was
+specified from a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (msgsz is 0 or less; msgsz is larger than
+maxmsz; values unsuitable for msg; tmout is -2 or less)
+
+@code{E_DLT} - The object being waited for was deleted (the
+message buffer of interest was deleted while waiting)
+
+@code{E_RLWAI} - WAIT state was forcibly released (rel_wai was received
+while waiting)
+
+@code{E_TMOUT} - Polling failure or timeout
+
+@code{E_CTX} - Context error (issued from task-independent portions or a
+task in dispatch disabled state; implementation dependent for psnd_mbf
+and tsnd_mbf(tmout=TMO_POL))
+
+@code{EN_OBJNO} - An object number which could not be accessed on the
+target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system
+call was issued from a task in dispatch disabled state or from a
+task-independent portion (implementation-dependent; applicable to
+psnd_mbf and tsnd_mbf (tmout=TMO_POL) only)
+
+@code{EN_PAR} - A value outside the range supported by the target node
+and/or transmission packet format was specified as a parameter (a value
+outside supported range was specified for msgsz and/or tmout)
+
+@subheading DESCRIPTION:
+
+This routine has the same function as @code{snd_mbf} except for the
+waiting feature. @code{Psnd_mbf} polls whether or not the task should
+wait if @code{snd_mbf} is executed. The meaning of parameters to
+@code{psnd_mbf} are the same as for @code{snd_mbf}. The specific
+operations by @code{psnd_mbf} are as follows.
+
+ - If there is enough space in the buffer, processing is the same as
+ @code{snd_mbf}: the message is sent and the system call completes
+ normally.
+
+ - If there is not enough space in the buffer, an @code{E_TMOUT} error
+ is returned to indicate polling failed and the system call finishes.
+ Unlike @code{snd_mbf}, the issuing task does not wait in this case.
+ The status of the message buffer and the message queue remain unchanged.
+
+@subheading NOTES:
+
+Multiprocessing is not supported. Thus none of the "EN_" status codes
+will be returned.
+
+@c
+@c tsnd_mbf
+@c
+
+@page
+@subsection tsnd_mbf - Send Message to Message Buffer with Timeout
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ercd =tsnd_mbf(
+ ID mbfid,
+ VP msg,
+ INT msgsz,
+ TMO tmout
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (mbfid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the message buffer specified by
+mbfid does not exist)
+
+@code{E_OACV} - Object access violation (A mbfid less than -4 was
+specified from a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (msgsz is 0 or less; msgsz is larger than
+maxmsz; values unsuitable for msg; tmout is -2 or less)
+
+@code{E_DLT} - The object being waited for was deleted (the
+message buffer of interest was deleted while waiting)
+
+@code{E_RLWAI} - WAIT state was forcibly released (rel_wai was received
+while waiting)
+
+@code{E_TMOUT} - Polling failure or timeout
+
+@code{E_CTX} - Context error (issued from task-independent portions or a
+task in dispatch disabled state; implementation dependent for psnd_mbf
+and tsnd_mbf(tmout=TMO_POL))
+
+@code{EN_OBJNO} - An object number which could not be accessed on the
+target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system
+call was issued from a task in dispatch disabled state or from a
+task-independent portion (implementation-dependent; applicable to
+psnd_mbf and tsnd_mbf (tmout=TMO_POL) only)
+
+@code{EN_PAR} - A value outside the range supported by the target node
+and/or transmission packet format was specified as a parameter (a value
+outside supported range was specified for msgsz and/or tmout)
+
+@subheading DESCRIPTION:
+
+The @code{tsnd_mbf} system call has the same function as @code{snd_mbf}
+with an additional timeout feature. A maximum wait time (timeout value)
+can be specified using the parameter @code{tmout}. When a timeout is
+specified, a timeout error, @code{E_TMOUT}, will result and the system
+call will finish if the period specified by @code{tmout} elapses without
+conditions for releasing wait being satisfied (i.e. without sufficient
+buffer space becoming available).
+
+Only positive values can be specified for @code{tmout}. Specifying
+@code{TMO_POL} = 0 to @code{tsnd_mbf} for @code{tmout} indicates that a
+timeout value of 0 be used, resulting in exactly the same processing as
+@code{psnd_mbf}. Specifying @code{TMO_FEVR} = -1 to @code{tsnd_mbf} for
+@code{tmout} indicates that an infinite timeout value be used, resulting
+in exactly the same processing as @code{snd_mbf}.
+
+@subheading NOTES:
+
+Multiprocessing is not supported. Thus none of the "EN_" status codes
+will be returned.
+
+
+@c
+@c rcv_mbf
+@c
+
+@page
+@subsection rcv_mbf - Receive Message from Message Buffer
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER rcv_mbf(
+ VP msg,
+ INT *p_msgsz,
+ ID mbfid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (mbfid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the message buffer specified by
+mbfid does not exist)
+
+@code{E_OACV} - Object access violation (A mbfid less than -4 was
+specified from a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (values unsuitable for msg; tmout is -2
+or less)
+
+@code{E_DLT} - The object being waited for was deleted (the specified
+message buffer was deleted while waiting)
+
+@code{E_RLWAI} - WAIT state was forcibly released (rel_wai was received
+while waiting)
+
+@code{E_CTX} - Context error (issued from task-independent portions or a
+task in dispatch disabled state)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the
+target node is specified.
+
+@code{EN_PAR} - A value outside the range supported by the target node
+and/or transmission packet format was specified as a parameter (a value
+outside supported range was specified for tmout)
+
+@code{EN_RPAR} - A value outside the range supported by the issuing node
+and/or transmission packet format was returned as a return parameter (msgsz is outside supported range for requesting node)
+
+@subheading DESCRIPTION:
+
+@code{Rcv_mbf} receives the message from the message buffer specified by
+@code{mbfid}, and stores it at the memory location given by @code{msg}.
+In other words, the content of the message at the head of the message
+buffer specified by @code{mbfid} is copied into an area which begins
+from @code{msg} and whose size is @code{msgsz}.
+
+If the message buffer is empty, the task issuing this system call will wait
+on a receive message wait queue until a message arrives.
+
+@subheading NOTES:
+
+Multiprocessing is not supported. Thus none of the "EN_" status codes
+will be returned.
+
+
+@c
+@c prcv_mbf
+@c
+
+@page
+@subsection prcv_mbf - Poll and Receive Message from Message Buffer
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ercd =prcv_mbf(
+ VP msg,
+ INT *p_msgsz,
+ ID mbfid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (mbfid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the message buffer specified by
+mbfid does not exist)
+
+@code{E_OACV} - Object access violation (A mbfid less than -4 was
+specified from a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (values unsuitable for msg; tmout is -2
+or less)
+
+@code{E_DLT} - The object being waited for was deleted (the specified
+message buffer was deleted while waiting)
+
+@code{E_RLWAI} - WAIT state was forcibly released (rel_wai was received
+while waiting)
+
+@code{E_TMOUT} - Polling failure or timeout
+
+@code{E_CTX} - Context error (issued from task-independent portions or a
+task in dispatch disabled state)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the
+target node is specified.
+
+@code{EN_PAR} - A value outside the range supported by the target node
+and/or transmission packet format was specified as a parameter (a value
+outside supported range was specified for tmout)
+
+@code{EN_RPAR} - A value outside the range supported by the issuing node
+and/or transmission packet format was returned as a return parameter (msgsz is outside supported range for requesting node)
+
+
+@subheading DESCRIPTION:
+The @code{prcv_mbf} system call has the same function as @code{rcv_mbf}
+except for the waiting feature. @code{Prcv_mbf} polls whether or not
+the task should wait if @code{rcv_mbf} is executed. The meaning of
+parameters to @code{prcv_mbf} are the same as for @code{rcv_mbf}. The
+specific operations by @code{prcv_mbf} are as follows.
+
+ - If there is a message in the specified message buffer, processing is
+the same as @code{rcv_mbf}: the first message on the message buffer is
+retrieved and the system call completes normally.
+
+ - If there is no message in the specified message buffer, an
+@code{E_TMOUT} error is returned to indicate polling failed and the
+system call finishes. Unlike @code{rcv_mbf}, the issuing task does not
+wait in this case. The status of the message buffer remain unchanged.
+
+@subheading NOTES:
+
+Multiprocessing is not supported. Thus none of the "EN_" status codes
+will be returned.
+
+
+@c
+@c trcv_mbf
+@c
+
+@page
+@subsection trcv_mbf - Receive Message from Message Buffer with Timeout
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ercd =trcv_mbf(
+ VP msg,
+ INT *p_msgsz,
+ ID mbfid,
+ TMO tmout
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (mbfid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the message buffer specified by
+mbfid does not exist)
+
+@code{E_OACV} - Object access violation (A mbfid less than -4 was
+specified from a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (values unsuitable for msg; tmout is -2
+or less)
+
+@code{E_DLT} - The object being waited for was deleted (the specified
+message buffer was deleted while waiting)
+
+@code{E_RLWAI} - WAIT state was forcibly released (rel_wai was received
+while waiting)
+
+@code{E_TMOUT} - Polling failure or timeout
+
+@code{E_CTX} - Context error (issued from task-independent portions or a
+task in dispatch disabled state)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the
+target node is specified.
+
+@code{EN_PAR} - A value outside the range supported by the target node
+and/or transmission packet format was specified as a parameter (a value
+outside supported range was specified for tmout)
+
+@code{EN_RPAR} - A value outside the range supported by the issuing node
+and/or transmission packet format was returned as a return parameter (msgsz is outside supported range for requesting node)
+
+@subheading DESCRIPTION:
+The @code{trcv_mbf} system call has the same function as @code{rcv_mbf}
+with an additional timeout feature. A maximum wait time (timeout value)
+can be specified using the parameter @code{tmout}. When a timeout is
+specified, a timeout error, @code{E_TMOUT}, will result and the system
+call will finish if the period specified by @code{tmout} elapses without
+conditions for releasing wait being satisfied (i.e. without a message
+arriving).
+
+Only positive values can be specified for @code{tmout}. Specifying
+@code{TMO_POL} = 0 to @code{trcv_mbf} for @code{tmout} indicates that a
+timeout value of 0 be used, resulting in exactly the same processing as
+@code{prcv_mbf}. Specifying @code{TMO_FEVR} = -1 to @code{trcv_mbf} for
+tmout indicates that an infinite timeout value be used, resulting in
+exactly the same processing as @code{rcv_mbf}.
+
+@subheading NOTES:
+
+Multiprocessing is not supported. Thus none of the "EN_" status codes
+will be returned.
+
+@c
+@c ref_mbf
+@c
+
+@page
+@subsection ref_mbf - Reference Message Buffer Status
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ref_mbf(
+ T_RMBF *pk_rmbf,
+ ID mbfid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (mbfid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the message buffer specified by
+mbfid does not exist)
+
+@code{E_OACV} - Object access violation (A mbfid less than -4 was
+specified from a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (the packet address for the return
+parameters could not be used)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the
+target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system
+call was issued from a task in dispatch disabled state or from a
+task-independent portion
+
+@code{EN_RPAR} - A value outside the range supported by the issuing node
+and/or transmission packet format was returned as a return parameter (a
+value outside supported range for exinf, wtsk, stsk, msgsz and/or
+frbufsz on a requesting node)
+
+@subheading DESCRIPTION:
+This system call refers to the state of the message buffer specified by
+@code{mbfid}, and returns information of a task waiting to send a
+message (@code{stsk}), the size of the next message to be received
+(@code{msgsz}), the free buffer size (@code{frbufsz}), information of a
+task waiting to receive a message (@code{wtsk}), and its extended
+information (@code{exinf}).
+
+@code{Wtsk} and @code{stsk} indicate whether or not there is a task
+waiting for the message buffer in question. If there is no waiting
+task, @code{wtsk} and @code{stsk} are returned as @code{FALSE} = 0. If
+there is a waiting task, @code{wtsk} and @code{stsk} are returned as
+values other than 0.
+
+An @code{E_NOEXS} error will result if the message buffer specified to
+@code{ref_mbf} does not exist.
+
+The size of the message at the head of the message buffer (the next
+message to be received) is returned to @code{msgsz}. If there are no
+messages on the message buffer, @code{msgsz} will be returned as
+@code{FALSE} = 0. A message whose size is zero cannot be sent.
+
+At least one of @code{msgsz} = @code{FALSE} and @code{wtsk} =
+@code{FALSE} is always true in this system call.
+
+@code{Frbufsz} indicates the amount of free memory in the message
+buffer. This value can be used to know the total approximate size of
+the messages which can be sent to the message buffer.
+
+@subheading NOTES:
+
+Multiprocessing is not supported. Thus none of the "EN_" status codes
+will be returned.
diff --git a/doc/itron3.0/network.t b/doc/itron3.0/network.t
new file mode 100644
index 0000000000..0277a587d0
--- /dev/null
+++ b/doc/itron3.0/network.t
@@ -0,0 +1,162 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c This is the chapter from the RTEMS ITRON User's Guide that
+@c documents the services provided by the network support
+@c manager.
+@c
+@c $Id$
+@c
+
+@chapter Network Support Manager
+
+@section Introduction
+
+The
+network support manager is ...
+
+The services provided by the network support manager are:
+
+@itemize @bullet
+@item @code{nrea_dat} - Read Data from another Node
+@item @code{nwri_dat} - Write Data to another Node
+@item @code{nget_nod} - Get Local Node Number
+@item @code{nget_ver} - Get Version Information of another Node
+@end itemize
+
+@section Background
+
+@section Operations
+
+@section System Calls
+
+This section details the network support manager's services.
+A subsection is dedicated to each of this manager's services
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+
+@c
+@c nrea_dat
+@c
+
+@page
+@subsection nrea_dat - Read Data from another Node
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER nrea_dat(
+ INT *p_reasz,
+ VP dstadr,
+ NODE srcnode,
+ VP srcadr,
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c nwri_dat
+@c
+
+@page
+@subsection nwri_dat - Write Data to another Node
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER nwri_dat(
+ INT *p_wrisz,
+ NODE dstnode,
+ VP dstadr,
+ VP srcadr,
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c nget_nod
+@c
+
+@page
+@subsection nget_nod - Get Local Node Number
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER nget_nod(
+ NODE *p_node
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c nget_ver
+@c
+
+@page
+@subsection nget_ver - Get Version Information of another Node
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER nget_ver(
+ T_VER *pk_ver,
+ NODE node
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
diff --git a/doc/itron3.0/preface.texi b/doc/itron3.0/preface.texi
new file mode 100644
index 0000000000..ce8bac0904
--- /dev/null
+++ b/doc/itron3.0/preface.texi
@@ -0,0 +1,14 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Preface, , Top, Top
+@end ifinfo
+@unnumbered Preface
+
+There needs to be a preface to this manual.
diff --git a/doc/itron3.0/rendezvous.t b/doc/itron3.0/rendezvous.t
new file mode 100644
index 0000000000..1ba4fa93ca
--- /dev/null
+++ b/doc/itron3.0/rendezvous.t
@@ -0,0 +1,395 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c This is the chapter from the RTEMS ITRON User's Guide that
+@c documents the services provided by the rendezvous
+@c manager.
+@c
+@c $Id$
+@c
+
+@chapter Rendezvous Manager
+
+@section Introduction
+
+The
+rendezvous manager is ...
+
+The services provided by the rendezvous manager are:
+
+@itemize @bullet
+@item @code{cre_por} - Create Port for Rendezvous
+@item @code{del_por} - Delete Port for Rendezvous
+@item @code{cal_por} - Call Port for Rendezvous
+@item @code{pcal_por} - Poll and Call Port for Rendezvous
+@item @code{tcal_por} - Call Port for Rendezvous with Timeout
+@item @code{acp_por} - Accept Port for Rendezvous
+@item @code{pacp_por} - Poll and Accept Port for Rendezvous
+@item @code{tacp_por} - Accept Port for Rendezvous with Timeout
+@item @code{fwd_por} - Forward Rendezvous to Other Port
+@item @code{rpl_rdv} - Reply Rendezvous
+@item @code{ref_por} - Reference Port Status
+@end itemize
+
+@section Background
+
+@section Operations
+
+@section System Calls
+
+This section details the rendezvous manager's services.
+A subsection is dedicated to each of this manager's services
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+
+@c
+@c cre_por
+@c
+
+@page
+@subsection cre_por - Create Port for Rendezvous
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER cre_por(
+ ID porid,
+ T_CPOR *pk_cpor
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c del_por
+@c
+
+@page
+@subsection del_por - Delete Port for Rendezvous
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER del_por(
+ ID porid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c cal_por
+@c
+
+@page
+@subsection cal_por - Call Port for Rendezvous Poll
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER cal_por(
+ VP msg,
+ INT *p_rmsgsz,
+ ID porid,
+ UINT calptn
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c pcal_por
+@c
+
+@page
+@subsection pcal_por - Poll and Call Port for Rendezvous
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ercd =pcal_por(
+ VP msg,
+ INT *p_rmsgsz,
+ ID porid,
+ UINT calptn,
+ INT
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c tcal_por
+@c
+
+@page
+@subsection tcal_por - Call Port for Rendezvous with Timeout
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ercd =tcal_por(
+ VP msg,
+ INT *p_rmsgsz,
+ ID porid,
+ UINT calptn,
+ INT
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c acp_por
+@c
+
+@page
+@subsection acp_por - Accept Port for Rendezvous Poll
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER acp_por(
+ RNO *p_rdvno,
+ VP msg,
+ INT *p_cmsgsz,
+ ID porid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c pacp_por
+@c
+
+@page
+@subsection pacp_por - Poll and Accept Port for Rendezvous
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ercd =pacp_por(
+ RNO *p_rdvno,
+ VP msg,
+ INT *p_cmsgsz,
+ ID porid,
+ UINT
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c tacp_por
+@c
+
+@page
+@subsection tacp_por - Accept Port for Rendezvous with Timeout
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ercd =tacp_por(
+ RNO *p_rdvno,
+ VP msg,
+ INT *p_cmsgsz,
+ ID porid,
+ UINT
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c fwd_por
+@c
+
+@page
+@subsection fwd_por - Forward Rendezvous to Other Port
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER fwd_por(
+ ID porid,
+ UINT calptn,
+ RNO rdvno,
+ VP msg,
+ INT cmsgsz
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c rpl_rdv
+@c
+
+@page
+@subsection rpl_rdv - Reply Rendezvous
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER rpl_rdv(
+ RNO rdvno,
+ VP msg,
+ INT rmsgsz
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c ref_por
+@c
+
+@page
+@subsection ref_por - Reference Port Status
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ref_por(
+ T_RPOR *pk_rpor,
+ ID porid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
diff --git a/doc/itron3.0/semaphore.t b/doc/itron3.0/semaphore.t
new file mode 100644
index 0000000000..380e72d07e
--- /dev/null
+++ b/doc/itron3.0/semaphore.t
@@ -0,0 +1,642 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c This is the chapter from the RTEMS ITRON User's Guide that
+@c documents the services provided by the semaphore
+@c manager.
+@c
+@c $Id$
+@c
+
+@chapter Semaphore Manager
+
+@section Introduction
+
+The semaphore manager provides functions to allocate, delete, and
+control counting semaphores. This manager is based on the
+ITRON 3.0 standard.
+
+The services provided by the semaphore manager are:
+
+@itemize @bullet
+@item @code{cre_sem} - Create Semaphore
+@item @code{del_sem} - Delete Semaphore
+@item @code{sig_sem} - Signal Semaphore
+@item @code{wai_sem} - Wait on Semaphore
+@item @code{preq_sem} - Poll and Request Semaphore
+@item @code{twai_sem} - Wait on Semaphore with Timeout
+@item @code{ref_sem} - Reference Semaphore Status
+@end itemize
+
+@section Background
+
+@subsection Theory
+
+Semaphores are used for synchronization and mutual exclusion by indicating
+the availability and number of resources. The task (the task which is
+returning resources) notifying other tasks of an event increases the number
+of resources held by the semaphore by one. The task (the task which
+will obtain resources) waiting for the event decreases the number of
+resources held by the semaphore by one. If the number of resources held by a
+semaphore is insufficient (namely 0), the task requiring resources will
+wait until the next time resources are returned to the semaphore. If there is
+more than one task waiting for a semaphore, the tasks will be placed in the
+queue.
+
+
+@subsection T_CSEM Structure
+
+The T_CSEM structure is used to define the characteristics of a semaphore
+and passed an as argument to the @code{cre_sem} service. The structure
+is defined as follows:
+
+@example
+@group
+/*
+ * Create Semaphore (cre_sem) Structure
+ */
+
+typedef struct t_csem @{
+ VP exinf; /* extended information */
+ ATR sematr; /* semaphore attributes */
+ /* Following is the extended function for [level X]. */
+ INT isemcnt; /* initial semaphore count */
+ INT maxsem; /* maximum semaphore count */
+ /* additional implementation dependent information may be included */
+@} T_CSEM;
+
+/*
+ * sematr - Semaphore Attribute Values
+ */
+
+#define TA_TFIFO 0x00 /* waiting tasks are handled by FIFO */
+#define TA_TPRI 0x01 /* waiting tasks are handled by priority */
+
+@end group
+@end example
+
+where the meaning of each field is:
+
+@table @b
+@item exinf
+is for any extended information that the implementation may define.
+This implementation does not use this field.
+
+@item sematr
+is the attributes for this semaphore. The only attributed
+which can be specified is whether tasks wait in FIFO (@code{TA_TFIFO})
+or priority (@code{TA_TPRI}) order.
+
+@item isemcnt
+is the initial count of the semaphore.
+
+@item maxsem
+is the maximum count the semaphore may have. It places an upper
+limit on the value taken by the semaphore.
+
+@end table
+
+@subsection Building a Semaphore Attribute Set
+
+In general, an attribute set is built by a bitwise OR
+of the desired attribute components. The following table lists
+the set of valid semaphore attributes:
+
+@itemize @bullet
+@item @code{TA_TFIFO} - tasks wait by FIFO
+
+@item @code{TA_TPRI} - tasks wait by priority
+
+@end itemize
+
+Attribute values are specifically designed to be
+mutually exclusive, therefore bitwise OR and addition operations
+are equivalent as long as each attribute appears exactly once in
+the component list.
+
+@subsection T_RSEM Structure
+
+The T_RSEM structure is filled in by the @code{ref_sem} service with
+status and state information on a semaphore. The structure
+is defined as follows:
+
+@example
+@group
+/*
+ * Reference Semaphore (ref_sem) Structure
+ */
+
+typedef struct t_rsem @{
+ VP exinf; /* extended information */
+ BOOL_ID wtsk; /* indicates whether there is a waiting task */
+ INT semcnt; /* current semaphore count */
+ /* additional implementation dependent information may be included */
+@} T_RSEM;
+@end group
+@end example
+
+@table @b
+
+@item exinf
+is for any extended information that the implementation may define.
+This implementation does not use this field.
+
+@item wtsk
+is TRUE when there is one or more task waiting on the semaphore.
+It is FALSE if no tasks are currently waiting. The meaning of this
+field is allowed to vary between ITRON implementations. It may have
+the ID of a waiting task, the number of tasks waiting, or a boolean
+indication that one or more tasks are waiting.
+
+@item semcnt
+is the current semaphore count.
+
+@end table
+
+The information in this table is very volatile and should be used
+with caution in an application.
+
+@section Operations
+
+@subsection Using as a Binary Semaphore
+
+Creating a semaphore with a limit on the count of 1 effectively
+restricts the semaphore to being a binary semaphore. When the
+binary semaphore is available, the count is 1. When the binary
+semaphore is unavailable, the count is 0.
+
+Since this does not result in a true binary semaphore, advanced
+binary features like the Priority Inheritance and Priority
+Ceiling Protocols are not available.
+
+@section System Calls
+
+This section details the semaphore manager's services.
+A subsection is dedicated to each of this manager's services
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+
+@c
+@c cre_sem
+@c
+
+@page
+@subsection cre_sem - Create Semaphore
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER cre_sem(
+ ID semid,
+ T_CSEM *pk_csem
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (semid was invalid or could not be used)
+
+@code{E_NOMEM} - Insufficient memory (Memory for control block cannot be
+allocated)
+
+@code{E_OACV} - Object access violation (A semid less than -4 was
+specified from a user task.)
+
+@code{E_RSATR} - Reserved attribute (sematr was invalid or could not be
+used)
+
+@code{E_OBJ} - Invalid object state (a semaphore of the same ID already
+exists)
+
+@code{E_PAR} - Parameter error (pk_csem is invalid and/or isemcnt or
+maxsem is negative or invalid)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the
+target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system call
+was issued from a task in dispatch disabled state or from a task-
+independent portion
+
+@code{EN_PAR} - A value outside the range supported by the target node
+and/or transmission packet format was specified as a parameter (a value
+outside supported range was specified for exinf, sematr, isemcnt and/or
+maxsem)
+
+@subheading DESCRIPTION:
+
+This routine creates a semaphore that resides on the local node. The
+semaphore is initialized based on the attributes specified in the
+@code{pk_csem} structure. The initial and maximum counts of the
+semaphore are set based on the @code{isemcnt} and @code{maxsem} fields
+in this structure.
+
+Specifying @code{TA_TPRI} in the @code{sematr} field of the
+semaphore attributes structure causes tasks
+waiting for a semaphore to be serviced according to task
+priority. When @code{TA_TFIFO} is selected, tasks are serviced in First
+In-First Out order.
+
+@subheading NOTES:
+
+Multiprocessing is not supported. Thus none of the "EN_" status codes
+will be returned.
+
+All memory is preallocated for RTEMS ITRON objects. Thus, no dynamic
+memory allocation is performed by @code{cre_sem} and the @code{E_NOMEM}
+error can not be returned.
+
+This directive will not cause the running task to be preempted.
+
+The following semaphore attribute constants are
+defined by RTEMS:
+
+@itemize @bullet
+@item @code{TA_TFIFO} - tasks wait by FIFO
+
+@item @code{TA_TPRI} - tasks wait by priority
+
+@end itemize
+
+@c
+@c del_sem
+@c
+
+@page
+@subsection del_sem - Delete Semaphore
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER del_sem(
+ ID semid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (semid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the semaphore specified by semid
+does not exist)
+
+@code{E_OACV} - Object access violation (A semid less than -4 was
+specified from a user task. This is implementation dependent.)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the
+target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system call
+was issued from a task in dispatch disabled state or from a
+task-independent portion
+
+@subheading DESCRIPTION:
+
+This routine deletes the semaphore specified by @code{semid}.
+All tasks blocked waiting to acquire the semaphore will be
+readied and returned a status code which indicates that the
+semaphore was deleted. The control block for this semaphore
+is reclaimed by RTEMS.
+
+
+@subheading NOTES:
+
+Multiprocessing is not supported. Thus none of the "EN_" status codes
+will be returned.
+
+The calling task will be preempted if it is enabled
+by the task's execution mode and a higher priority local task is
+waiting on the deleted semaphore. The calling task will NOT be
+preempted if all of the tasks that are waiting on the semaphore
+are remote tasks.
+
+The calling task does not have to be the task that
+created the semaphore. Any local task that knows the semaphore
+id can delete the semaphore.
+
+
+@c
+@c sig_sem
+@c
+
+@page
+@subsection sig_sem - Signal Semaphore
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER sig_sem(
+ ID semid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (semid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the semaphore specified by semid
+does not exist)
+
+@code{E_OACV} - Object access violation (A semid less than -4 was
+specified from a user task. This is implementation dependent.)
+
+@code{E_QOVR} - Queuing or nesting overflow (the queuing count given by
+semcnt went over the maximum allowed)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the
+target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system call
+was issued from a task in dispatch disabled state or from a
+task-independent portion
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+Multiprocessing is not supported. Thus none of the "EN_" status codes
+will be returned.
+
+@c
+@c wai_sem
+@c
+
+@page
+@subsection wai_sem - Wait on Semaphore
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER wai_sem(
+ ID semid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (semid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the semaphore specified by semid
+does not exist)
+
+@code{E_OACV} - Object access violation (A semid less than -4 was
+specified from a user task. This is implementation dependent.)
+
+@code{E_DLT} - The object being waited for was deleted (the specified
+semaphore was deleted while waiting)
+
+@code{E_RLWAI} - Wait state was forcibly released (rel_wai was received
+while waiting)
+
+@code{E_CTX} - Context error (issued from task-independent portions or a
+task in dispatch disabled state)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the
+target node is specified.
+
+@code{EN_PAR} - A value outside the range supported by the target node
+and/or transmission packet format was specified as a parameter (a value
+outside supported range was specified for tmout)
+
+@subheading DESCRIPTION:
+
+This routine attempts to acquire the semaphore specified by @code{semid}.
+If the semaphore is available (i.e. positive semaphore count), then the
+semaphore count is decremented and the calling task returns immediately.
+Otherwise the calling tasking is blocked until the semaphore is released
+by a subsequent invocation of @code{sig_sem}.
+
+@subheading NOTES:
+
+Multiprocessing is not supported. Thus none of the "EN_" status codes
+will be returned.
+
+If the semaphore is not available, then the calling task will be blocked.
+
+@c
+@c preq_sem
+@c
+
+@page
+@subsection preq_sem - Poll and Request Semaphore
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER preq_sem(
+ ID semid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (semid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the semaphore specified by semid
+does not exist)
+
+@code{E_OACV} - Object access violation (A semid less than -4 was
+specified from a user task. This is implementation dependent.)
+
+@code{E_TMOUT} - Polling failure or timeout exceeded
+
+@code{E_CTX} - Context error (issued from task-independent portions or a
+task in dispatch disabled state)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the
+target node is specified.
+
+@code{EN_PAR} - A value outside the range supported by the target node
+and/or transmission packet format was specified as a parameter (a value
+outside supported range was specified for tmout)
+
+@subheading DESCRIPTION:
+
+This routine attempts to acquire the semaphore specified by @code{semid}.
+If the semaphore is available (i.e. positive semaphore count), then the
+semaphore count is decremented and the calling task returns immediately.
+Otherwise, the @code{E_TMOUT} error is returned to the calling task to
+indicate the semaphore is unavailable.
+
+@subheading NOTES:
+
+Multiprocessing is not supported. Thus none of the "EN_" status codes
+will be returned.
+
+This routine will not cause the running task to be preempted.
+
+@c
+@c twai_sem
+@c
+
+@page
+@subsection twai_sem - Wait on Semaphore with Timeout
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER twai_sem(
+ ID semid,
+ TMO tmout
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (semid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the semaphore specified by semid
+does not exist)
+
+@code{E_OACV} - Object access violation (A semid less than -4 was
+specified from a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (tmout is -2 or less)
+
+@code{E_DLT} - The object being waited for was deleted (the specified
+semaphore was deleted while waiting)
+
+@code{E_RLWAI} - Wait state was forcibly released (rel_wai was received
+while waiting)
+
+@code{E_TMOUT} - Polling failure or timeout exceeded
+
+@code{E_CTX} - Context error (issued from task-independent portions or a
+task in dispatch disabled state)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the
+target node is specified.
+
+@code{EN_PAR} - A value outside the range supported by the target node
+and/or transmission packet format was specified as a parameter (a value
+outside supported range was specified for tmout)
+
+@subheading DESCRIPTION:
+
+This routine attempts to acquire the semaphore specified by @code{semid}.
+If the semaphore is available (i.e. positive semaphore count), then the
+semaphore count is decremented and the calling task returns immediately.
+Otherwise the calling tasking is blocked until the semaphore is released
+by a subsequent invocation of @code{sig_sem} or the timeout period specified
+by @code{tmout} milliseconds is exceeded. If the timeout period is exceeded,
+then the @code{E_TMOUT} error is returned.
+
+By specifiying @code{tmout} as @code{TMO_FEVR}, this routine has the same
+behavior as @code{wai_sem}. Similarly, by specifiying @code{tmout} as
+@code{TMO_POL}, this routine has the same behavior as @code{preq_sem}.
+
+@subheading NOTES:
+
+Multiprocessing is not supported. Thus none of the "EN_" status codes
+will be returned.
+
+This routine may cause the calling task to block.
+
+A clock tick is required to support the timeout functionality of
+this routine.
+
+@c
+@c ref_sem
+@c
+
+@page
+@subsection ref_sem - Reference Semaphore Status
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ref_sem(
+ T_RSEM *pk_rsem,
+ ID semid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID number (semid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the semaphore specified by semid
+does not exist)
+
+@code{E_OACV} - Object access violation (A semid less than -4 was
+specified from a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (the packet address for the return
+parameters could not be used)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the
+target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system call
+was issued from a task in dispatch disabled state or from a
+task-independent portion
+
+@code{EN_RPAR} - A value outside the range supported by the requesting
+node and/or transmission packet format was returned as a parameter (a
+value outside supported range was specified for exinf, wtsk or semcnt)
+
+@subheading DESCRIPTION:
+
+This routine returns status information on the semaphore specified
+by @code{semid}. The @code{pk_rsem} structure is filled in by
+this service call.
+
+@subheading NOTES:
+
+Multiprocessing is not supported. Thus none of the "EN_" status codes
+will be returned.
+
+This routine will not cause the running task to be preempted.
+
diff --git a/doc/itron3.0/status.t b/doc/itron3.0/status.t
new file mode 100644
index 0000000000..4f13234104
--- /dev/null
+++ b/doc/itron3.0/status.t
@@ -0,0 +1,943 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c This is the chapter from the RTEMS ITRON User's Guide that
+@c documents the services provided by the task
+@c manager.
+@c
+@c $Id$
+@c
+
+@chapter ITRON Implementation Status
+
+@section Introduction
+
+This chapter describes the status of the implementation of each
+manager in the RTEMS implementataion of the uITRON 3.0 API. The
+status of each manager is presented in terms of documentation and
+status relative to the extended level (level 'E') of the uITRON 3.0
+API specification. The extended level of the specification is
+the level at which dynamic object creation, deletion, and
+reference services are available. This level is more akin to the other
+APIs supported by RTEMS. This purpose of this chapter is
+to make it clear what is required to bring the RTEMS
+uITRON API implementation into compliance with the
+specification. The following description of the specification
+levels is taken from the uITRON 3.0 API specification.
+
+
+uITRON 3.0 specification is divided into fewer system call levels than was the
+previous uITRON 2.0 specification. There are now just three levels: Level R
+(Required), Level S (Standard) and Level E (Extended). In addition to these
+three levels, there is also Level C for CPU-dependent system calls.
+In addition, the uITRON 3.0 API, defines the network level ('N') which
+represents system calls that support the connection function
+
+@itemize @bullet
+@item [level R] (Required)
+The functions in this level are mandatory for all implementations of
+uITRON 3.0 specification. This includes basic functions for achieving
+a real-time, multitasking OS. These functions can be implemented even
+without a hardware timer. This level corresponds to Levels 1 and 2
+of uITRON 2.0 specification.
+
+@item [level S] (Standard)
+This includes basic functions for achieving a real-time, multitasking
+OS. This level corresponds to Levels 3 and 4 of uITRON 2.0
+specification.
+
+@item [level E] (Extended)
+This includes additional and extended functions. This corresponds to
+functions not included in uITRON 2.0 specification (functions of
+ITRON2 specification). Specifically, this level includes object
+creation and deletion functions, rendezvous functions, memorypools
+and the timer handler.
+
+@item [level C] (CPU dependent)
+This level provides implementation-dependent functions required due to
+the CPU or hardware configuration.
+
+@end itemize
+
+The support level of the connection function is indicated by appending an 'N'
+to the end of the level. For example, connectivity supported at [level S]
+would be referred to as [level SN]. The support level for functions which
+can only send requests for operations on other nodes but offer no system call
+processing on the issuing node itself are indicated by the lower case letter
+'s' or 'e'.
+
+@c
+@c Task
+@c
+
+@section Task Status
+
+@itemize @bullet
+
+@item Implementation
+@itemize @bullet
+@item cre_tsk - Complete, Pending Review
+@item del_tsk - Complete, Pending Review
+@item sta_tsk - Complete, Pending Review
+@item ext_tsk - Complete, Pending Review
+@item exd_tsk - Complete, Pending Review
+@item ter_tsk - Complete, Pending Review
+@item dis_dsp - Complete, Pending Review
+@item ena_dsp - Complete, Pending Review
+@item chg_pri - Complete, Pending Review
+@item rot_rdq - Complete, Pending Review
+@item rel_wai - Stub, Needs to be Fleshed Out
+@item get_tid - Complete, Pending Review
+@item ref_tsk - Complete, Pending Review
+
+@item Notes:
+@itemize @bullet
+@item None
+@end itemize
+
+@end itemize
+
+@item Executive Modifications
+@itemize @bullet
+@item None Expected
+@end itemize
+
+@item Testing
+@itemize @bullet
+@item itron01 - Hello world
+@item itron02 - Semaphore test
+@item itron03 - directives: ex_init, ex_start, t_create,
+t_start, tm_tick, i_return, t_ident, tm_set, tm_get, tm_wkafter
+See .doc file, verify correct
+@item itron04 - Doc file needed
+@item itron05 - directives: ext_tsk, cre_tsk, sta_tsk, rot_rdq
+ex_start, t_create, t_start, tm_tick, i_return, t_ident, t_delete,
+tm_wkafter, t_setpri, t_suspend
+See .doc file, verify correct
+@item itron06 - Doc file needed
+@item itron07 - Doc file needed
+@item itron08 - Doc file needed
+@item itron09 - Doc file needed
+@item itron10 - Doc file needed
+@item tmitron01 - Doc file needed
+@item tm_include - Doc file needed. Timing test for semaphores.
+@end itemize
+
+@item Documentation
+@itemize @bullet
+@item Complete, Pending Review
+@end itemize
+
+@item ITRON 3.0 API Conformance
+@itemize @bullet
+@item Level E - Extended Functionality
+@end itemize
+
+@item Level C - CPU Dependent Functionality
+@itemize @bullet
+@item NA
+@end itemize
+
+@item Level N - Connection Functionality
+@itemize @bullet
+@item Not implemented
+@end itemize
+
+@end itemize
+
+@c
+@c Task-Dependent Synchronization
+@c
+
+@section Task-Dependent Synchronization Status
+
+@itemize @bullet
+
+@item Implementation
+@itemize @bullet
+@item sus_tsk - Complete, Pending Review
+@item rsm_tsk - Complete, Pending Review
+@item frsm_tsk - Complete, Pending Review
+@item slp_tsk - Stub, Needs to be Fleshed Out
+@item tslp_tsk - Stub, Needs to be Fleshed Out
+@item wup_tsk - Stub, Needs to be Fleshed Out
+@item can_wup - Stub, Needs to be Fleshed Out
+
+@item Notes:
+@itemize @bullet
+@item None
+@end itemize
+
+@end itemize
+
+@item Executive Modifications
+@itemize @bullet
+@item None Expected
+@end itemize
+
+@item Testing
+@itemize @bullet
+@item Functional tests for complete routines.
+@item Yellow line testing needs to be verified.
+@item No Timing Tests
+@end itemize
+
+@item Documentation
+@itemize @bullet
+@item Complete, Pending Review
+@item
+@end itemize
+
+@item ITRON 3.0 API Conformance
+@itemize @bullet
+@item Level E - Extended Functionality
+
+@item Level C - CPU Dependent Functionality
+@itemize @bullet
+@item NA
+@end itemize
+
+@item Level N - Connection Functionality
+@itemize @bullet
+@item Not implemented
+@end itemize
+@end itemize
+
+@end itemize
+
+@c
+@c Semaphore
+@c
+
+@section Semaphore
+
+@itemize @bullet
+
+@item Implementation
+@itemize @bullet
+@item cre_sem - Complete, Pending Review
+@item del_sem - Complete, Pending Review
+@item sig_sem - Complete, Pending Review
+@item wai_sem - Complete, Pending Review
+@item preq_sem - Complete, Pending Review
+@item twai_sem - Complete, Pending Review
+@item ref_sem - Complete, Pending Review
+@end itemize
+
+@item Executive Modifications
+@itemize @bullet
+@item None Required
+@end itemize
+
+@item Testing
+@itemize @bullet
+@item Yellow Lined BUT Timeout Cases Not Actually Executed
+@item No Timing Tests
+@end itemize
+
+@item Documentation
+@itemize @bullet
+@item Complete, Pending Review
+@end itemize
+
+@item ITRON 3.0 API Conformance
+@itemize @bullet
+@item Level E - Extended Functionality
+@itemize @bullet
+@item Complete, Pending Review
+@end itemize
+
+@item Level C - CPU Dependent Functionality
+@itemize @bullet
+@item NA
+@end itemize
+
+@item Level N - Connection Functionality
+@itemize @bullet
+@item Not implemented
+@end itemize
+@end itemize
+
+@end itemize
+
+@c
+@c Eventflags
+@c
+
+@section Eventflags
+
+@itemize @bullet
+
+@item Implementation
+@itemize @bullet
+@item cre_flg - Stub, Needs to be Fleshed Out
+@item del_flg - Stub, Needs to be Fleshed Out
+@item set_flg - Stub, Needs to be Fleshed Out
+@item clr_flg - Stub, Needs to be Fleshed Out
+@item wai_flg - Stub, Needs to be Fleshed Out
+@item pol_flg - Stub, Needs to be Fleshed Out
+@item twai_flg - Stub, Needs to be Fleshed Out
+@item ref_flg - Stub, Needs to be Fleshed Out
+
+@item Notes:
+@itemize @bullet
+@item Similar in Functionality to Classic API Events Manager
+@item Implement Using new SuperCore Event Handler
+@end itemize
+
+@end itemize
+
+@item Executive Modifications
+@itemize @bullet
+@item Add SuperCore Events Object Based on Classic Events
+@item Redo Classic Events to use SuperCore Events
+@end itemize
+
+@item Testing
+@itemize @bullet
+@item No Tests Written
+@item No Timing Tests
+@end itemize
+
+@item Documentation
+@itemize @bullet
+@item Good First Draft.
+@item No Information in Operations.
+@item Should not use "standard-like" language.
+@end itemize
+
+@item ITRON 3.0 API Conformance
+@itemize @bullet
+@item Level E - Extended Functionality
+@itemize @bullet
+@item
+@end itemize
+
+@item Level C - CPU Dependent Functionality
+@itemize @bullet
+@item NA
+@end itemize
+
+@item Level N - Connection Functionality
+@itemize @bullet
+@item Not implemented
+@end itemize
+@end itemize
+
+@end itemize
+
+@c
+@c Mailbox
+@c
+
+@section Mailbox
+
+@itemize @bullet
+
+@item Implementation
+@itemize @bullet
+@item cre_mbx - Stub, Needs to be Fleshed Out
+@item del_mbx - Stub, Needs to be Fleshed Out
+@item snd_msg - Stub, Needs to be Fleshed Out
+@item rcv_msg - Stub, Needs to be Fleshed Out
+@item prcv_msg - Stub, Needs to be Fleshed Out
+@item trcv_msg - Stub, Needs to be Fleshed Out
+@item ref_mbx - Stub, Needs to be Fleshed Out
+
+@item Notes:
+@itemize @bullet
+@item Passes Addresses of Messages
+@item FIFO or Priority Task Blocking
+@item FIFO or Priority Message Ordering
+@item Send Returns Error on Overflow
+@end itemize
+
+@end itemize
+
+@item Executive Modifications
+@itemize @bullet
+@item None
+@end itemize
+
+@item Testing
+@itemize @bullet
+@item No Tests Written
+@item No Timing Tests
+@end itemize
+
+@item Documentation
+@itemize @bullet
+@item Needs More Text
+@item No Information in Background or Operations.
+@item Service Descriptions are Weak.
+@end itemize
+
+@item ITRON 3.0 API Conformance
+@itemize @bullet
+@item Level E - Extended Functionality
+@itemize @bullet
+@item
+@end itemize
+
+@item Level C - CPU Dependent Functionality
+@itemize @bullet
+@item NA
+@end itemize
+
+@item Level N - Connection Functionality
+@itemize @bullet
+@item Not implemented
+@end itemize
+@end itemize
+
+@end itemize
+
+@c
+@c Message Buffer
+@c
+
+@section Message Buffer
+
+@itemize @bullet
+
+@item Implementation
+@itemize @bullet
+@item cre_mbf - Stub, Needs to be Fleshed Out
+@item del_mbf - Stub, Needs to be Fleshed Out
+@item snd_mbf - Stub, Needs to be Fleshed Out
+@item psnd_mbf - Stub, Needs to be Fleshed Out
+@item tsnd_mbf - Stub, Needs to be Fleshed Out
+@item rcv_mbf - Stub, Needs to be Fleshed Out
+@item prcv_mbf - Stub, Needs to be Fleshed Out
+@item trcv_mbf - Stub, Needs to be Fleshed Out
+@item ref_mbf - Stub, Needs to be Fleshed Out
+
+@item Notes:
+@itemize @bullet
+@item Implement Using SuperCore Message Queue Handler
+@item Passes Full Bodies of Messages
+@item FIFO or Priority Task Blocking
+@item FIFO Message Ordering Only
+@item Send (snd_mbf and tsnd_mbf) Blocks on Overflow
+@end itemize
+
+@end itemize
+
+@item Executive Modifications
+@itemize @bullet
+@item SuperCore Message Queue Handler Must Support Blocking Sends. [NOTE:
+This is required for POSIX Message Queues as well.]
+@end itemize
+
+@item Testing
+@itemize @bullet
+@item No Tests Written
+@item No Timing Tests
+@end itemize
+
+@item Documentation
+@itemize @bullet
+@item Good First Draft.
+@item No Information in Operations
+@end itemize
+
+@item ITRON 3.0 API Conformance
+@itemize @bullet
+@item Level E - Extended Functionality
+@itemize @bullet
+@item
+@end itemize
+
+@item Level C - CPU Dependent Functionality
+@itemize @bullet
+@item NA
+@end itemize
+
+@item Level N - Connection Functionality
+@itemize @bullet
+@item Not implemented
+@end itemize
+@end itemize
+
+@end itemize
+
+@c
+@c Rendezvous
+@c
+
+@section Rendezvous
+
+@itemize @bullet
+
+@item Implementation
+@itemize @bullet
+@item cre_por - Stub, Needs to be Fleshed Out
+@item del_por - Stub, Needs to be Fleshed Out
+@item cal_por - Stub, Needs to be Fleshed Out
+@item pcal_por - Stub, Needs to be Fleshed Out
+@item tcal_por - Stub, Needs to be Fleshed Out
+@item acp_por - Stub, Needs to be Fleshed Out
+@item pacp_por - Stub, Needs to be Fleshed Out
+@item tacp_por - Stub, Needs to be Fleshed Out
+@item fwd_por - Stub, Needs to be Fleshed Out
+@item rpl_rdv - Stub, Needs to be Fleshed Out
+@item ref_por - Stub, Needs to be Fleshed Out
+
+@item Notes:
+@itemize @bullet
+@item Hardest ITRON Manager to Implement
+@end itemize
+
+@end itemize
+
+@item Executive Modifications
+@itemize @bullet
+@item Doubtful, Probably Implement in Terms of Multiple SuperCore Objects.
+@end itemize
+
+@item Testing
+@itemize @bullet
+@item No Tests Written
+@item No Timing Tests
+@end itemize
+
+@item Documentation
+@itemize @bullet
+@item Shell, Needs to be Fleshed Out
+@end itemize
+
+@item ITRON 3.0 API Conformance
+@itemize @bullet
+@item Level E - Extended Functionality
+@itemize @bullet
+@item
+@end itemize
+
+@item Level C - CPU Dependent Functionality
+@itemize @bullet
+@item NA
+@end itemize
+
+@item Level N - Connection Functionality
+@itemize @bullet
+@item Not implemented
+@end itemize
+@end itemize
+
+@end itemize
+
+@c
+@c Interrupt
+@c
+
+@section Interrupt
+
+@itemize @bullet
+
+@item Implementation
+@itemize @bullet
+@item def_int - Stub, Needs to be Fleshed Out
+@item ret_int - Stub, Needs to be Fleshed Out
+@item ret_wup - Stub, Needs to be Fleshed Out
+@item loc_cpu - Stub, Needs to be Fleshed Out
+@item unl_cpu - Stub, Needs to be Fleshed Out
+@item dis_int - Stub, Needs to be Fleshed Out
+@item ena_int - Stub, Needs to be Fleshed Out
+@item chg_iXX - Stub, Needs to be Fleshed Out
+@item ref_iXX - Stub, Needs to be Fleshed Out
+
+@item Notes:
+@itemize @bullet
+@item This quote from the ITRON specification needs to be thought about:@*
+@*@i{"When an interrupt is invoked, the interrupt handler defined with
+this system call is started directly by the
+interrupt processing mechanism of the CPU hardware. Accordingly, code at the
+beginning and end of an interrupt handler must save and restore any registers
+used by the interrupt handler."}@*@*
+Based on another comment, in the ret_int description, I think this means
+that RTEMS will not support the TA_ASM style of interrupt handlers --
+only the TA_HLNG style.@*@*
+@i{When TA_HLNG is specified, a high-level language environment setting
+program (a high-level language support routine) is called before branching
+to the inthdr address. The least significant bit (LSB) of the system
+attribute bits is used for this specification.}
+
+@item Specification allows special "interrupt-only" versions of system
+calls named i???_??? (i.e. sig_sem and isig_sem). This does not seem
+to be something that would be implemented with RTEMS. We could provide
+macros mapping them onto the default versions if this is an issue.
+
+@item How this operates versus the behavior of a true TRON chip is
+up for discussion.
+
+@item ret_wup is questionable in only high-level language ISRs.
+
+@item dis_int and ena_int refer to a specific interrupt number. These
+may require hooking back out to the BSP.
+
+@item for chg_iXX and reg_iXX, the XX should be replaced with something
+that is meaningful on a particular CPU.
+@end itemize
+
+@end itemize
+
+@item Executive Modifications
+@itemize @bullet
+@item None Expected
+@end itemize
+
+@item Testing
+@itemize @bullet
+@item No Tests Written
+@item No Timing Tests
+@end itemize
+
+@item Documentation
+@itemize @bullet
+@item Shell, Needs to be Fleshed Out
+@end itemize
+
+@item ITRON 3.0 API Conformance
+@itemize @bullet
+@item Level E - Extended Functionality
+@itemize @bullet
+@item
+@end itemize
+
+@item Level C - CPU Dependent Functionality
+@itemize @bullet
+@item NA
+@end itemize
+
+@item Level N - Connection Functionality
+@itemize @bullet
+@item Not implemented
+@end itemize
+@end itemize
+
+@end itemize
+
+@c
+@c Memory Pool
+@c
+
+@section Memory Pool
+
+@itemize @bullet
+
+@item Implementation
+@itemize @bullet
+@item cre_mpl - Stub, Needs to be Fleshed Out
+@item del_mpl - Stub, Needs to be Fleshed Out
+@item get_blk - Stub, Needs to be Fleshed Out
+@item pget_blk - Stub, Needs to be Fleshed Out
+@item tget_blk - Stub, Needs to be Fleshed Out
+@item rel_blk - Stub, Needs to be Fleshed Out
+@item ref_mpl - Stub, Needs to be Fleshed Out
+
+@item Notes:
+@itemize @bullet
+@item Implement Using SuperCore Heap Handler
+@item Similar to Region in Classic API with Blocking
+@item FIFO or Priority Task Blocking
+@item Specification Deliberately Open on Allocation Algorithm
+@item Multiple Tasks Can be Unblocked by a single rel_blk
+@end itemize
+
+@end itemize
+
+@item Executive Modifications
+@itemize @bullet
+@item None Expected
+@end itemize
+
+@item Testing
+@itemize @bullet
+@item No Tests Written
+@item No Timing Tests
+@end itemize
+
+@item Documentation
+@itemize @bullet
+@item Good First Draft.
+@item No Information in Operations
+@item Should not use "standard-like" language.
+@end itemize
+
+@item ITRON 3.0 API Conformance
+@itemize @bullet
+@item Level E - Extended Functionality
+@itemize @bullet
+@item
+@end itemize
+
+@item Level C - CPU Dependent Functionality
+@itemize @bullet
+@item NA
+@end itemize
+
+@item Level N - Connection Functionality
+@itemize @bullet
+@item Not implemented
+@end itemize
+@end itemize
+
+@end itemize
+
+@c
+@c Fixed Block
+@c
+
+@section Fixed Block
+
+@itemize @bullet
+
+@item Implementation
+@itemize @bullet
+@item cre_mpf - Stub, Needs to be Fleshed Out
+@item del_mpf - Stub, Needs to be Fleshed Out
+@item get_blf - Stub, Needs to be Fleshed Out
+@item pget_blf - Stub, Needs to be Fleshed Out
+@item tget_blf - Stub, Needs to be Fleshed Out
+@item rel_blf - Stub, Needs to be Fleshed Out
+@item ref_mpf - Stub, Needs to be Fleshed Out
+
+@item Notes:
+@itemize @bullet
+@item Implement Using SuperCore Chain Handler
+@item Similar to Partition in Classic API with Blocking
+@item FIFO or Priority Task Blocking
+@item Specification Deliberately Open on Allocation Algorithm
+@item Should add Blocking to Classic API Partition at Same Time
+@end itemize
+
+@end itemize
+
+@item Executive Modifications
+@itemize @bullet
+@item None Expected
+@end itemize
+
+@item Testing
+@itemize @bullet
+@item No Tests Written
+@item No Timing Tests
+@end itemize
+
+@item Documentation
+@itemize @bullet
+@item Good First Draft.
+@item No Information in Background or Operations
+@item Should not use "standard-like" language.
+@end itemize
+
+@item ITRON 3.0 API Conformance
+@itemize @bullet
+@item Level E - Extended Functionality
+@itemize @bullet
+@item
+@end itemize
+
+@item Level C - CPU Dependent Functionality
+@itemize @bullet
+@item NA
+@end itemize
+
+@item Level N - Connection Functionality
+@itemize @bullet
+@item Not implemented
+@end itemize
+@end itemize
+
+@end itemize
+
+@c
+@c Time
+@c
+
+@section Time
+
+@itemize @bullet
+
+@item Implementation
+@itemize @bullet
+@item get_tim - Stub, Needs to be Fleshed Out
+@item set_tim - Stub, Needs to be Fleshed Out
+@item dly_tsk - Stub, Needs to be Fleshed Out
+@item def_cyc - Stub, Needs to be Fleshed Out
+@item act_cyc - Stub, Needs to be Fleshed Out
+@item ref_cyc - Stub, Needs to be Fleshed Out
+@item def_alm - Stub, Needs to be Fleshed Out
+@item ref_alm - Stub, Needs to be Fleshed Out
+@item ret_tmr - Stub, Needs to be Fleshed Out
+
+@item Notes:
+@itemize @bullet
+@item Need to Implement Time Conversion Routines
+@item Epoch is January 1, 1985, 00:00:00 am (GMT).
+@item Cyclic and Alarm Handlers may be TA_ASM or TA_HLNG.
+@item Alarms may be Absolute or Relative Time based.
+@item May Want to Implement a Timer Server Task
+@item Termination via ret_tmr is Not Consistent with Current RTEMS Timers.
+@end itemize
+
+@end itemize
+
+@item Executive Modifications
+@itemize @bullet
+@item None Expected
+@end itemize
+
+@item Testing
+@itemize @bullet
+@item No Tests Written
+@item No Timing Tests
+@end itemize
+
+@item Documentation
+@itemize @bullet
+@item Have Version in Word
+@end itemize
+
+@item ITRON 3.0 API Conformance
+@itemize @bullet
+@item Level E - Extended Functionality
+@itemize @bullet
+@item
+@end itemize
+
+@item Level C - CPU Dependent Functionality
+@itemize @bullet
+@item NA
+@end itemize
+
+@item Level N - Connection Functionality
+@itemize @bullet
+@item Not implemented
+@end itemize
+@end itemize
+
+@end itemize
+
+@c
+@c System
+@c
+
+@section System
+
+@itemize @bullet
+
+@item Implementation
+@itemize @bullet
+@item get_ver - Stub, Needs to be Fleshed Out
+@item ref_sys - Stub, Needs to be Fleshed Out
+@item ref_cfg - Stub, Needs to be Fleshed Out
+@item def_svc - Stub, Needs to be Fleshed Out
+@item def_exc - Stub, Needs to be Fleshed Out
+
+@item Notes:
+@itemize @bullet
+@item May Have to Obtain ITRON "OS Maker" Id
+@item - def_svc seems to imply a trap handler interface
+@item - def_exc needs to be examined.
+@end itemize
+
+@end itemize
+
+@item Executive Modifications
+@itemize @bullet
+@item None Expected
+@end itemize
+
+@item Testing
+@itemize @bullet
+@item No Tests Written
+@item No Timing Tests
+@end itemize
+
+@item Documentation
+@itemize @bullet
+@item Shell, Needs to be Fleshed Out
+@end itemize
+
+@item ITRON 3.0 API Conformance
+@itemize @bullet
+@item Level E - Extended Functionality
+@itemize @bullet
+@item
+@end itemize
+
+@item Level C - CPU Dependent Functionality
+@itemize @bullet
+@item NA
+@end itemize
+
+@item Level N - Connection Functionality
+@itemize @bullet
+@item Not implemented
+@end itemize
+@end itemize
+
+@end itemize
+
+@c
+@c Network Support
+@c
+
+@section Network Support
+
+@itemize @bullet
+
+@item Implementation
+@itemize @bullet
+@item nrea_dat - Stub, Needs to be Fleshed Out
+@item nwri_dat - Stub, Needs to be Fleshed Out
+@item nget_nod - Stub, Needs to be Fleshed Out
+@item nget_ver - Stub, Needs to be Fleshed Out
+
+@item Notes:
+@itemize @bullet
+@item None of these are difficult to implement on top of MPCI
+@item MP Packet formats are well-defined.
+@end itemize
+
+@end itemize
+
+@item Executive Modifications
+@itemize @bullet
+@item None Expected
+@end itemize
+
+@item Testing
+@itemize @bullet
+@item No Tests Written
+@item No Timing Tests
+@end itemize
+
+@item Documentation
+@itemize @bullet
+@item Shell, Needs to be Fleshed Out
+@end itemize
+
+@item ITRON 3.0 API Conformance
+@itemize @bullet
+@item Level E - Extended Functionality
+@itemize @bullet
+@item
+@end itemize
+
+@item Level C - CPU Dependent Functionality
+@itemize @bullet
+@item NA
+@end itemize
+
+@item Level N - Connection Functionality
+@itemize @bullet
+@item Not implemented
+@end itemize
+@end itemize
+
+@end itemize
+
diff --git a/doc/itron3.0/task.t b/doc/itron3.0/task.t
new file mode 100644
index 0000000000..15db155ca2
--- /dev/null
+++ b/doc/itron3.0/task.t
@@ -0,0 +1,767 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c This is the chapter from the RTEMS ITRON User's Guide that
+@c documents the services provided by the task
+@c manager.
+@c
+@c $Id$
+@c
+
+@chapter Task Manager
+
+@section Introduction
+
+The task manager is used to directly control and access the state of tasks. Included among these are functions for creating, deleting, starting and terminating tasks, for releasing the WAIT state of tasks, for enabling/disabling task dispatching, for changing task priority levels, for rotatingtasks on the ready queue, and for accessing task state.
+
+The services provided by the task manager are:
+
+@itemize @bullet
+@item @code{cre_tsk} - Create Task
+@item @code{del_tsk} - Delete Task
+@item @code{sta_tsk} - Start Task
+@item @code{ext_tsk} - Exit Issuing Task
+@item @code{exd_tsk} - Exit and Delete Issuing Task
+@item @code{ter_tsk} - Terminate Other Task
+@item @code{dis_dsp} - Disable Dispatch
+@item @code{ena_dsp} - Enable Dispatch
+@item @code{chg_pri} - Change Task Priority
+@item @code{rot_rdq} - Rotate Tasks on the Ready Queue
+@item @code{rel_wai} - Release Wait of Other Task
+@item @code{get_tid} - Get Task Identifier
+@item @code{ref_tsk} - Reference Task Status
+@end itemize
+
+@section Background
+
+@subsection Task Definition
+Many definitions of a task have been proposed in computer literature. Unfortunately, none of these definitions encompasses all facets of the concept in a manner which is operating system independent. Several of the more common definitions are provided to enable each user to select a definition which best matches their own experience and understanding of the task concept:
+
+@itemize @bullet
+@item a "dispatchable" unit.
+@item an entity to which the processor is allocated.
+@item an atomic unit of a real-time, multiprocessor system.
+@item single threads of execution which concurrently compete for resources.
+@item a sequence of closely related computations which can execute concurrently with other computational sequences.
+@item From our implementation perspective, a task is the smallest thread of execution which can compete on its own for system resources. A task is manifested by the existence of a task control block (TCB).
+@end itemize
+
+@subsection Task Manager Task Control Block
+ The Task Control Block (TCB) is a defined data structure which contains all the information that is pertinent to the execution of a task. During system initialization, implementation reserves a TCB for each task configured. A TCB is allocated upon creation of the task and is returned to the TCB free list upon deletion of the task.
+
+The TCB's elements are modified as a result of system calls made by the application in response to external and internal stimuli. The TCB contains a task's name, ID, current priority, current and starting states, TCB user extension pointer, scheduling control structures, as well as data required by a blocked task.
+
+A task's context is stored in the TCB when a task switch occurs. When the task regains control of the processor, its context is restored from the TCB. When a task is restarted, the initial state of the task is restored from the starting context area in the task's TCB.
+
+@subsection T_CTSK Structure
+The T_CTSK structure contains detailed information necessary to create the task. Such task attributes, start address, priority and stack size.
+
+@example
+typedef struct t_ctsk @{
+ VP exinf; /* extended information */
+ ATR tskatr; /* task attributes */
+ FP task; /* task start address */
+ PRI itskpri; /* initial task priority */
+ INT stksz; /* stack size */
+ /* additional implementation dependent information may be included */
+@} T_CTSK;
+
+@end example
+
+@subsection Task Manager Task States
+A task may exist in one of the following five states:
+
+@itemize @bullet
+@item RUN - Currently scheduled to the CPU
+@item READY - May be scheduled to the CPU
+@item Wait - Unable to be scheduled to the CPU
+@itemize @bullet
+@item (Specific) WAIT - The task is issued a command to wait on a condition
+@item SUSPEND - Another task suspended execution of the task
+@item WAIT-SUSPEND - Both the WAIT and SUSPEND states apply
+@end itemize
+@item DORMANT - Created task that is not started
+@item NON-EXISTENT - Uncreated or deleted task
+@end itemize
+
+An active task may occupy the RUN, READY, Wait or DORMANT state, otherwise the task is considered NON-EXISTENT. One or more tasks may be active in the system simultaneously. Multiple tasks communicate, synchronize, and compete for system resources with each other via system calls. The multiple tasks appear to execute in parallel, but actually each is dispatched to the CPU for periods of time determined by the scheduling algorithm. The scheduling of a task is based on its current state and priority.
+
+@subsection Task Manager Task Priority
+A task's priority determines its importance in relation to the other tasks executing on the same processor. Our implementation supports 255 levels of priority ranging from 1 to 255. Tasks of numerically smaller priority values are more important tasks than tasks of numerically larger priority values. For example, a task at priority level 5 is of higher privilege than a task at priority level 10. There is no limit to the number of tasks assigned to the same priority.
+
+Each task has a priority associated with it at all times. The initial value of this priority is assigned at task creation time. The priority of a task may be changed at any subsequent time.
+
+Priorities are used by the scheduler to determine which ready task will be allowed to execute. In general, the higher the logical priority of a task, the more likely it is to receive processor execution time.
+
+@section Operations
+
+@subsection Task Manager Creating Tasks
+The cre_tsk directive creates a task specified by tskid. Specifically, a TCB (Task Control Block) is allocated for the task to be created, and initialized according to accompanying parameter values of itskpri, task, stksz, etc. A stack area is also allocated for the task based on the parameter stksz.
+
+@subsection Task Manager Starting and Restarting Tasks
+The sta_tsk directive starts the task specified by tskid. Specifically, it changes the state of the task specified by tskid from DORMANT into RUN/READY. This enables the task to compete, based on its current priority, for the processor and other system resources. Any actions, such as suspension or change of priority, performed on a task prior to starting it are nullified when the task is started.
+
+Stacd can be used to specify parameters to be passed to the task when it is started. This parameter can be read by the task being started, and may be used for transmitting simple messages.
+
+The task priority on starting the task is given by the initial task priority parameter (itskpri) specified when the task was created.
+
+Start request is not queued in this this system call. In other words, if this system call is issued when the target task is not in DORMANT state, the system call will be ignored, and an E_OBJ error returned to the issuing task.
+
+If cre_tsk [level EN] is not implemented on a system, tasks are created statically when the system is started. Parameters required for creating a task, such as task starting address (task) and initial task priority (itskpri) are also specified statically at system startup.
+
+@subsection Task Manager Suspending and Resuming Tasks
+The sus_tsk directive suspends the execution of the task specified by tskid by putting it into SUSPEND state. SUSPEND state is released by issuing the rsm_tsk or frsm_tsk system call.
+
+If the task specified to sus_tsk is already in WAIT state, it will be put in the combined WAIT-SUSPEND state by the execution of sus_tsk. If wait conditions for the task are later fulfilled, it will enter SUSPEND state. If rsm_tsk is issued on the task, it will return to the WAIT state before the suspension.
+
+Both rsm_tsk and fsm_tsk system calls release SUSPEND state of the task specified by tskid. Specifically, they cause SUSPEND state to be released and the execution of the specified task to resume when the task has been suspended by the prior execution of sus_tsk.
+
+If the specified task is in WAIT-SUSPEND state, the execution of rsm_tsk only releases the SUSPEND state, and the task will become WAIT state.
+
+@subsection Task Manager Changing Task Priority
+The chg_pri system call changes the current priority of the task specified by tskid to the value specified by tskpri.
+
+A task may specify itself by specifying tskid = TSK_SELF = 0. Note, however, that an E_ID error will result if tskid = TSK_SELF = 0 is specified to a system call issued from a task-independent portion.
+
+The priority set by this system call remains in effect until the task exits. Once a task enters DORMANT state, its priority prior to exiting is lost. When a task which enters DORMANT state restarts, the initial task priority (itskpri) specified at task creation or at system startup will be used.
+
+@subsection Task Manager Task Deletion
+The del_tsk system call deletes the task specified by tskid. Specifically, it changes the state of the task specified by tskid from DORMANT into NON-EXISTENT (a virtual state not existing on the system), and then clears the TCB and releases stack. An E_OBJ error results if this system call is used on a task which is not DORMANT.
+
+After deletion, another task having the same ID number can be created.
+
+The exd_tsk system call causes the issuing task to exit and then delete itself.
+
+When a task exits, that task does not automatically release all the resources (memory blocks, semaphores, etc.) which it had secured prior to the call. It is the user's responsibility to see to it that all resources are released beforehand.
+
+@section System Calls
+
+This section details the task manager's services.
+A subsection is dedicated to each of this manager's services and describes the calling sequence, related constants, usage, and status codes.
+
+
+@c
+@c cre_tsk
+@c
+
+@page
+@subsection cre_tsk - Create Task
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER cre_tsk(
+ ID tskid,
+ T_CTSK *pk_ctsk
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_NOMEM} - Insufficient memory (Memory for control block and/or user stack cannot be allocated)
+
+@code{E_ID} - Invalid ID Number (tskid was invalid or could not be used)
+
+@code{E_RSATR} - Reserved attribute (tskatr was invalid or could not be used)
+
+@code{E_OBJ} - Invalid object state (a task of the same ID already exists)
+
+@code{E_OACV} - Object access violation (A tskid less than -4 was specified from a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (pk_ctsk, task, itskpri and/or stksz is invalid)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system call was issued from a task in dispatch disabled state or from a task-independent portion
+
+@code{EN_PAR} - A value outside the range supported by the target node and/or transmission packet format was specified as a parameter (a value outside supported range was specified for exinf, tskatr, task, itskpri and/or stksz)
+
+@subheading DESCRIPTION:
+This system call creates the task specified by tskid. Specifically, a TCB (Task Control Block) is allocated for the task to be created, and initialized according to accompanying parameter values of itskpri, task, tksz, etc. A stack area is also allocated for the task based on the parameter stksz.
+
+@subheading NOTES:
+User tasks have positive ID numbers, while system tasks have negative ID numbers. User tasks cannot access system objects (objects having negative ID numbers).
+
+The new task created by this system call will be put in DORMANT state.
+
+Extended information (exinf) has been added. This allows the user to include additional information about task attributes. If a larger region is desired for including user information, the user should allocate memory area and set the address of the memory packet to exinf.
+
+Multiprocessing is not supported. Thus none of the "EN_" status codes will be returned.
+
+
+@c
+@c del_tsk
+@c
+
+@page
+@subsection del_tsk - Delete Task
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER del_tsk(
+ ID tskid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID Number (tskid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the task specified by tskid does not exist)
+
+@code{E_OACV} - Object access violation (A tskid less than -4 was specified from a user task. This is implementation dependent.)
+
+@code{E_OBJ} - Invalid object state (the target task is not in DORMANT state)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system call was issued from a task in dispatch disabled state or from a task-independent portion
+
+@subheading DESCRIPTION:
+This system call deletes the task specified by tskid. Specifically, it changes the state of the task specified by tskid from DORMANT into NON-EXISTENT (a virtual state not existing on the system), and then clears the TCB and releases stack. An E_OBJ error results if this system call is used on a task which is not DORMANT.
+
+After deletion, another task having the same ID number can be created.
+
+@subheading NOTES:
+A task cannot delete itself by this system call. An E_OBJ error will result if a task specifies itself, since such a task cannot be DORMANT. Use the exd_tsk system call rather than this one when a task needs to delete itself.
+
+
+@c
+@c sta_tsk
+@c
+
+@page
+@subsection sta_tsk - Start Task
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER sta_tsk(
+ ID tskid,
+ INT stacd
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID Number (tskid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the task specified by tskid does not exist)
+
+@code{E_OACV} - Object access violation (A tskid less than -4 was specified from a user task. This is implementation dependent.)
+
+@code{E_OBJ} - Invalid object state (the target task is not in DORMANT state)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system call was issued from a task in dispatch disabled state or from a task-independent portion
+
+@code{EN_PAR} - A value outside the range supported by the target node and/or transmission packet format was specified as a parameter (a value outside supported range was specified for stacd)
+
+@subheading DESCRIPTION:
+This system call starts the task specified by tskid. Specifically, it changes the state of the task specified by tskid from DORMANT into RUN/READY.
+
+Stacd can be used to specify parameters to be passed to the task when it is started. This parameter can be read by the task being started, and may be used for transmitting simple messages.
+
+The task priority on starting the task is given by the initial task priority parameter (itskpri) specified when the task was created.
+
+Start request is not queued in this this system call. In other words, if this system call is issued when the target task is not in DORMANT state, the system call will be ignored, and an E_OBJ error returned to the issuing task.
+
+If cre_tsk [level EN] is not implemented on a system, tasks are created statically when the system is started. Parameters required for creating a task, such as task starting address (task) and initial task priority (itskpri) are also specified statically at system startup.
+
+@subheading NOTES:
+
+
+@c
+@c ext_tsk
+@c
+
+@page
+@subsection ext_tsk - Exit Issuing Task
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+void ext_tsk(void);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_CTX} - Context error (issued from task-independent portions or a task in dispatch disabled state)
+
+ * System call may detect this error. The error is not returned to the context issuing the system call. Error codes therefore cannot be returned directly as a return parameter of the system call. The behavior on error detection is implementation dependent.
+
+
+@subheading DESCRIPTION:
+This system call causes the issuing task to exit, changing the state of the task into the DORMANT state.
+
+@subheading NOTES:
+When a task exits due to ext_tsk, that task does not automatically release all the resources (memory blocks, semaphores, etc.) which it had obtained prior to the system call. It is the user's responsibility that all resources are released beforehand.
+
+Ext_tsk is a system call which does not return to the issuing context. Accordingly, even if an error code is returned on detection of some error, it is normal for tasks making this system call not to perform any error checking, and it is in fact possible that a program could run out of control. For this reason, even if an error is detected upon issuing this system call, the error is not returned to the task which issued the system call. If information on detected errors is required it should be left in a messagebuffer used as an error log.
+
+In principle, information concerning a task recorded in the TCB, such as task priority, is reset whenever a task is placed in DORMANT state. For example, its task priority after being restarted would be reset to the initial task priority (itskpri) specified by cre_tsk when it was first created, even if a task's priority was changed using chg_pri, then that task exits using ext_tsk, but later started by sta_tsk. Task priority does not return to what it was when ext_tsk was executed.
+
+
+@c
+@c exd_tsk
+@c
+
+@page
+@subsection exd_tsk - Exit and Delete Issuing Task
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+void exd_tsk(void);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_CTX} - Context error (issued from task-independent portions or a task in dispatch disabled state)
+
+ * System call may detect the following error. The error is not returned to the context issuing the system call even. Error codes therefore cannot be returned directly as a return parameter of the system call. The behavior on error detection is implementation dependent.
+
+@subheading DESCRIPTION:
+This system call causes the issuing task to exit and then delete itself. In other words the state of the issuing task changes into the NON-EXISTENT (a virtual state not existing on the system).
+
+@subheading NOTES:
+When a task exits with exd_tsk, that task does not automatically release all the resources (memory blocks, semaphores, etc.) which it had secured prior to the call. It is the user's responsibility to see to it that all resources are released beforehand.
+
+Exd_tsk is a system call which does not return any parameters to the original issuing context. Accordingly, even if an error code is returned on detection of some error, it is normal for tasks making this system call not to perform any error checking, and it is in fact possible that a program could run out of control. For this reason, even if an error is detected upon making this system call, it is supposed that the error is not returned to the task which issued the system call. If information on detected errors is required it should be left in a messagebuffer used as an error log.
+
+
+@c
+@c ter_tsk
+@c
+
+@page
+@subsection ter_tsk - Terminate Other Task
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ter_tsk(
+ ID tskid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID Number (tskid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the task specified by tskid does not exist)
+
+@code{E_OACV} - Object access violation (A tskid less than -4 was specified from a user task. This is implementation dependent.)
+
+@code{E_OBJ} - Invalid object state (the target task is already in DORMANT state or a task invalidly specified itself)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system call was issued from a task in dispatch disabled state or from a task-independent portion
+
+@subheading DESCRIPTION:
+This system call forcibly terminates the task specified by tskid. That is, it changes the state of the task specified by tskid into DORMANT.
+
+Even if the target task is in wait state (including SUSPEND state), its wait state will be released and then it will be terminated. If the target task is on a queue of some sort (such as waiting for a semaphore), it will be removed from that queue by ter_tsk.
+
+A task cannot specify the issuing task in this system call. An E_OBJ error will result if a task specifies itself.
+
+There is an intermediate state waiting for the response (TR packet or TA packet) from the target node after executing the system call to access the other node and making a request (sending a TP packet) to the node. This state is called the "connection function response wait (TTW_NOD)" state. The ter_tsk system call may specify tasks which are in the connection function response wait state. Tasks which are waiting for objects (such as a semaphore) on another node may also be specified to this system call. In such cases, ter_tsk will halt any system calls accessing other nodes which have been issued by the task to be terminated.
+
+@subheading NOTES:
+When a task is terminated by ter_tsk, that task does not automatically release all the resources (memory blocks, semaphores, etc.) which it had obtained prior to the call. It is the user's responsibility to see to it that all resources are released beforehand.
+
+In principle, information concerning a task recorded in the TCB, such as task priority, is reset whenever a task is placed in DORMANT state. For example, its task priority after being restarted would be reset to the initial task priority (itskpri) specified by cre_tsk when it was first created, even if a task's priority was changed using chg_pri, then that task is terminated by ter_tsk, but later started by sta_tsk. Task priority does not return to what it was when ter_tsk was executed.
+
+
+@c
+@c dis_dsp
+@c
+
+@page
+@subsection dis_dsp - Disable Dispatch
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER dis_dsp(void);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_CTX} - Context error (issued from task-independent portions or issued after execution of loc_cpu)
+
+@subheading DESCRIPTION:
+This system call disables task dispatching. Dispatching will remain disabled after this call is issued until a subsequent call to ena_dsp is issued. The status of the issuing task will not be allowed to be changed to READY from the RUN. It cannot be changed into WAIT, either. However, since external interrupt is not disabled, interrupt handlers are allowed to run even when dispatching has been disabled. While an executing task may be preempted by an interrupt handler with dispatching disabled, there is no possibility that it will be preempted by another task.
+
+The following operations occur during the time dispatching is disabled.
+@itemize @bullet
+@item Even in a situation where normally a task issuing dis_dsp should be preempted by a system call issued by an interrupt handler or by the task issuing dis_dsp, the task that should normally be executed is not dispatched. Instead, dispatching of this task is delayed until dispatch disabled state is cleared by ena_dsp.
+
+@item If an interrupt handler invoked during dispatch disabled state issues sus_tsk for a running task (one that executed dis_dsp) to put it in SUSPEND state, or ter_tsk to put it in DORMANT state, the task transition is delayed until dispatch disabled state is cleared.
+
+@item An E_CTX error will result if the task which has executed dis_dsp issues any system calls (such as slp_tsk or wai_sem) capable of putting an issuing task into WAIT state.
+
+@item An EN_CTXID error will result if a task which has executed dis_dsp attempts to operate on objects on another node (that is, if the ID parameter of the system call issued refers to an object on another node).
+
+@item TSS_DDSP will be returned as sysstat if system status is referenced using ref_sys.
+@end itemize
+No error will result if a task already in dispatch disable state issues dis_dsp. It only keeps dispatch disabled state. No matter how many times dis_dsp has been issued, a single ena_dsp enables dispatching again. It is therefore for the user to determine what to do with nested pairs of dis_dsp and ena_dsp.
+
+An E_CTX error will result if dis_dsp is issued when both interrupt and dispatching are disabled with loc_cpu. (For details, see the description of loc_cpu.)
+
+@subheading NOTES:
+A running task cannot enter DORMANT or NON-EXISTENT state while dispatching is disabled. An E_CTX error will result if an running task issues either ext_tsk or exd_tsk while interrupt and dispatching are disabled. Note however that since both ext_tsk and exd_tsk are system calls which do not return to their original contexts, error notification using return parameters of these system calls is not possible. If information on detected errors is required it should be left in a messagebuffer used as an error log.
+
+Only if the system is not a multiprocessor configuration, system can take advantage of the dispatch disabled state for exclusive inter-task control.
+
+
+@c
+@c ena_dsp
+@c
+
+@page
+@subsection ena_dsp - Enable Dispatch
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ena_dsp(void);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_CTX} - Context error (issued from task-independent portions or issued after execution of loc_cpu)
+
+@subheading DESCRIPTION:
+This system call enables task dispatching, that is, it finishes dispatch disabled state caused by the execution of dis_dsp.
+
+No error will result if a task which is not in dispatch disabled state issues ena_dsp. In this case, dispatching will just remain enabled.
+
+An E_CTX error will result if ena_dsp is issued when both interrupt and dispatching are disabled with loc_cpu. (For details, see the description of loc_cpu.)
+
+@subheading NOTES:
+
+
+@c
+@c chg_pri
+@c
+
+@page
+@subsection chg_pri - Change Task Priority
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER chg_pri(
+ ID tskid,
+ PRI tskpri
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID Number (tskid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the task specified by tskid does not exist)
+
+@code{E_OACV} - Object access violation (A tskid less than -4 was specified from a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (the value of tskpri is invalid or may not be used)
+
+@code{E_OBJ} - Invalid object state (the target task is in DORMANT state)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the target node is specified.
+
+@code{EN_CTXID} = Specified an object on another node when the system call was issued from a task in dispatch disabled state or from a task-independent portion
+
+@code{EN_PAR} - A value outside the range supported by the target node and/or transmission packet format was specified as a parameter (a value outside supported range was specified for tskpri)
+
+@subheading DESCRIPTION:
+This system call changes the current priority of the task specified by tskid to the value specified by tskpri.
+
+Under uITRON 3.0 specification, at least any value of 1 through 8 can be specified as task priority. The smaller the value, the higher the priority. Priority levels -4 through 0 are reserved, and they may not be used. Priority levels outside this range (including negative values) may also be specified depending on the implementation; this is considered an extended function [level X] for which compatibility and connectivity are not guaranteed. In general, negative priority levels are reserved for use by the system.
+
+A task may specify itself by specifying tskid = TSK_SELF = 0. Note, however, that an E_ID error will result if tskid = TSK_SELF = 0 is specified to a system call issued from a task-independent portion. The priority set by this system call remains in effect until the task exits. Once a task enters DORMANT state, its priority prior to exiting is lost. When a task which enters DORMANT state restarts, the initial task priority (itskpri) specified at task creation or at system startup will be used.
+
+If the target task is linked to ready queue or any other queue, this system call may result in the re-ordering of the queues. If chg_pri is executed on a task waiting on the ready queue (including tasks in RUN state) or other priority-based queue, the target task will be moved to the end of the part of the queue for the associated priority. If the priority specified is the same as the current priority, the task will still be moved behind other tasks of the same priority. It is therefore possible for a task to relinquish its execution privileges using chg_pri on itself by specifying its current priority.
+
+@subheading NOTES:
+Depending on the implementation, specifying tskpri = TPRI_INI = 0 may cause a task's priority to be reset to the initial task priority (itskpri) which was defined when it was first created or when the system started. This feature is used in some implementations in order to reset the task priority to its original value after setting it to a higher value for indivisible processing. This feature is an extended function [level X] for which compatibility and connectivity are not guaranteed.
+
+
+@c
+@c rot_rdq
+@c
+
+@page
+@subsection rot_rdq - Rotate Tasks on the Ready Queue
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER rot_rdq(
+ PRI tskpri
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_PAR} - Parameter error (the value of tskpri is invalid)
+
+@subheading DESCRIPTION:
+This system call rotates tasks on the ready queue associated with the priority level specified by tskpri. Specifically, the task at the head of the ready queue of the priority level in question is moved to the end of the ready queue, thus switching the execution of tasks having the same priority. Round robin scheduling may be implemented by periodically issuing this system call in a given period of time.
+
+When rot_rdq is issued by task portions with tskpri = TPRI_RUN = 0, the ready queue with the priority level of the issuing task is rotated.
+
+When TPRI_RUN or a task's own priority level are specified for tskpri to rot_rdq, the task issuing the system call will be placed on the end of its ready queue. In other words, task can issue rot_rdq to relinquishing its execution privileges. The concept of "ready queue" envisioned in the description of this system call is one which includes the task in RUN state.
+
+This system call does nothing if there are no tasks on the ready queue of the specified priority. No error will result.
+
+This system call cannot rotate ready queues on other nodes.
+
+@subheading NOTES:
+Depending on the implementation, it may be possible to issue rot_rdq(tskpri = TPRI_RUN) from task-independent portions, such as a cyclic handler. In this case the ready queue including the running task, or the ready queue including the highest priority task, is rotated. Normally these two are the same, but not always, as when task dispatching is delayed. In that case it is implementation dependent whether to rotate the ready queue including the running task or the ready queue including the highest priority task. Note that this is an extended function [Level X] for which compatibility and connectivity are not guaranteed.
+
+
+@c
+@c rel_wai
+@c
+
+@page
+@subsection rel_wai - Release Wait of Other Task
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER rel_wai(
+ ID tskid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID Number (tskid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the task specified by tskid does not exist)
+
+@code{E_OACV} - Object access violation (A tskid less than -4 was specified from a user task. This is implementation dependent.)
+
+@code{E_OBJ} - Invalid object state (the target task is not in WAIT state (including when it is in DORMANT state or when the issuing task specifies itself))
+
+@code{EN_OBJNO} - An object number which could not be accessed on the target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system call was issued from a task in dispatch disabled state or from a task-independent portion
+
+@subheading DESCRIPTION:
+This system call forcibly releases WAIT state (not including SUSPEND state)
+of the task specified by tskid.
+
+An E_RLWAI error is returned to the task whose WAIT state has been released using rel_wai.
+
+Wait release requests by rel_wai are not queued. In other words, if the task specified by tskid is already in WAIT state, the WAIT state is released, otherwise an E_OBJ error will be returned to the issuer. An E_OBJ error will also result when a task specifies itself to this system call.
+
+Rel_wai does not release SUSPEND state. If rel_wai is issued on a task in WAIT-SUSPEND state, WAIT will be released but SUSPEND will continue for that task. When SUSPEND should also be released, the frsm_tsk system call must be issued separately.
+
+@subheading NOTES:
+A function similar to timeout can be implemented using an alarm handler which issues this system call on tasks specified time after they have entered WAIT state.
+
+Rel_wai and wup_tsk differ in the following points.
+@itemize @bullet
+@item Wup_tsk can only release the WAIT state by slp_tsk or tslp_tsk, while rel_wai can release WAIT states caused by these and other calls (including wai_flg, wai_sem, rcv_msg, get_blk, etc.).
+@item As seen from the target task, releasing WAIT state with wup_tsk results in a normal completion (E_OK), whereas releasing WAIT state with rel_wai results in an error (E_RLWAI).
+@item When wup_tsk is used, a request is queued even if neither slp_tsk nor tslp_tsk have been executed on the target task yet. When rel_wai is used to the task which is not in WAIT state, an E_OBJ error will result.
+@end itemize
+
+
+@c
+@c get_tid
+@c
+
+@page
+@subsection get_tid - Get Task Identifier
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER get_tid(
+ ID *p_tskid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@subheading DESCRIPTION:
+This system call gets the ID of the issuing task.
+
+If this system call is issued from a task-independent portion, tskid will be FALSE=0.
+
+@subheading NOTES:
+
+
+@c
+@c ref_tsk
+@c
+
+@page
+@subsection ref_tsk - Reference Task Status
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ref_tsk(
+ T_RTSK *pk_rtsk,
+ ID tskid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID Number (tskid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the task specified by tskid does not exist)
+
+@code{E_OACV} - Object access violation (A tskid less than -4 was specified from a user task. This is implementation dependent.)
+
+@code{E_PAR} - Parameter error (the packet address for return parameters cannot be used)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system call was issued from a task in dispatch disabled state or from a task-independent portion
+
+@code{EN_RPAR} - A value outside the range supported by the requesting node and/or transmission packet format was returned as a return parameter (a value outside supported range was returned for exinf, tskpri and/or tskstat)
+
+@subheading DESCRIPTION:
+This system call refers to the state of the task specified by tskid, and returns its current priority (tskpri), its task state (tskstat), and its extended information (exinf).
+
+Tskstat may take the following values.
+
+ tskstat:
+@itemize @bullet
+@item TTS_RUN H'0...01 RUN state (currently running)
+@item TTS_RDY H'0...02 READY state (ready to run)
+@item TTS_WAI H'0...04 WAIT state (waiting for something)
+@item TTS_SUS H'0...08 SUSPEND state (forcibly made to wait)
+@item TTS_WAS H'0...0c WAIT-SUSPEND state
+@item TTS_DMT H'0...10 DORMANT state
+@end itemize
+
+Since these task states are expressed by bit correspondences they are convenient when looking for OR conditions (such as whether a task is in RUN or READY state). TTS_WAS is a combination of both TTS_SUS and TTS_WAI, TTS_SUS does not combine with any of the other states (TTS_RUN, TTS_RDY or TTS_DMT).
+
+A task may specify itself by specifying tskid = TSK_SELF = 0. Note, however, that an E_ID error will result if tskid = TSK_SELF = 0 is specified when this system call is issued from a task-independent portion.
+
+An E_NOEXS error will result if the task specified to ref_tsk does not exist.
+
+Tskstat will be TTS_RUN if ref_tsk is executed specifying a task which has been interrupted by an interrupt handler.
+
+@subheading NOTES:
+The values of TTS_RUN, TTS_RDY, TTS_WAI, etc. as return values for tskstat are not necessarily the same value to be entered in the TCB. The way in which task state is represented in the TCB is implementation dependent. When ref_tsk is executed, the internal representation of task state may simply be converted to the standard values TTS_RUN, TTS_RDY, TTS_WAI, etc.
+
+Depending on the implementation, the following additional information can also be referenced in addition to exinf, tskpri and tskstat.
+
+@itemize @bullet
+@item tskwait Reason for wait
+@item wid Wait object ID
+@item wupcnt Number of queued wakeup requests
+@item suscnt Number of nested SUSPEND requests
+@item tskatr Task attributes
+@item task Task starting address
+@item itskpri Initial task priority
+@item stksz Stack size
+@end itemize
+
+
+
+
+
diff --git a/doc/itron3.0/tasksync.t b/doc/itron3.0/tasksync.t
new file mode 100644
index 0000000000..8db2ca30ec
--- /dev/null
+++ b/doc/itron3.0/tasksync.t
@@ -0,0 +1,388 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c This is the chapter from the RTEMS ITRON User's Guide that
+@c documents the services provided by the task-dependent synchronization
+@c manager.
+@c
+@c $Id$
+@c
+
+@chapter Task-Dependent Synchronization Manager
+
+@section Introduction
+
+The task-dependent synchronization manager is designed to utilize those synchronization
+functions already supported by tasks. This includes functions that suspend tasks for a while and associated functions that release SUSPEND state, and synchronization functions which make tasks wait and wake them up.
+
+The services provided by the task-dependent synchronization manager are:
+
+@itemize @bullet
+@item @code{sus_tsk} - Suspend Other Task
+@item @code{rsm_tsk} - Resume Suspended Task
+@item @code{frsm_tsk} - Forcibly Resume Suspended Task
+@item @code{slp_tsk} - Sleep Task
+@item @code{tslp_tsk} - Sleep Task with Timeout
+@item @code{wup_tsk} - Wakeup Other Task
+@item @code{can_wup} - Cancel Wakeup Request
+@end itemize
+
+@section Operations
+@subsection Suspend Other Task
+This call stops the execution of a task by putting it into a SUSPEND state. This call is not able to specify itself, since this would end the flow of execution altogether. If the task is already in a WAIT state, then SUSPEND is added to become WAIT-SUSPEND. These modes are turned on and off separately, without affecting one another. Furthermore, SUSPEND states can be nested, and tasks in a SUSPEND state are allocated resources as normal.
+
+@subsection Resume Suspended Task
+This operation restarts the execution of a task that was previously stopped by the SUSPEND OTHER TASK call. Obviously, a task cannot specify itself using this call. Since SUSPEND states can be nested, one call to RESUME releases only one SUSPEND. Thus, it takes as many RESUMES as SUSPENDS to return the task to execution.
+
+@subsection Forcibly Resume Suspended Task
+This call has the same functionality as the previously mentioned Resume Suspended Task with one exception. This call releases all nested SUSPENDS at once, which guarantees the task will return to execution.
+
+@subsection Sleep Task
+The Sleep Task operation causes the specified task to sleep until a Wakeup Task function is called. This puts the task in a WAIT state. WAIT states can not be nested, but can be combined with SUSPEND states as mentioned earlier.
+
+@subsection Sleep Task with Timeout
+This function is identical to the Sleep Task function with an added timeout attribute. If the timeout mark is reached before a Wakeup call is recieved, an error is generated.
+
+@subsection Wakeup Other Task
+The Wakeup Other Task call is used to release the WAIT state of a task. These calls can be previously queued using the wupcnt value so that when the matching Sleep Task is executed, there will be no delay.
+
+@subsection Cancel Wakeup Request
+This function call resets the value of wupcnt to zero, thereby canceling all associated wakeup requests. A call to self is acceptable for this operation, and may even be useful for monitoring certain situations.
+
+@section System Calls
+
+This section details the task-dependent synchronization manager's services. A subsection is dedicated to each of this manager's services and describes the calling sequence, related constants, usage, and status codes.
+
+
+@c
+@c sus_tsk
+@c
+
+@page
+@subsection sus_tsk - Suspend Other Task
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER sus_tsk(
+ ID tskid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID Number (tskid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the task specified by tskid does not exist)
+
+@code{E_OACV} - Object access violation (A tskid less than -4 was specified from a user task. This is implementation dependent.)
+
+@code{E_OBJ} - Invalid object state (the specified task is in DORMANT state or the issuing task specified itself)
+
+@code{E_QOVR} - Queuing or nesting overflow (the number of nesting levels given by suscnt went over the maximum allowed)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system call was issued from a task in dispatch disabled state or from a task-independent portion
+
+@subheading DESCRIPTION:
+This system call suspends the execution of the task specified by tskid by putting it into SUSPEND state.
+
+SUSPEND state is released by issuing the rsm_tsk or frsm_tsk system call. If the task specified to sus_tsk is already in WAIT state, it will be put in the combined WAIT-SUSPEND state by the execution of sus_tsk. If wait conditions for the task are later fulfilled, it will enter SUSPEND state. If rsm_tsk is issued on the task, it will return to the WAIT state before the suspension.
+
+Since SUSPEND state indicates the suspension of execution by a system call issued from another task, a task may not specify itself to this system call. An E_OBJ error will result if a task specifies itself.
+
+If more than one sus_tsk call is issued to a task, that task will be put in multiple SUSPEND states. This is called suspend request nesting. When this is done, rsm_tsk must be issued the same number of times which sus_tsk was issued (suscnt) in order to return the task to its original state before the suspension. This means it is possible to nest the pairs of sus_tsk and rsm_tsk.
+
+The maximum number of times suspend requests may be nested, and even whether or not suspend request nesting (the ability to issue sus_tsk on the same task more than once) is even allowed, is implementation dependent. Suspend request nesting is considered an extended function [level X] for which compatibility and connectivity are not guaranteed.
+
+An E_QOVR error will result if sus_tsk is issued more than once on the same task on a system which does not support suspend request nesting or if it is issued more than the maximum number of times allowed.
+
+@subheading NOTES:
+A task which is suspended in addition to waiting for resources (such as waiting for a semaphore) can be allocated resources (such as semaphore counts) based on the same conditions as tasks which are not suspended. Even when suspended, the allocation of resources is not delayed in any way. Conditions concerning resource allocation and release of the wait state remain unchanged. In other words, SUSPEND state is completely independent of other processing and task states. If it is desirable to delay the allocation of resources to a task which is suspended, the user should use chg_pri in conjunction with sus_tsk and rsm_tsk.
+
+@c
+@c rsm_tsk
+@c
+
+@page
+@subsection rsm_tsk - Resume Suspended Task
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER rsm_tsk(
+ ID tskid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID Number (tskid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the task specified by tskid does not exist)
+
+@code{E_OACV} - Object access violation (A tskid less than -4 was specified from a user task. This is implementation dependent.)
+
+@code{E_OBJ} - Invalid object state (the target task is not in SUSPEND state (including when it is DORMANT or when the issuing task specifies itself))
+
+@code{EN_OBJNO} - An object number which could not be accessed on the target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system call was issued from a task in dispatch disabled state or from a task-independent portion
+
+@subheading DESCRIPTION:
+This system call releases SUSPEND state of the task specified by tskid. Specifically, it causes SUSPEND state to be released and the execution of the specified task to resume when the task has been suspended by the prior execution of sus_tsk.
+If the specified task is in WAIT-SUSPEND state, the execution of rsm_tsk only releases the SUSPEND state, and the task will become WAIT state.
+
+A task cannot specify itself to this system call. An E_OBJ error will result if a task specifies itself.
+
+Rsm_tsk only releases one suspend request from the suspend request nest (suscnt). Accordingly, if more than one sus_tsk has been issued on the task in question (suscnt >= 2), that task will remain suspended even after the execution of rsm_tsk is completed.
+
+@subheading NOTES:
+It is implementation dependent which location in the ready queue a task returns to after the task which has been suspended from RUN or READY state is resumed by rsm_tsk.
+
+@c
+@c frsm_tsk
+@c
+
+@page
+@subsection frsm_tsk - Forcibly Resume Suspended Task
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ercd =frsm_tsk(
+ ID tskid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID Number (tskid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the task specified by tskid does not exist)
+
+@code{E_OACV} - Object access violation (A tskid less than -4 was specified from a user task. This is implementation dependent.)
+
+@code{E_OBJ} - Invalid object state (the target task is not in SUSPEND state (including when it is DORMANT or when the issuing task specifies itself))
+
+@code{EN_OBJNO} - An object number which could not be accessed on the target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system call was issued from a task in dispatch disabled state or from a task-independent portion
+
+@subheading DESCRIPTION:
+This system call releases SUSPEND state of the task specified by tskid. Specifically, it causes SUSPEND state to be released and the execution of the specified task to resume when the task has been suspended by the prior execution of sus_tsk. If the specified task is in WAIT-SUSPEND state, the execution of rsm_tsk only releases the SUSPEND state, and the task will become WAIT state.
+
+A task cannot specify itself to this system call. An E_OBJ error will result if a task specifies itself.
+
+Frsm_tsk will clear all suspend requests (suscnt = 0) even if more than one sus_tsk has been issued (suscnt >= 2) on the same task. In other words, SUSPEND state is guaranteed to be released, and execution will resume unless the task in question had been in combined WAIT-SUSPEND state.
+
+@subheading NOTES:
+It is implementation dependent which location in the ready queue a task returns to after the task which has been suspended from RUN or READY state is resumed by frsm_tsk.
+
+
+@c
+@c slp_tsk
+@c
+
+@page
+@subsection slp_tsk - Sleep Task Sleep Task with Timeout
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER slp_tsk( void );
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_PAR} - Parameter error (a timeout value -2 or less was specified)
+
+@code{E_RLWAI} - WAIT state was forcibly released (rel_wai was received while waiting)
+
+@code{E_TMOUT} - Polling failure or timeout exceeded
+
+@code{E_CTX} - Context error (issued from task-independent portions or a task in dispatch disabled state)
+
+@subheading DESCRIPTION:
+
+This system call puts the issuing task (which was in RUN state) into WAIT state, causing the issuing task to sleep until wup_tsk is invoked.
+
+@subheading NOTES:
+Since the slp_tsk system call causes the issuing task to enter WAIT state, slp_tsk calls may not be nested. It is possible, however, for another task to execute a sus_tsk on a task which has put itself in WAIT state using slp_tsk. If this happens, the task will enter the combined WAIT-SUSPEND state.
+
+No polling function for slp_tsk is provided. A similar function can be implemented if necessary using can_wup.
+
+@c
+@c tslp_tsk
+@c
+
+@page
+@subsection tslp_tsk - Sleep Task with Timeout
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ercd =tslp_tsk(
+ TMO tmout
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_PAR} - Parameter error (a timeout value -2 or less was specified)
+
+@code{E_RLWAI} - WAIT state was forcibly released (rel_wai was received while waiting)
+
+@code{E_TMOUT} - Polling failure or timeout exceeded
+
+@code{E_CTX} - Context error (issued from task-independent portions or a task in dispatch disabled state)
+
+@subheading DESCRIPTION:
+The tslp_tsk system call is the same as slp_tsk but with an additional timeout feature. If a wup_tsk is issued before the period of time specified by tmout elapses, tslp_tsk will complete normally. An E_TMOUT error will result if no wup_tsk is issued before the time specified by tmout expires. Specifying tmout = TMO_FEVR = -1 can be used to set the timeout period to forever (no timeout). In this case, tslp_tsk will function exactly the same as slp_tsk causing the issuing task to wait forever for wup_tsk to be issued.
+
+@subheading NOTES:
+Since the tslp_tsk system call causes the issuing task to enter WAIT state, tslp_tsk calls may not be nested. It is possible, however, for another task to execute a sus_tsk on a task which has put itself in WAIT state using tslp_tsk. If this happens, the task will enter the combined WAIT-SUSPEND state.
+
+If you simply wish to delay a task (make it wait for a while), use dly_tsk rather than tslp_tsk.
+
+@c
+@c wup_tsk
+@c
+
+@page
+@subsection wup_tsk - Wakeup Other Task
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER wup_tsk(
+ ID tskid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID Number (tskid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the task specified by tskid does not exist)
+
+@code{E_OACV} - Object access violation (A tskid less than -4 was specified from a user task. This is implementation dependent.)
+
+@code{E_OBJ} - Invalid object state (the specified task is in DORMANT state or the issuing task specified itself)
+
+@code{E_QOVR} - Queuing or nesting overflow (wakeup request queuing count will exceed the maximum value allowed for wupcnt)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system call was issued from a task in dispatch disabled state or from a task-independent portion
+
+@subheading DESCRIPTION:
+This system call releases the WAIT state of the task specified by tskid caused by the execution of slp_tsk or tslp_tsk.
+
+A task cannot specify itself in this system call. An E_OBJ error will result if a task specifies itself.
+
+If the specified task is not in the WAIT state caused by a slp_tsk or tslp_tsk, the wakeup request based on the wup_tsk call will be queued. In other words, a record will be kept that a wup_tsk has been issued for the specified task and no WAIT state will result even if slp_tsk or tslp_tsk is executed by the task later. This is called queuing for wakeup request.
+
+@subheading NOTES:
+Wakeup requests are queued as follows. A wakeup request queuing count (wupcnt) is kept in the TCB for each task. Initially (when sta_tsk is executed) the value of wupcnt is 0. Executing wup_tsk on a task which is not waiting for a wakeup increments the wakeup request queuing count by one for the specified task. If slp_tsk or tslp_tsk is executed on that task, its wakeup request queuing count will be decremented by one. If the task with wakeup request queuing count = 0 executes slp_tsk or tslp_tsk, that task will be put in WAIT state rather than decrementing the wakeup request queuing count.
+
+It is always possible to queue at least one wup_tsk (wupcnt = 1); the maximum allowable number for the wakeup request queuing count (wupcnt) is implementation dependent, and may be any number higher than or equal to one. In other words, while the first wup_tsk issued to a task which is not waiting for a wakeup will not result in an error, it is implementation dependent whether or not any further wup_tsk calls on the same task will result in an error. The ability to queue more than one wakeup request is considered an extended function [level X] for which compatibility and connectivity are not guaranteed.
+
+An E_QOVR error will result if wup_tsk is issued more than the maximum value allowed for the wakeup request queuing count (wupcnt).
+
+
+@c
+@c can_wup
+@c
+
+@page
+@subsection can_wup - Cancel Wakeup Request
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER can_wup(
+ INT *p_wupcnt,
+ ID tskid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{E_OK} - Normal Completion
+
+@code{E_ID} - Invalid ID Number (tskid was invalid or could not be used)
+
+@code{E_NOEXS} - Object does not exist (the task specified by tskid does not exist)
+
+@code{E_OACV} - Object access violation (A tskid less than -4 was specified from a user task. This is implementation dependent.)
+
+@code{E_OBJ} - Invalid object state (the target task is in DORMANT state)
+
+@code{EN_OBJNO} - An object number which could not be accessed on the target node is specified.
+
+@code{EN_CTXID} - Specified an object on another node when the system call was issued from a task in dispatch disabled state or from a task-independent portion
+
+@code{EN_RPAR} - A value outside the range supported by the issuing node and/or transmission packet format was returned as a return parameter (a value outside supported range was returned for wupcnt)
+
+@subheading DESCRIPTION:
+This system call returns the wakeup request queuing count (wupcnt) for the task specified by tskid while canceling all associated wakeup requests. Specifically, it resets the wakeup request queuing count (wupcnt) to 0.
+
+A task may specify itself by specifying tskid = TSK_SELF = 0. Note, however, that an E_ID error will result if tskid = TSK_SELF = 0 is specified when this system call is issued from a task-independent portion.
+
+@subheading NOTES:
+An EN_RPAR error will result if the number of bits used on the target node is larger than that used on the requesting node, and if a value not supported by the requesting node is returned for wupcnt.
+
+This system call can be used to determine whether or not processing has ended within a certain period when a task should periodically waken up by wup_tsk and do some processing. In other words, if a task monitoring the progress of its processing issues can_wup before issuing a slp_tsk after finishing processing associated with a previous wakeup request, and if wupcnt, one of can_wup's return parameters, is equal to or greater than one, it indicates that the processing for the previous wakeup request does not complete within a required time. This allows the monitoring task to take actions against processing delays.
+
+
diff --git a/doc/itron3.0/time.t b/doc/itron3.0/time.t
new file mode 100644
index 0000000000..c542889cbd
--- /dev/null
+++ b/doc/itron3.0/time.t
@@ -0,0 +1,310 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c This is the chapter from the RTEMS ITRON User's Guide that
+@c documents the services provided by the time
+@c manager.
+@c
+@c $Id$
+@c
+
+@chapter Time Manager
+
+@section Introduction
+
+The
+time manager is ...
+
+The services provided by the time manager are:
+
+@itemize @bullet
+@item @code{get_tim} - Get System Clock
+@item @code{set_tim} - Set System Clock
+@item @code{dly_tsk} - Delay Task
+@item @code{def_cyc} - Define Cyclic Handler
+@item @code{act_cyc} - Activate Cyclic Handler
+@item @code{ref_cyc} - Reference Cyclic Handler Status
+@item @code{def_alm} - Define Alarm Handler
+@item @code{ref_alm} - Reference Alarm Handler Status
+@item @code{ret_tmr} - Return from Timer Handler
+@end itemize
+
+@section Background
+
+@section Operations
+
+@section System Calls
+
+This section details the time manager's services.
+A subsection is dedicated to each of this manager's services
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+
+@c
+@c get_tim
+@c
+
+@page
+@subsection get_tim - Get System Clock
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER get_tim(
+ SYSTIME *pk_tim
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c set_tim
+@c
+
+@page
+@subsection set_tim - Set System Clock
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER set_tim(
+ SYSTIME *pk_tim
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c dly_tsk
+@c
+
+@page
+@subsection dly_tsk - Delay Task
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER dly_tsk(
+ DLYTIME dlytim
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c def_cyc
+@c
+
+@page
+@subsection def_cyc - Define Cyclic Handler
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER def_cyc(
+ HNO cycno,
+ T_DCYC *pk_dcyc
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c act_cyc
+@c
+
+@page
+@subsection act_cyc - Activate Cyclic Handler
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER act_cyc(
+ HNO cycno,
+ UINT cycact
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c ref_cyc
+@c
+
+@page
+@subsection ref_cyc - Reference Cyclic Handler Status
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ref_cyc(
+ T_RCYC *pk_rcyc,
+ HNO cycno
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c def_alm
+@c
+
+@page
+@subsection def_alm - Define Alarm Handler
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER def_alm(
+ HNO almno,
+ T_DALM *pk_dalm
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c ref_alm
+@c
+
+@page
+@subsection ref_alm - Reference Alarm Handler Status
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+ER ref_alm(
+ T_RALM *pk_ralm,
+ HNO almno
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c ret_tmr
+@c
+
+@page
+@subsection ret_tmr - Return from Timer Handler
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+void ret_tmr(
+
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
diff --git a/doc/main.am b/doc/main.am
new file mode 100644
index 0000000000..b5dde0910c
--- /dev/null
+++ b/doc/main.am
@@ -0,0 +1,9 @@
+
+html_projectdir = $(htmldir)/$(PROJECT)
+
+TEXI2WWW_ARGS=\
+-I $(srcdir) -I $(top_srcdir) -I $(top_builddir) \
+-dirfile ../index.html \
+-header rtems_header.html \
+-footer rtems_footer.html \
+-icons ../images
diff --git a/doc/networking/.cvsignore b/doc/networking/.cvsignore
new file mode 100644
index 0000000000..454ed33d08
--- /dev/null
+++ b/doc/networking/.cvsignore
@@ -0,0 +1,31 @@
+decdriver.texi
+driver.texi
+index.html
+Makefile
+Makefile.in
+mdate-sh
+networkapp.texi
+networkflow.pdf
+networking
+networking.aux
+networking.cp
+networking.dvi
+networking.fn
+networking*.html
+networking.ky
+networking.log
+networking.pdf
+networking.pg
+networking.ps
+networking.toc
+networking.tp
+networking.vr
+networktasks.texi
+PCIreg.pdf
+recvbd.pdf
+rtems_footer.html
+rtems_header.html
+servers.texi
+stamp-vti
+testing.texi
+version.texi
diff --git a/doc/networking/Makefile.am b/doc/networking/Makefile.am
new file mode 100644
index 0000000000..4cdec6e69f
--- /dev/null
+++ b/doc/networking/Makefile.am
@@ -0,0 +1,71 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = networking
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/main.am
+
+BMENU2 += -c
+
+GENERATED_FILES = networkapp.texi driver.texi networktasks.texi testing.texi \
+ servers.texi decdriver.texi
+
+COMMON_FILES += $(top_srcdir)/common/cpright.texi
+
+FILES = networktasks.texi preface.texi
+
+info_TEXINFOS = networking.texi
+networking_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+$(PROJECT).dvi: networkflow.eps PCIreg.eps recvbd.eps
+
+PDF_IMAGES = networkflow.pdf PCIreg.pdf recvbd.pdf
+
+if USE_HTML
+html_project_DATA += networkflow.jpg networkflow.png PCIreg.jpg recvbd.jpg
+endif
+
+networktasks.texi: networktasks.t
+ $(BMENU2) -p "Preface" \
+ -u "Top" \
+ -n "Networking Driver" < $< > $@
+
+driver.texi: driver.t
+ $(BMENU2) -p "Network Task Structure and Data Flow" \
+ -u "Top" \
+ -n "Using Networking in an RTEMS Application" < $< > $@
+
+networkapp.texi: networkapp.t
+ $(BMENU2) -p "Write the Driver Statistic-Printing Function" \
+ -u "Top" \
+ -n "Testing the Driver" < $< > $@
+
+testing.texi: testing.t
+ $(BMENU2) -p "Time Synchronization Using NTP" \
+ -u "Top" \
+ -n "Network Servers" < $< > $@
+
+servers.texi: servers.t
+ $(BMENU2) -p "Throughput" \
+ -u "Top" \
+ -n "DEC 21140 Driver" < $< > $@
+
+decdriver.texi: decdriver.t
+ $(BMENU2) -p "Using Hooks" \
+ -u "Top" \
+ -n "Command and Variable Index" < $< > $@
+
+PICTURE_FILES = PCIreg.eps PCIreg.jpg networkflow.eps networkflow.jpg \
+ networkflow.png recvbd.eps recvbd.jpg
+
+EXTRA_DIST = decdriver.t driver.t networkapp.t networktasks.t servers.t \
+ testing.t $(PICTURE_FILES)
+
+CLEANFILES += networking.info networking.info-?
diff --git a/doc/networking/PCIreg.eps b/doc/networking/PCIreg.eps
new file mode 100644
index 0000000000..e627786434
--- /dev/null
+++ b/doc/networking/PCIreg.eps
@@ -0,0 +1,319 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: PCI_reg.eps
+%%Creator: fig2dev Version 3.2 Patchlevel 1
+%%CreationDate: Mon Feb 8 15:09:56 1999
+%%For: raguet@genesis (Emmanuel Raguet)
+%%Orientation: Portrait
+%%BoundingBox: 0 0 270 592
+%%Pages: 0
+%%BeginSetup
+%%EndSetup
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+-172.0 622.0 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+ bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+ 4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+%%EndProlog
+
+$F2psBegin
+10 setmiterlimit
+n -1000 10868 m -1000 -1000 l 8010 -1000 l 8010 10868 l cp clip
+ 0.06299 0.06299 sc
+% Polyline
+7.500 slw
+n 2745 1305 m 6525 1305 l 6525 1800 l 2745 1800 l cp gs 0.00 setgray ef gr gs col0 s gr
+% Polyline
+n 4635 1305 m 4635 1800 l gs col7 s gr
+% Polyline
+n 2745 6750 m 6525 6750 l 6525 7245 l 2745 7245 l cp gs col0 s gr
+% Polyline
+n 4635 6750 m 4635 7245 l gs col0 s gr
+% Polyline
+n 2745 8730 m 6525 8730 l 6525 9225 l 2745 9225 l cp gs col0 s gr
+% Polyline
+n 4635 8730 m 4635 9225 l gs col0 s gr
+% Polyline
+n 3735 8730 m 3735 9225 l gs col0 s gr
+% Polyline
+n 5580 8730 m 5580 9225 l gs col0 s gr
+% Polyline
+n 2745 3285 m 6525 3285 l 6525 3780 l 2745 3780 l cp gs col0 s gr
+% Polyline
+n 2745 3780 m 6525 3780 l 6525 4275 l 2745 4275 l cp gs col0 s gr
+% Polyline
+n 2745 4275 m 6525 4275 l 6525 4770 l 2745 4770 l cp gs col0 s gr
+% Polyline
+n 2745 4770 m 6525 4770 l 6525 5265 l 2745 5265 l cp gs col0 s gr
+% Polyline
+n 2745 5265 m 6525 5265 l 6525 5760 l 2745 5760 l cp gs col0 s gr
+% Polyline
+n 2745 5760 m 6525 5760 l 6525 6255 l 2745 6255 l cp gs col0 s gr
+% Polyline
+n 2745 2790 m 6525 2790 l 6525 3285 l 2745 3285 l cp gs col0 s gr
+% Polyline
+n 4635 2790 m 4635 3285 l gs col0 s gr
+% Polyline
+n 3735 2790 m 3735 3285 l gs col0 s gr
+% Polyline
+n 5580 2790 m 5580 3285 l gs col0 s gr
+% Polyline
+n 2745 2295 m 6525 2295 l 6525 2790 l 2745 2790 l cp gs 0.00 setgray ef gr gs col7 s gr
+% Polyline
+n 5580 2295 m 5580 2790 l gs col7 s gr
+% Polyline
+n 2745 1800 m 6525 1800 l 6525 2295 l 2745 2295 l cp gs 0.00 setgray ef gr gs col7 s gr
+% Polyline
+n 4635 1800 m 4635 2295 l gs col7 s gr
+% Polyline
+n 3735 3285 m 4635 3285 l 4635 2790 l 3735 2790 l cp gs 0.00 setgray ef gr gs col7 s gr
+% Polyline
+n 2745 6255 m 6525 6255 l 6525 6750 l 2745 6750 l cp gs col0 s gr
+% Polyline
+n 2745 7740 m 6525 7740 l 6525 8235 l 2745 8235 l cp gs col0 s gr
+% Polyline
+n 2745 8235 m 6525 8235 l 6525 8730 l 2745 8730 l cp gs col0 s gr
+% Polyline
+n 2880 9585 m 3285 9585 l 3285 9855 l 2880 9855 l cp gs 0.00 setgray ef gr gs col0 s gr
+% Polyline
+n 2745 7245 m 6525 7245 l 6525 7740 l 2745 7740 l cp gs col0 s gr
+% Polyline
+gs clippath
+6915 1140 m 6885 1260 l 6855 1140 l 6855 1275 l 6915 1275 l cp
+clip
+n 6885 1260 m 6885 675 l 6660 675 l gs col0 s gr gr
+
+% arrowhead
+n 6915 1140 m 6885 1260 l 6855 1140 l col0 s
+/Times-Roman ff 270.00 scf sf
+3735 7155 m
+gs 1 -1 sc (Subsystem ID) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 270.00 scf sf
+4635 8145 m
+gs 1 -1 sc (Reserved) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 270.00 scf sf
+4635 8550 m
+gs 1 -1 sc (Reserved) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 270.00 scf sf
+3240 3195 m
+gs 1 -1 sc (BIST) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 210.00 scf sf
+3240 9135 m
+gs 1 -1 sc (Max_Lat) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 210.00 scf sf
+4185 9135 m
+gs 1 -1 sc (Min_Gnt) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 210.00 scf sf
+5085 8955 m
+gs 1 -1 sc (Interrupt) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 210.00 scf sf
+6030 8955 m
+gs 1 -1 sc (Interrupt) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 210.00 scf sf
+5040 3015 m
+gs 1 -1 sc (Latency) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 210.00 scf sf
+5535 6975 m
+gs 1 -1 sc (Subsystem) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 210.00 scf sf
+5535 7200 m
+gs 1 -1 sc (Vendor ID) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 210.00 scf sf
+4725 7695 m
+gs 1 -1 sc (Base address) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 210.00 scf sf
+4725 7470 m
+gs 1 -1 sc (Expansion ROM) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 210.00 scf sf
+6030 3195 m
+gs 1 -1 sc (Size Line) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 210.00 scf sf
+5985 3015 m
+gs 1 -1 sc (Cache) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 210.00 scf sf
+5085 3240 m
+gs 1 -1 sc (Timer) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 270.00 scf sf
+4635 6615 m
+gs 1 -1 sc (CardBus CIS Pointer) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 270.00 scf sf
+4680 6120 m
+gs 1 -1 sc (Base address 5) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 270.00 scf sf
+4680 5625 m
+gs 1 -1 sc (Base address 4) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 270.00 scf sf
+4680 5130 m
+gs 1 -1 sc (Base address 3) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 270.00 scf sf
+4680 4635 m
+gs 1 -1 sc (Base address 2) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 270.00 scf sf
+4680 4140 m
+gs 1 -1 sc (Base address 1) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 270.00 scf sf
+4680 3600 m
+gs 1 -1 sc (Base address 0) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 210.00 scf sf
+5085 9180 m
+gs 1 -1 sc (Pin) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 210.00 scf sf
+6030 9180 m
+gs 1 -1 sc (Line) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 270.00 scf sf
+5535 1665 m
+gs 1 -1 sc (Vendor ID) dup sw pop 2 div neg 0 rm col7 sh gr
+/Times-Roman ff 270.00 scf sf
+4185 2655 m
+gs 1 -1 sc (Class code) dup sw pop 2 div neg 0 rm col7 sh gr
+/Times-Roman ff 210.00 scf sf
+6030 2475 m
+gs 1 -1 sc (Revision) dup sw pop 2 div neg 0 rm col7 sh gr
+/Times-Roman ff 210.00 scf sf
+6030 2730 m
+gs 1 -1 sc (ID) dup sw pop 2 div neg 0 rm col7 sh gr
+/Times-Roman ff 240.00 scf sf
+5625 2160 m
+gs 1 -1 sc (Command register) dup sw pop 2 div neg 0 rm col7 sh gr
+/Times-Roman ff 270.00 scf sf
+3690 2160 m
+gs 1 -1 sc (Status register) dup sw pop 2 div neg 0 rm col7 sh gr
+/Times-Roman ff 270.00 scf sf
+3735 1665 m
+gs 1 -1 sc (Device ID) dup sw pop 2 div neg 0 rm col7 sh gr
+/Times-Roman ff 210.00 scf sf
+4185 2970 m
+gs 1 -1 sc (Header) dup sw pop 2 div neg 0 rm col7 sh gr
+/Times-Roman ff 210.00 scf sf
+4185 3225 m
+gs 1 -1 sc (Type) dup sw pop 2 div neg 0 rm col7 sh gr
+/Times-Roman ff 210.00 scf sf
+3375 9810 m
+gs 1 -1 sc (Required configuration registers) col0 sh gr
+/Times-Roman ff 210.00 scf sf
+6795 1665 m
+gs 1 -1 sc (00) col0 sh gr
+/Times-Roman ff 210.00 scf sf
+6795 4140 m
+gs 1 -1 sc (05) col0 sh gr
+/Times-Roman ff 210.00 scf sf
+6795 4635 m
+gs 1 -1 sc (06) col0 sh gr
+/Times-Roman ff 210.00 scf sf
+6795 2160 m
+gs 1 -1 sc (01) col0 sh gr
+/Times-Roman ff 210.00 scf sf
+6795 2655 m
+gs 1 -1 sc (02) col0 sh gr
+/Times-Roman ff 210.00 scf sf
+6795 3645 m
+gs 1 -1 sc (04) col0 sh gr
+/Times-Roman ff 210.00 scf sf
+6795 3150 m
+gs 1 -1 sc (03) col0 sh gr
+/Times-Roman ff 210.00 scf sf
+6795 5085 m
+gs 1 -1 sc (07) col0 sh gr
+/Times-Roman ff 210.00 scf sf
+6795 5580 m
+gs 1 -1 sc (08) col0 sh gr
+/Times-Roman ff 210.00 scf sf
+6795 6570 m
+gs 1 -1 sc (10) col0 sh gr
+/Times-Roman ff 210.00 scf sf
+6795 7110 m
+gs 1 -1 sc (11) col0 sh gr
+/Times-Roman ff 210.00 scf sf
+6795 7605 m
+gs 1 -1 sc (12) col0 sh gr
+/Times-Roman ff 210.00 scf sf
+6795 6075 m
+gs 1 -1 sc (09) col0 sh gr
+/Times-Roman ff 210.00 scf sf
+6795 8100 m
+gs 1 -1 sc (13) col0 sh gr
+/Times-Roman ff 210.00 scf sf
+6795 8595 m
+gs 1 -1 sc (14) col0 sh gr
+/Times-Roman ff 210.00 scf sf
+6795 9090 m
+gs 1 -1 sc (15) col0 sh gr
+/Times-Roman ff 210.00 scf sf
+5580 855 m
+gs 1 -1 sc (\(in decimal\)) col0 sh gr
+/Times-Roman ff 210.00 scf sf
+4725 630 m
+gs 1 -1 sc (Double word number) col0 sh gr
+$F2psEnd
+rs
diff --git a/doc/networking/PCIreg.jpg b/doc/networking/PCIreg.jpg
new file mode 100644
index 0000000000..c03257bed4
--- /dev/null
+++ b/doc/networking/PCIreg.jpg
Binary files differ
diff --git a/doc/networking/decdriver.t b/doc/networking/decdriver.t
new file mode 100644
index 0000000000..1f567b4eac
--- /dev/null
+++ b/doc/networking/decdriver.t
@@ -0,0 +1,292 @@
+@c
+@c RTEMS Remote Debugger Server Specifications
+@c
+@c Written by: Emmanuel Raguet <raguet@crf.canon.fr>
+@c
+@c
+@c $Id$
+@c
+
+@chapter DEC 21140 Driver
+
+@section DEC 21240 Driver Introduction
+
+@c XXX add back in cross reference to list of boards.
+
+One aim of our project is to port RTEMS on a standard PowerPC platform.
+To achieve it, we have chosen a Motorola MCP750 board. This board includes
+an Ethernet controller based on a DEC21140 chip. Because RTEMS has a
+TCP/IP stack, we will
+have to develop the DEC21140 related ethernet driver for the PowerPC port of
+RTEMS. As this controller is able to support 100Mbps network and as there is
+a lot of PCI card using this DEC chip, we have decided to first
+implement this driver on an Intel PC386 target to provide a solution for using
+RTEMS on PC with the 100Mbps network and then to port this code on PowerPC in
+a second phase.
+
+
+The aim of this document is to give some PCI board generalities and
+to explain the software architecture of the RTEMS driver. Finally, we will see
+what will be done for ChorusOs and Netboot environment .
+
+
+@section Document Revision History
+
+@b{Current release}:
+
+@itemize @bullet
+@item Current applicable release is 1.0.
+@end itemize
+@b{Existing releases}:
+
+@itemize @bullet
+@item 1.0 : Released the 10/02/98. First version of this document.
+@item 0.1 : First draft of this document
+@end itemize
+@b{Planned releases}:
+
+@itemize @bullet
+@item None planned today.
+@end itemize
+
+@section DEC21140 PCI Board Generalities
+
+@c XXX add crossreference to PCI Register Figure
+This chapter describes rapidely the PCI interface of this Ethernet controller.
+The board we have chosen for our PC386 implementation is a D-Link DFE-500TX.
+This is a dual-speed 10/100Mbps Ethernet PCI adapter with a DEC21140AF chip.
+Like other PCI devices, this board has a PCI device's header containing some
+required configuration registers, as shown in the PCI Register Figure.
+By reading
+or writing these registers, a driver can obtain information about the type of
+the board, the interrupt it uses, the mapping of the chip specific registers, ...
+
+
+
+On Intel target, the chip specific registers can be accessed via 2
+methods : I/O port access or PCI address mapped access. We have chosen to implement
+the PCI address access to obtain compatible source code to the port the driver
+on a PowerPC target.
+
+@c
+@c PCI Device's Configuration Header Space Format
+@c
+
+@ifset use-ascii
+@example
+@group
+There is no ASCII version of the PCI Device's Configuration Header Space Format
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@image{PCIreg}
+@end ifset
+
+@c @image{PCIreg}
+
+@ifset use-html
+@c <IMG SRC="PCIreg.jpg" WIDTH=500 HEIGHT=600 ALT="PCI Device's Configuration Header Space Format">
+@html
+<IMG SRC="PCIreg.jpg" ALT="PCI Device's Configuration Header Space Format">
+@end html
+@end ifset
+
+
+@c XXX add crossreference to PCI Register Figure
+
+On RTEMS, a PCI API exists. We have used it to configure the board. After initializing
+this PCI module via the @code{pcib_init()} function, we try to detect
+the DEC21140 based ethernet board. This board is characterized by its Vendor
+ID (0x1011) and its Device ID (0x0009). We give these arguments to the
+@code{pcib_find_by_deviceid}
+function which returns , if the device is present, a pointer to the configuration
+header space (see PCI Registers Fgure). Once this operation performed,
+the driver
+is able to extract the information it needs to configure the board internal
+registers, like the interrupt line, the base address,... The board internal
+registers will not be detailled here. You can find them in @b{DIGITAL
+Semiconductor 21140A PCI Fast Ethernet LAN Controller
+- Hardware Reference Manual}.
+
+@c fix citation
+
+
+@section RTEMS Driver Software Architecture
+
+In this chapter will see the initialization phase, how the controller uses the
+host memory and the 2 threads launched at the initialization time.
+
+
+@subsection Initialization phase
+
+The DEC21140 Ethernet driver keeps the same software architecture than the other
+RTEMS ethernet drivers. The only API the programmer can use is the @code{rtems_dec21140_driver_attach}
+@code{(struct rtems_bsdnet_ifconfig *config)} function which
+detects the board and initializes the associated data structure (with registers
+base address, entry points to low-level initialization function,...), if the
+board is found.
+
+Once the attach function executed, the driver initializes the DEC
+chip. Then the driver connects an interrupt handler to the interrupt line driven
+by the Ethernet controller (the only interrupt which will be treated is the
+receive interrupt) and launches 2 threads : a receiver thread and a transmitter
+thread. Then the driver waits for incoming frame to give to the protocol stack
+or outcoming frame to send on the physical link.
+
+
+@subsection Memory Buffer
+
+@c XXX add cross reference to Problem
+This DEC chip uses the host memory to store the incoming Ethernet frames and
+the descriptor of these frames. We have chosen to use 7 receive buffers and
+1 transmit buffer to optimize memory allocation due to cache and paging problem
+that will be explained in the section @b{Encountered Problems}.
+
+
+To reference these buffers to the DEC chip we use a buffer descriptors
+ring. The descriptor structure is defined in the Buffer Descriptor Figure.
+Each descriptor
+can reference one or two memory buffers. We choose to use only one buffer of
+1520 bytes per descriptor.
+
+
+The difference between a receive and a transmit buffer descriptor
+is located in the status and control bits fields. We do not give details here,
+please refer to the [DEC21140 Hardware Manual].
+
+@c
+@c Buffer Descriptor
+@c
+
+@ifset use-ascii
+@example
+@group
+XXXXX reference it in the previous paragraph
+XXXXX insert recvbd.eps
+XXXXX Caption Buffer Descriptor
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@image{recvbd}
+@end ifset
+
+
+@ifset use-html
+@c <IMG SRC="recvbd.jpg" WIDTH=500 HEIGHT=600 ALT="Buffer Descriptor">
+@html
+<IMG SRC="recvbd.jpg" ALT="Buffer Descriptor">
+@end html
+@end ifset
+
+
+
+@subsection Receiver Thread
+
+This thread is event driven. Each time a DEC PCI board interrupt occurs, the
+handler checks if this is a receive interrupt and send an event ``reception''
+to the receiver thread which looks into the entire buffer descriptors ring the
+ones that contain a valid incoming frame (bit OWN=0 means descriptor belongs
+to host processor). Each valid incoming ethernet frame is sent to the protocol
+stack and the buffer descriptor is given back to the DEC board (the host processor
+reset bit OWN, which means descriptor belongs to 21140).
+
+
+@subsection Transmitter Thread
+
+This thread is also event driven. Each time an Ethernet frame is put in the
+transmit queue, an event is sent to the transmit thread, which empty the queue
+by sending each outcoming frame. Because we use only one transmit buffer, we
+are sure that the frame is well-sent before sending the next.
+
+
+@section Encountered Problems
+
+On Intel PC386 target, we were faced with a problem of memory cache management.
+Because the DEC chip uses the host memory to store the incoming frame and because
+the DEC21140 configuration registers are mapped into the PCI address space,
+we must ensure that the data read (or written) by the host processor are the
+ones written (or read) by the DEC21140 device in the host memory and not old
+data stored in the cache memory. Therefore, we had to provide a way to manage
+the cache. This module is described in the document @b{RTEMS
+Cache Management For Intel}. On Intel, the
+memory region cache management is available only if the paging unit is enabled.
+We have used this paging mechanism, with 4Kb page. All the buffers allocated
+to store the incoming or outcoming frames, buffer descriptor and also the PCI
+address space of the DEC board are located in a memory space with cache disable.
+
+
+Concerning the buffers and their descriptors, we have tried to optimize
+the memory space in term of allocated page. One buffer has 1520 bytes, one descriptor
+has 16 bytes. We have 7 receive buffers and 1 transmit buffer, and for each,
+1 descriptor : (7+1)*(1520+16) = 12288 bytes = 12Kb = 3 entire pages. This
+allows not to lose too much memory or not to disable cache memory for a page
+which contains other data than buffer, which could decrease performance.
+
+
+@section ChorusOs DEC Driver
+
+Because ChorusOs is used in several Canon CRF projects, we must provide such
+a driver on this OS to ensure compatibility between the RTEMS and ChorusOs developments.
+On ChorusOs, a DEC driver source code already exists but only for a PowerPC
+target. We plan to port this code (which uses ChorusOs API) on Intel target.
+This will allow us to have homogeneous developments. Moreover, the port of the
+development performed with ChorusOs environment to RTEMS environment will be
+easier for the developers.
+
+
+@section Netboot DEC driver
+
+We use Netboot tool to load our development from a server to the target via
+an ethernet network. Currently, this tool does not support the DEC board. We
+plan to port the DEC driver for the Netboot tool.
+
+
+But concerning the port of the DEC driver into Netboot, we are faced
+with a problem : in RTEMS environment, the DEC driver is interrupt or event
+driven, in Netboot environment, it must be used in polling mode. It means that
+we will have to re-write some mechanisms of this driver.
+
+
+@section List of Ethernet cards using the DEC chip
+
+Many Ethernet adapter cards use the Tulip chip. Here is a non exhaustive list
+of adapters which support this driver :
+
+@itemize @bullet
+@item Accton EtherDuo PCI.
+@item Accton EN1207 All three media types supported.
+@item Adaptec ANA6911/TX 21140-AC.
+@item Cogent EM110 21140-A with DP83840 N-Way MII transceiver.
+@item Cogent EM400 EM100 with 4 21140 100mbps-only ports + PCI Bridge.
+@item Danpex EN-9400P3.
+@item D-Link DFE500-Tx 21140-A with DP83840 transceiver.
+@item Kingston EtherX KNE100TX 21140AE.
+@item Netgear FX310 TX 10/100 21140AE.
+@item SMC EtherPower10/100 With DEC21140 and 68836 SYM transceiver.
+@item SMC EtherPower10/100 With DEC21140-AC and DP83840 MII transceiver.
+Note: The EtherPower II uses the EPIC chip, which requires a different driver.
+@item Surecom EP-320X DEC 21140.
+@item Thomas Conrad TC5048.
+@item Znyx ZX345 21140-A, usually with the DP83840 N-Way MII transciever. Some ZX345
+cards made in 1996 have an ICS 1890 transciver instead.
+@item ZNYX ZX348 Two 21140-A chips using ICS 1890 transcievers and either a 21052
+or 21152 bridge. Early versions used National 83840 transcievers, but later
+versions are depopulated ZX346 boards.
+@item ZNYX ZX351 21140 chip with a Broadcom 100BaseT4 transciever.
+@end itemize
+
+Our DEC driver has not been tested with all these cards, only with the D-Link
+DFE500-TX.
+
+@itemize @code{ }
+@item @cite{[DEC21140 Hardware Manual] DIGITAL, @b{DIGITAL
+Semiconductor 21140A PCI Fast Ethernet LAN Controller - Hardware
+Reference Manual}}.
+
+@item @cite{[99.TA.0021.M.ER]Emmanuel Raguet,
+@b{RTEMS Cache Management For Intel}}.
+@end itemize
diff --git a/doc/networking/driver.t b/doc/networking/driver.t
new file mode 100644
index 0000000000..d639b20189
--- /dev/null
+++ b/doc/networking/driver.t
@@ -0,0 +1,342 @@
+@c
+@c Written by Eric Norum
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Networking Driver
+
+@section Introduction
+
+This chapter is intended to provide an introduction to the
+procedure for writing RTEMS network device drivers.
+The example code is taken from the `Generic 68360' network device
+driver. The source code for this driver is located in the
+@code{c/src/lib/libbsp/m68k/gen68360/network} directory in the RTEMS
+source code distribution. Having a copy of this driver at
+hand when reading the following notes will help significantly.
+
+@section Learn about the network device
+
+Before starting to write the network driver become completely
+familiar with the programmer's view of the device.
+The following points list some of the details of the
+device that must be understood before a driver can be written.
+
+@itemize @bullet
+
+@item Does the device use DMA to transfer packets to and from
+memory or does the processor have to
+copy packets to and from memory on the device?
+
+@item If the device uses DMA, is it capable of forming a single
+outgoing packet from multiple fragments scattered in separate
+memory buffers?
+
+@item If the device uses DMA, is it capable of chaining multiple
+outgoing packets, or does each outgoing packet require
+intervention by the driver?
+
+@item Does the device automatically pad short frames to the minimum
+64 bytes or does the driver have to supply the padding?
+
+@item Does the device automatically retry a transmission on detection
+of a collision?
+
+@item If the device uses DMA, is it capable of buffering multiple
+packets to memory, or does the receiver have to be restarted
+after the arrival of each packet?
+
+@item How are packets that are too short, too long, or received with
+CRC errors handled? Does the device automatically continue
+reception or does the driver have to intervene?
+
+@item How is the device Ethernet address set? How is the device
+programmed to accept or reject broadcast and multicast packets?
+
+@item What interrupts does the device generate? Does it generate an
+interrupt for each incoming packet, or only for packets received
+without error? Does it generate an interrupt for each packet
+transmitted, or only when the transmit queue is empty? What
+happens when a transmit error is detected?
+
+@end itemize
+
+In addition, some controllers have specific questions regarding
+board specific configuration. For example, the SONIC Ethernet
+controller has a very configurable data bus interface. It can
+even be configured for sixteen and thirty-two bit data buses. This
+type of information should be obtained from the board vendor.
+
+@section Understand the network scheduling conventions
+
+When writing code for the driver transmit and receive tasks,
+take care to follow the network scheduling conventions. All tasks
+which are associated with networking share various
+data structures and resources. To ensure the consistency
+of these structures the tasks
+execute only when they hold the network semaphore (@code{rtems_bsdnet_semaphore}).
+The transmit and receive tasks must abide by this protocol. Be very
+careful to avoid `deadly embraces' with the other network tasks.
+A number of routines are provided to make it easier for the network
+driver code to conform to the network task scheduling conventions.
+
+@itemize @bullet
+
+@item @code{void rtems_bsdnet_semaphore_release(void)}
+
+This function releases the network semaphore.
+The network driver tasks must call this function immediately before
+making any blocking RTEMS request.
+
+@item @code{void rtems_bsdnet_semaphore_obtain(void)}
+
+This function obtains the network semaphore.
+If a network driver task has released the network semaphore to allow other
+network-related tasks to run while the task blocks, then this function must
+be called to reobtain the semaphore immediately after the return from the
+blocking RTEMS request.
+
+@item @code{rtems_bsdnet_event_receive(rtems_event_set, rtems_option, rtems_interval, rtems_event_set *)}
+The network driver task should call this function when it wishes to wait
+for an event. This function releases the network semaphore,
+calls @code{rtems_event_receive} to wait for the specified event
+or events and reobtains the semaphore.
+The value returned is the value returned by the @code{rtems_event_receive}.
+
+@end itemize
+
+@section Network Driver Makefile
+
+Network drivers are considered part of the BSD network package and as such
+are to be compiled with the appropriate flags. This can be accomplished by
+adding @code{-D__INSIDE_RTEMS_BSD_TCPIP_STACK__} to the @code{command line}.
+If the driver is inside the RTEMS source tree or is built using the
+RTEMS application Makefiles, then adding the following line accomplishes
+this:
+
+@example
+DEFINES += -D__INSIDE_RTEMS_BSD_TCPIP_STACK__
+@end example
+
+This is equivalent to the following list of definitions. Early versions
+of the RTEMS BSD network stack required that all of these be defined.
+
+@example
+-D_COMPILING_BSD_KERNEL_ -DKERNEL -DINET -DNFS \
+ -DDIAGNOSTIC -DBOOTP_COMPAT
+@end example
+
+Defining these macros tells the network header files that the driver
+is to be compiled with extended visibility into the network stack. This
+is in sharp contrast to applications that simply use the network stack.
+Applications do not require this level of visibility and should stick
+to the portable application level API.
+
+As a direct result of being logically internal to the network stack,
+network drivers use the BSD memory allocation routines This means,
+for example, that malloc takes three arguments. See the SONIC
+device driver (@code{c/src/lib/libchip/network/sonic.c}) for an example
+of this. Because of this, network drivers should not include
+@code{<stdlib.h>}. Doing so will result in conflicting definitions
+of @code{malloc()}.
+
+@b{Application level} code including network servers such as the FTP
+daemon are @b{not} part of the BSD kernel network code and should not be
+compiled with the BSD network flags. They should include
+@code{<stdlib.h>} and not define the network stack visibility
+macros.
+
+@section Write the Driver Attach Function
+
+The driver attach function is responsible for configuring the driver
+and making the connection between the network stack
+and the driver.
+
+Driver attach functions take a pointer to an
+@code{rtems_bsdnet_ifconfig} structure as their only argument.
+and set the driver parameters based on the
+values in this structure. If an entry in the configuration
+structure is zero the attach function chooses an
+appropriate default value for that parameter.
+
+
+The driver should then set up several fields in the ifnet structure
+in the device-dependent data structure supplied and maintained by the driver:
+
+@table @code
+@item ifp->if_softc
+Pointer to the device-dependent data. The first entry
+in the device-dependent data structure must be an @code{arpcom}
+structure.
+
+@item ifp->if_name
+The name of the device. The network stack uses this string
+and the device number for device name lookups. The device name should
+be obtained from the @code{name} entry in the configuration structure.
+
+@item ifp->if_unit
+The device number. The network stack uses this number and the
+device name for device name lookups. For example, if
+@code{ifp->if_name} is @samp{scc} and @code{ifp->if_unit} is @samp{1},
+the full device name would be @samp{scc1}. The unit number should be
+obtained from the `name' entry in the configuration structure.
+
+@item ifp->if_mtu
+The maximum transmission unit for the device. For Ethernet
+devices this value should almost always be 1500.
+
+@item ifp->if_flags
+The device flags. Ethernet devices should set the flags
+to @code{IFF_BROADCAST|IFF_SIMPLEX}, indicating that the
+device can broadcast packets to multiple destinations
+and does not receive and transmit at the same time.
+
+@item ifp->if_snd.ifq_maxlen
+The maximum length of the queue of packets waiting to be
+sent to the driver. This is normally set to @code{ifqmaxlen}.
+
+@item ifp->if_init
+The address of the driver initialization function.
+
+@item ifp->if_start
+The address of the driver start function.
+
+@item ifp->if_ioctl
+The address of the driver ioctl function.
+
+@item ifp->if_output
+The address of the output function. Ethernet devices
+should set this to @code{ether_output}.
+@end table
+
+RTEMS provides a function to parse the driver name in the
+configuration structure into a device name and unit number.
+
+@example
+int rtems_bsdnet_parse_driver_name (
+ const struct rtems_bsdnet_ifconfig *config,
+ char **namep
+);
+@end example
+
+The function takes two arguments; a pointer to the configuration
+structure and a pointer to a pointer to a character. The function
+parses the configuration name entry, allocates memory for the driver
+name, places the driver name in this memory, sets the second argument
+to point to the name and returns the unit number.
+On error, a message is printed and -1 is returned.
+
+Once the attach function has set up the above entries it must link the
+driver data structure onto the list of devices by
+calling @code{if_attach}. Ethernet devices should then
+call @code{ether_ifattach}. Both functions take a pointer to the
+device's @code{ifnet} structure as their only argument.
+
+The attach function should return a non-zero value to indicate that
+the driver has been successfully configured and attached.
+
+@section Write the Driver Start Function.
+This function is called each time the network stack wants to start the
+transmitter. This occures whenever the network stack adds a packet
+to a device's send queue and the @code{IFF_OACTIVE} bit in the
+device's @code{if_flags} is not set.
+
+For many devices this function need only set the @code{IFF_OACTIVE} bit in the
+@code{if_flags} and send an event to the transmit task
+indicating that a packet is in the driver transmit queue.
+
+
+@section Write the Driver Initialization Function.
+
+This function should initialize the device, attach to interrupt handler,
+and start the driver transmit and receive tasks. The function
+
+@example
+rtems_id
+rtems_bsdnet_newproc (char *name,
+ int stacksize,
+ void(*entry)(void *),
+ void *arg);
+@end example
+
+should be used to start the driver tasks.
+
+Note that the network stack may call the driver initialization function more
+than once.
+Make sure multiple versions of the receive and transmit tasks are not accidentally
+started.
+
+
+
+@section Write the Driver Transmit Task
+
+This task is reponsible for removing packets from the driver send queue and sending them to the device. The task should block waiting for an event from the
+driver start function indicating that packets are waiting to be transmitted.
+When the transmit task has drained the driver send queue the task should clear
+the @code{IFF_OACTIVE} bit in @code{if_flags} and block until another outgoing
+packet is queued.
+
+
+@section Write the Driver Receive Task
+This task should block until a packet arrives from the device. If the
+device is an Ethernet interface the function @code{ether_input} should be called
+to forward the packet to the network stack. The arguments to @code{ether_input}
+are a pointer to the interface data structure, a pointer to the ethernet
+header and a pointer to an mbuf containing the packet itself.
+
+
+
+
+@section Write the Driver Interrupt Handler
+A typical interrupt handler will do nothing more than the hardware
+manipulation required to acknowledge the interrupt and send an RTEMS event
+to wake up the driver receive or transmit task waiting for the event.
+Network interface interrupt handlers must not make any calls to other
+network routines.
+
+
+
+@section Write the Driver IOCTL Function
+This function handles ioctl requests directed at the device. The ioctl
+commands which must be handled are:
+
+@table @code
+@item SIOCGIFADDR
+@item SIOCSIFADDR
+If the device is an Ethernet interface these
+commands should be passed on to @code{ether_ioctl}.
+
+@item SIOCSIFFLAGS
+This command should be used to start or stop the device,
+depending on the state of the interface @code{IFF_UP} and
+@code{IFF_RUNNING} bits in @code{if_flags}:
+@table @code
+@item IFF_RUNNING
+Stop the device.
+
+@item IFF_UP
+Start the device.
+
+@item IFF_UP|IFF_RUNNING
+Stop then start the device.
+
+@item 0
+Do nothing.
+
+@end table
+@end table
+
+
+
+@section Write the Driver Statistic-Printing Function
+This function should print the values of any statistic/diagnostic
+counters the network driver may use. The driver ioctl function should call
+the statistic-printing function when the ioctl command is
+@code{SIO_RTEMS_SHOW_STATS}.
+
+
diff --git a/doc/networking/networkapp.t b/doc/networking/networkapp.t
new file mode 100644
index 0000000000..cf13c42645
--- /dev/null
+++ b/doc/networking/networkapp.t
@@ -0,0 +1,838 @@
+@c
+@c Written by Eric Norum
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Using Networking in an RTEMS Application
+
+@section Makefile changes
+@subsection Including the required managers
+The FreeBSD networking code requires several RTEMS managers
+in the application:
+
+@example
+MANAGERS = io event semaphore
+@end example
+
+@subsection Increasing the size of the heap
+The networking tasks allocate a lot of memory. For most applications
+the heap should be at least 256 kbytes.
+The amount of memory set aside for the heap can be adjusted by setting
+the @code{CFLAGS_LD} definition as shown below:
+
+@example
+CFLAGS_LD += -Wl,--defsym -Wl,HeapSize=0x80000
+@end example
+
+This sets aside 512 kbytes of memory for the heap.
+
+@section System Configuration
+
+The networking tasks allocate some RTEMS objects. These
+must be accounted for in the application configuration table. The following
+lists the requirements.
+
+@table @b
+@item TASKS
+One network task plus a receive and transmit task for each device.
+
+@item SEMAPHORES
+One network semaphore plus one syslog mutex semaphore if the application uses
+openlog/syslog.
+
+@item EVENTS
+The network stack uses @code{RTEMS_EVENT_24} and @code{RTEMS_EVENT_25}.
+This has no effect on the application configuration, but
+application tasks which call the network functions should not
+use these events for other purposes.
+
+@end table
+
+@section Initialization
+@subsection Additional include files
+The source file which declares the network configuration
+structures and calls the network initialization function must include
+
+@example
+#include <rtems/rtems_bsdnet.h>
+@end example
+
+@subsection Network Configuration
+The network configuration is specified by declaring
+and initializing the @code{rtems_bsdnet_config}
+structure.
+
+@example
+@group
+struct rtems_bsdnet_config @{
+ /*
+ * This entry points to the head of the ifconfig chain.
+ */
+ struct rtems_bsdnet_ifconfig *ifconfig;
+
+ /*
+ * This entry should be rtems_bsdnet_do_bootp if BOOTP
+ * is being used to configure the network, and NULL
+ * if BOOTP is not being used.
+ */
+ void (*bootp)(void);
+
+ /*
+ * The remaining items can be initialized to 0, in
+ * which case the default value will be used.
+ */
+ rtems_task_priority network_task_priority; /* 100 */
+ unsigned long mbuf_bytecount; /* 64 kbytes */
+ unsigned long mbuf_cluster_bytecount; /* 128 kbytes */
+ char *hostname; /* BOOTP */
+ char *domainname; /* BOOTP */
+ char *gateway; /* BOOTP */
+ char *log_host; /* BOOTP */
+ char *name_server[3]; /* BOOTP */
+ char *ntp_server[3]; /* BOOTP */
+@};
+@end group
+@end example
+
+The structure entries are described in the following table.
+If your application uses BOOTP/DHCP to obtain network configuration
+information and if you are happy with the default values described
+below, you need to provide only the first two entries in this structure.
+
+@table @code
+
+@item struct rtems_bsdnet_ifconfig *ifconfig
+A pointer to the first configuration structure of the first network
+device. This structure is described in the following section.
+You must provide a value for this entry since there is no default value for it.
+
+
+@item void (*bootp)(void)
+This entry should be set to @code{rtems_bsdnet_do_bootp}
+if your application will use BOOTP/DHCP
+to obtain network configuration information.
+It should be set to @code{NULL}
+if your application does not use BOOTP/DHCP.
+
+
+@item int network_task_priority
+The priority at which the network task and network device
+receive and transmit tasks will run.
+If a value of 0 is specified the tasks will run at priority 100.
+
+@item unsigned long mbuf_bytecount
+The number of bytes to allocate from the heap for use as mbufs.
+If a value of 0 is specified, 64 kbytes will be allocated.
+
+@item unsigned long mbuf_cluster_bytecount
+The number of bytes to allocate from the heap for use as mbuf clusters.
+If a value of 0 is specified, 128 kbytes will be allocated.
+
+@item char *hostname
+The host name of the system.
+If this, or any of the following, entries are @code{NULL} the value
+may be obtained from a BOOTP/DHCP server.
+
+@item char *domainname
+The name of the Internet domain to which the system belongs.
+
+@item char *gateway
+The Internet host number of the network gateway machine,
+specified in `dotted decimal' (@code{129.128.4.1}) form.
+
+@item char *log_host
+The Internet host number of the machine to which @code{syslog} messages
+will be sent.
+
+@item char *name_server[3]
+The Internet host numbers of up to three machines to be used as
+Internet Domain Name Servers.
+
+@item char *ntp_server[3]
+The Internet host numbers of up to three machines to be used as
+Network Time Protocol (NTP) Servers.
+
+@end table
+
+In addition, the following fields in the @code{rtems_bsdnet_ifconfig}
+are of interest.
+
+@table @b
+
+@item int port
+The I/O port number (ex: 0x240) on which the external Ethernet
+can be accessed.
+
+@item int irno
+The interrupt number of the external Ethernet controller.
+
+@item int bpar
+The address of the shared memory on the external Ethernet controller.
+
+
+@end table
+
+@subsection Network device configuration
+Network devices are specified and configured by declaring and initializing a
+@code{struct rtems_bsdnet_ifconfig} structure for each network device.
+
+The structure entries are described in the following table. An application
+which uses a single network interface, gets network configuration information
+from a BOOTP/DHCP server, and uses the default values for all driver
+parameters needs to initialize only the first two entries in the
+structure.
+
+@table @code
+@item char *name
+The full name of the network device. This name consists of the
+driver name and the unit number (e.g. @code{"scc1"}).
+The @code{bsp.h} include file usually defines RTEMS_BSP_NETWORK_DRIVER_NAME as
+the name of the primary (or only) network driver.
+
+@item int (*attach)(struct rtems_bsdnet_ifconfig *conf)
+The address of the driver @code{attach} function. The network
+initialization function calls this function to configure the driver and
+attach it to the network stack.
+The @code{bsp.h} include file usually defines RTEMS_BSP_NETWORK_DRIVER_ATTACH as
+the name of the attach function of the primary (or only) network driver.
+
+@item struct rtems_bsdnet_ifconfig *next
+A pointer to the network device configuration structure for the next network
+interface, or @code{NULL} if this is the configuration structure of the
+last network interface.
+
+@item char *ip_address
+The Internet address of the device,
+specified in `dotted decimal' (@code{129.128.4.2}) form, or @code{NULL}
+if the device configuration information is being obtained from a
+BOOTP/DHCP server.
+
+@item char *ip_netmask
+The Internet inetwork mask of the device,
+specified in `dotted decimal' (@code{255.255.255.0}) form, or @code{NULL}
+if the device configuration information is being obtained from a
+BOOTP/DHCP server.
+
+
+@item void *hardware_address
+The hardware address of the device, or @code{NULL} if the driver is
+to obtain the hardware address in some other way (usually by reading
+it from the device or from the bootstrap ROM).
+
+@item int ignore_broadcast
+Zero if the device is to accept broadcast packets, non-zero if the device
+is to ignore broadcast packets.
+
+@item int mtu
+The maximum transmission unit of the device, or zero if the driver
+is to choose a default value (typically 1500 for Ethernet devices).
+
+@item int rbuf_count
+The number of receive buffers to use, or zero if the driver is to
+choose a default value
+
+@item int xbuf_count
+The number of transmit buffers to use, or zero if the driver is to
+choose a default value
+Keep in mind that some network devices may use 4 or more
+transmit descriptors for a single transmit buffer.
+
+@end table
+
+A complete network configuration specification can be as simple as the one
+shown in the following example.
+This configuration uses a single network interface, gets
+network configuration information
+from a BOOTP/DHCP server, and uses the default values for all driver
+parameters.
+
+@example
+static struct rtems_bsdnet_ifconfig netdriver_config = @{
+ RTEMS_BSP_NETWORK_DRIVER_NAME,
+ RTEMS_BSP_NETWORK_DRIVER_ATTACH
+@};
+struct rtems_bsdnet_config rtems_bsdnet_config = @{
+ &netdriver_config,
+ rtems_bsdnet_do_bootp,
+@};
+@end example
+
+
+@subsection Network initialization
+The networking tasks must be started before any network I/O operations
+can be performed. This is done by calling:
+
+
+@example
+rtems_bsdnet_initialize_network ();
+@end example
+
+This function is declared in @code{rtems/rtems_bsdnet.h}.
+t returns 0 on success and -1 on failure with an error code
+in @code{errno}. It is not possible to undo the effects of
+a partial initialization, though, so the function can be
+called only once irregardless of the return code. Consequently,
+if the condition for the failure can be corrected, the
+system must be reset to permit another network initialization
+attempt.
+
+
+
+@section Application Programming Interface
+
+The RTEMS network package provides almost a complete set of BSD network
+services. The network functions work like their BSD counterparts
+with the following exceptions:
+
+@itemize @bullet
+@item A given socket can be read or written by only one task at a time.
+
+@item The @code{select} function only works for file descriptors associated
+with sockets.
+
+@item You must call @code{openlog} before calling any of the @code{syslog} functions.
+
+@item @b{Some of the network functions are not thread-safe.}
+For example the following functions return a pointer to a static
+buffer which remains valid only until the next call:
+
+@table @code
+@item gethostbyaddr
+@item gethostbyname
+@item inet_ntoa
+(@code{inet_ntop} is thread-safe, though).
+@end table
+
+@item The RTEMS network package gathers statistics.
+
+@item Addition of a mechanism to "tap onto" an interface
+and monitor every packet received and transmitted.
+
+@item Addition of @code{SO_SNDWAKEUP} and @code{SO_RCVWAKEUP} socket options.
+
+@end itemize
+
+Some of the new features are discussed in more detail in the following
+sections.
+
+@subsection Network Statistics
+
+There are a number of functions to print statistics gathered by
+the network stack.
+These function are declared in @code{rtems/rtems_bsdnet.h}.
+
+@table @code
+@item rtems_bsdnet_show_if_stats
+Display statistics gathered by network interfaces.
+
+@item rtems_bsdnet_show_ip_stats
+Display IP packet statistics.
+
+@item rtems_bsdnet_show_icmp_stats
+Display ICMP packet statistics.
+
+@item rtems_bsdnet_show_tcp_stats
+Display TCP packet statistics.
+
+@item rtems_bsdnet_show_udp_stats
+Display UDP packet statistics.
+
+@item rtems_bsdnet_show_mbuf_stats
+Display mbuf statistics.
+
+@item rtems_bsdnet_show_inet_routes
+Display the routing table.
+
+@end table
+
+@subsection Tapping Into an Interface
+
+RTEMS add two new ioctls to the BSD networking code:
+SIOCSIFTAP and SIOCGIFTAP. These may be used to set and get a
+@i{tap function}. The tap function will be called for every
+Ethernet packet received by the interface.
+
+These are called like other interface ioctls, such as SIOCSIFADDR.
+When setting the tap function with SIOCSIFTAP, set the ifr_tap field
+of the ifreq struct to the tap function. When retrieving the tap
+function with SIOCGIFTAP, the current tap function will be returned in
+the ifr_tap field. To stop tapping packets, call SIOCSIFTAP with a
+ifr_tap field of 0.
+
+The tap function is called like this:
+
+@example
+int tap (struct ifnet *, struct ether_header *, struct mbuf *)
+@end example
+
+The tap function should return 1 if the packet was fully handled, in
+which case the caller will simply discard the mbuf. The tap function
+should return 0 if the packet should be passed up to the higher
+networking layers.
+
+The tap function is called with the network semaphore locked. It must
+not make any calls on the application levels of the networking level
+itself. It is safe to call other non-networking RTEMS functions.
+
+@subsection Socket Options
+
+RTEMS adds two new @code{SOL_SOCKET} level options for @code{setsockopt} and
+@code{getsockopt}: @code{SO_SNDWAKEUP} and @code{SO_RCVWAKEUP}. For both, the
+option value should point to a sockwakeup structure. The sockwakeup
+structure has the following fields:
+
+@example
+@group
+ void (*sw_pfn) (struct socket *, caddr_t);
+ caddr_t sw_arg;
+@end group
+@end example
+
+These options are used to set a callback function to be called when, for
+example, there is
+data available from the socket (@code{SO_RCVWAKEUP}) and when there is space
+available to accept data written to the socket (@code{SO_SNDWAKEUP}).
+
+If @code{setsockopt} is called with the @code{SO_RCVWAKEUP} option, and the
+@code{sw_pfn} field is not zero, then when there is data
+available to be read from
+the socket, the function pointed to by the @code{sw_pfn} field will be
+called. A pointer to the socket structure will be passed as the first
+argument to the function. The @code{sw_arg} field set by the
+@code{SO_RCVWAKEUP} call will be passed as the second argument to the function.
+
+If @code{setsockopt} is called with the @code{SO_SNDWAKEUP}
+function, and the @code{sw_pfn} field is not zero, then when
+there is space available to accept data written to the socket,
+the function pointed to by the @code{sw_pfn} field
+will be called. The arguments passed to the function will be as with
+@code{SO_SNDWAKEUP}.
+
+When the function is called, the network semaphore will be locked and
+the callback function runs in the context of the networking task.
+The function must be careful not to call any networking functions. It
+is OK to call an RTEMS function; for example, it is OK to send an
+RTEMS event.
+
+The purpose of these callback functions is to permit a more efficient
+alternative to the select call when dealing with a large number of
+sockets.
+
+The callbacks are called by the same criteria that the select
+function uses for indicating "ready" sockets. In Stevens @cite{Unix
+Network Programming} on page 153-154 in the section "Under what Conditions
+Is a Descriptor Ready?" you will find the definitive list of conditions
+for readable and writable that also determine when the functions are
+called.
+
+When the number of received bytes equals or exceeds the socket receive
+buffer "low water mark" (default 1 byte) you get a readable callback. If
+there are 100 bytes in the receive buffer and you only read 1, you will
+not immediately get another callback. However, you will get another
+callback after you read the remaining 99 bytes and at least 1 more byte
+arrives. Using a non-blocking socket you should probably read until it
+produces error EWOULDBLOCK and then allow the readable callback to tell
+you when more data has arrived. (Condition 1.a.)
+
+For sending, when the socket is connected and the free space becomes at
+or above the "low water mark" for the send buffer (default 4096 bytes)
+you will receive a writable callback. You don't get continuous callbacks
+if you don't write anything. Using a non-blocking write socket, you can
+then call write until it returns a value less than the amount of data
+requested to be sent or it produces error EWOULDBLOCK (indicating buffer
+full and no longer writable). When this happens you can
+try the write again, but it is often better to go do other things and
+let the writable callback tell you when space is available to send
+again. You only get a writable callback when the free space transitions
+to above the "low water mark" and not every time you
+write to a non-full send buffer. (Condition 2.a.)
+
+The remaining conditions enumerated by Stevens handle the fact that
+sockets become readable and/or writable when connects, disconnects and
+errors occur, not just when data is received or sent. For example, when
+a server "listening" socket becomes readable it indicates that a client
+has connected and accept can be called without blocking, not that
+network data was received (Condition 1.c).
+
+@subsection Adding an IP Alias
+
+The following code snippet adds an IP alias:
+
+@example
+void addAlias(const char *pName, const char *pAddr, const char *pMask)
+@{
+ struct ifaliasreq aliasreq;
+ struct sockaddr_in *in;
+
+ /* initialize alias request */
+ memset(&aliasreq, 0, sizeof(aliasreq));
+ sprintf(aliasreq.ifra_name, pName);
+
+ /* initialize alias address */
+ in = (struct sockaddr_in *)&aliasreq.ifra_addr;
+ in->sin_family = AF_INET;
+ in->sin_len = sizeof(aliasreq.ifra_addr);
+ in->sin_addr.s_addr = inet_addr(pAddr);
+
+ /* initialize alias mask */
+ in = (struct sockaddr_in *)&aliasreq.ifra_mask;
+ in->sin_family = AF_INET;
+ in->sin_len = sizeof(aliasreq.ifra_mask);
+ in->sin_addr.s_addr = inet_addr(pMask);
+
+ /* call to setup the alias */
+ rtems_bsdnet_ifconfig(pName, SIOCAIFADDR, &aliasreq);
+@}
+@end example
+
+Thanks to @uref{mailto:mikes@@poliac.com,Mike Seirs} for this example
+code.
+
+@subsection Adding a Default Route
+
+The function provided in this section is functionally equivalent to
+the command @code{route add default gw yyy.yyy.yyy.yyy}:
+
+@example
+void mon_ifconfig(int argc, char *argv[], unsigned32 command_arg,
+ boolean verbose)
+@{
+ struct sockaddr_in ipaddr;
+ struct sockaddr_in dstaddr;
+ struct sockaddr_in netmask;
+ struct sockaddr_in broadcast;
+ char *iface;
+ int f_ip = 0;
+ int f_ptp = 0;
+ int f_netmask = 0;
+ int f_up = 0;
+ int f_down = 0;
+ int f_bcast = 0;
+ int cur_idx;
+ int rc;
+ int flags;
+
+ bzero((void*) &ipaddr, sizeof(ipaddr));
+ bzero((void*) &dstaddr, sizeof(dstaddr));
+ bzero((void*) &netmask, sizeof(netmask));
+ bzero((void*) &broadcast, sizeof(broadcast));
+
+ ipaddr.sin_len = sizeof(ipaddr);
+ ipaddr.sin_family = AF_INET;
+
+ dstaddr.sin_len = sizeof(dstaddr);
+ dstaddr.sin_family = AF_INET;
+
+ netmask.sin_len = sizeof(netmask);
+ netmask.sin_family = AF_INET;
+
+ broadcast.sin_len = sizeof(broadcast);
+ broadcast.sin_family = AF_INET;
+
+ cur_idx = 0;
+ if (argc <= 1) @{
+ /* display all interfaces */
+ iface = NULL;
+ cur_idx += 1;
+ @} else @{
+ iface = argv[1];
+ if (isdigit(*argv[2])) @{
+ if (inet_pton(AF_INET, argv[2], &ipaddr.sin_addr) < 0) @{
+ printf("bad ip address: %s\n", argv[2]);
+ return;
+ @}
+ f_ip = 1;
+ cur_idx += 3;
+ @} else @{
+ cur_idx += 2;
+ @}
+ @}
+
+ if ((f_down !=0) && (f_ip != 0)) @{
+ f_up = 1;
+ @}
+
+ while(argc > cur_idx) @{
+ if (strcmp(argv[cur_idx], "up") == 0) @{
+ f_up = 1;
+ if (f_down != 0) @{
+ printf("Can't make interface up and down\n");
+ @}
+ @} else if(strcmp(argv[cur_idx], "down") == 0) @{
+ f_down = 1;
+ if (f_up != 0) @{
+ printf("Can't make interface up and down\n");
+ @}
+ @} else if(strcmp(argv[cur_idx], "netmask") == 0) @{
+ if ((cur_idx + 1) >= argc) @{
+ printf("No netmask address\n");
+ return;
+ @}
+ if (inet_pton(AF_INET, argv[cur_idx+1], &netmask.sin_addr) < 0) @{
+ printf("bad netmask: %s\n", argv[cur_idx]);
+ return;
+ @}
+ f_netmask = 1;
+ cur_idx += 1;
+ @} else if(strcmp(argv[cur_idx], "broadcast") == 0) @{
+ if ((cur_idx + 1) >= argc) @{
+ printf("No broadcast address\n");
+ return;
+ @}
+ if (inet_pton(AF_INET, argv[cur_idx+1], &broadcast.sin_addr) < 0) @{
+ printf("bad broadcast: %s\n", argv[cur_idx]);
+ return;
+ @}
+ f_bcast = 1;
+ cur_idx += 1;
+ @} else if(strcmp(argv[cur_idx], "pointopoint") == 0) @{
+ if ((cur_idx + 1) >= argc) @{
+ printf("No pointopoint address\n");
+ return;
+ @}
+ if (inet_pton(AF_INET, argv[cur_idx+1], &dstaddr.sin_addr) < 0) @{
+ printf("bad pointopoint: %s\n", argv[cur_idx]);
+ return;
+ @}
+
+ f_ptp = 1;
+ cur_idx += 1;
+ @} else @{
+ printf("Bad parameter: %s\n", argv[cur_idx]);
+ return;
+ @}
+
+ cur_idx += 1;
+ @}
+
+ printf("ifconfig ");
+ if (iface != NULL) @{
+ printf("%s ", iface);
+ if (f_ip != 0) @{
+ char str[256];
+ inet_ntop(AF_INET, &ipaddr.sin_addr, str, 256);
+ printf("%s ", str);
+ @}
+
+ if (f_netmask != 0) @{
+ char str[256];
+ inet_ntop(AF_INET, &netmask.sin_addr, str, 256);
+ printf("netmask %s ", str);
+ @}
+
+ if (f_bcast != 0) @{
+ char str[256];
+ inet_ntop(AF_INET, &broadcast.sin_addr, str, 256);
+ printf("broadcast %s ", str);
+ @}
+
+ if (f_ptp != 0) @{
+ char str[256];
+ inet_ntop(AF_INET, &dstaddr.sin_addr, str, 256);
+ printf("pointopoint %s ", str);
+ @}
+
+ if (f_up != 0) @{
+ printf("up\n");
+ @} else if (f_down != 0) @{
+ printf("down\n");
+ @} else @{
+ printf("\n");
+ @}
+ @}
+
+ if ((iface == NULL) || ((f_ip == 0) && (f_down == 0) && (f_up == 0))) @{
+ rtems_bsdnet_show_if_stats();
+ return;
+ @}
+
+ flags = 0;
+ if (f_netmask) @{
+ rc = rtems_bsdnet_ifconfig(iface, SIOCSIFNETMASK, &netmask);
+ if (rc < 0) @{
+ printf("Could not set netmask: %s\n", strerror(errno));
+ return;
+ @}
+ @}
+
+ if (f_bcast) @{
+ rc = rtems_bsdnet_ifconfig(iface, SIOCSIFBRDADDR, &broadcast);
+ if (rc < 0) @{
+ printf("Could not set broadcast: %s\n", strerror(errno));
+ return;
+ @}
+ @}
+
+ if (f_ptp) @{
+ rc = rtems_bsdnet_ifconfig(iface, SIOCSIFDSTADDR, &dstaddr);
+ if (rc < 0) @{
+ printf("Could not set destination address: %s\n", strerror(errno));
+ return;
+ @}
+ flags |= IFF_POINTOPOINT;
+ @}
+
+ /* This must come _after_ setting the netmask, broadcast addresses */
+ if (f_ip) @{
+ rc = rtems_bsdnet_ifconfig(iface, SIOCSIFADDR, &ipaddr);
+ if (rc < 0) @{
+ printf("Could not set IP address: %s\n", strerror(errno));
+ return;
+ @}
+ @}
+
+ if (f_up != 0) @{
+ flags |= IFF_UP;
+ @}
+
+ if (f_down != 0) @{
+ printf("Warning: taking interfaces down is not supported\n");
+ @}
+
+ rc = rtems_bsdnet_ifconfig(iface, SIOCSIFFLAGS, &flags);
+ if (rc < 0) @{
+ printf("Could not set interface flags: %s\n", strerror(errno));
+ return;
+ @}
+@}
+
+
+
+void mon_route(int argc, char *argv[], unsigned32 command_arg,
+ boolean verbose)
+@{
+ int cmd;
+ struct sockaddr_in dst;
+ struct sockaddr_in gw;
+ struct sockaddr_in netmask;
+ int f_host;
+ int f_gw = 0;
+ int cur_idx;
+ int flags;
+ int rc;
+
+ memset(&dst, 0, sizeof(dst));
+ memset(&gw, 0, sizeof(gw));
+ memset(&netmask, 0, sizeof(netmask));
+
+ dst.sin_len = sizeof(dst);
+ dst.sin_family = AF_INET;
+ dst.sin_addr.s_addr = inet_addr("0.0.0.0");
+
+ gw.sin_len = sizeof(gw);
+ gw.sin_family = AF_INET;
+ gw.sin_addr.s_addr = inet_addr("0.0.0.0");
+
+ netmask.sin_len = sizeof(netmask);
+ netmask.sin_family = AF_INET;
+ netmask.sin_addr.s_addr = inet_addr("255.255.255.0");
+
+ if (argc < 2) @{
+ rtems_bsdnet_show_inet_routes();
+ return;
+ @}
+
+ if (strcmp(argv[1], "add") == 0) @{
+ cmd = RTM_ADD;
+ @} else if (strcmp(argv[1], "del") == 0) @{
+ cmd = RTM_DELETE;
+ @} else @{
+ printf("invalid command: %s\n", argv[1]);
+ printf("\tit should be 'add' or 'del'\n");
+ return;
+ @}
+
+ if (argc < 3) @{
+ printf("not enough arguments\n");
+ return;
+ @}
+
+ if (strcmp(argv[2], "-host") == 0) @{
+ f_host = 1;
+ @} else if (strcmp(argv[2], "-net") == 0) @{
+ f_host = 0;
+ @} else @{
+ printf("Invalid type: %s\n", argv[1]);
+ printf("\tit should be '-host' or '-net'\n");
+ return;
+ @}
+
+ if (argc < 4) @{
+ printf("not enough arguments\n");
+ return;
+ @}
+
+ inet_pton(AF_INET, argv[3], &dst.sin_addr);
+
+ cur_idx = 4;
+ while(cur_idx < argc) @{
+ if (strcmp(argv[cur_idx], "gw") == 0) @{
+ if ((cur_idx +1) >= argc) @{
+ printf("no gateway address\n");
+ return;
+ @}
+ f_gw = 1;
+ inet_pton(AF_INET, argv[cur_idx + 1], &gw.sin_addr);
+ cur_idx += 1;
+ @} else if(strcmp(argv[cur_idx], "netmask") == 0) @{
+ if ((cur_idx +1) >= argc) @{
+ printf("no netmask address\n");
+ return;
+ @}
+ f_gw = 1;
+ inet_pton(AF_INET, argv[cur_idx + 1], &netmask.sin_addr);
+ cur_idx += 1;
+ @} else @{
+ printf("Unknown argument\n");
+ return;
+ @}
+ cur_idx += 1;
+ @}
+
+ flags = RTF_STATIC;
+ if (f_gw != 0) @{
+ flags |= RTF_GATEWAY;
+ @}
+ if (f_host != 0) @{
+ flags |= RTF_HOST;
+ @}
+
+ rc = rtems_bsdnet_rtrequest(cmd, &dst, &gw, &netmask, flags, NULL);
+ if (rc < 0) @{
+ printf("Error adding route\n");
+ @}
+@}
+@end example
+
+Thanks to @uref{mailto:jtm@@smoothmsmoothie.com,Jay Monkman} for this example
+code.
+
+@subsection Time Synchronization Using NTP
+
+@example
+int rtems_bsdnet_synchronize_ntp (int interval, rtems_task_priority priority);
+@end example
+
+If the interval argument is 0 the routine synchronizes the RTEMS time-of-day
+clock with the first NTP server in the rtems_bsdnet_ntpserve array and
+returns. The priority argument is ignored.
+
+If the interval argument is greater than 0, the routine also starts an
+RTEMS task at the specified priority and polls the NTP server every
+`interval' seconds. NOTE: This mode of operation has not yet been
+implemented.
+
+On successful synchronization of the RTEMS time-of-day clock the routine
+returns 0. If an error occurs a message is printed and the routine returns -1
+with an error code in errno.
+There is no timeout -- if there is no response from an NTP server the
+routine will wait forever.
+
+
+
+
diff --git a/doc/networking/networkflow.eps b/doc/networking/networkflow.eps
new file mode 100644
index 0000000000..8aba78d55f
--- /dev/null
+++ b/doc/networking/networkflow.eps
@@ -0,0 +1,1343 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title:
+%%Creator: Diagram
+%%CreationDate: Tue Aug 18 16:41:45 1998
+%%For: eric
+%%DocumentFonts: (atend)
+%%Pages: 0 0
+%%BoundingBox: 0 0 487 549
+%%NXNextStepVersion: 3.0
+%%EndComments
+
+%%BeginProcSet: /usr/lib/NextStep/printPackage.ps 3.0
+%!
+% NeXT Printing Package
+% Version: 3.1
+% Copyright: 1988, NeXT, Inc.
+
+/__NXdef{1 index where{pop pop pop}{def}ifelse}bind def
+/__NXbdef{1 index where{pop pop pop}{bind def}ifelse}bind def
+/UserObjects 10 array __NXdef
+/defineuserobject{
+ exch dup 1 add dup UserObjects length gt{
+ array dup 0 UserObjects putinterval
+ /UserObjects exch def
+ }{pop}ifelse UserObjects exch 3 -1 roll put
+}__NXbdef
+/undefineuserobject{UserObjects exch null put}__NXbdef
+/execuserobject{UserObjects exch get exec}__NXbdef
+/__NXRectPath{4 2 roll moveto 1 index 0 rlineto
+0 exch rlineto neg 0 rlineto closepath}__NXbdef
+/__NXProcessRectArgs{
+ 1 index type /arraytype eq{
+ exch 0 4 2 index length 1 sub{
+ dup 3 add 1 exch{1 index exch get exch}for
+ 5 1 roll 5 index exec
+ }for pop pop
+ }{exec}ifelse
+}__NXbdef
+/rectfill{gsave newpath {__NXRectPath fill} __NXProcessRectArgs grestore}__NXbdef
+/rectclip{newpath {__NXRectPath} __NXProcessRectArgs clip newpath}__NXbdef
+/rectstroke{
+ gsave newpath dup type /arraytype eq{dup length 6 eq}{false}ifelse{
+ {gsave __NXRectPath null concat stroke grestore}
+ dup length array cvx copy dup 2 4 -1 roll put __NXProcessRectArgs
+ }{{__NXRectPath stroke} __NXProcessRectArgs}ifelse grestore
+}__NXbdef
+/_NXLevel2 systemdict /languagelevel known {languagelevel 2 ge}{false}ifelse __NXdef
+/xyshow{
+ 0 1 3 index length 1 sub{
+ currentpoint 4 index 3 index 1 getinterval show
+ 3 index 3 index 2 mul 1 add get add exch
+ 3 index 3 index 2 mul get add exch moveto pop
+ }for pop pop
+}__NXbdef
+/xshow{
+ 0 1 3 index length 1 sub{
+ currentpoint 4 index 3 index 1 getinterval show
+ exch 3 index 3 index get add exch moveto pop
+ }for pop pop
+}__NXbdef
+/yshow{
+ 0 1 3 index length 1 sub{
+ currentpoint 4 index 3 index 1 getinterval show
+ 3 index 3 index get add moveto pop
+ }for pop pop
+}__NXbdef
+/arct{arcto pop pop pop pop}__NXbdef
+/setbbox{pop pop pop pop}__NXbdef
+/ucache{}__NXbdef
+/ucachestatus{mark 0 0 0 0 0}__NXbdef
+/setucacheparams{cleartomark}__NXbdef
+/uappend{systemdict begin cvx exec end}__NXbdef
+/ueofill{gsave newpath uappend eofill grestore}__NXbdef
+/ufill{gsave newpath uappend fill grestore}__NXbdef
+/ustroke{
+ gsave newpath dup length 6 eq
+ {exch uappend concat}{uappend}ifelse
+ stroke grestore
+}__NXbdef
+/__NXustrokepathMatrix dup where {pop pop}{matrix def}ifelse
+/ustrokepath{
+ newpath dup length 6 eq{
+ exch uappend __NXustrokepathMatrix currentmatrix exch concat
+ strokepath setmatrix
+ }{uappend strokepath}ifelse
+} __NXbdef
+/upath{
+ [exch {/ucache cvx}if pathbbox /setbbox cvx
+ {/moveto cvx}{/lineto cvx}{/curveto cvx}{/closepath cvx}pathforall]cvx
+} __NXbdef
+/setstrokeadjust{pop}__NXbdef
+/currentstrokeadjust{false}__NXbdef
+/selectfont{exch findfont exch
+dup type /arraytype eq {makefont}{scalefont}ifelse setfont}__NXbdef
+/_NXCombineArrays{
+ counttomark dup 2 add index dup length 3 -1 roll {
+ 2 index length sub dup 4 1 roll 1 index exch 4 -1 roll putinterval exch
+ }repeat pop pop pop
+}__NXbdef
+/flushgraphics{}def
+/setwindowtype{pop pop}def
+/currentwindowtype{pop 0}def
+/setalpha{pop}def
+/currentalpha{1.0}def
+/hidecursor{}def
+/obscurecursor{}def
+/revealcursor{}def
+/setcursor{4 {pop}repeat}bind def
+/showcursor{}def
+/NextStepEncoding where not{
+/NextStepEncoding StandardEncoding 256 array copy def
+0 [129/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/Ccedilla/Egrave
+/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis
+/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/Ugrave/Uacute
+/Ucircumflex/Udieresis/Yacute/Thorn/mu/multiply/divide/copyright
+176/registered 181/brokenbar 190/logicalnot 192/onesuperior 201/twosuperior
+204/threesuperior 209/plusminus/onequarter/onehalf/threequarters/agrave
+/aacute/acircumflex/atilde/adieresis/aring/ccedilla/egrave/eacute
+/ecircumflex/edieresis/igrave 226/iacute 228/icircumflex/idieresis/eth
+/ntilde 236/ograve/oacute/ocircumflex/otilde/odieresis 242/ugrave/uacute
+/ucircumflex 246/udieresis/yacute 252/thorn/ydieresis]
+{dup type /nametype eq
+ {NextStepEncoding 2 index 2 index put pop 1 add}{exch pop}ifelse
+}forall pop
+/NextStepEncoding NextStepEncoding readonly def
+/_NXfstr 128 string dup 0 (_NX) putinterval def
+/_NXfindfont /findfont load def
+/findfont{
+ % Because we can never let NextStepEncoding get into
+ % SharedFontDirectory, we cannot reencode a font to NextStepEncoding
+ % if we are in shared mode. So if currentshared is true,
+ % we call the normal findfont and return that
+ /currentshared where {pop currentshared} {false} ifelse
+ {_NXfindfont}
+ {dup _NXfstr 3 125 getinterval cvs length 3 add _NXfstr 0 3 -1 roll
+ getinterval cvn exch FontDirectory 2 index known
+ {pop FontDirectory exch get}
+ {_NXfindfont dup /Encoding get StandardEncoding eq
+ { dup length dict exch
+ {1 index /FID ne {2 index 3 1 roll put}{pop pop}ifelse}forall
+ dup /Encoding NextStepEncoding put definefont
+ }{exch pop} ifelse
+ }ifelse
+ }ifelse
+}bind def
+}{pop}ifelse
+/_NXImageString {/__NXImageString where{pop}{/__NXImageString 4000 string __NXdef}ifelse __NXImageString}__NXbdef
+/_NXDoImageOp{
+ 3 dict begin /parr 5 array def 1 index{dup}{1}ifelse /chans exch def
+ chans 2 add 2 roll parr 0 chans getinterval astore pop
+ 5 index 4 index mul 2 index{1 sub 8 idiv 1 add mul}{mul 1 sub 8 idiv 1 add}ifelse
+ 4 index mul /totbytes exch def pop exch pop
+ gsave matrix invertmatrix concat 0.5 setgray 0 0 4 2 roll rectfill grestore
+ {0 1 chans 1 sub{parr exch get exec length totbytes exch sub /totbytes exch def}for totbytes 0 le{exit}if}loop end
+}__NXbdef
+/alphaimage{1 add _NXDoImageOp}def
+_NXLevel2{
+ /NXCalibratedRGBColorSpace where{pop}{
+ /NXCalibratedRGBColorSpace
+ {mark /NXCalibratedRGB /ColorSpace findresource exch pop}stopped
+ {cleartomark /NXCalibratedRGB[/CIEBasedABC 2 dict dup begin
+ /MatrixLMN[.4124 .2126 .0193 .3576 .7152 .1192 .1805 .0722 .9505]def
+ /WhitePoint[.9505 1 1.089] def end] /ColorSpace defineresource}if def}ifelse
+ /nxsetrgbcolor{NXCalibratedRGBColorSpace setcolorspace setcolor}__NXbdef
+ /nxsetgray{dup dup nxsetrgbcolor}__NXbdef
+ /_NXCalibratedImage{exch{array astore dup length true}{false}ifelse
+ 8 -1 roll{NXCalibratedRGBColorSpace setcolorspace}if
+ 8 dict dup 9 1 roll begin /ImageType 1 def /MultipleDataSources exch def
+ currentcolorspace 0 get /Indexed eq{pop /Decode[0 2 6 index exp 1 sub]def}
+ {2 mul dup array /Decode exch def 1 sub 0 1 3 -1 roll{Decode exch dup 2 mod put}for}ifelse
+ /DataSource exch def /ImageMatrix exch def
+ /BitsPerComponent exch def /Height exch def /Width exch def end image}__NXbdef
+} {
+ /setcmykcolor{
+ 1.0 exch sub dup dup 6 -1 roll sub dup 0 lt{pop 0}if 5 1 roll
+ 4 -1 roll sub dup 0 lt{pop 0}if 3 1 roll exch sub dup 0 lt{pop 0}if setrgbcolor}__NXbdef
+ /currentcmykcolor{currentrgbcolor 3{1.0 exch sub 3 1 roll}repeat 0}__NXbdef
+ /colorimage{2 copy 3 ne or{_NXDoImageOp}{4 index dup 8 ne exch 4 ne and{_NXDoImageOp}{
+ pop pop save 6 1 roll 12 dict begin/Proc exch def/Res 0 string def
+ /Alloc{2 index length mul 2 add dup 2 index load length gt{1.2 mul round cvi string def}{pop pop}ifelse}def
+ 1 index 8 eq{/Unpack{.34 Alloc}def}{
+ /Wid 4 index 3 mul def exch pop 8 exch/Str1 0 string def/Lim Wid def
+ /Unpack{.67 Alloc/Str1 2 Alloc 0 exch Lim exch
+ {dup -4 bitshift 17 mul Str1 exch 4 index exch put 15 and 17 mul Str1 exch 3 index 1 add exch put
+ 2 sub dup 0 le{0 lt Wid exch{exch 1 sub exch}if}if exch 2 add exch
+ }forall/Lim exch def Str1 exch 0 exch getinterval
+ }def
+ }ifelse
+ /Ops[{.3 mul add 1}{.59 mul add 2}{.11 mul add round cvi Res exch 2 index exch put 1 add 0.0 0}]def/Val 0.0 def/Phase 0 def
+ {0 Val Phase Proc/Res Unpack{exch Ops exch get exec}forall/Phase exch def/Val exch def Res exch 0 exch getinterval}
+ image end restore}ifelse}ifelse
+ }__NXbdef
+ /nxsetrgbcolor{setrgbcolor}__NXbdef /nxsetgray{setgray}__NXbdef
+ /setpattern{pop .5 setgray}__NXbdef
+ /_NXCalibratedImage{dup 1 eq {pop pop image}{colorimage}ifelse pop}__NXbdef
+} ifelse
+/_NXSetCMYKOrRGB where{pop}{
+ mark{systemdict /currentwindow get exec}stopped
+ {{pop pop pop setcmykcolor}}{{nxsetrgbcolor pop pop pop pop}}ifelse /_NXSetCMYKOrRGB exch def cleartomark
+}ifelse
+%%EndProcSet
+
+gsave
+ /__NXbasematrix matrix currentmatrix def
+grestore
+%%EndProlog
+%%BeginSetup
+%%EndSetup
+gsave
+0 0 488 549 rectclip
+[1 0 0 -1 -26.5 567] concat
+26.5 18 487 549 rectclip
+gsave
+36 306 306 261 rectclip
+0 nxsetgray
+1 setlinewidth
+[6] 1 setdash
+36.5 306.5 305 260 rectstroke
+grestore
+0.333338 nxsetgray
+gsave
+0.333338 nxsetgray
+newpath
+systemdict
+begin
+58 418 166 472 setbbox
+68.800003 418 moveto
+155.200012 428.799988 10.8 -90 0 arc
+155.200012 461.199982 10.8 0 90 arc
+68.800003 461.199982 10.8 90 180 arc
+68.800003 428.799988 10.8 180 270 arc
+closepath
+end
+clip
+newpath
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+58 418 166 472 setbbox
+69.300003 418.5 moveto
+154.700012 429.299988 10.8 -90 0 arc
+154.700012 460.699982 10.8 0 90 arc
+69.300003 460.699982 10.8 90 180 arc
+69.300003 429.299988 10.8 180 270 arc
+closepath
+end
+stroke
+grestore
+grestore
+gsave
+newpath
+systemdict
+begin
+58 418 166 472 setbbox
+69.300003 419 moveto
+154.700012 429.299988 10.3 -90 0 arc
+154.700012 460.699982 10.3 0 90 arc
+69.300003 460.699982 10.3 90 180 arc
+69.300003 429.299988 10.3 180 270 arc
+closepath
+end
+fill
+grestore
+1 nxsetgray
+gsave
+newpath
+systemdict
+begin
+54 414 162 468 setbbox
+65.300003 415 moveto
+150.700012 425.299988 10.3 -90 0 arc
+150.700012 456.699982 10.3 0 90 arc
+65.300003 456.699982 10.3 90 180 arc
+65.300003 425.299988 10.3 180 270 arc
+closepath
+end
+fill
+grestore
+gsave
+newpath
+systemdict
+begin
+54 414 162 468 setbbox
+64.800003 414 moveto
+151.200012 424.799988 10.8 -90 0 arc
+151.200012 457.199982 10.8 0 90 arc
+64.800003 457.199982 10.8 90 180 arc
+64.800003 424.799988 10.8 180 270 arc
+closepath
+end
+clip
+newpath
+0 nxsetgray
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+54 414 162 468 setbbox
+65.300003 414.5 moveto
+150.700012 425.299988 10.8 -90 0 arc
+150.700012 456.699982 10.8 0 90 arc
+65.300003 456.699982 10.8 90 180 arc
+65.300003 425.299988 10.8 180 270 arc
+closepath
+end
+stroke
+grestore
+grestore
+gsave
+/Helvetica findfont 12 scalefont [1 0 0 -1 0 0] makefont
+8
+exch
+defineuserobject
+8 execuserobject setfont
+0 nxsetgray
+8 execuserobject setfont
+0 nxsetgray
+84 430 moveto (Interface) show
+85 445 moveto (Receive) show
+84 460 moveto (Daemon) show
+grestore
+0.333338 nxsetgray
+gsave
+0.333338 nxsetgray
+newpath
+systemdict
+begin
+193 418 301 472 setbbox
+203.800003 418 moveto
+290.200012 428.799988 10.8 -90 0 arc
+290.200012 461.199982 10.8 0 90 arc
+203.800003 461.199982 10.8 90 180 arc
+203.800003 428.799988 10.8 180 270 arc
+closepath
+end
+clip
+newpath
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+193 418 301 472 setbbox
+204.300003 418.5 moveto
+289.700012 429.299988 10.8 -90 0 arc
+289.700012 460.699982 10.8 0 90 arc
+204.300003 460.699982 10.8 90 180 arc
+204.300003 429.299988 10.8 180 270 arc
+closepath
+end
+stroke
+grestore
+grestore
+gsave
+newpath
+systemdict
+begin
+193 418 301 472 setbbox
+204.300003 419 moveto
+289.700012 429.299988 10.3 -90 0 arc
+289.700012 460.699982 10.3 0 90 arc
+204.300003 460.699982 10.3 90 180 arc
+204.300003 429.299988 10.3 180 270 arc
+closepath
+end
+fill
+grestore
+1 nxsetgray
+gsave
+newpath
+systemdict
+begin
+189 414 297 468 setbbox
+200.300003 415 moveto
+285.700012 425.299988 10.3 -90 0 arc
+285.700012 456.699982 10.3 0 90 arc
+200.300003 456.699982 10.3 90 180 arc
+200.300003 425.299988 10.3 180 270 arc
+closepath
+end
+fill
+grestore
+gsave
+newpath
+systemdict
+begin
+189 414 297 468 setbbox
+199.800003 414 moveto
+286.200012 424.799988 10.8 -90 0 arc
+286.200012 457.199982 10.8 0 90 arc
+199.800003 457.199982 10.8 90 180 arc
+199.800003 424.799988 10.8 180 270 arc
+closepath
+end
+clip
+newpath
+0 nxsetgray
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+189 414 297 468 setbbox
+200.300003 414.5 moveto
+285.700012 425.299988 10.8 -90 0 arc
+285.700012 456.699982 10.8 0 90 arc
+200.300003 456.699982 10.8 90 180 arc
+200.300003 425.299988 10.8 180 270 arc
+closepath
+end
+stroke
+grestore
+grestore
+gsave
+8 execuserobject setfont
+0 nxsetgray
+8 execuserobject setfont
+0 nxsetgray
+219 430 moveto (Interface) show
+219 445 moveto (Transmit) show
+219 460 moveto (Daemon) show
+grestore
+0.333338 nxsetgray
+gsave
+0.333338 nxsetgray
+newpath
+systemdict
+begin
+184 328 310 382 setbbox
+184 328 moveto
+100.800003 0 rlineto
+25.200001 54 rlineto
+-100.800003 0 rlineto
+closepath
+end
+clip
+newpath
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+184.5 328.5 309.5 381.5 setbbox
+184.5 328.5 moveto
+100 0 rlineto
+25 53 rlineto
+-100 0 rlineto
+closepath
+end
+stroke
+grestore
+grestore
+gsave
+newpath
+systemdict
+begin
+185 329 309 381 setbbox
+185 329 moveto
+99.199997 0 rlineto
+24.799999 52 rlineto
+-99.199997 0 rlineto
+closepath
+end
+fill
+grestore
+1 nxsetgray
+gsave
+newpath
+systemdict
+begin
+181 325 305 377 setbbox
+181 325 moveto
+99.199997 0 rlineto
+24.799999 52 rlineto
+-99.199997 0 rlineto
+closepath
+end
+fill
+grestore
+gsave
+newpath
+systemdict
+begin
+180 324 306 378 setbbox
+180 324 moveto
+100.800003 0 rlineto
+25.200001 54 rlineto
+-100.800003 0 rlineto
+closepath
+end
+clip
+newpath
+0 nxsetgray
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+180.5 324.5 305.5 377.5 setbbox
+180.5 324.5 moveto
+100 0 rlineto
+25 53 rlineto
+-100 0 rlineto
+closepath
+end
+stroke
+grestore
+grestore
+gsave
+8 execuserobject setfont
+0 nxsetgray
+8 execuserobject setfont
+0 nxsetgray
+219 340.5 moveto (Interface) show
+224 355.5 moveto (Output) show
+224 370.5 moveto (Queue) show
+grestore
+0.333338 nxsetgray
+gsave
+0.333338 nxsetgray
+193 184 108 54 rectclip
+1 setlinewidth
+193.5 184.5 107 53 rectstroke
+grestore
+194 185 106 52 rectfill
+1 nxsetgray
+190 181 106 52 rectfill
+gsave
+189 180 108 54 rectclip
+0 nxsetgray
+1 setlinewidth
+189.5 180.5 107 53 rectstroke
+grestore
+gsave
+8 execuserobject setfont
+0 nxsetgray
+8 execuserobject setfont
+0 nxsetgray
+220 204 moveto (Network) show
+228 219 moveto (Code) show
+grestore
+0 nxsetgray
+1 setlinewidth
+2 setlinejoin
+gsave
+newpath
+systemdict
+begin
+242.999969 234 243.000031 316.299988 setbbox
+243.000031 234 moveto
+242.999969 316.299988 lineto
+end
+stroke
+grestore
+0 setlinejoin
+gsave
+[0 1 -1 0 567 81.000031] concat
+gsave
+newpath
+systemdict
+begin
+233.799973 319.5 242.999969 328.5 setbbox
+242.999969 324 moveto
+-9.2 4.5 rlineto
+1.5 -4.5 rlineto
+-1.5 -4.5 rlineto
+closepath
+end
+fill
+grestore
+grestore
+0 nxsetgray
+1 setlinewidth
+2 setlinejoin
+gsave
+newpath
+systemdict
+begin
+242.999985 378 243.000031 406.299988 setbbox
+243.000031 378 moveto
+242.999985 406.299988 lineto
+end
+stroke
+grestore
+0 setlinejoin
+gsave
+[0 1 -1 0 657 171.000031] concat
+gsave
+newpath
+systemdict
+begin
+233.799973 409.5 242.999969 418.5 setbbox
+242.999969 414 moveto
+-9.2 4.5 rlineto
+1.5 -4.5 rlineto
+-1.5 -4.5 rlineto
+closepath
+end
+fill
+grestore
+grestore
+0.333338 nxsetgray
+gsave
+0.333338 nxsetgray
+newpath
+systemdict
+begin
+193 22 301 76 setbbox
+203.800003 22 moveto
+290.200012 32.799999 10.8 -90 0 arc
+290.200012 65.199997 10.8 0 90 arc
+203.800003 65.199997 10.8 90 180 arc
+203.800003 32.799999 10.8 180 270 arc
+closepath
+end
+clip
+newpath
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+193 22 301 76 setbbox
+204.300003 22.5 moveto
+289.700012 33.299999 10.8 -90 0 arc
+289.700012 64.699997 10.8 0 90 arc
+204.300003 64.699997 10.8 90 180 arc
+204.300003 33.299999 10.8 180 270 arc
+closepath
+end
+stroke
+grestore
+grestore
+gsave
+newpath
+systemdict
+begin
+193 22 301 76 setbbox
+204.300003 23 moveto
+289.700012 33.299999 10.3 -90 0 arc
+289.700012 64.699997 10.3 0 90 arc
+204.300003 64.699997 10.3 90 180 arc
+204.300003 33.299999 10.3 180 270 arc
+closepath
+end
+fill
+grestore
+1 nxsetgray
+gsave
+newpath
+systemdict
+begin
+189 18 297 72 setbbox
+200.300003 19 moveto
+285.700012 29.299999 10.3 -90 0 arc
+285.700012 60.699997 10.3 0 90 arc
+200.300003 60.699997 10.3 90 180 arc
+200.300003 29.299999 10.3 180 270 arc
+closepath
+end
+fill
+grestore
+gsave
+newpath
+systemdict
+begin
+189 18 297 72 setbbox
+199.800003 18 moveto
+286.200012 28.799999 10.8 -90 0 arc
+286.200012 61.200001 10.8 0 90 arc
+199.800003 61.200001 10.8 90 180 arc
+199.800003 28.799999 10.8 180 270 arc
+closepath
+end
+clip
+newpath
+0 nxsetgray
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+189 18 297 72 setbbox
+200.300003 18.5 moveto
+285.700012 29.299999 10.8 -90 0 arc
+285.700012 60.699997 10.8 0 90 arc
+200.300003 60.699997 10.8 90 180 arc
+200.300003 29.299999 10.8 180 270 arc
+closepath
+end
+stroke
+grestore
+grestore
+gsave
+8 execuserobject setfont
+0 nxsetgray
+8 execuserobject setfont
+0 nxsetgray
+229 34 moveto (User) show
+213 49 moveto (Application) show
+229 64 moveto (Task) show
+grestore
+0.333338 nxsetgray
+gsave
+0.333338 nxsetgray
+newpath
+systemdict
+begin
+346 121 472 175 setbbox
+346 121 moveto
+100.800003 0 rlineto
+25.200001 54 rlineto
+-100.800003 0 rlineto
+closepath
+end
+clip
+newpath
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+346.5 121.5 471.5 174.5 setbbox
+346.5 121.5 moveto
+100 0 rlineto
+25 53 rlineto
+-100 0 rlineto
+closepath
+end
+stroke
+grestore
+grestore
+gsave
+newpath
+systemdict
+begin
+347 122 471 174 setbbox
+347 122 moveto
+99.199997 0 rlineto
+24.799999 52 rlineto
+-99.199997 0 rlineto
+closepath
+end
+fill
+grestore
+1 nxsetgray
+gsave
+newpath
+systemdict
+begin
+343 118 467 170 setbbox
+343 118 moveto
+99.199997 0 rlineto
+24.799999 52 rlineto
+-99.199997 0 rlineto
+closepath
+end
+fill
+grestore
+gsave
+newpath
+systemdict
+begin
+342 117 468 171 setbbox
+342 117 moveto
+100.800003 0 rlineto
+25.200001 54 rlineto
+-100.800003 0 rlineto
+closepath
+end
+clip
+newpath
+0 nxsetgray
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+342.5 117.5 467.5 170.5 setbbox
+342.5 117.5 moveto
+100 0 rlineto
+25 53 rlineto
+-100 0 rlineto
+closepath
+end
+stroke
+grestore
+grestore
+gsave
+8 execuserobject setfont
+0 nxsetgray
+8 execuserobject setfont
+0 nxsetgray
+386 133.5 moveto (Socket) show
+382 148.5 moveto (Receive) show
+384 163.5 moveto ( Queue) show
+grestore
+0.333338 nxsetgray
+gsave
+0.333338 nxsetgray
+newpath
+systemdict
+begin
+373 418 481 472 setbbox
+383.799988 418 moveto
+470.199982 428.799988 10.8 -90 0 arc
+470.199982 461.199982 10.8 0 90 arc
+383.799988 461.199982 10.8 90 180 arc
+383.799988 428.799988 10.8 180 270 arc
+closepath
+end
+clip
+newpath
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+373 418 481 472 setbbox
+384.299988 418.5 moveto
+469.699982 429.299988 10.8 -90 0 arc
+469.699982 460.699982 10.8 0 90 arc
+384.299988 460.699982 10.8 90 180 arc
+384.299988 429.299988 10.8 180 270 arc
+closepath
+end
+stroke
+grestore
+grestore
+gsave
+newpath
+systemdict
+begin
+373 418 481 472 setbbox
+384.299988 419 moveto
+469.699982 429.299988 10.3 -90 0 arc
+469.699982 460.699982 10.3 0 90 arc
+384.299988 460.699982 10.3 90 180 arc
+384.299988 429.299988 10.3 180 270 arc
+closepath
+end
+fill
+grestore
+1 nxsetgray
+gsave
+newpath
+systemdict
+begin
+369 414 477 468 setbbox
+380.299988 415 moveto
+465.699982 425.299988 10.3 -90 0 arc
+465.699982 456.699982 10.3 0 90 arc
+380.299988 456.699982 10.3 90 180 arc
+380.299988 425.299988 10.3 180 270 arc
+closepath
+end
+fill
+grestore
+gsave
+newpath
+systemdict
+begin
+369 414 477 468 setbbox
+379.799988 414 moveto
+466.199982 424.799988 10.8 -90 0 arc
+466.199982 457.199982 10.8 0 90 arc
+379.799988 457.199982 10.8 90 180 arc
+379.799988 424.799988 10.8 180 270 arc
+closepath
+end
+clip
+newpath
+0 nxsetgray
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+369 414 477 468 setbbox
+380.299988 414.5 moveto
+465.699982 425.299988 10.8 -90 0 arc
+465.699982 456.699982 10.8 0 90 arc
+380.299988 456.699982 10.8 90 180 arc
+380.299988 425.299988 10.8 180 270 arc
+closepath
+end
+stroke
+grestore
+grestore
+gsave
+8 execuserobject setfont
+0 nxsetgray
+8 execuserobject setfont
+0 nxsetgray
+400 437.5 moveto (Network) show
+399 452.5 moveto (Daemon) show
+grestore
+0.333338 nxsetgray
+gsave
+0.333338 nxsetgray
+67 499 90 45 rectclip
+1 setlinewidth
+67.5 499.5 89 44 rectstroke
+grestore
+68 500 88 43 rectfill
+1 nxsetgray
+64 496 88 43 rectfill
+gsave
+63 495 90 45 rectclip
+0 nxsetgray
+1 setlinewidth
+63.5 495.5 89 44 rectstroke
+grestore
+gsave
+8 execuserobject setfont
+0 nxsetgray
+8 execuserobject setfont
+0 nxsetgray
+86 508 moveto (Receive) show
+85 523 moveto (Interrupt) show
+gsave
+66 496 84 43 rectclip
+86 538 moveto (Handler) show
+grestore
+grestore
+0.333338 nxsetgray
+gsave
+0.333338 nxsetgray
+202 499 90 45 rectclip
+1 setlinewidth
+202.5 499.5 89 44 rectstroke
+grestore
+203 500 88 43 rectfill
+1 nxsetgray
+199 496 88 43 rectfill
+gsave
+198 495 90 45 rectclip
+0 nxsetgray
+1 setlinewidth
+198.5 495.5 89 44 rectstroke
+grestore
+gsave
+8 execuserobject setfont
+0 nxsetgray
+8 execuserobject setfont
+0 nxsetgray
+219 508 moveto (Transmit) show
+220 523 moveto (Interrupt) show
+gsave
+201 496 84 43 rectclip
+221 538 moveto (Handler) show
+grestore
+grestore
+0 nxsetgray
+1 setlinewidth
+2 setlinejoin
+[1 6] 1 setdash
+gsave
+newpath
+systemdict
+begin
+108.000023 475.700012 108.000031 495 setbbox
+108.000023 495 moveto
+108.000031 475.700012 lineto
+end
+stroke
+grestore
+[] 0 setdash
+0 setlinejoin
+gsave
+[0 -1 1 0 -359.999969 576] concat
+gsave
+newpath
+systemdict
+begin
+98.800034 463.5 108.000031 472.5 setbbox
+108.000031 468 moveto
+-9.2 4.5 rlineto
+1.5 -4.5 rlineto
+-1.5 -4.5 rlineto
+closepath
+end
+fill
+grestore
+grestore
+0 nxsetgray
+1 setlinewidth
+2 setlinejoin
+[1 6] 1 setdash
+gsave
+newpath
+systemdict
+begin
+243.000015 475.700012 243.000031 495 setbbox
+243.000015 495 moveto
+243.000031 475.700012 lineto
+end
+stroke
+grestore
+[] 0 setdash
+0 setlinejoin
+gsave
+[0 -1 1 0 -224.999969 711] concat
+gsave
+newpath
+systemdict
+begin
+233.800034 463.5 243.000031 472.5 setbbox
+243.000031 468 moveto
+-9.2 4.5 rlineto
+1.5 -4.5 rlineto
+-1.5 -4.5 rlineto
+closepath
+end
+fill
+grestore
+grestore
+0 nxsetgray
+1 setlinewidth
+2 setlinejoin
+[6] 1 setdash
+gsave
+newpath
+systemdict
+begin
+27 90 513 90 setbbox
+27 90 moveto
+513 90 lineto
+end
+stroke
+grestore
+[] 0 setdash
+0 setlinejoin
+0 nxsetgray
+1 setlinewidth
+2 setlinejoin
+gsave
+newpath
+systemdict
+begin
+304.700012 45 405.000031 117 setbbox
+405.000031 117 moveto
+405 45 lineto
+304.700012 45 lineto
+end
+stroke
+grestore
+0 setlinejoin
+gsave
+[-1 0 0 -1 594 90] concat
+gsave
+newpath
+systemdict
+begin
+287.799988 40.5 297 49.5 setbbox
+297 45 moveto
+-9.2 4.5 rlineto
+1.5 -4.5 rlineto
+-1.5 -4.5 rlineto
+closepath
+end
+fill
+grestore
+grestore
+0 nxsetgray
+1 setlinewidth
+2 setlinejoin
+gsave
+newpath
+systemdict
+begin
+297 178.699997 405.000031 207 setbbox
+297 207 moveto
+315 207 lineto
+405 207 lineto
+405.000031 178.699997 lineto
+end
+stroke
+grestore
+0 setlinejoin
+gsave
+[0 -1 1 0 234.000031 576] concat
+gsave
+newpath
+systemdict
+begin
+395.800018 166.5 405.000031 175.5 setbbox
+405.000031 171 moveto
+-9.2 4.5 rlineto
+1.5 -4.5 rlineto
+-1.5 -4.5 rlineto
+closepath
+end
+fill
+grestore
+grestore
+0.333338 nxsetgray
+gsave
+0.333338 nxsetgray
+newpath
+systemdict
+begin
+400 247 472 301 setbbox
+472 295.600006 moveto
+0 -43.200001 rlineto
+472 249.419205 455.872009 247 436 247 curveto
+416.127991 247 400 249.419205 400 252.399994 curveto
+0 43.200001 rlineto
+400 298.580811 416.127991 301 436 301 curveto
+455.872009 301 472 298.580811 472 295.600006 curveto
+closepath
+end
+clip
+newpath
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+400.5 247.5 471.5 300.5 setbbox
+471.5 295.200012 moveto
+0 -42.400002 rlineto
+471.5 249.874405 455.596008 247.5 436 247.5 curveto
+416.403992 247.5 400.5 249.874405 400.5 252.800003 curveto
+0 42.400002 rlineto
+400.5 298.12558 416.403992 300.5 436 300.5 curveto
+455.596008 300.5 471.5 298.12558 471.5 295.199982 curveto
+closepath
+end
+stroke
+grestore
+gsave
+newpath
+systemdict
+begin
+400.5 247.5 471.5 300.5 setbbox
+471.5 252.800003 moveto
+471.5 255.725601 455.596008 258.100006 436 258.100006 curveto
+416.403992 258.100006 400.5 255.725601 400.5 252.800003 curveto
+end
+stroke
+grestore
+grestore
+gsave
+newpath
+systemdict
+begin
+401 248 471 300 setbbox
+471 294.799988 moveto
+0 -41.599998 rlineto
+471 250.329605 455.320007 248 436 248 curveto
+416.679993 248 401 250.329605 401 253.199997 curveto
+0 41.599998 rlineto
+401 297.67041 416.679993 300 436 300 curveto
+455.320007 300 471 297.67041 471 294.800018 curveto
+closepath
+end
+fill
+grestore
+1 nxsetgray
+gsave
+newpath
+systemdict
+begin
+397 244 467 296 setbbox
+467 290.799988 moveto
+0 -41.599998 rlineto
+467 246.329605 451.320007 244 432 244 curveto
+412.679993 244 397 246.329605 397 249.199997 curveto
+0 41.599998 rlineto
+397 293.67041 412.679993 296 432 296 curveto
+451.320007 296 467 293.67041 467 290.800018 curveto
+closepath
+end
+fill
+grestore
+gsave
+newpath
+systemdict
+begin
+396 243 468 297 setbbox
+468 291.600006 moveto
+0 -43.200001 rlineto
+468 245.419205 451.872009 243 432 243 curveto
+412.127991 243 396 245.419205 396 248.399994 curveto
+0 43.200001 rlineto
+396 294.580811 412.127991 297 432 297 curveto
+451.872009 297 468 294.580811 468 291.600006 curveto
+closepath
+end
+clip
+newpath
+0 nxsetgray
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+396.5 243.5 467.5 296.5 setbbox
+467.5 291.200012 moveto
+0 -42.400002 rlineto
+467.5 245.874405 451.596008 243.5 432 243.5 curveto
+412.403992 243.5 396.5 245.874405 396.5 248.800003 curveto
+0 42.400002 rlineto
+396.5 294.12558 412.403992 296.5 432 296.5 curveto
+451.596008 296.5 467.5 294.12558 467.5 291.199982 curveto
+closepath
+end
+stroke
+grestore
+gsave
+newpath
+systemdict
+begin
+396.5 243.5 467.5 296.5 setbbox
+467.5 248.800003 moveto
+467.5 251.725601 451.596008 254.100006 432 254.100006 curveto
+412.403992 254.100006 396.5 251.725601 396.5 248.800003 curveto
+end
+stroke
+grestore
+grestore
+gsave
+8 execuserobject setfont
+0 nxsetgray
+8 execuserobject setfont
+0 nxsetgray
+411 266 moveto (Routing) show
+416 281 moveto (Table) show
+grestore
+0 nxsetgray
+1 setlinewidth
+2 setlinejoin
+gsave
+newpath
+systemdict
+begin
+304.304871 227.434952 388.695129 255.565048 setbbox
+304.304871 227.434952 moveto
+388.695129 255.565048 lineto
+end
+stroke
+grestore
+0 setlinejoin
+gsave
+[-0.948683 -0.316228 0.316228 -0.948683 507.607697 532.373413] concat
+gsave
+newpath
+systemdict
+begin
+287.799988 220.5 297 229.5 setbbox
+297 225 moveto
+-9.2 4.5 rlineto
+1.5 -4.5 rlineto
+-1.5 -4.5 rlineto
+closepath
+end
+fill
+grestore
+grestore
+gsave
+[0.948683 0.316228 -0.316228 0.948683 101.908165 -111.986488] concat
+gsave
+newpath
+systemdict
+begin
+386.799988 253.5 396 262.5 setbbox
+396 258 moveto
+-9.2 4.5 rlineto
+1.5 -4.5 rlineto
+-1.5 -4.5 rlineto
+closepath
+end
+fill
+grestore
+grestore
+0 nxsetgray
+1 setlinewidth
+2 setlinejoin
+gsave
+newpath
+systemdict
+begin
+242.999969 72 243.000031 172.300003 setbbox
+243.000031 72 moveto
+242.999969 172.300003 lineto
+end
+stroke
+grestore
+0 setlinejoin
+gsave
+[0 1 -1 0 422.999969 -62.999969] concat
+gsave
+newpath
+systemdict
+begin
+233.799973 175.5 242.999969 184.5 setbbox
+242.999969 180 moveto
+-9.2 4.5 rlineto
+1.5 -4.5 rlineto
+-1.5 -4.5 rlineto
+closepath
+end
+fill
+grestore
+grestore
+0 nxsetgray
+1 setlinewidth
+2 setlinejoin
+gsave
+newpath
+systemdict
+begin
+108 207 181.300003 414 setbbox
+108.000031 414 moveto
+108 207 lineto
+181.300003 207 lineto
+end
+stroke
+grestore
+0 setlinejoin
+gsave
+[1 0 0 1 0 0] concat
+gsave
+newpath
+systemdict
+begin
+179.800003 202.5 189 211.5 setbbox
+189 207 moveto
+-9.2 4.5 rlineto
+1.5 -4.5 rlineto
+-1.5 -4.5 rlineto
+closepath
+end
+fill
+grestore
+grestore
+grestore
+%%Trailer
+%%DocumentFonts: Helvetica
diff --git a/doc/networking/networkflow.jpg b/doc/networking/networkflow.jpg
new file mode 100644
index 0000000000..fc63ec69e0
--- /dev/null
+++ b/doc/networking/networkflow.jpg
Binary files differ
diff --git a/doc/networking/networkflow.png b/doc/networking/networkflow.png
new file mode 100644
index 0000000000..fd8ce244fa
--- /dev/null
+++ b/doc/networking/networkflow.png
Binary files differ
diff --git a/doc/networking/networking.texi b/doc/networking/networking.texi
new file mode 100644
index 0000000000..bedf69fe0c
--- /dev/null
+++ b/doc/networking/networking.texi
@@ -0,0 +1,105 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename networking.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the network Supplement
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS On-Line Manual
+@direntry
+* RTEMS Network Supplement: (networking).
+@end direntry
+@end ifset
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage RTEMS Network Supplement
+
+@setchapternewpage odd
+@settitle RTEMS Network Supplement
+@titlepage
+@finalout
+
+@title RTEMS Network Supplement
+@subtitle Edition @value{EDITION}, for RTEMS @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include preface.texi
+@include networktasks.texi
+@include driver.texi
+@include networkapp.texi
+@include testing.texi
+@include servers.texi
+@include decdriver.texi
+@ifinfo
+@node Top, Preface, (dir), (dir)
+@top networking
+
+This is the online version of the RTEMS Network Supplement.
+
+@menu
+* Preface::
+* Network Task Structure and Data Flow::
+* Networking Driver::
+* Using Networking in an RTEMS Application::
+* Testing the Driver::
+* Network Servers::
+* DEC 21140 Driver::
+* Command and Variable Index::
+* Concept Index::
+@end menu
+
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@node Command and Variable Index, Concept Index, List of Ethernet cards using the DEC chip, Top
+@unnumbered Command and Variable Index
+
+There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@node Concept Index, , Command and Variable Index, Top
+@unnumbered Concept Index
+
+There are currently no Concept Index entries.
+@c @printindex cp
+
+@contents
+@bye
+
diff --git a/doc/networking/networktasks.t b/doc/networking/networktasks.t
new file mode 100644
index 0000000000..dc0faa9758
--- /dev/null
+++ b/doc/networking/networktasks.t
@@ -0,0 +1,55 @@
+@c
+@c Written by Eric Norum
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Network Task Structure and Data Flow
+
+A schematic diagram of the tasks and message @b{mbuf} queues in a
+simple RTEMS networking application is shown in the following
+figure:
+
+@ifset use-ascii
+@example
+@group
+NO ASCII VERSION OF THE TASKING FIGURE IS AVAILABLE
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@image{networkflow,5in,6in}
+@end ifset
+
+@ifset use-html
+@html
+<IMG SRC="networkflow.jpg" ALIGN=CENTER
+ ALT="Network Task Structure and Data Flow">
+@end html
+@end ifset
+
+
+The transmit task for each network interface is normally blocked waiting
+for a packet to arrive in the transmit queue. Once a packet arrives, the
+transmit task may block waiting for an event from the transmit interrupt
+handler. The transmit interrupt handler sends an RTEMS event to the transmit
+task to indicate that transmit hardware resources have become available.
+
+The receive task for each network interface is normally blocked waiting
+for an event from the receive interrupt handler. When this event is received
+the receive task reads the packet and forwards it to the network stack
+for subsequent processing by the network task.
+
+The network task processes incoming packets and takes care of
+timed operations such as handling TCP timeouts and
+aging and removing routing table entries.
+
+The `Network code' contains routines which may run in the context of
+the user application tasks, the interface receive task or the network task.
+A network semaphore ensures that
+the data structures manipulated by the network code remain consistent.
diff --git a/doc/networking/preface.texi b/doc/networking/preface.texi
new file mode 100644
index 0000000000..bd10af6671
--- /dev/null
+++ b/doc/networking/preface.texi
@@ -0,0 +1,58 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Preface, Network Task Structure and Data Flow, Top, Top
+@end ifinfo
+@unnumbered Preface
+
+This document describes the RTEMS specific parts of the FreeBSD TCP/IP
+stack. Much of this documentation was written by Eric Norum
+(@email{eric@@skatter.usask.ca})
+of the Saskatchewan Accelerator Laboratory
+who also ported the FreeBSD TCP/IP stack to RTEMS.
+
+The following is a list of resources which should be useful in trying
+to understand Ethernet:
+
+@itemize @bullet
+
+@item @cite{Charles Spurgeon's Ethernet Web Site}
+
+"This site provides extensive information about Ethernet
+(IEEE 802.3) local area network (LAN) technology. Including
+the original 10 Megabit per second (Mbps) system, the 100 Mbps
+Fast Ethernet system (802.3u), and the Gigabit Ethernet system (802.3z)."
+The URL is:
+@ifset use-html
+(@uref{http://www.ethermanage.com/ethernet/ethernet.html,http://www.ethermanage.com/ethernet/ethernet.html})
+@end ifset
+@ifclear use-html
+(http://www.ethermanage.com/ethernet/ethernet.html)
+@end ifclear
+
+@item @cite{TCP/IP Illustrated, Volume 1 : The Protocols} by
+by W. Richard Stevens (ISBN: 0201633469)
+
+This book provides detailed introduction to TCP/IP and includes diagnostic
+programs which are publicly available.
+
+@item @cite{TCP/IP Illustrated, Volume 2 : The Implementation} by W. Richard
+Stevens and Gary Wright (ISBN: 020163354X)
+
+This book focuses on implementation issues regarding TCP/IP. The
+treat for RTEMS users is that the implementation covered is the BSD
+stack with most of the source code described in detail.
+
+@item @cite{UNIX Network Programming, Volume 1 : 2nd Edition} by W. Richard
+Stevens (ISBN: 0-13-490012-X)
+
+This book describes how to write basic TCP/IP applications, again with primary
+focus on the BSD stack.
+
+@end itemize
diff --git a/doc/networking/recvbd.eps b/doc/networking/recvbd.eps
new file mode 100644
index 0000000000..2719ed231a
--- /dev/null
+++ b/doc/networking/recvbd.eps
@@ -0,0 +1,181 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: recvbd.eps
+%%Creator: fig2dev Version 3.2 Patchlevel 1
+%%CreationDate: Mon Feb 8 14:02:16 1999
+%%For: raguet@genesis (Emmanuel Raguet)
+%%Orientation: Portrait
+%%BoundingBox: 0 0 252 173
+%%Pages: 0
+%%BeginSetup
+%%EndSetup
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+-186.0 268.0 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+ bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+ 4 -2 roll mul srgb} bind def
+/reencdict 12 dict def /ReEncode { reencdict begin
+/newcodesandnames exch def /newfontname exch def /basefontname exch def
+/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def
+basefontdict { exch dup /FID ne { dup /Encoding eq
+{ exch dup length array copy newfont 3 1 roll put }
+{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall
+newfont /FontName newfontname put newcodesandnames aload pop
+128 1 255 { newfont /Encoding get exch /.notdef put } for
+newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat
+newfontname newfont definefont pop end } def
+/isovec [
+8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde
+8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis
+8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron
+8#220 /dotlessi 8#230 /oe 8#231 /OE
+8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling
+8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis
+8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot
+8#255 /endash 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus
+8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph
+8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine
+8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf
+8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute
+8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring
+8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute
+8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute
+8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve
+8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply
+8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex
+8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave
+8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring
+8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute
+8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute
+8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve
+8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide
+8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex
+8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def
+/Times-Roman /Times-Roman-iso isovec ReEncode
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+%%EndProlog
+
+$F2psBegin
+10 setmiterlimit
+n -1000 5242 m -1000 -1000 l 7942 -1000 l 7942 5242 l cp clip
+ 0.06299 0.06299 sc
+% Polyline
+7.500 slw
+n 2970 1530 m 6930 1530 l 6930 2205 l 2970 2205 l cp gs col0 s gr
+% Polyline
+n 2970 2205 m 6930 2205 l 6930 2880 l 2970 2880 l cp gs col0 s gr
+% Polyline
+n 2970 2880 m 6930 2880 l 6930 3555 l 2970 3555 l cp gs col0 s gr
+% Polyline
+n 2970 3555 m 6930 3555 l 6930 4230 l 2970 4230 l cp gs col0 s gr
+% Polyline
+n 3285 1530 m 3285 2205 l gs col0 s gr
+% Polyline
+n 4230 2205 m 4230 2880 l gs col0 s gr
+% Polyline
+n 5535 2205 m 5535 2880 l gs col0 s gr
+/Times-Roman-iso ff 270.00 scf sf
+3960 3375 m
+gs 1 -1 sc (Buffer address 1) col0 sh gr
+/Times-Roman-iso ff 270.00 scf sf
+3960 4005 m
+gs 1 -1 sc (Buffer address 2) col0 sh gr
+/Times-Roman-iso ff 210.00 scf sf
+3105 2610 m
+gs 1 -1 sc (Control bits) col0 sh gr
+/Times-Roman-iso ff 210.00 scf sf
+4860 2475 m
+gs 1 -1 sc (Byte-Count) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 210.00 scf sf
+4860 2730 m
+gs 1 -1 sc (Buffer 2) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 210.00 scf sf
+6210 2520 m
+gs 1 -1 sc (Byte-Count) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 210.00 scf sf
+6210 2775 m
+gs 1 -1 sc (Buffer 1) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 210.00 scf sf
+3150 1755 m
+gs 1 -1 sc (O) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 210.00 scf sf
+3150 2160 m
+gs 1 -1 sc (N) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 210.00 scf sf
+3150 1980 m
+gs 1 -1 sc (W) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 270.00 scf sf
+4590 1935 m
+gs 1 -1 sc (Status) col0 sh gr
+$F2psEnd
+rs
diff --git a/doc/networking/recvbd.jpg b/doc/networking/recvbd.jpg
new file mode 100644
index 0000000000..b15b21b325
--- /dev/null
+++ b/doc/networking/recvbd.jpg
Binary files differ
diff --git a/doc/networking/servers.t b/doc/networking/servers.t
new file mode 100644
index 0000000000..6c55a5b1ba
--- /dev/null
+++ b/doc/networking/servers.t
@@ -0,0 +1,118 @@
+@c
+@c Text Written by Jake Janovetz
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+
+@chapter Network Servers
+
+@section RTEMS FTP Daemon
+
+The RTEMS FTPD is a complete file transfer protocol (FTP) daemon
+which can store, retrieve, and manipulate files on the local
+filesystem. In addition, the RTEMS FTPD provides ``hooks''
+which are actions performed on received data. Hooks are useful
+in situations where a destination file is not necessarily
+appropriate or in cases when a formal device driver has not yet
+been implemented.
+
+This server was implemented and documented by Jake Janovetz
+(janovetz@@tempest.ece.uiuc.edu).
+
+@subsection Configuration Parameters
+
+The configuration structure for FTPD is as follows:
+
+@example
+struct rtems_ftpd_configuration
+@{
+ rtems_task_priority priority; /* FTPD task priority */
+ unsigned long max_hook_filesize; /* Maximum buffersize */
+ /* for hooks */
+ int port; /* Well-known port */
+ struct rtems_ftpd_hook *hooks; /* List of hooks */
+@};
+@end example
+
+The FTPD task priority is specified with @code{priority}. Because
+hooks are not saved as files, the received data is placed in an
+allocated buffer. @code{max_hook_filesize} specifies the maximum
+size of this buffer. Finally, @code{hooks} is a pointer to the
+configured hooks structure.
+
+@subsection Initializing FTPD (Starting the daemon)
+
+Starting FTPD is done with a call to @code{rtems_initialize_ftpd()}.
+The configuration structure must be provided in the application
+source code. Example hooks structure and configuration structure
+folllow.
+
+@example
+struct rtems_ftpd_hook ftp_hooks[] =
+ @{
+ @{"untar", Untar_FromMemory@},
+ @{NULL, NULL@}
+ @};
+
+struct rtems_ftpd_configuration rtems_ftpd_configuration =
+ @{
+ 40, /* FTPD task priority */
+ 512*1024, /* Maximum hook 'file' size */
+ 0, /* Use default port */
+ ftp_hooks /* Local ftp hooks */
+ @};
+@end example
+
+Specifying 0 for the well-known port causes FTPD to use the
+UNIX standard FTPD port (21).
+
+@subsection Using Hooks
+
+In the example above, one hook was installed. The hook causes
+FTPD to call the function @code{Untar_FromMemory} when the
+user sends data to the file @code{untar}. The prototype for
+the @code{untar} hook (and hooks, in general) is:
+
+@example
+ int Untar_FromMemory(unsigned char *tar_buf, unsigned long size);
+@end example
+
+An example FTP transcript which exercises this hook is:
+
+@example
+220 RTEMS FTP server (Version 1.0-JWJ) ready.
+Name (dcomm0:janovetz): John Galt
+230 User logged in.
+Remote system type is RTEMS.
+ftp> bin
+200 Type set to I.
+ftp> dir
+200 PORT command successful.
+150 ASCII data connection for LIST.
+drwxrwx--x 0 0 268 dev
+drwxrwx--x 0 0 0 TFTP
+226 Transfer complete.
+ftp> put html.tar untar
+local: html.tar remote: untar
+200 PORT command successful.
+150 BINARY data connection.
+210 File transferred successfully.
+471040 bytes sent in 0.48 secs (9.6e+02 Kbytes/sec)
+ftp> dir
+200 PORT command successful.
+150 ASCII data connection for LIST.
+drwxrwx--x 0 0 268 dev
+drwxrwx--x 0 0 0 TFTP
+drwxrwx--x 0 0 3484 public_html
+226 Transfer complete.
+ftp> quit
+221 Goodbye.
+@end example
+
+
+
diff --git a/doc/networking/testing.t b/doc/networking/testing.t
new file mode 100644
index 0000000000..8f52ec6b54
--- /dev/null
+++ b/doc/networking/testing.t
@@ -0,0 +1,257 @@
+@c
+@c Written by Eric Norum
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+
+@chapter Testing the Driver
+
+@section Preliminary Setup
+
+The network used to test the driver should include at least:
+
+@itemize @bullet
+
+@item The hardware on which the driver is to run.
+It makes testing much easier if you can run a debugger to control
+the operation of the target machine.
+
+@item An Ethernet network analyzer or a workstation with an
+`Ethernet snoop' program such as @code{ethersnoop} or
+@code{tcpdump}.
+
+@item A workstation.
+
+@end itemize
+
+During early debug, you should consider putting the target, workstation,
+and snooper on a small network by themselves. This offers a few
+advantages:
+
+@itemize @bullet
+
+@item There is less traffic to look at on the snooper and for the target
+to process while bringing the driver up.
+
+@item Any serious errors will impact only your small network not a building
+or campus network. You want to avoid causing any unnecessary problems.
+
+@item Test traffic is easier to repeatably generate.
+
+@item Performance measurements are not impacted by other systems on
+the network.
+
+@end itemize
+
+@section Debug Output
+
+There are a number of sources of debug output that can be enabled
+to aid in tracing the behavior of the network stack. The following
+is a list of them:
+
+@itemize @bullet
+
+@item mbuf activity
+
+There are commented out calls to @code{printf} in the file
+@code{sys/mbuf.h} in the network stack code. Uncommenting
+these lines results in output when mbuf's are allocated
+and freed. This is very useful for finding memory leaks.
+
+@item TX and RX queuing
+
+There are commented out calls to @code{printf} in the file
+@code{net/if.h} in the network stack code. Uncommenting
+these lines results in output when packets are placed
+on or removed from one of the transmit or receive packet
+queues. These queues can be viewed as the boundary line
+between a device driver and the network stack. If the
+network stack is enqueuing packets to be transmitted that
+the device driver is not dequeuing, then that is indicative
+of a problem in the transmit side of the device driver.
+Conversely, if the device driver is enqueueing packets
+as it receives them (via a call to @code{ether_input}) and
+they are not being dequeued by the network stack,
+then there is a problem. This situation would likely indicate
+that the network server task is not running.
+
+@item TCP state transitions
+
+In the unlikely event that one would actually want to see
+TCP state transitions, the @code{TCPDEBUG} macro can be defined
+in the file @code{opt_tcpdebug.h}. This results in the routine
+@code{tcp_trace()} being called by the network stack and
+the state transitions logged into the @code{tcp_debug} data
+structure. If the variable @code{tcpconsdebug} in the file
+@code{netinet/tcp_debug.c} is set to 1, then the state transitions
+will also be printed to the console.
+
+@end itemize
+
+@section Driver basic operation
+
+The network demonstration program @code{netdemo} may be used for these tests.
+
+@itemize @bullet
+
+@item Edit @code{networkconfig.h} to reflect the values for your network.
+
+@item Start with @code{RTEMS_USE_BOOTP} not defined.
+
+@item Edit @code{networkconfig.h} to configure the driver
+with an
+explicit Ethernet and Internet address and with reception of
+broadcast packets disabled:
+
+Verify that the program continues to run once the driver has been attached.
+
+@item Issue a @samp{u} command to send UDP
+packets to the `discard' port.
+Verify that the packets appear on the network.
+
+@item Issue a @samp{s} command to print the network and driver statistics.
+
+@item On a workstation, add a static route to the target system.
+
+@item On that same workstation try to `ping' the target system.
+Verify that the ICMP echo request and reply packets appear on the net.
+
+@item Remove the static route to the target system.
+Modify @code{networkconfig.h} to attach the driver
+with reception of broadcast packets enabled.
+Try to `ping' the target system again.
+Verify that ARP request/reply and ICMP echo request/reply packets appear
+on the net.
+
+@item Issue a @samp{t} command to send TCP
+packets to the `discard' port.
+Verify that the packets appear on the network.
+
+@item Issue a @samp{s} command to print the network and driver statistics.
+
+@item Verify that you can telnet to ports 24742
+and 24743 on the target system from one or more
+workstations on your network.
+
+@end itemize
+
+@section BOOTP/DHCP operation
+
+Set up a BOOTP/DHCP server on the network.
+Set define @code{RTEMS USE_BOOT} in @code{networkconfig.h}.
+Run the @code{netdemo} test program.
+Verify that the target system configures itself from the BOOTP/DHCP server and
+that all the above tests succeed.
+
+@section Stress Tests
+
+Once the driver passes the tests described in the previous section it should
+be subjected to conditions which exercise it more
+thoroughly and which test its error handling routines.
+
+@subsection Giant packets
+
+@itemize @bullet
+@item Recompile the driver with @code{MAXIMUM_FRAME_SIZE} set to
+a smaller value, say 514.
+
+@item `Ping' the driver from another workstation and verify
+that frames larger than 514 bytes are correctly rejected.
+
+@item Recompile the driver with @code{MAXIMUM_FRAME_SIZE} restored to 1518.
+@end itemize
+
+@subsection Resource Exhaustion
+
+@itemize @bullet
+@item Edit @code{networkconfig.h}
+so that the driver is configured with just two receive and transmit descriptors.
+
+@item Compile and run the @code{netdemo} program.
+
+@item Verify that the program operates properly and that you can
+still telnet to both the ports.
+
+@item Display the driver statistics (Console `@code{s}' command or telnet
+`control-G' character) and verify that:
+
+@enumerate
+
+@item The number of transmit interrupts is non-zero.
+This indicates that all transmit descriptors have been in use at some time.
+
+@item The number of missed packets is non-zero.
+This indicates that all receive descriptors have been in use at some time.
+
+@end enumerate
+
+@end itemize
+
+@subsection Cable Faults
+
+@itemize @bullet
+@item Run the @code{netdemo} program.
+
+@item Issue a `@code{u}' console command to make the target machine transmit
+a bunch of UDP packets.
+
+@item While the packets are being transmitted, disconnect and reconnect the
+network cable.
+
+@item Display the network statistics and verify that the driver has
+detected the loss of carrier.
+
+@item Verify that you can still telnet to both ports on the target machine.
+
+@end itemize
+
+@subsection Throughput
+
+Run the @code{ttcp} network benchmark program.
+Transfer large amounts of data (100's of megabytes) to and from the target
+system.
+
+The procedure for testing throughput from a host to an RTEMS target
+is as follows:
+
+@enumerate
+@item Download and start the ttcp program on the Target.
+
+@item In response to the @code{ttcp} prompt, enter @code{-s -r}. The
+meaning of these flags is described in the @code{ttcp.1} manual page
+found in the @code{ttcp_orig} subdirectory.
+
+@item On the host run @code{ttcp -s -t <<insert the hostname or IP address of
+the Target here>>}
+
+@end enumerate
+
+
+The procedure for testing throughput from an RTEMS target
+to a Host is as follows:
+
+@enumerate
+@item On the host run @code{ttcp -s -r}.
+
+@item Download and start the ttcp program on the Target.
+
+@item In response to the @code{ttcp} prompt, enter @code{-s -t <<insert
+the hostname or IP address of the Target here>>}. You need to type the
+IP address of the host unless your Target is talking to your Domain Name
+Server.
+
+@end enumerate
+
+To change the number of buffers, the buffer size, etc. you just add the
+extra flags to the @code{-t} machine as specified in the @code{ttcp.1}
+manual page found in the @code{ttcp_orig} subdirectory.
+
+
+
+
+
diff --git a/doc/new_chapters/.cvsignore b/doc/new_chapters/.cvsignore
new file mode 100644
index 0000000000..b55e2ffc15
--- /dev/null
+++ b/doc/new_chapters/.cvsignore
@@ -0,0 +1,33 @@
+adminiface.texi
+confspace.texi
+cpuuse.texi
+dumpcontrol.texi
+error.texi
+eventlog.texi
+index.html
+Makefile
+Makefile.in
+mdate-sh
+monitor.texi
+new_chapters
+new_chapters-?
+new_chapters-??
+new_chapters.aux
+new_chapters.cp
+new_chapters.dvi
+new_chapters.fn
+new_chapters*.html
+new_chapters.ky
+new_chapters.log
+new_chapters.pdf
+new_chapters.pg
+new_chapters.ps
+new_chapters.toc
+new_chapters.tp
+new_chapters.vr
+rtems_footer.html
+rtems_header.html
+rtmonuse.texi
+stackchk.texi
+stamp-vti
+version.texi
diff --git a/doc/new_chapters/ChangeLog b/doc/new_chapters/ChangeLog
new file mode 100644
index 0000000000..5f2971f6e0
--- /dev/null
+++ b/doc/new_chapters/ChangeLog
@@ -0,0 +1,64 @@
+2003-12-12 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-12-11 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-11-26 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Add *.info to CLEANFILES to accomodate
+ automake-1.7f/1.8 breaking building infos.
+
+2003-09-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Merger from rtems-4-6-branch.
+
+2003-09-19 Joel Sherrill <joel@OARcorp.com>
+
+ * new_chapters.texi: Merge from branch.
+
+2003-01-25 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * new_chapters.texi: Set @setfilename new_chapters.info.
+
+2003-01-24 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Put GENERATED_FILES into $builddir.
+
+2003-01-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * version.texi: Remove from CVS.
+ * stamp-vti: Remove from CVS.
+ * .cvsignore: Add version.texi.
+ Add stamp-vti.
+ Re-sort.
+
+2003-01-21 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-11-13 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-10-24 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-03-27 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Remove AUTOMAKE_OPTIONS.
+
+2002-01-18 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: include main.am, require automake-1.5.
+
+2001-01-17 Joel Sherrill <joel@OARcorp.com>
+
+ * .cvsignore: Added rtems_header.html and rtems_footer.html.
+
+2000-08-10 Joel Sherrill <joel@OARcorp.com>
+
+ * ChangeLog: New file.
diff --git a/doc/new_chapters/Makefile.am b/doc/new_chapters/Makefile.am
new file mode 100644
index 0000000000..a79a23a9c3
--- /dev/null
+++ b/doc/new_chapters/Makefile.am
@@ -0,0 +1,77 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = new_chapters
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/main.am
+
+GENERATED_FILES = adminiface.texi confspace.texi dumpcontrol.texi \
+ eventlog.texi stackchk.texi rtmonuse.texi cpuuse.texi error.texi \
+ monitor.texi
+
+COMMON_FILES += $(top_srcdir)/common/cpright.texi
+
+FILES =
+
+info_TEXINFOS = new_chapters.texi
+new_chapters_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+eventlog.texi: eventlog.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+dumpcontrol.texi: dumpcontrol.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+confspace.texi: confspace.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+adminiface.texi: adminiface.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+stackchk.texi: stackchk.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+rtmonuse.texi: rtmonuse.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+cpuuse.texi: cpuuse.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+error.texi: error.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+monitor.texi: monitor.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+noinst_SCRIPTS = gen_section
+
+EXTRA_DIST = adminiface.t base.t confspace.t cpuuse.t dumpcontrol.t error.t \
+ eventlog.t monitor.t rtmonuse.t stackchk.t STATUS TODO \
+ $(noinst_SCRIPTS)
+
+CLEANFILES += new_chapters.info new_chapters.info-?
diff --git a/doc/new_chapters/STATUS b/doc/new_chapters/STATUS
new file mode 100644
index 0000000000..bff8ecbb8f
--- /dev/null
+++ b/doc/new_chapters/STATUS
@@ -0,0 +1,9 @@
+#
+# $Id$
+#
+
+Each of the chapters is individually generated with no attempt to link
+the chapters together into a long hypertext chain.
+
+Some are chapters for POSIX 1003.1h managers. Some are RTEMS support
+libraries that we have not figured out where to put in the documentation.
diff --git a/doc/new_chapters/TODO b/doc/new_chapters/TODO
new file mode 100644
index 0000000000..9f5a884add
--- /dev/null
+++ b/doc/new_chapters/TODO
@@ -0,0 +1,4 @@
+
+General - check that all nodes have "none" if they don't have a note.
+
+
diff --git a/doc/new_chapters/adminiface.t b/doc/new_chapters/adminiface.t
new file mode 100644
index 0000000000..2d0ef7044c
--- /dev/null
+++ b/doc/new_chapters/adminiface.t
@@ -0,0 +1,129 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Administration Interface Manager
+
+@section Introduction
+
+The administration interface manager provides a portable
+interface for some system administrative functions.
+The capabilities in this manager are defined in the POSIX
+1003.1h/D3 proposed standard titled @b{Services for Reliable,
+Available, and Serviceable Systems}.
+
+The directives provided by the administration interface manager are:
+
+@itemize @bullet
+@item @code{admin_shutdown} - Shutdown the system
+@end itemize
+
+@section Background
+
+@subsection admin_args Structure
+
+@example
+put structure here
+@end example
+
+@table @b
+@item admin_type
+This field ...
+
+@table @b
+@item ADMIN_AUTOBOOT
+The default, causing the system to reboot in its usual fashion. The
+@code{admin_data} field points to an implementation defined string
+that specifies the system image to reboot.
+
+@item ADMIN_HALT
+The system is simply halted; no reboot takes place.
+
+@item ADMIN_FAST
+The system does no send SIGTERM to active processes before halting.
+
+@item ADMIN_IMMEDIATE
+The system does not perform any of the normal shutdown procedures.
+
+@item ADMIN_ALTSYSTEM
+The system reboots using the @code{admin_data} string as a specification
+of the system to be booted.
+
+@item ADMIN_ALTCONFIG
+The system reboots using the @code{admin_data} string as a specification
+of the initial implicit configuration space.
+
+@item ADMIN_SYSDUMP
+Dump kernal memory before rebooting.
+
+@item ADMIN_INIT
+An option allowing the specification of an alternate initial program
+to be run when the system reboots.
+
+@end table
+
+@item admin_data
+This field ...
+
+@end table
+
+@section Operations
+
+@subsection Shutting Down the System
+
+@section Directives
+
+This section details the administration interface manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@page
+@subsection admin_shutdown - Shutdown the system
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <admin.h>
+
+int admin_shutdown(
+ struct admin_args *args[],
+ size_t nargs
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+An invalid argument was passed to the function call.
+
+@item EPERM
+The caller does not have appropriate permission for shutting down the
+system.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{admin_shutdown} function restarts the system. The
+@code{args} argument specifies alternate or optional behavior
+for the @code{admin_shutdown} function. The @code{admin_type}
+member of each element of the @code{args} array specifies the
+optional behavior to be performed. There are some @code{admin_types}
+values that may provoke unspecified behavior. The @code{nargs}
+argument specifies the length of the @code{args} array.
+
+@subheading NOTES:
+
+The @code{_POSIX_ADMIN} feature flag is defined to indicate
+this service is available.
diff --git a/doc/new_chapters/base.t b/doc/new_chapters/base.t
new file mode 100644
index 0000000000..a5c9509a1a
--- /dev/null
+++ b/doc/new_chapters/base.t
@@ -0,0 +1,62 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Mutex Manager
+
+@section Introduction
+
+The mutex manager ...
+
+The directives provided by the mutex manager are:
+
+@itemize @bullet
+@item @code{sigaddset} -
+@item @code{sigdelset} -
+@item @code{sigfillset} -
+@item @code{sigismember} -
+@item @code{sigemptyset} -
+@item @code{sigaction} -
+@item @code{pthread_kill} -
+@item @code{pthread_sigmask} -
+@item @code{kill} -
+@item @code{sigwait} -
+@end itemize
+
+@section Background
+
+There is currently no text in this section.
+
+@section Operations
+
+There is currently no text in this section.
+
+@section Directives
+
+This section details the mutex manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@page
+@subsection sigaddset
+
+@subheading CALLING SEQUENCE:
+
+@example
+int sigaddset(
+ sigset_t *set,
+ int signo
+);
+@end example
+
+@subheading STATUS CODES:
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
diff --git a/doc/new_chapters/confspace.t b/doc/new_chapters/confspace.t
new file mode 100644
index 0000000000..fd5660a018
--- /dev/null
+++ b/doc/new_chapters/confspace.t
@@ -0,0 +1,1351 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Configuration Space Manager
+
+@section Introduction
+
+The configuration space manager provides a portable
+interface for manipulating configuration data.
+The capabilities in this manager were defined in the POSIX
+1003.1h/D3 proposed standard titled @b{Services for Reliable,
+Available, and Serviceable Systems}.
+
+The directives provided by the configuration space manager are:
+
+@itemize @bullet
+@item @code{cfg_mount} - Mount a Configuration Space
+@item @code{cfg_unmount} - Unmount a Configuration Space
+@item @code{cfg_mknod} - Create a Configuration Node
+@item @code{cfg_get} - Get Configuration Node Value
+@item @code{cfg_set} - Set Configuration Node Value
+@item @code{cfg_link} - Create a Configuration Link
+@item @code{cfg_unlink} - Remove a Configuration Link
+@item @code{cfg_open} - Open a Configuration Space
+@item @code{cfg_read} - Read a Configuration Space
+@item @code{cfg_children} - Get Node Entries
+@item @code{cfg_mark} - Set Configuration Space Option
+@item @code{cfg_readdir} - Reads a directory
+@item @code{cfg_umask} - Sets a file creation mask
+@item @code{cfg_chmod} - Changes file mode
+@item @code{cfg_chown} - Changes the owner and/or group of a file
+@end itemize
+
+@section Background
+
+@subsection Configuration Nodes
+
+@subsection Configuration Space
+
+@subsection Format of a Configuration Space File
+
+@section Operations
+
+@subsection Mount and Unmounting
+
+@subsection Creating a Configuration Node
+
+@subsection Removing a Configuration Node
+
+@subsection Manipulating a Configuration Node
+
+@subsection Traversing a Configuration Space
+
+@section Directives
+
+This section details the configuration space manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@page
+@subsection cfg_mount - Mount a Configuration Space
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <cfg.h>
+
+int cfg_mount(
+ const char *file,
+ const char *cfgpath,
+ log_facility_t notification,
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{cfg_mount()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EPERM
+The caller does not have the appropriate privilege.
+
+@item EACCES
+Search permission is denied for a component of the path prefix.
+
+@item EEXIST
+The file specified by the @code{file} argument does not exist
+
+@item ENAMETOOLONG
+A component of a pathname exceeded @code{NAME_MAX} characters,
+or an entire path name exceed @code{PATH_MAX} characters while
+@code{_POSIX_NO_TRUNC} is in effect.
+
+@item ENOENT
+A component of @code{cfgpath} does not exist.
+
+@item ENOTDIR
+A component of the @code{file} path prefix is not a directory.
+
+@item EBUSY
+The configuration space defined by @code{file} is already mounted.
+
+@item EINVAL
+The notification argument specifies an invalid log facility.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{cfg_mount()} function maps a configuration space defined
+by the file identified by the the @code{file} argument. The
+distinguished node of the mapped configuration space is
+mounted in the active space at the point identified by the
+@code{cfgpath} configuration pathname.
+
+The @code{notification} argument specifies how changes to the
+mapped configuration space are communicated to the application.
+If the @code{notification} argument is NULL, no notification will be
+be performed for the mapped configuration space. If the Event
+Logging option is defined, the notification argument defines the
+facility to which changes in the mapped configuration space are
+logged. Otherwise, the @code{notification} argument specifies
+an implementation defined method of notifying the application
+of changes to the mapped configuration space.
+
+@subheading NOTES:
+
+The @code{_POSIX_CFG} feature flag is defined to indicate
+this service is available.
+
+@page
+@subsection cfg_unmount - Unmount a Configuration Space
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <cfg.h>
+
+int cfg_unmount(
+ const char *cfgpath
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{cfg_umount()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EPERM
+The caller does not have the appropriate privileges.
+
+@item EACCES
+Search permission is denied for a component of the path prefix.
+
+@item ENOENT
+A component of @code{cfgpath} does not exist.
+
+@item ENAMETOOLONG
+A component of a pathname exceeded @code{NAME_MAX} characters,
+or an entire path name exceed @code{PATH_MAX} characters while
+@code{_POSIX_NO_TRUNC} is in effect.
+
+@item EINVAL
+The requested node is not the distinguished node of a mounted
+configuration space.
+
+@item EBUSY
+One or more processes has an open configuration traversal
+stream for the configuration space whose distinguished node is
+referenced by the cfgpath argument.
+
+@item ELOOP
+A node appears more than once in the path specified by the
+@code{cfgpath} argument
+
+@item ELOOP
+More than @code{SYMLOOP_MAX} symbolic links were encountered during
+resolution of the cfgpath argument
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{cfg_umount()} function unmaps the configuration space whose
+distinguished node is mapped in the active space at the location defined
+by @code{cfgpath} configuration pathname. All system resources
+allocated for this configuration space should be deallocated.
+
+@subheading NOTES:
+
+The @code{_POSIX_CFG} feature flag is defined to indicate
+this service is available.
+
+@page
+@subsection cfg_mknod - Create a Configuration Node
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <cfg.h>
+
+int cfg_mknod(
+ const char *cfgpath,
+ mode_t mode,
+ cfg_type_t type
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{cfg_mknod()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item ENAMETOOLONG
+A component of a pathname exceeded @code{NAME_MAX} characters,
+or an entire path name exceed @code{PATH_MAX} characters while
+@code{_POSIX_NO_TRUNC} is in effect.
+
+@item ENOENT
+A component of the path prefix does not exist.
+
+@item EACCES
+Search permission is denied for a component of the path prefix.
+
+
+@item EPERM
+The calling process does not have the appropriate privilege.
+
+@item EEXIST
+The named node exists.
+
+@item EINVAL
+The value of @code{mode} is invalid.
+
+@item EINVAL
+The value of @code{type} is invalid.
+
+@item ELOOP
+A node appears more than once in the path specified by the
+@code{cfg_path} argument
+
+@item ELOOP
+More than @code{SYMLOOP_MAX} symbolic links were encountered during
+resolution of the @code{cfgpath} argument.
+
+@item EROFS
+The named @code{node} resides on a read-only configuration space.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{cfg_mknod()} function creates a new node in the configuration
+space which contains the pathname prefix of @code{cfgpath}. The node
+name is defined by the pathname suffix of @code{cfgpath}. The node
+permissions are specified by the value of @code{mode}. The node type
+is specified by the value of @code{type}.
+
+@subheading NOTES:
+
+The @code{_POSIX_CFG} feature flag is defined to indicate
+this service is available.
+
+@page
+@subsection cfg_get - Get Configuration Node Value
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <cfg.h>
+
+int cfg_get(
+ const char *cfgpath
+ cfg_value_t *value
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{cfg_get()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item ENAMETOOLONG
+A component of a pathname exceeded @code{NAME_MAX} characters,
+or an entire path name exceed @code{PATH_MAX} characters while
+@code{_POSIX_NO_TRUNC} is in effect.
+
+@item ENOENT
+A component of @code{cfgpath} does not exist.
+
+@item EACCES
+Search permission is denied for a component of the path prefix.
+
+@item EPERM
+The calling process does not have the appropriate privileges.
+
+@item ELOOP
+A node appears more than once in the path specified by the
+@code{cfgpath} argument
+
+@item ELOOP
+More than @code{SYMLOOP_MAX} symbolic links were encountered during
+resolution of the @code{cfgpath} argument.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{cfg_get()} function stores the value attribute of the
+configuration node identified by @code{cfgpath}, into the buffer
+described by the @code{value} pointer.
+
+@subheading NOTES:
+
+The @code{_POSIX_CFG} feature flag is defined to indicate
+this service is available.
+
+@page
+@subsection cfg_set - Set Configuration Node Value
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <cfg.h>
+
+int cfg_set(
+ const char *cfgpath
+ cfg_value_t *value
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{cfg_set()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item ENAMETOOLONG
+A component of a pathname exceeded @code{NAME_MAX} characters,
+or an entire path name exceed @code{PATH_MAX} characters while
+@code{_POSIX_NO_TRUNC} is in effect.
+
+@item ENOENT
+A component of @code{cfgpath} does not exist
+
+@item EACCES
+Search permission is denied for a component of the path prefix.
+
+@item EPERM
+The calling process does not have the appropriate privilege.
+
+@item ELOOP
+A node appears more than once in the path specified by the
+@code{cfgpath} argument.
+
+@item ELOOP
+More than @code{SYMLOOP_MAX} symbolic links were encountered during
+resolution of the cfgpath argument.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{cfg_set()} function stores the value specified by the
+@code{value} argument in the configuration node defined by the
+@code{cfgpath} argument.
+
+@subheading NOTES:
+
+The @code{_POSIX_CFG} feature flag is defined to indicate
+this service is available.
+
+@page
+@subsection cfg_link - Create a Configuration Link
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <cfg.h>
+
+int cfg_link(
+ const char *src
+ const char *dest
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{cfg_link()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item ENAMETOOLONG
+A component of a pathname exceeded @code{NAME_MAX} characters,
+or an entire path name exceed @code{PATH_MAX} characters while
+@code{_POSIX_NO_TRUNC} is in effect.
+
+@item ENOENT
+A component of either path prefix does not exist.
+
+@item EACCES
+A component of either path prefix denies search permission.
+
+@item EACCES
+The requested link requires writing in a node with a mode that
+denies write permission.
+
+@item ENOENT
+The node named by @code{src} does not exist.
+
+@item EEXIST
+The node named by @code{dest} does exist.
+
+@item EPERM
+The calling process does not have the appropriate privilege to
+modify the node indicated by the @code{src} argument.
+
+@item EXDEV
+The link named by @code{dest} and the node named by @code{src} are from different
+configuration spaces.
+
+@item ENOSPC
+The node in which the entry for the new link is being placed
+cannot be extended because there is no space left on the
+configuration space containing the node.
+
+@item EIO
+An I/O error occurred while reading from or writing to the
+configuration space to make the link entry.
+
+@item EROFS
+The requested link requires writing in a node on a read-only
+configuration space.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{src} and @code{dest} arguments point to pathnames which
+name existing nodes. The @code{cfg_link()} function atomically creates
+a link between specified nodes, and increment by one the link count
+of the node specified by the @code{src} argument.
+
+If the @code{cfg_link()} function fails, no link is created, and the
+link count of the node remains unchanged by this function call.
+
+
+@subheading NOTES:
+
+The @code{_POSIX_CFG} feature flag is defined to indicate
+this service is available.
+
+@page
+@subsection cfg_unlink - Remove a Configuration Link
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <cfg.h>
+
+int cfg_unlink(
+ const char *cfgpath
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{cfg_unlink()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item ENAMETOOLONG
+A component of a pathname exceeded @code{NAME_MAX} characters,
+or an entire path name exceed @code{PATH_MAX} characters.
+
+@item EACCES
+Search permission is denied on the node containing the link to
+be removed.
+
+@item EACCES
+Write permission is denied on the node containing the link to
+be removed.
+
+@item ENOENT
+A component of @code{cfgpath} does not exist.
+
+@item EPERM
+The calling process does not have the appropriate privilege to
+modify the node indicated by the path prefix of the @code{cfgpath}
+argument.
+
+@item EBUSY
+The node to be unlinked is the distinguished node of a mounted
+configuration space.
+
+@item EIO
+An I/O error occurred while deleting the link entry or deallocating
+the node.
+
+@item EROFS
+The named node resides in a read-only configuration space.
+
+@item ELOOP
+A node appears more than once in the path specified by the
+@code{cfgpath} argument.
+
+@item ELOOP
+More than @code{SYMLOOP_MAX} symbolic links were encountered during
+resolution of the cfgpath argument.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{cfg_unlink()} function removes the link between the node
+specified by the @code{cfgpath} path prefix and the parent node
+specified by @code{cfgpath}, and decrements the link count
+of the @code{cfgpath} node.
+
+When the link count of the node becomes zero, the space occupied
+by the node is freed and the node is no longer be accessible.
+
+@subheading NOTES:
+
+The @code{_POSIX_CFG} feature flag is defined to indicate
+this service is available.
+
+@page
+@subsection cfg_open - Open a Configuration Space
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <cfg.h>
+
+int cfg_open(
+ const char *pathnames[],
+ int options,
+ int (*compar)(const CFGENT **f1, const CFGENT **f2),
+ CFG **cfgstream
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{cfg_open()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EACCES
+Search permission is denied for any component of a pathname.
+
+@item ELOOP
+A loop exists in symbolic links encountered during resolution
+of a pathname.
+
+@item ENAMETOOLONG
+The length of a pathname exceeds @code{PATH_MAX}, or a pathname
+component is longer than @code{NAME_MAX} while @code{_POSIX_NO_TRUNC}
+
+@item ENOENT
+The pathname argument is an empty string or the named node
+does not exist.
+
+@item EINVAL
+Either both or neither of @code{CFG_LOGICAL} and @code{CFG_PHYSICAL} are
+specified by the @code{options} argument
+
+@item ENOMEM
+Not enough memory is available to create the necessary structures.
+
+@item ELOOP
+More than @code{SYMLOOP_MAX} symbolic links were encountered during
+resolution of the @code{pathnames} argument.
+
+@item ENAMETOOLONG
+As a result of encountering a symbolic link in resolution of the
+pathname specified by the @code{pathnames} argument, the length of
+the substituted pathname string exceeded @code{PATH_MAX}.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{cfg_open()} function opens a configuration traversal stream
+rooted in the configuration nodes name by the @code{pathnames} argument.
+It stores a pointer to a CFG object that represents that stream at
+the location identified the @code{cfgstream} pointer. The @code{pathnames}
+argument is an array of character pointers to NULL-terminated strings.
+The last member of this array is a NULL pointer.
+
+The value of @code{options} is the bitwise inclusive OR of values from the
+following lists. Applications supply exactly one of the first two values
+below in @code{options}.
+
+@table @b
+
+@item CFG_LOGICAL
+When symbolic links referencing existing nodes are
+encountered during the traversal, the @code{cfg_info}
+field of the returned CFGENT structure describes the
+target node pointed to by the link instead of the
+link itself, unless the target node does not exist.
+If the target node has children, the pre-order return,
+followed by the return of structures referencing all of
+its descendants, followed by a post-order return, is done.
+
+@item CFG_PHYSICAL
+When symbolic links are encountered during the traversal,
+the @code{cfg_info} field is used to describe the symbolic
+link.
+
+@end table
+
+
+Any combination of the remaining flags can be specified in the value of
+@code{options}
+
+@table @b
+
+@item CFG_COMFOLLOW
+When symbolic links referencing existing nodes are
+specified in the @code{pathnames} argument, the
+@code{cfg_info} field of the returned CFGENT structure
+describes the target node pointed to by the link
+instead of the link itself, unless the target node does
+not exist. If the target node has children, the
+pre-order return, followed by the return of structures
+referencing all its descendants, followed by a post-order
+return, is done.
+
+@item CFG_XDEV
+The configuration space functions do not return a
+CFGENT structure for any node in a different configuration
+space than the configuration space of the nodes identified
+by the CFGENT structures for the @code{pathnames} argument.
+
+@end table
+
+The @code{cfg_open()} argument @code{compar} is either a NULL or point
+to a function that is called with two pointers to pointers to CFGENT
+structures that returns less than, equal to , or greater than zero if
+the node referenced by the first argument is considered to be respectively
+less than, equal to, or greater than the node referenced by the second.
+The CFGENT structure fields provided to the comparison routine is as
+described with the exception that the contents of the @code{cfg_path} and
+@code{cfg_pathlen} fields are unspecified.
+
+This comparison routine is used to determine the order in which nodes in
+directories encountered during the traversal are returned, and the order
+of traversal when more than one node is specified in the @code{pathnames}
+argument to @code{cfg_open()}. If a comparison routine is specified, the
+order of traversal is from the least to the greatest. If the @code{compar}
+argument is NULL, the order of traversal shall is listed in the
+@code{pathnames} argument.
+
+@subheading NOTES:
+
+The @code{_POSIX_CFG} feature flag is defined to indicate
+this service is available.
+
+@page
+@subsection cfg_read - Read a Configuration Space
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <cfg.h>
+
+int cfg_read(
+ CFG *cfgp,
+ CFGENT **node
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{cfg_read()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EACCES
+Search permission is denied for any component of a pathname.
+
+@item EBADF
+The @code{cfgp} argument does not refer to an open configuration
+space.
+
+@item ELOOP
+A loop exists in symbolic links encountered during resolution
+of a pathname.
+
+@item ENOENT
+A named @code{node} does not exist.
+
+@item ENOMEM
+Not enough memory is available to create the necessary structures.
+
+@item ELOOP
+More than @code{SYMLOOP_MAX} symbolic links were encountered during
+resolution of the cfgpath argument.
+
+@item ENAMETOOLONG
+As a result of encountering a symbolic link in resolution of the
+pathname specified by the pathnames argument, the length of the
+substituted pathname string exceeded @code{PATH_MATH}.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{cfg_read()} function returns a pointer to a CFGENT structure
+representing a node in the configuration space to which @code{cfgp}
+refers. The returned pointer is stored at the location indicated
+by the @code{node} argument.
+
+The child nodes of each node in the configuration tree is returned
+by @code{cfg_read()}. If a comparison routine was specified to the
+@code{cfg_open()} function, the order of return of the child nodes is
+as specified by the @code{compar} routine, from least to greatest.
+Otherwise, the order of return is unspecified.
+
+Structures referencing nodes with children is returned by the
+function @code{cfg_read()} at least twice [unless the application
+specifies otherwise with @code{cfg_mark()}]-once immediately before
+the structures representing their descendants, are returned
+(pre-order), and once immediately after structures representing all
+of their descendants, if any, are returned (post-order). The
+CFGENT structure returned in post-order (with the exception of the
+@code{cfg_info} field) is identical to that returned in pre-order.
+Structures referencing nodes of other types is returned at least
+once.
+
+The fields of the CFGENT structure contains the following
+information:
+
+@table @b
+
+@item cfg_parent
+A pointer to the structure returned by the
+@code{cfg_read()} function for the node that contains
+the entry for the current node. A @code{cfg_parent}
+structure is provided for the node(s) specified by
+the @code{pathnames} argument to the @code{cfg_open()}
+function, but the contents of other than its
+@code{cfg_number}, @code{cfg_pointer}, @code{cfg_parent},
+and @code{cfg_parent}, and @code{cfg_level} fields are
+unspecified. Its @code{cfg_link} field is unspecified.
+
+@item cfg_link
+Upon return from the @code{cfg_children()} function, the
+@code{cfg_link} field points to the next CFGENT structure
+in a NULL-terminated linked list of CFGENT structures.
+Otherwise, the content of the @code{cfg_link} field is
+unspecified.
+
+@item cfg_cycle
+If the structure being returned by @code{cfg_read()}
+represents a node that appears in the @code{cfg_parent}
+linked list tree, the @code{cfg_cycle} field shall point
+to the structure representing that entry from the
+@code{cfg_parent} linked list. Otherwise the content of
+the @code{cfg_cycle} field is unspecified.
+
+@item cfg_number
+The @code{cfg_number} field is provided for use by the
+application program. It is initialized to zero for
+each new node returned by the @code{cfg_read()} function,
+but is not further modified by the configuration space
+routines.
+
+@item cfg_pointer
+The @code{cfg_pointer} field is provided for use by the
+application program. It is initialized to NULL for
+each new node returned by the @code{cfg_read()} function,
+but is not further modified by the configuration
+space routines.
+
+@item cfg_path
+A pathname for the node including and relative to the
+argument supplied to the @code{cfg_open()} routine for this
+configuration space. This pathname may be longer than
+@code{PATH_MAX} bytes. This pathname is NULL-terminated.
+
+@item cfg_name
+The nodename of the node.
+
+@item cfg_pathlen
+The length of the string pointed at by the @code{cfg_path}
+field when returned by @code{cfg_read()}.
+
+@item cfg_namelen
+The length of the string pointed at by the @code{cfg_name}
+field.
+
+@item cfg_level
+The depth of the current entry in the configuration space.
+The @code{cfg_level} field of the @code{cfg_parent}
+structure for each of the node(s) specified in the
+@code{pathnames} argument to the @code{cfg_open()} function
+is set to 0, and this number is incremented for each
+node level descendant.
+
+@item cfg_info
+This field contains one of the values listed below. If
+an object can have more than one info value, the first
+appropriate value listed below is returned.
+
+@table @b
+
+@item CFG_D
+The structure represents a node with children in
+pre-order.
+
+@item CFG_DC
+The structure represents a node that is a parent
+of the node most recently returned by @code{cfg_read()}.
+The @code{cfg_cycle} field references the structure
+previously returned by @code{cfg_read} that is the
+same as the returned structure.
+
+@item CFG_DEFAULT
+The structure represents a node that is not
+represented by one of the other node types
+
+@item CFG_DNR
+The structure represents a node, not of type symlink,
+that is unreadable. The variable @code{cfg_errno}
+is set to the appropriate value.
+
+@item CFG_DP
+The structure represents a node with children in
+post-order. This value occurs only if CFG_D
+has previously been returned for this entry.
+
+@item CFG_ERR
+The structure represents a node for which an error has
+occurred. The variable @code{cfg_errno} is set to the
+appropriate value.
+
+@item CFG_F
+The structure represents a node without children.
+
+@item CFG_SL
+The structure represents a node of type symbolic link.
+
+@item CFG_SLNONET
+The structure represents a node of type symbolic link
+with a target node for which node characteristic
+information cannot be obtained.
+
+@end table
+
+@end table
+
+Structures returned by @code{cfg_read()} with a @code{cfg_info} field equal
+to CFG_D is accessible until a subsequent call, on the same
+configuration traversal stream, to @code{cfg_close()}, or to @code{cfg_read()}
+after they have been returned by the @code{cfg_read} function in
+post-order. Structures returned by @code{cfg_read()} with an
+@code{cfg_info} field not equal to CFG_D is accessible until a subsequent
+call, on the same configuration traversal stream, to @code{cfg_close()}
+or @code{cfg_read()}.
+
+The content of the @code{cfg_path} field is specified only for the
+structure most recently returned by @code{cfg_read()}.
+
+The specified fields in structures in the list representing nodes for
+which structures have previously been returned by @code{cfg_children()},
+is identical to those returned by @code{cfg_children()}, except that
+the contents of the @code{cfg_path} and @code{cfg_pathlen} fields are
+unspecified.
+
+@subheading NOTES:
+
+The @code{_POSIX_CFG} feature flag is defined to indicate
+this service is available.
+
+@page
+@subsection cfg_children - Get Node Entries
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <cfg.h>
+
+int cfg_children(
+ CFG *cfgp,
+ int options,
+ CFGENT **children
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{cfg_children()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EACCES
+Search permission is denied for any component of a pathname
+
+@item EBADF
+The @code{cfgp} argument does not refer to an open configuration space.
+
+@item ELOOP
+A loop exists in symbolic links encountered during resolution of
+a pathname.
+
+@item ENAMETOOLONG
+The length of a pathname exceeds @code{PATH_MAX}, or a pathname
+component is longer than @code{NAME_MAX} while @code{_POSIX_NO_TRUNC} is
+in effect.
+
+@item EINVAL
+The specified value of the @code{options} argument is invalid.
+
+@item ENOENT
+The named node does not exist.
+
+@item ENOMEM
+Not enough memory is available to create the necessary structures.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The first @code{cfg_children()} call after a @code{cfg_read()} returns
+information about the first node without children under the node
+returned by @code{cfg_read()}. Subsequent calls to @code{cfg_children()}
+without the intervening @code{cfg_read()} shall return information
+about the remaining nodes without children under that same node.
+
+If @code{cfg_read()} has not yet been called for the configuration
+traversal stream represented by @code{cfgp}, @code{cfg_children()}
+returns a pointer to the first entry in a list of the nodes
+represented by the @code{pathnames} argument to @code{cfg_open()}.
+
+In either case, the list is NULL-terminated, ordered by the
+user-specified comparison function, if any, and linked through the
+@code{cfg_link} field.
+
+@subheading NOTES:
+
+The @code{_POSIX_CFG} feature flag is defined to indicate
+this service is available.
+
+@page
+@subsection cfg_mark - Set Configuration Space Options
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <cfg.h>
+
+int cfg_mark(
+ CFG *cfgp,
+ CFGENT *f,
+ int options
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{cfg_mark()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EINVAL
+The specified combination of the @code{cfgp} and @code{f} arguments is not
+supported by the implementation.
+
+@item EINVAL
+The specified value of the @code{options} argument is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{cfg_mark()} function modifies the subsequent behavior of
+the @code{cfg} functions with regard to the node referenced by the structure
+pointed to by the argument @code{f} or the configuration space referenced
+by the structure pointed to by the argument @code{cfgp}.
+
+Exactly one of the @code{f} argument and the @code{cfgp} argument is NULL.
+
+The value of the @code{options} argument is exactly one of the flags
+specified in the following list:
+
+@table @b
+
+@item CFG_AGAIN
+If the @code{cfgp} argument is non-NULL, or the @code{f}
+argument is NULL, or the structure referenced by @code{f}
+is not the one most recently returned by @code{cfg_read()},
+@code{cfg_mark()} returns an error. Otherwise, the next
+call to the @code{cfg_read()} function returns the structure
+referenced by @code{f} with the @code{cfg_info} field
+reinitialized. Subsequent behavior of the @code{cfg}
+functions are based on the reinitialized value of
+@code{cfg_info}.
+
+@item CFG_SKIP
+If the @code{cfgp} argument is non-NULL, or the @code{f}
+argument is NULL, or the structure referenced by @code{f}
+is not one of those specified as accessible, or the structure
+referenced by @code{f} is not for a node of type pre-order
+node, @code{cfg_mark()} returns an error. Otherwise, no
+more structures for the node referenced by @code{f} or its
+descendants are returned by the @code{cfg_read()} function.
+
+@item CFG_FOLLOW
+If the @code{cfgp} argument is non-NULL, or the @code{f}
+argument is NULL, or the structure referenced by @code{f}
+is not one of those specified as accessible, or the structure
+referenced by @code{f} is not for a node of type symbolic link,
+@code{cfg_mark()} returns an error. Otherwise, the next
+call to the @code{cfg_read()} function returns the structure
+referenced by @code{f} with the @code{cfg_info} field reset
+to reflect the target of the symbolic link instead of the
+symbolic link itself. If the target of the link is node with
+children, the pre-order return, followed by the return of
+structures referencing all of its descendants, followed by a
+post-order return, shall be done.
+
+@end table
+
+If the target of the symbolic link does not exist, the fields
+of the structure by @code{cfg_read()} shall be unmodified, except
+that the @code{cfg_info} field shall be reset to @code{CFG_SLNONE}.
+
+@subheading NOTES:
+
+The @code{_POSIX_CFG} feature flag is defined to indicate
+this service is available.
+
+@page
+@subsection cfg_close - Close a Configuration Space
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <cfg.h>
+
+int cfg_close(
+ CFG *cfgp
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{cfg_close()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EBADF
+The @code{cfgp} argument does not refer to an open configuration space
+traversal stream.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{cfg_close()} function closes a configuration space transversal
+stream represented by the CFG structure pointed at by the @code{cfgp}
+argument. All system resources allocated for this configuration space
+traversal stream should be deallocated. Upon return, the value of
+@code{cfgp} need not point to an accessible object of type CFG.
+
+@subheading NOTES:
+
+The @code{_POSIX_CFG} feature flag is defined to indicate
+this service is available.
+
+@page
+@subsection cfg_readdir - Reads a directory
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+#include <dirent.h>
+
+struct dirent *cfg_readdir(
+ DIR *dirp
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EBADF
+Invalid file descriptor
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{cfg_readdir()} function returns a pointer to a structure @code{dirent}
+representing the next directory entry from the directory stream pointed to
+by @code{dirp}. On end-of-file, NULL is returned.
+
+The @code{cfg_readdir()} function may (or may not) return entries for . or .. Your
+program should tolerate reading dot and dot-dot but not require them.
+
+The data pointed to be @code{cfg_readdir()} may be overwritten by another call to
+@code{readdir()} for the same directory stream. It will not be overwritten by
+a call for another directory.
+
+@subheading NOTES:
+
+If @code{ptr} is not a pointer returned by @code{malloc()}, @code{calloc()}, or
+@code{realloc()} or has been deallocated with @code{free()} or @code{realloc()},
+the results are not portable and are probably disastrous.
+
+This function is not defined in the POSIX specification. It is an extension
+provided by this implementation.
+
+@page
+@subsection cfg_umask - Sets a file creation mask.
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+#include <sys/stat.h>
+
+mode_t cfg_umask(
+ mode_t cmask
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@subheading DESCRIPTION:
+
+The @code{cfg_umask()} function sets the process node creation mask to @code{cmask}.
+The file creation mask is used during @code{open()}, @code{creat()}, @code{mkdir()},
+@code{mkfifo()} calls to turn off permission bits in the @code{mode} argument.
+Bit positions that are set in @code{cmask} are cleared in the mode of the
+created file.
+
+The file creation mask is inherited across @code{fork()} and @code{exec()} calls.
+This makes it possible to alter the default permission bits of created files.
+
+@subheading NOTES: None
+
+The @code{cmask} argument should have only permission bits set. All other
+bits should be zero.
+
+@page
+@subsection cfg_chmod - Changes file mode.
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+#include <sys/stat.h>
+
+int cfg_chmod(
+ const char *path,
+ mode_t mode
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{cfg_chmod()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EACCES
+Search permission is denied for a directory in a file's path prefix
+@item ENAMETOOLONG
+Length of a filename string exceeds PATH_MAX and _POSIX_NO_TRUNC is in
+effect.
+@item ENOENT
+A file or directory does not exist.
+@item ENOTDIR
+A component of the specified pathname was not a directory when a directory
+was expected.
+@item EPERM
+Operation is not permitted. Process does not have the appropriate priviledges
+or permissions to perform the requested operations.
+@item EROFS
+Read-only file system.
+
+@end table
+
+@subheading DESCRIPTION:
+
+Set the file permission bits, the set user ID bit, and the set group ID bit
+for the file named by @code{path} to @code{mode}. If the effective user ID
+does not match the owner of the node and the calling process does not have
+the appropriate privileges, @code{cfg_chmod()} returns -1 and sets @code{errno} to
+@code{EPERM}.
+
+@subheading NOTES:
+
+@page
+@subsection cfg_chown - Changes the owner and/or group of a file.
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+#include <unistd.h>
+
+int cfg_chown(
+ const char *path,
+ uid_t owner,
+ gid_t group
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{cfg_chown()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EACCES
+Search permission is denied for a directory in a file's path prefix
+@item EINVAL
+Invalid argument
+@item ENAMETOOLONG
+Length of a filename string exceeds PATH_MAX and _POSIX_NO_TRUNC is in
+effect.
+@item ENOENT
+A file or directory does not exist.
+@item ENOTDIR
+A component of the specified pathname was not a directory when a directory
+was expected.
+@item EPERM
+Operation is not permitted. Process does not have the appropriate priviledges
+or permissions to perform the requested operations.
+@item EROFS
+Read-only file system.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The user ID and group ID of the file named by @code{path} are set to
+@code{owner} and @code{path}, respectively.
+
+For regular files, the set group ID (S_ISGID) and set user ID (S_ISUID)
+bits are cleared.
+
+Some systems consider it a security violation to allow the owner of a file to
+be changed, If users are billed for disk space usage, loaning a file to
+another user could result in incorrect billing. The @code{cfg_chown()} function
+may be restricted to privileged users for some or all files. The group ID can
+still be changed to one of the supplementary group IDs.
+
+@subheading NOTES:
+
+This function may be restricted for some file. The @code{pathconf} function
+can be used to test the _PC_CHOWN_RESTRICTED flag.
+
+
diff --git a/doc/new_chapters/cpuuse.t b/doc/new_chapters/cpuuse.t
new file mode 100644
index 0000000000..a83ead2be9
--- /dev/null
+++ b/doc/new_chapters/cpuuse.t
@@ -0,0 +1,142 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter CPU Usage Statistics
+
+@section Introduction
+
+The CPU usage statistics manager is an RTEMS support
+component that provides a convenient way to manipulate
+the CPU usage information associated with each task
+The routines provided by the CPU usage statistics manager are:
+
+@itemize @bullet
+@item @code{CPU_usage_Dump} - Report CPU Usage Statistics
+@item @code{CPU_usage_Reset} - Reset CPU Usage Statistics
+@end itemize
+
+@section Background
+
+@section Operations
+
+@section Report CPU Usage Statistics
+
+@subsection Reporting Period Statistics
+
+The application may dynamically report the CPU usage for every
+task in the system by calling the @code{CPU_usage_Dump} routine.
+This routine prints a table with the following information per task:
+
+@itemize @bullet
+@item task id
+@item task name
+@item number of clock ticks executed
+@item percentage of time consumed by this task
+@end itemize
+
+The following is an example of the report generated:
+
+@example
+@group
+CPU Usage by thread
+ ID NAME TICKS PERCENT
+0x04010001 IDLE 0 0.000
+0x08010002 TA1 1203 0.748
+0x08010003 TA2 203 0.126
+0x08010004 TA3 202 0.126
+
+Ticks since last reset = 1600
+
+Total Units = 1608
+@end group
+@end example
+
+Notice that the "Total Units" is greater than the ticks per reset.
+This is an artifact of the way in which RTEMS keeps track of CPU
+usage. When a task is context switched into the CPU, the number
+of clock ticks it has executed is incremented. While the task
+is executing, this number is incremented on each clock tick.
+Otherwise, if a task begins and completes execution between
+successive clock ticks, there would be no way to tell that it
+executed at all.
+
+Another thing to keep in mind when looking at idle time, is that
+many systems -- especially during debug -- have a task providing
+some type of debug interface. It is usually fine to think of the
+total idle time as being the sum of the IDLE task and a debug
+task that will not be included in a production build of an application.
+
+@section Reset CPU Usage Statistics
+
+Invoking the @code{CPU_usage_Reset} routine resets the CPU usage
+statistics for all tasks in the system.
+
+@section Directives
+
+This section details the CPU usage statistics manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@page
+@subsection CPU_usage_Dump - Report CPU Usage Statistics
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+void CPU_usage_Dump( void );
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+An Ada interface is not currently available.
+@end example
+@end ifset
+
+@subheading STATUS CODES: NONE
+
+@subheading DESCRIPTION:
+
+This routine prints out a table detailing the CPU usage statistics for
+all tasks in the system.
+
+@subheading NOTES:
+
+NONE
+
+@page
+@subsection CPU_usage_Reset - Reset CPU Usage Statistics
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+void CPU_usage_Reset( void );
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+An Ada interface is not currently available.
+@end example
+@end ifset
+
+@subheading STATUS CODES: NONE
+
+@subheading DESCRIPTION:
+
+This routine re-initializes the CPU usage statistics for all tasks
+in the system to their initial state. The initial state is that
+a task has not executed and thus has consumed no CPU time.
+default state which is when zero period executions have occurred.
+
+@subheading NOTES:
+
+NONE
diff --git a/doc/new_chapters/dumpcontrol.t b/doc/new_chapters/dumpcontrol.t
new file mode 100644
index 0000000000..12241808d5
--- /dev/null
+++ b/doc/new_chapters/dumpcontrol.t
@@ -0,0 +1,98 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Process Dump Control Manager
+
+@section Introduction
+
+The process dump control manager provides a portable
+interface for changing the path to which a process dump
+is written. The capabilities in this manager were defined in
+the POSIX 1003.1h/D3 proposed standard titled @b{Services for Reliable,
+Available, and Serviceable Systems}.
+
+The directives provided by the process dump control manager are:
+
+@itemize @bullet
+@item @code{dump_setpath} - Dump File Control
+@end itemize
+
+@section Background
+
+There is currently no text in this section.
+
+@section Operations
+
+There is currently no text in this section.
+
+@section Directives
+
+This section details the process dump control manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@page
+@subsection dump_setpath - Dump File Control
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <dump.h>
+
+int dump_setpath(
+ const char *path
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EACESS
+Search permission is denied for a component of the path prefix,
+or write permission is denied on the directory containing the
+file.
+
+@item ENAMETOOLONG
+The length of the argument exceeds @code{PATH_MAX} or a pathname
+component is longer than @code{NAME_MAX} while @code{_POSIX_NO_TRUNC}
+is in effect.
+
+@item ENOENT
+The path argument points to an empty string.
+
+@item ENOTDIR
+A component of the path prefix is not a directory.
+
+@item EROFS
+The directory entry specified resides on a read-only file system.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{dump_setpath()} function defines the pathname where process
+dumps are written. The pathname pointed to by @code{path} defines
+where a process dump file is written if the calling process
+terminates with a dump file. The @code{path} argument does not
+name a directory.
+
+If the @code{path} argument is NULL, the system does not write a
+process dump file if the calling process terminates with a dump
+file. If the @code{dump_setpath} function fails, the pathname for
+writing process dumps does not change.
+
+@subheading NOTES:
+
+The @code{_POSIX_DUMP} feature flag is defined to indicate
+this service is available.
diff --git a/doc/new_chapters/error.t b/doc/new_chapters/error.t
new file mode 100644
index 0000000000..331272bd6c
--- /dev/null
+++ b/doc/new_chapters/error.t
@@ -0,0 +1,164 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Error Reporting Support
+
+@section Introduction
+
+These error reporting facilities are an RTEMS support
+component that provide convenient facilities for handling
+error conditions in an RTEMS application.
+of each task using a period. The services provided by the error
+reporting support component are:
+
+@itemize @bullet
+@item @code{rtems_error} - Report an Error
+@item @code{rtems_panic} - Report an Error and Panic
+@item @code{rtems_status_text} - ASCII Version of RTEMS Status
+@end itemize
+
+@section Background
+
+@subsection Error Handling in an Embedded System
+
+Error handling in an embedded system is a difficult problem. If the error
+is severe, then the only recourse is to shut the system down in a safe
+manner. Other errors can be detected and compensated for. The
+error reporting routines in this support component -- @code{rtems_error}
+and @code{rtems_panic} assume that if the error is severe enough,
+then the system should be shutdown. If a simple shutdown with
+some basic diagnostic information is not sufficient, then
+these routines should not be used in that particular system. In this case,
+use the @code{rtems_status_text} routine to construct an application
+specific error reporting routine.
+
+@section Operations
+
+@subsection Reporting an Error
+
+The @code{rtems_error} and @code{rtems_panic} routines
+can be used to print some diagnostic information and
+shut the system down. The @code{rtems_error} routine
+is invoked with a user specified error level indicator.
+This error indicator is used to determine if the system
+should be shutdown after reporting this error.
+
+@section Routines
+
+This section details the error reporting support compenent's routine.
+A subsection is dedicated to each of this manager's routines
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@page
+@subsection rtems_status_text - ASCII Version of RTEMS Status
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+const char *rtems_status_text(
+ rtems_status_code status
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+An Ada interface is not currently available.
+@end example
+@end ifset
+
+@subheading STATUS CODES:
+
+Returns a pointer to a constant string that describes the given
+RTEMS status code.
+
+@subheading DESCRIPTION:
+
+This routine returns a pointer to a string that describes
+the RTEMS status code specified by @code{status}.
+
+@subheading NOTES:
+
+NONE
+
+@page
+@subsection rtems_error - Report an Error
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int rtems_error(
+ int error_code,
+ const char *printf_format,
+ ...
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+An Ada interface is not currently available.
+@end example
+@end ifset
+
+@subheading STATUS CODES:
+
+Returns the number of characters written.
+
+@subheading DESCRIPTION:
+
+This routine prints the requested information as specified by the
+@code{printf_format} parameter and the zero or more optional arguments
+following that parameter. The @code{error_code} parameter is an error
+number with either @code{RTEMS_ERROR_PANIC} or @code{RTEMS_ERROR_ABORT}
+bitwise or'ed with it. If the @code{RTEMS_ERROR_PANIC} bit is set, then
+then the system is system is shutdown via a call to @code{_exit}.
+If the @code{RTEMS_ERROR_ABORT} bit is set, then
+then the system is system is shutdown via a call to @code{abort}.
+
+@subheading NOTES:
+
+NONE
+
+@page
+@subsection rtems_panic - Report an Error and Panic
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int rtems_panic(
+ const char *printf_format,
+ ...
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+An Ada interface is not currently available.
+@end example
+@end ifset
+
+@subheading STATUS CODES:
+
+Returns the number of characters written.
+
+@subheading DESCRIPTION:
+
+This routine is a wrapper for the @code{rtems_error} routine with
+an implied error level of @code{RTEMS_ERROR_PANIC}. See
+@code{rtems_error} for more information.
+
+@subheading NOTES:
+
+NONE
+
diff --git a/doc/new_chapters/eventlog.t b/doc/new_chapters/eventlog.t
new file mode 100644
index 0000000000..f502d81ed2
--- /dev/null
+++ b/doc/new_chapters/eventlog.t
@@ -0,0 +1,1265 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Event Logging Manager
+
+@section Introduction
+
+The event logging manager provides a portable method for logging
+system and application events and subsequent processing of those
+events. The capabilities in this manager were defined in the POSIX
+1003.1h/D3 proposed standard titled @b{Services for Reliable,
+Available, and Serviceable Systems}.
+
+The directives provided by the event logging manager are:
+
+@itemize @bullet
+@item @code{log_create} - Create a log file
+@item @code{log_sys_create} - Create a system log file
+@item @code{log_write} - Write to the system Log
+@item @code{log_write_any} - Write to any log file
+@item @code{log_write_entry} - Write entry to any log file
+@item @code{log_open} - Open a log file
+@item @code{log_read} - Read from a log file
+@item @code{log_notify} - Notify Process of writes to the system log
+@item @code{log_close} - Close log descriptor
+@item @code{log_seek} - Reposition log file offset
+@item @code{log_severity_before} - Compare event record severities
+@item @code{log_facilityemptyset} - Manipulate log facility sets
+@item @code{log_facilityfillset} - Manipulate log facility sets
+@item @code{log_facilityaddset} - Manipulate log facility sets
+@item @code{log_facilitydelset} - Manipulate log facility sets
+@item @code{log_facilityismember} - Manipulate log facility sets
+@item @code{log_facilityisvalid} - Manipulate log facility sets
+@end itemize
+
+@section Background
+
+@subsection Log Files and Events
+
+The operating system uses a special log file named @code{syslog}.
+This log file is called the system log and is automatically created and
+tracked by the operating system. The system log is written with
+the @code{log_write()} function. An alternative log file may be written
+using the @code{log_write_any()} function. It is possible to use @code{log_read()}
+to query the system log and and write the records to a non-system log file
+using @code{log_write_entry()} to produce a filtered version of the
+system log. For example you could produce a log of all disk controller
+faults that have occurred.
+
+A non-system log may be a special log file created by an application to
+describe application faults, or a subset of the system log created
+by the application.
+
+
+
+@subsection Facilities
+
+A facility is an identification code for a subsystem, device, or
+other object about which information is being written to
+a log file.
+
+A facility set is a collection of facilities.
+
+@subsection Severity
+
+Severity is a rating of the error that is being logged.
+
+@subsection Queries
+
+
+The facility identifier and the event severity are the basis for
+subsequent log query. A log query is used as a filter to
+obtain a subset of a given log file. The log file may be configured
+to send out an event.
+
+@section Operations
+
+@subsection Creating and Writing a non-System Log
+
+The following code fragment create a non-System log file at /temp/.
+A real filename previously read entry and buffer @code{log_buf} of size
+@code{readsize} are written into the log. See the discussion on opening
+and reading a log for how the entry is created.
+
+@example
+#include <evlog.h>
+ :
+ logd_t *outlog = NULL;
+ char *path = "/temp/";
+
+ log_create( outlog, path );
+ :
+ log_write_entry( outlog, &entry, log_buf, readsize );
+
+@end example
+
+@subsection Reading a Log
+
+Discuss opening and reading from a log.
+
+@example
+ build a query
+ log_open
+ log_read loop
+@end example
+
+@section Directives
+
+This section details the event logging manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@page
+@subsection log_write - Write to the system Log
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_write(
+ const log_facility_t facility,
+ const int event_id,
+ const log_severity_t severity,
+ const void *buf,
+ const size_t len
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_write()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item E2BIG
+This error indicates an inconsistency in the implementation.
+Report this as a bug.
+
+@item EINVAL
+The @code{facility} argument is not a valid log facility.
+
+@item EINVAL
+The @code{severity} argument exceeds @code{LOG_SEVERITY_MAX}.
+
+@item EINVAL
+The @code{len} argument exceeds @code{LOG_MAXIUM_BUFFER_SIZE}.
+
+@item EINVAL
+The @code{len} argument was non-zero and @code{buf} is @code{NULL}.
+
+@item ENOSPC
+The device which contains the log file has run out of space.
+
+@item EIO
+An I/O error occurred in writing to the log file.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_write} function writes an event record to the
+system log file. The event record written consists of the
+event attributes specified by the @code{facility}, @code{event_id},
+and @code{severity} arguments as well as the data identified by the
+@code{buf} and @code{len} arguments. The fields of the event record
+structure to be written are filled in as follows:
+
+@table @b
+@item log_recid
+This is set to a monotonically increasing log record id
+maintained by the system for this individual log file.
+
+@item log_size
+This is set to the value of the @code{len} argument.
+
+@item log_event_id
+This is set to the value of the @code{event_id} argument.
+
+@item log_facility
+This is set to the value of the @code{facility} argument.
+
+@item log_severity
+This is set to the value of the @code{severity} argument.
+
+@item log_uid
+This is set to the value returned by @code{geteuid()}.
+
+@item log_gid
+This is set to the value returned by @code{getegid()}.
+
+@item log_pid
+This is set to the value returned by @code{getpid()}.
+
+@item log_pgrp
+This is set to the value returned by @code{getpgrp()}.
+
+@item log_time
+This is set to the value returned by @code{clock_gettime()} for the
+@code{CLOCK_REALTIME clock} source.
+
+@end table
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+This implementation can not return the @code{EPERM} error.
+
+@page
+@subsection log_write_any - Write to the any log file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_write_any(
+ const logd_t logdes,
+ const log_facility_t facility,
+ const int event_id,
+ const log_severity_t severity,
+ const void *buf,
+ const size_t len
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_write_any()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item E2BIG
+This error indicates an inconsistency in the implementation.
+Report this as a bug.
+
+@item EBADF
+The @code{logdes} argument is not a valid log descriptor.
+
+@item EINVAL
+The @code{facility} argument is not a valid log facility.
+
+@item EINVAL
+The @code{severity} argument exceeds @code{LOG_SEVERITY_MAX}.
+
+@item EINVAL
+The @code{len} argument exceeds @code{LOG_MAXIMUM_BUFFER_SIZE}.
+
+@item EINVAL
+The @code{len} argument was non-zero and @code{buf} is @code{NULL}.
+
+@item ENOSPC
+The device which contains the log file has run out of space.
+
+@item EIO
+An I/O error occurred in writing to the log file.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_write_any()} function writes an event record to the log file
+specified by @code{logdes}. The event record written consists of the
+event attributes specified by the @code{facility}, @code{event_id},
+and @code{severity} arguments as well as the data identified by the
+@code{buf} and @code{len} arguments. The fields of the event record
+structure to be written are filled in as follows:
+
+@table @b
+@item log_recid
+This is set to a monotonically increasing log record id
+maintained by the system for this individual log file.
+
+@item log_size
+This is set to the value of the @code{len} argument.
+
+@item log_event_id
+This is set to the value of the @code{event_id} argument.
+
+@item log_facility
+This is set to the value of the @code{facility} argument.
+
+@item log_severity
+This is set to the value of the @code{severity} argument.
+
+@item log_uid
+This is set to the value returned by @code{geteuid()}.
+
+@item log_gid
+This is set to the value returned by @code{getegid()}.
+
+@item log_pid
+This is set to the value returned by @code{getpid()}.
+
+@item log_pgrp
+This is set to the value returned by @code{getpgrp()}.
+
+@item log_time
+This is set to the value returned by @code{clock_gettime()} for the
+@code{CLOCK_REALTIME} clock source.
+
+@end table
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+This implementation can not return the @code{EPERM} error.
+
+This function is not defined in the POSIX specification. It is
+an extension provided by this implementation.
+
+@page
+@subsection log_write_entry - Write entry to any log file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_write_entry(
+ const logd_t logdes,
+ struct log_entry *entry,
+ const void *buf,
+ const size_t len
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_write_entry()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item E2BIG
+This error indicates an inconsistency in the implementation.
+Report this as a bug.
+
+@item EBADF
+The @code{logdes} argument is not a valid log descriptor.
+
+@item EFAULT
+The @code{entry} argument is not a valid pointer to a log entry.
+
+@item EINVAL
+The @code{facility} field in @code{entry} is not a valid log facility.
+
+@item EINVAL
+The @code{severity} field in @code{entry} exceeds @code{LOG_SEVERITY_MAX}.
+
+@item EINVAL
+The @code{len} argument exceeds @code{LOG_MAXIMUM_BUFFER_SIZE}.
+
+@item EINVAL
+The @code{len} argument was non-zero and @code{buf} is NULL.
+
+@item ENOSPC
+The device which contains the log file has run out of space.
+
+@item EIO
+An I/O error occurred in writing to the log file.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_write_entry()} function writes an event record
+specified by the @code{entry}, @code{buf}, and @code{len} arguments.
+Most of the fields of the event record pointed to by @code{entry}
+are left intact. The following fields are filled in as follows:
+
+@table @b
+@item log_recid
+This is set to a monotonically increasing log record id
+maintained by the system for this individual log file.
+
+@item log_size
+This is set to the value of the @code{len} argument.
+
+@end table
+
+This allows existing log entries from one log file to be written to
+another log file without destroying the logged information.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+This implementation can not return the @code{EPERM} error.
+
+This function is not defined in the POSIX specification. It is
+an extension provided by this implementation.
+
+@page
+@subsection log_open - Open a log file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_open(
+ logd_t *logdes,
+ const char *path,
+ const log_query_t *query
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_open()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EACCES
+Search permission is denied on a component of the @code{path} prefix,
+or the log file exists and read permission is denied.
+
+@item EINTR
+A signal interrupted the call to @code{log_open()}.
+
+@item EINVAL
+The log_severity field of the query argument exceeds
+@code{LOG_SEVERITY_MAX}.
+
+@item EINVAL
+The @code{path} argument referred to a file that was not a log file.
+
+@item EMFILE
+Too many log file descriptors are currently in use by this
+process.
+
+@item ENAMETOOLONG
+The length of the path string exceeds @code{PATH_MAX}, or a pathname
+component is longer than @code{NAME_MAX} while @code{_POSIX_NO_TRUNC} is
+in effect.
+
+@item ENFILE
+Too many files are currently open in the system.
+
+@item ENOENT
+The file specified by the @code{path} argument does not exist.
+
+@item ENOTDIR
+A component of the @code{path} prefix is not a directory.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_open()} function establishes the connection between a
+log file and a log file descriptor. It creates an open log file
+descriptor that refers to this query stream on the specified log file
+The log file descriptor is used by the other log functions to refer
+to that log query stream. The @code{path} argument points to a
+pathname for a log file. A @code{path} argument of @code{NULL} specifies
+the current system log file.
+
+The @code{query} argument is not @code{NULL}, then it points to a log query
+specification that is used to filter the records in the log file on
+subsequent @code{log_read()} operations. This restricts the set of
+event records read using the returned log file descriptor to those
+which match the query. A query match occurs for a given record when
+that record's facility is a member of the query's facility set and
+the record's severity is greater than or equal to the severity specified
+in the query.
+
+If the value of the @code{query} argument is @code{NULL}, no query filter
+shall be applied.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+POSIX specifies that @code{EINVAL} will be returned if the
+@code{log_facilities} field of the @code{query} argument is not
+a valid facility set. In this implementation, this condition
+can never occur.
+
+Many error codes that POSIX specifies to be returned by @code{log_open()}
+should actually be detected by @code{open()} and passed back by the
+@code{log_open()} implementation. In this implementation, @code{EACCESS},
+@code{EMFILE}, @code{ENAMETOOLONG}, @code{ENFILE}, @code{ENOENT},
+and @code{ENOTDIR} are detected in this manner.
+
+@page
+@subsection log_read - Read from a log file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_read(
+ const logd_t logdes,
+ struct log_entry *entry,
+ void *log_buf,
+ const size_t log_len,
+ const size_t *log_sizeread
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_read()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item E2BIG
+This error indicates an inconsistency in the implementation.
+Report this as a bug.
+
+@item EBADF
+The @code{logdes} argument is not a valid log file descriptor.
+
+@item EFAULT
+The @code{entry} argument is not a valid pointer to a log entry structure.
+
+@item EFAULT
+The @code{log_sizeread} argument is not a valid pointer to a size_t.
+
+@item EBUSY
+No data available. There are no unread event records remaining
+in this log file.
+
+@item EINTR
+A signal interrupted the call to @code{log_read()}.
+
+@item EIO
+An I/O error occurred in reading from the event log.
+
+@item EINVAL
+The matching event record has data associated with it and
+@code{log_buf} was not a valid pointer.
+
+@item EINVAL
+The matching event record has data associated with it which is
+longer than @code{log_len}.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_read()} function reads the @code{log_entry}
+structure and up to @code{log_len} bytes of data from the next
+event record of the log file associated with the open log file
+descriptor @code{logdes}. The event record read is placed
+into the @code{log_entry} structure pointed to by
+@code{entry} and any data into the buffer pointed to by @code{log_buf}.
+The log record ID of the returned event record is be stored in the
+@code{log_recid} member of the @code{log_entry} structure for the event
+record.
+
+If the query attribute of the open log file description associated with
+the @code{logdes} is set, the event record read will match that query.
+
+If the @code{log_read()} is successful the call stores the actual length
+of the data associated with the event record into the location specified by
+@code{log_sizeread}. This number will be less than or equal to
+@code{log_len}.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+When @code{EINVAL} is returned, then no data is returned although the
+event record is returned. This is an extension to the POSIX specification.
+
+The POSIX specification specifically allows @code{log_read()} to write
+greater than @code{log_len} bytes into @code{log_buf}. This is highly
+undesirable and this implementation will NOT do this.
+
+@page
+@subsection log_notify - Notify Process of writes to the system log.
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_notify(
+ const logd_t logdes,
+ const struct sigevent *notification
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_notify()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EBADF
+The logdes argument is not a valid log file descriptor.
+
+@item EINVAL
+The notification argument specifies an invalid signal.
+
+@item EINVAL
+The process has requested a notify on a log that will not be
+written to.
+
+@item ENOSYS
+The function @code{log_notify()} is not supported by this implementation.
+
+@end table
+
+@subheading DESCRIPTION:
+
+If the argument @code{notification} is not @code{NULL} this function registers
+the calling process to be notified of event records received by the system
+log, which match the query parameters associated with the open log descriptor
+specified by @code{logdes}. The notification specified by the
+@code{notification} argument shall be sent to the process when an event
+record received by the system log is matched by the query attribute of the
+open log file description associated with the @code{logdes} log file
+descriptor. If the calling process has already registered a notification
+for the @code{logdes} log file descriptor, the new notification shall
+replace the existing notification registration.
+
+If the @code{notification} argument is @code{NULL} and the calling process is
+currently registered to be notified for the @code{logdes} log file
+descriptor, the existing registration shall be removed.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+@page
+@subsection log_close - Close log descriptor
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_close(
+ const logd_t logdes
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_close()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EBADF
+The logdes argument is not a valid log file descriptor.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_close()} function deallocates the open log file descriptor
+indicated by @code{log_des}.
+
+When all log file descriptors associated with an open log file description
+have been closed, the open log file description is freed.
+
+If the link count of the log file is zero, when all log file descriptors
+have been closed, the space occupied by the log file is freed and the
+log file shall no longer be accessible.
+
+If the process has successfully registered a notification request for the
+log file descriptor, the registration is removed.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+@page
+@subsection log_seek - Reposition log file offset
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_seek(
+ const logd_t logdes,
+ log_recid_t log_recid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_seek()} returns a value of zero
+and an unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EBADF
+The @code{logdes} argument is not a valid log file descriptor.
+@item EINVAL
+The @code{log_recid} argument is not a valid record id.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_seek()} function sets the log file offset of the open
+log description associated with the @code{logdes} log file descriptor
+to the event record in the log file identified by @code{log_recid}.
+The @code{log_recid} argument is either the record id of a valid event
+record or one of the following values, as defined in the header file
+@code{<evlog.h>:}
+
+@table @b
+@item LOG_SEEK_START
+Set log file position to point at the first event
+record in the log file.
+
+@item LOG_SEEK_END
+Set log file position to point after the last event
+record in the log file.
+
+@end table
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+This implementation can not return EINTR.
+
+This implementation can not return EINVAL to indicate that
+the @code{log_recid} argument is not a valid record id.
+
+@page
+@subsection log_severity_before - Compare event record severities
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_severity_before(
+ log_severity_t s1,
+ log_severity_t s2
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item 0
+The severity of @code{s1} is less than that of @code{s2}.
+
+@item 1
+The severity of @code{s1} is greater than or equal that of @code{s2}.
+
+@item EINVAL
+The value of either s1 or s2 exceeds @code{LOG_SEVERITY_MAX}.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_severity_before()} function compares the severity order
+of the @code{s1} and @code{s2} arguments. If @code{s1} is of
+severity greater than or equal to that of @code{s2}, then this
+function returns 1. Otherwise, it returns 0.
+
+If either @code{s1} or @code{s2} specify invalid severity values, the
+return value of @code{log_severity_before()} is unspecified.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+The POSIX specification of the return value for this function is ambiguous.
+If EINVAL is equal to 1 in an implementation, then the application
+can not distinguish between greater than and an error condition.
+
+@page
+@subsection log_facilityemptyset - Manipulate log facility sets
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_facilityemptyset(
+ log_facility_set_t *set
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_facilityemptyset()} returns a value of zero
+and a unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EFAULT
+The @code{set} argument is an invalid pointer.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_facilityemptyset()} function initializes the facility
+set pointed to by the argument @code{set}, such that all facilities
+are excluded.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+Applications shall call either @code{log_facilityemptyset()} or
+@code{log_facilityfillset()} at least once for each object of type
+@code{log_facilityset_t} prior to any other use of that object. If
+such an object is not initialized in this way, but is nonetheless
+supplied as an argument to any of the @code{log_facilityaddset()},
+@code{logfacilitydelset()}, @code{log_facilityismember()} or
+@code{log_open()} functions, the results are undefined.
+
+@page
+@subsection log_facilityfillset - Manipulate log facility sets
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_facilityfillset(
+ log_facility_set_t *set
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_facilityfillset()} returns a value of zero
+and a unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EFAULT
+The @code{set} argument is an invalid pointer.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_facilityfillset()} function initializes the facility
+set pointed to by the argument @code{set}, such that all facilities
+are included.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+Applications shall call either @code{log_facilityemptyset()} or
+@code{log_facilityfillset()} at least once for each object of type
+@code{log_facilityset_t} prior to any other use of that object. If
+such an object is not initialized in this way, but is nonetheless
+supplied as an argument to any of the @code{log_facilityaddset()},
+@code{logfacilitydelset()}, @code{log_facilityismember()} or
+@code{log_open()} functions, the results are undefined.
+
+@page
+@subsection log_facilityaddset - Manipulate log facility sets
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_facilityaddset(
+ log_facility_set_t *set,
+ log_facility_t facilityno
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_facilityaddset()} returns a value of zero
+and a unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EFAULT
+The @code{set} argument is an invalid pointer.
+
+@item EINVAL
+The @code{facilityno} argument is not a valid facility.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_facilityaddset()} function adds the individual
+facility specified by the value of the argument @code{facilityno}
+to the facility set pointed to by the argument @code{set}.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+Applications shall call either @code{log_facilityemptyset()} or
+@code{log_facilityfillset()} at least once for each object of type
+@code{log_facilityset_t} prior to any other use of that object. If
+such an object is not initialized in this way, but is nonetheless
+supplied as an argument to any of the @code{log_facilityaddset()},
+@code{logfacilitydelset()}, @code{log_facilityismember()} or
+@code{log_open()} functions, the results are undefined.
+
+@page
+@subsection log_facilitydelset - Manipulate log facility sets
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_facilitydelset(
+ log_facility_set_t *set,
+ log_facility_t facilityno
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_facilitydelset()} returns a value of zero
+and a unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EFAULT
+The @code{set} argument is an invalid pointer.
+
+@item EINVAL
+The @code{facilityno} argument is not a valid facility.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_facilitydelset()} function deletes the individual
+facility specified by the value of the argument @code{facilityno}
+from the facility set pointed to by the argument @code{set}.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+Applications shall call either @code{log_facilityemptyset()} or
+@code{log_facilityfillset()} at least once for each object of type
+@code{log_facilityset_t} prior to any other use of that object. If
+such an object is not initialized in this way, but is nonetheless
+supplied as an argument to any of the @code{log_facilityaddset()},
+@code{logfacilitydelset()}, @code{log_facilityismember()} or
+@code{log_open()} functions, the results are undefined.
+
+@page
+@subsection log_facilityismember - Manipulate log facility sets
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_facilityismember(
+ const log_facility_set_t *set,
+ log_facility_t facilityno,
+ const int *member
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_facilityismember()} returns a value
+of zero and a unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EFAULT
+The @code{set} or @code{member} argument is an invalid pointer.
+
+@item EINVAL
+The @code{facilityno} argument is not a valid facility.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_facilityismember()} function tests whether the facility
+specified by the value of the argument @code{facilityno} is a member
+of the set pointed to by the argument @code{set}. Upon successful
+completion, the @code{log_facilityismember()} function either returns
+a value of one to the location specified by @code{member} if the
+specified facility is a member of the specified set or value of
+zero to the location specified by @code{member} if the specified
+facility is not a member of the specified set.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+Applications shall call either @code{log_facilityemptyset()} or
+@code{log_facilityfillset()} at least once for each object of type
+@code{log_facilityset_t} prior to any other use of that object. If
+such an object is not initialized in this way, but is nonetheless
+supplied as an argument to any of the @code{log_facilityaddset()},
+@code{logfacilitydelset()}, @code{log_facilityismember()} or
+@code{log_open()} functions, the results are undefined.
+
+@page
+@subsection log_facilityisvalid - Manipulate log facility sets
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_facilityisvalid(
+ log_facility_t facilityno
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A return value of zero indicates that the @code{facilityno} is valid and
+a return value other than zero represents an @code{errno}.
+
+@table @b
+@item EFAULT
+The @code{set} or @code{member} argument is an invalid pointer.
+
+@item EINVAL
+The @code{facilityno} argument is not a valid facility.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{log_facilityisvalid()} function tests whether the facility
+specified by the value of the argument @code{facilityno} is a valid
+facility number. Upon successful completion, the
+the @code{log_facilityisvalid()} function either returns a value of
+0 if the specified facility is a valid facility or value of EINVAL
+if the specified facility is not a valid facility.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+Applications shall call either @code{log_facilityemptyset()} or
+@code{log_facilityfillset()} at least once for each object of type
+@code{log_facilityset_t} prior to any other use of that object. If
+such an object is not initialized in this way, but is nonetheless
+supplied as an argument to any of the @code{log_facilityaddset()},
+@code{logfacilitydelset()}, @code{log_facilityismember()} or
+@code{log_open()} functions, the results are undefined.
+
+@page
+@subsection log_create - Creates a log file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_create(
+ logd_t *ld,
+ const char *path,
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_create()} returns a value
+of zero and a unsuccessful call returns the @code{errno}.
+
+@table @b
+
+@item EEXIST
+The @code{path} already exists and O_CREAT and O_EXCL were used.
+
+@item EISDIR
+The @code{path} refers to a directory and the access requested involved
+writing.
+
+@item ETXTBSY
+The @code{path} refers to an executable image which is currently being
+executed and write access was requested.
+
+@item EFAULT
+The @code{path} points outside your accessible address space.
+
+@item EACCES
+The requested access to the file is not allowed, or one of the
+directories in @code{path} did not allow search (execute) permission.
+
+@item ENAMETOOLONG
+The @code{path} was too long.
+
+@item ENOENT
+A directory component in @code{path} does not exist or is a dangling symbolic
+link.
+
+@item ENOTDIR
+A component used as a directory in @code{path} is not, in fact, a directory.
+
+@item EMFILE
+The process already has the maximum number of files open.
+
+@item ENFILE
+The limit on the total number of files open on the system has been reached.
+
+@item ENOMEM
+Insufficient kernel memory was available.
+
+@item EROFS
+The @code{path} refers to a file on a read-only filesystem and write access
+was requested.
+
+@item ELOOP
+The @code{path} contains a reference to a circular symbolic link, ie a
+symbolic link whose expansion contains a reference to itself.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This function attempts to create a file associated with the @code{logdes}
+argument in the directory provided by the argument @code{path}.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
+
+@page
+@subsection log_sys_create - Creates a system log file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <evlog.h>
+
+int log_sys_create();
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{log_sys_create()} returns a value
+of zero and a unsuccessful call returns the @code{errno}.
+
+@table @b
+@item EEXIST
+The directory path to the system log already exist.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This function will create a predefined system log directory path and
+system log file if they do not already exist.
+
+@subheading NOTES:
+
+The @code{_POSIX_LOGGING} feature flag is defined to indicate
+this service is available.
diff --git a/doc/new_chapters/gen_section b/doc/new_chapters/gen_section
new file mode 100644
index 0000000000..d1b472ec3f
--- /dev/null
+++ b/doc/new_chapters/gen_section
@@ -0,0 +1,238 @@
+#
+# This shell script generates the starting template for a manager chapter.
+#
+
+
+# Set this based on which chapter you want to generate a template for.
+chapter=$1
+
+case ${chapter} in
+ process)
+ CHAPTER_CAPS="Process Creation and Execution"
+ CHAPTER_LOWER="process creation and execution"
+ ROUTINES="fork execl execv execle execve execlp execvp pthread_atfork \
+ wait waitpid _exit"
+ ;;
+ procenv)
+ CHAPTER_CAPS="Process Environment"
+ CHAPTER_LOWER="process environment"
+ ROUTINES="getpid getppid getuid geteuid getgid getegid setuid setgid \
+ getgroups getlogin getlogin_r getpgrp setsid setpgid uname times \
+ getenv ctermid ttyname ttyname_r isatty sysconf "
+ ;;
+ files)
+ CHAPTER_CAPS="Files and Directories"
+ CHAPTER_LOWER="files and directories"
+ ROUTINES="opendir readdir readdir_r rewinddir closedir \
+ chdir getcwd open creat umask link mkdir mkfifo unlink \
+ rmdir rename stat fstat access chmod fchmod chown \
+ utime ftrunctate pathconf fpathconf"
+ ;;
+ io)
+ CHAPTER_CAPS="Input and Output Primitives"
+ CHAPTER_LOWER="input and output primitives"
+ ROUTINES="pipe dup dup2 close read write fcntl lseek fsynch fdatasynch \
+ aio_read aio_write lio_listio aio_error aio_return aio_cancel \
+ aio_suspend aio_fsync"
+ ;;
+ device)
+ CHAPTER_CAPS="Device- and Class- Specific Functions"
+ CHAPTER_LOWER="device- and class- specific functions"
+ ROUTINES="cfgetispeed cfgetospeed cfsetispeed cfsetospeed tcgetattr \
+ tcsetattr tcsendbreak tcdrain tcflush tcflow tcgetpgrp tcsetpgrp"
+ ;;
+ cspecific)
+ CHAPTER_CAPS="Language-Specific Services for the C Programming Language"
+ CHAPTER_LOWER="language-specific services for the C programming language"
+ ROUTINES="setlocale fileno fdopen flcokfile ftrylockfile funlockfile \
+ getc_unlocked getchar_unlocked putc_unlocked putchar_unlocked \
+ setjmp longjmp sigsetjmp siglongjmp tzset strtok_r asctime_r \
+ ctime_r gmtime_r localtime_r rand_r"
+ ;;
+ systemdb)
+ CHAPTER_CAPS="System Databases"
+ CHAPTER_LOWER="system databases"
+ ROUTINES="getgrgid getgrgid_r getgrnam getgrnam_r getpwuid getpwuid_r \
+ getpwnam getpwnam_r"
+ ;;
+ semaphores)
+ CHAPTER_CAPS="Semaphores"
+ CHAPTER_LOWER="semaphore"
+ ROUTINES="sem_init sem_destroy sem_open sem_close sem_unlink sem_wait \
+ sem_trywait sem_post sem_getvalue"
+ ;;
+ memorymgmt)
+ CHAPTER_CAPS="Memory Management"
+ CHAPTER_LOWER="memory management"
+ ROUTINES="mlockall munlockall mlock munlock mmap munmap mprotect \
+ msync shm_open shm_unlink"
+ ;;
+ message)
+ CHAPTER_CAPS="Message Passing"
+ CHAPTER_LOWER="message passing"
+ ROUTINES="mq_open mq_close mq_unlink mq_send mq_receive mq_notify \
+ mq_setattr mq_getattr"
+ ;;
+ cancel)
+ CHAPTER_CAPS="Thread Cancellation"
+ CHAPTER_LOWER="thread cancellation"
+ ROUTINES="pthread_cancel pthread_setcancelstate pthread_setcanceltype \
+ pthread_testcancel pthread_cleanup_push"
+ ;;
+ eventlog)
+ CHAPTER_CAPS="Event Logging"
+ CHAPTER_LOWER="event logging"
+ ROUTINES="log_write log_open log_read log_notify log_close log_seek \
+ log_severity_before log_facilityemptyset log_facilityfillset \
+ log_facilityaddset log_facilitydelset log_facilityismember"
+ ;;
+ dumpcontrol)
+ CHAPTER_CAPS="Process Dump Control"
+ CHAPTER_LOWER="process dump control"
+ ROUTINES="dump_setpath"
+ ;;
+ confspace)
+ CHAPTER_CAPS="Configuration Space"
+ CHAPTER_LOWER="configuration space"
+ ROUTINES="cfg_mount cfg_unmount cfg_mknod cfg_get cfg_set cfg_link \
+ cfg_unlink cfg_open cfg_read cfg_children cfg_mark cfg_close"
+ ;;
+ adminiface)
+ CHAPTER_CAPS="Administration Interface"
+ CHAPTER_LOWER="administration interface"
+ ROUTINES="admin_shutdown"
+ ;;
+ # XXX this is not all of the C Library Stuff
+ libc_ctype)
+ CHAPTER_CAPS="C Library Character Handling"
+ CHAPTER_LOWER="character handling"
+ ROUTINES="isalnum isalpha iscntrl isdigit isgraph islower isprint \
+ ispunct isspace isupper isxdigit tolower toupper"
+ ;;
+ libc_math)
+ CHAPTER_CAPS="C Math Library"
+ CHAPTER_LOWER="math library"
+ ROUTINES="acos asis atan atan2 cos sin tan cosh sinh tanh exp frexp ldexp
+ log log10 modf pow sqrt ceil fabs floor fmod"
+ ;;
+ libc_io)
+ CHAPTER_CAPS="C Library IO"
+ CHAPTER_LOWER="C Library IO"
+ ROUTINES="clearerr fclose feof ferror fflush fgetc fgets fopen fputc \
+ fputs fread freopen fseek ftell fwrite getc getchar gets perror \
+ printf fprintf sprintf putc putchar puts remove rename rewind \
+ scanf fscanf sscanf setbuf tempfile tmpnam ungetc"
+ ;;
+ libc_string)
+ CHAPTER_CAPS="C Library String Handling"
+ CHAPTER_LOWER="string handling"
+ ROUTINES="strcpy strncpy strcat strncat strcmp strncmp strchr strcspn \
+ strpbrk strrchr strspn strstr strtok stlen"
+ ;;
+ misc_stackchk)
+ CHAPTER_CAPS="Stack Bounds Checker"
+ CHAPTER_LOWER="stack bounds checker"
+ ROUTINES="Stack_check_Initialize Stack_check_Dump_usage"
+ ;;
+ misc_rtmonuse)
+ CHAPTER_CAPS="Rate Monotonic Period Statistics"
+ CHAPTER_LOWER="rate monotonic period statistics"
+ ROUTINES="Period_usage_Initialize Period_usage_Reset \
+ Period_usage_Update Period_usage_Dump"
+ ;;
+ misc_cpuuse)
+ CHAPTER_CAPS="CPU Usage Statistics"
+ CHAPTER_LOWER="CPU usage statistics"
+ ROUTINES="CPU_usage_Dump CPU_usage_Reset"
+ ;;
+ misc_error)
+ CHAPTER_CAPS="Error Reporting Support"
+ CHAPTER_LOWER="error reporting support"
+ ROUTINES="rtems_error rtems_panic"
+ ;;
+ misc_monitor)
+ CHAPTER_CAPS="Monitor Task"
+ CHAPTER_LOWER="monitor task"
+ ROUTINES="rtems_monitor_init rtems_monitor_wakeup"
+ ;;
+ *)
+ echo "Unknown chapter name"
+ exit 1
+ ;;
+esac
+
+if [ "x${CHAPTER_CAPS}" = "x" -o "x${CHAPTER_LOWER}" = "x" \
+ -o "x${ROUTINES}" = "x" ] ; then
+ echo "initialization problem"
+ exit 1
+fi
+
+echo "@c"
+echo "@c COPYRIGHT (c) 1988-2002."
+echo "@c On-Line Applications Research Corporation (OAR)."
+echo "@c All rights reserved. "
+echo "@c"
+echo "@c \$Id\$"
+echo "@c"
+echo ""
+echo "@chapter ${CHAPTER_CAPS}" Manager
+echo ""
+echo "@section Introduction"
+echo ""
+echo "The "
+echo "${CHAPTER_LOWER} manager is ..."
+echo ""
+echo "The directives provided by the ${CHAPTER_LOWER} manager are:"
+echo ""
+echo "@itemize @bullet"
+
+for routine in ${ROUTINES}
+do
+ echo "@item @code{${routine}} - "
+done
+echo "@end itemize"
+
+echo ""
+echo "@section Background"
+echo ""
+echo "@section Operations"
+echo ""
+echo "@section Directives"
+echo ""
+echo "This section details the ${CHAPTER_LOWER} manager's directives."
+echo "A subsection is dedicated to each of this manager's directives"
+echo "and describes the calling sequence, related constants, usage,"
+echo "and status codes."
+echo ""
+
+for routine in ${ROUTINES}
+do
+ echo "@page"
+ echo "@subsection ${routine} - "
+ echo ""
+ echo "@subheading CALLING SEQUENCE:"
+ echo ""
+ echo "@ifset is-C"
+ echo "@example"
+ echo "int ${routine}("
+ echo ");"
+ echo "@end example"
+ echo "@end ifset"
+ echo ""
+ echo "@ifset is-Ada"
+ echo "@end ifset"
+ echo ""
+ echo "@subheading STATUS CODES:"
+ echo ""
+ echo "@table @b"
+ echo "@item E"
+ echo "The"
+ echo ""
+ echo "@end table"
+ echo ""
+ echo "@subheading DESCRIPTION:"
+ echo ""
+ echo "@subheading NOTES:"
+ echo ""
+done
+
diff --git a/doc/new_chapters/monitor.t b/doc/new_chapters/monitor.t
new file mode 100644
index 0000000000..2cfbf7e2b4
--- /dev/null
+++ b/doc/new_chapters/monitor.t
@@ -0,0 +1,224 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Monitor Task
+
+@section Introduction
+
+The monitor task is a simple interactive shell that allows the user to
+make inquries about he state of various system objects. The routines
+provided by the monitor task manager are:
+
+@itemize @bullet
+@item @code{rtems_monitor_init} - Initialize the Monitor Task
+@item @code{rtems_monitor_wakeup} - Wakeup the Monitor Task
+@end itemize
+
+@section Background
+
+There is no background information.
+
+@section Operations
+
+@subsection Initializing the Monitor
+
+The monitor is initialized by calling @code{rtems_monitor_init}. When
+initialized, the monitor is created as an independent task. An example
+of initializing the monitor is shown below:
+
+@example
+@group
+#include <rtems/monitor.h>
+ ...
+rtems_monitor_init(0);
+@end group
+@end example
+
+The "0" parameter to the @code{rtems_monitor_init} routine
+causes the monitor to immediately enter command mode.
+This parameter is a bitfield. If the monitor is to suspend
+itself on startup, then the @code{RTEMS_MONITOR_SUSPEND} bit
+should be set.
+
+@section Routines
+
+This section details the monitor task manager's routines.
+A subsection is dedicated to each of this manager's routines
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@page
+@subsection rtems_monitor_init - Initialize the Monitor Task
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+void rtems_monitor_init(
+ unsigned32 monitor_flags
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+An Ada interface is not currently available.
+@end example
+@end ifset
+
+@subheading STATUS CODES: NONE
+
+@subheading DESCRIPTION:
+
+This routine initializes the RTEMS monitor task. The
+@code{monitor_flags} parameter indicates how the server
+task is to start. This parameter is a bitfield and
+has the following constants associated with it:
+
+@itemize @bullet
+@item @b{RTEMS_MONITOR_SUSPEND} - suspend monitor on startup
+@item @b{RTEMS_MONITOR_GLOBAL} - monitor should be global
+@end itemize
+
+If the @code{RTEMS_MONITOR_SUSPEND} bit is set, then the
+monitor task will suspend itself after it is initialized.
+A subsequent call to @code{rtems_monitor_wakeup} will be required
+to activate it.
+
+@subheading NOTES:
+
+The monitor task is created with priority 1. If there are
+application tasks at priority 1, then there may be times
+when the monitor task is not executing.
+
+@page
+@subsection rtems_monitor_wakeup - Wakeup the Monitor Task
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+void rtems_monitor_wakeup( void );
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+An Ada interface is not currently available.
+@end example
+@end ifset
+
+@subheading STATUS CODES: NONE
+
+@subheading DESCRIPTION:
+
+This routine is used to activate the monitor task if it is suspended.
+
+@subheading NOTES:
+
+NONE
+
+@page
+@section Monitor Interactive Commands
+
+The following commands are supported by the monitor task:
+
+@itemize @bullet
+@item @code{help} - Obtain Help
+@item @code{pause} - Pause Monitor for a Specified Number of Ticks
+@item @code{exit} - Invoke a Fatal RTEMS Error
+@item @code{symbol} - Show Entries from Symbol Table
+@item @code{continue} - Put Monitor to Sleep Waiting for Explicit Wakeup
+@item @code{config} - Show System Configuration
+@item @code{itask} - List Init Tasks
+@item @code{mpci} - List MPCI Config
+@item @code{task} - Show Task Information
+@item @code{queue} - Show Message Queue Information
+@item @code{extension} - User Extensions
+@item @code{driver} - Show Information About Named Drivers
+@item @code{dname} - Show Information About Named Drivers
+@item @code{object} - Generic Object Information
+@item @code{node} - Specify Default Node for Commands That Take IDs
+@end itemize
+
+
+@subsection help - Obtain Help
+
+The @code{help} command prints out the list of commands. If invoked
+with a command name as the first argument, detailed help information
+on that command is printed.
+
+@subsection pause - Pause Monitor for a Specified Number of Ticks
+
+The @code{pause} command cause the monitor task to suspend itself
+for the specified number of ticks. If this command is invoked with
+no arguments, then the task is suspended for 1 clock tick.
+
+@subsection exit - Invoke a Fatal RTEMS Error
+
+The @code{exit} command invokes @code{rtems_error_occurred} directive
+with the specified error code. If this command is invoked with
+no arguments, then the @code{rtems_error_occurred} directive is
+invoked with an arbitrary error code.
+
+@subsection symbol - Show Entries from Symbol Table
+
+The @code{symbol} command lists the specified entries in the symbol table.
+If this command is invoked with no arguments, then all the
+symbols in the symbol table are printed.
+
+@subsection continue - Put Monitor to Sleep Waiting for Explicit Wakeup
+
+The @code{continue} command suspends the monitor task with no timeout.
+
+@subsection config - Show System Configuration
+
+The @code{config} command prints the system configuration.
+
+@subsection itask - List Init Tasks
+
+The @code{itask} command lists the tasks in the initialization tasks table.
+
+@subsection mpci - List MPCI Config
+
+The @code{mpci} command shows the MPCI configuration information
+
+@subsection task - Show Task Information
+
+The @code{task} command prints out information about one or more tasks in
+the system. If invoked with no arguments, then
+information on all the tasks in the system is printed.
+
+@subsection queue - Show Message Queue Information
+
+The @code{queue} command prints out information about one or more
+message queues in the system. If invoked with no arguments, then
+information on all the message queues in the system is printed.
+
+@subsection extension - User Extensions
+
+The @code{extension} command prints out information about the user
+extensions.
+
+@subsection driver - Show Information About Named Drivers
+
+The @code{driver} command prints information about the device driver table.
+
+@subsection dname - Show Information About Named Drivers
+
+The @code{dname} command prints information about the named device drivers.
+
+@subsection object - Generic Object Information
+
+The @code{object} command prints information about RTEMS objects.
+
+@subsection node - Specify Default Node for Commands That Take IDs
+
+The @code{node} command sets the default node for commands that look
+at object ID ranges.
+
diff --git a/doc/new_chapters/new_chapters.texi b/doc/new_chapters/new_chapters.texi
new file mode 100644
index 0000000000..b6b0dd7ef0
--- /dev/null
+++ b/doc/new_chapters/new_chapters.texi
@@ -0,0 +1,131 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename new_chapters.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the C User's Guide
+@c
+
+@c Joel's Questions
+@c
+@c 1. Why does paragraphindent only impact makeinfo?
+@c 2. Why does paragraphindent show up in HTML?
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS On-Line Manual
+@direntry
+* RTEMS New Chapters: (new_chapters). Miscellaneous New Chapters
+@end direntry
+@end ifset
+
+@c variable substitution info:
+@c
+@c Note: At the moment we do not document the Ada interface but by building
+@c in the infrastructure Florist support should be simple to add.
+@set is-C
+@clear is-Ada
+@set LANGUAGE C
+@set STRUCTURE structure
+@set ROUTINE function
+@set OR |
+@set RPREFIX RTEMS_
+@set DIRPREFIX rtems_
+@c the language is @value{LANGUAGE}
+@c NOTE: don't use underscore in the name
+@c
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage New Chapters
+
+@setchapternewpage odd
+@settitle New Chapters
+@titlepage
+@finalout
+
+@title New Chapters
+@subtitle Edition @value{EDITION}, for RTEMS @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include eventlog.texi
+@include dumpcontrol.texi
+@include confspace.texi
+@include adminiface.texi
+@include stackchk.texi
+@include rtmonuse.texi
+@include cpuuse.texi
+@include error.texi
+@include monitor.texi
+@ifinfo
+@node Top, , (dir), (dir)
+@top posix_users_new
+
+This is the online version of the RTEMS POSIX API User's Guide
+
+@menu
+* Event Logging Manager::
+* Process Dump Control Manager::
+* Configuration Space Manager::
+* Administration Interface Manager::
+* Stack Bounds Checker::
+* Rate Monotonic Period Statistics::
+* CPU Usage Statistics::
+* Error Reporting Support::
+* Monitor Task::
+* Command and Variable Index::
+* Concept Index::
+@end menu
+
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@node Command and Variable Index, Concept Index, , Top
+@unnumbered Command and Variable Index
+
+There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@node Concept Index, , Command and Variable Index, Top
+@unnumbered Concept Index
+
+There are currently no Concept Index entries.
+@c @printindex cp
+
+@contents
+@bye
+
diff --git a/doc/new_chapters/rtmonuse.t b/doc/new_chapters/rtmonuse.t
new file mode 100644
index 0000000000..05aef493d5
--- /dev/null
+++ b/doc/new_chapters/rtmonuse.t
@@ -0,0 +1,294 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Rate Monotonic Period Statistics
+
+@section Introduction
+
+The rate monotonic period statistics manager is an RTEMS support
+component that maintains statistics on the execution characteristics
+of each task using a period. The routines provided by the rate
+monotonic period statistics manager are:
+
+@itemize @bullet
+@item @code{Period_usage_Initialize} - Initialize the Period Statistics
+@item @code{Period_usage_Reset} - Reset the Period Statistics
+@item @code{Period_usage_Update} - Update the Statistics for this Period
+@item @code{Period_usage_Dump} - Report Period Statistics Usage
+@end itemize
+
+@section Background
+
+@section Period Statistics
+
+This manager maintains a set of statistics on each period. The following
+is a list of the information kept:
+
+@itemize @bullet
+@item @code{id}
+is the id of the period.
+
+@item @code{count}
+is the total number of periods executed.
+
+@item @code{missed_count}
+is the number of periods that were missed.
+
+@item @code{min_cpu_time}
+is the minimum amount of CPU execution time consumed
+on any execution of the periodic loop.
+
+@item @code{max_cpu_time}
+is the maximum amount of CPU execution time consumed
+on any execution of the periodic loop.
+
+@item @code{total_cpu_time}
+is the total amount of CPU execution time consumed
+by executions of the periodic loop.
+
+@item @code{min_wall_time}
+is the minimum amount of wall time that passed
+on any execution of the periodic loop.
+
+@item @code{max_wall_time}
+is the maximum amount of wall time that passed
+on any execution of the periodic loop.
+
+@item @code{total_wall_time}
+is the total amount of wall time that passed
+during executions of the periodic loop.
+
+@end itemize
+
+The above information is inexpensive to maintain and can provide very
+useful insights into the execution characteristics of a periodic
+task loop.
+
+@subsection Analysis of the Reported Information
+
+The period statistics reported must be analyzed by the user in terms
+of what the applications is. For example, in an application where
+priorities are assigned by the Rate Monotonic Algorithm, it would
+be very undesirable for high priority (i.e. frequency) tasks to
+miss their period. Similarly, in nearly any application, if a
+task were supposed to execute its periodic loop every 10 milliseconds
+and it averaged 11 milliseconds, then application requirements
+are not being met.
+
+The information reported can be used to determine the "hot spots"
+in the application. Given a period's id, the user can determine
+the length of that period. From that information and the CPU usage,
+the user can calculate the percentage of CPU time consumed by that
+periodic task. For example, a task executing for 20 milliseconds
+every 200 milliseconds is consuming 10 percent of the processor's
+execution time. This is usually enough to make it a good candidate
+for optimization.
+
+However, execution time alone is not enough to gauge the value of
+optimizing a particular task. It is more important to optimize
+a task executing 2 millisecond every 10 milliseconds (20 percent
+of the CPU) than one executing 10 milliseconds every 100 (10 percent
+of the CPU). As a general rule of thumb, the higher frequency at
+which a task executes, the more important it is to optimize that
+task.
+
+@section Operations
+
+@subsection Initializing the Period Statistics
+
+The period statistics manager must be explicitly initialized before
+any calls to this manager. This is done by calling the
+@code{Period_usage_Initialize} service.
+
+@subsection Updating Period Statistics
+
+It is the responsibility of each period task loop to update the statistics
+on each execution of its loop. The following is an example of a
+simple periodic task that uses the period statistics manager:
+
+@example
+@group
+rtems_task Periodic_task()
+@{
+ rtems_name name;
+ rtems_id period;
+ rtems_status_code status;
+
+ name = rtems_build_name( 'P', 'E', 'R', 'D' );
+
+ (void) rate_monotonic_create( name, &period );
+
+ while ( 1 ) @{
+ if ( rate_monotonic_period( period, 100 ) == TIMEOUT )
+ break;
+
+ /* Perform some periodic actions */
+
+ /* Report statistics */
+ Period_usage_Update( period_id );
+ @}
+
+ /* missed period so delete period and SELF */
+
+ (void) rate_monotonic_delete( period );
+ (void) task_delete( SELF );
+@}
+@end group
+@end example
+
+@subsection Reporting Period Statistics
+
+The application may dynamically report the period usage for every
+period in the system by calling the @code{Period_usage_Dump} routine.
+This routine prints a table with the following information per period:
+
+@itemize @bullet
+@item period id
+@item id of the task that owns the period
+@item number of periods executed
+@item number of periods missed
+@item minimum/maximum/average cpu use per period
+@item minimum/maximum/average wall time per period
+@end itemize
+
+The following is an example of the report generated:
+
+@example
+@group
+Period information by period
+ ID OWNER PERIODS MISSED CPU TIME WALL TIME
+0x28010001 TA1 502 0 0/1/ 1.00 0/0/0.00
+0x28010002 TA2 502 0 0/1/ 1.00 0/0/0.00
+0x28010003 TA3 502 0 0/1/ 1.00 0/0/0.00
+0x28010004 TA4 502 0 0/1/ 1.00 0/0/0.00
+0x28010005 TA5 10 0 0/1/ 0.90 0/0/0.00
+@end group
+@end example
+
+@section Routines
+
+This section details the rate monotonic period statistics manager's routines.
+A subsection is dedicated to each of this manager's routines
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@page
+@subsection Period_usage_Initialize - Initialize the Period Statistics
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+void Period_usage_Initialize( void );
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+An Ada interface is not currently available.
+@end example
+@end ifset
+
+@subheading STATUS CODES: NONE
+
+@subheading DESCRIPTION:
+
+This routine allocates the table used to contain the period statistics.
+This table is then initialized by calling the @code{Period_usage_Reset}
+service.
+
+@subheading NOTES:
+
+This routine invokes the @code{malloc} routine to dynamically allocate
+memory.
+
+@page
+@subsection Period_usage_Reset - Reset the Period Statistics
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+void Period_usage_Reset( void );
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+An Ada interface is not currently available.
+@end example
+@end ifset
+
+@subheading STATUS CODES: NONE
+
+@subheading DESCRIPTION:
+
+This routine re-initializes the period statistics table to its
+default state which is when zero period executions have occurred.
+
+@subheading NOTES:
+
+NONE
+
+@page
+@subsection Period_usage_Update - Update the Statistics for this Period
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+void Period_usage_Update(
+ rtems_id id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+An Ada interface is not currently available.
+@end example
+@end ifset
+
+@subheading STATUS CODES: NONE
+
+@subheading DESCRIPTION:
+
+The @code{Period_usage_Update} routine must be invoked at the "bottom"
+of each periodic loop iteration to update the statistics.
+
+@subheading NOTES:
+
+NONE
+
+@page
+@subsection Period_usage_Dump - Report Period Statistics Usage
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+void Period_usage_Dump( void );
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+An Ada interface is not currently available.
+@end example
+@end ifset
+
+@subheading STATUS CODES: NONE
+
+@subheading DESCRIPTION:
+
+This routine prints out a table detailing the period statistics for
+all periods in the system.
+
+@subheading NOTES:
+
+NONE
diff --git a/doc/new_chapters/stackchk.t b/doc/new_chapters/stackchk.t
new file mode 100644
index 0000000000..1994ea5d49
--- /dev/null
+++ b/doc/new_chapters/stackchk.t
@@ -0,0 +1,192 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Stack Bounds Checker
+
+@section Introduction
+
+The stack bounds checker is an RTEMS support component that determines
+if a task has overflowed its run-time stack. The routines provided
+by the stack bounds checker manager are:
+
+@itemize @bullet
+@item @code{Stack_check_Initialize} - Initialize the Stack Bounds Checker
+@item @code{Stack_check_Dump_usage} - Report Task Stack Usage
+@end itemize
+
+@section Background
+
+@subsection Task Stack
+
+Each task in a system has a fixed size stack associated with it. This
+stack is allocated when the task is created. As the task executes, the
+stack is used to contain parameters, return addresses, saved registers,
+and local variables. The amount of stack space required by a task
+is dependent on the exact set of routines used. The peak stack usage
+reflects the worst case of subroutine pushing information on the stack.
+For example, if a subroutine allocates a local buffer of 1024 bytes, then
+this data must be accounted for in the stack of every task that invokes that
+routine.
+
+Recursive routines make calculating peak stack usage difficult, if not
+impossible. Each call to the recursive routine consumes @i{n} bytes
+of stack space. If the routine recursives 1000 times, then @code{1000 * @i{n}}
+bytes of stack space are required.
+
+@subsection Execution
+
+The stack bounds checker operates as a set of task extensions. At
+task creation time, the task's stack is filled with a pattern to
+indicate the stack is unused. As the task executes, it will overwrite
+this pattern in memory. At each task switch, the stack bounds checker's
+task switch extension is executed. This extension checks that the last
+@code{n} bytes of the task's stack have not been overwritten. If they
+have, then a blown stack error is reported.
+
+The number of bytes checked for an overwrite is processor family dependent.
+The minimum stack frame per subroutine call varies widely between processor
+families. On CISC families like the Motorola MC68xxx and Intel ix86, all
+that is needed is a return address. On more complex RISC processors,
+the minimum stack frame per subroutine call may include space to save
+a significant number of registers.
+
+Another processor dependent feature that must be taken into account by
+the stack bounds checker is the direction that the stack grows. On some
+processor families, the stack grows up or to higher addresses as the
+task executes. On other families, it grows down to lower addresses. The
+stack bounds checker implementation uses the stack description definitions
+provided by every RTEMS port to get for this information.
+
+@section Operations
+
+@subsection Initializing the Stack Bounds Checker
+
+The stack checker is initialized automatically when its task
+create extension runs for the first time. When this occurs,
+the @code{Stack_check_Initialize} is invoked.
+
+The application must include the stack bounds checker extension set
+in its set of Initial Extensions. This set of extensions is
+defined as @code{STACK_CHECKER_EXTENSION}. If using @code{<confdefs.h>}
+for Configuration Table generation, then all that is necessary is
+to define the macro @code{STACK_CHECKER_ON} before including
+@code{<confdefs.h>} as shown below:
+
+@example
+@group
+#define STACK_CHECKER_ON
+ ...
+#include <confdefs.h>
+@end group
+@end example
+
+@subsection Reporting Task Stack Usage
+
+The application may dynamically report the stack usage for every task
+in the system by calling the @code{Stack_check_Dump_usage} routine.
+This routine prints a table with the peak usage and stack size of
+every task in the system. The following is an example of the
+report generated:
+
+@example
+@group
+ ID NAME LOW HIGH AVAILABLE USED
+0x04010001 IDLE 0x003e8a60 0x003e9667 2952 200
+0x08010002 TA1 0x003e5750 0x003e7b57 9096 1168
+0x08010003 TA2 0x003e31c8 0x003e55cf 9096 1168
+0x08010004 TA3 0x003e0c40 0x003e3047 9096 1104
+0xffffffff INTR 0x003ecfc0 0x003effbf 12160 128
+@end group
+@end example
+
+Notice the last time. The task id is 0xffffffff and its name is "INTR".
+This is not actually a task, it is the interrupt stack.
+
+@subsection When a Task Overflows the Stack
+
+When the stack bounds checker determines that a stack overflow has occurred,
+it will attempt to print a message identifying the task and then shut the
+system down. If the stack overflow has caused corruption, then it is
+possible that the message can not be printed.
+
+The following is an example of the output generated:
+
+@example
+@group
+BLOWN STACK!!! Offending task(0x3eb360): id=0x08010002; name=0x54413120
+ stack covers range 0x003e5750 - 0x003e7b57 (9224 bytes)
+ Damaged pattern begins at 0x003e5758 and is 128 bytes long
+@end group
+@end example
+
+The above includes the task id and a pointer to the task control block as
+well as enough information so one can look at the task's stack and
+see what was happening.
+
+@section Routines
+
+This section details the stack bounds checker's routines.
+A subsection is dedicated to each of routines
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@page
+@subsection Stack_check_Initialize - Initialize the Stack Bounds Checker
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+void Stack_check_Initialize( void );
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+An Ada interface is not currently available.
+@end example
+@end ifset
+
+@subheading STATUS CODES: NONE
+
+@subheading DESCRIPTION:
+
+Initialize the stack bounds checker.
+
+@subheading NOTES:
+
+This is performed automatically the first time the stack bounds checker
+task create extension executes.
+
+@page
+@subsection Stack_check_Dump_usage - Report Task Stack Usage
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+void Stack_check_Dump_usage( void );
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+An Ada interface is not currently available.
+@end example
+@end ifset
+
+@subheading STATUS CODES: NONE
+
+@subheading DESCRIPTION:
+
+This routine prints a table with the peak stack usage and stack space
+allocation of every task in the system.
+
+@subheading NOTES:
+
+NONE
diff --git a/doc/porting/.cvsignore b/doc/porting/.cvsignore
new file mode 100644
index 0000000000..6e9b5d839e
--- /dev/null
+++ b/doc/porting/.cvsignore
@@ -0,0 +1,34 @@
+codetuning.texi
+cpuinit.texi
+cpumodels.texi
+developtools.texi
+idlethread.texi
+index.html
+interrupts.texi
+Makefile
+Makefile.in
+mdate-sh
+miscellaneous.texi
+porting
+porting-?
+porting-??
+porting.aux
+porting.cp
+porting.dvi
+porting.fn
+porting*.html
+porting.ky
+porting.log
+porting.pdf
+porting.pg
+porting.ps
+porting.toc
+porting.tp
+porting.vr
+prioritybitmap.texi
+rtems_footer.html
+rtems_header.html
+sourcecode.texi
+stamp-vti
+taskcontext.texi
+version.texi
diff --git a/doc/porting/Makefile.am b/doc/porting/Makefile.am
new file mode 100644
index 0000000000..fa58dc5f89
--- /dev/null
+++ b/doc/porting/Makefile.am
@@ -0,0 +1,82 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = porting
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/main.am
+
+FILES = preface.texi developtools.texi sourcecode.texi cpumodels.texi \
+ cpuinit.texi interrupts.texi taskcontext.texi idlethread.texi \
+ prioritybitmap.texi codetuning.texi miscellaneous.texi
+
+GENERATED_FILES = developtools.texi sourcecode.texi cpumodels.texi \
+ cpuinit.texi interrupts.texi taskcontext.texi idlethread.texi \
+ prioritybitmap.texi codetuning.texi miscellaneous.texi
+
+COMMON_FILES += $(top_srcdir)/common/cpright.texi
+
+info_TEXINFOS = porting.texi
+porting_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+developtools.texi: developtools.t
+ $(BMENU2) -p "Preface" \
+ -u "Top" \
+ -n "Source Code Organization" < $< > $@
+
+sourcecode.texi: sourcecode.t
+ $(BMENU2) -p "Development Tools" \
+ -u "Top" \
+ -n "CPU Model Variations" < $< > $@
+
+cpumodels.texi: cpumodels.t
+ $(BMENU2) -p "Source Code Organization Introduction" \
+ -u "Top" \
+ -n "CPU Initialization" < $< > $@
+
+cpuinit.texi: cpuinit.t
+ $(BMENU2) -p "CPU Model Variations Coding Issues" \
+ -u "Top" \
+ -n "Interrupts" < $< > $@
+
+interrupts.texi: interrupts.t
+ $(BMENU2) -p "CPU Initialization Initializing the CPU" \
+ -u "Top" \
+ -n "Task Context Management" < $< > $@
+
+taskcontext.texi: taskcontext.t
+ $(BMENU2) -p "Interrupts Pointer to _Thread_Dispatch Routine" \
+ -u "Top" \
+ -n "IDLE Thread" < $< > $@
+
+idlethread.texi: idlethread.t
+ $(BMENU2) -p "Task Context Management Restoring a Floating Point Context" \
+ -u "Top" \
+ -n "Priority Bitmap Manipulation" < $< > $@
+
+prioritybitmap.texi: prioritybitmap.t
+ $(BMENU2) -p "IDLE Thread Idle Thread Body" \
+ -u "Top" \
+ -n "Code Tuning Parameters" < $< > $@
+
+codetuning.texi: codetuning.t
+ $(BMENU2) -p "Priority Bitmap Manipulation Bit Scan Support" \
+ -u "Top" \
+ -n "Miscellaneous" < $< > $@
+
+miscellaneous.texi: miscellaneous.t
+ $(BMENU2) -p "Code Tuning Parameters Partition Element Alignment" \
+ -u "Top" \
+ -n "Command and Variable Index" < $< > $@
+
+EXTRA_DIST = codetuning.t cpuinit.t cpumodels.t developtools.t idlethread.t \
+ interrupts.t miscellaneous.t prioritybitmap.t sourcecode.t \
+ taskcontext.t
+
+CLEANFILES += porting.info porting.info-?
diff --git a/doc/porting/codetuning.t b/doc/porting/codetuning.t
new file mode 100644
index 0000000000..687a035b12
--- /dev/null
+++ b/doc/porting/codetuning.t
@@ -0,0 +1,155 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Code Tuning Parameters
+
+@section Inline Thread_Enable_dispatch
+
+Should the calls to _Thread_Enable_dispatch be inlined?
+
+If TRUE, then they are inlined.
+
+If FALSE, then a subroutine call is made.
+
+
+Basically this is an example of the classic trade-off of size versus
+speed. Inlining the call (TRUE) typically increases the size of RTEMS
+while speeding up the enabling of dispatching.
+
+[NOTE: In general, the _Thread_Dispatch_disable_level will only be 0 or 1
+unless you are in an interrupt handler and that interrupt handler invokes
+the executive.] When not inlined something calls _Thread_Enable_dispatch
+which in turns calls _Thread_Dispatch. If the enable dispatch is inlined,
+then one subroutine call is avoided entirely.]
+
+@example
+#define CPU_INLINE_ENABLE_DISPATCH FALSE
+@end example
+
+@section Inline Thread_queue_Enqueue_priority
+
+Should the body of the search loops in _Thread_queue_Enqueue_priority be
+unrolled one time? In unrolled each iteration of the loop examines two
+"nodes" on the chain being searched. Otherwise, only one node is examined
+per iteration.
+
+If TRUE, then the loops are unrolled.
+
+If FALSE, then the loops are not unrolled.
+
+The primary factor in making this decision is the cost of disabling and
+enabling interrupts (_ISR_Flash) versus the cost of rest of the body of
+the loop. On some CPUs, the flash is more expensive than one iteration of
+the loop body. In this case, it might be desirable to unroll the loop.
+It is important to note that on some CPUs, this code is the longest
+interrupt disable period in RTEMS. So it is necessary to strike a balance
+when setting this parameter.
+
+@example
+#define CPU_UNROLL_ENQUEUE_PRIORITY TRUE
+@end example
+
+
+@section Structure Alignment Optimization
+
+The following macro may be defined to the attribute setting used to force
+alignment of critical RTEMS structures. On some processors it may make
+sense to have these aligned on tighter boundaries than the minimum
+requirements of the compiler in order to have as much of the critical data
+area as possible in a cache line. This ensures that the first access of
+an element in that structure fetches most, if not all, of the data
+structure and places it in the data cache. Modern CPUs often have cache
+lines of at least 16 bytes and thus a single access implicitly fetches
+some surrounding data and places that unreferenced data in the cache.
+Taking advantage of this allows RTEMS to essentially prefetch critical
+data elements.
+
+The placement of this macro in the declaration of the variables is based
+on the syntactically requirements of the GNU C "__attribute__" extension.
+For another toolset, the placement of this macro could be incorrect. For
+example with GNU C, use the following definition of
+CPU_STRUCTURE_ALIGNMENT to force a structures to a 32 byte boundary.
+
+#define CPU_STRUCTURE_ALIGNMENT __attribute__ ((aligned (32)))
+
+To benefit from using this, the data must be heavily used so it will stay
+in the cache and used frequently enough in the executive to justify
+turning this on. NOTE: Because of this, only the Priority Bit Map table
+currently uses this feature.
+
+The following illustrates how the CPU_STRUCTURE_ALIGNMENT is defined on
+ports which require no special alignment for optimized access to data
+structures:
+
+@example
+#define CPU_STRUCTURE_ALIGNMENT
+@end example
+
+@section Data Alignment Requirements
+
+@subsection Data Element Alignment
+
+The CPU_ALIGNMENT macro should be set to the CPU's worst alignment
+requirement for data types on a byte boundary. This is typically the
+alignment requirement for a C double. This alignment does not take into
+account the requirements for the stack.
+
+The following sets the CPU_ALIGNMENT macro to 8 which indicates that there
+is a basic C data type for this port which much be aligned to an 8 byte
+boundary.
+
+@example
+#define CPU_ALIGNMENT 8
+@end example
+
+@subsection Heap Element Alignment
+
+The CPU_HEAP_ALIGNMENT macro is set to indicate the byte alignment
+requirement for data allocated by the RTEMS Code Heap Handler. This
+alignment requirement may be stricter than that for the data types
+alignment specified by CPU_ALIGNMENT. It is common for the heap to follow
+the same alignment requirement as CPU_ALIGNMENT. If the CPU_ALIGNMENT is
+strict enough for the heap, then this should be set to CPU_ALIGNMENT. This
+macro is necessary to ensure that allocated memory is properly aligned for
+use by high level language routines.
+
+The following example illustrates how the CPU_HEAP_ALIGNMENT macro is set
+when the required alignment for elements from the heap is the same as the
+basic CPU alignment requirements.
+
+@example
+#define CPU_HEAP_ALIGNMENT CPU_ALIGNMENT
+@end example
+
+NOTE: This does not have to be a power of 2. It does have to be greater
+or equal to than CPU_ALIGNMENT.
+
+@subsection Partition Element Alignment
+
+The CPU_PARTITION_ALIGNMENT macro is set to indicate the byte alignment
+requirement for memory buffers allocated by the RTEMS Partition Manager
+that is part of the Classic API. This alignment requirement may be
+stricter than that for the data types alignment specified by
+CPU_ALIGNMENT. It is common for the partition to follow the same
+alignment requirement as CPU_ALIGNMENT. If the CPU_ALIGNMENT is strict
+enough for the partition, then this should be set to CPU_ALIGNMENT. This
+macro is necessary to ensure that allocated memory is properly aligned for
+use by high level language routines.
+
+The following example illustrates how the CPU_PARTITION_ALIGNMENT macro is
+set when the required alignment for elements from the RTEMS Partition
+Manager is the same as the basic CPU alignment requirements.
+
+
+@example
+#define CPU_PARTITION_ALIGNMENT CPU_ALIGNMENT
+@end example
+
+NOTE: This does not have to be a power of 2. It does have to be greater
+or equal to than CPU_ALIGNMENT.
+
diff --git a/doc/porting/cpuinit.t b/doc/porting/cpuinit.t
new file mode 100644
index 0000000000..1fdf3e3712
--- /dev/null
+++ b/doc/porting/cpuinit.t
@@ -0,0 +1,150 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter CPU Initialization
+
+This section describes the general CPU and system initialization sequence
+as it pertains to the CPU dependent code.
+
+@section Introduction
+
+XXX general startup sequence description rewritten to make it more
+applicable to CPU depdent code in executive
+
+@section CPU Dependent Configuration Table
+
+The CPU Dependent Configuration Table contains information which tailors
+the behavior of RTEMS base Some of the fields in this table are required
+to be present in all ports of RTEMS. These fields appear at the beginning
+of the data structure. Fields past this point may be CPU family and CPU
+model dependent. For example, a port may add a field to specify the
+default value for an interrupt mask register on the CPU. This table is
+initialized by the Board Support Package and passed to the
+rtems_initialize_executive or rtems_initialize_executive_early directive.
+
+@example
+typedef struct @{
+ void (*pretasking_hook)( void );
+ void (*predriver_hook)( void );
+ void (*postdriver_hook)( void );
+ void (*idle_task)( void );
+ boolean do_zero_of_workspace;
+ unsigned32 idle_task_stack_size;
+ unsigned32 interrupt_stack_size;
+ unsigned32 extra_mpci_receive_server_stack;
+ void * (*stack_allocate_hook)( unsigned32 );
+ void (*stack_free_hook)( void* );
+ /* end of fields required on all CPUs */
+
+ unsigned32 some_other_cpu_dependent_info;
+@} rtems_cpu_table;
+@end example
+
+@table @code
+@item pretasking_hook
+is the address of the user provided routine which is invoked
+once RTEMS APIs are initialized. This routine will be invoked
+before any system tasks are created. Interrupts are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item predriver_hook
+is the address of the user provided
+routine that is invoked immediately before the
+the device drivers and MPCI are initialized. RTEMS
+initialization is complete but interrupts and tasking are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item postdriver_hook
+is the address of the user provided
+routine that is invoked immediately after the
+the device drivers and MPCI are initialized. RTEMS
+initialization is complete but interrupts and tasking are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item idle_task
+is the address of the optional user
+provided routine which is used as the system's IDLE task. If
+this field is not NULL, then the RTEMS default IDLE task is not
+used. This field may be NULL to indicate that the default IDLE
+is to be used.
+
+@item do_zero_of_workspace
+indicates whether RTEMS should
+zero the Workspace as part of its initialization. If set to
+TRUE, the Workspace is zeroed. Otherwise, it is not.
+
+@item idle_task_stack_size
+is the size of the RTEMS idle task stack in bytes.
+If this number is less than MINIMUM_STACK_SIZE, then the
+idle task's stack will be MINIMUM_STACK_SIZE in byte.
+
+@item interrupt_stack_size
+is the size of the RTEMS allocated interrupt stack in bytes.
+This value must be at least as large as MINIMUM_STACK_SIZE.
+
+@item extra_mpci_receive_server_stack
+is the extra stack space allocated for the RTEMS MPCI receive server task
+in bytes. The MPCI receive server may invoke nearly all directives and
+may require extra stack space on some targets.
+
+@item stack_allocate_hook
+is the address of the optional user provided routine which allocates
+memory for task stacks. If this hook is not NULL, then a stack_free_hook
+must be provided as well.
+
+@item stack_free_hook
+is the address of the optional user provided routine which frees
+memory for task stacks. If this hook is not NULL, then a stack_allocate_hook
+must be provided as well.
+
+@end table
+
+@section Initializing the CPU
+
+The _CPU_Initialize routine performs processor dependent initialization.
+
+@example
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch) /* may be ignored */
+)
+@end example
+
+The thread_dispatch argument is the address of the entry point for the
+routine called at the end of an ISR once it has been decided a context
+switch is necessary. On some compilation systems it is difficult to call
+a high-level language routine from assembly. Providing the address of the
+_Thread_ISR_Dispatch routine allows the porter an easy way to obtain this
+critical address and thus provides an easy way to work around this
+limitation on these systems.
+
+If you encounter this problem save the entry point in a CPU dependent
+variable as shown below:
+
+@example
+_CPU_Thread_dispatch_pointer = thread_dispatch;
+@end example
+
+
+During the initialization of the context for tasks with floating point,
+the CPU dependent code is responsible for initializing the floating point
+context. If there is not an easy way to initialize the FP context during
+Context_Initialize, then it is usually easier to save an "uninitialized"
+FP context here and copy it to the task's during Context_Initialize. If
+this technique is used to initialize the FP contexts, then it is important
+to ensure that the state of the floating point unit is in a coherent,
+initialized state.
+
+Finally, this routine is responsible for copying the application's CPU
+Table into a locally accessible and modifiable area. This is shown below:
+
+@example
+_CPU_Table = *cpu_table;
+@end example
+
+
diff --git a/doc/porting/cpumodels.t b/doc/porting/cpumodels.t
new file mode 100644
index 0000000000..8f9f2a6691
--- /dev/null
+++ b/doc/porting/cpumodels.t
@@ -0,0 +1,138 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter CPU Model Variations
+
+XXX enhance using portability presentation from CS595 class. See
+general/portability.ppt.
+
+Since the text in the next section was written, RTEMS view of
+portability has grown to distinguish totally portable, CPU
+family dependent, CPU model dependent, peripheral chip dependent
+and board dependent. This text was part of a larger paper that
+did not even cover portability completely as it existed when this
+was written and certainly is out of date now. :)
+
+
+@section Overview of RTEMS Portability
+
+RTEMS was designed to be a highly portable, reusable software component.
+This reflects the fundamental nature of embedded systems in which hardware
+components, ranging from boards to peripherals to even the processor
+itself, are selected specifically to meet the requirements of a particular
+project.
+
+@subsection Processor Families
+
+Since there are a wide variety of embedded systems, there are a wide
+variety of processors targeting embedded systems. RTEMS alleviates some of
+the burden on the embedded systems programmer by providing a consistent,
+high-performance environment regardless of the target processor. RTEMS
+has been ported to a variety of microprocessor families including:
+
+@itemize @bullet
+
+@item Motorola ColdFire
+@item Motorola MC68xxx
+@item Motorola MC683xx
+@item Intel ix86 (i386, i486, Pentium and above)
+@item Intel i960
+@item ARM
+@item MIPS
+@item PowerPC 4xx, 5xx, 6xx, 7xx, 8xx, and 84xx
+@item SPARC
+@item Hitachi H8/300
+@item Hitachi SH
+@item OpenCores OR32
+@item Texas Instruments C3x/C4x
+
+@end itemize
+
+
+In addition, there is a port of RTEMS to UNIX that uses standard UNIX
+services to simulate the embedded environment.
+
+Each RTEMS port supplies a well-defined set of services that are the
+foundation for the highly portable RTEMS and POSIX API implementations.
+When porting to a new processor family, one must provide the processor
+dependent implementation of these services. This set of processor
+dependent core services includes software to perform interrupt
+dispatching, context switches, and manipulate task register sets.
+
+The RTEMS approach to handling varying processor models reflects the
+approach taken by the designers of the processors themselves. In each
+processor family, there is a core architecture that must be implemented on
+all processor models within the family to provide any level of
+compatibility. Many of the modern RISC architectures refer to this as the
+Architectural Definition. The Architectural Definition is intended to be
+independent of any particular implementation. Additionally, there is a
+feature set which is allowed to vary in a defined way amongst the
+processor models. These feature sets may be defined as Optional in the
+Architectural Definition, be left as implementation defined
+characteristics, or be processor model specific extensions. Support for
+floating point, virtual memory, and low power mode are common Optional
+features included in an Architectural Definition.
+
+The processor family dependent software in RTEMS includes a definition of
+which features are present in each supported processor model. This often
+makes adding support for a new processor model within a supported family
+as simple as determining which features are present in the new processor
+implementation. If the new processor model varies in a way previously
+unaccounted for, then this must be addressed. This could be the result of
+a new Optional feature set being added to the Architectural Definition.
+Alternatively, this particular processor model could have a new and
+different implementation of a feature left as undefined in the
+Architectural Definition. This would require software to be written to
+utilize that feature.
+
+There is a relatively small set of features that may vary in a processor
+family. As the number of processor models in the family grow, the
+addition of each new model only requires adding an entry for the new model
+to the single feature table. It does not require searching for every
+conditional based on processor model and adding the new model in the
+appropriate place. This significantly eases the burden of adding a new
+processor model as it centralizes and logically simplifies the process.
+
+@subsection Boards
+
+Being portable both between models within a processor family and across
+processor families is not enough to address the needs of embedded systems
+developers. Custom board development is the norm for embedded systems.
+Each of these boards is optimized for a particular project. The processor
+and peripheral set have been chosen to meet a particular set of system
+requirements. The tools in the embedded systems developers’ toolbox must
+support their project’s unique board. RTEMS addresses this issue via the
+Board Support Package.
+
+RTEMS segregates board specific code to make it possible for the embedded
+systems developer to easily replace and customize this software. A
+minimal Board Support Package includes device drivers for a clock tick,
+console I/O, and a benchmark timer (optional) as well as startup and
+miscellaneous support code. The Board Support Package for a project may
+be extended to include the device drivers for any peripherals on the
+custom board.
+
+@subsection Applications
+
+One important design goal of RTEMS was to provide a bridge between the
+application software and the target hardware. Most hardware dependencies
+for real-time applications can be localized to the low level device
+drivers which provide an abstracted view of the hardware. The RTEMS I/O
+interface manager provides an efficient tool for incorporating these
+hardware dependencies into the system while simultaneously providing a
+general mechanism to the application code that accesses them. A well
+designed real-time system can benefit from this architecture by building a
+rich library of standard application components which can be used
+repeatedly in other real-time projects. The following figure illustrates
+how RTEMS serves as a buffer between the project dependent application
+code and the target hardware.
+
+@section Coding Issues
+
+XXX deal with this as it applies to score/cpu. Section name may
+be bad.
diff --git a/doc/porting/developtools.t b/doc/porting/developtools.t
new file mode 100644
index 0000000000..969398ad55
--- /dev/null
+++ b/doc/porting/developtools.t
@@ -0,0 +1,26 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Development Tools
+
+When porting RTEMS to a new CPU architecture, one will have to have a
+development environment including compiler, assembler, linker, and
+debugger. The GNU development tool suite used by RTEMS supports most
+modern CPU families. Often all that is required is to add RTEMS
+configurations for the target CPU family. RTEMS targets for the GNU tools
+usually start life as little more than aliases for existing embedded
+configurations. At this point in time, ELF is supported on most of the
+CPU families with a tool target of the form CPU-elf. If this target is
+not supported by all of the GNU tools, then it will be necessary to
+determine the configuration that makes the best starting point regardless
+of the target object format.
+
+Porting and retargetting the GNU tools is beyond the scope of this manual.
+The best advice that can be offered is to look at the existing RTEMS
+targets in the tool source and use that as a guideline.
+
diff --git a/doc/porting/idlethread.t b/doc/porting/idlethread.t
new file mode 100644
index 0000000000..e825ad6be3
--- /dev/null
+++ b/doc/porting/idlethread.t
@@ -0,0 +1,116 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter IDLE Thread
+
+@section Does Idle Thread Have a Floating Point Context?
+
+The setting of the macro CPU_IDLE_TASK_IS_FP is based on the answer to the
+question: Should the IDLE task have a floating point context? If the
+answer to this question is TRUE, then the IDLE task has a floating point
+context associated. This is equivalent to creating a task in the Classic
+API (using rtems_task_create) as a RTEMS_FLOATING_POINT task. If
+CPU_IDLE_TASK_IS_FP is set to TRUE, then a floating point context switch
+occurs when the IDLE task is switched in and out. This adds to the
+execution overhead of the system but is necessary on some ports.
+
+If FALSE, then the IDLE task does not have a floating point context.
+
+NOTE: Setting CPU_IDLE_TASK_IS_FP to TRUE negatively impacts the time
+required to preempt the IDLE task from an interrupt because the floating
+point context must be saved as part of the preemption.
+
+The following illustrates how to set this macro:
+
+@example
+#define CPU_IDLE_TASK_IS_FP FALSE
+@end example
+
+@section CPU Dependent Idle Thread Body
+
+@subsection CPU_PROVIDES_IDLE_THREAD_BODY Macro Setting
+
+The CPU_PROVIDES_IDLE_THREAD_BODY macro setting is based upon the answer
+to the question: Does this port provide a CPU dependent IDLE task
+implementation? If the answer to this question is yes, then the
+CPU_PROVIDES_IDLE_THREAD_BODY macro should be set to TRUE, and the routine
+_CPU_Thread_Idle_body must be provided. This routine overrides the
+default IDLE thread body of _Thread_Idle_body. If the
+CPU_PROVIDES_IDLE_THREAD_BODY macro is set to FALSE, then the generic
+_Thread_Idle_body is the default IDLE thread body for this port.
+Regardless of whether or not a CPU dependent IDLE thread implementation is
+provided, the BSP can still override it.
+
+This is intended to allow for supporting processors which have a low power
+or idle mode. When the IDLE thread is executed, then the CPU can be
+powered down when the processor is idle.
+
+The order of precedence for selecting the IDLE thread body is:
+
+@enumerate
+@item BSP provided
+
+@item CPU dependent (if provided)
+
+@item generic (if no BSP and no CPU dependent)
+
+@end enumerate
+
+The following illustrates setting the CPU_PROVIDES_IDLE_THREAD_BODY macro:
+
+@example
+#define CPU_PROVIDES_IDLE_THREAD_BODY TRUE
+@end example
+
+Implementation details of a CPU model specific IDLE thread body are in the
+next section.
+
+@subsection Idle Thread Body
+
+The _CPU_Thread_Idle_body routine only needs to be provided if the porter
+wishes to include a CPU dependent IDLE thread body. If the port includes
+a CPU dependent implementation of the IDLE thread body, then the
+CPU_PROVIDES_IDLE_THREAD_BODY macro should be defined to TRUE. This
+routine is prototyped as follows:
+
+@example
+void _CPU_Thread_Idle_body( void );
+@end example
+
+As mentioned above, RTEMS does not require that a CPU dependent IDLE
+thread body be provided as part of the port. If
+CPU_PROVIDES_IDLE_THREAD_BODY is defined to FALSE, then the CPU
+independent algorithm is used. This algorithm consists of a "branch to
+self" which is implemented in the XXX routine as follows.
+
+@example
+XXX check name and exact implementation
+void _Thread_Idle_body( void )
+@{
+ while( 1 ) ;
+@}
+@end example
+
+If the CPU dependent IDLE thread body is implementation centers upon using
+a "halt", "idle", or "shutdown" instruction, then don't forget to put it
+in an infinite loop as the CPU will have to reexecute this instruction
+each time the IDLE thread is dispatched.
+
+@example
+void _CPU_Thread_Idle_body( void )
+@{
+
+ for( ; ; )
+ /* insert your "halt" instruction here */ ;
+@}
+@end example
+
+Be warned. Some processors with onboard DMA have been known to stop the
+DMA if the CPU were put in IDLE mode. This might also be a problem with
+other on-chip peripherals. So use this hook with caution.
+
diff --git a/doc/porting/interrupts.t b/doc/porting/interrupts.t
new file mode 100644
index 0000000000..d3930d043d
--- /dev/null
+++ b/doc/porting/interrupts.t
@@ -0,0 +1,418 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Interrupts
+
+@section Introduction
+
+@section Interrupt Levels
+
+RTEMS is designed assuming that a CPU family has a level associated with
+interrupts. Interrupts below the current interrupt level are masked and
+do not interrupt the CPU until the interrupt level is lowered. This
+design provides for 256 distinct interrupt levels even though most CPU
+implementations support far fewer levels. Interrupt level 0 is assumed to
+map to the hardware settings for all interrupts enabled.
+
+Over the years that RTEMS has been available, there has been much
+discussion on how to handle CPU families which support very few interrupt
+levels such as the i386, PowerPC, and HP-PA RISC. XXX
+
+@subsection Interrupt Level Mask
+
+The CPU_MODES_INTERRUPT_MASK macro defines the number of bits actually used in the interrupt field of the task mode. How those bits map to the CPU interrupt levels is defined by the routine _CPU_ISR_Set_level().
+
+The following illustrates how the CPU_MODES_INTERRUPT_MASK is set on a CPU
+family like the Intel i386 where the CPU itself only recognizes two
+interrupt levels - enabled and disabled.
+
+@example
+#define CPU_MODES_INTERRUPT_MASK 0x00000001
+@end example
+
+
+@subsection Obtaining the Current Interrupt Level
+
+The _CPU_ISR_Get_level function returns the current interrupt level.
+
+@example
+unsigned32 _CPU_ISR_Get_level( void )
+@end example
+
+@subsection Set the Interrupt Level
+
+The _CPU_ISR_Set_level routine maps the interrupt level in the Classic API
+task mode onto the hardware that the CPU actually provides. Currently,
+interrupt levels that do not map onto the CPU in a generic fashion are
+undefined. Someday, it would be nice if these were "mapped" by the
+application via a callout. For example, the Motorola m68k has 8 levels 0
+- 7, and levels 8 - 255 are currently undefined. Levels 8 - 255 would be
+available for bsp/application specific meaning. This could be used to
+manage a programmable interrupt controller via the rtems_task_mode
+directive.
+
+The following is a dummy implementation of the _CPU_ISR_Set_level routine:
+
+@example
+#define _CPU_ISR_Set_level( new_level ) \
+ @{ \
+ @}
+@end example
+
+The following is the implementation from the Motorola M68K:
+
+@example
+XXX insert m68k implementation here
+@end example
+
+
+@subsection Disable Interrupts
+
+The _CPU_ISR_Disable routine disable all external interrupts. It returns
+the previous interrupt level in the single parameter _isr_cookie. This
+routine is used to disable interrupts during a critical section in the
+RTEMS executive. Great care is taken inside the executive to ensure that
+interrupts are disabled for a minimum length of time. It is important to
+note that the way the previous level is returned forces the implementation
+to be a macro that translates to either inline assembly language or a
+function call whose return value is placed into _isr_cookie.
+
+It is important for the porter to realize that the value of _isr_cookie
+has no defined meaning except that it is the most convenient format for
+the _CPU_ISR_Disable, _CPU_ISR_Enable, and _CPU_ISR_Disable routines to
+manipulate. It is typically the contents of the processor status
+register. It is NOT the same format as manipulated by the
+_CPU_ISR_Get_level and _CPU_ISR_Set_level routines. The following is a
+dummy implementation that simply sets the previous level to 0.
+
+@example
+#define _CPU_ISR_Disable( _isr_cookie ) \
+ @{ \
+ (_isr_cookie) = 0; /* do something to prevent warnings */ \
+ @}
+@end example
+
+The following is the implementation from the Motorola M68K port:
+
+@example
+XXX insert m68k port here
+@end example
+
+@subsection Enable Interrupts
+
+The _CPU_ISR_Enable routines enables interrupts to the previous level
+(returned by _CPU_ISR_Disable). This routine is invoked at the end of an
+RTEMS critical section to reenable interrupts. The parameter _level is
+not modified but indicates that level that interrupts should be enabled
+to. The following illustrates a dummy implementation of the
+_CPU_ISR_Enable routine:
+
+@example
+#define _CPU_ISR_Enable( _isr_cookie ) \
+ @{ \
+ @}
+@end example
+
+The following is the implementation from the Motorola M68K port:
+
+@example
+XXX insert m68k version here
+@end example
+
+
+@subsection Flash Interrupts
+
+The _CPU_ISR_Flash routine temporarily restores the interrupt to _level
+before immediately disabling them again. This is used to divide long
+RTEMS critical sections into two or more parts. This routine is always
+preceded by a call to _CPU_ISR_Disable and followed by a call to
+_CPU_ISR_Enable. The parameter _level is not modified.
+
+The following is a dummy implementation of the _CPU_ISR_Flash routine:
+
+@example
+#define _CPU_ISR_Flash( _isr_cookie ) \
+ @{ \
+ @}
+@end example
+
+The following is the implementation from the Motorola M68K port:
+
+@example
+XXX insert m68k version here
+@end example
+
+
+@section Interrupt Stack Management
+
+@subsection Hardware or Software Managed Interrupt Stack
+
+The setting of the CPU_HAS_SOFTWARE_INTERRUPT_STACK indicates whether the
+interrupt stack is managed by RTEMS in software or the CPU has direct
+support for an interrupt stack. If RTEMS is to manage a dedicated
+interrupt stack in software, then this macro should be set to TRUE and the
+memory for the software managed interrupt stack is allocated in
+@code{_ISR_Handler_initialization}. If this macro is set to FALSE, then
+RTEMS assumes that the hardware managed interrupt stack is supported by
+this CPU. If the CPU has a hardware managed interrupt stack, then the
+porter has the option of letting the BSP allcoate and initialize the
+interrupt stack or letting RTEMS do this. If RTEMS is to allocate the
+memory for the interrupt stack, then the macro
+CPU_ALLOCATE_INTERRUPT_STACK should be set to TRUE. If this macro is set
+to FALSE, then it is the responsibility of the BSP to allocate the memory
+for this stack and initialize it.
+
+If the CPU does not support a dedicated interrupt stack, then the porter
+has two options: (1) execute interrupts on the stack of the interrupted
+task, and (2) have RTEMS manage a dedicated interrupt stack.
+
+NOTE: If CPU_HAS_SOFTWARE_INTERRUPT_STACK is TRUE, then the macro
+CPU_ALLOCATE_INTERRUPT_STACK should also be set to TRUE.
+
+Only one of CPU_HAS_SOFTWARE_INTERRUPT_STACK and
+CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE. It is possible
+that both are FALSE for a particular CPU. Although it is unclear what
+that would imply about the interrupt processing procedure on that CPU.
+
+@subsection Allocation of Interrupt Stack Memory
+
+Whether or not the interrupt stack is hardware or software managed, RTEMS
+may allocate memory for the interrupt stack from the Executive Workspace.
+If RTEMS is going to allocate the memory for a dedicated interrupt stack
+in the Interrupt Manager, then the macro CPU_ALLOCATE_INTERRUPT_STACK
+should be set to TRUE.
+
+NOTE: This should be TRUE is CPU_HAS_SOFTWARE_INTERRUPT_STACK is TRUE.
+
+@example
+#define CPU_ALLOCATE_INTERRUPT_STACK TRUE
+@end example
+
+If the CPU_HAS_SOFTWARE_INTERRUPT_STACK macro is set to TRUE, then RTEMS automatically allocates the stack memory in the initialization of the Interrupt Manager and the switch to that stack is performed in @code{_ISR_Handler} on the outermost interrupt. The _CPU_Interrupt_stack_low and _CPU_Interrupt_stack_high variables contain the addresses of the the lowest and highest addresses of the memory allocated for the interrupt stack. Although technically only one of these addresses is required to switch to the interrupt stack, by always providing both addresses, the port has more options avaialble to it without requiring modifications to the portable parts of the executive. Whether the stack grows up or down, this give the CPU dependent code the option of picking the version it wants to use.
+
+@example
+SCORE_EXTERN void *_CPU_Interrupt_stack_low;
+SCORE_EXTERN void *_CPU_Interrupt_stack_high;
+@end example
+
+NOTE: These two variables are required if the macro
+CPU_HAS_SOFTWARE_INTERRUPT_STACK is defined as TRUE.
+
+@subsection Install the Interrupt Stack
+
+The _CPU_Install_interrupt_stack routine XXX
+
+This routine installs the hardware interrupt stack pointer.
+
+NOTE: It need only be provided if CPU_HAS_HARDWARE_INTERRUPT_STAC is TRUE.
+
+@example
+void _CPU_Install_interrupt_stack( void )
+@end example
+
+
+@section ISR Installation
+
+@subsection Install a Raw Interrupt Handler
+
+The _CPU_ISR_install_raw_handler XXX
+
+@example
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+@end example
+
+This is where we install the interrupt handler into the "raw" interrupt
+table used by the CPU to dispatch interrupt handlers.
+
+@subsection Interrupt Context
+
+@subsection Maximum Number of Vectors
+
+There are two related macros used to defines the number of entries in the
+_ISR_Vector_table managed by RTEMS. The macro
+CPU_INTERRUPT_NUMBER_OF_VECTORS is the actual number of vectors supported
+by this CPU model. The second macro is the
+CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER. Since the table is zero-based, this
+indicates the highest vector number which can be looked up in the table
+and mapped into a user provided handler.
+
+@example
+#define CPU_INTERRUPT_NUMBER_OF_VECTORS 32
+#define CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER \
+ (CPU_INTERRUPT_NUMBER_OF_VECTORS - 1)
+@end example
+
+
+@subsection Install RTEMS Interrupt Handler
+
+The _CPU_ISR_install_vector routine installs the RTEMS handler for the
+specified vector.
+
+XXX Input parameters:
+vector - interrupt vector number
+old_handler - former ISR for this vector number
+new_handler - replacement ISR for this vector number
+
+@example
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+@end example
+
+@example
+*old_handler = _ISR_Vector_table[ vector ];
+@end example
+
+If the interrupt vector table is a table of pointer to isr entry points,
+then we need to install the appropriate RTEMS interrupt handler for this
+vector number.
+
+@example
+_CPU_ISR_install_raw_handler( vector, new_handler, old_handler );
+@end example
+
+We put the actual user ISR address in _ISR_vector_table. This will be
+used by the @code{_ISR_Handler} so the user gets control.
+
+@example
+_ISR_Vector_table[ vector ] = new_handler;
+@end example
+
+@section Interrupt Processing
+
+@subsection Interrupt Frame Data Structure
+
+When an interrupt occurs, it is the responsibility of the interrupt
+dispatching software to save the context of the processor such that an ISR
+written in a high-level language (typically C) can be invoked without
+damaging the state of the task that was interrupted. In general, this
+results in the saving of registers which are NOT preserved across
+subroutine calls as well as any special interrupt state. A port should
+define the CPU_Interrupt_frame structure so that application code can
+examine the saved state.
+
+@example
+typedef struct @{
+ unsigned32 not_preserved_register_1;
+ unsigned32 special_interrupt_register;
+@} CPU_Interrupt_frame;
+@end example
+
+
+@subsection Interrupt Dispatching
+
+The @code{_ISR_Handler} routine provides the RTEMS interrupt management.
+
+@example
+void _ISR_Handler()
+@end example
+
+This discussion ignores a lot of the ugly details in a real implementation
+such as saving enough registers/state to be able to do something real.
+Keep in mind that the goal is to invoke a user's ISR handler which is
+written in C. That ISR handler uses a known set of registers thus
+allowing the ISR to preserve only those that would normally be corrupted
+by a subroutine call.
+
+Also note that the exact order is to a large extent flexible. Hardware
+will dictate a sequence for a certain subset of @code{_ISR_Handler} while
+requirements for setting the RTEMS state variables that indicate the
+interrupt nest level (@code{_ISR_Nest_level}) and dispatching disable
+level (@code{_Thread_Dispatch_disable_level}) will also
+restrict the allowable order.
+
+Upon entry to @code{_ISR_Handler}, @code{_Thread_Dispatch_disable_level} is
+zero if the interrupt occurred while outside an RTEMS service call.
+Conversely, it will be non-zero if interrupting an RTEMS service
+call. Thus, @code{_Thread_Dispatch_disable_level} will always be
+greater than or equal to @code{_ISR_Nest_level} and not strictly
+equal.
+
+Upon entry to the "common" @code{_ISR_Handler}, the vector number must be
+available. On some CPUs the hardware puts either the vector number or the
+offset into the vector table for this ISR in a known place. If the
+hardware does not provide this information, then the assembly portion of
+RTEMS for this port will contain a set of distinct interrupt entry points
+which somehow place the vector number in a known place (which is safe if
+another interrupt nests this one) and branches to @code{_ISR_Handler}.
+
+@example
+save some or all context on stack
+may need to save some special interrupt information for exit
+
+#if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
+ if ( _ISR_Nest_level == 0 )
+ switch to software interrupt stack
+#endif
+_ISR_Nest_level++;
+_Thread_Dispatch_disable_level++;
+(*_ISR_Vector_table[ vector ])( vector );
+--_ISR_Nest_level;
+if ( _ISR_Nest_level )
+ goto the label "exit interrupt (simple case)"
+#if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
+ restore stack
+#endif
+
+if ( _Thread_Dispatch_disable_level )
+ _ISR_Signals_to_thread_executing = FALSE;
+ goto the label "exit interrupt (simple case)"
+
+if ( _Context_Switch_necessary || _ISR_Signals_to_thread_executing )
+ _ISR_Signals_to_thread_executing = FALSE;
+ call _Thread_Dispatch() or prepare to return to _ISR_Dispatch
+ prepare to get out of interrupt
+ return from interrupt (maybe to _ISR_Dispatch)
+
+LABEL "exit interrupt (simple case):
+ prepare to get out of interrupt
+ return from interrupt
+@end example
+
+Some ports have the special routine @code{_ISR_Dispatch} because
+the CPU has a special "interrupt mode" and RTEMS must switch back
+to the task stack and/or non-interrupt mode before invoking
+@code{_Thread_Dispatch}. For example, consider the MC68020 where
+upon return from the outermost interrupt, the CPU must switch
+from the interrupt stack to the master stack before invoking
+@code{_Thread_Dispatch}. @code{_ISR_Dispatch} is the special port
+specific wrapper for @code{_Thread_Dispatch} used in this case.
+
+@subsection ISR Invoked with Frame Pointer
+
+Does the RTEMS invoke the user's ISR with the vector number and a pointer
+to the saved interrupt frame (1) or just the vector number (0)?
+
+@example
+#define CPU_ISR_PASSES_FRAME_POINTER 0
+@end example
+
+NOTE: It is desirable to include a pointer to the interrupt stack frame as
+an argument to the interrupt service routine. Eventually, it would be
+nice if all ports included this parameter.
+
+@subsection Pointer to _Thread_Dispatch Routine
+
+With some compilation systems, it is difficult if not impossible to call a
+high-level language routine from assembly language. This is especially
+true of commercial Ada compilers and name mangling C++ ones. This
+variable can be optionally defined by the CPU porter and contains the
+address of the routine _Thread_Dispatch. This can make it easier to
+invoke that routine at the end of the interrupt sequence (if a dispatch is
+necessary).
+
+@example
+void (*_CPU_Thread_dispatch_pointer)();
+@end example
+
diff --git a/doc/porting/miscellaneous.t b/doc/porting/miscellaneous.t
new file mode 100644
index 0000000000..38162f8969
--- /dev/null
+++ b/doc/porting/miscellaneous.t
@@ -0,0 +1,175 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Miscellaneous
+
+@section Fatal Error Default Handler
+
+The @code{_CPU_Fatal_halt} routine is the default fatal error handler. This
+routine copies _error into a known place -- typically a stack location or
+a register, optionally disables interrupts, and halts/stops the CPU. It
+is prototyped as follows and is often implemented as a macro:
+
+@example
+void _CPU_Fatal_halt(
+ unsigned32 _error
+);
+@end example
+
+@section Processor Endianness
+
+Endianness refers to the order in which numeric values are stored in
+memory by the microprocessor. Big endian architectures store the most
+significant byte of a multi-byte numeric value in the byte with the lowest
+address. This results in the hexadecimal value 0x12345678 being stored as
+0x12345678 with 0x12 in the byte at offset zero, 0x34 in the byte at
+offset one, etc.. The Motorola M68K and numerous RISC processor families
+is big endian. Conversely, little endian architectures store the least
+significant byte of a multi-byte numeric value in the byte with the lowest
+address. This results in the hexadecimal value 0x12345678 being stored as
+0x78563412 with 0x78 in the byte at offset zero, 0x56 in the byte at
+offset one, etc.. The Intel ix86 family is little endian.
+Interestingly, some CPU models within the PowerPC and MIPS architectures
+can be switched between big and little endian modes. Most embedded
+systems use these families strictly in big endian mode.
+
+RTEMS must be informed of the byte ordering for this microprocessor family
+and, optionally, endian conversion routines may be provided as part of the
+port. Conversion between endian formats is often necessary in
+multiprocessor environments and sometimes needed when interfacing with
+peripheral controllers.
+
+@subsection Specifying Processor Endianness
+
+The @code{CPU_BIG_ENDIAN} and @code{CPU_LITTLE_ENDIAN} are
+set to specify the endian
+format used by this microprocessor. These macros should not be set to the
+same value. The following example illustrates how these macros should be
+set on a processor family that is big endian.
+
+@example
+#define CPU_BIG_ENDIAN TRUE
+#define CPU_LITTLE_ENDIAN FALSE
+@end example
+
+@subsection Optional Endian Conversion Routines
+
+In a networked environment, each program communicating must agree on the
+format of data passed between the various systems in the networked
+application. Routines such as @code{ntohl()}
+and @code{htonl()} are used to convert
+between the common network format and the native format used on this
+particular host system. Although RTEMS has a portable implementation of
+these endian conversion routines, it is often possible to implement these
+routines more efficiently in a processor specific fashion.
+
+The @code{CPU_HAS_OWN_HOST_TO_NETWORK_ROUTINES} is set to TRUE when the port
+provides its own implementation of the network to host and host to network
+family of routines. This set of routines include the following:
+
+@itemize @bullet
+@item @code{ntohl()}
+@item @code{ntohs()}
+@item @code{htonl()}
+@item @code{htons()}
+@end itemize
+
+The following example illustrates how this macro should be set when the
+generic, portable implementation of this family of routines is to be used
+by this port:
+
+@example
+#define CPU_HAS_OWN_HOST_TO_NETWORK_ROUTINES FALSE
+@end example
+
+@section Extra Stack for MPCI Receive Thread
+
+The @code{CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK} macro is set to the amount of
+stack space above the minimum thread stack space required by the MPCI
+Receive Server Thread. This macro is needed because in a multiprocessor
+system the MPCI Receive Server Thread must be able to process all
+directives.
+
+@example
+#define CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK 0
+@end example
+
+@subsection Endian Swap Unsigned Integers
+
+The port should provide routines to swap sixteen (@code{CPU_swap_u16}) and
+thirty-bit (@code{CPU_swap_u32}) unsigned integers. These are primarily used in
+two areas of RTEMS - multiprocessing support and the network endian swap
+routines. The @code{CPU_swap_u32} routine must be implemented as a static
+routine rather than a macro because its address is taken and used
+indirectly. On the other hand, the @code{CPU_swap_u16} routine may be
+implemented as a macro.
+
+Some CPUs have special instructions that swap a 32-bit quantity in a
+single instruction (e.g. i486). It is probably best to avoid an "endian
+swapping control bit" in the CPU. One good reason is that interrupts
+would probably have to be disabled to insure that an interrupt does not
+try to access the same "chunk" with the wrong endian. Another good reason
+is that on some CPUs, the endian bit endianness for ALL fetches -- both
+code and data -- so the code will be fetched incorrectly.
+
+The following is an implementation of the @code{CPU_swap_u32} routine that will
+work on any CPU. It operates by breaking the unsigned thirty-two bit
+integer into four byte-wide quantities and reassemblying them.
+
+@example
+static inline unsigned int CPU_swap_u32(
+ unsigned int value
+)
+@{
+ unsigned32 byte1, byte2, byte3, byte4, swapped;
+
+ byte4 = (value >> 24) & 0xff;
+ byte3 = (value >> 16) & 0xff;
+ byte2 = (value >> 8) & 0xff;
+ byte1 = value & 0xff;
+
+ swapped = (byte1 << 24) | (byte2 << 16) | (byte3 << 8) | byte4;
+ return( swapped );
+@}
+@end example
+
+Although the above implementation is portable, it is not particularly
+efficient. So if there is a better way to implement this on a particular
+CPU family or model, please do so. The efficiency of this routine has
+significant impact on the efficiency of the multiprocessing support code
+in the shared memory driver and in network applications using the ntohl()
+family of routines.
+
+Most microprocessor families have rotate instructions which can be used to
+greatly improve the @code{CPU_swap_u32} routine. The most common
+way to do this is to:
+
+@example
+swap least significant two bytes with 16-bit rotate
+swap upper and lower 16-bits
+swap most significant two bytes with 16-bit rotate
+@end example
+
+Some CPUs have special instructions that swap a 32-bit quantity in a
+single instruction (e.g. i486). It is probably best to avoid an "endian
+swapping control bit" in the CPU. One good reason is that interrupts
+would probably have to be disabled to insure that an interrupt does not
+try to access the same "chunk" with the wrong endian. Another good reason
+is that on some CPUs, the endian bit endianness for ALL fetches -- both
+code and data -- so the code will be fetched incorrectly.
+
+Similarly, here is a portable implementation of the @code{CPU_swap_u16}
+routine. Just as with the @code{CPU_swap_u32} routine, the porter
+should provide a better implementation if possible.
+
+@example
+#define CPU_swap_u16( value ) \
+ (((value&0xff) << 8) | ((value >> 8)&0xff))
+@end example
+
+
diff --git a/doc/porting/porting.texi b/doc/porting/porting.texi
new file mode 100644
index 0000000000..53386ce0af
--- /dev/null
+++ b/doc/porting/porting.texi
@@ -0,0 +1,138 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename porting.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the Porting Guide
+@c
+
+@c Joel's Questions
+@c
+@c 1. Why does paragraphindent only impact makeinfo?
+@c 2. Why does paragraphindent show up in HTML?
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS On-Line Manual
+@direntry
+* RTEMS Porting Guide: (porting). The Porting Guide
+@end direntry
+@end ifset
+
+@c variable substitution info:
+@c
+@set is-C
+@clear is-Ada
+@set LANGUAGE C
+@set STRUCTURE structure
+@set ROUTINE function
+@set OR |
+@set RPREFIX RTEMS_
+@set DIRPREFIX rtems_
+@c the language is @value{LANGUAGE}
+@c NOTE: don't use underscore in the name
+@c
+
+@c
+@c Title Page Stuff
+@c
+
+
+
+
+
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage RTEMS Porting Guide
+
+@setchapternewpage odd
+@settitle RTEMS Porting Guide
+@titlepage
+@finalout
+
+@title RTEMS Porting Guide
+@subtitle Edition @value{EDITION}, for RTEMS @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include preface.texi
+@include developtools.texi
+@include sourcecode.texi
+@include cpumodels.texi
+@include cpuinit.texi
+@include interrupts.texi
+@include taskcontext.texi
+@include idlethread.texi
+@include prioritybitmap.texi
+@include codetuning.texi
+@include miscellaneous.texi
+@ifinfo
+@node Top, Preface, (dir), (dir)
+@top porting
+
+This is the online version of the RTEMS Porting Guide.
+
+@menu
+* Preface::
+* Development Tools::
+* Source Code Organization::
+* CPU Model Variations::
+* CPU Initialization::
+* Interrupts::
+* Task Context Management::
+* IDLE Thread::
+* Priority Bitmap Manipulation::
+* Code Tuning Parameters::
+* Miscellaneous::
+* Command and Variable Index::
+* Concept Index::
+@end menu
+
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@node Command and Variable Index, Concept Index, Miscellaneous Endian Swap Unsigned Integers, Top
+@unnumbered Command and Variable Index
+
+There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@node Concept Index, , Command and Variable Index, Top
+@unnumbered Concept Index
+
+There are currently no Concept Index entries.
+@c @printindex cp
+
+@contents
+@bye
+
diff --git a/doc/porting/preface.texi b/doc/porting/preface.texi
new file mode 100644
index 0000000000..19304f0f11
--- /dev/null
+++ b/doc/porting/preface.texi
@@ -0,0 +1,42 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Preface, Development Tools, Top, Top
+@end ifinfo
+@unnumbered Preface
+
+The purpose of this manual is to provide a roadmap to those people porting
+RTEMS to a new CPU family. This process includes a variety of activities
+including the following:
+
+@itemize @bullet
+
+@item targeting the GNU development tools
+
+@item porting the RTEMS executive code
+
+@item developing a Board Support Package
+
+@item writing an RTEMS CPU Supplement manual for the completed port.
+
+@end itemize
+
+This document focuses on the process of actually porting the RTEMS
+executive code proper. Each of the data structures, routines, and macro
+definitions required of a port of RTEMS is described in this document.
+
+Porting any operating system, including RTEMS, requires knowledge of the
+operating system, target CPU architecture, and debug environment. It is
+very desirable to have a CPU simulator or hardware emulator when debugging
+the port. This manual assumes that the user is familiar with building and
+using RTEMS, the C programming language, and the target CPU architecture.
+It is desirable to be familiar with the assembly language for the target
+CPU family but since only a limited amount of assembly is required to port
+RTEMS.
+
diff --git a/doc/porting/prioritybitmap.t b/doc/porting/prioritybitmap.t
new file mode 100644
index 0000000000..2e5f3b1e70
--- /dev/null
+++ b/doc/porting/prioritybitmap.t
@@ -0,0 +1,199 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Priority Bitmap Manipulation
+
+@section Introduction
+
+The RTEMS chain of ready tasks is implemented as an array of FIFOs with
+each priority having its own FIFO. This makes it very efficient to
+determine the first and last ready task at each priority. In addition,
+blocking a task only requires appending the task to the end of the FIFO
+for its priority rather than a lengthy search down a single chain of all
+ready tasks. This works extremely well except for one problem. When the
+currently executing task blocks, there may be no easy way to determine
+what is the next most important ready task. If the blocking task was the
+only ready task at its priority, then RTEMS must search all of the FIFOs
+in the ready chain to determine the highest priority with a ready task.
+
+RTEMS uses a bitmap array to efficiently solve this problem. The state of
+each bit in the priority map bit array indicates whether or not there is a
+ready task at that priority. The bit array can be efficiently searched to
+determine the highest priority ready task. This family of data type and
+routines is used to maintain and search the bit map array.
+
+When manipulating the bitmap array, RTEMS internally divides the
+8 bits of the task priority into "major" and "minor" components.
+The most significant 4 bits are the major component, while the least
+significant are the minor component. The major component of a priority
+value is used to determine which 16-bit wide entry in the
+@code{_Priority_Bit_map} array is associated with this priority.
+Each element in the @code{_Priority_Bit_map} array has a bit
+in the @code{_Priority_Major_bit_map} associated with it.
+That bit is cleared when all of the bits in a particular
+@code{_Priority_Bit_map} array entry are zero.
+
+The minor component of a priority is used to determine
+specifically which bit in @code{_Priority_Bit_map[major]}
+indicates whether or not there is a ready to execute task
+at the priority.
+
+
+@section _Priority_Bit_map_control Type
+
+The @code{_Priority_Bit_map_Control} type is the fundamental data type of the
+priority bit map array used to determine which priorities have ready
+tasks. This type may be either 16 or 32 bits wide although only the 16
+least significant bits will be used. The data type is based upon what is
+the most efficient type for this CPU to manipulate. For example, some
+CPUs have bit scan instructions that only operate on a particular size of
+data. In this case, this type will probably be defined to work with this
+instruction.
+
+@section Find First Bit Routine
+
+The _CPU_Bitfield_Find_first_bit routine sets _output to the bit number of
+the first bit set in @code{_value}. @code{_value} is of CPU dependent type
+@code{Priority_Bit_map_control}. A stub version of this routine is as follows:
+
+@example
+#define _CPU_Bitfield_Find_first_bit( _value, _output ) \
+ @{ \
+ (_output) = 0; /* do something to prevent warnings */ \
+ @}
+@end example
+
+
+
+There are a number of variables in using a "find first bit" type
+instruction.
+
+@enumerate
+
+@item What happens when run on a value of zero?
+
+@item Bits may be numbered from MSB to LSB or vice-versa.
+
+@item The numbering may be zero or one based.
+
+@item The "find first bit" instruction may search from MSB or LSB.
+
+@end enumerate
+
+RTEMS guarantees that (1) will never happen so it is not a concern.
+Cases (2),(3), (4) are handled by the macros _CPU_Priority_mask() and
+_CPU_Priority_bits_index(). These three form a set of routines which must
+logically operate together. Bits in the @code{_value} are set and cleared based
+on masks built by CPU_Priority_mask(). The basic major and minor values
+calculated by _Priority_Major() and _Priority_Minor() are "massaged" by
+_CPU_Priority_bits_index() to properly range between the values returned
+by the "find first bit" instruction. This makes it possible for
+_Priority_Get_highest() to calculate the major and directly index into the
+minor table. This mapping is necessary to ensure that 0 (a high priority
+major/minor) is the first bit found.
+
+This entire "find first bit" and mapping process depends heavily on the
+manner in which a priority is broken into a major and minor components
+with the major being the 4 MSB of a priority and minor the 4 LSB. Thus (0
+<< 4) + 0 corresponds to priority 0 -- the highest priority. And (15 <<
+4) + 14 corresponds to priority 254 -- the next to the lowest priority.
+
+If your CPU does not have a "find first bit" instruction, then there are
+ways to make do without it. Here are a handful of ways to implement this
+in software:
+
+@itemize @bullet
+
+@item a series of 16 bit test instructions
+
+@item a "binary search using if's"
+
+@item the following algorithm based upon a 16 entry lookup table. In this pseudo-code, bit_set_table[16] has values which indicate the first bit set:
+
+@example
+_number = 0 if _value > 0x00ff
+ _value >>=8
+ _number = 8;
+ if _value > 0x0000f
+ _value >=8
+ _number += 4
+
+_number += bit_set_table[ _value ]
+@end example
+
+@end itemize
+
+The following illustrates how the CPU_USE_GENERIC_BITFIELD_CODE macro may
+be so the port can use the generic implementation of this bitfield code.
+This can be used temporarily during the porting process to avoid writing
+these routines until the end. This results in a functional although lower
+performance port. This is perfectly acceptable during development and
+testing phases.
+
+@example
+#define CPU_USE_GENERIC_BITFIELD_CODE TRUE
+#define CPU_USE_GENERIC_BITFIELD_DATA TRUE
+@end example
+
+Eventually, CPU specific implementations of these routines are usually
+written since they dramatically impact the performance of blocking
+operations. However they may take advantage of instructions which are not
+available on all models in the CPU family. In this case, one might find
+something like this stub example did:
+
+@example
+#if (CPU_USE_GENERIC_BITFIELD_CODE == FALSE)
+#define _CPU_Bitfield_Find_first_bit( _value, _output ) \
+ @{ \
+ (_output) = 0; /* do something to prevent warnings */ \
+ @}
+#endif
+@end example
+
+@section Build Bit Field Mask
+
+The _CPU_Priority_Mask routine builds the mask that corresponds to the bit
+fields searched by _CPU_Bitfield_Find_first_bit(). See the discussion of
+that routine for more details.
+
+The following is a typical implementation when the
+_CPU_Bitfield_Find_first_bit searches for the most significant bit set:
+
+@example
+#if (CPU_USE_GENERIC_BITFIELD_CODE == FALSE)
+#define _CPU_Priority_Mask( _bit_number ) \
+ ( 1 << (_bit_number) )
+#endif
+@end example
+
+@section Bit Scan Support
+
+The @code{_CPU_Priority_bits_index} routine translates the bit numbers
+returned by @code{_CPU_Bitfield_Find_first_bit()} into something
+suitable for use as a major or minor component of a priority.
+The find first bit routine may number the bits in a
+way that is difficult to map into the major and minor components
+of the priority. For example, when finding the first bit set in
+the value 0x8000, a CPU may indicate that bit 15 or 16 is set
+based on whether the least significant bit is "zero" or "one".
+Similarly, a CPU may only scan 32-bit values and consider the
+most significant bit to be bit zero or one. In this case, this
+would be bit 16 or 17.
+
+This routine allows that unwieldy form to be converted
+into a normalized form that is easier to process and use
+as an index.
+
+@example
+#if (CPU_USE_GENERIC_BITFIELD_CODE == FALSE)
+#define _CPU_Priority_bits_index( _priority ) \
+ (_priority)
+#endif
+@end example
+
+
diff --git a/doc/porting/sourcecode.t b/doc/porting/sourcecode.t
new file mode 100644
index 0000000000..9ac9ba6f89
--- /dev/null
+++ b/doc/porting/sourcecode.t
@@ -0,0 +1,23 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Source Code Organization
+
+This section describes the organization of the source code within RTEMS
+that is CPU family and CPU model dependent.
+
+@section Introduction
+
+The CPU family dependent files associated with a port of the RTEMS
+executive code proper to a particular processor family are found in
+cpukit/score/cpu. Support code for this port as well as processor
+dependent code which may be reused across multiple Board Support Packages
+is found in c/src/lib/libcpu.
+
+XXX list the files and directories here
+
diff --git a/doc/porting/taskcontext.t b/doc/porting/taskcontext.t
new file mode 100644
index 0000000000..eb19137c8f
--- /dev/null
+++ b/doc/porting/taskcontext.t
@@ -0,0 +1,531 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Task Context Management
+
+@section Introduction
+
+XXX
+
+@section Task Stacks
+
+XXX
+
+@subsection Direction of Stack Growth
+
+The CPU_STACK_GROWS_UP macro is set based upon the answer to the following
+question: Does the stack grow up (toward higher addresses) or down (toward
+lower addresses)? If the stack grows upward in memory, then this macro
+should be set to TRUE. Otherwise, it should be set to FALSE to indicate
+that the stack grows downward toward smaller addresses.
+
+The following illustrates how the CPU_STACK_GROWS_UP macro is set:
+
+@example
+#define CPU_STACK_GROWS_UP TRUE
+@end example
+
+@subsection Minimum Task Stack Size
+
+The CPU_STACK_MINIMUM_SIZE macro should be set to the minimum size of each
+task stack. This size is specified as the number of bytes. This minimum
+stack size should be large enough to run all RTEMS tests. The minimum
+stack size is chosen such that a "reasonable" small application should not
+have any problems. Choosing a minimum stack size that is too small will
+result in the RTEMS tests "blowing" their stack and not executing
+properly.
+
+There are many reasons a task could require a stack size larger than the
+minimum. For example, a task could have a very deep call path or declare
+large data structures on the stack. Tasks which utilize C++ exceptions
+tend to require larger stacks as do Ada tasks.
+
+The following illustrates setting the minimum stack size to 4 kilobytes
+per task.
+
+@example
+#define CPU_STACK_MINIMUM_SIZE (1024*4)
+@end example
+
+@subsection Stack Alignment Requirements
+
+The CPU_STACK_ALIGNMENT macro is set to indicate the byte alignment
+requirement for the stack. This alignment requirement may be stricter
+than that for the data types alignment specified by CPU_ALIGNMENT. If the
+CPU_ALIGNMENT is strict enough for the stack, then this should be set to
+0.
+
+The following illustrates how the CPU_STACK_ALIGNMENT macro should be set
+when there are no special requirements:
+
+@example
+#define CPU_STACK_ALIGNMENT 0
+@end example
+
+NOTE: This must be a power of 2 either 0 or greater than CPU_ALIGNMENT. [XXX is this true?]
+
+@section Task Context
+
+Associated with each task is a context that distinguishes it from other
+tasks in the system and logically gives it its own scratch pad area for
+computations. In addition, when an interrupt occurs some processor
+context information must be saved and restored. This is managed in RTEMS
+as three items:
+
+@itemize @bullet
+
+@item Basic task level context (e.g. the Context_Control structure)
+
+@item Floating point task context (e.g. Context_Control_fp structure)
+
+@item Interrupt level context (e.g. the Context_Control_interrupt
+structure)
+
+@end itemize
+
+The integer and floating point context structures and the routines that
+manipulate them are discussed in detail in this section, while the
+interrupt level context structure is discussed in the XXX.
+
+Additionally, if the GNU debugger gdb is to be made aware of RTEMS tasks
+for this CPU, then care should be used in designing the context area.
+
+@example
+typedef struct @{
+ unsigned32 special_interrupt_register;
+@} CPU_Interrupt_frame;
+@end example
+
+
+@subsection Basic Context Data Structure
+
+The Context_Control data structure contains the basic integer context of a
+task. In addition, this context area contains stack and frame pointers,
+processor status register(s), and any other registers that are normally
+altered by compiler generated code. In addition, this context must
+contain the processor interrupt level since the processor interrupt level
+is maintained on a per-task basis. This is necessary to support the
+interrupt level portion of the task mode as provided by the Classic RTEMS
+API.
+
+On some processors, it is cost-effective to save only the callee preserved
+registers during a task context switch. This means that the ISR code
+needs to save those registers which do not persist across function calls.
+It is not mandatory to make this distinctions between the caller/callee
+saves registers for the purpose of minimizing context saved during task
+switch and on interrupts. If the cost of saving extra registers is
+minimal, simplicity is the choice. Save the same context on interrupt
+entry as for tasks in this case.
+
+The Context_Control data structure should be defined such that the order
+of elements results in the simplest, most efficient implementation of XXX.
+A typical implementation starts with a definition such as the following:
+
+@example
+typedef struct @{
+ unsigned32 some_integer_register;
+ unsigned32 another_integer_register;
+ unsigned32 some_system_register;
+@} Context_Control;
+@end example
+
+@subsection Initializing a Context
+
+The _CPU_Context_Initialize routine initializes the context to a state
+suitable for starting a task after a context restore operation.
+Generally, this involves:
+
+@itemize @bullet
+
+@item setting a starting address,
+
+@item preparing the stack,
+
+@item preparing the stack and frame pointers,
+
+@item setting the proper interrupt level in the context, and
+
+@item initializing the floating point context
+
+@end itemize
+
+This routine generally does not set any unnecessary register in the
+context. The state of the "general data" registers is undefined at task
+start time. The _CPU_Context_initialize routine is prototyped as follows:
+
+@example
+void _CPU_Context_Initialize(
+ Context_Control *_the_context,
+ void *_stack_base,
+ unsigned32 _size,
+ unsigned32 _isr,
+ void *_entry_point,
+ unsigned32 _is_fp
+);
+@end example
+
+The @code{is_fp} parameter is TRUE if the thread is to be a floating point
+thread. This is typically only used on CPUs where the FPU may be easily
+disabled by software such as on the SPARC where the PSR contains an enable
+FPU bit. The use of an FPU enable bit allows RTEMS to ensure that a
+non-floating point task is unable to access the FPU. This guarantees that
+a deferred floating point context switch is safe.
+
+The @code{_stack_base} parameter is the base address of the memory area
+allocated for use as the task stack. It is critical to understand that
+@code{_stack_base} may not be the starting stack pointer for this task.
+On CPU families where the stack grows from high addresses to lower ones,
+(i.e. @code{CPU_STACK_GROWS_UP} is FALSE) the starting stack point
+will be near the end of the stack memory area or close to
+@code{_stack_base} + @code{_size}. Even on CPU families where the stack
+grows from low to higher addresses, there may be some required
+outermost stack frame that must be put at the address @code{_stack_base}.
+
+The @code{_size} parameter is the requested size in bytes of the stack for
+this task. It is assumed that the memory area @code{_stack_base}
+is of this size.
+
+XXX explain other parameters and check prototype
+
+@subsection Performing a Context Switch
+
+The _CPU_Context_switch performs a normal non-FP context switch from the
+context of the current executing thread to the context of the heir thread.
+
+@example
+void _CPU_Context_switch(
+ Context_Control *run,
+ Context_Control *heir
+);
+@end example
+
+This routine begins by saving the current state of the
+CPU (i.e. the context) in the context area at @code{run}.
+Then the routine should load the CPU context pointed to
+by @code{heir}. Loading the new context will cause a
+branch to its task code, so the task that invoked
+@code{_CPU_Context_switch} will not run for a while.
+When, eventually, a context switch is made to load
+context from @code{*run} again, this task will resume
+and @code{_CPU_Context_switch} will return to its caller.
+
+Care should be exercise when writing this routine. All
+registers assumed to be preserved across subroutine calls
+must be preserved. These registers may be saved in
+the task's context area or on its stack. However, the
+stack pointer and address to resume executing the task
+at must be included in the context (normally the subroutine
+return address to the caller of @code{_Thread_Dispatch}.
+The decision of where to store the task's context is based
+on numerous factors including the capabilities of
+the CPU architecture itself and simplicity as well
+as external considerations such as debuggers wishing
+to examine a task's context. In this case, it is
+often simpler to save all data in the context area.
+
+Also there may be special considerations
+when loading the stack pointers or interrupt level of the
+incoming task. Independent of CPU specific considerations,
+if some context is saved on the task stack, then the porter
+must ensure that the stack pointer is adjusted @b{BEFORE}
+to make room for this context information before the
+information is written. Otherwise, an interrupt could
+occur writing over the context data. The following is
+an example of an @b{INCORRECT} sequence:
+
+@example
+save part of context beyond current top of stack
+interrupt pushes context -- overwriting written context
+interrupt returns
+adjust stack pointer
+@end example
+
+@subsection Restoring a Context
+
+The _CPU_Context_restore routine is generally used only to restart the
+currently executing thread (i.e. self) in an efficient manner. In many
+ports, it can simply be a label in _CPU_Context_switch. It may be
+unnecessary to reload some registers.
+
+@example
+void _CPU_Context_restore(
+ Context_Control *new_context
+);
+@end example
+
+@subsection Restarting the Currently Executing Task
+
+The _CPU_Context_Restart_self is responsible for somehow restarting the
+currently executing task. If you are lucky when porting RTEMS, then all
+that is necessary is restoring the context. Otherwise, there will need to
+be a routine that does something special in this case. Performing a
+_CPU_Context_Restore on the currently executing task after reinitializing
+that context should work on most ports. It will not work if restarting
+self conflicts with the stack frame assumptions of restoring a context.
+
+The following is an implementation of _CPU_Context_Restart_self that can
+be used when no special handling is required for this case.
+
+@example
+#define _CPU_Context_Restart_self( _the_context ) \
+ _CPU_Context_restore( (_the_context) )
+@end example
+
+XXX find a port which does not do it this way and include it here
+
+@section Floating Point Context
+
+@subsection CPU_HAS_FPU Macro Definition
+
+The CPU_HAS_FPU macro is set based on the answer to the question: Does the
+CPU have hardware floating point? If the CPU has an FPU, then this should
+be set to TRUE. Otherwise, it should be set to FALSE. The primary
+implication of setting this macro to TRUE is that it indicates that tasks
+may have floating point contexts. In the Classic API, this means that the
+RTEMS_FLOATING_POINT task attribute specified as part of rtems_task_create
+is supported on this CPU. If CPU_HAS_FPU is set to FALSE, then no tasks
+or threads may be floating point and the RTEMS_FLOATING_POINT task
+attribute is ignored. On an API such as POSIX where all threads
+implicitly have a floating point context, then the setting of this macro
+determines whether every POSIX thread has a floating point context.
+
+The following example illustrates how the CPU_HARDWARE_FP (XXX macro name
+is varying) macro is set based on the CPU family dependent macro.
+
+@example
+#if ( THIS_CPU_FAMILY_HAS_FPU == 1 ) /* where THIS_CPU_FAMILY */
+ /* might be M68K */
+#define CPU_HARDWARE_FP TRUE
+#else
+#define CPU_HARDWARE_FP FALSE
+#endif
+@end example
+
+The macro name THIS_CPU_FAMILY_HAS_FPU should be made CPU specific. It
+indicates whether or not this CPU model has FP support. For example, the
+definition of the i386ex and i386sx CPU models would set I386_HAS_FPU to
+FALSE to indicate that these CPU models are i386's without an i387 and
+wish to leave floating point support out of RTEMS when built for the
+i386_nofp processor model. On a CPU with a built-in FPU like the i486,
+this would be defined as TRUE.
+
+On some processor families, the setting of the THIS_CPU_FAMILY_HAS_FPU
+macro may be derived from compiler predefinitions. This can be used when
+the compiler distinguishes the individual CPU models for this CPU family
+as distinctly as RTEMS requires. Often RTEMS needs to need more about the
+CPU model than the compiler because of differences at the system level
+such as caching, interrupt structure.
+
+@subsection CPU_ALL_TASKS_ARE_FP Macro Setting
+
+The CPU_ALL_TASKS_ARE_FP macro is set to TRUE or FALSE based upon the
+answer to the following question: Are all tasks RTEMS_FLOATING_POINT tasks
+implicitly? If this macro is set TRUE, then all tasks and threads are
+assumed to have a floating point context. In the Classic API, this is
+equivalent to setting the RTEMS_FLOATING_POINT task attribute on all
+rtems_task_create calls. If the CPU_ALL_TASKS_ARE_FP macro is set to
+FALSE, then the RTEMS_FLOATING_POINT task attribute in the Classic API is
+honored.
+
+The rationale for this macro is that if a function that an application
+developer would not think utilize the FP unit DOES, then one can not
+easily predict which tasks will use the FP hardware. In this case, this
+option should be TRUE. So far, the only CPU families for which this macro
+has been to TRUE are the HP PA-RISC and PowerPC. For the HP PA-RISC, the
+HP C compiler and gcc both implicitly use the floating point registers to
+perform integer multiplies. For the PowerPC, this feature macro is set to
+TRUE because the printf routine saves a floating point register whether or
+not a floating point number is actually printed. If the newlib
+implementation of printf were restructured to avoid this, then the PowerPC
+port would not have to have this option set to TRUE.
+
+The following example illustrates how the CPU_ALL_TASKS_ARE_FP is set on
+the PowerPC. On this CPU family, this macro is set to TRUE if the CPU
+model has hardware floating point.
+
+@example
+#if (CPU_HARDWARE_FP == TRUE)
+#define CPU_ALL_TASKS_ARE_FP TRUE
+#else
+#define CPU_ALL_TASKS_ARE_FP FALSE
+#endif
+@end example
+
+NOTE: If CPU_HARDWARE_FP is FALSE, then this should be FALSE as well.
+
+@subsection CPU_USE_DEFERRED_FP_SWITCH Macro Setting
+
+The CPU_USE_DEFERRED_FP_SWITCH macro is set based upon the answer to the
+following question: Should the saving of the floating point registers be
+deferred until a context switch is made to another different floating
+point task? If the floating point context will not be stored until
+necessary, then this macro should be set to TRUE. When set to TRUE, the
+floating point context of a task will remain in the floating point
+registers and not disturbed until another floating point task is switched
+to.
+
+If the CPU_USE_DEFERRED_FP_SWITCH is set to FALSE, then the floating point
+context is saved each time a floating point task is switched out and
+restored when the next floating point task is restored. The state of the
+floating point registers between those two operations is not specified.
+
+There are a couple of known cases where the port should not defer saving
+the floating point context. The first case is when the compiler generates
+instructions that use the FPU when floating point is not actually used.
+This occurs on the HP PA-RISC for example when an integer multiply is
+performed. On the PowerPC, the printf routine includes a save of a
+floating point register to support printing floating point numbers even if
+the path that actually prints the floating point number is not invoked.
+In both of these cases, deferred floating point context switches can not
+be used. If the floating point context has to be saved as part of
+interrupt dispatching, then it may also be necessary to disable deferred
+context switches.
+
+Setting this flag to TRUE results in using a different algorithm for
+deciding when to save and restore the floating point context. The
+deferred FP switch algorithm minimizes the number of times the FP context
+is saved and restored. The FP context is not saved until a context switch
+is made to another, different FP task. Thus in a system with only one FP
+task, the FP context will never be saved or restored.
+
+The following illustrates setting the CPU_USE_DEFERRED_FP_SWITCH macro on
+a processor family such as the M68K or i386 which can use deferred
+floating point context switches.
+
+@example
+#define CPU_USE_DEFERRED_FP_SWITCH TRUE
+@end example
+
+@subsection Floating Point Context Data Structure
+
+The Context_Control_fp contains the per task information for the floating
+point unit. The organization of this structure may be a list of floating
+point registers along with any floating point control and status registers
+or it simply consist of an array of a fixed number of bytes. Defining the
+floating point context area as an array of bytes is done when the floating
+point context is dumped by a "FP save context" type instruction and the
+format is either not completely defined by the CPU documentation or the
+format is not critical for the implementation of the floating point
+context switch routines. In this case, there is no need to figure out the
+exact format -- only the size. Of course, although this is enough
+information for RTEMS, it is probably not enough for a debugger such as
+gdb. But that is another problem.
+
+@example
+typedef struct @{
+ double some_float_register;
+@} Context_Control_fp;
+@end example
+
+
+On some CPUs with hardware floating point support, the Context_Control_fp
+structure will not be used.
+
+@subsection Size of Floating Point Context Macro
+
+The CPU_CONTEXT_FP_SIZE macro is set to the size of the floating point
+context area. On some CPUs this will not be a "sizeof" because the format
+of the floating point area is not defined -- only the size is. This is
+usually on CPUs with a "floating point save context" instruction. In
+general, though it is easier to define the structure as a "sizeof"
+operation and define the Context_Control_fp structure to be an area of
+bytes of the required size in this case.
+
+@example
+#define CPU_CONTEXT_FP_SIZE sizeof( Context_Control_fp )
+@end example
+
+@subsection Start of Floating Point Context Area Macro
+
+The _CPU_Context_Fp_start macro is used in the XXX routine and allows the initial pointer into a floating point context area (used to save the floating point context) to be at an arbitrary place in the floating point context area. This is necessary because some FP units are designed to have their context saved as a stack which grows into lower addresses. Other FP units can be saved by simply moving registers into offsets from the base of the context area. Finally some FP units provide a "dump context" instruction which could fill in from high to low or low to high based on the whim of the CPU designers. Regardless, the address at which that floating point context area pointer should start within the actual floating point context area varies between ports and this macro provides a clean way of addressing this.
+
+This is a common implementation of the _CPU_Context_Fp_start routine which
+is suitable for many processors. In particular, RISC processors tend to
+use this implementation since the floating point context is saved as a
+sequence of store operations.
+
+@example
+#define _CPU_Context_Fp_start( _base, _offset ) \
+ ( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
+@end example
+
+In contrast, the m68k treats the floating point context area as a stack
+which grows downward in memory. Thus the following implementation of
+_CPU_Context_Fp_start is used in that port:
+
+
+@example
+XXX insert m68k version here
+@end example
+
+@subsection Initializing a Floating Point Context
+
+The _CPU_Context_Initialize_fp routine initializes the floating point
+context area passed to it to. There are a few standard ways in which to
+initialize the floating point context. The simplest, and least
+deterministic behaviorally, is to do nothing. This leaves the FPU in a
+random state and is generally not a suitable way to implement this
+routine. The second common implementation is to place a "null FP status
+word" into some status/control register in the FPU. This mechanism is
+simple and works on many FPUs. Another common way is to initialize the
+FPU to a known state during _CPU_Initialize and save the context (using
+_CPU_Context_save_fp_context) into the special floating point context
+_CPU_Null_fp_context. Then all that is required to initialize a floating
+point context is to copy _CPU_Null_fp_context to the destination floating
+point context passed to it. The following example implementation shows
+how to accomplish this:
+
+@example
+#define _CPU_Context_Initialize_fp( _destination ) \
+ @{ \
+ *((Context_Control_fp *) *((void **) _destination)) = \
+ _CPU_Null_fp_context; \
+ @}
+@end example
+
+The _CPU_Null_fp_context is optional. A port need only include this variable when it uses the above mechanism to initialize a floating point context. This is typically done on CPUs where it is difficult to generate an "uninitialized" FP context. If the port requires this variable, then it is declared as follows:
+
+@example
+Context_Control_fp _CPU_Null_fp_context;
+@end example
+
+
+@subsection Saving a Floating Point Context
+
+The _CPU_Context_save_fp_context routine is responsible for saving the FP
+context at *fp_context_ptr. If the point to load the FP context from is
+changed then the pointer is modified by this routine.
+
+Sometimes a macro implementation of this is in cpu.h which dereferences
+the ** and a similarly named routine in this file is passed something like
+a (Context_Control_fp *). The general rule on making this decision is to
+avoid writing assembly language.
+
+@example
+void _CPU_Context_save_fp(
+ void **fp_context_ptr
+)
+@end example
+
+@subsection Restoring a Floating Point Context
+
+The _CPU_Context_restore_fp_context is responsible for restoring the FP
+context at *fp_context_ptr. If the point to load the FP context from is
+changed then the pointer is modified by this routine.
+
+Sometimes a macro implementation of this is in cpu.h which dereferences
+the ** and a similarly named routine in this file is passed something like
+a (Context_Control_fp *). The general rule on making this decision is to
+avoid writing assembly language.
+
+@example
+void _CPU_Context_restore_fp(
+ void **fp_context_ptr
+);
+@end example
+
diff --git a/doc/posix1003.1/.cvsignore b/doc/posix1003.1/.cvsignore
new file mode 100644
index 0000000000..13d98bd540
--- /dev/null
+++ b/doc/posix1003.1/.cvsignore
@@ -0,0 +1,44 @@
+ch01.texi
+ch02.texi
+ch03.texi
+ch04.texi
+ch05.texi
+ch06.texi
+ch07.texi
+ch08.texi
+ch09.texi
+ch10.texi
+ch11.texi
+ch12.texi
+ch13.texi
+ch14.texi
+ch15.texi
+ch16.texi
+ch17.texi
+ch18.texi
+ch19.t
+ch19.texi
+index.html
+Makefile
+Makefile.in
+mdate-sh
+posix1003_1
+posix1003_1-?
+posix1003_1-??
+posix1003_1.aux
+posix1003_1.cp
+posix1003_1.dvi
+posix1003_1.fn
+posix1003_1*.html
+posix1003_1.ky
+posix1003_1.log
+posix1003_1.pdf
+posix1003_1.pg
+posix1003_1.ps
+posix1003_1.toc
+posix1003_1.tp
+posix1003_1.vr
+rtems_footer.html
+rtems_header.html
+stamp-vti
+version.texi
diff --git a/doc/posix1003.1/Makefile.am b/doc/posix1003.1/Makefile.am
new file mode 100644
index 0000000000..ca6ad0644a
--- /dev/null
+++ b/doc/posix1003.1/Makefile.am
@@ -0,0 +1,129 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = posix1003_1
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/main.am
+
+GENERATED_FILES = ch01.texi ch02.texi ch03.texi ch04.texi ch05.texi \
+ ch06.texi ch07.texi ch08.texi ch09.texi ch10.texi ch11.texi ch12.texi \
+ ch13.texi ch14.texi ch15.texi ch16.texi ch17.texi ch18.texi ch19.texi
+
+COMMON_FILES += $(top_srcdir)/common/cpright.texi
+
+FILES = preface.texi
+
+info_TEXINFOS = posix1003_1.texi
+posix1003_1_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+ch01.texi: ch01.t
+ $(BMENU2) -c -p "Preface" \
+ -u "Top" \
+ -n "Terminology and General Requirements" < $< > $@
+
+ch02.texi: ch02.t
+ $(BMENU2) -c -p "Conformance" \
+ -u "Top" \
+ -n "Process Primitives" < $< > $@
+
+ch03.texi: ch03.t
+ $(BMENU2) -c -p "Execution-Time Symbolic Constants for Portability Specifications" \
+ -u "Top" \
+ -n "Process Environment" < $< > $@
+
+ch04.texi: ch04.t
+ $(BMENU2) -c -p "Delay Process Execution" \
+ -u "Top" \
+ -n "Files and Directories" < $< > $@
+
+ch05.texi: ch05.t
+ $(BMENU2) -c -p "Get Configurable System Variables" \
+ -u "Top" \
+ -n "Input and Output Primitives" < $< > $@
+
+ch06.texi: ch06.t
+ $(BMENU2) -c -p "Get Configurable Pathname Variables" \
+ -u "Top" \
+ -n "Device- and Class-Specific Functions" < $< > $@
+
+ch07.texi: ch07.t
+ $(BMENU2) -c -p " Asynchronous File Synchronization" \
+ -u "Top" \
+ -n "Language-Specific Services for the C Programming Language" < $< > $@
+
+ch08.texi: ch08.t
+ $(BMENU2) -c -p "Set Foreground Process Group ID" \
+ -u "Top" \
+ -n "System Databases" < $< > $@
+
+ch09.texi: ch09.t
+ $(BMENU2) -c -p "Pseudo-Random Sequence Generation Functions" \
+ -u "Top" \
+ -n "Data Interchange Format" < $< > $@
+
+ch10.texi: ch10.t
+ $(BMENU2) -c -p "User Database Access" \
+ -u "Top" \
+ -n "Synchronization" < $< > $@
+
+ch11.texi: ch11.t
+ $(BMENU2) -c -p "Multiple Volumes" \
+ -u "Top" \
+ -n "Memory Management" < $< > $@
+
+ch12.texi: ch12.t
+ $(BMENU2) -c -p "Waiting on a Condition" \
+ -u "Top" \
+ -n "Execution Scheduling" < $< > $@
+
+ch13.texi: ch13.t
+ $(BMENU2) -c -p "Remove a Shared Memory Object" \
+ -u "Top" \
+ -n "Clocks and Timers" < $< > $@
+
+ch14.texi: ch14.t
+ $(BMENU2) -c -p "Change the Priority Ceiling of a Mutex" \
+ -u "Top" \
+ -n "Message Passing" < $< > $@
+
+ch15.texi: ch15.t
+ $(BMENU2) -c -p "High Resolution Sleep" \
+ -u "Top" \
+ -n "Thread Management" < $< > $@
+
+ch16.texi: ch16.t
+ $(BMENU2) -c -p "Get Message Queue Attributes" \
+ -u "Top" \
+ -n "Thread-Specific Data" < $< > $@
+
+ch17.texi: ch17.t
+ $(BMENU2) -c -p "Dynamic Package Initialization" \
+ -u "Top" \
+ -n "Thread Cancellation" < $< > $@
+
+ch18.texi: ch18.t
+ $(BMENU2) -c -p "Thread-Specific Data Key Deletion" \
+ -u "Top" \
+ -n "Compliance Summary" < $< > $@
+
+ch19.texi: ch01.t ch02.t ch03.t ch04.t ch05.t ch06.t ch07.t ch08.t \
+ ch09.t ch10.t ch11.t ch12.t ch13.t ch14.t ch15.t ch16.t ch17.t ch18.t
+ $(srcdir)/summarize $^ | \
+ $(BMENU2) -c -p "List of Cancellation Points" \
+ -u "Top" \
+ -n "Command and Variable Index" > $@
+
+noinst_SCRIPTS = summarize
+
+EXTRA_DIST = ch01.t ch02.t ch03.t ch04.t ch05.t ch06.t ch07.t ch08.t ch09.t \
+ ch10.t ch11.t ch12.t ch13.t ch14.t ch15.t ch16.t ch17.t ch18.t \
+ compliance_list summarize
+
+CLEANFILES += posix1003_1.info posix1003_1.info-?
diff --git a/doc/posix1003.1/ch01.t b/doc/posix1003.1/ch01.t
new file mode 100644
index 0000000000..1b9695b14d
--- /dev/null
+++ b/doc/posix1003.1/ch01.t
@@ -0,0 +1,40 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter General
+
+@section Scope
+
+@section Normative References
+
+@section Conformance
+
+@example
+NGROUPS_MAX, Feature Flag,
+_POSIX_ASYNCHRONOUS_IO, Feature Flag,
+_POSIX_CHOWN_RESTRICTED, Feature Flag,
+_POSIX_FSYNC, Feature Flag,
+_POSIX_JOB_CONTROL, Feature Flag,
+_POSIX_MAPPED_FILES, Feature Flag,
+_POSIX_MEMLOCK, Feature Flag,
+_POSIX_MEMLOCK_RANGE, Feature Flag,
+_POSIX_MEMORY_PROTECTION, Feature Flag,
+_POSIX_MESSAGE_PASSING, Feature Flag,
+_POSIX_PRIORITIZED_IO, Feature Flag,
+_POSIX_PRIORITY_SCHEDULING, Feature Flag,
+_POSIX_REALTIME_SIGNALS, Feature Flag,
+_POSIX_SEMAPHORES, Feature Flag,
+_POSIX_SHARED_MEMORY_OBJECTS, Feature Flag,
+_POSIX_SYNCHRONIZED_IO, Feature Flag,
+_POSIX_TIMERS, Feature Flag,
+_POSIX_THREAD_PRIO_INHERIT, Feature Flag,
+_POSIX_THREAD_PRIORITY_SCHEDULING, Feature Flag,
+_POSIX_THREADS, Feature Flag,
+_POSIX_THREAD_SAFE_FUNCTIONS, Feature Flag,
+@end example
+
diff --git a/doc/posix1003.1/ch02.t b/doc/posix1003.1/ch02.t
new file mode 100644
index 0000000000..d808a8035f
--- /dev/null
+++ b/doc/posix1003.1/ch02.t
@@ -0,0 +1,279 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Terminology and General Requirements
+
+@section Conventions
+
+@section Definitions
+
+@section General Concepts
+
+@section Error Numbers
+
+@example
+E2BIG, Constant, Implemented
+EACCES, Constant, Implemented
+EAGAIN, Constant, Implemented
+EBADF, Constant, Implemented
+EBADMSG, Constant, Implemented
+EBUSY, Constant, Implemented
+ECANCELED, Constant, Unimplemented
+ECHILD, Constant, Implemented
+EDEADLK, Constant, Implemented
+EDOM, Constant, Implemented
+EEXIST, Constant, Implemented
+EFAULT, Constant, Implemented
+EFBIG, Constant, Implemented
+EINPROGRESS, Constant, Implemented
+EINTR, Constant, Implemented
+EINVAL, Constant, Implemented
+EIO, Constant, Implemented
+EISDIR, Constant, Implemented
+EMFILE, Constant, Implemented
+EMLINK, Constant, Implemented
+EMSGSIZE, Constant, Implemented
+ENAMETOOLONG, Constant, Implemented
+ENFILE, Constant, Implemented
+ENODEV, Constant, Implemented
+ENOENT, Constant, Implemented
+ENOEXEC, Constant, Implemented
+ENOLCK, Constant, Implemented
+ENOMEM, Constant, Implemented
+ENOSPC, Constant, Implemented
+ENOSYS, Constant, Implemented
+ENOTDIR, Constant, Implemented
+ENOTEMPTY, Constant, Implemented
+ENOTSUP, Constant, Implemented
+ENOTTY, Constant, Implemented
+ENXIO, Constant, Implemented
+EPERM, Constant, Implemented
+EPIPE, Constant, Implemented
+ERANGE, Constant, Implemented
+EROFS, Constant, Implemented
+ESPIPE, Constant, Implemented
+ESRCH, Constant, Implemented
+ETIMEDOUT, Constant, Implemented
+EXDEV, Constant, Implemented
+@end example
+
+@section Primitive System Types
+
+@example
+dev_t, Type, Implemented
+gid_t, Type, Implemented
+ino_t, Type, Implemented
+mode_t, Type, Implemented
+nlink_t, Type, Implemented
+off_t, Type, Implemented
+pid_t, Type, Implemented
+pthread_t, Type, Implemented
+pthread_attr_t, Type, Implemented
+pthread_mutex_t, Type, Implemented
+pthread_mutex_attr_t, Type, Implemented
+pthread_cond_t, Type, Implemented
+pthread_cond_attr_t, Type, Implemented
+pthread_key_t, Type, Implemented
+pthread_once_t, Type, Implemented
+size_t, Type, Implemented
+ssize_t, Type, Implemented
+time_t, Type, Implemented
+uid_t, Type, Implemented
+@end example
+
+NOTE: time_t is not listed in this section but is used by many functions.
+
+@section Environment Description
+
+@section C Language Definitions
+
+@subsection Symbols From the C Standard
+
+@example
+NULL, Constant, Implemented
+@end example
+
+@subsection POSIX.1 Symbols
+
+@example
+_POSIX_C_SOURCE, Feature Flag,
+@end example
+
+@section Numerical Limits
+
+@section C Language Limits
+
+@example
+CHAR_BIT, Constant, Implemented
+CHAR_MAX, Constant, Implemented
+CHAR_MIN, Constant, Implemented
+INT_MAX, Constant, Implemented
+INT_MIN, Constant, Implemented
+LONG_MAX, Constant, Implemented
+LONG_MIN, Constant, Implemented
+MB_LEN_MAX, Constant, Implemented
+SCHAR_MAX, Constant, Implemented
+SCHAR_MIN, Constant, Implemented
+SHRT_MAX, Constant, Implemented
+SHRT_MIN, Constant, Implemented
+UCHAR_MAX, Constant, Implemented
+UINT_MAX, Constant, Implemented
+ULONG_MAX, Constant, Implemented
+USHRT_MAX, Constant, Implemented
+@end example
+
+NOTE: These are implemented in GCC's limits.h file.
+
+@subsection Minimum Values
+
+@example
+_POSIX_AIO_LISTIO_MAX, Constant, Implemented
+_POSIX_AIO_MAX, Constant, Implemented
+_POSIX_ARG_MAX, Constant, Implemented
+_POSIX_CHILD_MAX, Constant, Implemented
+_POSIX_DELAYTIMER_MAX, Constant, Implemented
+_POSIX_LINK_MAX, Constant, Implemented
+_POSIX_LOGIN_NAME_MAX, Constant, Implemented
+_POSIX_MAX_CANON, Constant, Implemented
+_POSIX_MAX_INPUT, Constant, Implemented
+_POSIX_MQ_OPEN_MAX, Constant, Implemented
+_POSIX_MQ_PRIO_MAX, Constant, Implemented
+_POSIX_NAME_MAX, Constant, Implemented
+_POSIX_NGROUPS_MAX, Constant, Implemented
+_POSIX_OPEN_MAX, Constant, Implemented
+_POSIX_PATH_MAX, Constant, Implemented
+_POSIX_PIPE_BUF, Constant, Implemented
+_POSIX_RTSIG_MAX, Constant, Implemented
+_POSIX_SEM_NSEMS_MAX, Constant, Implemented
+_POSIX_SEM_VALUE_MAX, Constant, Implemented
+_POSIX_SIGQUEUE_MAX, Constant, Implemented
+_POSIX_SSIZE_MAX, Constant, Implemented
+_POSIX_STREAM_MAX, Constant, Implemented
+_POSIX_THREAD_DESTRUCTOR_ITERATIONS, Constant, Implemented
+_POSIX_THREAD_KEYS_MAX, Constant, Implemented
+_POSIX_THREAD_THREADS_MAX, Constant, Implemented
+_POSIX_TTY_NAME_MAX, Constant, Implemented
+_POSIX_TIME_MAX, Constant, Unimplemented
+_POSIX_TZNAME_MAX, Constant, Implemented
+@end example
+
+@subsection Run-Time Increasable Values
+
+@example
+_POSIX_NGROUPS_MAX, Constant, Implemented
+@end example
+
+@subsection Run-Time Invariant Values (Possible Indeterminate)
+
+@example
+AIO_LISTIO_MAX, Constant, Implemented
+AIO_MAX, Constant, Implemented
+AIO_PRIO_DELTA_MAX, Constant, Implemented
+ARG_MAX, Constant, Implemented
+CHILD_MAX, Constant, Implemented
+DELAYTIMER_MAX, Constant, Implemented
+LOGIN_NAME_MAX, Constant, Implemented
+MQ_OPEN_MAX, Constant, Implemented
+OPEN_MAX, Constant, Implemented
+PAGESIZE, Constant, Implemented
+PTHREAD_DESTRUCTOR_ITERATIONS, Constant, Implemented
+PTHREAD_KEYS_MAX, Constant, Implemented
+PTHREAD_STACK_MIN, Constant, Implemented
+PTHJREAD_THREADS_MAX, Constant, Implemented
+RTSIG_MAX, Constant, Implemented
+SEM_NSEMS_MAX, Constant, Implemented
+SEM_VALUE_MAX, Constant, Implemented
+SIGQUEUE_MAX, Constant, Implemented
+STREAM_MAX, Constant, Implemented
+TIMER_MAX, Constant, Implemented
+TTY_NAME_MAX, Constant, Implemented
+TZNAME_MAX, Constant, Implemented
+@end example
+
+@subsection Pathname Variable Values
+
+@example
+LINK_MAX, Constant, Implemented
+MAX_CANON, Constant, Implemented
+MAX_INPUT, Constant, Implemented
+NAME_MAX, Constant, Implemented
+PATH_MAX, Constant, Implemented
+PIPE_BUF, Constant, Implemented
+@end example
+
+@subsection Invariant Values
+
+@example
+SSIZE_MAX, Constant, Implemented
+@end example
+
+@subsection Maximum Values
+
+@example
+_POSIX_CLOCKRES_MIN, Constant, Implemented
+@end example
+
+@section Symbolic Constants
+
+@subsection Symbolic Constants for the access Function
+
+@example
+R_OK, Constant, Implemented
+W_OK, Constant, Implemented
+X_OK, Constant, Implemented
+F_OK, Constant, Implemented
+@end example
+
+@subsection Symbolic Constants for the lseek Function
+
+@example
+SEEK_SET, Constant, Implemented
+SEEK_CUR, Constant, Implemented
+SEEK_END, Constant, Implemented
+@end example
+
+@subsection Compile-Time Symbolic Constants for Portability Specifications
+
+@example
+_POSIX_ASYNCHRONOUS_IO, Feature Flag,
+_POSIX_FSYNC, Feature Flag,
+_POSIX_JOB_CONTROL, Feature Flag,
+_POSIX_MAPPED_FILES, Feature Flag,
+_POSIX_MEMLOCK, Feature Flag,
+_POSIX_MEMLOCK_RANGE, Feature Flag,
+_POSIX_MEMORY_PROTECTION, Feature Flag,
+_POSIX_MESSAGE_PASSING, Feature Flag,
+_POSIX_PRIORITIZED_IO, Feature Flag,
+_POSIX_PRIORITY_SCHEDULING, Feature Flag,
+_POSIX_REALTIME_SIGNALS, Feature Flag,
+_POSIX_SAVED_IDS, Feature Flag,
+_POSIX_SEMAPHORES, Feature Flag,
+_POSIX_SHARED_MEMORY_OBJECTS, Feature Flag,
+_POSIX_SYNCHRONIZED_IO, Feature Flag,
+_POSIX_THREADS, Feature Flag,
+_POSIX_THREAD_ATTR_STACKADDR, Feature Flag,
+_POSIX_THREAD_ATTR_STACKSIZE, Feature Flag,
+_POSIX_THREAD_PRIORITY_SCHEDULING, Feature Flag,
+_POSIX_THREAD_PRIO_INHERIT, Feature Flag,
+_POSIX_THREAD_PRIO_CEILING, Feature Flag,
+_POSIX_THREAD_PROCESS_SHARED, Feature Flag,
+_POSIX_THREAD_SAFE_FUNCTIONS, Feature Flag,
+_POSIX_TIMERS, Feature Flag,
+_POSIX_VERSION, Feature Flag,
+@end example
+
+@subsection Execution-Time Symbolic Constants for Portability Specifications
+
+@example
+_POSIX_ASYNC_IO, Feature Flag,
+_POSIX_CHOWN_RESTRICTED, Feature Flag,
+_POSIX_NO_TRUNC, Feature Flag,
+_POSIX_PRIO_IO, Feature Flag,
+_POSIX_SYNC_IO, Feature Flag,
+_POSIX_VDISABLE, Feature Flag,
+@end example
diff --git a/doc/posix1003.1/ch03.t b/doc/posix1003.1/ch03.t
new file mode 100644
index 0000000000..b923f982b3
--- /dev/null
+++ b/doc/posix1003.1/ch03.t
@@ -0,0 +1,203 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Process Primitives
+
+@section Process Creation and Execution
+
+@subsection Process Creation
+
+@example
+fork(), Function, Unimplementable, Requires Processes
+@end example
+
+
+@subsection Execute a File
+
+@example
+execl(), Function, Unimplementable, Requires Processes
+execv(), Function, Unimplementable, Requires Processes
+execle(), Function, Unimplementable, Requires Processes
+execve(), Function, Unimplementable, Requires Processes
+execlp(), Function, Unimplementable, Requires Processes
+execvp(), Function, Unimplementable, Requires Processes
+@end example
+
+@subsection Register Fork Handlers
+
+@example
+pthread_atfork(), Function, Unimplementable, Requires Processes
+@end example
+
+@section Process Termination
+
+@subsection Wait for Process Termination
+
+@example
+wait(), Function, Unimplementable, Requires Processes
+waitpid(), Function, Unimplementable, Requires Processes
+WNOHANG, Constant, Unimplementable, Requires Processes
+WUNTRACED, Constant, Unimplementable, Requires Processes
+WIFEXITED(), Function, Unimplementable, Requires Processes
+WEXITSTATUS(), Function, Unimplementable, Requires Processes
+WIFSIGNALED(), Function, Unimplementable, Requires Processes
+WTERMSIG(), Function, Unimplementable, Requires Processes
+WIFSTOPPED(), Function, Unimplementable, Requires Processes
+WSTOPSIG(), Function, Unimplementable, Requires Processes
+@end example
+
+@subsection Terminate a Process
+
+@example
+_exit(), Function, Implemented
+@end example
+
+@section Signals
+
+@subsection Signal Concepts
+
+@subsubsection Signal Names
+
+@example
+sigset_t, Type, Implemented
+SIG_DFL, Constant, Implemented
+SIG_IGN, Constant, Implemented
+SIG_ERR, Constant, Implemented
+SIGABRT, Constant, Implemented
+SIGALRM, Constant, Implemented
+SIGFPE, Constant, Implemented
+SIGHUP, Constant, Implemented
+SIGILL, Constant, Implemented
+SIGINT, Constant, Implemented
+SIGKILL, Constant, Implemented
+SIGPIPE, Constant, Implemented
+SIGQUIT, Constant, Implemented
+SIGSEGV, Constant, Implemented
+SIGTERM, Constant, Implemented
+SIGUSR1, Constant, Implemented
+SIGUSR2, Constant, Implemented
+SIGCHLD, Constant, Unimplemented
+SIGCONT, Constant, Unimplemented
+SIGSTOP, Constant, Unimplemented
+SIGTSTP, Constant, Unimplemented
+SIGTTIN, Constant, Unimplemented
+SIGTTOU, Constant, Unimplemented
+SIGBUS, Constant, Implemented
+SIGRTMIN, Constant, Implemented
+SIGRTMAX, Constant, Implemented
+@end example
+
+NOTE: SIG_ERR is technically an extension to the C Library which is
+not documented anywhere else according to the index.
+@subsubsection Signal Generation and Delivery
+
+@example
+struct sigevent, Type, Implemented
+union sigval, Type, Implemented
+SIGEV_NONE, Constant, Implemented
+SIGEV_SIGNAL, Constant, Implemented
+SIGEV_THREAD, Constant, Implemented
+@end example
+
+@subsubsection Signal Actions
+
+@example
+siginfo_t, Type, Implemented
+SI_USER, Constant, Implemented
+SI_QUEUE, Constant, Implemented
+SI_TIMER, Constant, Implemented
+SI_ASYNCIO, Constant, Implemented
+SI_MESGQ, Constant, Implemented
+@end example
+
+@subsection Send a Signal to a Process
+
+@example
+kill(), Function, Implemented
+@end example
+
+@subsection Manipulate Signal Sets
+
+@example
+sigemptyset(), Function, Implemented
+sigfillset(), Function, Implemented
+sigaddset(), Function, Implemented
+sigdelset(), Function, Implemented
+sigismember(), Function, Implemented
+@end example
+
+@subsection Examine and Change Signal Action
+
+@example
+sigaction(), Function, Implemented
+sigaction, Type, Implemented
+SA_NOCLDSTOP, Constant, Implemented
+SA_SIGINFO, Constant, Implemented
+@end example
+
+@subsection Examine and Change Blocked Signals
+
+@example
+pthread_sigmask(), Function, Implemented
+sigprocmask(), Function, Implemented
+SIG_BLOCK, Constant, Implemented
+SIG_UNBLOCK, Constant, Implemented
+SIG_SETMASK, Constant, Implemented
+@end example
+
+@subsection Examine Pending Signals
+
+@example
+sigpending(), Function, Implemented
+@end example
+
+@subsection Wait for a Signal
+
+@example
+sigsuspend(), Function, Implemented
+@end example
+
+@subsection Synchronously Accept a Signal
+
+@example
+sigwait(), Function, Implemented
+sigwaitinfo(), Function, Implemented
+sigtimedwait(), Function, Implemented
+@end example
+
+@subsection Queue a Signal to a Process
+
+@example
+sigqueue(), Function, Implemented
+@end example
+
+@subsection Send a Signal to a Thread
+
+@example
+pthread_kill(), Function, Implemented
+@end example
+
+@section Timer Operations
+
+@subsection Schedule Alarm
+
+@example
+alarm(), Function, Implemented
+@end example
+
+@subsection Suspend Process Execution
+
+@example
+pause(), Function, Implemented
+@end example
+
+@subsection Delay Process Execution
+
+@example
+sleep(), Function, Implemented
+@end example
diff --git a/doc/posix1003.1/ch04.t b/doc/posix1003.1/ch04.t
new file mode 100644
index 0000000000..f8b3bd59a5
--- /dev/null
+++ b/doc/posix1003.1/ch04.t
@@ -0,0 +1,181 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Process Environment
+
+@section Process Identification
+
+@subsection Get Process and Parent Process IDs
+
+@example
+getpid(), Function, Implemented, SUSP Functionality
+getppid(), Function, Implemented, SUSP Functionality
+@end example
+
+@section User Identification
+
+@subsection Get Real User Effective User Real Group and Effective Group IDs
+
+@example
+getuid(), Function, Implemented, SUSP Functionality
+geteuid(), Function, Implemented, SUSP Functionality
+getgid(), Function, Implemented, SUSP Functionality
+getegid(), Function, Implemented, SUSP Functionality
+@end example
+
+@subsection Set User and Group IDs
+
+@example
+setuid(), Function, Implemented, SUSP Functionality
+setgid(), Function, Implemented, SUSP Functionality
+@end example
+
+@subsection Get Supplementary Group IDs
+
+@example
+getgroups(), Function, Implemented, SUSP Functionality
+@end example
+
+@subsection Get User Name
+
+@example
+getlogin(), Function, Implemented, SUSP Functionality
+getlogin_r(), Function, Implemented, SUSP Functionality
+@end example
+
+@section Process Groups
+
+@subsection Get Process Group ID
+
+@example
+getpgrp(), Function, Implemented, SUSP Functionality
+@end example
+
+@subsection Create Session and Set Process Group ID
+
+@example
+setsid(), Function, Implemented, SUSP Functionality
+@end example
+
+@subsection Set Process Group ID for Job Control
+
+@example
+setpgid(), Function, Dummy Implementation
+@end example
+
+@section System Identification
+
+@subsection Get System Name
+
+@example
+struct utsname, Type, Implemented
+uname(), Function, Implemented
+@end example
+
+@section Time
+
+@subsection Get System Time
+
+@example
+time(), Function, Implemented
+@end example
+
+@subsection Get Process Times
+
+@example
+struct tms, Type, Implemented
+times(), Function, Implemented
+@end example
+
+NOTE: @code{times} always returns 0 for tms_stime, tms_cutime, and
+tms_cstime fields of the @code{struct tms} returned.
+
+@section Environment Variables
+
+@subsection Environment Access
+
+@example
+getenv(), Function, Implemented
+@end example
+
+@section Terminal Identification
+
+@subsection Generate Terminal Pathname
+
+@example
+ctermid(), Function, Implemented
+@end example
+
+@subsection Determine Terminal Device Name
+
+@example
+ttyname(), Function, Implemented, untested
+ttyname_r(), Function, Implemented, untested
+isatty(), Function, Implemented
+@end example
+
+@section Configurable System Variables
+
+@subsection Get Configurable System Variables
+
+@example
+sysconf(), Function, Dummy Implementation
+_SC_AIO_LISTIO_MAX, Constant, Implemented
+_SC_AIO_MAX, Constant, Implemented
+_SC_AIO_PRIO_DELTA_MAX, Constant, Implemented
+_SC_ARG_MAX, Constant, Implemented
+_SC_CHILD_MAX, Constant, Implemented
+_SC_CLK_TCK, Constant, Implemented
+CLK_TCK, Constant, Implemented
+_SC_DELAYTIMER_MAX, Constant, Implemented
+_SC_GETGR_R_SIZE_MAX, Constant, Implemented
+_SC_GETPW_R_SIZE_MAX, Constant, Implemented
+_SC_LOGIN_NAME_MAX, Constant, Implemented
+_SC_MQ_OPEN_MAX, Constant, Implemented
+_SC_MQ_PRIO_MAX, Constant, Implemented
+_SC_NGROUPS_MAX, Constant, Implemented
+_SC_OPEN_MAX, Constant, Implemented
+_SC_PAGESIZE, Constant, Implemented
+_SC_RTSIG_MAX, Constant, Implemented
+_SC_SEM_NSEMS_MAX, Constant, Implemented
+_SC_SEM_VALUE_MAX, Constant, Implemented
+_SC_SIGQUEUE_MAX, Constant, Implemented
+_SC_STREAM_MAX, Constant, Implemented
+_SC_THREAD_DESTRUCTOR_ITERATIONS, Constant, Implemented
+_SC_THREAD_KEYS_MAX, Constant, Implemented
+_SC_THREAD_STACK_MIN, Constant, Implemented
+_SC_THREAD_THREADS_MAX, Constant, Implemented
+_SC_TIMER_MAX, Constant, Implemented
+_SC_TTY_NAME_MAX, Constant, Implemented
+_SC_TZNAME_MAX, Constant, Implemented
+_SC_ASYNCHRONOUS_IO, Constant, Implemented
+_SC_FSYNC, Constant, Implemented
+_SC_JOB_CONROL, Constant, Implemented
+_SC_MAPPED_FILES, Constant, Implemented
+_SC_MEMLOCK, Constant, Implemented
+_SC_MEMLOCK_RANGE, Constant, Implemented
+_SC_MEMORY_PROTECTION, Constant, Implemented
+_SC_MESSAGE_PASSING, Constant, Implemented
+_SC_PRIORITIZED_IO, Constant, Implemented
+_SC_PRIORITY_SCHEDULING, Constant, Unimplemented
+_SC_REALTIME_SIGNALS, Constant, Implemented
+_SC_SAVED_IDS, Constant, Implemented
+_SC_SEMAPHORES, Constant, Implemented
+_SC_SHARED_MEMORY_OBJECTS, Constant, Implemented
+_SC_SYNCHRONIZED_IO, Constant, Implemented
+_SC_TIMERS, Constant, Implemented
+_SC_THREADS, Constant, Implemented
+_SC_THREAD_ATTR_STACKADDR, Constant, Implemented
+_SC_THREAD_ATTR_STACKSIZE, Constant, Implemented
+_SC_THREAD_PRIORITY_SCHEDULING, Constant, Implemented
+_SC_THREAD_PRIO_INHERIT, Constant, Implemented
+_SC_THREAD_PRIO_PROTECT, Constant, Unimplemented
+_SC_THREAD_PROCESS_SHARED, Constant, Implemented
+_SC_THREAD_SAFE_FUNCTIONS, Constant, Implemented
+_SC_VERSION, Constant, Implemented
+@end example
diff --git a/doc/posix1003.1/ch05.t b/doc/posix1003.1/ch05.t
new file mode 100644
index 0000000000..fbd35aac03
--- /dev/null
+++ b/doc/posix1003.1/ch05.t
@@ -0,0 +1,222 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Files and Directories
+
+@section Directories
+
+@subsection Format of Directory Entries
+
+@subsection Directory Operations
+
+@example
+struct dirent, Type, Implemented
+opendir(), Function, Implemented
+readdir(), Function, Implemented
+readdir_r(), Function, Implemented
+rewinddir(), Function, Implemented
+closedir(), Function, Implemented
+@end example
+
+@section Working Directory
+
+@subsection Change Current Working Directory
+
+@example
+chdir(), Function, Implemented
+@end example
+
+@subsection Get Working Directory Pathname
+
+@example
+getcwd(), Function, Implemented
+@end example
+
+@section General File Creation
+
+@subsection Open a File
+
+@example
+open(), Function, Implemented
+O_RDONLY, Constant, Implemented
+O_WRONLY, Constant, Implemented
+O_RDWR, Constant, Implemented
+O_APPEND, Constant, Implemented
+O_CREAT, Constant, Implemented
+O_DSYNC, Constant, Unimplemented
+O_EXCL, Constant, Implemented
+O_NOCTTY, Constant, Implemented
+O_NONBLOCK, Constant, Implemented
+O_RSYNC, Constant, Unimplemented
+O_SYNC, Constant, Implemented
+O_TRUNC, Constant, Implemented
+@end example
+
+NOTE: In the newlib fcntl.h, O_SYNC is defined only if _POSIX_SOURCE is
+not defined. This seems wrong.
+
+@subsection Create a New File or Rewrite an Existing One
+
+@example
+creat(), Function, Implemented
+@end example
+
+@subsection Set File Creation Mask
+
+@example
+umask(), Function, Implemented
+@end example
+
+@subsection Link to a File
+
+@example
+link(), Function, Implemented
+@end example
+
+@section Special File Creation
+
+@subsection Make a Directory
+
+@example
+mkdir(), Function, Implemented
+@end example
+
+@subsection Make a FIFO Special File
+
+@example
+mkfifo(), Function, Untested Implementation
+@end example
+
+NOTE: mkfifo() is implemented but no filesystem supports FIFOs.
+
+@section File Removal
+
+@subsection Remove Directory Entries
+
+@example
+unlink(), Function, Implemented
+@end example
+
+@subsection Remove a Directory
+
+@example
+rmdir(), Function, Implemented
+@end example
+
+@subsection Rename a File
+
+@example
+rename(), Function, Implemented
+@end example
+
+@section File Characteristics
+
+@subsection File Characteristics Header and Data Structure
+
+@example
+struct stat, Type, Implemented
+@end example
+
+@subsubsection <sys/stat.h> File Types
+
+@example
+S_ISBLK(), Function, Implemented
+S_ISCHR(), Function, Implemented
+S_ISDIR(), Function, Implemented
+S_ISFIFO(), Function, Implemented
+S_ISREG(), Function, Implemented
+S_TYPEISMQ(), Function, Unimplemented
+S_TYPEISSEM(), Function, Unimplemented
+S_TYPEISSHM(), Function, Unimplemented
+@end example
+
+@subsubsection <sys/stat.h> File Modes
+
+@example
+S_IRWXU, Constant, Implemented
+S_IRUSR, Constant, Implemented
+S_IWUSR, Constant, Implemented
+S_IXUSR, Constant, Implemented
+S_IRWXG, Constant, Implemented
+S_IRGRP, Constant, Implemented
+S_IWGRP, Constant, Implemented
+S_IXGRP, Constant, Implemented
+S_IRWXO, Constant, Implemented
+S_IROTH, Constant, Implemented
+S_IWOTH, Constant, Implemented
+S_IXOTH, Constant, Implemented
+S_ISUID, Constant, Implemented
+S_ISGID, Constant, Implemented
+@end example
+
+@subsubsection <sys/stat.h> Time Entries
+
+@subsection Get File Status
+
+@example
+stat(), Function, Implemented
+fstat(), Function, Implemented
+@end example
+
+@subsection Check File Accessibility
+
+@example
+access(), Function, Implemented
+@end example
+
+@subsection Change File Modes
+
+@example
+chmod(), Function, Implemented
+fchmod(), Function, Implemented
+@end example
+
+@subsection Change Owner and Group of a File
+
+@example
+chown(), Function, Implemented
+@end example
+
+@subsection Set File Access and Modification Times
+
+@example
+struct utimbuf, Type, Implemented
+utime(), Function, Implemented
+@end example
+
+@subsection Truncate a File to a Specified Length
+
+@example
+ftruncate(), Function, Implemented
+@end example
+
+@section Configurable Pathname Variable
+
+@subsection Get Configurable Pathname Variables
+
+@example
+pathconf(), Function, Implemented
+fpathconf(), Function, Implemented
+_PC_LINK_MAX, Constant, Implemented
+_PC_MAX_CANON, Constant, Implemented
+_PC_MAX_INPUT, Constant, Implemented
+_PC_MAX_INPUT, Constant, Implemented
+_PC_NAME_MAX, Constant, Implemented
+_PC_PATH_MAX, Constant, Implemented
+_PC_PIPE_BUF, Constant, Implemented
+_PC_ASYNC_IO, Constant, Implemented
+_PC_CHOWN_RESTRICTED, Constant, Implemented
+_PC_NO_TRUNC, Constant, Implemented
+_PC_PRIO_IO, Constant, Implemented
+_PC_SYNC_IO, Constant, Implemented
+_PC_VDISABLE, Constant, Implemented
+@end example
+
+NOTE: The newlib unistd.h and sys/unistd.h are installed and the
+include search patch is used to get the right one. There are
+conflicts between the newlib unistd.h and RTEMS' version.
diff --git a/doc/posix1003.1/ch06.t b/doc/posix1003.1/ch06.t
new file mode 100644
index 0000000000..8a2191c359
--- /dev/null
+++ b/doc/posix1003.1/ch06.t
@@ -0,0 +1,175 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Input and Output Primitives
+
+@section Pipes
+
+@subsection Create an Inter-Process Channel
+
+@example
+pipe(), Function, Dummy Implementation
+@end example
+
+NOTE: pipe() returns ENOSYS.
+
+@section File Descriptor Manipulation
+
+@subsection Duplicate an Open File Descriptor
+
+@example
+dup(), Function, Implemented
+dup2(), Function, Implemented
+@end example
+
+@section File Descriptor Deassignment
+
+@subsection Close a File
+
+@example
+close(), Function, Implemented
+@end example
+
+@section Input and Output
+
+@subsection Read from a File
+
+@example
+read(), Function, Implemented
+@end example
+
+@subsection Write to a File
+
+@example
+write(), Function, Implemented
+@end example
+
+@section Control Operations on Files
+
+@subsection Data Definitions for File Control Operations
+
+@subsection File Control
+
+@example
+struct flock, Type, Implemented
+fcntl(), Function, Implemented
+F_DUPFD, Constant, Implemented
+F_GETFD, Constant, Implemented
+F_GETLK, Constant, Implemented
+F_SETFD, Constant, Implemented
+F_GETFL, Constant, Implemented
+F_SETFL, Constant, Implemented
+F_SETLK, Constant, Implemented
+F_SETLKW, Constant, Implemented
+FD_CLOEXEC, Constant, Implemented
+F_RDLCK, Constant, Implemented
+F_UNLCK, Constant, Implemented
+F_WRLCK, Constant, Implemented
+O_ACCMODE, Constant, Implemented
+@end example
+
+NOTE: A number of constants are used by both @code{open} and @code{fcntl}.
+@code{O_CREAT}, @code{O_EXCL}, @code{O_NOCTTY}, @code{O_TRUNC},
+@code{O_APPEND}, @code{O_DSYNC}, @code{O_NONBLOCK}, @code{O_RSYNC},
+@code{O_SYNC}, @code{O_RDONLY}, @code{O_RDWR}, and @code{O_WRONLY}
+are also included in another section. @xref{Open a File}.
+
+@subsection Reposition Read/Write File Offset
+
+@example
+lseek(), Function, Implemented
+SEEK_SET, Constant, Implemented
+SEEK_CUR, Constant, Implemented
+SEEK_END, Constant, Implemented
+@end example
+
+@section File Synchronization
+
+@subsection Synchronize the State of a File
+
+@example
+fsync(), Function, Implemented
+@end example
+
+@subsection Synchronize the Data of a File
+
+@example
+fdatasync(), Function, Implemented
+@end example
+
+@section Asynchronous Input and Output
+
+@subsection Data Definitions for Asynchronous Input and Output
+
+@subsubsection Asynchronous I/O Control Block
+
+@example
+struct aiocb, Type, Untested Implementation
+@end example
+
+@subsubsection Asynchronous I/O Manifest Constants
+
+@example
+AIO_CANCELED, Constant, Implemented
+AIO_NOTCANCELED, Constant, Implemented
+AIO_ALLDONE, Constant, Implemented
+LIO_WAIT, Constant, Implemented
+LIO_NOWAIT, Constant, Implemented
+LIO_READ, Constant, Implemented
+LIO_WRITE, Constant, Implemented
+LIO_NOP, Constant, Implemented
+@end example
+
+@subsection Asynchronous Read
+
+@example
+aio_read(), Function, Dummy Implementation
+@end example
+
+@subsection Asynchronous Write
+
+@example
+aio_write(), Function, Dummy Implementation
+@end example
+
+@subsection List Directed I/O
+
+@example
+lio_listio(), Function, Dummy Implementation
+@end example
+
+@subsection Retrieve Error Status of Asynchronous I/O Operation
+
+@example
+aio_error(), Function, Dummy Implementation
+@end example
+
+@subsection Retrieve Return Status of Asynchronous I/O Operation
+
+@example
+aio_return(), Function, Dummy Implementation
+@end example
+
+@subsection Cancel Asynchronous I/O Request
+
+@example
+aio_cancel(), Function, Dummy Implementation
+@end example
+
+@subsection Wait for Asynchronous I/O Request
+
+@example
+aio_suspend(), Function, Dummy Implementation
+@end example
+
+@subsection Asynchronous File Synchronization
+
+@example
+aio_fsync(), Function, Dummy Implementation
+@end example
+
diff --git a/doc/posix1003.1/ch07.t b/doc/posix1003.1/ch07.t
new file mode 100644
index 0000000000..96fa0077e7
--- /dev/null
+++ b/doc/posix1003.1/ch07.t
@@ -0,0 +1,207 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Device- and Class-Specific Functions
+
+@section General Terminal Interface
+
+@subsection Interface Characteristics
+
+@subsubsection Opening a Terminal Device File
+
+@subsubsection Process Groups (TTY)
+
+@subsubsection The Controlling Terminal
+
+@subsubsection Terminal Access Control
+
+@subsubsection Input Processing and Reading Data
+
+@subsubsection Canonical Mode Input Processing
+
+@subsubsection Noncanonical Mode Input Processing
+
+@itemize
+
+@item Case A - MIN > 0 and TIME > 0
+
+@item Case B - MIN > 0 and TIME = 0
+
+@item Case C - MIN = 0 and TIME > 0
+
+@item Case D - MIN = 0 and TIME = 0
+
+@end itemize
+
+@subsubsection Writing Data and Output Processing
+
+@subsubsection Special Characters
+
+@example
+INTR, Constant, Implemented
+QUIT, Constant, Implemented
+ERASE, Constant, Implemented
+KILL, Constant, Implemented
+EOF, Constant, Implemented
+NL, Constant, Implemented
+EOL, Constant, Implemented
+SUSP, Constant, Implemented
+STOP, Constant, Implemented
+START, Constant, Implemented
+CR, Constant, Implemented
+@end example
+
+@subsubsection Modem Disconnect
+
+@subsubsection Closing a Terminal Device File
+
+@subsection Parameters That Can Be Set
+
+@subsubsection termios Structure
+
+@example
+tcflag_t, Type, Implemented
+cc_t, Type, Implemented
+struct termios, Type, Implemented
+@end example
+
+@subsubsection Input Modes
+
+@example
+BRKINT, Constant, Implemented
+ICRNL, Constant, Implemented
+IGNBREAK, Constant, Unimplemented
+IGNCR, Constant, Implemented
+IGNPAR, Constant, Implemented
+INLCR, Constant, Implemented
+INPCK, Constant, Implemented
+ISTRIP, Constant, Implemented
+IXOFF, Constant, Implemented
+IXON, Constant, Implemented
+PARMRK, Constant, Implemented
+@end example
+
+@subsubsection Output Modes
+
+@example
+OPOST, Constant, Implemented
+@end example
+
+@subsubsection Control Modes
+
+@example
+CLOCAL, Constant, Implemented
+CREAD, Constant, Implemented
+CSIZE, Constant, Implemented
+CS5, Constant, Implemented
+CS6, Constant, Implemented
+CS7, Constant, Implemented
+CS8, Constant, Implemented
+CSTOPB, Constant, Implemented
+HUPCL, Constant, Implemented
+PARENB, Constant, Implemented
+PARODD, Constant, Implemented
+@end example
+
+@subsubsection Local Modes
+
+@example
+ECHO, Constant, Implemented
+ECHOE, Constant, Implemented
+ECHOK, Constant, Implemented
+ECHONL, Constant, Implemented
+ICANON, Constant, Implemented
+IEXTEN, Constant, Implemented
+ISIG, Constant, Implemented
+NOFLSH, Constant, Implemented
+TOSTOP, Constant, Implemented
+@end example
+
+@subsubsection Special Control Characters
+
+@example
+VEOF, Constant, Implemented
+VEOL, Constant, Implemented
+VERASE, Constant, Implemented
+VINTR, Constant, Implemented
+VKILL, Constant, Implemented
+VQUIT, Constant, Implemented
+VSUSP, Constant, Implemented
+VSTART, Constant, Implemented
+VSTOP, Constant, Implemented
+VMIN, Constant, Implemented
+VTIME, Constant, Implemented
+@end example
+
+@subsection Baud Rate Values
+
+@example
+B0, Constant, Implemented
+B50, Constant, Implemented
+B75, Constant, Implemented
+B110, Constant, Implemented
+B134, Constant, Implemented
+B150, Constant, Implemented
+B200, Constant, Implemented
+B300, Constant, Implemented
+B600, Constant, Implemented
+B1200, Constant, Implemented
+B1800, Constant, Implemented
+B2400, Constant, Implemented
+B4800, Constant, Implemented
+B9600, Constant, Implemented
+B19200, Constant, Implemented
+B38400, Constant, Implemented
+@end example
+
+@subsubsection Baud Rate Functions
+
+@example
+cfgetospeed(), Function, Implemented
+cfsetospeed(), Function, Implemented
+cfgetispeed(), Function, Implemented
+cfsetispeed(), Function, Implemented
+TCIFLUSH, Constant, Implemented
+TCOFLUSH, Constant, Implemented
+TCIOFLUSH, Constant, Implemented
+TCOOFF, Constant, Implemented
+TCOON, Constant, Implemented
+TCIOOFF, Constant, Implemented
+TCIOON, Constant, Implemented
+@end example
+
+@section General Terminal Interface Control Functions
+
+@subsection Get and Set State
+
+@example
+tcgetattr(), Function, Implemented
+tcsetattr(), Function, Implemented
+@end example
+
+@subsection Line Control Functions
+
+@example
+tcsendbreak(), Function, Dummy Implementation
+tcdrain(), Function, Implemented
+tcflush(), Function, Dummy Implementation
+tcflow(), Function, Dummy Implementation
+@end example
+
+@subsection Get Foreground Process Group ID
+
+@example
+tcgetprgrp(), Function, Implemented, SUSP
+@end example
+
+@subsection Set Foreground Process Group ID
+
+@example
+tcsetprgrp(), Function, Dummy Implementation
+@end example
+
diff --git a/doc/posix1003.1/ch08.t b/doc/posix1003.1/ch08.t
new file mode 100644
index 0000000000..caeb6b3871
--- /dev/null
+++ b/doc/posix1003.1/ch08.t
@@ -0,0 +1,288 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Language-Specific Services for the C Programming Language
+
+@section Referenced C Language Routines
+
+ANSI C Section 4.2 --- Diagnostics
+
+@example
+assert(), Function, Implemented
+@end example
+
+ANSI C Section 4.3 --- Character Handling
+
+@example
+isalnum(), Function, Implemented
+isalpha(), Function, Implemented
+iscntrl(), Function, Implemented
+isdigit(), Function, Implemented
+isgraph(), Function, Implemented
+islower(), Function, Implemented
+isprint(), Function, Implemented
+ispunct(), Function, Implemented
+isspace(), Function, Implemented
+isupper(), Function, Implemented
+isxdigit(), Function, Implemented
+tolower(), Function, Implemented
+toupper(), Function, Implemented
+@end example
+
+ANSI C Section 4.4 --- Localization
+
+@example
+setlocale(), Function, Implemented
+@end example
+
+ANSI C Section 4.5 --- Mathematics
+
+@example
+acos(), Function, Implemented
+asin(), Function, Implemented
+atan(), Function, Implemented
+atan2(), Function, Implemented
+cos(), Function, Implemented
+sin(), Function, Implemented
+tan(), Function, Implemented
+cosh(), Function, Implemented
+sinh(), Function, Implemented
+tanh(), Function, Implemented
+exp(), Function, Implemented
+frexp(), Function, Implemented
+ldexp(), Function, Implemented
+log(), Function, Implemented
+log10(), Function, Implemented
+modf(), Function, Implemented
+pow(), Function, Implemented
+sqrt(), Function, Implemented
+ceil(), Function, Implemented
+fabs(), Function, Implemented
+floor(), Function, Implemented
+fmod(), Function, Implemented
+@end example
+
+ANSI C Section 4.6 --- Non-Local Jumps
+
+@example
+setjmp(), Function, Implemented
+longjmp(), Function, Implemented
+@end example
+
+ANSI C Section 4.9 --- Input/Output
+
+@example
+FILE, Type, Implemented
+clearerr(), Function, Implemented
+fclose(), Function, Implemented
+feof(), Function, Implemented
+ferror(), Function, Implemented
+fflush(), Function, Implemented
+fgetc(), Function, Implemented
+fgets(), Function, Implemented
+fopen(), Function, Implemented
+fputc(), Function, Implemented
+fputs(), Function, Implemented
+fread(), Function, Implemented
+freopen(), Function, Implemented
+fseek(), Function, Implemented
+ftell(), Function, Implemented
+fwrite(), Function, Implemented
+getc(), Function, Implemented
+getchar(), Function, Implemented
+gets(), Function, Implemented
+perror(), Function, Implemented
+printf(), Function, Implemented
+fprintf(), Function, Implemented
+sprintf(), Function, Implemented
+putc(), Function, Implemented
+putchar(), Function, Implemented
+puts(), Function, Implemented
+remove(), Function, Implemented
+rewind(), Function, Implemented
+scanf(), Function, Implemented
+fscanf(), Function, Implemented
+sscanf(), Function, Implemented
+setbuf(), Function, Implemented
+tmpfile(), Function, Implemented
+tmpnam(), Function, Implemented
+ungetc(), Function, Implemented
+@end example
+
+NOTE: @code{rename} is also included in another section. @ref{Rename a File}.
+
+ANSI C Section 4.10 --- General Utilities
+
+@example
+abs(), Function, Implemented
+atof(), Function, Implemented
+atoi(), Function, Implemented
+atol(), Function, Implemented
+rand(), Function, Implemented
+srand(), Function, Implemented
+calloc(), Function, Implemented
+free(), Function, Implemented
+malloc(), Function, Implemented
+realloc(), Function, Implemented
+abort(), Function, Implemented
+exit(), Function, Implemented
+bsearch(), Function, Implemented
+qsort(), Function, Implemented
+@end example
+
+NOTE: @code{getenv} is also included in another section.
+@ref{Environment Access}.
+
+ANSI C Section 4.11 --- String Handling
+
+@example
+strcpy(), Function, Implemented
+strncpy(), Function, Implemented
+strcat(), Function, Implemented
+strncat(), Function, Implemented
+strcmp(), Function, Implemented
+strncmp(), Function, Implemented
+strchr(), Function, Implemented
+strcspn(), Function, Implemented
+strpbrk(), Function, Implemented
+strrchr(), Function, Implemented
+strspn(), Function, Implemented
+strstr(), Function, Implemented
+strtok(), Function, Implemented
+strlen(), Function, Implemented
+@end example
+
+ANSI C Section 4.12 --- Date and Time Handling
+
+@example
+asctime(), Function, Implemented
+ctime(), Function, Implemented
+gmtime(), Function, Implemented
+localtime(), Function, Implemented
+mktime(), Function, Implemented
+strftime(), Function, Implemented
+@end example
+
+NOTE: RTEMS has no notion of time zones.
+
+NOTE: @code{time} is also included in another section.
+@ref{Get System Time}.
+
+From Surrounding Text
+
+@example
+EXIT_SUCCESS, Constant, Implemented
+EXIT_FAILURE, Constant, Implemented
+@end example
+
+
+@subsection Extensions to Time Functions
+
+@subsection Extensions to setlocale Function
+
+@example
+LC_CTYPE, Constant, Implemented
+LC_COLLATE, Constant, Implemented
+LC_TIME, Constant, Implemented
+LC_NUMERIC, Constant, Implemented
+LC_MONETARY, Constant, Implemented
+LC_ALL, Constant, Implemented
+@end example
+
+@section C Language Input/Output Functions
+
+@subsection Map a Stream Pointer to a File Descriptor
+
+@example
+fileno(), Function, Implemented
+STDIN_FILENO, Constant, Implemented
+STDOUT_FILENO, Constant, Implemented
+STDERR_FILENO, Constant, Implemented
+@end example
+
+@subsection Open a Stream on a File Descriptor
+
+@example
+fdopen(), Function, Implemented
+@end example
+
+@subsection Interactions of Other FILE-Type C Functions
+
+@subsection Operations on Files - the remove Function
+
+@subsection Temporary File Name - the tmpnam Function
+
+@subsection Stdio Locking Functions
+
+@example
+flockfile(), Function, Unimplemented
+ftrylockfile(), Function, Unimplemented
+funlockfile(), Function, Unimplemented
+@end example
+
+@subsection Stdio With Explicit Client Locking
+
+@example
+getc_unlocked(), Function, Unimplemented
+getchar_unlocked(), Function, Unimplemented
+putc_unlocked(), Function, Unimplemented
+putchar_unlocked(), Function, Unimplemented
+@end example
+
+@section Other C Language Functions
+
+@subsection Nonlocal Jumps
+
+@example
+sigjmp_buf, Type, Implemented
+sigsetjmp(), Function, Implemented
+siglongjmp(), Function, Implemented
+@end example
+
+@subsection Set Time Zone
+
+@example
+tzset(), Function, Unimplemented
+@end example
+
+@subsection Find String Token
+
+@example
+strtok_r(), Function, Implemented
+@end example
+
+@subsection ASCII Time Representation
+
+@example
+asctime_r(), Function, Implemented
+@end example
+
+@subsection Current Time Representation
+
+@example
+ctime_r(), Function, Implemented
+@end example
+
+@subsection Coordinated Universal Time
+
+@example
+gmtime_r(), Function, Implemented
+@end example
+
+@subsection Local Time
+
+@example
+localtime_r(), Function, Implemented
+@end example
+
+@subsection Pseudo-Random Sequence Generation Functions
+
+@example
+rand_r(), Function, Implemented
+@end example
+
diff --git a/doc/posix1003.1/ch09.t b/doc/posix1003.1/ch09.t
new file mode 100644
index 0000000000..3f757085b5
--- /dev/null
+++ b/doc/posix1003.1/ch09.t
@@ -0,0 +1,38 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter System Databases
+
+@section System Databases Section
+
+@section Database Access
+
+@subsection Group Database Access
+
+@example
+struct group, Type, Implemented
+getgrgid(), Function, Implemented
+getgrgid_r(), Function, Implemented
+getgrname(), Function, Implemented
+getgrnam_r(), Function, Implemented
+@end example
+
+NOTE: Creates /etc/group if none exists.
+
+@subsection User Database Access
+
+@example
+struct passwd, Type, Implemented
+getpwuid(), Function, Implemented
+getpwuid_r(), Function, Implemented
+getpwnam(), Function, Implemented
+getpwnam_r(), Function, Implemented
+@end example
+
+NOTE: Creates /etc/passwd if none exists.
+
diff --git a/doc/posix1003.1/ch10.t b/doc/posix1003.1/ch10.t
new file mode 100644
index 0000000000..4041f6d7c2
--- /dev/null
+++ b/doc/posix1003.1/ch10.t
@@ -0,0 +1,68 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Data Interchange Format
+
+@section Archive/Interchange File Format
+
+@subsection Extended tar Format
+
+@example
+tar format, Type, Unimplemented
+TMAGIC, Constant, Unimplemented
+TMAGLEN, Constant, Unimplemented
+TVERSION, Constant, Unimplemented
+TVERSLEN, Constant, Unimplemented
+REGTYPE, Constant, Unimplemented
+AREGTYPE, Constant, Unimplemented
+LNKTYPE, Constant, Unimplemented
+SYMTYPE, Constant, Unimplemented
+CHRTYPE, Constant, Unimplemented
+BLKTYPE, Constant, Unimplemented
+DIRTYPE, Constant, Unimplemented
+FIFOTYPE, Constant, Unimplemented
+CONTTYPE, Constant, Unimplemented
+TSUID, Constant, Unimplemented
+TSGID, Constant, Unimplemented
+TSVTX, Constant, Unimplemented
+TUREAD, Constant, Unimplemented
+TUWRITE, Constant, Unimplemented
+TUEXEC, Constant, Unimplemented
+TGREAD, Constant, Unimplemented
+TGWRITE, Constant, Unimplemented
+TGEXEC, Constant, Unimplemented
+TOREAD, Constant, Unimplemented
+TOWRITE, Constant, Unimplemented
+TOEXEC, Constant, Unimplemented
+@end example
+
+NOTE: Requires <tar.h> which is not in newlib.
+
+@subsection Extended cpio Format
+
+@example
+cpio format, Type, Unimplemented
+C_IRUSER, Constant, Unimplemented
+C_IWUSER, Constant, Unimplemented
+C_IXUSER, Constant, Unimplemented
+C_IRGRP, Constant, Unimplemented
+C_IWGRP, Constant, Unimplemented
+C_IXGRP, Constant, Unimplemented
+C_IROTH, Constant, Unimplemented
+C_IWOTH, Constant, Unimplemented
+C_IXOTH, Constant, Unimplemented
+C_ISUID, Constant, Unimplemented
+C_ISGID, Constant, Unimplemented
+C_ISVTX, Constant, Unimplemented
+@end example
+
+NOTE: POSIX does not require a header file or structure. RedHat Linux
+5.0 does not have a <cpio.h> although Solaris 2.6 does.
+
+@subsection Multiple Volumes
+
diff --git a/doc/posix1003.1/ch11.t b/doc/posix1003.1/ch11.t
new file mode 100644
index 0000000000..a54a914c7e
--- /dev/null
+++ b/doc/posix1003.1/ch11.t
@@ -0,0 +1,133 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Synchronization
+
+@section Semaphore Characteristics
+
+NOTE: Semaphores are implemented but only unnamed semaphores
+are currently tested.
+
+@example
+sem_t, Type, Implemented
+@end example
+
+@section Semaphore Functions
+
+@subsection Initialize an Unnamed Semaphore
+
+@example
+sem_init(), Function, Implemented
+SEM_FAILED, Constant, Implemented
+@end example
+
+@subsection Destroy an Unnamed Semaphore
+
+@example
+sem_destroy(), Function, Implemented
+@end example
+
+@subsection Initialize/Open a Named Semaphore
+
+@example
+sem_open(), Function, Implemented
+@end example
+
+@subsection Close a Named Semaphore
+
+@example
+sem_close(), Function, Implemented
+@end example
+
+@subsection Remove a Named Semaphore
+
+@example
+sem_unlink(), Function, Implemented
+@end example
+
+@subsection Lock a Semaphore
+
+@example
+sem_wait(), Function, Implemented
+sem_trywait(), Function, Implemented
+@end example
+
+@subsection Unlock a Semaphore
+
+@example
+sem_post(), Function, Implemented
+@end example
+
+@subsection Get the Value of a Semaphore
+
+@example
+sem_getvalue(), Function, Implemented
+@end example
+
+@section Mutexes
+
+@subsection Mutex Initialization Attributes
+
+@example
+pthread_mutexattr_init(), Function, Implemented
+pthread_mutexattr_destroy(), Function, Implemented
+pthread_mutexattr_getpshared(), Function, Implemented
+pthread_mutexattr_setpshared(), Function, Implemented
+PTHREAD_PROCESS_SHARED, Constant, Implemented
+PTHREAD_PROCESS_PRIVATE, Constant, Implemented
+@end example
+
+@subsection Initializing and Destroying a Mutex
+
+@example
+pthread_mutex_init(), Function, Implemented
+pthread_mutex_destroy(), Function, Implemented
+PTHREAD_MUTEX_INITIALIZER, Constant, Implemented
+@end example
+
+@subsection Locking and Unlocking a Mutex
+
+@example
+pthread_mutex_lock(), Function, Implemented
+pthread_mutex_trylock(), Function, Implemented
+pthread_mutex_unlock(), Function, Implemented
+@end example
+
+@section Condition Variables
+
+@subsection Condition Variable Initialization Attributes
+
+@example
+pthread_condattr_init(), Function, Implemented
+pthread_condattr_destroy(), Function, Implemented
+pthread_condattr_getpshared(), Function, Implemented
+pthread_condattr_setpshared(), Function, Implemented
+@end example
+
+@subsection Initialization and Destroying Condition Variables
+
+@example
+pthread_cond_init(), Function, Implemented
+pthread_cond_destroy(), Function, Implemented
+PTHREAD_COND_INITIALIZER, Constant, Implemented
+@end example
+
+@subsection Broadcasting and Signaling a Condition
+
+@example
+pthread_cond_signal(), Function, Implemented
+pthread_cond_broadcast(), Function, Implemented
+@end example
+
+@subsection Waiting on a Condition
+
+@example
+pthread_cond_wait(), Function, Implemented
+pthread_cond_timedwait(), Function, Implemented
+@end example
+
diff --git a/doc/posix1003.1/ch12.t b/doc/posix1003.1/ch12.t
new file mode 100644
index 0000000000..f9944f44ba
--- /dev/null
+++ b/doc/posix1003.1/ch12.t
@@ -0,0 +1,77 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Memory Management
+
+@section Memory Locking Functions
+
+@subsection Lock/Unlock the Address Space of a Process
+
+@example
+mlockall(), Function, Unimplemented
+munlockall(), Function, Unimplemented
+MCL_CURRENT, Constant, Unimplemented
+MCL_FUTURE, Constant, Unimplemented
+@end example
+
+@subsection Lock/Unlock a Rand of Process Address Space
+
+@example
+mlock(), Function, Unimplemented
+munlock(), Function, Unimplemented
+@end example
+
+@section Memory Mapping Functions
+
+@subsection Map Process Addresses to a Memory Object
+
+@example
+mmap(), Function, Unimplemented
+PROT_READ, Constant, Unimplemented
+PROT_WRITE, Constant, Unimplemented
+PROT_EXEC, Constant, Unimplemented
+PROT_NONE, Constant, Unimplemented
+MAP_SHARED, Constant, Unimplemented
+MAP_PRIVATE, Constant, Unimplemented
+MAP_FIXED, Constant, Unimplemented
+@end example
+
+@subsection Unmap Previously Mapped Addresses
+
+@example
+munmap(), Function, Unimplemented
+@end example
+
+@subsection Change Memory Protection
+
+@example
+mprotect(), Function, Unimplemented
+@end example
+
+@subsection Memory Object Synchronization
+
+@example
+msync(), Function, Unimplemented, Unimplemented
+MS_ASYNC, Constant, Unimplemented
+MS_SYNC, Constant, Unimplemented
+MS_INVALIDATE, Constant, Unimplemented
+@end example
+
+@section Shared Memory Functions
+
+@subsection Open a Shared Memory Object
+
+@example
+shm_open(), Function, Unimplemented
+@end example
+
+@subsection Remove a Shared Memory Object
+
+@example
+shm_unlink(), Function, Unimplemented
+@end example
diff --git a/doc/posix1003.1/ch13.t b/doc/posix1003.1/ch13.t
new file mode 100644
index 0000000000..dfb83202cb
--- /dev/null
+++ b/doc/posix1003.1/ch13.t
@@ -0,0 +1,132 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Execution Scheduling
+
+@section Scheduling Parameters
+
+@example
+struct sched_param, Type, Implemented
+@end example
+
+@section Scheduling Policies
+
+@example
+SCHED_FIFO, Constant, Implemented
+SCHED_RR, Constant, Implemented
+SCHED_OTHER, Constant, Implemented
+@end example
+
+NOTE: RTEMS adds SCHED_SPORADIC.
+
+@subsection SCHED_FIFO
+
+@subsection SCHED_RR
+
+@subsection SCHED_OTHER
+
+@section Process Scheduling Functions
+
+@subsection Set Scheduling Parameters
+
+@example
+sched_setparam(), Function, Dummy Implementation
+@end example
+
+@subsection Get Scheduling Parameters
+
+@example
+sched_getparam(), Function, Dummy Implementation
+@end example
+
+@subsection Set Scheduling Policy and Scheduling Parameters
+
+@example
+sched_setscheduler(), Function, Dummy Implementation
+@end example
+
+@subsection Get Scheduling Policy
+
+@example
+sched_getscheduler(), Function, Dummy Implementation
+@end example
+
+@subsection Yield Processor
+
+@example
+sched_yield(), Function, Implemented
+@end example
+
+@subsection Get Scheduling Parameter Limits
+
+@example
+sched_get_priority_max(), Function, Implemented
+sched_get_priority_min(), Function, Implemented
+sched_get_priority_rr_get_interval(), Function, Implemented
+@end example
+
+@section Thread Scheduling
+
+@subsection Thread Scheduling Attributes
+
+@example
+PTHREAD_SCOPE_PROCESS, Constant, Implemented
+PTHREAD_SCOPE_SYSTEM, Constant, Implemented
+@end example
+
+@subsection Scheduling Contention Scope
+
+@subsection Scheduling Allocation Domain
+
+@subsection Scheduling Documentation
+
+@section Thread Scheduling Functions
+
+@subsection Thread Creation Scheduling Attributes
+
+@example
+pthread_attr_setscope(), Function, Implemented
+pthread_attr_getscope(), Function, Implemented
+pthread_attr_setinheritsched(), Function, Implemented
+pthread_attr_getinheritsched(), Function, Implemented
+pthread_attr_setschedpolicy(), Function, Implemented
+pthread_attr_getschedpolicy(), Function, Implemented
+pthread_attr_setschedparam(), Function, Implemented
+pthread_attr_getschedparam(), Function, Implemented
+PTHREAD_INHERIT_SCHED, Constant, Implemented
+PTHREAD_EXPLICIT_SCHED, Constant, Implemented
+@end example
+
+@subsection Dynamic Thread Scheduling Parameters Access
+
+@example
+pthread_setschedparam(), Function, Implemented
+pthread_getschedparam(), Function, Implemented
+@end example
+
+@section Synchronization Scheduling
+
+@subsection Mutex Initialization Scheduling Attributes
+
+@example
+pthread_mutexattr_setprotocol(), Function, Implemented
+pthread_mutexattr_getprotocol(), Function, Implemented
+pthread_mutexattr_setprioceiling(), Function, Implemented
+pthread_mutexattr_getprioceiling(), Function, Implemented
+PTHREAD_PRIO_NONE, Constant, Implemented
+PTHREAD_PRIO_INHERIT, Constant, Implemented
+PTHREAD_PRIO_PROTECT, Constant, Implemented
+@end example
+
+@subsection Change the Priority Ceiling of a Mutex
+
+@example
+pthread_mutex_setprioceiling(), Function, Implemented
+pthread_mutex_getprioceiling(), Function, Implemented
+@end example
+
diff --git a/doc/posix1003.1/ch14.t b/doc/posix1003.1/ch14.t
new file mode 100644
index 0000000000..5ec0898313
--- /dev/null
+++ b/doc/posix1003.1/ch14.t
@@ -0,0 +1,71 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Clocks and Timers
+
+@section Data Definitions for Clocks and Timers
+
+@subsection Time Value Specification Structures
+
+@example
+struct timespec, Type, Implemented
+struct itimerspec, Type, Implemented
+@end example
+
+@subsection Timer Event Notification Control Block
+
+@subsection Type Definitions
+
+@example
+clockid_t, Type, Implemented
+timerid_t, Type, Implemented
+@end example
+
+@subsection Timer Event Notification Manifest Constants
+
+@example
+CLOCK_REALTIME, Constant, Implemented
+TIMER_ABSTIME, Constant, Implemented
+@end example
+
+@section Clock and Timer Functions
+
+@subsection Clocks
+
+@example
+clock_settime(), Function, Partial Implementation
+clock_gettime(), Function, Partial Implementation
+clock_getres(), Function, Implemented
+@end example
+
+@subsection Create a Per-Process Timer
+
+@example
+timer_create(), Function, Implemented
+@end example
+
+@subsection Delete a Per-Process Timer
+
+@example
+timer_delete(), Function, Implemented
+@end example
+
+@subsection Per-Process Timers
+
+@example
+timer_settime(), Function, Implemented
+timer_gettime(), Function, Implemented
+timer_getoverrun(), Function, Implemented
+@end example
+
+@subsection High Resolution Sleep
+
+@example
+nanosleep(), Function, Implemented
+@end example
+
diff --git a/doc/posix1003.1/ch15.t b/doc/posix1003.1/ch15.t
new file mode 100644
index 0000000000..6907553449
--- /dev/null
+++ b/doc/posix1003.1/ch15.t
@@ -0,0 +1,72 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Message Passing
+
+@section Data Definitions for Message Queues
+
+@subsection Data Structures
+
+NOTE: Semaphores are implemented but only unnamed semaphores
+are currently tested.
+
+@example
+mqd_t, Type, Implemented
+struct mq_attr, Type, Implemented
+@end example
+
+@section Message Passing Functions
+
+@subsection Open a Message Queue
+
+@example
+mq_open(), Function, Implemented
+@end example
+
+@subsection Close a Message Queue
+
+@example
+mq_close(), Function, Implemented
+@end example
+
+@subsection Remove a Message Queue
+
+@example
+mq_unlink(), Function, Implemented
+@end example
+
+@subsection Send a Message to a Message Queue
+
+@example
+mq_send(), Function, Implemented
+@end example
+
+@subsection Receive a Message From a Message Queue
+
+@example
+mq_receive(), Function, Implemented
+@end example
+
+@subsection Notify Process That a Message is Available on a Queue
+
+@example
+mq_notify(), Function, Implemented
+@end example
+
+@subsection Set Message Queue Attributes
+
+@example
+mq_setattr(), Function, Implemented
+@end example
+
+@subsection Get Message Queue Attributes
+
+@example
+mq_getattr(), Function, Implemented
+@end example
+
diff --git a/doc/posix1003.1/ch16.t b/doc/posix1003.1/ch16.t
new file mode 100644
index 0000000000..e139cea95c
--- /dev/null
+++ b/doc/posix1003.1/ch16.t
@@ -0,0 +1,72 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Thread Management
+
+@section Threads
+
+@section Thread Functions
+
+@subsection Thread Creation Attributes
+
+@example
+pthread_attr_init(), Function, Implemented
+pthread_attr_destroy(), Function, Implemented
+pthread_attr_setstacksize(), Function, Implemented
+pthread_attr_getstacksize(), Function, Implemented
+pthread_attr_setstackaddr(), Function, Implemented
+pthread_attr_getstackaddr(), Function, Implemented
+pthread_attr_setdetachstate(), Function, Implemented
+pthread_attr_getdetachstate(), Function, Implemented
+PTHREAD_CREATE_JOINABLE, Constant, Implemented
+PTHREAD_CREATE_DETACHED, Constant, Implemented
+@end example
+
+@subsection Thread Creation
+
+@example
+pthread_create(), Function, Implemented
+@end example
+
+@subsection Wait for Thread Termination
+
+@example
+pthread_join(), Function, Implemented
+@end example
+
+@subsection Detaching a Thread
+
+@example
+pthread_detach(), Function, Implemented
+@end example
+
+@subsection Thread Termination
+
+@example
+pthread_exit(), Function, Implemented
+@end example
+
+@subsection Get Thread ID
+
+@example
+pthread_self(), Function, Implemented
+@end example
+
+@subsection Compare Thread IDs
+
+@example
+pthread_equal(), Function, Implemented
+@end example
+
+@subsection Dynamic Package Initialization
+
+@example
+pthread_once(), Function, Implemented
+PTHREAD_ONCE_INIT, Constant, Implemented
+@end example
+
diff --git a/doc/posix1003.1/ch17.t b/doc/posix1003.1/ch17.t
new file mode 100644
index 0000000000..a4efa89db0
--- /dev/null
+++ b/doc/posix1003.1/ch17.t
@@ -0,0 +1,31 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Thread-Specific Data
+
+@section Thread-Specific Data Functions
+
+@subsection Thread-Specific Data Key Creation
+
+@example
+pthread_key_create(), Function, Implemented
+@end example
+
+@subsection Thread-Specific Data Management
+
+@example
+pthread_key_setspecific(), Function, Implemented
+pthread_key_getspecific(), Function, Implemented
+@end example
+
+@subsection Thread-Specific Data Key Deletion
+
+@example
+pthread_key_delete(), Function, Implemented
+@end example
+
diff --git a/doc/posix1003.1/ch18.t b/doc/posix1003.1/ch18.t
new file mode 100644
index 0000000000..f2a8c2a506
--- /dev/null
+++ b/doc/posix1003.1/ch18.t
@@ -0,0 +1,66 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Thread Cancellation
+
+@section Thread Cancellation Overview
+
+@subsection Cancelability States
+
+@example
+PTHREAD_CANCEL_DISABLE, Constant, Implemented
+PTHREAD_CANCEL_ENABLE, Constant, Implemented
+PTHREAD_CANCEL_ASYNCHRONOUS, Constant, Implemented
+PTHREAD_CANCEL_DEFERRED, Constant, Implemented
+@end example
+
+@subsection Cancellation Points
+
+@subsection Thread Cancellation Cleanup Handlers
+
+@example
+PTHREAD_CANCELED, Constant, Unimplemented
+@end example
+
+@subsection Async-Cancel Safety
+
+@section Thread Cancellation Functions
+
+@subsection Canceling Execution of a Thread
+
+@example
+pthread_cancel(), Function, Implemented
+@end example
+
+@subsection Setting Cancelability State
+
+@example
+pthread_setcancelstate(), Function, Implemented
+pthread_setcanceltype(), Function, Implemented
+pthread_testcancel(), Function, Implemented
+@end example
+
+@subsection Establishing Cancellation Handlers
+
+@example
+pthread_cleanup_push(), Function, Implemented
+pthread_cleanup_pop(), Function, Implemented
+@end example
+
+@section Language-Independent Cancellation Functionality
+
+@subsection Requesting Cancellation
+
+@subsection Associating Cleanup Code With Scopes
+
+@subsection Controlling Cancellation Within Scopes
+
+@subsection Defined Cancellation Sequence
+
+@subsection List of Cancellation Points
+
diff --git a/doc/posix1003.1/compliance_list b/doc/posix1003.1/compliance_list
new file mode 100644
index 0000000000..daa42fafb9
--- /dev/null
+++ b/doc/posix1003.1/compliance_list
@@ -0,0 +1,368 @@
+S_ISBLK(), Supported
+S_ISCHR(), Supported
+S_ISDIR(), Supported
+S_ISFIFO(), Supported
+S_ISREG(), Supported
+S_TYPEISMQ(), see note 3
+S_TYPEISSEM(), see note 3
+S_TYPEISSHM(), see note 3
+WEXITSTATUS(), see note 1
+WIFEXITED(), see note 1
+WIFSIGNALED(), see note 1
+WIFSTOPPED(), see note 1
+WSTOPSIG(), see note 1
+WTERMSIG(), see note 1
+_exit(), Supported
+abort(), Supported
+abs(), Supported
+access(), Supported
+acos(), Supported
+aio_cancel(), Supported
+aio_error(), Supported
+aio_fsync(), Supported
+aio_read(), Supported
+aio_return(), Supported
+aio_suspend(), Supported
+aio_write(), Supported
+alarm(), Supported
+asctime(), Supported
+asctime_r(), Supported
+asin(), Supported
+assert(), Supported
+atan(), Supported
+atan2(), Supported
+atof(), Supported
+atoi(), Supported
+atol(), Supported
+bsearch(), Supported
+calloc(), Supported
+ceil(), Supported
+cfgetispeed(), Supported
+cfgetospeed(), Supported
+cfsetispeed(), Supported
+cfsetospeed(), Supported
+chdir(), Supported
+chmod(), Supported
+chown(), Supported
+clearerr(), Supported
+clock_getres(), see note 2
+clock_gettime(), see note 2
+clock_settime(), see note 2
+close(), Supported
+closedir(), Supported
+cos(), Supported
+cosh(), Supported
+creat(), Supported
+ctermid(), see note 1
+ctime(), Supported
+ctime_r(), Supported
+dup(), Supported
+dup2(), Supported
+execl(), see note 1
+execle(), see note 1
+execlp(), see note 1
+execv(), see note 1
+execve(), see note 1
+execvp(), see note 1
+exit(), Supported
+exp(), Supported
+fabs(), Supported
+fchmod(), Supported
+fclose(), Supported
+fcntl(), Supported
+fdatasync(), Supported
+fdopen(), Supported
+feof(), Supported
+ferror(), Supported
+fflush(), Supported
+fgetc(), Supported
+fgets(), Supported
+fileno(), Supported
+flockfile(), see note 1
+floor(), Supported
+fmod(), Supported
+fopen(), Supported
+fork(), see note 1
+fpathconf(), Supported
+fprintf(), Supported
+fputc(), Supported
+fputs(), Supported
+fread(), Supported
+free(), Supported
+freopen(), Supported
+frexp(), Supported
+fscanf(), Supported
+fseek(), Supported
+fstat(), Supported
+fsync(), Supported
+ftell(), Supported
+ftruncate(), Supported
+ftrylockfile(), see note 1
+funlockfile(), see note 1
+fwrite(), Supported
+getc(), Supported
+getc_unlocked(), see note 1
+getchar(), Supported
+getchar_unlocked(), see note 1
+getcwd(), Supported
+getegid(), Supported
+getenv(), Supported
+geteuid(), Supported
+getgid(), Supported
+getgrgid(), Supported
+getgrgid_r(), Supported
+getgrnam_r(), Supported
+getgrname(), Supported
+getgroups(), Supported
+getlogin(), Supported
+getlogin_r(), Supported
+getpgrp(), Supported
+getpid(), Supported
+getppid(), Supported
+getpwnam(), Supported
+getpwnam_r(), Supported
+getpwuid(), Supported
+getpwuid_r(), Supported
+gets(), Supported
+getuid(), Supported
+gmtime(), Supported
+gmtime_r(), Supported
+isalnum(), Supported
+isalpha(), Supported
+isatty(), Supported
+iscntrl(), Supported
+isdigit(), Supported
+isgraph(), Supported
+islower(), Supported
+isprint(), Supported
+ispunct(), Supported
+isspace(), Supported
+isupper(), Supported
+isxdigit(), Supported
+kill(), Supported
+ldexp(), Supported
+link(), Supported
+lio_listio(), Supported
+localtime(), Supported
+localtime_r(), Supported
+log(), Supported
+log10(), Supported
+longjmp(), Supported
+lseek(), Supported
+malloc(), Supported
+mkdir(), Supported
+mkfifo(), see note 3
+mktime(), Supported
+mlock(), Not Supported
+mlockall(), Not Supported
+mmap(), Not Supported
+modf(), Supported
+mprotect(), Not Supported
+mq_close(), Supported
+mq_getattr(), Supported
+mq_notify(), Supported
+mq_open(), Supported
+mq_receive(), Supported
+mq_send(), Supported
+mq_setattr(), Supported
+mq_unlink(), Supported
+msync(), Not Supported
+munlock(), Not Supported
+munlockall(), Not Supported
+munmap(), Not Supported
+nanosleep(), Supported
+open(), Supported
+opendir(), Supported
+pathconf(), Supported
+pause(), Supported
+perror(), Supported
+pipe(), Supported
+pow(), Supported
+printf(), Supported
+pthread_atfork(), see note 1
+pthread_attr_destroy(), Supported
+pthread_attr_getdetachstate(), Supported
+pthread_attr_getinheritsched(), Supported
+pthread_attr_getschedparam(), Supported
+pthread_attr_getschedpolicy(), Supported
+pthread_attr_getscope(), Supported
+pthread_attr_getstackaddr(), Supported
+pthread_attr_getstacksize(), Supported
+pthread_attr_init(), Supported
+pthread_attr_setdetachstate(), Supported
+pthread_attr_setinheritsched(), Supported
+pthread_attr_setschedparam(), Supported
+pthread_attr_setschedpolicy(), Supported
+pthread_attr_setscope(), Supported
+pthread_attr_setstackaddr(), Supported
+pthread_attr_setstacksize(), Supported
+pthread_cancel(), Supported
+pthread_cleanup_pop(), Supported
+pthread_cleanup_push(), Supported
+pthread_cond_broadcast(), Supported
+pthread_cond_destroy(), Supported
+pthread_cond_init(), Supported
+pthread_cond_signal(), Supported
+pthread_cond_timedwait(), Supported
+pthread_cond_wait(), Supported
+pthread_condattr_destroy(), Supported
+pthread_condattr_getpshared(), Supported
+pthread_condattr_init(), Supported
+pthread_condattr_setpshared(), Supported
+pthread_create(), Supported
+pthread_detach(), Supported
+pthread_equal(), Supported
+pthread_exit(), Supported
+pthread_getschedparam(), Supported
+pthread_join(), Supported
+pthread_key_create(), Supported
+pthread_key_delete(), Supported
+pthread_key_getspecific(), Supported
+pthread_key_setspecific(), Supported
+pthread_kill(), Supported
+pthread_mutex_destroy(), Supported
+pthread_mutex_getprioceiling(), Supported
+pthread_mutex_init(), Supported
+pthread_mutex_lock(), Supported
+pthread_mutex_setprioceiling(), Supported
+pthread_mutex_trylock(), Supported
+pthread_mutex_unlock(), Supported
+pthread_mutexattr_destroy(), Supported
+pthread_mutexattr_getprioceiling(), Supported
+pthread_mutexattr_getprotocol(), Supported
+pthread_mutexattr_getpshared(), Supported
+pthread_mutexattr_init(), Supported
+pthread_mutexattr_setprioceiling(), Supported
+pthread_mutexattr_setprotocol(), Supported
+pthread_mutexattr_setpshared(), Supported
+pthread_once(), Supported
+pthread_self(), Supported
+pthread_setcancelstate(), Supported
+pthread_setcanceltype(), Supported
+pthread_setschedparam(), Supported
+pthread_sigmask(), Supported
+pthread_testcancel(), Supported
+putc(), Supported
+putc_unlocked(), see note 1
+putchar(), Supported
+putchar_unlocked(), see note 1
+puts(), Supported
+qsort(), Supported
+rand(), Supported
+rand_r(), Supported
+read(), Supported
+readdir(), Supported
+readdir_r(), Supported
+realloc(), Supported
+remove(), Supported
+rename(), Supported
+rewind(), Supported
+rewinddir(), Supported
+rmdir(), Supported
+scanf(), Supported
+sched_get_priority_max(), Supported
+sched_get_priority_min(), Supported
+sched_get_priority_rr_get_interval(), Supported
+sched_getparam(), Supported
+sched_getscheduler(), Supported
+sched_setparam(), Supported
+sched_setscheduler(), Supported
+sched_yield(), Supported
+sem_close(), Supported
+sem_destroy(), Supported
+sem_getvalue(), Supported
+sem_init(), Supported
+sem_open(), Supported
+sem_post(), Supported
+sem_trywait(), Supported
+sem_unlink(), Supported
+sem_wait(), Supported
+setbuf(), Supported
+setgid(), Supported
+setjmp(), Supported
+setlocale(), Supported
+setpgid(), Supported
+setsid(), Supported
+setuid(), Supported
+shm_open(), Not Supported
+shm_unlink(), Not Supported
+sigaction(), Supported
+sigaddset(), Supported
+sigdelset(), Supported
+sigemptyset(), Supported
+sigfillset(), Supported
+sigismember(), Supported
+siglongjmp(), Supported
+sigpending(), Supported
+sigprocmask(), Supported
+sigqueue(), Supported
+sigsetjmp(), Supported
+sigsuspend(), Supported
+sigtimedwait(), Supported
+sigwait(), Supported
+sigwaitinfo(), Supported
+sin(), Supported
+sinh(), Supported
+sleep(), Supported
+sprintf(), Supported
+sqrt(), Supported
+srand(), Supported
+sscanf(), Supported
+stat(), Supported
+strcat(), Supported
+strchr(), Supported
+strcmp(), Supported
+strcpy(), Supported
+strcspn(), Supported
+strftime(), Supported
+strlen(), Supported
+strncat(), Supported
+strncmp(), Supported
+strncpy(), Supported
+strpbrk(), Supported
+strrchr(), Supported
+strspn(), Supported
+strstr(), Supported
+strtok(), Supported
+strtok_r(), Supported
+sysconf(), Not Supported
+tan(), Supported
+tanh(), Supported
+tcdrain(), Supported
+tcflow(), Not Supported
+tcflush(), Not Supported
+tcgetattr(), Supported
+tcgetprgrp(), see note 1
+tcsendbreak(), Not Supported
+tcsetattr(), Supported
+tcsetprgrp(), see note 1
+time(), Supported
+timer_create(), Supported
+timer_delete(), Supported
+timer_getoverrun(), Supported
+timer_gettime(), Supported
+timer_settime(), Supported
+times(), Supported
+tmpfile(), Supported
+tmpnam(), Supported
+tolower(), Supported
+toupper(), Supported
+ttyname(), Not Supported
+ttyname_r(), Not Supported
+tzset(), Not Supported
+umask(), Supported
+uname(), Supported
+ungetc(), Supported
+unlink(), Supported
+utime(), Supported
+wait(), see note 1
+waitpid(), see note 1
+write(), Supported
+
+Notes:
+
+1. This is not supported as it requires processes.
+
+2. Partial implementation.
+
+3. Coming soon.
diff --git a/doc/posix1003.1/posix1003_1.texi b/doc/posix1003.1/posix1003_1.texi
new file mode 100644
index 0000000000..7fd1345c84
--- /dev/null
+++ b/doc/posix1003.1/posix1003_1.texi
@@ -0,0 +1,132 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename posix1003_1.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the POSIX 1003.1 Compliance Guide
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS On-Line Manual
+@direntry
+* RTEMS POSIX 1003.1 Compliance Guide: (posix1003_1).
+@end direntry
+@end ifset
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage RTEMS POSIX 1003.1 Compliance Guide
+
+@setchapternewpage odd
+@settitle RTEMS POSIX 1003.1 Compliance Guide
+@titlepage
+@finalout
+
+@title RTEMS POSIX 1003.1 Compliance Guide
+@subtitle Edition @value{EDITION}, for RTEMS @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include preface.texi
+@include ch01.texi
+@include ch02.texi
+@include ch03.texi
+@include ch04.texi
+@include ch05.texi
+@include ch06.texi
+@include ch07.texi
+@include ch08.texi
+@include ch09.texi
+@include ch10.texi
+@include ch11.texi
+@include ch12.texi
+@include ch13.texi
+@include ch14.texi
+@include ch15.texi
+@include ch16.texi
+@include ch17.texi
+@include ch18.texi
+@include ch19.texi
+
+@ifnottex
+@node Top, Preface, (dir), (dir)
+@top posix1003_1
+
+This is the online version of the RTEMS POSIX 1003.1 Compliance Guide.
+
+@menu
+* Preface::
+* General::
+* Terminology and General Requirements::
+* Process Primitives::
+* Process Environment::
+* Files and Directories::
+* Input and Output Primitives::
+* Device- and Class-Specific Functions::
+* Language-Specific Services for the C Programming Language::
+* System Databases::
+* Data Interchange Format::
+* Synchronization::
+* Memory Management::
+* Execution Scheduling::
+* Clocks and Timers::
+* Message Passing::
+* Thread Management::
+* Thread-Specific Data::
+* Thread Cancellation::
+* Compliance Summary::
+* Command and Variable Index::
+* Concept Index::
+@end menu
+
+@end ifnottex
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@node Command and Variable Index, Concept Index, Overall Summary, Top
+@unnumbered Command and Variable Index
+
+There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@node Concept Index, , Command and Variable Index, Top
+@unnumbered Concept Index
+
+There are currently no Concept Index entries.
+@c @printindex cp
+
+@contents
+@bye
+
diff --git a/doc/posix1003.1/preface.texi b/doc/posix1003.1/preface.texi
new file mode 100644
index 0000000000..33272e47f7
--- /dev/null
+++ b/doc/posix1003.1/preface.texi
@@ -0,0 +1,29 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifnottex
+@node Preface, General, Top, Top
+@end ifnottex
+
+@unnumbered Preface
+
+This document lists the functions, constant, macros, feature flags,
+and types defined in the POSIX 1003.1 standard. Each section in
+this document corresponds to a section in the 1003.1 standard
+and the implementation status of the items required by the standard
+are listed.
+
+RTEMS supports a number of POSIX process, user, and group oriented
+routines in what is referred to as a "SUSP" (Single-User, Single
+Process) manner. RTEMS supports a single process, multithreaded
+POSIX 1003.1b environment. In a pure world, there would be
+no reason to even include routines like @code{getpid()} when there
+can only be one process. But providing routines like @code{getpid()}
+and making them work in a sensible fashion for an embedded environment
+while not returning ENOSYS (for not implemented) makes it significantly
+easier to port code from a UNIX environment without modifying it.
diff --git a/doc/posix1003.1/summarize b/doc/posix1003.1/summarize
new file mode 100755
index 0000000000..a092b4a71c
--- /dev/null
+++ b/doc/posix1003.1/summarize
@@ -0,0 +1,202 @@
+#! /bin/sh
+#
+# Generate the summary chapter
+#
+# $Id$
+#
+
+echo "@c"
+echo "@c DO NOT EDIT -- AUTOMATICALLY GENERATED!!!"
+echo "@c"
+echo
+echo "@chapter Compliance Summary"
+echo
+
+wc2()
+{
+ pattern=$1
+ shift
+ grep "${pattern}" $* | wc -l
+}
+
+wc3()
+{
+ pattern=$1
+ filter=$2
+ shift ; shift
+ grep "${pattern}" $* | grep "${filter}" | wc -l
+}
+
+# adds the numbers passed on the command line
+addit()
+{
+ sumx=0
+ for x in $*
+ do
+ sumx=`expr $sumx + $x`
+ done
+ echo $sumx
+}
+
+summarize_chapter()
+{
+ echo
+ if [ $# -eq 1 ] ; then
+ grep "^@chapter" $1 | \
+ sed -e "s/^.chapter/@section/" \
+ -e "s/$/ Chapter/"
+ else
+ echo "@section Overall Summary"
+ fi
+
+ echo
+
+ # functions
+
+ functions_total=`wc2 "()" $*`
+ functions_implemented=` wc3 "()" "Implemented" $*`
+ functions_unimplemented=` wc3 "()" "Unimplemented" $*`
+ functions_unmplementable=`wc3 "()" "Unimplementable" $*`
+ functions_partial=` wc3 "()" "Partial Implementation" $*`
+ functions_dummy=` wc3 "()" "Dummy Implementation" $*`
+ functions_untested=` wc3 "()" "Untested Implementation" $*`
+
+ functions_sum=`addit ${functions_implemented} \
+ ${functions_unimplemented} ${functions_unmplementable} \
+ ${functions_partial} ${functions_dummy} \
+ ${functions_untested}`
+
+ # data types
+
+ datatypes_total=`wc2 "Type," $*`
+ datatypes_implemented=` wc3 "Type," "Implemented" $*`
+ datatypes_unimplemented=` wc3 "Type," "Unimplemented" $*`
+ datatypes_unmplementable=`wc3 "Type," "Unimplementable" $*`
+ datatypes_partial=` wc3 "Type," "Partial Implementation" $*`
+ datatypes_dummy=` wc3 "Type," "Dummy Implementation" $*`
+ datatypes_untested=` wc3 "Type," "Untested Implementation" $*`
+
+ datatypes_sum=`addit ${datatypes_implemented} \
+ ${datatypes_unimplemented} ${datatypes_unmplementable} \
+ ${datatypes_partial} ${datatypes_dummy} \
+ ${datatypes_untested}`
+
+ # feature flags
+
+ features_total=`wc2 "Feature Flag," $*`
+ features_implemented=` wc3 "Feature Flag," "Implemented" $*`
+ features_unimplemented=` wc3 "Feature Flag," "Unimplemented" $*`
+ features_unmplementable=`wc3 "Feature Flag," "Unimplementable" $*`
+ features_partial=` wc3 "Feature Flag," "Partial Implementation" $*`
+ features_dummy=` wc3 "Feature Flag," "Dummy Implementation" $*`
+ features_untested=` wc3 "Feature Flag," "Untested Implementation" $*`
+
+ features_sum=`addit ${features_implemented} \
+ ${features_unimplemented} ${features_unmplementable} \
+ ${features_partial} ${features_dummy} \
+ ${features_untested}`
+
+ # constants
+
+ constants_total=`wc2 "Constant," $*`
+ constants_implemented=` wc3 "Constant," "Implemented" $*`
+ constants_unimplemented=` wc3 "Constant," "Unimplemented" $*`
+ constants_unmplementable=`wc3 "Constant," "Unimplementable" $*`
+ constants_partial=` wc3 "Constant," "Partial Implementation" $*`
+ constants_dummy=` wc3 "Constant," "Dummy Implementation" $*`
+ constants_untested=` wc3 "Constant," "Untested Implementation" $*`
+
+ constants_sum=`addit ${constants_implemented} \
+ ${constants_unimplemented} ${constants_unmplementable} \
+ ${constants_partial} ${constants_dummy} \
+ ${constants_untested}`
+
+ # Now print the reports
+
+ echo "@example"
+ echo "Functions:"
+ echo " Total Number : ${functions_total}"
+ echo " Implemented : ${functions_implemented}"
+ echo " Unimplemented : ${functions_unimplemented}"
+ echo " Unimplementable : ${functions_unmplementable}"
+ echo " Partial : ${functions_partial}"
+ echo " Dummy : ${functions_dummy}"
+ echo " Untested : ${functions_untested}"
+ echo "@end example"
+ echo
+ if [ ${functions_sum} -ne ${functions_total} ] ; then
+ echo "@sp 1"
+ echo "@center @b{FUNCTION COUNTS DO NOT ADD UP!!}"
+ echo "@sp 1"
+ fi
+
+ echo "@example"
+ echo "Data Types:"
+ echo " Total Number : ${datatypes_total}"
+ echo " Implemented : ${datatypes_implemented}"
+ echo " Unimplemented : ${datatypes_unimplemented}"
+ echo " Unimplementable : ${datatypes_unmplementable}"
+ echo " Partial : ${datatypes_partial}"
+ echo " Dummy : ${datatypes_dummy}"
+ echo " Untested : ${datatypes_untested}"
+ echo "@end example"
+ echo
+ if [ ${datatypes_sum} -ne ${datatypes_total} ] ; then
+ echo "@sp 1"
+ echo "@center @b{DATA TYPE COUNTS DO NOT ADD UP!!}"
+ echo "@sp 1"
+ fi
+
+ echo "@example"
+ echo "Feature Flags:"
+ echo " Total Number : ${features_total}"
+ echo " Implemented : ${features_implemented}"
+ echo " Unimplemented : ${features_unimplemented}"
+ echo " Unimplementable : ${features_unmplementable}"
+ echo " Partial : ${features_partial}"
+ echo " Dummy : ${features_dummy}"
+ echo " Untested : ${features_untested}"
+ echo "@end example"
+ echo
+ if [ ${features_sum} -ne ${features_total} ] ; then
+ echo "@sp 1"
+ echo "@center @b{FEATURE FLAG COUNTS DO NOT ADD UP!!}"
+ echo "@sp 1"
+ fi
+
+ echo "@example"
+ echo "Constants:"
+ echo " Total Number : ${constants_total}"
+ echo " Implemented : ${constants_implemented}"
+ echo " Unimplemented : ${constants_unimplemented}"
+ echo " Unimplementable : ${constants_unmplementable}"
+ echo " Partial : ${constants_partial}"
+ echo " Dummy : ${constants_dummy}"
+ echo " Untested : ${constants_untested}"
+ echo "@end example"
+ echo
+ if [ ${constants_sum} -ne ${constants_total} ] ; then
+ echo "@sp 1"
+ echo "@center @b{CONSTANT COUNTS DO NOT ADD UP!!}"
+ echo "@sp 1"
+ fi
+}
+
+if test $# -lt 1; then
+ echo "Missing arguments"
+ exit 1
+fi
+chapters="$*"
+
+# go through the chapters one at a time
+for chapter in ${chapters}
+do
+ summarize_chapter $chapter
+ echo "@page"
+done
+
+# now generate the overall summary
+summarize_chapter ${chapters}
+
+
+
diff --git a/doc/posix_users/.cvsignore b/doc/posix_users/.cvsignore
new file mode 100644
index 0000000000..87277e1a6a
--- /dev/null
+++ b/doc/posix_users/.cvsignore
@@ -0,0 +1,48 @@
+cancel.texi
+clock.texi
+cond.texi
+cspecific.texi
+device.texi
+files.texi
+index.html
+io.texi
+key.texi
+libc.texi
+libm.texi
+Makefile
+Makefile.in
+mdate-sh
+memorymgmt.texi
+message.texi
+mutex.texi
+posix_users
+posix_users-?
+posix_users-??
+posix_users.aux
+posix_users.cp
+posix_users.cps
+posix_users.dvi
+posix_users.fn
+posix_users.fns
+posix_users*.html
+posix_users.ky
+posix_users.log
+posix_users.pdf
+posix_users.pg
+posix_users.ps
+posix_users.toc
+posix_users.tp
+posix_users.vr
+procenv.texi
+process.texi
+rtems_footer.html
+rtems_header.html
+sched.texi
+semaphores.texi
+signal.texi
+stamp-vti
+status.texi
+systemdb.texi
+thread.texi
+timer.texi
+version.texi
diff --git a/doc/posix_users/Makefile.am b/doc/posix_users/Makefile.am
new file mode 100644
index 0000000000..5517b1abd8
--- /dev/null
+++ b/doc/posix_users/Makefile.am
@@ -0,0 +1,143 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = posix_users
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/main.am
+
+GENERATED_FILES = cancel.texi clock.texi cond.texi cspecific.texi \
+ device.texi files.texi io.texi key.texi memorymgmt.texi message.texi \
+ mutex.texi procenv.texi process.texi sched.texi semaphores.texi \
+ signal.texi status.texi systemdb.texi thread.texi timer.texi libc.texi \
+ libm.texi
+
+COMMON_FILES += $(top_srcdir)/common/cpright.texi
+
+FILES = preface.texi
+info_TEXINFOS = posix_users.texi
+posix_users_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+process.texi: process.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+procenv.texi: procenv.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+files.texi: files.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+thread.texi: thread.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+signal.texi: signal.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+mutex.texi: mutex.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+cond.texi: cond.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+key.texi: key.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+clock.texi: clock.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+timer.texi: timer.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+sched.texi: sched.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+io.texi: io.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+device.texi: device.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+cspecific.texi: cspecific.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+semaphores.texi: semaphores.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+memorymgmt.texi: memorymgmt.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+message.texi: message.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+cancel.texi: cancel.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+systemdb.texi: systemdb.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+status.texi: status.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+libc.texi: libc.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+libm.texi: libm.t
+ $(BMENU2) -p "" \
+ -u "Top" \
+ -n "" < $< > $@
+
+noinst_SCRIPTS = gen_size_report
+EXTRA_DIST = cancel.t clock.t cond.t cspecific.t device.t files.t io.t key.t \
+ libc.t libm.t memorymgmt.t message.t mutex.t procenv.t process.t sched.t \
+ semaphores.t signal.t status.t systemdb.t thread.t timer.t \
+ gen_size_report
+
+CLEANFILES += posix_users.info posix_users.info-? posix_users.info-??
diff --git a/doc/posix_users/cancel.t b/doc/posix_users/cancel.t
new file mode 100644
index 0000000000..a7ab468a00
--- /dev/null
+++ b/doc/posix_users/cancel.t
@@ -0,0 +1,239 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Thread Cancellation Manager
+
+@section Introduction
+
+The
+thread cancellation manager is ...
+
+The directives provided by the thread cancellation manager are:
+
+@itemize @bullet
+@item @code{pthread_cancel} - Cancel Execution of a Thread
+@item @code{pthread_setcancelstate} - Set Cancelability State
+@item @code{pthread_setcanceltype} - Set Cancelability Type
+@item @code{pthread_testcancel} - Create Cancellation Point
+@item @code{pthread_cleanup_push} - Establish Cancellation Handler
+@item @code{pthread_cleanup_pop} - Remove Cancellation Handler
+@end itemize
+
+@section Background
+
+There is currently no text in this section.
+
+@section Operations
+
+There is currently no text in this section.
+
+@section Directives
+
+This section details the thread cancellation manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@c
+@c
+@c
+@page
+@subsection pthread_cancel - Cancel Execution of a Thread
+
+@findex pthread_cancel
+@cindex cancel execution of a thread
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int pthread_cancel(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection pthread_setcancelstate - Set Cancelability State
+
+@findex pthread_setcancelstate
+@cindex set cancelability state
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int pthread_setcancelstate(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection pthread_setcanceltype - Set Cancelability Type
+
+@findex pthread_setcanceltype
+@cindex set cancelability type
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int pthread_setcanceltype(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection pthread_testcancel - Create Cancellation Point
+
+@findex pthread_testcancel
+@cindex create cancellation point
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int pthread_testcancel(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection pthread_cleanup_push - Establish Cancellation Handler
+
+@findex pthread_cleanup_push
+@cindex establish cancellation handler
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int pthread_cleanup_push(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection pthread_cleanup_pop - Remove Cancellation Handler
+
+@findex pthread_cleanup_pop
+@cindex remove cancellation handler
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int pthread_cleanup_push(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
diff --git a/doc/posix_users/clock.t b/doc/posix_users/clock.t
new file mode 100644
index 0000000000..63c0cf3412
--- /dev/null
+++ b/doc/posix_users/clock.t
@@ -0,0 +1,369 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Clock Manager
+
+@section Introduction
+
+The clock manager provides services two primary classes
+of services. The first focuses on obtaining and setting
+the current date and time. The other category of services
+focus on allowing a thread to delay for a specific length
+of time.
+
+The directives provided by the clock manager are:
+
+@itemize @bullet
+@item @code{clock_gettime} - Obtain Time of Day
+@item @code{clock_settime} - Set Time of Day
+@item @code{clock_getres} - Get Clock Resolution
+@item @code{sleep} - Delay Process Execution
+@item @code{usleep} - Delay Process Execution in Microseconds
+@item @code{nanosleep} - Delay with High Resolution
+@item @code{gettimeofday} - Get the Time of Day
+@item @code{time} - Get time in seconds
+@end itemize
+
+@section Background
+
+There is currently no text in this section.
+
+@section Operations
+
+There is currently no text in this section.
+
+@section Directives
+
+This section details the clock manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@subsection clock_gettime - Obtain Time of Day
+
+@findex clock_gettime
+@cindex obtain time of day
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <time.h>
+
+int clock_gettime(
+ clockid_t clock_id,
+ struct timespec *tp
+);
+@end example
+
+@subheading STATUS CODES:
+
+On error, this routine returns -1 and sets errno to one of the following:
+
+@table @b
+@item EINVAL
+The tp pointer parameter is invalid.
+
+@item EINVAL
+The clock_id specified is invalid.
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection clock_settime - Set Time of Day
+
+@findex clock_settime
+@cindex set time of day
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <time.h>
+
+int clock_settime(
+ clockid_t clock_id,
+ const struct timespec *tp
+);
+@end example
+
+@subheading STATUS CODES:
+
+On error, this routine returns -1 and sets errno to one of the following:
+
+@table @b
+@item EINVAL
+The tp pointer parameter is invalid.
+
+@item EINVAL
+The clock_id specified is invalid.
+
+@item EINVAL
+The contents of the tp structure are invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection clock_getres - Get Clock Resolution
+
+@findex clock_getres
+@cindex get clock resolution
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <time.h>
+
+int clock_getres(
+ clockid_t clock_id,
+ struct timespec *res
+);
+@end example
+
+@subheading STATUS CODES:
+
+On error, this routine returns -1 and sets errno to one of the following:
+
+@table @b
+@item EINVAL
+The res pointer parameter is invalid.
+
+@item EINVAL
+The clock_id specified is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+If res is NULL, then the resolution is not returned.
+
+@c
+@c
+@c
+@page
+@subsection sleep - Delay Process Execution
+
+@findex sleep
+@cindex delay process execution
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <unistd.h>
+
+unsigned int sleep(
+ unsigned int seconds
+);
+@end example
+
+@subheading STATUS CODES:
+
+This routine returns the number of unslept seconds.
+
+@subheading DESCRIPTION:
+
+The @code{sleep()} function delays the calling thread by the specified
+number of @code{seconds}.
+
+@subheading NOTES:
+
+This call is interruptible by a signal.
+
+@c
+@c
+@c
+@page
+@subsection usleep - Delay Process Execution in Microseconds
+
+@findex usleep
+@cindex delay process execution
+@cindex delay process execution
+@cindex usecs delay process execution
+@cindex microsecond delay process execution
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <time.h>
+
+useconds_t usleep(
+ useconds_t useconds
+);
+@end example
+
+@subheading STATUS CODES:
+
+This routine returns the number of unslept seconds.
+
+@subheading DESCRIPTION:
+
+The @code{sleep()} function delays the calling thread by the specified
+number of @code{seconds}.
+
+The @code{usleep()} function suspends the calling thread from execution
+until either the number of microseconds specified by the
+@code{useconds} argument has elapsed or a signal is delivered to the
+calling thread and its action is to invoke a signal-catching function
+or to terminate the process.
+
+Because of other activity, or because of the time spent in
+processing the call, the actual length of time the thread is
+blocked may be longer than
+the amount of time specified.
+
+@subheading NOTES:
+
+This call is interruptible by a signal.
+
+The Single UNIX Specification allows this service to be implemented using
+the same timer as that used by the @code{alarm()} service. This is
+@b{NOT} the case for @b{RTEMS} and this call has no interaction with
+the @code{SIGALRM} signal.
+
+@c
+@c
+@c
+@page
+@subsection nanosleep - Delay with High Resolution
+
+@findex nanosleep
+@cindex delay with high resolution
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <time.h>
+
+int nanosleep(
+ const struct timespec *rqtp,
+ struct timespec *rmtp
+);
+@end example
+
+@subheading STATUS CODES:
+
+On error, this routine returns -1 and sets errno to one of the following:
+
+@table @b
+@item EINTR
+The routine was interrupted by a signal.
+
+@item EAGAIN
+The requested sleep period specified negative seconds or nanoseconds.
+
+@item EINVAL
+The requested sleep period specified an invalid number for the nanoseconds
+field.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+This call is interruptible by a signal.
+
+@c
+@c
+@c
+@page
+@subsection gettimeofday - Get the Time of Day
+
+@findex gettimeofday
+@cindex get the time of day
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <sys/time.h>
+#include <unistd.h>
+
+int gettimeofday(
+ struct timeval *tp,
+ struct timezone *tzp
+);
+@end example
+
+@subheading STATUS CODES:
+
+On error, this routine returns -1 and sets @code{errno} as appropriate.
+
+@table @b
+@item EPERM
+@code{settimeofdat} is called by someone other than the superuser.
+
+@item EINVAL
+Timezone (or something else) is invalid.
+
+@item EFAULT
+One of @code{tv} or @code{tz} pointed outside your accessible address
+space
+
+@end table
+
+@subheading DESCRIPTION:
+
+This routine returns the current time of day in the @code{tp} structure.
+
+@subheading NOTES:
+
+Currently, the timezone information is not supported. The @code{tzp}
+argument is ignored.
+
+@c
+@c
+@c
+@page
+@subsection time - Get time in seconds
+
+@findex time
+@cindex get time in seconds
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <time.h>
+
+int time(
+ time_t *tloc
+);
+@end example
+
+@subheading STATUS CODES:
+
+This routine returns the number of seconds since the Epoch.
+
+@subheading DESCRIPTION:
+
+@code{time} returns the time since 00:00:00 GMT, January 1, 1970,
+measured in seconds
+
+If @code{tloc} in non null, the return value is also stored in the
+memory pointed to by @code{t}.
+
+@subheading NOTES:
+
+NONE
+
diff --git a/doc/posix_users/cond.t b/doc/posix_users/cond.t
new file mode 100644
index 0000000000..5561c86c92
--- /dev/null
+++ b/doc/posix_users/cond.t
@@ -0,0 +1,383 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Condition Variable Manager
+
+@section Introduction
+
+The condition variable manager ...
+
+The directives provided by the condition variable manager are:
+
+@itemize @bullet
+@item @code{pthread_condattr_init} - Initialize a Condition Variable Attribute Set
+@item @code{pthread_condattr_destroy} - Destroy a Condition Variable Attribute Set
+@item @code{pthread_condattr_setpshared} - Set Process Shared Attribute
+@item @code{pthread_condattr_getpshared} - Get Process Shared Attribute
+@item @code{pthread_cond_init} - Initialize a Condition Variable
+@item @code{pthread_cond_destroy} - Destroy a Condition Variable
+@item @code{pthread_cond_signal} - Signal a Condition Variable
+@item @code{pthread_cond_broadcast} - Broadcast a Condition Variable
+@item @code{pthread_cond_wait} - Wait on a Condition Variable
+@item @code{pthread_cond_timedwait} - With with Timeout a Condition Variable
+@end itemize
+
+@section Background
+
+There is currently no text in this section.
+
+@section Operations
+
+There is currently no text in this section.
+
+@section Directives
+
+This section details the condition variable manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@c
+@c
+@c
+@page
+@subsection pthread_condattr_init - Initialize a Condition Variable Attribute Set
+
+@findex pthread_condattr_init
+@cindex initialize a condition variable attribute set
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_condattr_init(
+ pthread_condattr_t *attr
+);
+@end example
+
+@subheading STATUS CODES:
+@table @b
+@item ENOMEM
+Insufficient memory is available to initialize the condition variable
+attributes object.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection pthread_condattr_destroy - Destroy a Condition Variable Attribute Set
+
+@findex pthread_condattr_destroy
+@cindex destroy a condition variable attribute set
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_condattr_destroy(
+ pthread_condattr_t *attr
+);
+@end example
+
+@subheading STATUS CODES:
+@table @b
+@item EINVAL
+The attribute object specified is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection pthread_condattr_setpshared - Set Process Shared Attribute
+
+@findex pthread_condattr_setpshared
+@cindex set process shared attribute
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_condattr_setpshared(
+ pthread_condattr_t *attr,
+ int pshared
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+Invalid argument passed.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection pthread_condattr_getpshared - Get Process Shared Attribute
+
+@findex pthread_condattr_getpshared
+@cindex get process shared attribute
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_condattr_getpshared(
+ const pthread_condattr_t *attr,
+ int *pshared
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+Invalid argument passed.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c
+@c
+@page
+@subsection pthread_cond_init - Initialize a Condition Variable
+
+@findex pthread_cond_init
+@cindex initialize a condition variable
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_cond_init(
+ pthread_cond_t *cond,
+ const pthread_condattr_t *attr
+);
+@end example
+
+@subheading STATUS CODES:
+@table @b
+@item EAGAIN
+The system lacked a resource other than memory necessary to create the
+initialize the condition variable object.
+
+@item ENOMEM
+Insufficient memory is available to initialize the condition variable object.
+
+@item EBUSY
+The specified condition variable has already been initialized.
+
+@item EINVAL
+The specified attribute value is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection pthread_cond_destroy - Destroy a Condition Variable
+
+@findex pthread_cond_destroy
+@cindex destroy a condition variable
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_cond_destroy(
+ pthread_cond_t *cond
+);
+@end example
+
+@subheading STATUS CODES:
+@table @b
+@item EINVAL
+The specified condition variable is invalid.
+
+@item EBUSY
+The specified condition variable is currently in use.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection pthread_cond_signal - Signal a Condition Variable
+
+@findex pthread_cond_signal
+@cindex signal a condition variable
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_cond_signal(
+ pthread_cond_t *cond
+);
+@end example
+
+@subheading STATUS CODES:
+@table @b
+@item EINVAL
+The specified condition variable is not valid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+This routine should not be invoked from a handler from an asynchronous signal
+handler or an interrupt service routine.
+
+@c
+@c
+@c
+@page
+@subsection pthread_cond_broadcast - Broadcast a Condition Variable
+
+@findex pthread_cond_broadcast
+@cindex broadcast a condition variable
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_cond_broadcast(
+ pthread_cond_t *cond
+);
+@end example
+
+@subheading STATUS CODES:
+@table @b
+@item EINVAL
+The specified condition variable is not valid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+This routine should not be invoked from a handler from an asynchronous signal
+handler or an interrupt service routine.
+
+@c
+@c
+@c
+@page
+@subsection pthread_cond_wait - Wait on a Condition Variable
+
+@findex pthread_cond_wait
+@cindex wait on a condition variable
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_cond_wait(
+ pthread_cond_t *cond,
+ pthread_mutex_t *mutex
+);
+@end example
+
+@subheading STATUS CODES:
+@table @b
+@item EINVAL
+The specified condition variable or mutex is not initialized OR different
+mutexes were specified for concurrent pthread_cond_wait() and
+pthread_cond_timedwait() operations on the same condition variable OR
+the mutex was not owned by the current thread at the time of the call.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection pthread_cond_timedwait - Wait with Timeout a Condition Variable
+
+@findex pthread_cond_timedwait
+@cindex wait with timeout a condition variable
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_cond_timedwait(
+ pthread_cond_t *cond,
+ pthread_mutex_t *mutex,
+ const struct timespec *abstime
+);
+@end example
+
+@subheading STATUS CODES:
+@table @b
+@item EINVAL
+The specified condition variable or mutex is not initialized OR different
+mutexes were specified for concurrent pthread_cond_wait() and
+pthread_cond_timedwait() operations on the same condition variable OR
+the mutex was not owned by the current thread at the time of the call.
+
+@item ETIMEDOUT
+The specified time has elapsed without the condition variable being
+satisfied.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
diff --git a/doc/posix_users/cspecific.t b/doc/posix_users/cspecific.t
new file mode 100644
index 0000000000..af424f94fa
--- /dev/null
+++ b/doc/posix_users/cspecific.t
@@ -0,0 +1,749 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Language-Specific Services for the C Programming Language Manager
+
+@section Introduction
+
+The
+language-specific services for the C programming language manager is ...
+
+The directives provided by the language-specific services for the C programming language manager are:
+
+@itemize @bullet
+@item @code{setlocale} - Set the Current Locale
+@item @code{fileno} - Obtain File Descriptor Number for this File
+@item @code{fdopen} - Associate Stream with File Descriptor
+@item @code{flockfile} - Acquire Ownership of File Stream
+@item @code{ftrylockfile} - Poll to Acquire Ownership of File Stream
+@item @code{funlockfile} - Release Ownership of File Stream
+@item @code{getc_unlocked} - Get Character without Locking
+@item @code{getchar_unlocked} - Get Character from stdin without Locking
+@item @code{putc_unlocked} - Put Character without Locking
+@item @code{putchar_unlocked} - Put Character to stdin without Locking
+@item @code{setjmp} - Save Context for Non-Local Goto
+@item @code{longjmp} - Non-Local Jump to a Saved Context
+@item @code{sigsetjmp} - Save Context with Signal Status for Non-Local Goto
+@item @code{siglongjmp} - Non-Local Jump with Signal Status to a Saved Context
+@item @code{tzset} - Initialize Time Conversion Information
+@item @code{strtok_r} - Reentrant Extract Token from String
+@item @code{asctime_r} - Reentrant struct tm to ASCII Time Conversion
+@item @code{ctime_r} - Reentrant time_t to ASCII Time Conversion
+@item @code{gmtime_r} - Reentrant UTC Time Conversion
+@item @code{localtime_r} - Reentrant Local Time Conversion
+@item @code{rand_r} - Reentrant Random Number Generation
+@end itemize
+
+@section Background
+
+There is currently no text in this section.
+
+@section Operations
+
+There is currently no text in this section.
+
+@section Directives
+
+This section details the language-specific services for the C programming language manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@c
+@c
+@c
+@page
+@subsection setlocale - Set the Current Locale
+
+@findex setlocale
+@cindex set the current locale
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int setlocale(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection fileno - Obtain File Descriptor Number for this File
+
+@findex fileno
+@cindex obtain file descriptor number for this file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int fileno(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection fdopen - Associate Stream with File Descriptor
+
+@findex fdopen
+@cindex associate stream with file descriptor
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int fdopen(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection flockfile - Acquire Ownership of File Stream
+
+@findex flockfile
+@cindex acquire ownership of file stream
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int flockfile(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection ftrylockfile - Poll to Acquire Ownership of File Stream
+
+@findex ftrylockfile
+@cindex poll to acquire ownership of file stream
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int ftrylockfile(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection funlockfile - Release Ownership of File Stream
+
+@findex funlockfile
+@cindex release ownership of file stream
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int funlockfile(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection getc_unlocked - Get Character without Locking
+
+@findex getc_unlocked
+@cindex get character without locking
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int getc_unlocked(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection getchar_unlocked - Get Character from stdin without Locking
+
+@findex getchar_unlocked
+@cindex get character from stdin without locking
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int getchar_unlocked(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection putc_unlocked - Put Character without Locking
+
+@findex putc_unlocked
+@cindex put character without locking
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int putc_unlocked(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection putchar_unlocked - Put Character to stdin without Locking
+
+@findex putchar_unlocked
+@cindex put character to stdin without locking
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int putchar_unlocked(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection setjmp - Save Context for Non-Local Goto
+
+@findex setjmp
+@cindex save context for non
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int setjmp(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection longjmp - Non-Local Jump to a Saved Context
+
+@findex longjmp
+@cindex non
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int longjmp(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection sigsetjmp - Save Context with Signal Status for Non-Local Goto
+
+@findex sigsetjmp
+@cindex save context with signal status for non
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int sigsetjmp(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection siglongjmp - Non-Local Jump with Signal Status to a Saved Context
+
+@findex siglongjmp
+@cindex non
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int siglongjmp(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection tzset - Initialize Time Conversion Information
+
+@findex tzset
+@cindex initialize time conversion information
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int tzset(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection strtok_r - Reentrant Extract Token from String
+
+@findex strtok_r
+@cindex reentrant extract token from string
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int strtok_r(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection asctime_r - Reentrant struct tm to ASCII Time Conversion
+
+@findex asctime_r
+@cindex reentrant struct tm to ascii time conversion
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int asctime_r(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection ctime_r - Reentrant time_t to ASCII Time Conversion
+
+@findex ctime_r
+@cindex reentrant time_t to ascii time conversion
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int ctime_r(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection gmtime_r - Reentrant UTC Time Conversion
+
+@findex gmtime_r
+@cindex reentrant utc time conversion
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int gmtime_r(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection localtime_r - Reentrant Local Time Conversion
+
+@findex localtime_r
+@cindex reentrant local time conversion
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int localtime_r(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection rand_r - Reentrant Random Number Generation
+
+@findex rand_r
+@cindex reentrant random number generation
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int rand_r(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
diff --git a/doc/posix_users/device.t b/doc/posix_users/device.t
new file mode 100644
index 0000000000..7fe928d42e
--- /dev/null
+++ b/doc/posix_users/device.t
@@ -0,0 +1,540 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Device- and Class- Specific Functions Manager
+
+@section Introduction
+
+The device- and class- specific functions manager is ...
+
+The directives provided by the device- and class- specific functions
+manager are:
+
+@itemize @bullet
+@item @code{cfgetispeed} - Reads terminal input baud rate
+@item @code{cfgetospeed} - Reads terminal output baud rate
+@item @code{cfsetispeed} - Sets terminal input baud rate
+@item @code{cfsetospeed} - Set terminal output baud rate
+@item @code{tcgetattr} - Gets terminal attributes
+@item @code{tcsetattr} - Set terminal attributes
+@item @code{tcsendbreak} - Sends a break to a terminal
+@item @code{tcdrain} - Waits for all output to be transmitted to the terminal
+@item @code{tcflush} - Discards terminal data
+@item @code{tcflow} - Suspends/restarts terminal output
+@item @code{tcgetpgrp} - Gets foreground process group ID
+@item @code{tcsetpgrp} - Sets foreground process group ID
+@end itemize
+
+@section Background
+
+There is currently no text in this section.
+
+@section Operations
+
+There is currently no text in this section.
+
+@section Directives
+
+This section details the device- and class- specific functions manager's
+directives. A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@c
+@c
+@c
+@page
+@subsection cfgetispeed - Reads terminal input baud rate
+
+@findex cfgetispeed
+@cindex reads terminal input baud rate
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <termios.h>
+
+int cfgetispeed(
+ const struct termios *p
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+The @code{cfgetispeed()} function returns a code for baud rate.
+
+@subheading DESCRIPTION:
+
+The @code{cfsetispeed()} function stores a code for the terminal speed
+stored in a struct termios. The codes are defined in @code{<termios.h>}
+by the macros BO, B50, B75, B110, B134, B150, B200, B300, B600, B1200,
+B1800, B2400, B4800, B9600, B19200, and B38400.
+
+The @code{cfsetispeed()} function does not do anything to the hardware.
+It merely stores a value for use by @code{tcsetattr()}.
+
+@subheading NOTES:
+
+Baud rates are defined by symbols, such as B110, B1200, B2400. The actual
+number returned for any given speed may change from system to system.
+
+@c
+@c
+@c
+@page
+@subsection cfgetospeed - Reads terminal output baud rate
+
+@findex cfgetospeed
+@cindex reads terminal output baud rate
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <termios.h>
+
+int cfgetospeed(
+ const struct termios *p
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+The @code{cfgetospeed()} function returns the termios code for the baud rate.
+
+@subheading DESCRIPTION:
+
+The @code{cfgetospeed()} function returns a code for the terminal speed
+stored in a @code{struct termios}. The codes are defined in @code{<termios.h>}
+by the macros BO, B50, B75, B110, B134, B150, B200, B300, B600, B1200, B1800,
+B2400, B4800, B9600, B19200, and B38400.
+
+The @code{cfgetospeed()} function does not do anything to the hardware.
+It merely returns the value stored by a previous call to @code{tcgetattr()}.
+
+@subheading NOTES:
+
+Baud rates are defined by symbols, such as B110, B1200, B2400. The actual
+number returned for any given speed may change from system to system.
+
+@c
+@c
+@c
+@page
+@subsection cfsetispeed - Sets terminal input baud rate
+
+@findex cfsetispeed
+@cindex sets terminal input baud rate
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <termios.h>
+
+int cfsetispeed(
+ struct termios *p,
+ speed_t speed
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+The @code{cfsetispeed()} function returns a zero when successful and
+returns -1 when an error occurs.
+
+@subheading DESCRIPTION:
+
+The @code{cfsetispeed()} function stores a code for the terminal speed
+stored in a struct termios. The codes are defined in @code{<termios.h>}
+by the macros B0, B50, B75, B110, B134, B150, B200, B300, B600, B1200,
+B1800, B2400, B4800, B9600, B19200, and B38400.
+
+@subheading NOTES:
+
+This function merely stores a value in the @code{termios} structure. It
+does not change the terminal speed until a @code{tcsetattr()} is done.
+It does not detect impossible terminal speeds.
+
+@c
+@c
+@c
+@page
+@subsection cfsetospeed - Sets terminal output baud rate
+
+@findex cfsetospeed
+@cindex sets terminal output baud rate
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <termios.h>
+
+int cfsetospeed(
+ struct termios *p,
+ speed_t speed
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+The @code{cfsetospeed()} function returns a zero when successful and
+returns -1 when an error occurs.
+
+
+@subheading DESCRIPTION:
+
+The @code{cfsetospeed()} function stores a code for the terminal speed stored
+in a struct @code{termios}. The codes are defiined in @code{<termios.h>} by the
+macros B0, B50, B75, B110, B134, B150, B200, B300, B600, B1200, B1800, B2400,
+B4800, B9600, B19200, and B38400.
+
+The @code{cfsetospeed()} function does not do anything to the hardware. It
+merely stores a value for use by @code{tcsetattr()}.
+
+@subheading NOTES:
+
+This function merely stores a value in the @code{termios} structure.
+It does not change the terminal speed until a @code{tcsetattr()} is done.
+It does not detect impossible terminal speeds.
+
+@c
+@c
+@c
+@page
+@subsection tcgetattr - Gets terminal attributes
+
+@findex tcgetattr
+@cindex gets terminal attributes
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <termios.h>
+#include <unistd.h>
+
+int tcgetattr(
+ int fildes,
+ struct termios *p
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EBADF
+Invalid file descriptor
+
+@item ENOOTY
+Terminal control function attempted for a file that is not a terminal.
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{tcgetattr()} gets the parameters associated with the terminal
+referred to by @code{fildes} and stores them into the @code{termios()}
+structure pointed to by @code{termios_p}.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection tcsetattr - Set terminal attributes
+
+@findex tcsetattr
+@cindex set terminal attributes
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <termios.h>
+#include <unistd.h>
+
+int tcsetattr(
+ int fildes,
+ int options,
+ const struct termios *tp
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection tcsendbreak - Sends a break to a terminal
+
+@findex tcsendbreak
+@cindex sends a break to a terminal
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int tcsendbreak(
+ int fd
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+This routine is not currently supported by RTEMS but could be
+in a future version.
+
+@c
+@c
+@c
+@page
+@subsection tcdrain - Waits for all output to be transmitted to the terminal.
+
+@findex tcdrain
+@cindex waits for all output to be transmitted to the terminal.
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <termios.h>
+#include <unistd.h>
+
+int tcdrain(
+ int fildes
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EBADF
+Invalid file descriptor
+
+@item EINTR
+Function was interrupted by a signal
+
+@item ENOTTY
+Terminal control function attempted for a file that is not a terminal.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{tcdrain()} function waits until all output written to
+@code{fildes} has been transmitted.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection tcflush - Discards terminal data
+
+@findex tcflush
+@cindex discards terminal data
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int tcflush(
+ int fd
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+This routine is not currently supported by RTEMS but could be
+in a future version.
+
+@c
+@c
+@c
+@page
+@subsection tcflow - Suspends/restarts terminal output.
+
+@findex tcflow
+@cindex suspends/restarts terminal output.
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int tcflow(
+ int fd
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+This routine is not currently supported by RTEMS but could be
+in a future version.
+
+@c
+@c
+@c
+@page
+@subsection tcgetpgrp - Gets foreground process group ID
+
+@findex tcgetpgrp
+@cindex gets foreground process group id
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int tcgetpgrp(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+This routine is not currently supported by RTEMS but could be
+in a future version.
+
+@c
+@c
+@c
+@page
+@subsection tcsetpgrp - Sets foreground process group ID
+
+@findex tcsetpgrp
+@cindex sets foreground process group id
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int tcsetpgrp(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+This routine is not currently supported by RTEMS but could be
+in a future version.
+
+
diff --git a/doc/posix_users/files.t b/doc/posix_users/files.t
new file mode 100644
index 0000000000..d5c6e73531
--- /dev/null
+++ b/doc/posix_users/files.t
@@ -0,0 +1,2410 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Files and Directories Manager
+
+@section Introduction
+
+The files and directories manager is ...
+
+The directives provided by the files and directories manager are:
+
+@itemize @bullet
+@item @code{opendir} - Open a Directory
+@item @code{readdir} - Reads a directory
+@item @code{rewinddir} - Resets the @code{readdir()} pointer
+@item @code{scandir} - Scan a directory for matching entries
+@item @code{telldir} - Return current location in directory stream
+@item @code{closedir} - Ends directory read operation
+@item @code{getdents} - Get directory entries
+@item @code{chdir} - Changes the current working directory
+@item @code{fchdir} - Changes the current working directory
+@item @code{getcwd} - Gets current working directory
+@item @code{open} - Opens a file
+@item @code{creat} - Create a new file or rewrite an existing one
+@item @code{umask} - Sets a file creation mask
+@item @code{link} - Creates a link to a file
+@item @code{symlink} - Creates a symbolic link to a file
+@item @code{readlink} - Obtain the name of the link destination
+@item @code{mkdir} - Makes a directory
+@item @code{mkfifo} - Makes a FIFO special file
+@item @code{unlink} - Removes a directory entry
+@item @code{rmdir} - Delete a directory
+@item @code{rename} - Renames a file
+@item @code{stat} - Gets information about a file.
+@item @code{fstat} - Gets file status
+@item @code{lstat} - Gets file status
+@item @code{access} - Check permissions for a file.
+@item @code{chmod} - Changes file mode
+@item @code{fchmod} - Changes permissions of a file
+@item @code{chown} - Changes the owner and/ or group of a file
+@item @code{utime} - Change access and/or modification times of an inode
+@item @code{ftruncate} - Truncate a file to a specified length
+@item @code{truncate} - Truncate a file to a specified length
+@item @code{pathconf} - Gets configuration values for files
+@item @code{fpathconf} - Get configuration values for files
+@item @code{mknod} - Create a directory
+@end itemize
+
+@section Background
+
+@subsection Path Name Evaluation
+
+A pathname is a string that consists of no more than @code{PATH_MAX}
+bytes, including the terminating null character. A pathname has an optional
+beginning slash, followed by zero or more filenames separated by slashes.
+If the pathname refers to a directory, it may also have one or more trailing
+slashes. Multiple successive slahes are considered to be the same as
+one slash.
+
+POSIX allows a pathname that begins with precisely two successive slashes to be
+interpreted in an implementation-defined manner. RTEMS does not currently
+recognize this as a special condition. Any number of successive
+slashes is treated the same as a single slash. POSIX requires that
+an implementation treat more than two leading slashes as a single slash.
+
+@section Operations
+
+There is currently no text in this section.
+
+@section Directives
+
+This section details the files and directories manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@c
+@c
+@c
+@page
+@subsection opendir - Open a Directory
+
+@findex opendir
+@cindex open a directory
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+#include <dirent.h>
+
+int opendir(
+ const char *dirname
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EACCES
+Search permission was denied on a component of the path
+prefix of @code{dirname}, or read permission is denied
+
+@item EMFILE
+Too many file descriptors in use by process
+
+@item ENFILE
+Too many files are currently open in the system.
+
+@item ENOENT
+Directory does not exist, or @code{name} is an empty string.
+
+@item ENOMEM
+Insufficient memory to complete the operation.
+
+@item ENOTDIR
+@code{name} is not a directory.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This routine opens a directory stream corresponding to the
+directory specified by the @code{dirname} argument. The
+directory stream is positioned at the first entry.
+
+@subheading NOTES:
+
+The routine is implemented in Cygnus newlib.
+
+@c
+@c
+@c
+@page
+@subsection readdir - Reads a directory
+
+@findex readdir
+@cindex reads a directory
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+#include <dirent.h>
+
+int readdir(
+ DIR *dirp
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EBADF
+Invalid file descriptor
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{readdir()} function returns a pointer to a structure @code{dirent}
+representing the next directory entry from the directory stream pointed to
+by @code{dirp}. On end-of-file, NULL is returned.
+
+The @code{readdir()} function may (or may not) return entries for . or .. Your
+program should tolerate reading dot and dot-dot but not require them.
+
+The data pointed to be @code{readdir()} may be overwritten by another call to
+@code{readdir()} for the same directory stream. It will not be overwritten by
+a call for another directory.
+
+@subheading NOTES:
+
+If @code{ptr} is not a pointer returned by @code{malloc()}, @code{calloc()}, or
+@code{realloc()} or has been deallocated with @code{free()} or
+@code{realloc()}, the results are not portable and are probably disastrous.
+
+The routine is implemented in Cygnus newlib.
+
+@c
+@c
+@c
+@page
+@subsection rewinddir - Resets the readdir() pointer
+
+@findex rewinddir
+@cindex resets the readdir() pointer
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+#include <dirent.h>
+
+void rewinddir(
+ DIR *dirp
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+No value is returned.
+
+@subheading DESCRIPTION:
+
+The @code{rewinddir()} function resets the position associated with
+the directory stream pointed to by @code{dirp}. It also causes the
+directory stream to refer to the current state of the directory.
+
+@subheading NOTES:
+
+NONE
+
+If @code{dirp} is not a pointer by @code{opendir()}, the results are
+undefined.
+
+The routine is implemented in Cygnus newlib.
+
+@c
+@c
+@c
+@page
+@subsection scandir - Scan a directory for matching entries
+
+@findex scandir
+@cindex scan a directory for matching entries
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <dirent.h>
+
+int scandir(
+ const char *dir,
+ struct dirent ***namelist,
+ int (*select)(const struct dirent *),
+ int (*compar)(const struct dirent **, const struct dirent **)
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item ENOMEM
+Insufficient memory to complete the operation.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{scandir()} function scans the directory @code{dir}, calling
+@code{select()} on each directory entry. Entries for which @code{select()}
+returns non-zero are stored in strings allocated via @code{malloc()},
+sorted using @code{qsort()} with the comparison function @code{compar()},
+and collected in array @code{namelist} which is allocated via @code{malloc()}.
+If @code{select} is NULL, all entries are selected.
+
+@subheading NOTES:
+
+The routine is implemented in Cygnus newlib.
+
+@c
+@c
+@c
+@page
+@subsection telldir - Return current location in directory stream
+
+@findex telldir
+@cindex return current location in directory stream
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <dirent.h>
+
+off_t telldir(
+ DIR *dir
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EBADF
+Invalid directory stream descriptor @code{dir}.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{telldir()} function returns the current location associated with the
+directory stream @code{dir}.
+
+@subheading NOTES:
+
+The routine is implemented in Cygnus newlib.
+
+@c
+@c
+@c
+@page
+@subsection closedir - Ends directory read operation
+
+@findex closedir
+@cindex ends directory read operation
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+#include <dirent.h>
+
+int closedir(
+ DIR *dirp
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EBADF
+Invalid file descriptor
+
+@end table
+
+@subheading DESCRIPTION:
+
+The directory stream associated with @code{dirp} is closed.
+The value in @code{dirp} may not be usable after a call to
+@code{closedir()}.
+
+@subheading NOTES:
+
+NONE
+
+The argument to @code{closedir()} must be a pointer returned by
+@code{opendir()}. If it is not, the results are not portable and
+most likely unpleasant.
+
+The routine is implemented in Cygnus newlib.
+
+@c
+@c
+@c
+@page
+@subsection chdir - Changes the current working directory
+
+@findex chdir
+@cindex changes the current working directory
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <unistd.h>
+
+int chdir(
+ const char *path
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+On error, this routine returns -1 and sets @code{errno} to one of
+the following:
+
+@table @b
+@item EACCES
+Search permission is denied for a directory in a file's path prefix.
+
+@item ENAMETOOLONG
+Length of a filename string exceeds PATH_MAX and _POSIX_NO_TRUNC is
+in effect.
+
+@item ENOENT
+A file or directory does not exist.
+
+@item ENOTDIR
+A component of the specified pathname was not a directory when directory
+was expected.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{chdir()} function causes the directory named by @code{path} to
+become the current working directory; that is, the starting point for
+searches of pathnames not beginning with a slash.
+
+If @code{chdir()} detects an error, the current working directory is not
+changed.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection fchdir - Changes the current working directory
+
+@findex fchdir
+@cindex changes the current working directory
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <unistd.h>
+
+int fchdir(
+ int fd
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+On error, this routine returns -1 and sets @code{errno} to one of
+the following:
+
+@table @b
+@item EACCES
+Search permission is denied for a directory in a file's path prefix.
+
+@item ENAMETOOLONG
+Length of a filename string exceeds PATH_MAX and _POSIX_NO_TRUNC is
+in effect.
+
+@item ENOENT
+A file or directory does not exist.
+
+@item ENOTDIR
+A component of the specified pathname was not a directory when directory
+was expected.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{fchdir()} function causes the directory named by @code{fd} to
+become the current working directory; that is, the starting point for
+searches of pathnames not beginning with a slash.
+
+If @code{fchdir()} detects an error, the current working directory is not
+changed.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection getcwd - Gets current working directory
+
+@findex getcwd
+@cindex gets current working directory
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <unistd.h>
+
+int getcwd( void );
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+Invalid argument
+
+@item ERANGE
+Result is too large
+
+@item EACCES
+Search permission is denied for a directory in a file's path prefix.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{getcwd()} function copies the absolute pathname of the current
+working directory to the character array pointed to by @code{buf}. The
+@code{size} argument is the number of bytes available in @code{buf}
+
+@subheading NOTES:
+
+There is no way to determine the maximum string length that @code{fetcwd()}
+may need to return. Applications should tolerate getting @code{ERANGE}
+and allocate a larger buffer.
+
+It is possible for @code{getcwd()} to return EACCES if, say, @code{login}
+puts the process into a directory without read access.
+
+The 1988 standard uses @code{int} instead of @code{size_t} for the second
+parameter.
+
+@c
+@c
+@c
+@page
+@subsection open - Opens a file
+
+@findex open
+@cindex opens a file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+int open(
+ const char *path,
+ int oflag,
+ mode_t mode
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+
+@item EACCES
+Search permission is denied for a directory in a file's path prefix.
+
+@item EEXIST
+The named file already exists.
+
+@item EINTR
+Function was interrupted by a signal.
+
+@item EISDIR
+Attempt to open a directory for writing or to rename a file to be a
+directory.
+
+@item EMFILE
+Too many file descriptors are in use by this process.
+
+@item ENAMETOOLONG
+Length of a filename string exceeds PATH_MAX and _POSIX_NO_TRUNC is in
+effect.
+
+@item ENFILE
+Too many files are currently open in the system.
+
+@item ENOENT
+A file or directory does not exist.
+
+@item ENOSPC
+No space left on disk.
+
+@item ENOTDIR
+A component of the specified pathname was not a directory when a directory
+was expected.
+
+@item ENXIO
+No such device. This error may also occur when a device is not ready, for
+example, a tape drive is off-line.
+
+@item EROFS
+Read-only file system.
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{open} function establishes a connection between a file and a file
+descriptor. The file descriptor is a small integer that is used by I/O
+functions to reference the file. The @code{path} argument points to the
+pathname for the file.
+
+The @code{oflag} argument is the bitwise inclusive OR of the values of
+symbolic constants. The programmer must specify exactly one of the following
+three symbols:
+
+@table @b
+@item O_RDONLY
+Open for reading only.
+
+@item O_WRONLY
+Open for writing only.
+
+@item O_RDWR
+Open for reading and writing.
+
+@end table
+
+Any combination of the following symbols may also be used.
+
+@table @b
+@item O_APPEND
+Set the file offset to the end-of-file prior to each write.
+
+@item O_CREAT
+If the file does not exist, allow it to be created. This flag indicates
+that the @code{mode} argument is present in the call to @code{open}.
+
+@item O_EXCL
+This flag may be used only if O_CREAT is also set. It causes the call
+to @code{open} to fail if the file already exists.
+
+@item O_NOCTTY
+If @code{path} identifies a terminal, this flag prevents that teminal from
+becoming the controlling terminal for thi9s process. See Chapter 8 for a
+description of terminal I/O.
+
+@item O_NONBLOCK
+Do no wait for the device or file to be ready or available. After the file
+is open, the @code{read} and @code{write} calls return immediately. If the
+process would be delayed in the read or write opermation, -1 is returned and
+@code{errno} is set to @code{EAGAIN} instead of blocking the caller.
+
+@item O_TRUNC
+This flag should be used only on ordinary files opened for writing. It
+causes the file to be tuncated to zero length..
+
+@end table
+
+Upon successful completion, @code{open} returns a non-negative file
+descriptor.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection creat - Create a new file or rewrite an existing one
+
+@findex creat
+@cindex create a new file or rewrite an existing one
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+int creat(
+ const char *path,
+ mode_t mode
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EEXIST
+@code{path} already exists and O_CREAT and O_EXCL were used.
+
+@item EISDIR
+@code{path} refers to a directory and the access requested involved
+writing
+
+@item ETXTBSY
+@code{path} refers to an executable image which is currently being
+executed and write access was requested
+
+@item EFAULT
+@code{path} points outside your accessible address space
+
+@item EACCES
+The requested access to the file is not allowed, or one of the
+directories in @code{path} did not allow search (execute) permission.
+
+@item ENAMETOOLONG
+@code{path} was too long.
+
+@item ENOENT
+A directory component in @code{path} does not exist or is a dangling
+symbolic link.
+
+@item ENOTDIR
+A component used as a directory in @code{path} is not, in fact, a
+directory.
+
+@item EMFILE
+The process alreadyh has the maximum number of files open.
+
+@item ENFILE
+The limit on the total number of files open on the system has been
+reached.
+
+@item ENOMEM
+Insufficient kernel memory was available.
+
+@item EROFS
+@code{path} refers to a file on a read-only filesystem and write access
+was requested
+
+@end table
+
+@subheading DESCRIPTION:
+
+@code{creat} attempts to create a file and return a file descriptor for
+use in read, write, etc.
+
+@subheading NOTES:
+
+NONE
+
+The routine is implemented in Cygnus newlib.
+
+@c
+@c
+@c
+@page
+@subsection umask - Sets a file creation mask.
+
+@findex umask
+@cindex sets a file creation mask.
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+#include <sys/stat.h>
+
+mode_t umask(
+ mode_t cmask
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@subheading DESCRIPTION:
+
+The @code{umask()} function sets the process file creation mask to @code{cmask}.
+The file creation mask is used during @code{open()}, @code{creat()}, @code{mkdir()},
+@code{mkfifo()} calls to turn off permission bits in the @code{mode} argument.
+Bit positions that are set in @code{cmask} are cleared in the mode of the
+created file.
+
+@subheading NOTES:
+
+NONE
+
+The @code{cmask} argument should have only permission bits set. All other
+bits should be zero.
+
+In a system which supports multiple processes, the file creation mask is inherited
+across @code{fork()} and @code{exec()} calls. This makes it possible to alter the
+default permission bits of created files. RTEMS does not support multiple processes
+so this behavior is not possible.
+
+@c
+@c
+@c
+@page
+@subsection link - Creates a link to a file
+
+@findex link
+@cindex creates a link to a file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <unistd.h>
+
+int link(
+ const char *existing,
+ const char *new
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+
+@item EACCES
+Search permission is denied for a directory in a file's path prefix
+
+@item EEXIST
+The named file already exists.
+
+@item EMLINK
+The number of links would exceed @code{LINK_MAX}.
+
+@item ENAMETOOLONG
+Length of a filename string exceeds PATH_MAX and _POSIX_NO_TRUNC is in
+effect.
+
+@item ENOENT
+A file or directory does not exist.
+@item ENOSPC
+No space left on disk.
+
+@item ENOTDIR
+A component of the specified pathname was not a directory when a directory
+was expected.
+
+@item EPERM
+Operation is not permitted. Process does not have the appropriate priviledges
+or permissions to perform the requested operations.
+
+@item EROFS
+Read-only file system.
+
+@item EXDEV
+Attempt to link a file to another file system.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{link()} function atomically creates a new link for an existing file
+and increments the link count for the file.
+
+If the @code{link()} function fails, no directories are modified.
+
+The @code{existing} argument should not be a directory.
+
+The caller may (or may not) need permission to access the existing file.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection symlink - Creates a symbolic link to a file
+
+@findex symlink
+@cindex creates a symbolic link to a file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <unistd.h>
+
+int symlink(
+ const char *topath,
+ const char *frompath
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+
+@item EACCES
+Search permission is denied for a directory in a file's path prefix
+
+@item EEXIST
+The named file already exists.
+
+@item ENAMETOOLONG
+Length of a filename string exceeds PATH_MAX and _POSIX_NO_TRUNC is in
+effect.
+
+@item ENOENT
+A file or directory does not exist.
+
+@item ENOSPC
+No space left on disk.
+
+@item ENOTDIR
+A component of the specified pathname was not a directory when a directory
+was expected.
+
+@item EPERM
+Operation is not permitted. Process does not have the appropriate priviledges
+or permissions to perform the requested operations.
+
+@item EROFS
+Read-only file system.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{symlink()} function creates a symbolic link from the frombath to the
+topath. The symbolic link will be interpreted at run-time.
+
+If the @code{symlink()} function fails, no directories are modified.
+
+The caller may (or may not) need permission to access the existing file.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection readlink - Obtain the name of a symbolic link destination
+
+@findex readlink
+@cindex obtain the name of a symbolic link destination
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <unistd.h>
+
+int readlink(
+ const char *path,
+ char *buf,
+ size_t bufsize
+);
+
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+
+@item EACCES
+Search permission is denied for a directory in a file's path prefix
+
+@item ENAMETOOLONG
+Length of a filename string exceeds PATH_MAX and _POSIX_NO_TRUNC is in
+effect.
+
+@item ENOENT
+A file or directory does not exist.
+
+@item ENOTDIR
+A component of the prefix pathname was not a directory when a directory
+was expected.
+
+@item ELOOP
+Too many symbolic links were encountered in the pathname.
+
+@item EINVAL
+The pathname does not refer to a symbolic link
+
+@item EFAULT
+An invalid pointer was passed into the @code{readlink()} routine.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{readlink()} function places the symbolic link destination into
+@code{buf} argument and returns the number of characters copied.
+
+If the symbolic link destination is longer than bufsize characters the
+name will be truncated.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection mkdir - Makes a directory
+
+@findex mkdir
+@cindex makes a directory
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+#include <sys/stat.h>
+
+int mkdir(
+ const char *path,
+ mode_t mode
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EACCES
+Search permission is denied for a directory in a file's path prefix
+
+@item EEXIST
+The name file already exist.
+
+@item EMLINK
+The number of links would exceed LINK_MAX
+
+@item ENAMETOOLONG
+Length of a filename string exceeds PATH_MAX and _POSIX_NO_TRUNC is in
+effect.
+
+@item ENOENT
+A file or directory does not exist.
+
+@item ENOSPC
+No space left on disk.
+
+@item ENOTDIR
+A component of the specified pathname was not a directory when a directory
+was expected.
+
+@item EROFS
+Read-only file system.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{mkdir()} function creates a new diectory named @code{path}. The
+permission bits (modified by the file creation mask) are set from @code{mode}.
+The owner and group IDs for the directory are set from the effective user ID
+and group ID.
+
+The new directory may (or may not) contain entries for.. and .. but is otherwise
+empty.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection mkfifo - Makes a FIFO special file
+
+@findex mkfifo
+@cindex makes a fifo special file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+#include <sys/stat.h>
+
+
+int mkfifo(
+ const char *path,
+ mode_t mode
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EACCES
+Search permission is denied for a directory in a file's path prefix
+
+@item EEXIST
+The named file already exists.
+
+@item ENOENT
+A file or directory does not exist.
+
+@item ENOSPC
+No space left on disk.
+
+@item ENOTDIR
+A component of the specified @code{path} was not a directory when a directory
+was expected.
+
+@item EROFS
+Read-only file system.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{mkfifo()} function creates a new FIFO special file named @code{path}.
+The permission bits (modified by the file creation mask) are set from
+@code{mode}. The owner and group IDs for the FIFO are set from the efective
+user ID and group ID.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection unlink - Removes a directory entry
+
+@findex unlink
+@cindex removes a directory entry
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <unistd.h>
+
+int unlink(
+ const char path
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EACCES
+Search permission is denied for a directory in a file's path prefix
+
+@item EBUSY
+The directory is in use.
+
+@item ENAMETOOLONG
+Length of a filename string exceeds PATH_MAX and _POSIX_NO_TRUNC is in
+effect.
+
+@item ENOENT
+A file or directory does not exist.
+
+@item ENOTDIR
+A component of the specified @code{path} was not a directory when a directory
+was expected.
+
+@item EPERM
+Operation is not permitted. Process does not have the appropriate priviledges
+or permissions to perform the requested operations.
+
+@item EROFS
+Read-only file system.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{unlink} function removes the link named by @code{path} and decrements the
+link count of the file referenced by the link. When the link count goes to zero
+and no process has the file open, the space occupied by the file is freed and the
+file is no longer accessible.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection rmdir - Delete a directory
+
+@findex rmdir
+@cindex delete a directory
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <unistd.h>
+
+int rmdir(
+ const char *pathname
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EPERM
+The filesystem containing @code{pathname} does not support the removal
+of directories.
+
+@item EFAULT
+@code{pathname} points ouside your accessible address space.
+
+@item EACCES
+Write access to the directory containing @code{pathname} was not
+allowed for the process's effective uid, or one of the directories in
+@code{pathname} did not allow search (execute) permission.
+
+@item EPERM
+The directory containing @code{pathname} has the stickybit (S_ISVTX)
+set and the process's effective uid is neither the uid of the file to
+be delected nor that of the director containing it.
+
+@item ENAMETOOLONG
+@code{pathname} was too long.
+
+@item ENOENT
+A dirctory component in @code{pathname} does not exist or is a
+dangling symbolic link.
+
+@item ENOTDIR
+@code{pathname}, or a component used as a directory in @code{pathname},
+is not, in fact, a directory.
+
+@item ENOTEMPTY
+@code{pathname} contains entries other than . and .. .
+
+@item EBUSY
+@code{pathname} is the current working directory or root directory of
+some process
+
+@item EBUSY
+@code{pathname} is the current directory or root directory of some
+process.
+
+@item ENOMEM
+Insufficient kernel memory was available
+
+@item EROGS
+@code{pathname} refers to a file on a read-only filesystem.
+
+@item ELOOP
+@code{pathname} contains a reference to a circular symbolic link
+
+@end table
+
+@subheading DESCRIPTION:
+
+@code{rmdir} deletes a directory, which must be empty
+
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection rename - Renames a file
+
+@findex rename
+@cindex renames a file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <unistd.h>
+
+int rename(
+ const char *old,
+ const char *new
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EACCES
+Search permission is denied for a directory in a file's path prefix.
+
+@item EBUSY
+The directory is in use.
+
+@item EEXIST
+The named file already exists.
+
+@item EINVAL
+Invalid argument.
+
+@item EISDIR
+Attempt to open a directory for writing or to rename a file to be a
+directory.
+
+@item EMLINK
+The number of links would exceed LINK_MAX.
+
+@item ENAMETOOLONG
+Length of a filename string exceeds PATH_MAX and _POSIX_NO_TRUNC is
+in effect.
+
+@item ENOENT
+A file or directory does no exist.
+
+@item ENOSPC
+No space left on disk.
+
+@item ENOTDIR
+A component of the specified pathname was not a directory when a
+directory was expected.
+
+@item ENOTEMPTY
+Attempt to delete or rename a non-empty directory.
+
+@item EROFS
+Read-only file system
+
+@item EXDEV
+Attempt to link a file to another file system.
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{rename()} function causes the file known bo @code{old} to
+now be known as @code{new}.
+
+Ordinary files may be renamed to ordinary files, and directories may be
+renamed to directories; however, files cannot be converted using
+@code{rename()}. The @code{new} pathname may not contain a path prefix
+of @code{old}.
+
+@subheading NOTES:
+
+If a file already exists by the name @code{new}, it is removed. The
+@code{rename()} function is atomic. If the @code{rename()} detects an
+error, no files are removed. This guarantees that the
+@code{rename("x", "x")} does not remove @code{x}.
+
+You may not rename dot or dot-dot.
+
+The routine is implemented in Cygnus newlib using @code{link()} and
+@code{unlink()}.
+
+@c
+@c
+@c
+@page
+@subsection stat - Gets information about a file
+
+@findex stat
+@cindex gets information about a file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+#include <sys/stat.h>
+
+int stat(
+ const char *path,
+ struct stat *buf
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EACCES
+Search permission is denied for a directory in a file's path prefix.
+
+@item EBADF
+Invalid file descriptor.
+
+@item ENAMETOOLONG
+Length of a filename string exceeds PATH_MAX and _POSIX_NO_TRUNC is
+in effect.
+
+@item ENOENT
+A file or directory does not exist.
+
+@item ENOTDIR
+A component of the specified pathname was not a directory when a
+directory was expected.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{path} argument points to a pathname for a file. Read, write, or
+execute permission for the file is not required, but all directories listed
+in @code{path} must be searchable. The @code{stat()} function obtains
+information about the named file and writes it to the area pointed to by
+@code{buf}.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection fstat - Gets file status
+
+@findex fstat
+@cindex gets file status
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+#include <sys/stat.h>
+
+int fstat(
+ int fildes,
+ struct stat *buf
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EBADF
+Invalid file descriptor
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{fstat()} function obtains information about the file
+associated with @code{fildes} and writes it to the area pointed
+to by the @code{buf} argument.
+
+@subheading NOTES:
+
+If the filesystem object referred to by @code{fildes} is a
+link, then the information returned in @code{buf} refers
+to the destination of that link. This is in contrast to
+@code{lstat()} which does not follow the link.
+
+@c
+@c
+@c
+@page
+@subsection lstat - Gets file status
+
+@findex lstat
+@cindex gets file status
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+#include <sys/stat.h>
+
+int lstat(
+ int fildes,
+ struct stat *buf
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EBADF
+Invalid file descriptor
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{lstat()} function obtains information about the file
+associated with @code{fildes} and writes it to the area pointed
+to by the @code{buf} argument.
+
+@subheading NOTES:
+
+If the filesystem object referred to by @code{fildes} is a
+link, then the information returned in @code{buf} refers
+to the link itself. This is in contrast to @code{fstat()}
+which follows the link.
+
+The @code{lstat()} routine is defined by BSD 4.3 and SVR4
+and not included in POSIX 1003.1b-1996.
+
+@c
+@c
+@c
+@page
+@subsection access - Check permissions for a file
+
+@findex access
+@cindex check permissions for a file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <unistd.h>
+
+int access(
+ const char *pathname,
+ int mode
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EACCES
+The requested access would be denied, either to the file itself or
+one of the directories in @code{pathname}.
+
+@item EFAULT
+@code{pathname} points outside your accessible address space.
+
+@item EINVAL
+@code{Mode} was incorrectly specified.
+
+@item ENAMETOOLONG
+@code{pathname} is too long.
+
+@item ENOENT
+A directory component in @code{pathname} would have been accessible but
+does not exist or was a dangling symbolic link.
+
+@item ENOTDIR
+A component used as a directory in @code{pathname} is not, in fact,
+a directory.
+
+@item ENOMEM
+Insufficient kernel memory was available.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@code{Access} checks whether the process would be allowed to read, write or
+test for existence of the file (or other file system object) whose name is
+@code{pathname}. If @code{pathname} is a symbolic link permissions of the
+file referred by this symbolic link are tested.
+
+@code{Mode} is a mask consisting of one or more of R_OK, W_OK, X_OK and F_OK.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection chmod - Changes file mode.
+
+@findex chmod
+@cindex changes file mode.
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+#include <sys/stat.h>
+
+int chmod(
+ const char *path,
+ mode_t mode
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EACCES
+Search permission is denied for a directory in a file's path prefix
+
+@item ENAMETOOLONG
+Length of a filename string exceeds PATH_MAX and _POSIX_NO_TRUNC is in
+effect.
+
+@item ENOENT
+A file or directory does not exist.
+
+@item ENOTDIR
+A component of the specified pathname was not a directory when a directory
+was expected.
+
+@item EPERM
+Operation is not permitted. Process does not have the appropriate priviledges
+or permissions to perform the requested operations.
+
+@item EROFS
+Read-only file system.
+
+@end table
+
+@subheading DESCRIPTION:
+
+Set the file permission bits, the set user ID bit, and the set group ID bit
+for the file named by @code{path} to @code{mode}. If the effective user ID
+does not match the owner of the file and the calling process does not have
+the appropriate privileges, @code{chmod()} returns -1 and sets @code{errno} to
+@code{EPERM}.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection fchmod - Changes permissions of a file
+
+@findex fchmod
+@cindex changes permissions of a file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+#include <sys/stat.h>
+
+int fchmod(
+ int fildes,
+ mode_t mode
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EACCES
+Search permission is denied for a directory in a file's path prefix.
+
+@item EBADF
+The descriptor is not valid.
+
+@item EFAULT
+@code{path} points outside your accessible address space.
+
+@item EIO
+A low-level I/o error occurred while modifying the inode.
+
+@item ELOOP
+@code{path} contains a circular reference
+
+@item ENAMETOOLONG
+Length of a filename string exceeds PATH_MAX and _POSIX_NO_TRUNC is
+in effect.
+
+@item ENOENT
+A file or directory does no exist.
+
+@item ENOMEM
+Insufficient kernel memory was avaliable.
+
+@item ENOTDIR
+A component of the specified pathname was not a directory when a
+directory was expected.
+
+@item EPERM
+The effective UID does not match the owner of the file, and is not
+zero
+
+@item EROFS
+Read-only file system
+@end table
+
+@subheading DESCRIPTION:
+
+The mode of the file given by @code{path} or referenced by
+@code{filedes} is changed.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection getdents - Get directory entries
+
+@findex getdents
+@cindex get directory entries
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <unistd.h>
+#include <linux/dirent.h>
+#include <linux/unistd.h>
+
+long getdents(
+ int dd_fd,
+ char *dd_buf,
+ int dd_len
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+A successful call to @code{getdents} returns th the number of bytes read.
+On end of directory, 0 is returned. When an error occurs, -1 is returned,
+and @code{errno} is set appropriately.
+
+@table @b
+@item EBADF
+Invalid file descriptor @code{fd}.
+
+@item EFAULT
+Argument points outside the calling process's address space.
+
+@item EINVAL
+Result buffer is too small.
+
+@item ENOENT
+No such directory.
+
+@item ENOTDIR
+File descriptor does not refer to a directory.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@code{getdents} reads several @code{dirent} structures from the directory
+pointed by @code{fd} into the memory area pointed to by @code{dirp}. The
+parameter @code{count} is the size of the memory area.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection chown - Changes the owner and/or group of a file.
+
+@findex chown
+@cindex changes the owner and/or group of a file.
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+#include <unistd.h>
+
+int chown(
+ const char *path,
+ uid_t owner,
+ gid_t group
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EACCES
+Search permission is denied for a directory in a file's path prefix
+
+@item EINVAL
+Invalid argument
+
+@item ENAMETOOLONG
+Length of a filename string exceeds PATH_MAX and _POSIX_NO_TRUNC is in
+effect.
+
+@item ENOENT
+A file or directory does not exist.
+
+@item ENOTDIR
+A component of the specified pathname was not a directory when a directory
+was expected.
+
+@item EPERM
+Operation is not permitted. Process does not have the appropriate priviledges
+or permissions to perform the requested operations.
+
+@item EROFS
+Read-only file system.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The user ID and group ID of the file named by @code{path} are set to
+@code{owner} and @code{path}, respectively.
+
+For regular files, the set group ID (S_ISGID) and set user ID (S_ISUID)
+bits are cleared.
+
+Some systems consider it a security violation to allow the owner of a file to
+be changed, If users are billed for disk space usage, loaning a file to
+another user could result in incorrect billing. The @code{chown()} function
+may be restricted to privileged users for some or all files. The group ID can
+still be changed to one of the supplementary group IDs.
+
+@subheading NOTES:
+
+This function may be restricted for some file. The @code{pathconf} function
+can be used to test the @code{_PC_CHOWN_RESTRICTED} flag.
+
+
+
+@c
+@c
+@c
+@page
+@subsection utime - Change access and/or modification times of an inode
+
+@findex utime
+@cindex change access and/or modification times of an inode
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+
+int utime(
+ const char *filename,
+ struct utimbuf *buf
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EACCES
+Permission to write the file is denied
+
+@item ENOENT
+@code{Filename} does not exist
+
+@end table
+
+@subheading DESCRIPTION:
+
+@code{Utime} changes the access and modification times of the inode
+specified by @code{filename} to the @code{actime} and @code{modtime}
+fields of @code{buf} respectively. If @code{buf} is NULL, then the
+access and modification times of the file are set to the current time.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection ftruncate - truncate a file to a specified length
+
+@findex ftruncate
+@cindex truncate a file to a specified length
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <unistd.h>
+
+int ftrunctate(
+ int fd,
+ size_t length
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item ENOTDIR
+A component of the path prefix is not a directory.
+
+@item EINVAL
+The pathname contains a character with the high-order bit set.
+
+@item ENAMETOOLONG
+A component of a pathname exceeded 255 characters, or an entire
+path name exceeded 1023 characters.
+
+@item ENOENT
+The named file does not exist.
+
+@item EACCES
+The named file is not writable by the user.
+
+@item EACCES
+Search permission is denied for a component of the path prefix.
+
+@item ELOOP
+Too many symbolic links were encountered in translating the
+pathname
+
+@item EISDIR
+The named file is a directory.
+
+@item EROFS
+The named file resides on a read-only file system
+
+@item ETXTBSY
+The file is a pure procedure (shared text) file that is being
+executed
+
+@item EIO
+An I/O error occurred updating the inode.
+
+@item EFAULT
+@code{Path} points outside the process's allocated address space.
+
+@item EBADF
+The @code{fd} is not a valid descriptor.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@code{truncate()} causes the file named by @code{path} or referenced by
+@code{fd} to be truncated to at most @code{length} bytes in size. If the
+file previously was larger than this size, the extra data is lost. With
+@code{ftruncate()}, the file must be open for writing.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection truncate - truncate a file to a specified length
+
+@findex truncate
+@cindex truncate a file to a specified length
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <unistd.h>
+
+int trunctate(
+ const char *path,
+ size_t length
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item ENOTDIR
+A component of the path prefix is not a directory.
+
+@item EINVAL
+The pathname contains a character with the high-order bit set.
+
+@item ENAMETOOLONG
+A component of a pathname exceeded 255 characters, or an entire
+path name exceeded 1023 characters.
+
+@item ENOENT
+The named file does not exist.
+
+@item EACCES
+The named file is not writable by the user.
+
+@item EACCES
+Search permission is denied for a component of the path prefix.
+
+@item ELOOP
+Too many symbolic links were encountered in translating the
+pathname
+
+@item EISDIR
+The named file is a directory.
+
+@item EROFS
+The named file resides on a read-only file system
+
+@item ETXTBSY
+The file is a pure procedure (shared text) file that is being
+executed
+
+@item EIO
+An I/O error occurred updating the inode.
+
+@item EFAULT
+@code{Path} points outside the process's allocated address space.
+
+@item EBADF
+The @code{fd} is not a valid descriptor.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@code{truncate()} causes the file named by @code{path} or referenced by
+@code{fd} to be truncated to at most @code{length} bytes in size. If the
+file previously was larger than this size, the extra data is lost. With
+@code{ftruncate()}, the file must be open for writing.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection pathconf - Gets configuration values for files
+
+@findex pathconf
+@cindex gets configuration values for files
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <unistd.h>
+
+int pathconf(
+ const char *path,
+ int name
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+Invalid argument
+
+@item EACCES
+Permission to write the file is denied
+
+@item ENAMETOOLONG
+Length of a filename string exceeds PATH_MAX and _POSIX_NO_TRUNC
+is in effect.
+
+@item ENOENT
+A file or directory does not exist
+
+@item ENOTDIR
+A component of the specified @code{path} was not a directory whan a
+directory was expected.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@code{pathconf()} gets a value for the configuration option @code{name}
+for the open file descriptor @code{filedes}.
+
+The possible values for @code{name} are:
+
+@table @b
+@item _PC_LINK_MAX
+returns the maximum number of links to the file. If @code{filedes} or
+@code{path} refer to a directory, then the value applies to the whole
+directory. The corresponding macro is @code{_POSIX_LINK_MAX}.
+
+@item _PC_MAX_CANON
+returns the maximum length of a formatted input line, where @code{filedes}
+or @code{path} must refer to a terminal. The corresponding macro is
+@code{_POSIX_MAX_CANON}.
+
+@item _PC_MAX_INPUT
+returns the maximum length of an input line, where @code{filedes} or
+@code{path} must refer to a terminal. The corresponding macro is
+@code{_POSIX_MAX_INPUT}.
+
+@item _PC_NAME_MAX
+returns the maximum length of a filename in the directory @code{path} or
+@code{filedes}. The process is allowed to create. The corresponding macro
+is @code{_POSIX_NAME_MAX}.
+
+@item _PC_PATH_MAX
+returns the maximum length of a relative pathname when @code{path} or
+@code{filedes} is the current working directory. The corresponding macro
+is @code{_POSIX_PATH_MAX}.
+
+@item _PC_PIPE_BUF
+returns the size of the pipe buffer, where @code{filedes} must refer to a
+pipe or FIFO and @code{path} must refer to a FIFO. The corresponding macro
+is @code{_POSIX_PIPE_BUF}.
+
+@item _PC_CHOWN_RESTRICTED
+returns nonzero if the chown(2) call may not be used on this file. If
+@code{filedes} or @code{path} refer to a directory, then this applies to all
+files in that directory. The corresponding macro is
+@code{_POSIX_CHOWN_RESTRICTED}.
+
+@end table
+
+@subheading NOTES:
+
+Files with name lengths longer than the value returned for @code{name} equal
+@code{_PC_NAME_MAX} may exist in the given directory.
+
+@c
+@c
+@c
+@page
+@subsection fpathconf - Gets configuration values for files
+
+@findex fpathconf
+@cindex gets configuration values for files
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <unistd.h>
+
+int fpathconf(
+ int filedes,
+ int name
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+Invalid argument
+
+@item EACCES
+Permission to write the file is denied
+@item ENAMETOOLONG
+
+Length of a filename string exceeds PATH_MAX and _POSIX_NO_TRUNC
+is in effect.
+
+@item ENOENT
+A file or directory does not exist
+
+@item ENOTDIR
+A component of the specified @code{path} was not a directory whan a
+directory was expected.
+
+@end table
+
+
+@subheading DESCRIPTION:
+
+@code{pathconf()} gets a value for the configuration option @code{name}
+for the open file descriptor @code{filedes}.
+
+The possible values for name are:
+
+@table @b
+@item _PC_LINK_MAX
+returns the maximum number of links to the file. If @code{filedes} or
+@code{path} refer to a directory, then the value applies to the whole
+directory. The corresponding macro is _POSIX_LINK_MAX.
+
+@item _PC_MAX_CANON
+returns the maximum length of a formatted input line, where @code{filedes}
+or @code{path} must refer to a terminal. The corresponding macro is
+@code{_POSIX_MAX_CANON}.
+
+@item _PC_MAX_INPUT
+returns the maximum length of an input line, where @code{filedes} or
+@code{path} must refer to a terminal. The corresponding macro is
+@code{_POSIX_MAX_INPUT}.
+
+@item _PC_NAME_MAX
+returns the maximum length of a filename in the directory @code{path} or
+@code{filedes}. The process is allowed to create. The corresponding macro
+is @code{_POSIX_NAME_MAX}.
+
+@item _PC_PATH_MAX
+returns the maximum length of a relative pathname when @code{path} or
+@code{filedes} is the current working directory. The corresponding macro
+is @code{_POSIX_PATH_MAX}.
+
+@item _PC_PIPE_BUF
+returns the size of the pipe buffer, where @code{filedes} must refer to a
+pipe or FIFO and @code{path} must refer to a FIFO. The corresponding macro
+is @code{_POSIX_PIPE_BUF}.
+
+@item _PC_CHOWN_RESTRICTED
+returns nonzero if the @code{chown()} call may not be used on this file. If
+@code{filedes} or @code{path} refer to a directory, then this applies to all
+files in that directory. The corresponding macro is
+@code{_POSIX_CHOWN_RESTRICTED}.
+
+@end table
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection mknod - create a directory
+
+@findex mknod
+@cindex create a directory
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+long mknod(
+ const char *pathname,
+ mode_t mode,
+ dev_t dev
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{mknod} returns zero on success, or -1 if an error occurred (in which case,
+errno is set appropriately).
+
+@table @b
+@item ENAMETOOLONG
+@code{pathname} was too long.
+
+@item ENOENT
+A directory component in @code{pathname} does not exist or is a dangling symbolic
+link.
+
+@item ENOTDIR
+A component used in the directory @code{pathname} is not, in fact, a directory.
+
+@item ENOMEM
+Insufficient kernel memory was available
+
+@item EROFS
+@code{pathname} refers to a file on a read-only filesystem.
+
+@item ELOOP
+@code{pathname} contains a reference to a circular symbolic link, ie a symbolic
+link whose expansion contains a reference to itself.
+
+@item ENOSPC
+The device containing @code{pathname} has no room for the new node.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@code{mknod} attempts to create a filesystem node (file, device special file or
+named pipe) named @code{pathname}, specified by @code{mode} and @code{dev}.
+
+@code{mode} specifies both the permissions to use and the type of node to be created.
+
+It should be a combination (using bitwise OR) of one of the file types listed
+below and the permissions for the new node.
+
+The permissions are modified by the process's @code{umask} in the usual way: the
+permissions of the created node are @code{(mode & ~umask)}.
+
+The file type should be one of @code{S_IFREG}, @code{S_IFCHR}, @code{S_IFBLK} and
+@code{S_IFIFO} to specify a normal file (which will be created empty), character
+special file, block special file or FIFO (named pipe), respectively, or zero, which
+will create a normal file.
+
+If the file type is @code{S_IFCHR} or @code{S_IFBLK} then @code{dev} specifies the major
+and minor numbers of the newly created device special file; otherwise it is ignored.
+
+The newly created node will be owned by the effective uid of the process. If the
+directory containing the node has the set group id bit set, or if the filesystem
+is mounted with BSD group semantics, the new node will inherit the group ownership
+from its parent directory; otherwise it will be owned by the effective gid of the
+process.
+
+
+@subheading NOTES:
+
+NONE
diff --git a/doc/posix_users/gen_size_report b/doc/posix_users/gen_size_report
new file mode 100644
index 0000000000..da4d303343
--- /dev/null
+++ b/doc/posix_users/gen_size_report
@@ -0,0 +1,213 @@
+#
+# Hack of a script to generate a very long list which contains
+# the size information for every service listed in this manual
+#
+# This script must be modified by the user to tailor it for their
+# environment. This is VERY ugly and could be replaced by something
+# nicer in the future if this report style is useful.
+#
+# $Id$
+#
+
+#cpu=sparc
+#bsp=erc32
+
+#cpu=powerpc
+#bsp=mcp750
+
+cpu=v850
+bsp=bare
+symprefix=_
+
+#objdir=/usr1/rtems/build/build-${cpu}-rtems/${cpu}-rtems/c/${bsp}/
+#libc=/opt/rtems/${cpu}-rtems/lib/libc.a
+#libm=/opt/rtems/${cpu}-rtems/lib/libm.a
+objdir=/usr1/rtems/work/tools-v850/b-rtems/${cpu}-rtems/c/${bsp}/
+libc=/usr2/test-v850/${cpu}-rtems/lib/libc.a
+libm=/usr2/test-v850/${cpu}-rtems/lib/libm.a
+srcdir=$r/src
+docdir=$d
+nm=${cpu}-rtems-nm
+size=${cpu}-rtems-size
+ar=${cpu}-rtems-ar
+
+#
+# All customization should be above this point
+#
+
+check_objs()
+{
+ for i in *.o
+ do
+ ${nm} $i | grep "T ${symprefix}${1}$" >/dev/null
+ if [ $? -eq 0 ] ; then
+ echo $i
+ return 0
+ fi
+ done
+ return 1
+}
+per_manager()
+{
+ docfile=$1
+ shift
+ subdirs=$*
+ grep ^@item ${docfile} | grep "@code.* - " | \
+ grep -v "@item E" | \
+ grep -v "@code{CONFIGURE" | \
+ grep -v "@value{RPREFIX" | \
+ sed -e 's/@value{DIRPREFIX}/rtems_/' | \
+ cut -d'{' -f2 | sed -e 's/}//' | cut -d'-' -f1 >/tmp/XXX.size
+
+ if [ `wc -c </tmp/XXX.size` -eq 1 ] ; then
+ return
+ fi
+ echo "====> `grep ^@chapter ${docfile} | sed -e 's/@chapter //'`"
+ cat /tmp/XXX.size | while read line
+ do
+ # echo $line
+ found=no
+ for subd in ${subdirs}
+ do
+ if [ ${found} = "no" ] ; then
+ cd ${objdir}/${subd}/o-optimize/
+ objfile=`check_objs $line`
+ if [ $? -eq 0 ] ; then
+ found=yes
+ #echo ${objfile}
+ objcode=`${size} ${objfile} | tail -1 | cut -f1`
+ objdata=`${size} ${objfile} | tail -1 | cut -f2`
+ objbss=`${size} ${objfile} | tail -1 | cut -f3`
+ objcode=`echo ${objcode}`
+ objdata=`echo ${objdata}`
+ objbss=`echo ${objbss}`
+ echo "${line} - ${objcode}, ${objdata}, ${objbss}"
+ fi
+ fi
+ done
+ if [ ${found} = "no" ] ; then
+ echo "$line - macro or not implemented"
+ fi
+
+ done
+}
+
+
+# extract libc
+if [ ! -d ${objdir}/newlib_extract/o-optimize ] ; then
+ mkdir -p ${objdir}/newlib_extract/o-optimize
+ cd ${objdir}/newlib_extract/o-optimize
+ list=`${ar} t ${libc}`
+ for i in $list
+ do
+ ${ar} x ${libc} ${i}
+ done
+fi
+
+# extract libm
+if [ ! -d ${objdir}/libm_extract/o-optimize ] ; then
+ mkdir -p ${objdir}/libm_extract/o-optimize
+ cd ${objdir}/libm_extract/o-optimize
+ list=`${ar} t ${libm}`
+ for i in $list
+ do
+ ${ar} x ${libm} ${i}
+ done
+fi
+
+# grab the size of the Classic API
+#
+# NOTE: This API is always configured.
+#
+cd ${docdir}/user
+echo
+echo "=============================================================="
+echo "=============================================================="
+echo "==== ===="
+echo "==== CLASSIC API SIZE INFORMATION ===="
+echo "==== ===="
+echo "=============================================================="
+echo "=============================================================="
+echo
+if [ -r ${objdir}/../../../${bsp}/lib/librtems.a ] ; then
+ for i in *.t
+ do
+ per_manager $i exec/rtems/src exec/sapi/src lib/libc
+ done
+else
+ echo "RTEMS Classic API not configured."
+fi
+
+# Grab the size of the POSIX API
+cd ${docdir}/posix_users
+echo
+echo "=============================================================="
+echo "=============================================================="
+echo "==== ===="
+echo "==== POSIX 1003.1b API SIZE INFORMATION ===="
+echo "==== ===="
+echo "=============================================================="
+echo "=============================================================="
+echo
+if [ -r ${objdir}/../../../${bsp}/lib/libposix.a ] ; then
+ for i in `ls -1 *.t | grep -v libc.t | grep -v libm.t`
+ do
+ per_manager $i exec/posix/src lib/libc newlib_extract
+ done
+else
+ echo "POSIX API not configured."
+fi
+
+# Grab the size of the POSIX routines provided by the C Library
+cd ${docdir}/posix_users
+echo
+echo "=============================================================="
+echo "=============================================================="
+echo "==== ===="
+echo "==== LIBC API SIZE INFORMATION ===="
+echo "==== ===="
+echo "=============================================================="
+echo "=============================================================="
+echo
+for i in libc.t
+do
+ per_manager $i exec/posix/src lib/libc newlib_extract
+done
+
+# Grab the size of the libm routines
+cd ${docdir}/posix_users
+echo
+echo "=============================================================="
+echo "=============================================================="
+echo "==== ===="
+echo "==== LIBM API SIZE INFORMATION ===="
+echo "==== ===="
+echo "=============================================================="
+echo "=============================================================="
+echo
+for i in libm.t
+do
+ per_manager $i exec/posix/src lib/libc libm_extract
+done
+
+# Grab the size of the ITRON API
+cd ${docdir}/itron3.0
+echo
+echo "=============================================================="
+echo "=============================================================="
+echo "==== ===="
+echo "==== ITRON 3.0 API SIZE INFORMATION ===="
+echo "==== ===="
+echo "=============================================================="
+echo "=============================================================="
+echo
+if [ -r ${objdir}/../../../${bsp}/lib/libitron.a ] ; then
+ for i in *.t
+ do
+ per_manager $i exec/itron/src
+ done
+else
+ echo "ITRON API not configured."
+fi
+
+
diff --git a/doc/posix_users/io.t b/doc/posix_users/io.t
new file mode 100644
index 0000000000..570772c543
--- /dev/null
+++ b/doc/posix_users/io.t
@@ -0,0 +1,1144 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Input and Output Primitives Manager
+
+@section Introduction
+
+The input and output primitives manager is ...
+
+The directives provided by the input and output primitives manager are:
+
+@itemize @bullet
+@item @code{pipe} - Create an Inter-Process Channel
+@item @code{dup} - Duplicates an open file descriptor
+@item @code{dup2} - Duplicates an open file descriptor
+@item @code{close} - Closes a file
+@item @code{read} - Reads from a file
+@item @code{write} - Writes to a file
+@item @code{fcntl} - Manipulates an open file descriptor
+@item @code{lseek} - Reposition read/write file offset
+@item @code{fsync} - Synchronize file complete in-core state with that on disk
+@item @code{fdatasync} - Synchronize file in-core data with that on disk
+@item @code{sync} - Schedule file system updates
+@item @code{mount} - Mount a file system
+@item @code{unmount} - Unmount file systems
+@item @code{aio_read} - Asynchronous Read
+@item @code{aio_write} - Asynchronous Write
+@item @code{lio_listio} - List Directed I/O
+@item @code{aio_error} - Retrieve Error Status of Asynchronous I/O Operation
+@item @code{aio_return} - Retrieve Return Status Asynchronous I/O Operation
+@item @code{aio_cancel} - Cancel Asynchronous I/O Request
+@item @code{aio_suspend} - Wait for Asynchronous I/O Request
+@item @code{aio_fsync} - Asynchronous File Synchronization
+@end itemize
+
+@section Background
+
+There is currently no text in this section.
+
+@section Operations
+
+There is currently no text in this section.
+
+@section Directives
+
+This section details the input and output primitives manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@c
+@c
+@c
+@page
+@subsection pipe - Create an Inter-Process Channel
+
+@findex pipe
+@cindex create an inter
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int pipe(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+This routine is not currently supported by RTEMS but could be
+in a future version.
+
+@c
+@c
+@c
+@page
+@subsection dup - Duplicates an open file descriptor
+
+@findex dup
+@cindex duplicates an open file descriptor
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <unistd.h>
+
+int dup(
+ int fildes
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EBADF
+Invalid file descriptor.
+
+@item EINTR
+Function was interrupted by a signal.
+
+@item EMFILE
+The process already has the maximum number of file descriptors open
+and tried to open a new one.
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{dup} function returns the lowest numbered available file
+descriptor. This new desciptor refers to the same open file as the
+original descriptor and shares any locks.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection dup2 - Duplicates an open file descriptor
+
+@findex dup2
+@cindex duplicates an open file descriptor
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <unistd.h>
+
+int dup2(
+ int fildes,
+ int fildes2
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EBADF
+Invalid file descriptor.
+
+@item EINTR
+Function was interrupted by a signal.
+
+@item EMFILE
+The process already has the maximum number of file descriptors open
+and tried to open a new one.
+@end table
+
+@subheading DESCRIPTION:
+
+@code{Dup2} creates a copy of the file descriptor @code{oldfd}.
+
+The old and new descriptors may be used interchangeably. They share locks, file
+position pointers and flags; for example, if the file position is modified by using
+@code{lseek} on one of the descriptors, the position is also changed for the other.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection close - Closes a file.
+
+@findex close
+@cindex closes a file.
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <unistd.h>
+
+int close(
+ int fildes
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EBADF
+Invalid file descriptor
+
+@item EINTR
+Function was interrupted by a signal.
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{close()} function deallocates the file descriptor named by
+@code{fildes} and makes it available for reuse. All outstanding
+record locks owned by this process for the file are unlocked.
+
+@subheading NOTES:
+
+A signal can interrupt the @code{close()} function. In that case,
+@code{close()} returns -1 with @code{errno} set to EINTR. The file
+may or may not be closed.
+
+@c
+@c
+@c
+@page
+@subsection read - Reads from a file.
+
+@findex read
+@cindex reads from a file.
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <unistd.h>
+
+int read(
+ int fildes,
+ void *buf,
+ unsigned int nbyte
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+On error, this routine returns -1 and sets @code{errno} to one of
+the following:
+
+@table @b
+@item EAGAIN
+The O_NONBLOCK flag is set for a file descriptor and the process
+would be delayed in the I/O operation.
+
+@item EBADF
+Invalid file descriptor
+
+@item EINTR
+Function was interrupted by a signal.
+
+@item EIO
+Input or output error
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{read()} function reads @code{nbyte} bytes from the file
+associated with @code{fildes} into the buffer pointed to by @code{buf}.
+
+The @code{read()} function returns the number of bytes actually read
+and placed in the buffer. This will be less than @code{nbyte} if:
+
+@itemize @bullet
+
+@item The number of bytes left in the file is less than @code{nbyte}.
+
+@item The @code{read()} request was interrupted by a signal.
+
+@item The file is a pipe or FIFO or special file with less than @code{nbytes}
+immediately available for reading.
+
+@end itemize
+
+When attempting to read from any empty pipe or FIFO:
+
+
+@itemize @bullet
+
+@item If no process has the pipe open for writing, zero is returned to
+indicate end-of-file.
+
+@item If some process has the pipe open for writing and O_NONBLOCK is set,
+-1 is returned and @code{errno} is set to EAGAIN.
+
+@item If some process has the pipe open for writing and O_NONBLOCK is clear,
+@code{read()} waits for some data to be written or the pipe to be closed.
+
+@end itemize
+
+
+When attempting to read from a file other than a pipe or FIFO and no data
+is available.
+
+@itemize @bullet
+
+@item If O_NONBLOCK is set, -1 is returned and @code{errno} is set to EAGAIN.
+
+@item If O_NONBLOCK is clear, @code{read()} waits for some data to become
+available.
+
+@item The O_NONBLOCK flag is ignored if data is available.
+
+@end itemize
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection write - Writes to a file
+
+@findex write
+@cindex writes to a file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <unistd.h>
+
+int write(
+ int fildes,
+ const void *buf,
+ unsigned int nbytes
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EAGAIN
+The O_NONBLOCK flag is set for a file descriptor and the process
+would be delayed in the I/O operation.
+
+@item EBADF
+Invalid file descriptor
+
+@item EFBIG
+An attempt was made to write to a file that exceeds the maximum file
+size
+
+@item EINTR
+The function was interrupted by a signal.
+
+@item EIO
+Input or output error.
+
+@item ENOSPC
+No space left on disk.
+
+@item EPIPE
+Attempt to write to a pope or FIFO with no reader.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{write()} function writes @code{nbyte} from the array pointed
+to by @code{buf} into the file associated with @code{fildes}.
+
+If @code{nybte} is zero and the file is a regular file, the @code{write()}
+function returns zero and has no other effect. If @code{nbyte} is zero
+and the file is a special file, te results are not portable.
+
+The @code{write()} function returns the number of bytes written. This
+number will be less than @code{nbytes} if there is an error. It will never
+be greater than @code{nbytes}.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection fcntl - Manipulates an open file descriptor
+
+@findex fcntl
+@cindex manipulates an open file descriptor
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+int fcntl(
+ int fildes,
+ int cmd
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EACCESS
+Search permission is denied for a direcotry in a file's path
+prefix.
+
+@item EAGAIN
+The O_NONBLOCK flag is set for a file descriptor and the process
+would be delayed in the I/O operation.
+
+@item EBADF
+Invalid file descriptor
+
+@item EDEADLK
+An @code{fcntl} with function F_SETLKW would cause a deadlock.
+
+@item EINTR
+The functioin was interrupted by a signal.
+
+@item EINVAL
+Invalid argument
+
+@item EMFILE
+Too many file descriptor or in use by the process.
+
+@item ENOLCK
+No locks available
+
+@end table
+
+@subheading DESCRIPTION:
+
+@code{fcntl()} performs one of various miscellaneous operations on
+@code{fd}. The operation in question is determined by @code{cmd}:
+
+@table @b
+
+@item F_DUPFD
+Makes @code{arg} be a copy of @code{fd}, closing @code{fd} first if necessary.
+
+The same functionality can be more easily achieved by using @code{dup2()}.
+
+The old and new descriptors may be used interchangeably. They share locks,
+file position pointers and flags; for example, if the file position is
+modified by using @code{lseek()} on one of the descriptors, the position is
+also changed for the other.
+
+The two descriptors do not share the close-on-exec flag, however. The
+close-on-exec flag of the copy is off, meaning that it will be closed on
+exec.
+
+On success, the new descriptor is returned.
+
+@item F_GETFD
+Read the close-on-exec flag. If the low-order bit is 0, the file will
+remain open across exec, otherwise it will be closed.
+
+@item F_SETFD
+Set the close-on-exec flag to the value specified by @code{arg} (only the least
+significant bit is used).
+
+@item F_GETFL
+Read the descriptor's flags (all flags (as set by open()) are returned).
+
+@item F_SETFL
+Set the descriptor's flags to the value specified by @code{arg}. Only
+@code{O_APPEND} and @code{O_NONBLOCK} may be set.
+
+The flags are shared between copies (made with @code{dup()} etc.) of the same
+file descriptor.
+
+The flags and their semantics are described in @code{open()}.
+
+@item F_GETLK, F_SETLK and F_SETLKW
+Manage discretionary file locks. The third argument @code{arg} is a pointer to a
+struct flock (that may be overwritten by this call).
+
+@item F_GETLK
+Return the flock structure that prevents us from obtaining the lock, or set the
+@code{l_type} field of the lock to @code{F_UNLCK} if there is no obstruction.
+
+@item F_SETLK
+The lock is set (when @code{l_type} is @code{F_RDLCK} or @code{F_WRLCK}) or
+cleared (when it is @code{F_UNLCK}. If lock is held by someone else, this
+call returns -1 and sets @code{errno} to EACCES or EAGAIN.
+
+@item F_SETLKW
+Like @code{F_SETLK}, but instead of returning an error we wait for the lock to
+be released.
+
+@item F_GETOWN
+Get the process ID (or process group) of the owner of a socket.
+
+Process groups are returned as negative values.
+
+@item F_SETOWN
+Set the process or process group that owns a socket.
+
+For these commands, ownership means receiving @code{SIGIO} or @code{SIGURG}
+signals.
+
+Process groups are specified using negative values.
+
+@end table
+
+@subheading NOTES:
+
+The errors returned by @code{dup2} are different from those returned by
+@code{F_DUPFD}.
+
+@c
+@c
+@c
+@page
+@subsection lseek - Reposition read/write file offset
+
+@findex lseek
+@cindex reposition read/write file offset
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+#include <unistd.h>
+
+int lseek(
+ int fildes,
+ off_t offset,
+ int whence
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EBADF
+@code{Fildes} is not an open file descriptor.
+
+@item ESPIPE
+@code{Fildes} is associated with a pipe, socket or FIFO.
+
+@item EINVAL
+@code{Whence} is not a proper value.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{lseek} function repositions the offset of the file descriptor
+@code{fildes} to the argument offset according to the directive whence.
+The argument @code{fildes} must be an open file descriptor. @code{Lseek}
+repositions the file pointer fildes as follows:
+
+@itemize @bullet
+
+@item
+If @code{whence} is SEEK_SET, the offset is set to @code{offset} bytes.
+
+@item
+If @code{whence} is SEEK_CUR, the offset is set to its current location
+plus offset bytes.
+
+@item
+If @code{whence} is SEEK_END, the offset is set to the size of the
+file plus @code{offset} bytes.
+
+@end itemize
+
+The @code{lseek} function allows the file offset to be set beyond the end
+of the existing end-of-file of the file. If data is later written at this
+point, subsequent reads of the data in the gap return bytes of zeros
+(until data is actually written into the gap).
+
+Some devices are incapable of seeking. The value of the pointer associated
+with such a device is undefined.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection fsync - Synchronize file complete in-core state with that on disk
+
+@findex fsync
+@cindex synchronize file complete in
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int fsync(
+ int fd
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+On success, zero is returned. On error, -1 is returned, and @code{errno}
+is set appropriately.
+
+@table @b
+@item EBADF
+@code{fd} is not a valid descriptor open for writing
+
+@item EINVAL
+@code{fd} is bound to a special file which does not support support synchronization
+
+@item EROFS
+@code{fd} is bound to a special file which does not support support synchronization
+
+@item EIO
+An error occurred during synchronization
+
+@end table
+
+@subheading DESCRIPTION:
+
+@code{fsync} copies all in-core parts of a file to disk.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection fdatasync - Synchronize file in-core data with that on disk.
+
+@findex fdatasync
+@cindex synchronize file in
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int fdatasync(
+ int fd
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+On success, zero is returned. On error, -1 is returned, and @code{errno} is
+set appropriately.
+
+@table @b
+@item EBADF
+@code{fd} is not a valid file descriptor open for writing.
+
+@item EINVAL
+@code{fd} is bound to a special file which does not support synchronization.
+
+@item EIO
+An error occurred during synchronization.
+
+@item EROFS
+@code{fd} is bound to a special file which dows not support synchronization.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@code{fdatasync} flushes all data buffers of a file to disk (before the system call
+returns). It resembles @code{fsync} but is not required to update the metadata such
+as access time.
+
+Applications that access databases or log files often write a tiny data fragment
+(e.g., one line in a log file) and then call @code{fsync} immediately in order to
+ensure that the written data is physically stored on the harddisk. Unfortunately,
+fsync will always initiate two write operations: one for the newly written data and
+another one in order to update the modification time stored in the inode. If the
+modification time is not a part of the transaction concept @code{fdatasync} can be
+used to avoid unnecessary inode disk write operations.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection sync - Schedule file system updates
+
+@findex sync
+@cindex synchronize file systems
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+void sync(void);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+NONE
+
+@subheading DESCRIPTION:
+
+The @code{sync} service causes all information in memory that updates
+file systems to be scheduled for writing out to all file systems.
+
+
+@subheading NOTES:
+
+The writing of data to the file systems is only guaranteed to be
+scheduled upon return. It is not necessarily complete upon return
+from @code{sync}.
+
+@c
+@c
+@c
+@page
+@subsection mount - Mount a file system
+
+@findex mount
+@cindex mount a file system
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <libio.h>
+
+int mount(
+ rtems_filesystem_mount_table_entry_t **mt_entry,
+ rtems_filesystem_operations_table *fs_ops,
+ rtems_filesystem_options_t fsoptions,
+ char *device,
+ char *mount_point
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EXXX
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{mount} routines mounts the filesystem class
+which uses the filesystem operations specified by @code{fs_ops}
+and @code{fsoptions}. The filesystem is mounted at the directory
+@code{mount_point} and the mode of the mounted filesystem is
+specified by @code{fsoptions}. If this filesystem class requires
+a device, then the name of the device must be specified by @code{device}.
+
+If this operation succeeds, the mount table entry for the mounted
+filesystem is returned in @code{mt_entry}.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection unmount - Unmount file systems
+
+@findex unmount
+@cindex unmount file systems
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <libio.h>
+
+int unmount(
+ const char *mount_path
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EXXX
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{unmount} routine removes the attachment of the filesystem specified
+by @code{mount_path}.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection aio_read - Asynchronous Read
+
+@findex aio_read
+@cindex asynchronous read
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int aio_read(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+This routine is not currently supported by RTEMS but could be
+in a future version.
+
+@c
+@c
+@c
+@page
+@subsection aio_write - Asynchronous Write
+
+@findex aio_write
+@cindex asynchronous write
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int aio_write(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+This routine is not currently supported by RTEMS but could be
+in a future version.
+
+@c
+@c
+@c
+@page
+@subsection lio_listio - List Directed I/O
+
+@findex lio_listio
+@cindex list directed i/o
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int lio_listio(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+This routine is not currently supported by RTEMS but could be
+in a future version.
+
+@c
+@c
+@c
+@page
+@subsection aio_error - Retrieve Error Status of Asynchronous I/O Operation
+
+@findex aio_error
+@cindex retrieve error status of asynchronous i/o operation
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int aio_error(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+This routine is not currently supported by RTEMS but could be
+in a future version.
+
+@c
+@c
+@c
+@page
+@subsection aio_return - Retrieve Return Status Asynchronous I/O Operation
+
+@findex aio_return
+@cindex retrieve return status asynchronous i/o operation
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int aio_return(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+This routine is not currently supported by RTEMS but could be
+in a future version.
+
+@c
+@c
+@c
+@page
+@subsection aio_cancel - Cancel Asynchronous I/O Request
+
+@findex aio_cancel
+@cindex cancel asynchronous i/o request
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int aio_cancel(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+This routine is not currently supported by RTEMS but could be
+in a future version.
+
+@c
+@c
+@c
+@page
+@subsection aio_suspend - Wait for Asynchronous I/O Request
+
+@findex aio_suspend
+@cindex wait for asynchronous i/o request
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int aio_suspend(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+This routine is not currently supported by RTEMS but could be
+in a future version.
+
+@c
+@c
+@c
+@page
+@subsection aio_fsync - Asynchronous File Synchronization
+
+@findex aio_fsync
+@cindex asynchronous file synchronization
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int aio_fsync(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+This routine is not currently supported by RTEMS but could be
+in a future version.
diff --git a/doc/posix_users/key.t b/doc/posix_users/key.t
new file mode 100644
index 0000000000..8a317e7ace
--- /dev/null
+++ b/doc/posix_users/key.t
@@ -0,0 +1,152 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Key Manager
+
+@section Introduction
+
+The key manager ...
+
+The directives provided by the key manager are:
+
+@itemize @bullet
+@item @code{pthread_key_create} - Create Thread Specific Data Key
+@item @code{pthread_key_delete} - Delete Thread Specific Data Key
+@item @code{pthread_setspecific} - Set Thread Specific Key Value
+@item @code{pthread_getspecific} - Get Thread Specific Key Value
+@end itemize
+
+@section Background
+
+There is currently no text in this section.
+
+@section Operations
+
+There is currently no text in this section.
+
+@section Directives
+
+This section details the key manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@c
+@c
+@c
+@page
+@subsection pthread_key_create - Create Thread Specific Data Key
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_key_create(
+ pthread_key_t *key,
+ void (*destructor)( void )
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EAGAIN
+There were not enough resources available to create another key.
+
+@item ENOMEM
+Insufficient memory exists to create the key.
+
+@end table
+
+@c
+@c
+@c
+@page
+@subsection pthread_key_delete - Delete Thread Specific Data Key
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_key_delete(
+pthread_key_t key,
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The key was invalid
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection pthread_setspecific - Set Thread Specific Key Value
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_setspecific(
+pthread_key_t key,
+const void *value
+);
+@end example
+
+@subheading STATUS CODES:
+@table @b
+@item EINVAL
+The specified key is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection pthread_getspecific - Get Thread Specific Key Value
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+void *pthread_getspecific(
+pthread_key_t key
+);
+@end example
+
+@subheading STATUS CODES:
+@table @b
+@item NULL
+There is no thread-specific data associated with the specified key.
+
+@item non-NULL
+The data associated with the specified key.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
diff --git a/doc/posix_users/libc.t b/doc/posix_users/libc.t
new file mode 100644
index 0000000000..2cd3406962
--- /dev/null
+++ b/doc/posix_users/libc.t
@@ -0,0 +1,348 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Services Provided by C Library (libc)
+
+@section Introduction
+
+This section lists the routines that provided by the Newlib C Library.
+
+@section Standard Utility Functions (stdlib.h)
+
+@itemize @bullet
+@item @code{abort} - Abnormal termination of a program
+@item @code{abs} - Integer absolute value (magnitude)
+@item @code{assert} - Macro for Debugging Diagnostics
+@item @code{atexit} - Request execution of functions at program exit
+@item @code{atof} - String to double or float
+@item @code{atoi} - String to integer
+@item @code{bsearch} - Binary search
+@item @code{calloc} - Allocate space for arrays
+@item @code{div} - Divide two integers
+@item @code{ecvtbuf} - Double or float to string of digits
+@item @code{ecvt} - Double or float to string of digits (malloc result)
+@item @code{__env_lock} - Lock environment list for getenv and setenv
+@item @code{gvcvt} - Format double or float as string
+@item @code{exit} - End program execution
+@item @code{getenv} - Look up environment variable
+@item @code{labs} - Long integer absolute value (magnitude)
+@item @code{ldiv} - Divide two long integers
+@item @code{malloc} - Allocate memory
+@item @code{realloc} - Reallocate memory
+@item @code{free} - Free previously allocated memory
+@item @code{mallinfo} - Get information about allocated memory
+@item @code{__malloc_lock} - Lock memory pool for malloc and free
+@item @code{mbstowcs} - Minimal multibyte string to wide string converter
+@item @code{mblen} - Minimal multibyte length
+@item @code{mbtowc} - Minimal multibyte to wide character converter
+@item @code{qsort} - Sort an array
+@item @code{rand} - Pseudo-random numbers
+@item @code{strtod} - String to double or float
+@item @code{strtol} - String to long
+@item @code{strtoul} - String to unsigned long
+@item @code{system} - Execute command string
+@item @code{wcstombs} - Minimal wide string to multibyte string converter
+@item @code{wctomb} - Minimal wide character to multibyte converter
+@end itemize
+
+@section Character Type Macros and Functions (ctype.h)
+
+@itemize @bullet
+@item @code{isalnum} - Alphanumeric character predicate
+@item @code{isalpha} - Alphabetic character predicate
+@item @code{isascii} - ASCII character predicate
+@item @code{iscntrl} - Control character predicate
+@item @code{isdigit} - Decimal digit predicate
+@item @code{islower} - Lower-case character predicate
+@item @code{isprint} - Printable character predicates (isprint, isgraph)
+@item @code{ispunct} - Punctuation character predicate
+@item @code{isspace} - Whitespace character predicate
+@item @code{isupper} - Uppercase character predicate
+@item @code{isxdigit} - Hexadecimal digit predicate
+@item @code{toascii} - Force integers to ASCII range
+@item @code{tolower} - Translate characters to lower case
+@item @code{toupper} - Translate characters to upper case
+@end itemize
+
+@section Input and Output (stdio.h)
+
+@itemize @bullet
+@item @code{clearerr} - Clear file or stream error indicator
+@item @code{fclose} - Close a file
+@item @code{feof} - Test for end of file
+@item @code{ferror} - Test whether read/write error has occurred
+@item @code{fflush} - Flush buffered file output
+@item @code{fgetc} - Get a character from a file or stream
+@item @code{fgetpos} - Record position in a stream or file
+@item @code{fgets} - Get character string from a file or stream
+@item @code{fiprintf} - Write formatted output to file (integer only)
+@item @code{fopen} - Open a file
+@item @code{fdopen} - Turn an open file into a stream
+@item @code{fputc} - Write a character on a stream or file
+@item @code{fputs} - Write a character string in a file or stream
+@item @code{fread} - Read array elements from a file
+@item @code{freopen} - Open a file using an existing file descriptor
+@item @code{fseek} - Set file position
+@item @code{fsetpos} - Restore position of a stream or file
+@item @code{ftell} - Return position in a stream or file
+@item @code{fwrite} - Write array elements from memory to a file or stream
+@item @code{getc} - Get a character from a file or stream (macro)
+@item @code{getchar} - Get a character from standard input (macro)
+@item @code{gets} - Get character string from standard input (obsolete)
+@item @code{iprintf} - Write formatted output (integer only)
+@item @code{mktemp} - Generate unused file name
+@item @code{perror} - Print an error message on standard error
+@item @code{putc} - Write a character on a stream or file (macro)
+@item @code{putchar} - Write a character on standard output (macro)
+@item @code{puts} - Write a character string on standard output
+@item @code{remove} - Delete a file's name
+@item @code{rename} - Rename a file
+@item @code{rewind} - Reinitialize a file or stream
+@item @code{setbuf} - Specify full buffering for a file or stream
+@item @code{setvbuf} - Specify buffering for a file or stream
+@item @code{siprintf} - Write formatted output (integer only)
+@item @code{printf} - Write formatted output
+@item @code{scanf} - Scan and format input
+@item @code{tmpfile} - Create a temporary file
+@item @code{tmpnam} - Generate name for a temporary file
+@item @code{vprintf} - Format variable argument list
+@end itemize
+
+@section Strings and Memory (string.h)
+
+@itemize @bullet
+@item @code{bcmp} - Compare two memory areas
+@item @code{bcopy} - Copy memory regions
+@item @code{bzero} - Initialize memory to zero
+@item @code{index} - Search for character in string
+@item @code{memchr} - Find character in memory
+@item @code{memcmp} - Compare two memory areas
+@item @code{memcpy} - Copy memory regions
+@item @code{memmove} - Move possibly overlapping memory
+@item @code{memset} - Set an area of memory
+@item @code{rindex} - Reverse search for character in string
+@item @code{strcasecmp} - Compare strings ignoring case
+@item @code{strcat} - Concatenate strings
+@item @code{strchr} - Search for character in string
+@item @code{strcmp} - Character string compare
+@item @code{strcoll} - Locale specific character string compare
+@item @code{strcpy} - Copy string
+@item @code{strcspn} - Count chars not in string
+@item @code{strerror} - Convert error number to string
+@item @code{strlen} - Character string length
+@item @code{strlwr} - Convert string to lower case
+@item @code{strncasecmp} - Compare strings ignoring case
+@item @code{strncat} - Concatenate strings
+@item @code{strncmp} - Character string compare
+@item @code{strncpy} - Counted copy string
+@item @code{strpbrk} - Find chars in string
+@item @code{strrchr} - Reverse search for character in string
+@item @code{strspn} - Find initial match
+@item @code{strstr} - Find string segment
+@item @code{strtok} - Get next token from a string
+@item @code{strupr} - Convert string to upper case
+@item @code{strxfrm} - Transform string
+@end itemize
+
+@section Signal Handling (signal.h)
+
+@itemize @bullet
+@item @code{raise} - Send a signal
+@item @code{signal} - Specify handler subroutine for a signal
+@end itemize
+
+@section Time Functions (time.h)
+
+@itemize @bullet
+@item @code{asctime} - Format time as string
+@item @code{clock} - Cumulative processor time
+@item @code{ctime} - Convert time to local and format as string
+@item @code{difftime} - Subtract two times
+@item @code{gmtime} - Convert time to UTC (GMT) traditional representation
+@item @code{localtime} - Convert time to local representation
+@item @code{mktime} - Convert time to arithmetic representation
+@item @code{strftime} - Flexible calendar time formatter
+@item @code{time} - Get current calendar time (as single number)
+@end itemize
+
+@section Locale (locale.h)
+
+@itemize @bullet
+@item @code{setlocale} - Select or query locale
+@end itemize
+
+@section Reentrant Versions of Functions
+
+
+@itemize @bullet
+@item Equivalent for errno variable:
+
+@itemize @bullet
+@item @code{errno_r} - XXX
+@end itemize
+
+@item Locale functions:
+
+@itemize @bullet
+@item @code{localeconv_r} - XXX
+@item @code{setlocale_r} - XXX
+@end itemize
+
+@item Equivalents for stdio variables:
+
+@itemize @bullet
+@item @code{stdin_r} - XXX
+@item @code{stdout_r} - XXX
+@item @code{stderr_r} - XXX
+@end itemize
+
+@item Stdio functions:
+
+@itemize @bullet
+@item @code{fdopen_r} - XXX
+@item @code{perror_r} - XXX
+@item @code{tempnam_r} - XXX
+@item @code{fopen_r} - XXX
+@item @code{putchar_r} - XXX
+@item @code{tmpnam_r} - XXX
+@item @code{getchar_r} - XXX
+@item @code{puts_r} - XXX
+@item @code{tmpfile_r} - XXX
+@item @code{gets_r} - XXX
+@item @code{remove_r} - XXX
+@item @code{vfprintf_r} - XXX
+@item @code{iprintf_r} - XXX
+@item @code{rename_r} - XXX
+@item @code{vsnprintf_r} - XXX
+@item @code{mkstemp_r} - XXX
+@item @code{snprintf_r} - XXX
+@item @code{vsprintf_r} - XXX
+@item @code{mktemp_t} - XXX
+@item @code{sprintf_r} - XXX
+@end itemize
+
+@item Signal functions:
+
+@itemize @bullet
+@item @code{init_signal_r} - XXX
+@item @code{signal_r} - XXX
+@item @code{kill_r} - XXX
+@item @code{_sigtramp_r} - XXX
+@item @code{raise_r} - XXX
+@end itemize
+
+@item Stdlib functions:
+
+@itemize @bullet
+@item @code{calloc_r} - XXX
+@item @code{mblen_r} - XXX
+@item @code{srand_r} - XXX
+@item @code{dtoa_r} - XXX
+@item @code{mbstowcs_r} - XXX
+@item @code{strtod_r} - XXX
+@item @code{free_r} - XXX
+@item @code{mbtowc_r} - XXX
+@item @code{strtol_r} - XXX
+@item @code{getenv_r} - XXX
+@item @code{memalign_r} - XXX
+@item @code{strtoul_r} - XXX
+@item @code{mallinfo_r} - XXX
+@item @code{mstats_r} - XXX
+@item @code{system_r} - XXX
+@item @code{malloc_r} - XXX
+@item @code{rand_r} - XXX
+@item @code{wcstombs_r} - XXX
+@item @code{malloc_r} - XXX
+@item @code{realloc_r} - XXX
+@item @code{wctomb_r} - XXX
+@item @code{malloc_stats_r} - XXX
+@item @code{setenv_r} - XXX
+@end itemize
+
+@item String functions:
+
+@itemize @bullet
+@item @code{strtok_r} - XXX
+@end itemize
+
+@item System functions:
+
+@itemize @bullet
+@item @code{close_r} - XXX
+@item @code{link_r} - XXX
+@item @code{unlink_r} - XXX
+@item @code{execve_r} - XXX
+@item @code{lseek_r} - XXX
+@item @code{wait_r} - XXX
+@item @code{fcntl_r} - XXX
+@item @code{open_r} - XXX
+@item @code{write_r} - XXX
+@item @code{fork_r} - XXX
+@item @code{read_r} - XXX
+@item @code{fstat_r} - XXX
+@item @code{sbrk_r} - XXX
+@item @code{gettimeofday_r} - XXX
+@item @code{stat_r} - XXX
+@item @code{getpid_r} - XXX
+@item @code{times_r} - XXX
+@end itemize
+
+@item Time function:
+
+@itemize @bullet
+@item @code{asctime_r} - XXX
+@end itemize
+
+@end itemize
+
+@section Miscellaneous Macros and Functions
+
+
+@itemize @bullet
+@item @code{unctrl} - Return printable representation of a character
+@end itemize
+
+@section Variable Argument Lists
+
+
+@itemize @bullet
+
+@item Stdarg (stdarg.h):
+@itemize @bullet
+@item @code{va_start} - XXX
+@item @code{va_arg} - XXX
+@item @code{va_end} - XXX
+@end itemize
+
+@item Vararg (varargs.h):
+@itemize @bullet
+@item @code{va_alist} - XXX
+@item @code{va_start-trad} - XXX
+@item @code{va_arg-trad} - XXX
+@item @code{va_end-trad} - XXX
+@end itemize
+@end itemize
+
+@section Reentrant System Calls
+
+@itemize @bullet
+@item @code{open_r} - XXX
+@item @code{close_r} - XXX
+@item @code{lseek_r} - XXX
+@item @code{read_r} - XXX
+@item @code{write_r} - XXX
+@item @code{fork_r} - XXX
+@item @code{wait_r} - XXX
+@item @code{stat_r} - XXX
+@item @code{fstat_r} - XXX
+@item @code{link_r} - XXX
+@item @code{unlink_r} - XXX
+@item @code{sbrk_r} - XXX
+@end itemize
+
+
diff --git a/doc/posix_users/libm.t b/doc/posix_users/libm.t
new file mode 100644
index 0000000000..77d1cb90eb
--- /dev/null
+++ b/doc/posix_users/libm.t
@@ -0,0 +1,58 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Services Provided by the Math Library (libm)
+
+@section Introduction
+
+This section lists the routines that provided by the Newlib Math Library
+(libm).
+
+@section Standard Math Functions (math.h)
+
+@itemize @bullet
+@item @code{acos} - Arccosine
+@item @code{acosh} - Inverse hyperbolic cosine
+@item @code{asin} - Arcsine
+@item @code{asinh} - Inverse hyperbolic sine
+@item @code{atan} - Arctangent
+@item @code{atan2} - Arctangent of y/x
+@item @code{atanh} - Inverse hyperbolic tangent
+@item @code{jN} - Bessel functions (jN and yN)
+@item @code{cbrt} - Cube root
+@item @code{copysign} - Sign of Y and magnitude of X
+@item @code{cosh} - Hyperbolic cosine
+@item @code{erf} - Error function (erf and erfc)
+@item @code{exp} - Exponential
+@item @code{expm1} - Exponential of x and - 1
+@item @code{fabs} - Absolute value (magnitude)
+@item @code{floor} - Floor and ceiling (floor and ceil)
+@item @code{fmod} - Floating-point remainder (modulo)
+@item @code{frexp} - Split floating-point number
+@item @code{gamma} - Logarithmic gamma function
+@item @code{hypot} - Distance from origin
+@item @code{ilogb} - Get exponent
+@item @code{infinity} - Floating infinity
+@item @code{isnan} - Check type of number
+@item @code{ldexp} - Load exponent
+@item @code{log} - Natural logarithms
+@item @code{log10} - Base 10 logarithms
+@item @code{log1p} - Log of 1 + X
+@item @code{matherr} - Modifiable math error handler
+@item @code{modf} - Split fractional and integer parts
+@item @code{nan} - Floating Not a Number
+@item @code{nextafter} - Get next representable number
+@item @code{pow} - X to the power Y
+@item @code{remainder} - remainder of X divided by Y
+@item @code{scalbn} - scalbn
+@item @code{sin} - Sine or cosine (sin and cos)
+@item @code{sinh} - Hyperbolic sine
+@item @code{sqrt} - Positive square root
+@item @code{tan} - Tangent
+@item @code{tanh} - Hyperbolic tangent
+@end itemize
diff --git a/doc/posix_users/memorymgmt.t b/doc/posix_users/memorymgmt.t
new file mode 100644
index 0000000000..daf951a4bb
--- /dev/null
+++ b/doc/posix_users/memorymgmt.t
@@ -0,0 +1,375 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Memory Management Manager
+
+@section Introduction
+
+The
+memory management manager is ...
+
+The directives provided by the memory management manager are:
+
+@itemize @bullet
+@item @code{mlockall} - Lock the Address Space of a Process
+@item @code{munlockall} - Unlock the Address Space of a Process
+@item @code{mlock} - Lock a Range of the Process Address Space
+@item @code{munlock} - Unlock a Range of the Process Address Space
+@item @code{mmap} - Map Process Addresses to a Memory Object
+@item @code{munmap} - Unmap Previously Mapped Addresses
+@item @code{mprotect} - Change Memory Protection
+@item @code{msync} - Memory Object Synchronization
+@item @code{shm_open} - Open a Shared Memory Object
+@item @code{shm_unlink} - Remove a Shared Memory Object
+@end itemize
+
+@section Background
+
+There is currently no text in this section.
+
+@section Operations
+
+There is currently no text in this section.
+
+@section Directives
+
+This section details the memory management manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@c
+@c
+@c
+@page
+@subsection mlockall - Lock the Address Space of a Process
+
+@findex mlockall
+@cindex lock the address space of a process
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int mlockall(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection munlockall - Unlock the Address Space of a Process
+
+@findex munlockall
+@cindex unlock the address space of a process
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int munlockall(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection mlock - Lock a Range of the Process Address Space
+
+@findex mlock
+@cindex lock a range of the process address space
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int mlock(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection munlock - Unlock a Range of the Process Address Space
+
+@findex munlock
+@cindex unlock a range of the process address space
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int munlock(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection mmap - Map Process Addresses to a Memory Object
+
+@findex mmap
+@cindex map process addresses to a memory object
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int mmap(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection munmap - Unmap Previously Mapped Addresses
+
+@findex munmap
+@cindex unmap previously mapped addresses
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int munmap(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection mprotect - Change Memory Protection
+
+@findex mprotect
+@cindex change memory protection
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int mprotect(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection msync - Memory Object Synchronization
+
+@findex msync
+@cindex memory object synchronization
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int msync(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection shm_open - Open a Shared Memory Object
+
+@findex shm_open
+@cindex open a shared memory object
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int shm_open(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection shm_unlink - Remove a Shared Memory Object
+
+@findex shm_unlink
+@cindex remove a shared memory object
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int shm_unlink(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
diff --git a/doc/posix_users/message.t b/doc/posix_users/message.t
new file mode 100644
index 0000000000..eb7581bbed
--- /dev/null
+++ b/doc/posix_users/message.t
@@ -0,0 +1,695 @@
+@c
+@c COPYRIGHT(c) 1988-2002.
+@c On-Line Applications Research Corporation(OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Message Passing Manager
+
+@section Introduction
+
+The message passing manager is the means to provide communication and
+synchronization capabilities using POSIX message queues.
+
+The directives provided by the message passing manager are:
+
+@itemize @bullet
+@item @code{mq_open} - Open a Message Queue
+@item @code{mq_close} - Close a Message Queue
+@item @code{mq_unlink} - Remove a Message Queue
+@item @code{mq_send} - Send a Message to a Message Queue
+@item @code{mq_receive} - Receive a Message from a Message Queue
+@item @code{mq_notify} - Notify Process that a Message is Available
+@item @code{mq_setattr} - Set Message Queue Attributes
+@item @code{mq_getattr} - Get Message Queue Attributes
+@end itemize
+
+@section Background
+
+@subsection Theory
+
+Message queues are named objects that operate with readers and writers.
+In addition, a message queue is a priority queue of discrete messages.
+POSIX message queues offer a certain, basic amount of application access
+to, and control over, the message queue geometry that can be changed.
+
+@subsection Messages
+
+A message is a variable length buffer where information can be stored to
+support communication. The length of the message and the information
+stored in that message are user-defined and can be actual data,
+pointer(s), or empty. There is a maximum acceptable length for a message
+that is associated with each message queue.
+
+@subsection Message Queues
+
+Message queues are named objects similar to the pipes of POSIX. They are
+a means of communicating data between multiple processes and for passing
+messages among tasks and ISRs. Message queues can contain a variable
+number of messages from 0 to an upper limit that is user defined. The
+maximum length of the message can be set on a per message queue basis.
+Normally messages are sent and received from the message queue in FIFO
+order. However, messages can also be prioritized and a priority queue
+established for the passing of messages. Synchronization is needed when a
+task waits for a message to arrive at a queue. Also, a task may poll a
+queue for the arrival of a message.
+
+@findex mqd_t
+The message queue descriptor @code{mqd_t} represents the message queue. It is
+passed as an argument to all of the message queue functions.
+
+@subsection Building a Message Queue Attribute Set
+
+The mq_attr structure is used to define the characteristics of the message
+queue.
+
+@findex mq_attr
+@example
+@group
+typedef struct mq_attr@{
+ long mq_flags;
+ long mq_maxmsg;
+ long mq_msgsize;
+ long mq_curmsgs;
+@};
+@end group
+@end example
+
+All of these attributes are set when the message queue is created using
+mq_open. The mq_flags field is not used in the creation of a message
+queue, it is only used by mq_setattr and mq_getattr. The structure
+mq_attr is passed as an argument to mq_setattr and mq_getattr.
+
+The mq_flags contain information affecting the behavior of the message
+queue. The O_NONBLOCK mq_flag is the only flag that is defined. In
+mq_setattr, the mq_flag can be set to dynamically change the blocking and
+non-blocking behavior of the message queue. If the non-block flag is set
+then the message queue is non-blocking, and requests to send and receive
+messages do not block waiting for resources. For a blocking message
+queue, a request to send might have to wait for an empty message queue,
+and a request to receive might have to wait for a message to arrive on the
+queue. Both mq_maxmsg and mq_msgsize affect the sizing of the message
+queue. mq_maxmsg specifies how many messages the queue can hold at any
+one time. mq_msgsize specifies the size of any one message on the queue.
+If either of these limits is exceeded, an error message results.
+
+Upon return from mq_getattr, the mq_curmsgs is set according to the
+current state of the message queue. This specifies the number of messages
+currently on the queue.
+
+@subsection Notification of a Message on the Queue
+
+Every message queue has the ability to notify one (and only one) process
+whenever the queue's state changes from empty (0 messages) to nonempty.
+This means that the process does not have to block or constantly poll
+while it waits for a message. By calling mq_notify, you can attach a
+notification request to a message queue. When a message is received by an
+empty queue, if there are no processes blocked and waiting for the
+message, then the queue notifies the requesting process of a message
+arrival. There is only one signal sent by the message queue, after that
+the notification request is de-registered and another process can attach
+its notification request. After receipt of a notification, a process must
+re-register if it wishes to be notified again.
+
+If there is a process blocked and waiting for the message, that process
+gets the message, and notification is not sent. It is also possible for
+another process to receive the message after the notification is sent but
+before the notified process has sent its receive request.
+
+Only one process can have a notification request attached to a message
+queue at any one time. If another process attempts to register a
+notification request, it fails. You can de-register for a message queue
+by passing a NULL to mq_notify, this removes any notification request
+attached to the queue. Whenever the message queue is closed, all
+notification attachments are removed.
+
+@subsection POSIX Interpretation Issues
+
+There is one significant point of interpretation related to
+the RTEMS implementation of POSIX message queues:
+
+@cite{What happens to threads already blocked on a message queue when the
+mode of that same message queue is changed from blocking to non-blocking?}
+
+
+The RTEMS POSIX implementation decided to unblock all waiting tasks
+with an @code{EAGAIN} status just as if a non-blocking version of
+the same operation had returned unsatisfied. This case is not
+discussed in the POSIX standard and other implementations may have
+chosen alternative behaviors.
+
+@section Operations
+
+@subsection Opening or Creating a Message Queue
+
+If the message queue already exists, mq_open() opens it, if the message
+queue does not exist, mq_open() creates it. When a message queue is
+created, the geometry of the message queue is contained in the attribute
+structure that is passed in as an argument. This includes mq_msgsize that
+dictates the maximum size of a single message, and the mq_maxmsg that
+dictates the maximum number of messages the queue can hold at one time.
+The blocking or non-blocking behavior of the queue can also specified.
+
+@subsection Closing a Message Queue
+
+The mq_close() function is used to close the connection made to a message
+queue that was made during mq_open. The message queue itself and the
+messages on the queue are persistent and remain after the queue is closed.
+
+@subsection Removing a Message Queue
+
+The mq_unlink() function removes the named message queue. If the message
+queue is not open when mq_unlink is called, then the queue is immediately
+eliminated. Any messages that were on the queue are lost, and the queue
+can not be opened again. If processes have the queue open when mq_unlink
+is called, the removal of the queue is delayed until the last process
+using the queue has finished. However, the name of the message queue is
+removed so that no other process can open it.
+
+@subsection Sending a Message to a Message Queue
+
+The mq_send() function adds the message in priority order to the message
+queue. Each message has an assigned a priority. The highest priority
+message is be at the front of the queue.
+
+The maximum number of messages that a message queue may accept is
+specified at creation by the mq_maxmsg field of the attribute structure.
+If this amount is exceeded, the behavior of the process is determined
+according to what oflag was used when the message queue was opened. If
+the queue was opened with O_NONBLOCK flag set, the process does not block,
+and an error is returned. If the O_NONBLOCK flag was not set, the process
+does block and wait for space on the queue.
+
+@subsection Receiving a Message from a Message Queue
+
+The mq_receive() function is used to receive the oldest of the highest
+priority message(s) from the message queue specified by mqdes. The
+messages are received in FIFO order within the priorities. The received
+message's priority is stored in the location referenced by the msg_prio.
+If the msg_prio is a NULL, the priority is discarded. The message is
+removed and stored in an area pointed to by msg_ptr whose length is of
+msg_len. The msg_len must be at least equal to the mq_msgsize attribute
+of the message queue.
+
+The blocking behavior of the message queue is set by O_NONBLOCK at mq_open
+or by setting O_NONBLOCK in mq_flags in a call to mq_setattr. If this is
+a blocking queue, the process does block and wait on an empty queue. If
+this a non-blocking queue, the process does not block. Upon successful
+completion, mq_receive returns the length of the selected message in bytes
+and the message is removed from the queue.
+
+@subsection Notification of Receipt of a Message on an Empty Queue
+
+The mq_notify() function registers the calling process to be notified of
+message arrival at an empty message queue. Every message queue has the
+ability to notify one (and only one) process whenever the queue's state
+changes from empty (0 messages) to nonempty. This means that the process
+does not have to block or constantly poll while it waits for a message.
+By calling mq_notify, a notification request is attached to a message
+queue. When a message is received by an empty queue, if there are no
+processes blocked and waiting for the message, then the queue notifies the
+requesting process of a message arrival. There is only one signal sent by
+the message queue, after that the notification request is de-registered
+and another process can attach its notification request. After receipt of
+a notification, a process must re-register if it wishes to be notified
+again.
+
+If there is a process blocked and waiting for the message, that process
+gets the message, and notification is not sent. Only one process can have
+a notification request attached to a message queue at any one time. If
+another process attempts to register a notification request, it fails.
+You can de-register for a message queue by passing a NULL to mq_notify,
+this removes any notification request attached to the queue. Whenever the
+message queue is closed, all notification attachments are removed.
+
+@subsection Setting the Attributes of a Message Queue
+
+The mq_setattr() function is used to set attributes associated with the
+open message queue description referenced by the message queue descriptor
+specified by mqdes. The *omqstat represents the old or previous
+attributes. If omqstat is non-NULL, the function mq_setattr() stores, in
+the location referenced by omqstat, the previous message queue attributes
+and the current queue status. These values are the same as would be
+returned by a call to mq_getattr() at that point.
+
+There is only one mq_attr.mq_flag that can be altered by this call. This
+is the flag that deals with the blocking and non-blocking behavior of the
+message queue. If the flag is set then the message queue is non-blocking,
+and requests to send or receive do not block while waiting for resources.
+If the flag is not set, then message send and receive may involve waiting
+for an empty queue or waiting for a message to arrive.
+
+@subsection Getting the Attributes of a Message Queue
+
+The mq_getattr() function is used to get status information and attributes
+of the message queue associated with the message queue descriptor. The
+results are returned in the mq_attr structure referenced by the mqstat
+argument. All of these attributes are set at create time, except the
+blocking/non-blocking behavior of the message queue which can be
+dynamically set by using mq_setattr. The attribute mq_curmsg is set to
+reflect the number of messages on the queue at the time that mq_getattr
+was called.
+
+@section Directives
+
+This section details the message passing manager's directives. A
+subsection is dedicated to each of this manager's directives and describes
+the calling sequence, related constants, usage, and status codes.
+
+@c
+@c
+@c
+@page
+@subsection mq_open - Open a Message Queue
+
+@findex mq_open
+@cindex open a message queue
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <mqueue.h>
+
+mqd_t mq_open(
+ const char *name,
+ int oflag,
+ mode_t mode,
+ struct mq_attr *attr
+);
+@end example
+
+@subheading STATUS CODES:
+
+@code{EACCES} - Either the message queue exists and the permissions
+requested in oflags were denied, or the message does not exist and
+permission to create one is denied.
+
+@code{EEXIST} - You tried to create a message queue that already exists.
+
+@code{EINVAL} - An inappropriate name was given for the message queue, or
+the values of mq-maxmsg or mq_msgsize were less than 0.
+
+@code{ENOENT} - The message queue does not exist, and you did not specify
+to create it.
+
+@code{EINTR} - The call to mq_open was interrupted by a signal.
+
+@code{EMFILE} - The process has too many files or message queues open.
+This is a process limit error.
+
+@code{ENFILE} - The system has run out of resources to support more open
+message queues. This is a system error.
+
+@code{ENAMETOOLONG} - mq_name is too long.
+
+@subheading DESCRIPTION:
+
+The mq_open () function establishes the connection between a process and a
+message queue with a message queue descriptor. If the message queue
+already exists, mq_open opens it, if the message queue does not exist,
+mq_open creates it. Message queues can have multiple senders and
+receivers. If mq_open is successful, the function returns a message queue
+descriptor. Otherwise, the function returns a -1 and sets 'errno' to
+indicate the error.
+
+The name of the message queue is used as an argument. For the best of
+portability, the name of the message queue should begin with a "/" and no
+other "/" should be in the name. Different systems interpret the name in
+different ways.
+
+The oflags contain information on how the message is opened if the queue
+already exists. This may be O_RDONLY for read only, O_WRONLY for write
+only, of O_RDWR, for read and write.
+
+In addition, the oflags contain information needed in the creation of a
+message queue. @code{O_NONBLOCK} - If the non-block flag is set then the
+message queue is non-blocking, and requests to send and receive messages
+do not block waiting for resources. If the flag is not set then the
+message queue is blocking, and a request to send might have to wait for an
+empty message queue. Similarly, a request to receive might have to wait
+for a message to arrive on the queue. @code{O_CREAT} - This call specifies
+that the call the mq_open is to create a new message queue. In this case
+the mode and attribute arguments of the function call are utilized. The
+message queue is created with a mode similar to the creation of a file,
+read and write permission creator, group, and others.
+
+The geometry of the message queue is contained in the attribute structure.
+This includes mq_msgsize that dictates the maximum size of a single
+message, and the mq_maxmsg that dictates the maximum number of messages
+the queue can hold at one time. If a NULL is used in the mq_attr
+argument, then the message queue is created with implementation defined
+defaults. @code{O_EXCL} - is always set if O_CREAT flag is set. If the
+message queue already exists, O_EXCL causes an error message to be
+returned, otherwise, the new message queue fails and appends to the
+existing one.
+
+@subheading NOTES:
+
+The mq_open () function does not add or remove messages from the queue.
+When a new message queue is being created, the mq_flag field of the
+attribute structure is not used.
+
+@c
+@c
+@c
+@page
+@subsection mq_close - Close a Message Queue
+
+@findex mq_close
+@cindex close a message queue
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <mqueue.h>
+
+int mq_close(
+ mqd_t mqdes
+);
+@end example
+
+@subheading STATUS CODES:
+
+@code{EINVAL} - The descriptor does not represent a valid open message
+queue
+
+@subheading DESCRIPTION:
+
+The mq_close function removes the association between the message queue
+descriptor, mqdes, and its message queue. If mq_close() is successfully
+completed, the function returns a value of zero; otherwise, the function
+returns a value of -1 and sets errno to indicate the error.
+
+@subheading NOTES:
+
+If the process had successfully attached a notification request to the
+message queue via mq_notify, this attachment is removed, and the message
+queue is available for another process to attach for notification.
+mq_close has no effect on the contents of the message queue, all the
+messages that were in the queue remain in the queue.
+
+@c
+@c
+@c
+@page
+@subsection mq_unlink - Remove a Message Queue
+
+@findex mq_unlink
+@cindex remove a message queue
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <mqueue.h>
+
+int mq_unlink(
+ const char *name
+);
+@end example
+
+@subheading STATUS CODES:
+
+@code{EINVAL} - The descriptor does not represent a valid message queue
+
+@subheading DESCRIPTION:
+
+The mq_unlink() function removes the named message queue. If the message
+queue is not open when mq_unlink is called, then the queue is immediately
+eliminated. Any messages that were on the queue are lost, and the queue
+can not be opened again. If processes have the queue open when mq_unlink
+is called, the removal of the queue is delayed until the last process
+using the queue has finished. However, the name of the message queue is
+removed so that no other process can open it. Upon successful completion,
+the function returns a value of zero. Otherwise, the named message queue
+is not changed by this function call, and the function returns a value of
+-1 and sets errno to indicate the error.
+
+@subheading NOTES:
+
+Calls to mq_open() to re-create the message queue may fail until the
+message queue is actually removed. However, the mq_unlink() call need not
+block until all references have been closed; it may return immediately.
+
+@c
+@c
+@c
+@page
+@subsection mq_send - Send a Message to a Message Queue
+
+@findex mq_send
+@cindex send a message to a message queue
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include<mqueue.h>
+int mq_send(
+ mqd_t mqdes,
+ const char *msg_ptr,
+ size_t msg_len,
+ unsigned int msg_prio
+);
+@end example
+
+@subheading STATUS CODES:
+
+@code{EBADF} - The descriptor does not represent a valid message queue, or the queue was opened for read only O_RDONLY
+@code{EINVAL} - The value of msg_prio was greater than the MQ_PRIO_MAX.
+@code{EMSGSIZE} - The msg_len is greater than the mq_msgsize attribute of the message queue
+@code{EAGAIN} - The message queue is non-blocking, and there is no room on the queue for another message as specified by the mq_maxmsg.
+@code{EINTR} - The message queue is blocking. While the process was waiting for free space on the queue, a signal arrived that interrupted the wait.
+
+@subheading DESCRIPTION:
+
+The mq_send() function adds the message pointed to by the argument msg_ptr
+to the message queue specified by mqdes. Each message is assigned a
+priority , from 0 to MQ_PRIO_MAX. MQ_PRIO_MAX is defined in <limits.h> and
+must be at least 32. Messages are added to the queue in order of their
+priority. The highest priority message is at the front of the queue.
+
+The maximum number of messages that a message queue may accept is
+specified at creation by the mq_maxmsg field of the attribute structure.
+If this amount is exceeded, the behavior of the process is determined
+according to what oflag was used when the message queue was opened. If
+the queue was opened with O_NONBLOCK flag set, then the EAGAIN error is
+returned. If the O_NONBLOCK flag was not set, the process blocks and
+waits for space on the queue, unless it is interrupted by a signal.
+
+Upon successful completion, the mq_send () function returns a value of
+zero. Otherwise, no message is enqueued, the function returns -1, and
+errno is set to indicate the error.
+
+@subheading NOTES:
+
+If the specified message queue is not full, mq_send inserts the message at
+the position indicated by the msg_prio argument.
+
+@c
+@c
+@c
+@page
+@subsection mq_receive - Receive a Message from a Message Queue
+
+@findex mq_receive
+@cindex receive a message from a message queue
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <mqueue.h>
+
+size_t mq_receive(
+ mqd_t mqdes,
+ char *msg_ptr,
+ size_t msg_len,
+ unsigned int *msg_prio
+);
+@end example
+
+@subheading STATUS CODES:
+
+@code{EBADF} - The descriptor does not represent a valid message queue, or the queue was opened for write only O_WRONLY
+@code{EMSGSIZE} - The msg_len is less than the mq_msgsize attribute of the message queue
+@code{EAGAIN} - The message queue is non-blocking, and the queue is empty
+@code{EINTR} - The message queue is blocking. While the process was waiting for a message to arrive on the queue, a signal arrived that interrupted the wait.
+
+@subheading DESCRIPTION:
+
+The mq_receive function is used to receive the oldest of the highest
+priority message(s) from the message queue specified by mqdes. The
+messages are received in FIFO order within the priorities. The received
+message's priority is stored in the location referenced by the msg_prio.
+If the msg_prio is a NULL, the priority is discarded. The message is
+removed and stored in an area pointed to by msg_ptr whose length is of
+msg_len. The msg_len must be at least equal to the mq_msgsize attribute
+of the message queue.
+
+The blocking behavior of the message queue is set by O_NONBLOCK at mq_open
+or by setting O_NONBLOCK in mq_flags in a call to mq_setattr. If this is
+a blocking queue, the process blocks and waits on an empty queue. If this
+a non-blocking queue, the process does not block.
+
+Upon successful completion, mq_receive returns the length of the selected
+message in bytes and the message is removed from the queue. Otherwise, no
+message is removed from the queue, the function returns a value of -1, and
+sets errno to indicate the error.
+
+@subheading NOTES:
+
+If the size of the buffer in bytes, specified by the msg_len argument, is
+less than the mq_msgsize attribute of the message queue, the function
+fails and returns an error
+
+@c
+@c
+@c
+@page
+@subsection mq_notify - Notify Process that a Message is Available
+
+@findex mq_notify
+@cindex notify process that a message is available
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <mqueue.h>
+
+int mq_notify(
+ mqd_t mqdes,
+ const struct sigevent *notification
+);
+@end example
+
+@subheading STATUS CODES:
+
+@code{EBADF} - The descriptor does not refer to a valid message queue
+@code{EBUSY} - A notification request is already attached to the queue
+
+@subheading DESCRIPTION:
+
+If the argument notification is not NULL, this function registers the
+calling process to be notified of message arrival at an empty message
+queue associated with the specified message queue descriptor, mqdes.
+
+Every message queue has the ability to notify one (and only one) process
+whenever the queue's state changes from empty (0 messages) to nonempty.
+This means that the process does not have to block or constantly poll
+while it waits for a message. By calling mq_notify, a notification
+request is attached to a message queue. When a message is received by an
+empty queue, if there are no processes blocked and waiting for the
+message, then the queue notifies the requesting process of a message
+arrival. There is only one signal sent by the message queue, after that
+the notification request is de-registered and another process can attach
+its notification request. After receipt of a notification, a process must
+re-register if it wishes to be notified again.
+
+If there is a process blocked and waiting for the message, that process
+gets the message, and notification is not be sent. Only one process can
+have a notification request attached to a message queue at any one time.
+If another process attempts to register a notification request, it fails.
+You can de-register for a message queue by passing a NULL to mq_notify;
+this removes any notification request attached to the queue. Whenever the
+message queue is closed, all notification attachments are removed.
+
+Upon successful completion, mq_notify returns a value of zero; otherwise,
+the function returns a value of -1 and sets errno to indicate the error.
+
+@subheading NOTES:
+
+It is possible for another process to receive the message after the notification is sent but before the notified process has sent its receive request.
+
+@c
+@c
+@c
+@page
+@subsection mq_setattr - Set Message Queue Attributes
+
+@findex mq_setattr
+@cindex set message queue attributes
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <mqueue.h>
+
+int mq_setattr(
+ mqd_t mqdes,
+ const struct mq_attr *mqstat,
+ struct mq_attr *omqstat
+);
+@end example
+
+@subheading STATUS CODES:
+
+@code{EBADF} - The message queue descriptor does not refer to a valid, open queue.
+@code{EINVAL} - The mq_flag value is invalid.
+
+@subheading DESCRIPTION:
+
+The mq_setattr function is used to set attributes associated with the open
+message queue description referenced by the message queue descriptor
+specified by mqdes. The *omqstat represents the old or previous
+attributes. If omqstat is non-NULL, the function mq_setattr() stores, in
+the location referenced by omqstat, the previous message queue attributes
+and the current queue status. These values are the same as would be
+returned by a call to mq_getattr() at that point.
+
+There is only one mq_attr.mq_flag which can be altered by this call.
+This is the flag that deals with the blocking and non-blocking behavior of
+the message queue. If the flag is set then the message queue is
+non-blocking, and requests to send or receive do not block while waiting
+for resources. If the flag is not set, then message send and receive may
+involve waiting for an empty queue or waiting for a message to arrive.
+
+Upon successful completion, the function returns a value of zero and the
+attributes of the message queue have been changed as specified.
+Otherwise, the message queue attributes is unchanged, and the function
+returns a value of -1 and sets errno to indicate the error.
+
+@subheading NOTES:
+
+All other fields in the mq_attr are ignored by this call.
+
+@c
+@c
+@c
+@page
+@subsection mq_getattr - Get Message Queue Attributes
+
+@findex mq_getattr
+@cindex get message queue attributes
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <mqueue.h>
+int mq_getattr(
+ mqd_t mqdes,
+ struct mq_attr *mqstat
+);
+@end example
+
+@subheading STATUS CODES:
+
+@code{EBADF} - The message queue descriptor does not refer to a valid,
+open message queue.
+
+@subheading DESCRIPTION:
+
+The mqdes argument specifies a message queue descriptor. The mq_getattr
+function is used to get status information and attributes of the message
+queue associated with the message queue descriptor. The results are
+returned in the mq_attr structure referenced by the mqstat argument. All
+of these attributes are set at create time, except the
+blocking/non-blocking behavior of the message queue which can be
+dynamically set by using mq_setattr. The attribute mq_curmsg is set to
+reflect the number of messages on the queue at the time that mq_getattr
+was called.
+
+Upon successful completion, the mq_getattr function returns zero.
+Otherwise, the function returns -1 and sets errno to indicate the error.
+
+@subheading NOTES:
+
diff --git a/doc/posix_users/mutex.t b/doc/posix_users/mutex.t
new file mode 100644
index 0000000000..c818ee5ce2
--- /dev/null
+++ b/doc/posix_users/mutex.t
@@ -0,0 +1,744 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Mutex Manager
+
+@section Introduction
+
+The mutex manager implements the functionality required of the mutex
+manager as defined by POSIX 1003.1b-1996. This standard requires that
+a compliant operating system provide the facilties to ensure that
+threads can operate with mutual exclusion from one another and
+defines the API that must be provided.
+
+The services provided by the mutex manager are:
+
+@itemize @bullet
+@item @code{pthread_mutexattr_init} - Initialize a Mutex Attribute Set
+@item @code{pthread_mutexattr_destroy} - Destroy a Mutex Attribute Set
+@item @code{pthread_mutexattr_setprotocol} - Set the Blocking Protocol
+@item @code{pthread_mutexattr_getprotocol} - Get the Blocking Protocol
+@item @code{pthread_mutexattr_setprioceiling} - Set the Priority Ceiling
+@item @code{pthread_mutexattr_getprioceiling} - Get the Priority Ceiling
+@item @code{pthread_mutexattr_setpshared} - Set the Visibility
+@item @code{pthread_mutexattr_getpshared} - Get the Visibility
+@item @code{pthread_mutex_init} - Initialize a Mutex
+@item @code{pthread_mutex_destroy} - Destroy a Mutex
+@item @code{pthread_mutex_lock} - Lock a Mutex
+@item @code{pthread_mutex_trylock} - Poll to Lock a Mutex
+@item @code{pthread_mutex_timedlock} - Lock a Mutex with Timeout
+@item @code{pthread_mutex_unlock} - Unlock a Mutex
+@item @code{pthread_mutex_setprioceiling} - Dynamically Set the Priority Ceiling
+@item @code{pthread_mutex_getprioceiling} - Dynamically Get the Priority Ceiling
+@end itemize
+
+@section Background
+
+@subsection Mutex Attributes
+
+Mutex attributes are utilized only at mutex creation time. A mutex
+attribute structure may be initialized and passed as an argument to
+the @code{mutex_init} routine. Note that the priority ceiling of
+a mutex may be set at run-time.
+
+@table @b
+@item blocking protcol
+is the XXX
+
+@item priority ceiling
+is the XXX
+
+@item pshared
+is the XXX
+
+@end table
+
+@subsection PTHREAD_MUTEX_INITIALIZER
+
+This is a special value that a variable of type @code{pthread_mutex_t}
+may be statically initialized to as shown below:
+
+@example
+pthread_mutex_t my_mutex = PTHREAD_MUTEX_INITIALIZER;
+@end example
+
+This indicates that @code{my_mutex} will be automatically initialized
+by an implicit call to @code{pthread_mutex_init} the first time
+the mutex is used.
+
+Note that the mutex will be initialized with default attributes.
+
+@section Operations
+
+There is currently no text in this section.
+
+@section Services
+
+This section details the mutex manager's services.
+A subsection is dedicated to each of this manager's services
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@c
+@c
+@c
+@page
+@subsection pthread_mutexattr_init - Initialize a Mutex Attribute Set
+
+@findex pthread_mutexattr_init
+@cindex initialize a mutex attribute set
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_mutexattr_init(
+ pthread_mutexattr_t *attr
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The attribute pointer argument is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_mutexattr_init} routine initializes the mutex attributes
+object specified by @code{attr} with the default value for all of the
+individual attributes.
+
+@subheading NOTES:
+
+XXX insert list of default attributes here.
+
+@c
+@c
+@c
+@page
+@subsection pthread_mutexattr_destroy - Destroy a Mutex Attribute Set
+
+@findex pthread_mutexattr_destroy
+@cindex destroy a mutex attribute set
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_mutexattr_destroy(
+ pthread_mutexattr_t *attr
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The attribute pointer argument is invalid.
+
+@item EINVAL
+The attribute set is not initialized.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_mutex_attr_destroy} routine is used to destroy a mutex
+attributes object. The behavior of using an attributes object after
+it is destroyed is implementation dependent.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection pthread_mutexattr_setprotocol - Set the Blocking Protocol
+
+@findex pthread_mutexattr_setprotocol
+@cindex set the blocking protocol
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_mutexattr_setprotocol(
+ pthread_mutexattr_t *attr,
+ int protocol
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The attribute pointer argument is invalid.
+
+@item EINVAL
+The attribute set is not initialized.
+
+@item EINVAL
+The protocol argument is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_mutexattr_setprotocol} routine is used to set value of the
+@code{protocol} attribute. This attribute controls the order in which
+threads waiting on this mutex will receive it.
+
+The @code{protocol} can be one of the following:
+
+@table @b
+
+@item @code{PTHREAD_PRIO_NONE}
+in which case blocking order is FIFO.
+
+@item @code{PTHREAD_PRIO_INHERIT}
+in which case blocking order is priority with the priority inheritance
+protocol in effect.
+
+@item @code{PTHREAD_PRIO_PROTECT}
+in which case blocking order is priority with the priority ceiling
+protocol in effect.
+
+@end table
+
+@subheading NOTES:
+
+There is currently no way to get simple priority blocking ordering
+with POSIX mutexes even though this could easily by supported by RTEMS.
+
+@c
+@c
+@c
+@page
+@subsection pthread_mutexattr_getprotocol - Get the Blocking Protocol
+
+@findex pthread_mutexattr_getprotocol
+@cindex get the blocking protocol
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_mutexattr_getprotocol(
+ pthread_mutexattr_t *attr,
+ int *protocol
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The attribute pointer argument is invalid.
+
+@item EINVAL
+The attribute set is not initialized.
+
+@item EINVAL
+The protocol pointer argument is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_mutexattr_getprotocol} routine is used to obtain
+the value of the @code{protocol} attribute. This attribute controls
+the order in which threads waiting on this mutex will receive it.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection pthread_mutexattr_setprioceiling - Set the Priority Ceiling
+
+@findex pthread_mutexattr_setprioceiling
+@cindex set the priority ceiling
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_mutexattr_setprioceiling(
+ pthread_mutexattr_t *attr,
+ int prioceiling
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The attribute pointer argument is invalid.
+
+@item EINVAL
+The attribute set is not initialized.
+
+@item EINVAL
+The prioceiling argument is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_mutexattr_setprioceiling} routine is used to set value of the
+@code{prioceiling} attribute. This attribute specifies the priority that
+is the ceiling for threads obtaining this mutex. Any task obtaining this
+mutex may not be of greater priority that the ceiling. If it is of lower
+priority, then its priority will be elevated to @code{prioceiling}.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection pthread_mutexattr_getprioceiling - Get the Priority Ceiling
+
+@findex pthread_mutexattr_getprioceiling
+@cindex get the priority ceiling
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_mutexattr_getprioceiling(
+ const pthread_mutexattr_t *attr,
+ int *prioceiling
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The attribute pointer argument is invalid.
+
+@item EINVAL
+The attribute set is not initialized.
+
+@item EINVAL
+The prioceiling pointer argument is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_mutexattr_getprioceiling} routine is used to obtain the
+value of the @code{prioceiling} attribute. This attribute specifies the
+priority ceiling for this mutex.
+
+
+@subheading NOTES:
+
+
+NONE
+@c
+@c
+@c
+@page
+@subsection pthread_mutexattr_setpshared - Set the Visibility
+
+@findex pthread_mutexattr_setpshared
+@cindex set the visibility
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_mutexattr_setpshared(
+ pthread_mutexattr_t *attr,
+ int pshared
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The attribute pointer argument is invalid.
+
+@item EINVAL
+The attribute set is not initialized.
+
+@item EINVAL
+The pshared argument is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection pthread_mutexattr_getpshared - Get the Visibility
+
+@findex pthread_mutexattr_getpshared
+@cindex get the visibility
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_mutexattr_getpshared(
+ const pthread_mutexattr_t *attr,
+ int *pshared
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The attribute pointer argument is invalid.
+
+@item EINVAL
+The attribute set is not initialized.
+
+@item EINVAL
+The pshared pointer argument is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection pthread_mutex_init - Initialize a Mutex
+
+@findex pthread_mutex_init
+@cindex initialize a mutex
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_mutex_init(
+ pthread_mutex_t *mutex,
+ const pthread_mutexattr_t *attr
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The attribute set is not initialized.
+
+@item EINVAL
+The specified protocol is invalid.
+
+@item EAGAIN
+The system lacked the necessary resources to initialize another mutex.
+
+@item ENOMEM
+Insufficient memory exists to initialize the mutex.
+
+@item EBUSY
+Attempted to reinialize the object reference by mutex, a previously
+initialized, but not yet destroyed.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection pthread_mutex_destroy - Destroy a Mutex
+
+@findex pthread_mutex_destroy
+@cindex destroy a mutex
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_mutex_destroy(
+ pthread_mutex_t *mutex
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The specified mutex is invalid.
+
+@item EBUSY
+Attempted to destroy the object reference by mutex, while it is locked or
+referenced by another thread.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection pthread_mutex_lock - Lock a Mutex
+
+@findex pthread_mutex_lock
+@cindex lock a mutex
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_mutex_lock(
+ pthread_mutex_t *mutex
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The specified mutex is invalid.
+
+@item EINVAL
+The mutex has the protocol attribute of PTHREAD_PRIO_PROTECT and the
+priority of the calling thread is higher than the current priority
+ceiling.
+
+@item EDEADLK
+The current thread already owns the mutex.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection pthread_mutex_trylock - Poll to Lock a Mutex
+
+@findex pthread_mutex_trylock
+@cindex poll to lock a mutex
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_mutex_trylock(
+ pthread_mutex_t *mutex
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The specified mutex is invalid.
+
+@item EINVAL
+The mutex has the protocol attribute of PTHREAD_PRIO_PROTECT and the
+priority of the calling thread is higher than the current priority
+ceiling.
+
+@item EDEADLK
+The current thread already owns the mutex.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection pthread_mutex_timedlock - Lock a Mutex with Timeout
+
+@findex pthread_mutex_timedlock
+@cindex lock a mutex with timeout
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+#include <time.h>
+
+int pthread_mutex_timedlock(
+ pthread_mutex_t *mutex,
+ const struct timespec *timeout
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The specified mutex is invalid.
+
+@item EINVAL
+The nanoseconds field of timeout is invalid.
+
+@item EINVAL
+The mutex has the protocol attribute of PTHREAD_PRIO_PROTECT and the
+priority of the calling thread is higher than the current priority
+ceiling.
+
+@item EDEADLK
+The current thread already owns the mutex.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c
+@c
+@page
+@subsection pthread_mutex_unlock - Unlock a Mutex
+
+@findex pthread_mutex_unlock
+@cindex unlock a mutex
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_mutex_unlock(
+ pthread_mutex_t *mutex
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The specified mutex is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection pthread_mutex_setprioceiling - Dynamically Set the Priority Ceiling
+
+@findex pthread_mutex_setprioceiling
+@cindex dynamically set the priority ceiling
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_mutex_setprioceiling(
+ pthread_mutex_t *mutex,
+ int prioceiling,
+ int *oldceiling
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The oldceiling pointer parameter is invalid.
+
+@item EINVAL
+The prioceiling parameter is an invalid priority.
+
+@item EINVAL
+The specified mutex is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection pthread_mutex_getprioceiling - Get the Current Priority Ceiling
+
+@findex pthread_mutex_getprioceiling
+@cindex get the current priority ceiling
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_mutex_getprioceiling(
+ pthread_mutex_t *mutex,
+ int *prioceiling
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The prioceiling pointer parameter is invalid.
+
+@item EINVAL
+The specified mutex is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
diff --git a/doc/posix_users/posix_users.texi b/doc/posix_users/posix_users.texi
new file mode 100644
index 0000000000..b9f439be0b
--- /dev/null
+++ b/doc/posix_users/posix_users.texi
@@ -0,0 +1,160 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename posix_users.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the C User's Guide
+@c
+
+@c Joel's Questions
+@c
+@c 1. Why does paragraphindent only impact makeinfo?
+@c 2. Why does paragraphindent show up in HTML?
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS On-Line Manual
+@direntry
+* RTEMS Posix API User's Guide: (posix_users).
+ Posix API User's Guide Plan
+@end direntry
+@end ifset
+
+@c variable substitution info:
+@c
+@c Note: At the moment we do not document the Ada interface but by building
+@c in the infrastructure Florist support should be simple to add.
+@set is-C
+@clear is-Ada
+@set LANGUAGE C
+@set STRUCTURE structure
+@set ROUTINE function
+@set OR |
+@set RPREFIX RTEMS_
+@set DIRPREFIX rtems_
+@c the language is @value{LANGUAGE}
+@c NOTE: don't use underscore in the name
+@c
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage RTEMS POSIX API User's Guide
+
+@setchapternewpage odd
+@settitle RTEMS POSIX API User's Guide
+@titlepage
+@finalout
+
+@title RTEMS POSIX API User's Guide
+@subtitle Edition @value{EDITION}, for RTEMS @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include preface.texi
+@include process.texi
+@include signal.texi
+@include procenv.texi
+@include files.texi
+@include io.texi
+@include device.texi
+@include cspecific.texi
+@include systemdb.texi
+@include semaphores.texi
+@include mutex.texi
+@include cond.texi
+@include memorymgmt.texi
+@include sched.texi
+@include clock.texi
+@include timer.texi
+@include message.texi
+@include thread.texi
+@include key.texi
+@include cancel.texi
+@include libc.texi
+@include libm.texi
+@include status.texi
+@ifinfo
+@node Top, Preface, (dir), (dir)
+@top posix_users
+
+This is the online version of the RTEMS POSIX API User's Guide
+
+@menu
+* Preface::
+* Process Creation and Execution Manager::
+* Signal Manager::
+* Process Environment Manager::
+* Files and Directories Manager::
+* Input and Output Primitives Manager::
+* Device- and Class- Specific Functions Manager::
+* Language-Specific Services for the C Programming Language Manager::
+* System Databases Manager::
+* Semaphore Manager::
+* Mutex Manager::
+* Condition Variable Manager::
+* Memory Management Manager::
+* Scheduler Manager::
+* Clock Manager::
+* Timer Manager::
+* Message Passing Manager::
+* Thread Manager::
+* Key Manager::
+* Thread Cancellation Manager::
+* Services Provided by C Library (libc)::
+* Services Provided by the Math Library (libm)::
+* Status of Implementation::
+* Command and Variable Index::
+* Concept Index::
+@end menu
+
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@node Command and Variable Index, Concept Index, , Top
+@unnumbered Command and Variable Index
+
+@c There are currently no Command and Variable Index entries.
+
+@printindex fn
+
+@node Concept Index, , Command and Variable Index, Top
+@unnumbered Concept Index
+
+@c There are currently no Concept Index entries.
+@printindex cp
+
+@contents
+@bye
+
diff --git a/doc/posix_users/preface.texi b/doc/posix_users/preface.texi
new file mode 100644
index 0000000000..19933dcbaf
--- /dev/null
+++ b/doc/posix_users/preface.texi
@@ -0,0 +1,36 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Preface, , Top, Top
+@end ifinfo
+@unnumbered Preface
+
+This is the User's Guide for the POSIX API support
+provided in RTEMS.
+
+The functionality described in this document is based
+on the following standards:
+
+@itemize @bullet
+
+@item POSIX 1003.1b-1993.
+
+@item POSIX 1003.1h/D3.
+
+@item Open Group Single UNIX Specification.
+
+@end itemize
+
+Much of the POSIX API standard is actually implemented in the
+Cygnus Newlib ANSI C Library. Please refer to documentation on
+Newlib for more information on the functionality it supplies.
+
+This manual is still under construction and improvements
+are welcomed from users.
+
diff --git a/doc/posix_users/procenv.t b/doc/posix_users/procenv.t
new file mode 100644
index 0000000000..db3f8936d8
--- /dev/null
+++ b/doc/posix_users/procenv.t
@@ -0,0 +1,964 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Process Environment Manager
+
+@section Introduction
+
+The process environment manager is responsible for providing the
+functions related to user and group Id management.
+
+The directives provided by the process environment manager are:
+
+@itemize @bullet
+@item @code{getpid} - Get Process ID
+@item @code{getppid} - Get Parent Process ID
+@item @code{getuid} - Get User ID
+@item @code{geteuid} - Get Effective User ID
+@item @code{getgid} - Get Real Group ID
+@item @code{getegid} - Get Effective Group ID
+@item @code{setuid} - Set User ID
+@item @code{setgid} - Set Group ID
+@item @code{getgroups} - Get Supplementary Group IDs
+@item @code{getlogin} - Get User Name
+@item @code{getlogin_r} - Reentrant Get User Name
+@item @code{getpgrp} - Get Process Group ID
+@item @code{setsid} - Create Session and Set Process Group ID
+@item @code{setpgid} - Set Process Group ID for Job Control
+@item @code{uname} - Get System Name
+@item @code{times} - Get Process Times
+@item @code{getenv} - Get Environment Variables
+@item @code{setenv} - Set Environment Variables
+@item @code{ctermid} - Generate Terminal Pathname
+@item @code{ttyname} - Determine Terminal Device Name
+@item @code{ttyname_r} - Reentrant Determine Terminal Device Name
+@item @code{isatty} - Determine if File Descriptor is Terminal
+@item @code{sysconf} - Get Configurable System Variables
+@end itemize
+
+@section Background
+
+@subsection Users and Groups
+
+RTEMS provides a single process, multi-threaded execution environment.
+In this light, the notion of user and group is somewhat without meaning.
+But RTEMS does provide services to provide a synthetic version of
+user and group. By default, a single user and group is associated
+with the application. Thus unless special actions are taken,
+every thread in the application shares the same user and group Id.
+The initial rationale for providing user and group Id functionality
+in RTEMS was for the filesystem infrastructure to implement
+file permission checks. The effective user/group Id capability
+has since been used to implement permissions checking by
+the @code{ftpd} server.
+
+In addition to the "real" user and group Ids, a process may
+have an effective user/group Id. This allows a process to
+function using a more limited permission set for certain operations.
+
+@subsection User and Group Names
+
+POSIX considers user and group Ids to be a unique integer that
+may be associated with a name. This is usually accomplished
+via a file named @code{/etc/passwd} for user Id mapping and
+@code{/etc/groups} for group Id mapping. Again, although
+RTEMS is effectively a single process and thus single user
+system, it provides limited support for user and group
+names. When configured with an appropriate filesystem, RTEMS
+will access the appropriate files to map user and group Ids
+to names.
+
+If these files do not exist, then RTEMS will synthesize
+a minimal version so this family of services return without
+error. It is important to remember that a design goal of
+the RTEMS POSIX services is to provide useable and
+meaningful results even though a full process model
+is not available.
+
+@subsection Environment Variables
+
+POSIX allows for variables in the run-time environment. These are
+name/value pairs that make be dynamically set and obtained by
+programs. In a full POSIX environment with command line shell
+and multiple processes, environment variables may be set in
+one process -- such as the shell -- and inherited by child
+processes. In RTEMS, there is only one process and thus
+only one set of environment variables across all processes.
+
+
+@section Operations
+
+@subsection Accessing User and Group Ids
+
+The user Id associated with the current thread may be obtain
+using the @code{getuid()} service. Similarly, the group Id
+may be obtained using the @code{getgid()} service.
+
+@subsection Accessing Environment Variables
+
+The value associated with an environment variable may be
+obtained using the @code{getenv()} service and set using
+the @code{putenv()} service.
+
+@section Directives
+
+This section details the process environment manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@c
+@c
+@c
+@page
+@subsection getpid - Get Process ID
+
+@findex getpid
+@cindex get process id
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int getpid( void );
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+The process Id is returned.
+
+@subheading DESCRIPTION:
+
+This service returns the process Id.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection getppid - Get Parent Process ID
+
+@findex getppid
+@cindex get parent process id
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int getppid( void );
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+The parent process Id is returned.
+
+@subheading DESCRIPTION:
+
+This service returns the parent process Id.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection getuid - Get User ID
+
+@findex getuid
+@cindex get user id
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int getuid( void );
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+The effective user Id is returned.
+
+@subheading DESCRIPTION:
+
+This service returns the effective user Id.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection geteuid - Get Effective User ID
+
+@findex geteuid
+@cindex get effective user id
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int geteuid( void );
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+The effective group Id is returned.
+
+@subheading DESCRIPTION:
+
+This service returns the effective group Id.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection getgid - Get Real Group ID
+
+@findex getgid
+@cindex get real group id
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int getgid( void );
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+The group Id is returned.
+
+@subheading DESCRIPTION:
+
+This service returns the group Id.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection getegid - Get Effective Group ID
+
+@findex getegid
+@cindex get effective group id
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int getegid( void );
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+The effective group Id is returned.
+
+@subheading DESCRIPTION:
+
+This service returns the effective group Id.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection setuid - Set User ID
+
+@findex setuid
+@cindex set user id
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int setuid(
+ uid_t uid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+This service returns 0.
+
+@subheading DESCRIPTION:
+
+This service sets the user Id to @code{uid}.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection setgid - Set Group ID
+
+@findex setgid
+@cindex set group id
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int setgid(
+ gid_t gid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+This service returns 0.
+
+@subheading DESCRIPTION:
+
+This service sets the group Id to @code{gid}.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection getgroups - Get Supplementary Group IDs
+
+@findex getgroups
+@cindex get supplementary group ids
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int getgroups(
+ int gidsetsize,
+ gid_t grouplist[]
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+NA
+
+@subheading DESCRIPTION:
+
+This service is not implemented as RTEMS has no notion of
+supplemental groups.
+
+@subheading NOTES:
+
+If supported, this routine would only be allowed for
+the super-user.
+
+@c
+@c
+@c
+@page
+@subsection getlogin - Get User Name
+
+@findex getlogin
+@cindex get user name
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+char *getlogin( void );
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+Returns a pointer to a string containing the name of the
+current user.
+
+@subheading DESCRIPTION:
+
+This routine returns the name of the current user.
+
+@subheading NOTES:
+
+This routine is not reentrant and subsequent calls to
+@code{getlogin()} will overwrite the same buffer.
+
+@c
+@c
+@c
+@page
+@subsection getlogin_r - Reentrant Get User Name
+
+@findex getlogin_r
+@cindex reentrant get user name
+@cindex get user name, reentrant
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int getlogin_r(
+ char *name,
+ size_t namesize
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The arguments were invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This is a reentrant version of the @code{getlogin()} service. The
+caller specified their own buffer, @code{name}, as well as the
+length of this buffer, @code{namesize}.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection getpgrp - Get Process Group ID
+
+@findex getpgrp
+@cindex get process group id
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+pid_t getpgrp( void );
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+The procress group Id is returned.
+
+@subheading DESCRIPTION:
+
+This service returns the current progress group Id.
+
+@subheading NOTES:
+
+This routine is implemented in a somewhat meaningful
+way for RTEMS but is truly not functional.
+
+@c
+@c
+@c
+@page
+@subsection setsid - Create Session and Set Process Group ID
+
+@findex setsid
+@cindex create session and set process group id
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+pid_t setsid( void );
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EPERM
+The application does not have permission to create a process group.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This routine always returns @code{EPERM} as RTEMS has no way
+to create new processes and thus no way to create a new process
+group.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection setpgid - Set Process Group ID for Job Control
+
+@findex setpgid
+@cindex set process group id for job control
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int setpgid(
+ pid_t pid,
+ pid_t pgid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item ENOSYS
+The routine is not implemented.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This service is not implemented for RTEMS as process groups are not
+supported.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection uname - Get System Name
+
+@findex uname
+@cindex get system name
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int uname(
+ struct utsname *name
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EPERM
+The provided structure pointer is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This service returns system information to the caller. It does this
+by filling in the @code{struct utsname} format structure for the
+caller.
+
+@subheading NOTES:
+
+The information provided includes the operating system (RTEMS in
+all configurations), the node number, the release as the RTEMS
+version, and the CPU family and model. The CPU model name
+will indicate the multilib executive variant being used.
+
+@c
+@c
+@c
+@page
+@subsection times - Get process times
+
+@findex times
+@cindex get process times
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <sys/time.h>
+
+clock_t times(
+ struct tms *ptms
+);
+@end example
+
+@subheading STATUS CODES:
+
+This routine returns the number of clock ticks that have elapsed
+since the system was initialized (e.g. the application was
+started).
+
+@subheading DESCRIPTION:
+
+@code{times} stores the current process times in @code{ptms}. The
+format of @code{struct tms} is as defined in
+@code{<sys/times.h>}. RTEMS fills in the field @code{tms_utime}
+with the number of ticks that the calling thread has executed
+and the field @code{tms_stime} with the number of clock ticks
+since system boot (also returned). All other fields in the
+@code{ptms} are left zero.
+
+@subheading NOTES:
+
+RTEMS has no way to distinguish between user and system time
+so this routine returns the most meaningful information
+possible.
+
+@c
+@c
+@c
+@page
+@subsection getenv - Get Environment Variables
+
+@findex getenv
+@cindex get environment variables
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+char *getenv(
+ const char *name
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item NULL
+when no match
+
+@item pointer to value
+when successful
+
+@end table
+
+@subheading DESCRIPTION:
+
+This service searches the set of environment variables for
+a string that matches the specified @code{name}. If found,
+it returns the associated value.
+
+@subheading NOTES:
+
+The environment list consists of name value pairs that
+are of the form @i{name = value}.
+
+@c
+@c
+@c
+@page
+@subsection setenv - Set Environment Variables
+
+@findex setenv
+@cindex set environment variables
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int setenv(
+ const char *name,
+ const char *value,
+ int overwrite
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+Returns 0 if successful and -1 otherwise.
+
+@subheading DESCRIPTION:
+
+This service adds the variable @code{name} to the environment with
+@code{value}. If @code{name} is not already exist, then it is
+created. If @code{name} exists and @code{overwrite} is zero, then
+the previous value is not overwritten.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection ctermid - Generate Terminal Pathname
+
+@findex ctermid
+@cindex generate terminal pathname
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+char *ctermid(
+ char *s
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+Returns a pointer to a string indicating the pathname for the controlling
+terminal.
+
+@subheading DESCRIPTION:
+
+This service returns the name of the terminal device associated with
+this process. If @code{s} is NULL, then a pointer to a static buffer
+is returned. Otherwise, @code{s} is assumed to have a buffer of
+sufficient size to contain the name of the controlling terminal.
+
+@subheading NOTES:
+
+By default on RTEMS systems, the controlling terminal is @code{/dev/console}.
+Again this implementation is of limited meaning, but it provides
+true and useful results which should be sufficient to ease porting
+applications from a full POSIX implementation to the reduced
+profile supported by RTEMS.
+
+@c
+@c
+@c
+@page
+@subsection ttyname - Determine Terminal Device Name
+
+@findex ttyname
+@cindex determine terminal device name
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+char *ttyname(
+ int fd
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+Pointer to a string containing the terminal device name or
+NULL is returned on any error.
+
+@subheading DESCRIPTION:
+
+This service returns a pointer to the pathname of the terminal
+device that is open on the file descriptor @code{fd}. If
+@code{fd} is not a valid descriptor for a terminal device,
+then NULL is returned.
+
+@subheading NOTES:
+
+This routine uses a static buffer.
+
+@c
+@c
+@c
+@page
+@subsection ttyname_r - Reentrant Determine Terminal Device Name
+
+@findex ttyname_r
+@cindex reentrant determine terminal device name
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int ttyname_r(
+ int fd,
+ char *name,
+ int namesize
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+This routine returns -1 and sets @code{errno} as follows:
+
+@table @b
+@item EBADF
+If not a valid descriptor for a terminal device.
+
+@item EINVAL
+If @code{name} is NULL or @code{namesize} are insufficient.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This service the pathname of the terminal device that is open
+on the file descriptor @code{fd}.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection isatty - Determine if File Descriptor is Terminal
+
+@findex isatty
+@cindex determine if file descriptor is terminal
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int isatty(
+ int fd
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+Returns 1 if @code{fd} is a terminal device and 0 otherwise.
+
+@subheading DESCRIPTION:
+
+This service returns 1 if @code{fd} is an open file descriptor
+connected to a terminal and 0 otherwise.
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection sysconf - Get Configurable System Variables
+
+@findex sysconf
+@cindex get configurable system variables
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+long sysconf(
+ int name
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+The value returned is the actual value of the system resource.
+If the requested configuration name is a feature flag, then
+1 is returned if the available and 0 if it is not. On any
+other error condition, -1 is returned.
+
+@subheading DESCRIPTION:
+
+This service is the mechanism by which an application determines
+values for system limits or options at runtime.
+
+@subheading NOTES:
+
+Much of the information that may be obtained via @code{sysconf}
+has equivalent macros in @code{<unistd.h}. However, those
+macros reflect conservative limits which may have been altered
+by application configuration.
diff --git a/doc/posix_users/process.t b/doc/posix_users/process.t
new file mode 100644
index 0000000000..7bb4bb12ad
--- /dev/null
+++ b/doc/posix_users/process.t
@@ -0,0 +1,496 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Process Creation and Execution Manager
+
+@section Introduction
+
+The process creation and execution manager provides the
+functionality associated with the creation and termination
+of processes.
+
+
+The directives provided by the process creation and execution manager are:
+
+@itemize @bullet
+@item @code{fork} - Create a Process
+@item @code{execl} - Execute a File
+@item @code{execv} - Execute a File
+@item @code{execle} - Execute a File
+@item @code{execve} - Execute a File
+@item @code{execlp} - Execute a File
+@item @code{execvp} - Execute a File
+@item @code{pthread_atfork} - Register Fork Handlers
+@item @code{wait} - Wait for Process Termination
+@item @code{waitpid} - Wait for Process Termination
+@item @code{_exit} - Terminate a Process
+@end itemize
+
+@section Background
+
+POSIX process functionality can not be completely
+supported by RTEMS. This is because RTEMS provides no memory
+protection and implements a @i{single process, multi-threaded
+execution model}. In this light, RTEMS provides none of the
+routines that are associated with the creation of new processes.
+However, since the entire RTEMS application (e.g. executable)
+is logically a single POSIX process, RTEMS is able to provide
+implementations of many operations on processes. The rule of
+thumb is that those routines provide a meaningful result.
+For example, @code{getpid()} returns the node number.
+
+@section Operations
+
+The only functionality method defined by this manager which is
+supported by RTEMS is the @code{_exit} service. The
+implementation of @code{_exit} shuts the application down and
+is equivalent to invoking either @code{exit} or
+@code{rtems_shutdown_executive}.
+
+@section Directives
+
+This section details the process creation and execution manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@c
+@c
+@c
+@page
+@subsection fork - Create a Process
+
+@findex fork
+@cindex create a process
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+
+int fork( void );
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item ENOSYS
+This routine is not supported by RTEMS.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This routine is not supported by RTEMS.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection execl - Execute a File
+
+@findex execl
+@cindex execute a file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int execl(
+ const char *path,
+ const char *arg,
+ ...
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item ENOSYS
+This routine is not supported by RTEMS.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This routine is not supported by RTEMS.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection execv - Execute a File
+
+@findex execv
+@cindex execute a file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int execv(
+ const char *path,
+ char const *argv[],
+ ...
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item ENOSYS
+This routine is not supported by RTEMS.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This routine is not supported by RTEMS.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection execle - Execute a File
+
+@findex execle
+@cindex execute a file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int execle(
+ const char *path,
+ const char *arg,
+ ...
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item ENOSYS
+This routine is not supported by RTEMS.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This routine is not supported by RTEMS.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection execve - Execute a File
+
+@findex execve
+@cindex execute a file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int execve(
+ const char *path,
+ char *const argv[],
+ char *const envp[]
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item ENOSYS
+This routine is not supported by RTEMS.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This routine is not supported by RTEMS.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection execlp - Execute a File
+
+@findex execlp
+@cindex execute a file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int execlp(
+ const char *file,
+ const char *arg,
+ ...
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item ENOSYS
+This routine is not supported by RTEMS.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This routine is not supported by RTEMS.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection execvp - Execute a File
+
+@findex execvp
+@cindex execute a file
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int execvp(
+ const char *file,
+ char *const argv[]
+ ...
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item ENOSYS
+This routine is not supported by RTEMS.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This routine is not supported by RTEMS.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection pthread_atfork - Register Fork Handlers
+
+@findex pthread_atfork
+@cindex register fork handlers
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+
+int pthread_atfork(
+ void (*prepare)(void),
+ void (*parent)(void),
+ void (*child)(void)
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item ENOSYS
+This routine is not supported by RTEMS.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This routine is not supported by RTEMS.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection wait - Wait for Process Termination
+
+@findex wait
+@cindex wait for process termination
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <sys/types.h>
+#include <sys/wait.h>
+
+int wait(
+ int *stat_loc
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item ENOSYS
+This routine is not supported by RTEMS.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This routine is not supported by RTEMS.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection waitpid - Wait for Process Termination
+
+@findex waitpid
+@cindex wait for process termination
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int wait(
+ pid_t pid,
+ int *stat_loc,
+ int options
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item ENOSYS
+This routine is not supported by RTEMS.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This routine is not supported by RTEMS.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection _exit - Terminate a Process
+
+@findex _exit
+@cindex terminate a process
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+void _exit(
+ int status
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+NONE
+
+@subheading DESCRIPTION:
+
+The @code{_exit()} function terminates the calling process.
+
+@subheading NOTES:
+
+In RTEMS, a process is equivalent to the entire application on a single
+processor. Invoking this service terminates the application.
diff --git a/doc/posix_users/sched.t b/doc/posix_users/sched.t
new file mode 100644
index 0000000000..cff5c25fc6
--- /dev/null
+++ b/doc/posix_users/sched.t
@@ -0,0 +1,219 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Scheduler Manager
+
+@section Introduction
+
+The scheduler manager ...
+
+The directives provided by the scheduler manager are:
+
+@itemize @bullet
+@item @code{sched_get_priority_min} - Get Minimum Priority Value
+@item @code{sched_get_priority_max} - Get Maximum Priority Value
+@item @code{sched_rr_get_interval} - Get Timeslicing Quantum
+@item @code{sched_yield} - Yield the Processor
+@end itemize
+
+@section Background
+
+@subsection Priority
+
+In the RTEMS implementation of the POSIX API, the priorities range from
+the low priority of @code{sched_get_priority_min()} to the highest priority of
+@code{sched_get_priority_max()}. Numerically higher values represent higher
+priorities.
+
+@subsection Scheduling Policies
+
+The following scheduling policies are available:
+
+@table @b
+@item SCHED_FIFO
+Priority-based, preemptive scheduling with no timeslicing. This is equivalent
+to what is called "manual round-robin" scheduling.
+
+@item SCHED_RR
+Priority-based, preemptive scheduling with timeslicing. Time quantums are
+maintained on a per-thread basis and are not reset at each context switch.
+Thus, a thread which is preempted and subsequently resumes execution will
+attempt to complete the unused portion of its time quantum.
+
+@item SCHED_OTHER
+Priority-based, preemptive scheduling with timeslicing. Time quantums are
+maintained on a per-thread basis and are reset at each context switch.
+
+@item SCHED_SPORADIC
+Priority-based, preemptive scheduling utilizing three additional parameters:
+budget, replenishment period, and low priority. Under this policy, the
+thread is allowed to execute for "budget" amount of time before its priority
+is lowered to "low priority". At the end of each replenishment period,
+the thread resumes its initial priority and has its budget replenished.
+
+@end table
+
+@section Operations
+
+There is currently no text in this section.
+
+@section Directives
+
+This section details the scheduler manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@c
+@c
+@c
+@page
+@subsection sched_get_priority_min - Get Minimum Priority Value
+
+@findex sched_get_priority_min
+@cindex get minimum priority value
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <sched.h>
+
+int sched_get_priority_min(
+ int policy
+);
+@end example
+
+@subheading STATUS CODES:
+
+On error, this routine returns -1 and sets errno to one of the following:
+
+@table @b
+@item EINVAL
+The indicated policy is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This routine return the minimum (numerically and logically lowest) priority
+for the specified @code{policy}.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection sched_get_priority_max - Get Maximum Priority Value
+
+@findex sched_get_priority_max
+@cindex get maximum priority value
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <sched.h>
+
+int sched_get_priority_max(
+ int policy
+);
+@end example
+
+@subheading STATUS CODES:
+
+On error, this routine returns -1 and sets errno to one of the following:
+
+@table @b
+@item EINVAL
+The indicated policy is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This routine return the maximum (numerically and logically highest) priority
+for the specified @code{policy}.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection sched_rr_get_interval - Get Timeslicing Quantum
+
+@findex sched_rr_get_interval
+@cindex get timeslicing quantum
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <sched.h>
+
+int sched_rr_get_interval(
+ pid_t pid,
+ struct timespec *interval
+);
+@end example
+
+@subheading STATUS CODES:
+
+On error, this routine returns -1 and sets errno to one of the following:
+
+@table @b
+@item ESRCH
+The indicated process id is invalid.
+
+@item EINVAL
+The specified interval pointer parameter is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This routine returns the length of the timeslice quantum in the
+@code{interval} parameter for the specified @code{pid}.
+
+@subheading NOTES:
+
+The @code{pid} argument should be 0 to indicate the calling process.
+
+@c
+@c
+@c
+@page
+@subsection sched_yield - Yield the Processor
+
+@findex sched_yield
+@cindex yield the processor
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <sched.h>
+
+int sched_yield( void );
+@end example
+
+@subheading STATUS CODES:
+
+This routine always returns zero to indicate success.
+
+@subheading DESCRIPTION:
+
+This call forces the calling thread to yield the processor to another
+thread. Normally this is used to implement voluntary round-robin
+task scheduling.
+
+@subheading NOTES:
+
+NONE
diff --git a/doc/posix_users/semaphores.t b/doc/posix_users/semaphores.t
new file mode 100644
index 0000000000..f58c1533dc
--- /dev/null
+++ b/doc/posix_users/semaphores.t
@@ -0,0 +1,596 @@
+@c
+@c COPYRIGHT(c) 1988-2002.
+@c On-Line Applications Research Corporation(OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Semaphore Manager
+
+@section Introduction
+
+The semaphore manager provides functions to allocate, delete, and control
+semaphores. This manager is based on the POSIX 1003.1 standard.
+
+The directives provided by the semaphore manager are:
+
+@itemize @bullet
+@item @code{sem_init} - Initialize an unnamed semaphore
+@item @code{sem_destroy} - Destroy an unnamed semaphore
+@item @code{sem_open} - Open a named semaphore
+@item @code{sem_close} - Close a named semaphore
+@item @code{sem_unlink} - Remove a named semaphore
+@item @code{sem_wait} - Lock a semaphore
+@item @code{sem_trywait} - Lock a semaphore
+@item @code{sem_timedwait} - Wait on a Semaphore for a Specified Time
+@item @code{sem_post} - Unlock a semaphore
+@item @code{sem_getvalue} - Get the value of a semeaphore
+@end itemize
+
+@section Background
+
+@subsection Theory
+Semaphores are used for synchronization and mutual exclusion by indicating the
+availability and number of resources. The task (the task which is returning
+resources) notifying other tasks of an event increases the number of resources
+held by the semaphore by one. The task (the task which will obtain resources)
+waiting for the event decreases the number of resources held by the semaphore
+by one. If the number of resources held by a semaphore is insufficient (namely
+0), the task requiring resources will wait until the next time resources are
+returned to the semaphore. If there is more than one task waiting for a
+semaphore, the tasks will be placed in the queue.
+
+@subsection "sem_t" Structure
+
+@findex sem_t
+
+The @code{sem_t} structure is used to represent semaphores. It is passed as an
+argument to the semaphore directives and is defined as follows:
+
+@example
+typedef int sem_t;
+@end example
+
+@subsection Building a Semaphore Attribute Set
+
+@section Operations
+
+@subsection Using as a Binary Semaphore
+Although POSIX supports mutexes, they are only visible between threads. To work
+between processes, a binary semaphore must be used.
+
+Creating a semaphore with a limit on the count of 1 effectively restricts the
+semaphore to being a binary semaphore. When the binary semaphore is available,
+the count is 1. When the binary semaphore is unavailable, the count is 0.
+
+Since this does not result in a true binary semaphore, advanced binary features like the Priority Inheritance and Priority Ceiling Protocols are not available.
+
+There is currently no text in this section.
+
+@section Directives
+
+This section details the semaphore manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@c
+@c
+@c
+@page
+@subsection sem_init - Initialize an unnamed semaphore
+
+@findex sem_init
+@cindex initialize an unnamed semaphore
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int sem_init(
+ sem_t *sem,
+ int pshared,
+ unsigned int value
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The value argument exceeds SEM_VALUE_MAX
+
+@item ENOSPC
+A resource required to initialize the semaphore has been exhausted
+The limit on semaphores (SEM_VALUE_MAX) has been reached
+
+@item ENOSYS
+The function sem_init is not supported by this implementation
+
+@item EPERM
+The process lacks appropriate privileges to initialize the semaphore
+
+@end table
+
+@subheading DESCRIPTION:
+The sem_init function is used to initialize the unnamed semaphore referred to
+by "sem". The value of the initialized semaphore is the parameter "value". The
+semaphore remains valid until it is destroyed.
+
+ADD MORE HERE XXX
+
+@subheading NOTES:
+If the functions completes successfully, it shall return a value of zero.
+Otherwise, it shall return a value of -1 and set "errno" to specify the error
+that occurred.
+
+Multiprocessing is currently not supported in this implementation.
+
+@c
+@c
+@c
+@page
+@subsection sem_destroy - Destroy an unnamed semaphore
+
+@findex sem_destroy
+@cindex destroy an unnamed semaphore
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int sem_destroy(
+ sem_t *sem
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The value argument exceeds SEM_VALUE_MAX
+
+@item ENOSYS
+The function sem_init is not supported by this implementation
+
+@item EBUSY
+There are currently processes blocked on the semaphore
+
+@end table
+
+@subheading DESCRIPTION:
+The sem_destroy function is used to destroy an unnamed semaphore refered to by
+"sem". sem_destroy can only be used on a semaphore that was created using
+sem_init.
+
+@subheading NOTES:
+If the functions completes successfully, it shall return a value of zero.
+Otherwise, it shall return a value of -1 and set "errno" to specify the error
+that occurred.
+
+Multiprocessing is currently not supported in this implementation.
+
+
+@c
+@c
+@c
+@page
+@subsection sem_open - Open a named semaphore
+
+@findex sem_open
+@cindex open a named semaphore
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int sem_open(
+ const char *name,
+ int oflag
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading ARGUMENTS:
+
+The following flag bit may be set in oflag:
+
+@code{O_CREAT} - Creates the semaphore if it does not already exist. If O_CREAT
+is set and the semaphore already exists then O_CREAT has no effect. Otherwise,
+sem_open() creates a semaphore. The O_CREAT flag requires the third and fourth
+argument: mode and value of type mode_t and unsigned int, respectively.
+
+@code{O_EXCL} - If O_EXCL and O_CREAT are set, all call to sem_open() shall fail
+if the semaphore name exists
+
+@subheading STATUS CODES:
+
+@table @b
+@item EACCES
+Valid name specified but oflag permissions are denied, or the semaphore name
+specified does not exist and permission to create the named semaphore is denied.
+
+@item EEXIST
+O_CREAT and O_EXCL are set and the named semaphore already exists.
+
+@item EINTR
+The sem_open() operation was interrupted by a signal.
+
+@item EINVAL
+The sem_open() operation is not supported for the given name.
+
+@item EMFILE
+Too many semaphore descriptors or file descriptors in use by this process.
+
+@item ENAMETOOLONG
+The length of the name exceed PATH_MAX or name component is longer than NAME_MAX
+while POSIX_NO_TRUNC is in effect.
+
+@item ENOENT
+O_CREAT is not set and the named semaphore does not exist.
+
+@item ENOSPC
+There is insufficient space for the creation of a new named semaphore.
+
+@item ENOSYS
+The function sem_open() is not supported by this implementation.
+
+@end table
+
+@subheading DESCRIPTION:
+The sem_open() function establishes a connection between a specified semaphore and
+a process. After a call to sem_open with a specified semaphore name, a process
+can reference to semaphore by the associated name using the address returned by
+the call. The oflag arguments listed above control the state of the semaphore by
+determining if the semaphore is created or accessed by a call to sem_open().
+
+@subheading NOTES:
+
+
+@c
+@c
+@c
+@page
+@subsection sem_close - Close a named semaphore
+
+@findex sem_close
+@cindex close a named semaphore
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int sem_close(
+ sem_t *sem_close
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EACCES
+The semaphore argument is not a valid semaphore descriptor.
+
+@item ENOSYS
+The function sem_close is not supported by this implementation.
+
+@end table
+
+@subheading DESCRIPTION:
+The sem_close() function is used to indicate that the calling process is finished
+using the named semaphore indicated by sem. The function sem_close deallocates
+any system resources that were previously allocated by a sem_open system call. If
+sem_close() completes successfully it returns a 1, otherwise a value of -1 is
+return and errno is set.
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection sem_unlink - Unlink a semaphore
+
+@findex sem_unlink
+@cindex unlink a semaphore
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int sem_unlink(
+ const char *name
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EACCESS
+Permission is denied to unlink a semaphore.
+
+@item ENAMETOOLONG
+The length of the strong name exceed NAME_MAX while POSIX_NO_TRUNC is in effect.
+
+@item ENOENT
+The name of the semaphore does not exist.
+
+@item ENOSPC
+There is insufficient space for the creation of a new named semaphore.
+
+@item ENOSYS
+The function sem_unlink is not supported by this implementation.
+
+@end table
+
+@subheading DESCRIPTION:
+The sem_unlink() function shall remove the semaphore name by the string name. If
+a process is currently accessing the name semaphore, the sem_unlink command has
+no effect. If one or more processes have the semaphore open when the sem_unlink
+function is called, the destruction of semaphores shall be postponed until all
+reference to semaphore are destroyed by calls to sem_close, _exit(), or exec.
+After all references have been destroyed, it returns immediately.
+
+If the termination is successful, the function shall return 0. Otherwise, a -1
+is returned and the errno is set.
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection sem_wait - Wait on a Semaphore
+
+@findex sem_wait
+@cindex wait on a semaphore
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int sem_wait(
+ sem_t *sem
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The "sem" argument does not refer to a valid semaphore
+
+@end table
+
+@subheading DESCRIPTION:
+This function attempts to lock a semaphore specified by @code{sem}. If the
+semaphore is available, then the semaphore is locked (i.e., the semaphore
+value is decremented). If the semaphore is unavailable (i.e., the semaphore
+value is zero), then the function will block until the semaphore becomes
+available. It will then successfully lock the semaphore. The semaphore
+remains locked until released by a @code{sem_post()} call.
+
+If the call is unsuccessful, then the function returns -1 and sets errno to the
+appropriate error code.
+
+@subheading NOTES:
+Multiprocessing is not supported in this implementation.
+
+@c
+@c
+@c
+@page
+@subsection sem_trywait - Non-blocking Wait on a Semaphore
+
+@findex sem_trywait
+@cindex non
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int sem_trywait(
+ sem_t *sem
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EAGAIN
+The semaphore is not available (i.e., the semaphore value is zero), so the
+semaphore could not be locked.
+
+@item EINVAL
+The @code{sem} argument does not refewr to a valid semaphore
+
+@end table
+
+@subheading DESCRIPTION:
+This function attempts to lock a semaphore specified by @code{sem}. If the
+semaphore is available, then the semaphore is locked (i.e., the semaphore
+value is decremented) and the function returns a value of 0. The semaphore
+remains locked until released by a @code{sem_post()} call. If the semaphore
+is unavailable (i.e., the semaphore value is zero), then the function will
+return a value of -1 immediately and set @code{errno} to EAGAIN.
+
+If the call is unsuccessful, then the function returns -1 and sets
+@code{errno} to the appropriate error code.
+
+@subheading NOTES:
+Multiprocessing is not supported in this implementation.
+
+@c
+@c
+@c
+@page
+@subsection sem_timedwait - Wait on a Semaphore for a Specified Time
+
+@findex sem_timedwait
+@cindex wait on a semaphore for a specified time
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int sem_timedwait(
+ sem_t *sem,
+ const struct timespec *timeout
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EAGAIN
+The semaphore is not available (i.e., the semaphore value is zero), so the
+semaphore could not be locked.
+
+@item EINVAL
+The @code{sem} argument does not refewr to a valid semaphore
+
+@end table
+
+@subheading DESCRIPTION:
+This function attemtps to lock a semaphore specified by @code{sem}, and will
+wait for the semaphore for an interval specified by @code{timeout}. If the
+semaphore is available, then the semaphore is locked (i.e., the semaphore
+value is decremented) and the function returns a value of 0. The semaphore
+remains locked until released by a @code{sem_post()} call. If the semaphore
+is unavailable, then the function will wait for the semaphore to become
+available for the amount of time specified by @code{timeout}.
+
+If the semaphore does not become available within the interval specified by
+@code{timeout}, then the function returns -1 and sets @code{errno} to EAGAIN.
+If any other error occurs, the function returns -1 and sets @code{errno} to
+the appropriate error code.
+
+@subheading NOTES:
+Multiprocessing is not supported in this implementation.
+
+@c
+@c
+@c
+@page
+@subsection sem_post - Unlock a Semaphore
+
+@findex sem_post
+@cindex unlock a semaphore
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int sem_post(
+ sem_t *sem
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The @code{sem} argument does not refer to a valid semaphore
+
+@end table
+
+@subheading DESCRIPTION:
+This function attempts to release the semaphore specified by @code{sem}. If
+other tasks are waiting on the semaphore, then one of those tasks (which one
+depends on the scheduler being used) is allowed to lock the semaphore and
+return from its @code{sem_wait()}, @code{sem_trywait()}, or
+@code{sem_timedwait()} call. If there are no other tasks waiting on the
+semaphore, then the semaphore value is simply incremented. @code{sem_post()}
+returns 0 upon successful completion.
+
+If an error occurs, the function returns -1 and sets @code{errno} to the
+appropriate error code.
+
+@subheading NOTES:
+Multiprocessing is not supported in this implementation.
+
+@c
+@c
+@c
+@page
+@subsection sem_getvalue - Get the value of a semaphore
+
+@findex sem_getvalue
+@cindex get the value of a semaphore
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int sem_getvalue(
+ sem_t *sem,
+ int *sval
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The "sem" argument does not refer to a valid semaphore
+
+@item ENOSYS
+The function sem_getvalue is not supported by this implementation
+
+@end table
+
+@subheading DESCRIPTION:
+The sem_getvalue functions sets the location referenced by the "sval" argument
+to the value of the semaphore without affecting the state of the semaphore. The
+updated value represents a semaphore value that occurred at some point during
+the call, but is not necessarily the actual value of the semaphore when it
+returns to the calling process.
+
+If "sem" is locked, the value returned by sem_getvalue will be zero or a
+negative number whose absolute value is the number of processes waiting for the
+semaphore at some point during the call.
+
+@subheading NOTES:
+If the functions completes successfully, it shall return a value of zero.
+Otherwise, it shall return a value of -1 and set "errno" to specify the error
+that occurred.
diff --git a/doc/posix_users/signal.t b/doc/posix_users/signal.t
new file mode 100644
index 0000000000..933faa56c0
--- /dev/null
+++ b/doc/posix_users/signal.t
@@ -0,0 +1,945 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Signal Manager
+
+@section Introduction
+
+The signal manager provides the functionality associated with
+the generation, delivery, and management of process-oriented
+signals.
+
+The directives provided by the signal manager are:
+
+@itemize @bullet
+@item @code{sigaddset} - Add a Signal to a Signal Set
+@item @code{sigdelset} - Delete a Signal from a Signal Set
+@item @code{sigfillset} - Fill a Signal Set
+@item @code{sigismember} - Is Signal a Member of a Signal Set
+@item @code{sigemptyset} - Empty a Signal Set
+@item @code{sigaction} - Examine and Change Signal Action
+@item @code{pthread_kill} - Send a Signal to a Thread
+@item @code{sigprocmask} - Examine and Change Process Blocked Signals
+@item @code{pthread_sigmask} - Examine and Change Thread Blocked Signals
+@item @code{kill} - Send a Signal to a Process
+@item @code{sigpending} - Examine Pending Signals
+@item @code{sigsuspend} - Wait for a Signal
+@item @code{pause} - Suspend Process Execution
+@item @code{sigwait} - Synchronously Accept a Signal
+@item @code{sigwaitinfo} - Synchronously Accept a Signal
+@item @code{sigtimedwait} - Synchronously Accept a Signal with Timeout
+@item @code{sigqueue} - Queue a Signal to a Process
+@item @code{alarm} - Schedule Alarm
+@item @code{ualarm} - Schedule Alarm in Microseconds
+@end itemize
+
+@section Background
+
+@subsection Signals
+
+POSIX signals are an asynchronous event mechanism. Each process
+and thread has a set of signals associated with it. Individual
+signals may be enabled (e.g. unmasked) or blocked (e.g. ignored)
+on both a per-thread and process level. Signals which are
+enabled have a signal handler associated with them. When the
+signal is generated and conditions are met, then the signal
+handler is invoked in the proper process or thread context
+asynchronous relative to the logical thread of execution.
+
+If a signal has been blocked when it is generated, then it
+is queued and kept pending until the thread or process unblocks
+the signal or explicitly checks for it.
+Traditional, non-real-time POSIX signals do not queue. Thus
+if a process or thread has blocked a particular signal, then
+multiple occurrences of that signal are recorded as a
+single occurrence of that signal.
+
+One can check for the set of outstanding signals that have been
+blocked. Services are provided to check for outstanding process
+or thread directed signals.
+
+@subsection Signal Delivery
+
+Signals which are directed at a thread are delivered to the specified thread.
+
+Signals which are directed at a process are delivered to a thread which
+is selected based on the following algorithm:
+
+@enumerate
+@item If the action for this signal is currently @code{SIG_IGN},
+then the signal is simply ignored.
+
+@item If the currently executing thread has the signal unblocked, then
+the signal is delivered to it.
+
+@item If any threads are currently blocked waiting for this signal
+(@code{sigwait()}), then the signal is delivered to the highest priority
+thread waiting for this signal.
+
+@item If any other threads are willing to accept delivery of the signal, then
+the signal is delivered to the highest priority thread of this set. In the
+event, multiple threads of the same priority are willing to accept this
+signal, then priority is given first to ready threads, then to threads
+blocked on calls which may be interrupted, and finally to threads blocked
+on non-interruptible calls.
+
+@item In the event the signal still can not be delivered, then it is left
+pending. The first thread to unblock the signal (@code{sigprocmask()} or
+@code{pthread_sigprocmask()}) or to wait for this signal
+(@code{sigwait()}) will be the recipient of the signal.
+
+@end enumerate
+
+@section Operations
+
+@subsection Signal Set Management
+
+Each process and each thread within that process has a set of
+individual signals and handlers associated with it. Services
+are provided to construct signal sets for the purposes of building
+signal sets -- type @code{sigset_t} -- that are used to
+provide arguments to the services that mask, unmask, and
+check on pending signals.
+
+@subsection Blocking Until Signal Generation
+
+A thread may block until receipt of a signal. The "sigwait"
+and "pause" families of services block until the requested
+signal is received or if using @code{sigtimedwait()} until the specified
+timeout period has elapsed.
+
+@subsection Sending a Signal
+
+This is accomplished
+via one of a number of services that sends a signal to either a
+process or thread. Signals may be directed at a process by
+the service @code{kill()} or at a thread by the service
+@code{pthread_kill()}
+
+@section Directives
+
+This section details the signal manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@c
+@c
+@c
+@page
+@subsection sigaddset - Add a Signal to a Signal Set
+
+@findex sigaddset
+@cindex add a signal to a signal set
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <signal.h>
+
+int sigaddset(
+ sigset_t *set,
+ int signo
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+Invalid argument passed.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This function adds the @code{signo} to the specified signal @code{set}.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection sigdelset - Delete a Signal from a Signal Set
+
+@findex sigdelset
+@cindex delete a signal from a signal set
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <signal.h>
+
+int sigdelset(
+ sigset_t *set,
+ int signo
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+Invalid argument passed.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This function deletes the @code{signo} to the specified signal @code{set}.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection sigfillset - Fill a Signal Set
+
+@findex sigfillset
+@cindex fill a signal set
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <signal.h>
+
+int sigfillset(
+ sigset_t *set
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+
+@item EINVAL
+Invalid argument passed.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This function fills the specified signal @code{set} such that all
+signals are set.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection sigismember - Is Signal a Member of a Signal Set
+
+@findex sigismember
+@cindex is signal a member of a signal set
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <signal.h>
+
+int sigismember(
+ const sigset_t *set,
+ int signo
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+
+@item EINVAL
+Invalid argument passed.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This function returns returns 1 if @code{signo} is a member of @code{set}
+and 0 otherwise.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection sigemptyset - Empty a Signal Set
+
+@findex sigemptyset
+@cindex empty a signal set
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <signal.h>
+
+int sigemptyset(
+ sigset_t *set
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+
+@item EINVAL
+Invalid argument passed.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This function fills the specified signal @code{set} such that all
+signals are cleared.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection sigaction - Examine and Change Signal Action
+
+@findex sigaction
+@cindex examine and change signal action
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <signal.h>
+
+int sigaction(
+ int sig,
+ const struct sigaction *act,
+ struct sigaction *oact
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+Invalid argument passed.
+
+@item ENOTSUP
+Realtime Signals Extension option not supported.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This function is used to change the action taken by a process on
+receipt of the specfic signal @code{sig}. The new action is
+specified by @code{act} and the previous action is returned
+via @code{oact}.
+
+@subheading NOTES:
+
+The signal number cannot be SIGKILL.
+
+@c
+@c
+@c
+@page
+@subsection pthread_kill - Send a Signal to a Thread
+
+@findex pthread_kill
+@cindex send a signal to a thread
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <signal.h>
+
+int pthread_kill(
+ pthread_t thread,
+ int sig
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+
+@item ESRCH
+The thread indicated by the parameter thread is invalid.
+
+@item EINVAL
+Invalid argument passed.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This functions sends the specified signal @code{sig} to @code{thread}.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection sigprocmask - Examine and Change Process Blocked Signals
+
+@findex sigprocmask
+@cindex examine and change process blocked signals
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <signal.h>
+
+int sigprocmask(
+ int how,
+ const sigset_t *set,
+ sigset_t *oset
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+
+@item EINVAL
+Invalid argument passed.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This function is used to alter the set of currently blocked signals
+on a process wide basis. A blocked signal will not be received by the
+process. The behavior of this function is dependent on the value of
+@code{how} which may be one of the following:
+
+@table @code
+
+@item SIG_BLOCK
+The set of blocked signals is set to the union of @code{set} and
+those signals currently blocked.
+
+@item SIG_UNBLOCK
+The signals specific in @code{set} are removed from the currently
+blocked set.
+
+@item SIG_SETMASK
+The set of currently blocked signals is set to @code{set}.
+
+@end table
+
+If @code{oset} is not @code{NULL}, then the set of blocked signals
+prior to this call is returned in @code{oset}.
+
+@subheading NOTES:
+
+It is not an error to unblock a signal which is not blocked.
+
+@c
+@c
+@c
+@page
+@subsection pthread_sigmask - Examine and Change Thread Blocked Signals
+
+@findex pthread_sigmask
+@cindex examine and change thread blocked signals
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <signal.h>
+
+int pthread_sigmask(
+ int how,
+ const sigset_t *set,
+ sigset_t *oset
+);
+@end example
+
+@subheading STATUS CODES:
+@table @b
+@item EINVAL
+Invalid argument passed.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This function is used to alter the set of currently blocked signals
+for the calling thread. A blocked signal will not be received by the
+process. The behavior of this function is dependent on the value of
+@code{how} which may be one of the following:
+
+@table @code
+@item SIG_BLOCK
+The set of blocked signals is set to the union of @code{set} and
+those signals currently blocked.
+
+@item SIG_UNBLOCK
+The signals specific in @code{set} are removed from the currently
+blocked set.
+
+@item SIG_SETMASK
+The set of currently blocked signals is set to @code{set}.
+
+@end table
+
+If @code{oset} is not @code{NULL}, then the set of blocked signals
+prior to this call is returned in @code{oset}.
+
+@subheading NOTES:
+
+It is not an error to unblock a signal which is not blocked.
+
+
+@c
+@c
+@c
+@page
+@subsection kill - Send a Signal to a Process
+
+@findex kill
+@cindex send a signal to a process
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <sys/types.h>
+#include <signal.h>
+
+int kill(
+ pid_t pid,
+ int sig
+);
+@end example
+
+@subheading STATUS CODES:
+@table @b
+@item EINVAL
+Invalid argument passed.
+
+@item EPERM
+Process does not have permission to send the signal to any receiving process.
+
+@item ESRCH
+The process indicated by the parameter pid is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This function sends the signal @code{sig} to the process @code{pid}.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection sigpending - Examine Pending Signals
+
+@findex sigpending
+@cindex examine pending signals
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <signal.h>
+
+int sigpending(
+ const sigset_t *set
+);
+@end example
+
+@subheading STATUS CODES:
+
+On error, this routine returns -1 and sets @code{errno} to one of
+the following:
+
+@table @b
+
+@item EFAULT
+Invalid address for set.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This function allows the caller to examine the set of currently pending
+signals. A pending signal is one which has been raised but is currently
+blocked. The set of pending signals is returned in @code{set}.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection sigsuspend - Wait for a Signal
+
+@findex sigsuspend
+@cindex wait for a signal
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <signal.h>
+
+int sigsuspend(
+ const sigset_t *sigmask
+);
+@end example
+
+@subheading STATUS CODES:
+
+On error, this routine returns -1 and sets @code{errno} to one of
+the following:
+
+@table @b
+
+@item EINTR
+Signal interrupted this function.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This function temporarily replaces the signal mask for the process
+with that specified by @code{sigmask} and blocks the calling thread
+until the signal is raised.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection pause - Suspend Process Execution
+
+@findex pause
+@cindex suspend process execution
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <signal.h>
+
+int pause( void );
+@end example
+
+@subheading STATUS CODES:
+
+On error, this routine returns -1 and sets @code{errno} to one of
+the following:
+
+@table @b
+
+@item EINTR
+Signal interrupted this function.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This function causes the calling thread to be blocked until an
+unblocked signal is received.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection sigwait - Synchronously Accept a Signal
+
+@findex sigwait
+@cindex synchronously accept a signal
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <signal.h>
+
+int sigwait(
+ const sigset_t *set,
+ int *sig
+);
+@end example
+
+@subheading STATUS CODES:
+@table @b
+@item EINVAL
+Invalid argument passed.
+
+@item EINTR
+Signal interrupted this function.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This function selects a pending signal based on the set specified in
+@code{set}, atomically clears it from the set of pending signals, and
+returns the signal number for that signal in @code{sig}.
+
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection sigwaitinfo - Synchronously Accept a Signal
+
+@findex sigwaitinfo
+@cindex synchronously accept a signal
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <signal.h>
+
+int sigwaitinfo(
+ const sigset_t *set,
+ siginfo_t *info
+);
+@end example
+
+@subheading STATUS CODES:
+@table @b
+@item EINTR
+Signal interrupted this function.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This function selects a pending signal based on the set specified in
+@code{set}, atomically clears it from the set of pending signals, and
+returns information about that signal in @code{info}.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection sigtimedwait - Synchronously Accept a Signal with Timeout
+
+@findex sigtimedwait
+@cindex synchronously accept a signal with timeout
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <signal.h>
+
+int sigtimedwait(
+ const sigset_t *set,
+ siginfo_t *info,
+ const struct timespec *timeout
+);
+@end example
+
+@subheading STATUS CODES:
+@table @b
+@item EAGAIN
+Timed out while waiting for the specified signal set.
+
+@item EINVAL
+Nanoseconds field of the timeout argument is invalid.
+
+@item EINTR
+Signal interrupted this function.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This function selects a pending signal based on the set specified in
+@code{set}, atomically clears it from the set of pending signals, and
+returns information about that signal in @code{info}. The calling thread
+will block up to @code{timeout} waiting for the signal to arrive.
+
+@subheading NOTES:
+
+If @code{timeout} is NULL, then the calling thread will wait forever for
+the specified signal set.
+
+@c
+@c
+@c
+@page
+@subsection sigqueue - Queue a Signal to a Process
+
+@findex sigqueue
+@cindex queue a signal to a process
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <signal.h>
+
+int sigqueue(
+ pid_t pid,
+ int signo,
+ const union sigval value
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+
+@item EAGAIN
+No resources available to queue the signal. The process has already
+queued SIGQUEUE_MAX signals that are still pending at the receiver
+or the systemwide resource limit has been exceeded.
+
+@item EINVAL
+The value of the signo argument is an invalid or unsupported signal
+number.
+
+@item EPERM
+The process does not have the appropriate privilege to send the signal
+to the receiving process.
+
+@item ESRCH
+The process pid does not exist.
+
+@end table
+
+@subheading DESCRIPTION:
+
+This function sends the signal specified by @code{signo} to the
+process @code{pid}
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection alarm - Schedule Alarm
+
+@findex alarm
+@cindex schedule alarm
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <unistd.h>
+
+unsigned int alarm(
+ unsigned int seconds
+);
+@end example
+
+@subheading STATUS CODES:
+
+This call always succeeds.
+
+If there was a previous @code{alarm()} request with time remaining,
+then this routine returns the number of seconds until that outstanding
+alarm would have fired. If no previous @code{alarm()} request was
+outstanding, then zero is returned.
+
+@subheading DESCRIPTION:
+
+The @code{alarm()} service causes the @code{SIGALRM} signal to
+be generated after the number of seconds specified by
+@code{seconds} has elapsed.
+
+@subheading NOTES:
+
+Alarm requests do not queue. If @code{alarm} is called while
+a previous request is outstanding, the call will result in
+rescheduling the time at which the @code{SIGALRM} signal
+will be generated.
+
+If the notification signal, @code{SIGALRM}, is not caught or ignored, the
+calling process is terminated.
+
+@c
+@c
+@c
+@page
+@subsection ualarm - Schedule Alarm in Microseconds
+
+@findex alarm
+@findex microseonds alarm
+@findex usecs alarm
+@cindex schedule alarm in microseonds
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <unistd.h>
+
+useconds_t ualarm(
+ useconds_t useconds,
+ useconds_t interval
+);
+@end example
+
+@subheading STATUS CODES:
+
+This call always succeeds.
+
+If there was a previous @code{ualarm()} request with time remaining,
+then this routine returns the number of seconds until that outstanding
+alarm would have fired. If no previous @code{alarm()} request was
+outstanding, then zero is returned.
+
+@subheading DESCRIPTION:
+
+The @code{ualarm()} service causes the @code{SIGALRM} signal to
+be generated after the number of microseconds specified by
+@code{useconds} has elapsed.
+
+When @code{interval} is non-zero, repeated timeout notification occurs
+with a period in microseconds specified by @code{interval}.
+
+@subheading NOTES:
+
+Alarm requests do not queue. If @code{alarm} is called while
+a previous request is outstanding, the call will result in
+rescheduling the time at which the @code{SIGALRM} signal
+will be generated.
+
+If the notification signal, @code{SIGALRM}, is not caught or ignored, the
+calling process is terminated.
+
diff --git a/doc/posix_users/status.t b/doc/posix_users/status.t
new file mode 100644
index 0000000000..61109c84fc
--- /dev/null
+++ b/doc/posix_users/status.t
@@ -0,0 +1,61 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Status of Implementation
+
+This chapter provides an overview of the status of the implementation
+of the POSIX API for RTEMS. The @i{POSIX 1003.1b Compliance Guide}
+provides more detailed information regarding the implementation of
+each of the numerous functions, constants, and macros specified by
+the POSIX 1003.1b standard.
+
+RTEMS supports many of the process and user/group oriented services
+in a "single user/single process" manner. This means that although
+these services may be of limited usefulness or functionality, they
+are provided and do work in a coherent manner. This is significant
+when porting existing code from UNIX to RTEMS.
+
+@itemize @bullet
+@item Implementation
+@itemize @bullet
+@item The current implementation of @code{dup()} is insufficient.
+@item FIFOs @code{mkfifo()} are not currently implemented.
+@item Asynchronous IO is not implemented.
+@item The @code{flockfile()} family is not implemented
+@item getc/putc unlocked family is not implemented
+@item Shared Memory is not implemented
+@item Mapped Memory is not implemented
+@item NOTES:
+@itemize @bullet
+@item For Shared Memory and Mapped Memory services, it is unclear what
+level of support is appropriate and possible for RTEMS.
+@end itemize
+@end itemize
+
+
+@item Functional Testing
+@itemize @bullet
+@item Tests for unimplemented services
+@end itemize
+
+@item Performance Testing
+@itemize @bullet
+@item There are no POSIX Performance Tests.
+@end itemize
+
+@item Documentation
+@itemize @bullet
+@item Many of the service description pages are not complete in this
+manual. These need to be completed and information added to the
+background and operations sections.
+@item Example programs (not just tests) would be very nice.
+@end itemize
+
+@end itemize
+
+
diff --git a/doc/posix_users/systemdb.t b/doc/posix_users/systemdb.t
new file mode 100644
index 0000000000..d3cf900e70
--- /dev/null
+++ b/doc/posix_users/systemdb.t
@@ -0,0 +1,307 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter System Databases Manager
+
+@section Introduction
+
+The
+system databases manager is ...
+
+The directives provided by the system databases manager are:
+
+@itemize @bullet
+@item @code{getgrgid} - Get Group File Entry for ID
+@item @code{getgrgid_r} - Reentrant Get Group File Entry
+@item @code{getgrnam} - Get Group File Entry for Name
+@item @code{getgrnam_r} - Reentrant Get Group File Entry for Name
+@item @code{getpwuid} - Get Password File Entry for UID
+@item @code{getpwuid_r} - Reentrant Get Password File Entry for UID
+@item @code{getpwnam} - Get Password File Entry for Name
+@item @code{getpwnam_r} - Reentrant Get Password File Entry for Name
+@end itemize
+
+@section Background
+
+There is currently no text in this section.
+
+@section Operations
+
+There is currently no text in this section.
+
+@section Directives
+
+This section details the system databases manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@c
+@c
+@c
+@page
+@subsection getgrgid - Get Group File Entry for ID
+
+@findex getgrgid
+@cindex get group file entry for id
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int getgrgid(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection getgrgid_r - Reentrant Get Group File Entry
+
+@findex getgrgid_r
+@cindex reentrant get group file entry
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int getgrgid_r(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection getgrnam - Get Group File Entry for Name
+
+@findex getgrnam
+@cindex get group file entry for name
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int getgrnam(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection getgrnam_r - Reentrant Get Group File Entry for Name
+
+@findex getgrnam_r
+@cindex reentrant get group file entry for name
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int getgrnam_r(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection getpwuid - Get Password File Entry for UID
+
+@findex getpwuid
+@cindex get password file entry for uid
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int getpwuid(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection getpwuid_r - Reentrant Get Password File Entry for UID
+
+@findex getpwuid_r
+@cindex reentrant get password file entry for uid
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int getpwuid_r(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection getpwnam - Password File Entry for Name
+
+@findex getpwnam
+@cindex password file entry for name
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int getpwnam(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+@c
+@c
+@c
+@page
+@subsection getpwnam_r - Reentrant Get Password File Entry for Name
+
+@findex getpwnam_r
+@cindex reentrant get password file entry for name
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+int getpwnam_r(
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@table @b
+@item E
+The
+
+@end table
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
diff --git a/doc/posix_users/thread.t b/doc/posix_users/thread.t
new file mode 100644
index 0000000000..57a75dde00
--- /dev/null
+++ b/doc/posix_users/thread.t
@@ -0,0 +1,1332 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Thread Manager
+
+@section Introduction
+
+The thread manager implements the functionality required of the thread
+manager as defined by POSIX 1003.1b-1996. This standard requires that
+a compliant operating system provide the facilties to manage multiple
+threads of control and defines the API that must be provided.
+
+The services provided by the thread manager are:
+
+@itemize @bullet
+@item @code{pthread_attr_init} - Initialize a Thread Attribute Set
+@item @code{pthread_attr_destroy} - Destroy a Thread Attribute Set
+@item @code{pthread_attr_setdetachstate} - Set Detach State
+@item @code{pthread_attr_getdetachstate} - Get Detach State
+@item @code{pthread_attr_setstacksize} - Set Thread Stack Size
+@item @code{pthread_attr_getstacksize} - Get Thread Stack Size
+@item @code{pthread_attr_setstackaddr} - Set Thread Stack Address
+@item @code{pthread_attr_getstackaddr} - Get Thread Stack Address
+@item @code{pthread_attr_setscope} - Set Thread Scheduling Scope
+@item @code{pthread_attr_getscope} - Get Thread Scheduling Scope
+@item @code{pthread_attr_setinheritsched} - Set Inherit Scheduler Flag
+@item @code{pthread_attr_getinheritsched} - Get Inherit Scheduler Flag
+@item @code{pthread_attr_setschedpolicy} - Set Scheduling Policy
+@item @code{pthread_attr_getschedpolicy} - Get Scheduling Policy
+@item @code{pthread_attr_setschedparam} - Set Scheduling Parameters
+@item @code{pthread_attr_getschedparam} - Get Scheduling Parameters
+@item @code{pthread_create} - Create a Thread
+@item @code{pthread_exit} - Terminate the Current Thread
+@item @code{pthread_detach} - Detach a Thread
+@item @code{pthread_join} - Wait for Thread Termination
+@item @code{pthread_self} - Get Thread ID
+@item @code{pthread_equal} - Compare Thread IDs
+@item @code{pthread_once} - Dynamic Package Initialization
+@item @code{pthread_setschedparam} - Set Thread Scheduling Parameters
+@item @code{pthread_getschedparam} - Get Thread Scheduling Parameters
+@end itemize
+
+@section Background
+
+@subsection Thread Attributes
+
+Thread attributes are utilized only at thread creation time. A thread
+attribute structure may be initialized and passed as an argument to
+the @code{pthread_create} routine.
+
+@table @b
+@item stack address
+is the address of the optionally user specified stack area for this thread.
+If this value is NULL, then RTEMS allocates the memory for the thread stack
+from the RTEMS Workspace Area. Otherwise, this is the user specified
+address for the memory to be used for the thread's stack. Each thread must
+have a distinct stack area. Each processor family has different alignment
+rules which should be followed.
+
+@item stack size
+is the minimum desired size for this thread's stack area.
+If the size of this area as specified by the stack size attribute
+is smaller than the minimum for this processor family and the stack
+is not user specified, then RTEMS will automatically allocate a
+stack of the minimum size for this processor family.
+
+@item contention scope
+specifies the scheduling contention scope. RTEMS only supports the
+PTHREAD_SCOPE_PROCESS scheduling contention scope.
+
+@item scheduling inheritance
+specifies whether a user specified or the scheduling policy and
+parameters of the currently executing thread are to be used. When
+this is PTHREAD_INHERIT_SCHED, then the scheduling policy and
+parameters of the currently executing thread are inherited by
+the newly created thread.
+
+@item scheduling policy and parameters
+specify the manner in which the thread will contend for the processor.
+The scheduling parameters are interpreted based on the specified policy.
+All policies utilize the thread priority parameter.
+
+@end table
+
+@section Operations
+
+There is currently no text in this section.
+
+@section Services
+
+This section details the thread manager's services.
+A subsection is dedicated to each of this manager's services
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@c
+@c
+@c
+@page
+@subsection pthread_attr_init - Initialize a Thread Attribute Set
+
+@findex pthread_attr_init
+@cindex initialize a thread attribute set
+
+@subheading CALLING SEQUENCE:
+
+
+@example
+#include <pthread.h>
+
+int pthread_attr_init(
+ pthread_attr_t *attr
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The attribute pointer argument is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_attr_init} routine initializes the thread attributes
+object specified by @code{attr} with the default value for all of the
+individual attributes.
+
+@subheading NOTES:
+
+The settings in the default attributes are implementation defined. For
+RTEMS, the default attributes are as follows:
+
+@itemize @bullet
+
+@item stackadr
+is not set to indicate that RTEMS is to allocate the stack memory.
+
+@item stacksize
+is set to @code{PTHREAD_MINIMUM_STACK_SIZE}.
+
+@item contentionscope
+is set to @code{PTHREAD_SCOPE_PROCESS}.
+
+@item inheritsched
+is set to @code{PTHREAD_INHERIT_SCHED} to indicate that the created
+thread inherits its scheduling attributes from its parent.
+
+@item detachstate
+is set to @code{PTHREAD_CREATE_JOINABLE}.
+
+@end itemize
+
+
+@c
+@c
+@c
+@page
+@subsection pthread_attr_destroy - Destroy a Thread Attribute Set
+
+@findex pthread_attr_destroy
+@cindex destroy a thread attribute set
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_attr_destroy(
+ pthread_attr_t *attr
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The attribute pointer argument is invalid.
+
+@item EINVAL
+The attribute set is not initialized.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_attr_destroy} routine is used to destroy a thread
+attributes object. The behavior of using an attributes object after
+it is destroyed is implementation dependent.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection pthread_attr_setdetachstate - Set Detach State
+
+@findex pthread_attr_setdetachstate
+@cindex set detach state
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_attr_setdetachstate(
+ pthread_attr_t *attr,
+ int detachstate
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The attribute pointer argument is invalid.
+
+@item EINVAL
+The attribute set is not initialized.
+
+@item EINVAL
+The detachstate argument is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_attr_setdetachstate} routine is used to value of the
+@code{detachstate} attribute. This attribute controls whether the
+thread is created in a detached state.
+
+The @code{detachstate} can be either @code{PTHREAD_CREATE_DETACHED} or
+@code{PTHREAD_CREATE_JOINABLE}. The default value for all threads is
+@code{PTHREAD_CREATE_JOINABLE}.
+
+@subheading NOTES:
+
+If a thread is in a detached state,
+then the use of the ID with the @code{pthread_detach} or
+@code{pthread_join} routines is an error.
+
+@c
+@c
+@c
+@page
+@subsection pthread_attr_getdetachstate - Get Detach State
+
+@findex pthread_attr_getdetachstate
+@cindex get detach state
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_attr_getdetachstate(
+ const pthread_attr_t *attr,
+ int *detachstate
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The attribute pointer argument is invalid.
+
+@item EINVAL
+The attribute set is not initialized.
+
+@item EINVAL
+The detatchstate pointer argument is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_attr_getdetachstate} routine is used to obtain the
+current value of the @code{detachstate} attribute as specified
+by the @code{attr} thread attribute object.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection pthread_attr_setstacksize - Set Thread Stack Size
+
+@findex pthread_attr_setstacksize
+@cindex set thread stack size
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_attr_setstacksize(
+ pthread_attr_t *attr,
+ size_t stacksize
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The attribute pointer argument is invalid.
+
+@item EINVAL
+The attribute set is not initialized.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_attr_setstacksize} routine is used to set the
+@code{stacksize} attribute in the @code{attr} thread attribute
+object.
+
+@subheading NOTES:
+
+As required by POSIX, RTEMS defines the feature symbol
+@code{_POSIX_THREAD_ATTR_STACKSIZE} to indicate that this
+routine is supported.
+
+If the specified stacksize is below the minimum required for this CPU
+(@code{PTHREAD_STACK_MIN}, then the stacksize will be set to the minimum
+for this CPU.
+
+@c
+@c
+@c
+@page
+@subsection pthread_attr_getstacksize - Get Thread Stack Size
+
+@findex pthread_attr_getstacksize
+@cindex get thread stack size
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_attr_getstacksize(
+ const pthread_attr_t *attr,
+ size_t *stacksize
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The attribute pointer argument is invalid.
+
+@item EINVAL
+The attribute set is not initialized.
+
+@item EINVAL
+The stacksize pointer argument is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_attr_getstacksize} routine is used to obtain the
+@code{stacksize} attribute in the @code{attr} thread attribute
+object.
+
+@subheading NOTES:
+
+As required by POSIX, RTEMS defines the feature symbol
+@code{_POSIX_THREAD_ATTR_STACKSIZE} to indicate that this
+routine is supported.
+
+@c
+@c
+@c
+@page
+@subsection pthread_attr_setstackaddr - Set Thread Stack Address
+
+@findex pthread_attr_setstackaddr
+@cindex set thread stack address
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_attr_setstackaddr(
+ pthread_attr_t *attr,
+ void *stackaddr
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The attribute pointer argument is invalid.
+
+@item EINVAL
+The attribute set is not initialized.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_attr_setstackaddr} routine is used to set the
+@code{stackaddr} attribute in the @code{attr} thread attribute
+object.
+
+@subheading NOTES:
+
+As required by POSIX, RTEMS defines the feature symbol
+@code{_POSIX_THREAD_ATTR_STACKADDR} to indicate that this
+routine is supported.
+
+It is imperative to the proper operation of the system that
+each thread have sufficient stack space.
+
+@c
+@c
+@c
+@page
+@subsection pthread_attr_getstackaddr - Get Thread Stack Address
+
+@findex pthread_attr_getstackaddr
+@cindex get thread stack address
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_attr_getstackaddr(
+ const pthread_attr_t *attr,
+ void **stackaddr
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The attribute pointer argument is invalid.
+
+@item EINVAL
+The attribute set is not initialized.
+
+@item EINVAL
+The stackaddr pointer argument is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_attr_getstackaddr} routine is used to obtain the
+@code{stackaddr} attribute in the @code{attr} thread attribute
+object.
+
+@subheading NOTES:
+
+As required by POSIX, RTEMS defines the feature symbol
+@code{_POSIX_THREAD_ATTR_STACKADDR} to indicate that this
+routine is supported.
+
+@c
+@c
+@c
+@page
+@subsection pthread_attr_setscope - Set Thread Scheduling Scope
+
+@findex pthread_attr_setscope
+@cindex set thread scheduling scope
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_attr_setscope(
+ pthread_attr_t *attr,
+ int contentionscope
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The attribute pointer argument is invalid.
+
+@item EINVAL
+The attribute set is not initialized.
+
+@item EINVAL
+The contention scope specified is not valid.
+
+@item ENOTSUP
+The contention scope specified (PTHREAD_SCOPE_SYSTEM) is not supported.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_attr_setscope} routine is used to set the contention
+scope field in the thread attribute object @code{attr} to the value
+specified by @code{contentionscope}.
+
+The @code{contentionscope} must be either @code{PTHREAD_SCOPE_SYSTEM}
+to indicate that the thread is to be within system scheduling contention
+or @code{PTHREAD_SCOPE_PROCESS} indicating that the thread is to be
+within the process scheduling contention scope.
+
+@subheading NOTES:
+
+As required by POSIX, RTEMS defines the feature symbol
+@code{_POSIX_THREAD_PRIORITY_SCHEDULING} to indicate that the
+family of routines to which this routine belongs is supported.
+
+@c
+@c
+@c
+@page
+@subsection pthread_attr_getscope - Get Thread Scheduling Scope
+
+@findex pthread_attr_getscope
+@cindex get thread scheduling scope
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_attr_getscope(
+ const pthread_attr_t *attr,
+ int *contentionscope
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The attribute pointer argument is invalid.
+
+@item EINVAL
+The attribute set is not initialized.
+
+@item EINVAL
+The contentionscope pointer argument is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_attr_getscope} routine is used to obtain the
+value of the contention scope field in the thread attributes
+object @code{attr}. The current value is returned in
+@code{contentionscope}.
+
+@subheading NOTES:
+
+As required by POSIX, RTEMS defines the feature symbol
+@code{_POSIX_THREAD_PRIORITY_SCHEDULING} to indicate that the
+family of routines to which this routine belongs is supported.
+@c
+@c
+@c
+@page
+@subsection pthread_attr_setinheritsched - Set Inherit Scheduler Flag
+
+@findex pthread_attr_setinheritsched
+@cindex set inherit scheduler flag
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_attr_setinheritsched(
+ pthread_attr_t *attr,
+ int inheritsched
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The attribute pointer argument is invalid.
+
+@item EINVAL
+The attribute set is not initialized.
+
+@item EINVAL
+The specified scheduler inheritance argument is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_attr_setinheritsched} routine is used to set the
+inherit scheduler field in the thread attribute object @code{attr} to
+the value specified by @code{inheritsched}.
+
+The @code{contentionscope} must be either @code{PTHREAD_INHERIT_SCHED}
+to indicate that the thread is to inherit the scheduling policy
+and parameters fromthe creating thread, or @code{PTHREAD_EXPLICIT_SCHED}
+to indicate that the scheduling policy and parameters for this thread
+are to be set from the corresponding values in the attributes object.
+If @code{contentionscope} is @code{PTHREAD_INHERIT_SCHED}, then the
+scheduling attributes in the @code{attr} structure will be ignored
+at thread creation time.
+
+@subheading NOTES:
+
+As required by POSIX, RTEMS defines the feature symbol
+@code{_POSIX_THREAD_PRIORITY_SCHEDULING} to indicate that the
+family of routines to which this routine belongs is supported.
+
+@c
+@c
+@c
+@page
+@subsection pthread_attr_getinheritsched - Get Inherit Scheduler Flag
+
+@findex pthread_attr_getinheritsched
+@cindex get inherit scheduler flag
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_attr_getinheritsched(
+ const pthread_attr_t *attr,
+ int *inheritsched
+);
+@end example
+
+@subheading STATUS CODES:
+@table @b
+@item EINVAL
+The attribute pointer argument is invalid.
+
+@item EINVAL
+The attribute set is not initialized.
+
+@item EINVAL
+The inheritsched pointer argument is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_attr_getinheritsched} routine is used to
+object the current value of the inherit scheduler field in
+the thread attribute object @code{attr}.
+
+@subheading NOTES:
+
+As required by POSIX, RTEMS defines the feature symbol
+@code{_POSIX_THREAD_PRIORITY_SCHEDULING} to indicate that the
+family of routines to which this routine belongs is supported.
+
+@c
+@c
+@c
+@page
+@subsection pthread_attr_setschedpolicy - Set Scheduling Policy
+
+@findex pthread_attr_setschedpolicy
+@cindex set scheduling policy
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_attr_setschedpolicy(
+ pthread_attr_t *attr,
+ int policy
+);
+@end example
+
+@subheading STATUS CODES:
+@table @b
+@item EINVAL
+The attribute pointer argument is invalid.
+
+@item EINVAL
+The attribute set is not initialized.
+
+@item ENOTSUP
+The specified scheduler policy argument is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_attr_setschedpolicy} routine is used to set the
+scheduler policy field in the thread attribute object @code{attr} to
+the value specified by @code{policy}.
+
+Scheduling policies may be one of the following:
+
+@itemize @bullet
+
+@item @code{SCHED_DEFAULT}
+@item @code{SCHED_FIFO}
+@item @code{SCHED_RR}
+@item @code{SCHED_SPORADIC}
+@item @code{SCHED_OTHER}
+
+@end itemize
+
+The precise meaning of each of these is discussed elsewhere in this
+manual.
+
+@subheading NOTES:
+
+As required by POSIX, RTEMS defines the feature symbol
+@code{_POSIX_THREAD_PRIORITY_SCHEDULING} to indicate that the
+family of routines to which this routine belongs is supported.
+
+@c
+@c
+@c
+@page
+@subsection pthread_attr_getschedpolicy - Get Scheduling Policy
+
+@findex pthread_attr_getschedpolicy
+@cindex get scheduling policy
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_attr_getschedpolicy(
+ const pthread_attr_t *attr,
+ int *policy
+);
+@end example
+
+@subheading STATUS CODES:
+@table @b
+@item EINVAL
+The attribute pointer argument is invalid.
+
+@item EINVAL
+The attribute set is not initialized.
+
+@item EINVAL
+The specified scheduler policy argument pointer is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_attr_getschedpolicy} routine is used to obtain the
+scheduler policy field from the thread attribute object @code{attr}.
+The value of this field is returned in @code{policy}.
+
+@subheading NOTES:
+
+As required by POSIX, RTEMS defines the feature symbol
+@code{_POSIX_THREAD_PRIORITY_SCHEDULING} to indicate that the
+family of routines to which this routine belongs is supported.
+
+@c
+@c
+@c
+@page
+@subsection pthread_attr_setschedparam - Set Scheduling Parameters
+
+@findex pthread_attr_setschedparam
+@cindex set scheduling parameters
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_attr_setschedparam(
+ pthread_attr_t *attr,
+ const struct sched_param param
+);
+@end example
+
+@subheading STATUS CODES:
+@table @b
+@item EINVAL
+The attribute pointer argument is invalid.
+
+@item EINVAL
+The attribute set is not initialized.
+
+@item EINVAL
+The specified scheduler parameter argument is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_attr_setschedparam} routine is used to set the
+scheduler parameters field in the thread attribute object @code{attr} to
+the value specified by @code{param}.
+
+@subheading NOTES:
+
+As required by POSIX, RTEMS defines the feature symbol
+@code{_POSIX_THREAD_PRIORITY_SCHEDULING} to indicate that the
+family of routines to which this routine belongs is supported.
+
+@c
+@c
+@c
+@page
+@subsection pthread_attr_getschedparam - Get Scheduling Parameters
+
+@findex pthread_attr_getschedparam
+@cindex get scheduling parameters
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_attr_getschedparam(
+ const pthread_attr_t *attr,
+ struct sched_param *param
+);
+@end example
+
+@subheading STATUS CODES:
+@table @b
+@item EINVAL
+The attribute pointer argument is invalid.
+
+@item EINVAL
+The attribute set is not initialized.
+
+@item EINVAL
+The specified scheduler parameter argument pointer is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_attr_getschedparam} routine is used to obtain the
+scheduler parameters field from the thread attribute object @code{attr}.
+The value of this field is returned in @code{param}.
+
+@subheading NOTES:
+
+As required by POSIX, RTEMS defines the feature symbol
+@code{_POSIX_THREAD_PRIORITY_SCHEDULING} to indicate that the
+family of routines to which this routine belongs is supported.
+
+@c
+@c
+@c
+@page
+@subsection pthread_create - Create a Thread
+
+@findex pthread_create
+@cindex create a thread
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_create(
+ pthread_t *thread,
+ const pthread_attr_t *attr,
+ void (*start_routine)( void *),
+ void *arg
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+
+@item EINVAL
+The attribute set is not initialized.
+
+@item EINVAL
+The user specified a stack address and the size of the area was not
+large enough to meet this processor's minimum stack requirements.
+
+@item EINVAL
+The specified scheduler inheritance policy was invalid.
+
+@item ENOTSUP
+The specified contention scope was PTHREAD_SCOPE_PROCESS.
+
+@item EINVAL
+The specified thread priority was invalid.
+
+@item EINVAL
+The specified scheduling policy was invalid.
+
+@item EINVAL
+The scheduling policy was SCHED_SPORADIC and the specified replenishment
+period is less than the initial budget.
+
+@item EINVAL
+The scheduling policy was SCHED_SPORADIC and the specified low priority
+is invalid.
+
+@item EAGAIN
+The system lacked the necessary resources to create another thread, or the
+self imposed limit on the total number of threads in a process
+PTHREAD_THREAD_MAX would be exceeded.
+
+@item EINVAL
+Invalid argument passed.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_create} routine is used to create a new thread with
+the attributes specified by @code{attr}. If the @code{attr} argument
+is @code{NULL}, then the default attribute set will be used. Modification
+of the contents of @code{attr} after this thread is created does not
+have an impact on this thread.
+
+The thread begins execution at the address specified by @code{start_routine}
+with @code{arg} as its only argument. If @code{start_routine} returns,
+then it is functionally equivalent to the thread executing the
+@code{pthread_exit} service.
+
+Upon successful completion, the ID of the created thread is returned in the
+@code{thread} argument.
+
+@subheading NOTES:
+
+There is no concept of a single main thread in RTEMS as there is in
+a tradition UNIX system. POSIX requires that the implicit return of
+the main thread results in the same effects as if there were a call
+to @code{exit}. This does not occur in RTEMS.
+
+The signal mask of the newly created thread is inherited from its
+creator and the set of pending signals for this thread is empty.
+
+@c
+@c
+@c
+@page
+@subsection pthread_exit - Terminate the Current Thread
+
+@findex pthread_exit
+@cindex terminate the current thread
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+void pthread_exit(
+ void *status
+);
+@end example
+
+@subheading STATUS CODES:
+@table @b
+@item NONE
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_exit} routine is used to temrinate the calling thread.
+The @code{status} is made available to any successful join with the
+terminating thread.
+
+When a thread returns from its start routine, it results in an
+implicit call to the @code{pthread_exit} routine with the return
+value of the function serving as the argument to @code{pthread_exit}.
+
+@subheading NOTES:
+
+Any cancellation cleanup handlers that hace been pushed and not yet popped
+shall be popped in reverse of the order that they were pushed. After
+all cancellation cleanup handlers have been executed, if the
+thread has any thread-specific data, destructors for that data will
+be invoked.
+
+Thread termination does not release or free any application visible
+resources including byt not limited to mutexes, file descriptors, allocated
+memory, etc.. Similarly, exitting a thread does not result in any
+process-oriented cleanup activity.
+
+There is no concept of a single main thread in RTEMS as there is in
+a tradition UNIX system. POSIX requires that the implicit return of
+the main thread results in the same effects as if there were a call
+to @code{exit}. This does not occur in RTEMS.
+
+All access to any automatic variables allocated by the threads is lost
+when the thread exits. Thus references (i.e. pointers) to local variables
+of a thread should not be used in a global manner without care. As
+a specific example, a pointer to a local variable should NOT be used
+as the return value.
+
+
+@c
+@c
+@c
+@page
+@subsection pthread_detach - Detach a Thread
+
+@findex pthread_detach
+@cindex detach a thread
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_detach(
+ pthread_t thread
+);
+@end example
+
+@subheading STATUS CODES:
+@table @b
+@item ESRCH
+The thread specified is invalid.
+
+@item EINVAL
+The thread specified is not a joinable thread.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_detach} routine is used to to indicate that storage
+for @code{thread} can be reclaimed when the thread terminates without
+another thread joinging with it.
+
+@subheading NOTES:
+
+If any threads have previously joined with the specified thread, then they
+will remain joined with that thread. Any subsequent calls to
+@code{pthread_join} on the specified thread will fail.
+
+@c
+@c
+@c
+@page
+@subsection pthread_join - Wait for Thread Termination
+
+@findex pthread_join
+@cindex wait for thread termination
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_join(
+ pthread_t thread,
+ void **value_ptr
+);
+@end example
+
+@subheading STATUS CODES:
+@table @b
+@item ESRCH
+The thread specified is invalid.
+
+@item EINVAL
+The thread specified is not a joinable thread.
+
+@item EDEADLK
+A deadlock was detected or thread is the calling thread.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_join} routine suspends execution of the calling thread
+until @code{thread} terminates. If @code{thread} has already terminated,
+then this routine returns immediately. The value returned by @code{thread}
+(i.e. passed to @code{pthread_exit} is returned in @code{value_ptr}.
+
+When this routine returns, then @code{thread} has been temrinated.
+
+@subheading NOTES:
+
+The results of multiple simultaneous joins on the same thread is undefined.
+
+If any threads have previously joined with the specified thread, then they
+will remain joined with that thread. Any subsequent calls to
+@code{pthread_join} on the specified thread will fail.
+
+If value_ptr is NULL, then no value is returned.
+
+@c
+@c
+@c
+@page
+@subsection pthread_self - Get Thread ID
+
+@findex pthread_self
+@cindex get thread id
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+pthread_t pthread_self( void );
+@end example
+
+@subheading STATUS CODES:
+
+The value returned is the ID of the calling thread.
+
+@subheading DESCRIPTION:
+
+This routine returns the ID of the calling thread.
+
+@subheading NOTES:
+
+NONE
+
+@c
+@c
+@c
+@page
+@subsection pthread_equal - Compare Thread IDs
+
+@findex pthread_equal
+@cindex compare thread ids
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_equal(
+ pthread_t t1,
+ pthread_t t2
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item zero
+The thread ids are not equal.
+
+@item non-zero
+The thread ids are equal.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_equal} routine is used to compare two thread
+IDs and determine if they are equal.
+
+@subheading NOTES:
+
+The behavior is undefined if the thread IDs are not valid.
+
+@c
+@c
+@c
+@page
+@subsection pthread_once - Dynamic Package Initialization
+
+@findex pthread_once
+@cindex dynamic package initialization
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+pthread_once_t once_control = PTHREAD_ONCE_INIT;
+
+int pthread_once(
+ pthread_once_t *once_control,
+ void (*init_routine)(void)
+);
+@end example
+
+@subheading STATUS CODES:
+
+NONE
+
+@subheading DESCRIPTION:
+
+The @code{pthread_once} routine is used to provide controlled initialization
+of variables. The first call to @code{pthread_once} by any thread with the
+same @code{once_control} will result in the @code{init_routine} being
+invoked with no arguments. Subsequent calls to @code{pthread_once} with
+the same @code{once_control} will have no effect.
+
+The @code{init_routine} is guaranteed to have run to completion when
+this routine returns to the caller.
+
+@subheading NOTES:
+
+The behavior of @code{pthread_once} is undefined if @code{once_control}
+is automatic storage (i.e. on a task stack) or is not initialized using
+@code{PTHREAD_ONCE_INIT}.
+
+@c
+@c
+@c
+@page
+@subsection pthread_setschedparam - Set Thread Scheduling Parameters
+
+@findex pthread_setschedparam
+@cindex set thread scheduling parameters
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_setschedparam(
+ pthread_t thread,
+ int policy,
+ struct sched_param *param
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The scheduling parameters indicated by the parameter param is invalid.
+
+@item EINVAL
+The value specified by policy is invalid.
+
+@item EINVAL
+The scheduling policy was SCHED_SPORADIC and the specified replenishment
+period is less than the initial budget.
+
+@item EINVAL
+The scheduling policy was SCHED_SPORADIC and the specified low priority
+is invalid.
+
+@item ESRCH
+The thread indicated was invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_setschedparam} routine is used to set the
+scheduler parameters currently associated with the thread specified
+by @code{thread} to the policy specified by @code{policy}. The
+contents of @code{param} are interpreted based upon the @code{policy}
+argument.
+
+@subheading NOTES:
+
+As required by POSIX, RTEMS defines the feature symbol
+@code{_POSIX_THREAD_PRIORITY_SCHEDULING} to indicate that the
+family of routines to which this routine belongs is supported.
+
+@c
+@c
+@c
+@page
+@subsection pthread_getschedparam - Get Thread Scheduling Parameters
+
+@findex pthread_getschedparam
+@cindex get thread scheduling parameters
+
+@subheading CALLING SEQUENCE:
+
+@example
+#include <pthread.h>
+
+int pthread_getschedparam(
+ pthread_t thread,
+ int *policy,
+ struct sched_param *param
+);
+@end example
+
+@subheading STATUS CODES:
+
+@table @b
+@item EINVAL
+The policy pointer argument is invalid.
+
+@item EINVAL
+The scheduling parameters pointer argument is invalid.
+
+@item ESRCH
+The thread indicated by the parameter thread is invalid.
+
+@end table
+
+@subheading DESCRIPTION:
+
+The @code{pthread_getschedparam} routine is used to obtain the
+scheduler policy and parameters associated with @code{thread}.
+The current policy and associated parameters values returned in
+@code{policy} and @code{param}, respectively.
+
+@subheading NOTES:
+
+As required by POSIX, RTEMS defines the feature symbol
+@code{_POSIX_THREAD_PRIORITY_SCHEDULING} to indicate that the
+family of routines to which this routine belongs is supported.
diff --git a/doc/posix_users/timer.t b/doc/posix_users/timer.t
new file mode 100644
index 0000000000..d879f24abb
--- /dev/null
+++ b/doc/posix_users/timer.t
@@ -0,0 +1,196 @@
+@c
+@c This is the chapter from the RTEMS POSIX 1003.1b API User's Guide that
+@c documents the services provided by the timer @c manager.
+@c
+@c $Id$
+@c
+
+@chapter Timer Manager
+
+@section Introduction
+
+The timer manager is ...
+
+The services provided by the timer manager are:
+
+@itemize @bullet
+@item @code{timer_create} - Create a Per-Process Timer
+@item @code{timer_delete} - Delete a Per-Process Timer
+@item @code{timer_settime} - Set Next Timer Expiration
+@item @code{timer_gettime} - Get Time Remaining on Timer
+@item @code{timer_getoverrun} - Get Timer Overrun Count
+@end itemize
+
+@section Background
+
+@section Operations
+
+@section System Calls
+
+This section details the timer manager's services.
+A subsection is dedicated to each of this manager's services
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+
+@c
+@c timer_create
+@c
+
+@page
+@subsection timer_create - Create a Per-Process Timer
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <time.h>
+#include <signal.h>
+
+int timer_create(
+ clockid_t clock_id,
+ struct sigevent *evp,
+ timer_t *timerid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c timer_delete
+@c
+
+@page
+@subsection timer_delete - Delete a Per-Process Timer
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <time.h>
+
+int timer_delete(
+ timer_t timerid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c timer_settime
+@c
+
+@page
+@subsection timer_settime - Set Next Timer Expiration
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <time.h>
+
+int timer_settime(
+ timer_t timerid,
+ int flags,
+ const struct itimerspec *value,
+ struct itimerspec *ovalue
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c timer_gettime
+@c
+
+@page
+@subsection timer_gettime - Get Time Remaining on Timer
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <time.h>
+
+int timer_gettime(
+ timer_t timerid,
+ struct itimerspec *value
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
+
+@c
+@c timer_getoverrun
+@c
+
+@page
+@subsection timer_getoverrun - Get Timer Overrun Count
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+#include <time.h>
+
+int timer_getoverrun(
+ timer_t timerid
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@end ifset
+
+@subheading STATUS CODES:
+
+@code{EXXX} -
+
+@subheading DESCRIPTION:
+
+@subheading NOTES:
+
diff --git a/doc/project.am b/doc/project.am
new file mode 100644
index 0000000000..cebc506336
--- /dev/null
+++ b/doc/project.am
@@ -0,0 +1,86 @@
+## $Id$
+
+# HACK: makeinfo is locale sensitive
+LANG=C
+
+SUFFIXES = .t
+
+MAINTAINERCLEANFILES =
+CLEANFILES =
+MOSTLYCLEANFILES =
+CLEANFILES += $(GENERATED_FILES)
+
+AM_MAKEINFOFLAGS = -I $(top_builddir) -I $(top_srcdir)
+TEXI2DVI = @TEXI2DVI@ -I $(top_builddir) -I $(top_srcdir)
+TEXI2PDF = @TEXI2PDF@ -I $(top_builddir) -I $(top_srcdir)
+
+# HACK: Force generation of version.texi
+version.texi: stamp-vti
+
+# Without $(srcdir) in TEXINPUTS, dvips doesn't find the *.eps
+# we distribute in $(srcdir)
+.dvi.ps:
+ TEXINPUTS="$(srcdir)${PATH_SEPARATOR}$$TEXINPUTS" \
+ $(DVIPS) -o $@ $<
+
+## DVI support
+dvidir = $(pkgdocdir)/dvi
+
+## PS support
+psdir = $(pkgdocdir)/ps
+
+## PDF support
+pdfdir = $(pkgdocdir)/pdf
+
+if EPSTOPDF
+.eps.pdf:
+ $(EPSTOPDF) $< --outfile=$@
+endif
+
+$(PROJECT).pdf: $(PROJECT).texi $($(PROJECT)_TEXINFOS) $(PDF_IMAGES)
+CLEANFILES += $(PROJECT).pdf
+
+MOSTLYCLEANFILES += $(PDF_IMAGES)
+
+## HTML
+SUFFIXES += .html
+
+rtems_header.html: $(top_srcdir)/rtems_header.html.in version.texi
+ @sed -e s%\.\./images/%$(top_builddir)/images/%g \
+ -e s%\@VERSION\@%@VERSION@%g \
+ < $< > $@
+rtems_footer.html: $(top_srcdir)/rtems_footer.html.in version.texi
+ @sed -e s%\.\./images/%$(top_builddir)/%g \
+ -e s%\@VERSION\@%@VERSION@%g \
+ < $< > $@
+
+index.html $(PROJECT)*.html: $(PROJECT).texi $($(PROJECT)_TEXINFOS) \
+ rtems_header.html rtems_footer.html
+ $(TEXI2WWW) $(TEXI2WWW_ARGS) -base $(PROJECT) $<
+
+MOSTLYCLEANFILES += index.html $(PROJECT)*.html rtems_header.html \
+ rtems_footer.html
+
+## Common installation points
+if USE_HTML
+html_project_DATA = index.html $(PROJECT)*.html
+endif
+
+if USE_DVI
+dvi_DATA = $(PROJECT).dvi
+endif # USE_DVI
+
+if USE_PS
+ps_DATA = $(PROJECT).ps
+endif # USE_PS
+
+if USE_PDF
+pdf_DATA = $(PROJECT).pdf
+endif
+
+COMMON_FILES = $(top_srcdir)/common/setup.texi
+COMMON_FILES += $(top_builddir)/common/rtems.texi
+
+$(top_builddir)/common/rtems.texi: $(top_srcdir)/common/rtems.texi.in $(top_builddir)/common/rtems.sed
+ sed -f $(top_builddir)/common/rtems.sed \
+ $(top_srcdir)/common/rtems.texi.in > $(top_builddir)/common/rtems.texi
diff --git a/doc/relnotes/.cvsignore b/doc/relnotes/.cvsignore
new file mode 100644
index 0000000000..0ccb37dbd0
--- /dev/null
+++ b/doc/relnotes/.cvsignore
@@ -0,0 +1,22 @@
+index.html
+Makefile
+Makefile.in
+mdate-sh
+relnotes
+relnotes.aux
+relnotes.cp
+relnotes.dvi
+relnotes.fn
+relnotes*.html
+relnotes.ky
+relnotes.log
+relnotes.pdf
+relnotes.pg
+relnotes.ps
+relnotes.toc
+relnotes.tp
+relnotes.vr
+rtems_footer.html
+rtems_header.html
+stamp-vti
+version.texi
diff --git a/doc/relnotes/ChangeLog b/doc/relnotes/ChangeLog
new file mode 100644
index 0000000000..b0bd40d98e
--- /dev/null
+++ b/doc/relnotes/ChangeLog
@@ -0,0 +1,69 @@
+2003-12-12 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-12-11 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-11-26 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Add *.info to CLEANFILES to accomodate
+ automake-1.7f/1.8 breaking building infos.
+
+2003-09-26 Joel Sherrill <joel@OARcorp.com>
+
+ * status.texi: Obsoleting HP PA-RISC port and removing all references.
+
+2003-09-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Merger from rtems-4-6-branch.
+
+2003-09-19 Joel Sherrill <joel@OARcorp.com>
+
+ * install.texi, intro.texi, relnotes.texi, status.texi: Merge from
+ branch.
+
+2003-01-25 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * relnotes.texi: Set @setfilename relnotes.info.
+
+2003-01-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * version.texi: Remove from CVS.
+ * stamp-vti: Remove from CVS.
+ * .cvsignore: Add version.texi.
+ Add stamp-vti.
+ Re-sort.
+
+2003-01-21 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-11-13 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-10-24 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-03-27 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Remove AUTOMAKE_OPTIONS.
+
+2002-01-18 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: include main.am, require automake-1.5.
+
+2001-01-17 Joel Sherrill <joel@OARcorp.com>
+
+ * .cvsignore: Added rtems_header.html and rtems_footer.html.
+
+2000-09-22 Joel Sherrill <joel@OARcorp.com>
+
+ * Makefile.am: Removed GENERATED_FILES from list of TEXINFOS.
+
+2000-08-10 Joel Sherrill <joel@OARcorp.com>
+
+ * ChangeLog: New file.
diff --git a/doc/relnotes/Makefile.am b/doc/relnotes/Makefile.am
new file mode 100644
index 0000000000..07bc0a8c31
--- /dev/null
+++ b/doc/relnotes/Makefile.am
@@ -0,0 +1,22 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = relnotes
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/main.am
+
+COMMON_FILES += $(top_srcdir)/common/cpright.texi
+
+FILES = install.texi intro.texi probrep.texi relnotes.texi status.texi
+
+info_TEXINFOS = relnotes.texi
+relnotes_TEXINFOS = $(FILES) $(COMMON_FILES)
+
+CLEANFILES += relnotes.info
diff --git a/doc/relnotes/install.texi b/doc/relnotes/install.texi
new file mode 100644
index 0000000000..84743cd682
--- /dev/null
+++ b/doc/relnotes/install.texi
@@ -0,0 +1,174 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Installation Procedure, Installation Procedure Introduction, Introduction Documentation, Top
+@end ifinfo
+@chapter Installation Procedure
+@ifinfo
+@menu
+* Installation Procedure Introduction::
+* Installation Procedure RTEMS FTP Site Organization::
+* Installation Procedure Unarchiving the RTEMS and GNU Components::
+* Installation Procedure Installing a Cross-Development GNU Toolset::
+* Installation Procedure Installing RTEMS::
+@end menu
+@end ifinfo
+
+@ifinfo
+@node Installation Procedure Introduction, Installation Procedure RTEMS FTP Site Organization, Installation Procedure, Installation Procedure
+@end ifinfo
+@section Introduction
+
+This chapter describes the process of installing and
+configuring RTEMS and a cross-development environment based on
+freely available tools and libraries.
+
+@ifinfo
+@node Installation Procedure RTEMS FTP Site Organization, Installation Procedure Unarchiving the RTEMS and GNU Components, Installation Procedure Introduction, Installation Procedure
+@end ifinfo
+@section RTEMS FTP Site Organization
+
+RTEMS is distributed only via anonymous ftp.
+
+This section will discuss how to navigate the RTEMS
+ftp site and unarchive the files in the RTEMS and GNU package
+distributions. All example commands will be given in a shell
+independent fashion unless otherwise noted.
+
+Throughout the rest of this manual
+<RTEMS_distribution> will be used as the parent of components
+within the RTEMS distribution. For persons using the ftp
+distribution found on the primary ftp site for RTEMS,
+<RTEMS_distribution> are found under this directory
+@uref{ftp://ftp.rtems.com/pub/rtems/}. HTTP access to the
+ftp site is available via @uref{http://www.rtems.com/ftp/pub/rtems}.
+
+The archive files for RTEMS Release @value{VERSION} are found
+under the directory <RTEMS_distribution>. This directory
+contains the files which comprise this relase as well as any
+patches which may be required for other tools.
+
+The complete source code and documentation set for
+the C language implementation of RTEMS is provided.
+
+@ifinfo
+@node Installation Procedure Unarchiving the RTEMS and GNU Components, Installation Procedure Installing a Cross-Development GNU Toolset, Installation Procedure RTEMS FTP Site Organization, Installation Procedure
+@end ifinfo
+@section Unarchiving the RTEMS and GNU Components
+
+Many of the components of the RTEMS release are
+"tarred, zipped" files and have the .tar.gz or .tgz extension.
+The GNU zip package is required to unarchives these files on the
+RTEMS ftp site. If this package is not installed, the source
+can be found in the files
+@uref{ftp://ftp.gnu.org/pub/gnu/gzip/gzip-1.2.4.shar} or
+@uref{ftp://ftp.gnu.org/pub/gnu/gzip/gzip-1.2.4.tar}. It may be
+restored using a command similar to the following:
+
+@example
+@group
+tar xvf gzip-1.2.4.tar
+
+OR
+
+sh gzip-1.2.4.shar
+@end group
+@end example
+
+This will create a subdirectory gzip-1.2.4 in the
+current directory. Please examine the files README and INSTALL
+and follow the instructions provided there.
+
+[Note: The GNU tools follow a standard packaging procedure
+They will unarchive into a directory based on the package name and version
+number. For detailed instructions on compilation and
+installation of the GNU tools, please refer to the instructions for
+each GNU tool.]
+
+Files which have been "tarred, zipped" (i.e. .tar.gz
+or .tgz extension) may be unarchived with a command similar to
+one of the following:
+
+@example
+@group
+gzcat <file>.tgz | tar xvof -
+
+OR
+
+gunzip -c <file>.tgz | tar xvof -
+
+OR
+
+gtar xzvf <file>.tgz
+@end group
+@end example
+
+NOTE: gunzip -c is equivalent to gzcat, while gtar is GNU tar.
+
+Given that the necessary utility programs are
+installed, any of the above commands will extract the contents
+of <file>.tar.gz into the current directory. All of the RTEMS
+components will be extracted into the subdirectory rtems-@value{VERSION}.
+To view the contents of a component without restoring any files,
+use a command similar to the following:
+
+@example
+@group
+gzcat <file>.tgz | tar tvf -
+@end group
+@end example
+
+@ifinfo
+@node Installation Procedure Installing a Cross-Development GNU Toolset, Installation Procedure Installing RTEMS, Installation Procedure Unarchiving the RTEMS and GNU Components, Installation Procedure
+@end ifinfo
+@section Installing a Cross-Development GNU Toolset
+
+This sections describes how to build and install the
+FSF GNU tools for use as a cross-compilation system. These
+tools are used by the RTEMS developers. Every effort has been
+made to make these instructions accurate and complete. However,
+it is recommended that the individual doing the installation
+read the appropriate installation notes for each of the tools in
+the cross toolset. This will help insure that there are no
+special requirements for a particular host.
+
+If the host and target processors are the same, then
+it may be possible to use the host development tools. An
+example of this scenario is using a SPARC based workstation
+to develop an RTEMS application for the SPARC processor. Although
+the native toolset is useable in this scenario, it is ultimately
+more desirable to build a toolset specifically for the embedded environment.
+
+Instructions for building a cross environment using the GNU
+tools is provided in the crossgcc FAQ available from ftp.cygnus.com
+in /pub/embedded/crossgcc. It is recommended that the user following
+these instructions.
+
+After the cross development toolset has been built
+and installed, it will be necessary to modify the environment of
+each RTEMS application developer to reflect at least the path of
+the newly installed cross development toolset.
+
+The documentation for the FSF GNU and Cygnus tools is
+formatted using TeX. The RTEMS developers use TeX 3.14t3 to
+format the manuals for their own use. This document does not
+contain instructions on the acquisition or installation of TeX
+and supporting tools.
+
+NOTE: For "UNIX" processors, the native compiler binary utilities
+should be used.
+
+@ifinfo
+@node Installation Procedure Installing RTEMS, Development Environment Status, Installation Procedure Installing a Cross-Development GNU Toolset, Installation Procedure
+@end ifinfo
+@section Installing RTEMS
+
+For instructions on building and installing RTEMS, please refer to
+the file README.configure in the source distribution.
+
diff --git a/doc/relnotes/intro.texi b/doc/relnotes/intro.texi
new file mode 100644
index 0000000000..cd61781714
--- /dev/null
+++ b/doc/relnotes/intro.texi
@@ -0,0 +1,198 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Introduction, Introduction Supporting Tools, Top, Top
+@end ifinfo
+@chapter Introduction
+@ifinfo
+@menu
+* Introduction Supporting Tools::
+* Introduction Documentation::
+@end menu
+@end ifinfo
+
+This document describes the contents, installation
+procedure, and current status of Release @value{VERSION} of the RTEMS
+executive. An installation procedure is provided which
+describes the steps necessary to load and configure the RTEMS
+environment, including the GNU Development Environment and the
+Cygnus NEWLIB ANSI C Library, on a host computer. The status of
+the RTEMS environment is given, which includes supported
+processors and target boards, versions of the GNU utilities
+which were used by the RTEMS developers for this release,
+support libraries status, features which are not implemented,
+and any known existing problems.
+
+This RTEMS release package contains the following general components:
+
+@itemize @bullet
+@item RTEMS C Executive
+
+@item RTEMS C Documentation Set
+
+@item RTEMS NEWLIB ANSI C Library
+
+@item Patches to GNU Development Tools
+
+@end itemize
+
+There is a mailing list dedicated to RTEMS. This is
+a Majordomo style mailing list and may be subscribed to
+by sending a message to rtems-list-request@@rtems.com with
+the following line as the body:
+
+@example
+subscribe rtems_user@@your_email_goes_here.com
+@end example
+
+Please replace rtems_user@@your_email_goes_here.com with your
+email address.
+
+@ifinfo
+@node Introduction Supporting Tools, GNU Development Tools, Introduction, Introduction
+@end ifinfo
+@section Supporting Tools
+@ifinfo
+@menu
+* GNU Development Tools::
+* ANSI C Libraries::
+* GNU C Library::
+* Cygnus NEWLIB C Library::
+@end menu
+@end ifinfo
+
+This section discusses the freely available tools and
+libraries which are part of the RTEMS Development Environment.
+None of the tools discussed in this section were developed by
+the RTEMS project, although many do include submissions from the
+project. All of the tools and libraries required to build RTEMS
+are freely available. The home ftp site for most of the non-RTEMS
+specific tools is either prep.ai.mit.edu (18.71.0.38) or
+ftp.cygnus.com (140.174.1.3).
+
+Specifically of interest to embedded systems developers
+using the GNU tools is the crossgcc mailing list. This is
+a Majordomo style mailing list and may be subscribed to
+by sending a message to crossgcc-request@@cygnus.com with
+the following line as the body:
+
+@example
+subscribe rtems_user@@your_email_goes_here.com
+@end example
+
+Please replace rtems_user@@your_email_goes_here.com with your
+email address. The FAQ for crossgcc is in the /pub/embedded/crossgcc
+directory on ftp.cygnus.com (205.180.83.42).
+
+@ifinfo
+@node GNU Development Tools, ANSI C Libraries, Introduction Supporting Tools, Introduction Supporting Tools
+@end ifinfo
+@subsection GNU Development Tools
+
+Numerous GNU tools are used in the RTEMS Development
+Environment including C and Ada compilers, the GNU make program,
+GNU m4, the GNU assembler and binary utilities (linker,
+librarian, etc.), GNU tar, GNU zip, and the GNU debugger. These
+tools are distributed in source form and are all licensed under
+the GNU Public License which allows for unrestricted
+distribution under the condition that source code always be
+available. The Free Software Foundation is officially the
+originator of most of the GNU tools although many individuals
+have contributed to the GNU projects. In keeping with the
+spirit of the GPL, most of the time the GNU tools are
+distributed as source code without executables. It is the
+responsibility of the local site to install each tool. Numerous
+organizations and individuals supply executables for the GNU
+tools. All are required by the terms of the GPL to also make
+the source code available to the end user.
+
+The primary ftp site for the FSF GNU tools is
+prep.ai.mit.edu (18.71.0.38) in the /pub/gnu directory. These
+tools are mirrored on numerous ftp sites.
+
+Intel maintains a toolset for their i960 processor
+family based on the GNU tools referred to as GNU/960. The
+source code for this toolset is available from ftp.intel.com
+(143.185.65.2). [NOTE: The GNU/960 toolset generally includes
+an older version of GCC than that available from the FSF. When
+the FSF version of GNU C is significantly newer than that in the
+GNU/960 release, the RTEMS developers replace the GCC in the
+GNU/960 toolset with the FSF release.]
+
+Cygnus maintains an ftp site -- ftp.cygnus.com
+(205.180.83.42) -- which contains a source code which appeals to
+embedded developers. Of especial interest on this site are the
+directories /pub/newlib and /pub/embedded.
+
+@ifinfo
+@node ANSI C Libraries, GNU C Library, GNU Development Tools, Introduction Supporting Tools
+@end ifinfo
+@subsection ANSI C Libraries
+
+This section discusses the following freely
+distributable ANSI C Libraries:
+
+@itemize @bullet
+@item GNU C Library, and
+
+@item Cygnus NEWLIB
+@end itemize
+
+No C Library is included in the standard RTEMS
+distribution. It is the responsibility of the user to obtain
+and install a C Library separately.
+
+@ifinfo
+@node GNU C Library, Cygnus NEWLIB C Library, ANSI C Libraries, Introduction Supporting Tools
+@end ifinfo
+@subsection GNU C Library
+
+The GNU C Library is a robust and well-documented C
+Library which is distributed under the terms of the Library GNU
+Public License (LGPL). This library was not designed for use in
+real-time, embedded systems and the resource requirements of
+some of the routines in this library are an obvious indication
+of this. Additionally, this library does not have support for
+reentrancy in the sense that each task in a multitasking system
+could safely invoke every routine in the library. Finally, the
+distribution terms of the LGPL are considered undesirable by
+many embedded systems developers. However, the GNU C Library is
+very complete and is compliant with as many standards as
+possible. Because of this, it may be the only choice for many
+developers.
+
+There is currently no RTEMS support for the GNU C Library.
+
+The primary ftp site for this library is
+prep.ai.mit.edu (18.71.0.38).
+
+@ifinfo
+@node Cygnus NEWLIB C Library, Introduction Documentation, GNU C Library, Introduction Supporting Tools
+@end ifinfo
+@subsection Cygnus NEWLIB C Library
+
+The Cygnus NEWLIB C Library was specifically designed
+for real-time embedded systems. It is a small, reasonably
+documented Library with support for reentrancy. This library is
+a collection of freely distributable and public domain source
+code and is freely distributable with as few restrictions as
+possible placed on the end user.
+
+The primary ftp site for this library is ftp.cygnus.com (205.180.83.42).
+
+@ifinfo
+@node Introduction Documentation, Installation Procedure, Cygnus NEWLIB C Library, Introduction
+@end ifinfo
+@section Documentation
+
+The RTEMS Documentation Set is provided online at
+@uref{http://www.rtems.com/onlinedocs.html}
+as reference information for all levels of RTEMS users.
+
+The RTEMS documentation set is available in HTML, PostScript, PDF, and DVI.
diff --git a/doc/relnotes/probrep.texi b/doc/relnotes/probrep.texi
new file mode 100644
index 0000000000..acf9d47da5
--- /dev/null
+++ b/doc/relnotes/probrep.texi
@@ -0,0 +1,62 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+
+
+@ifinfo
+@node RTEMS PROBLEM REPORT, Command and Variable Index, RTEMS Problem Reporting, Top
+@end ifinfo
+@chapter RTEMS PROBLEM REPORT
+
+@example
+
+Customer (Company) Name:
+
+Customer Address:
+
+Contact Name:
+
+Telephone Voice: Fax:
+
+
+
+Product: Version:
+
+Target Processor: Target System:
+
+Host Computer System:
+
+Host Operating System: Version:
+
+
+
+Report Type: Customer Impact:
+
+
+
+[ ] Problem/Error [ ] System is inoperable, cannot proceed
+
+[ ] Enhancement [ ] Must be corrected in the near future
+
+[ ] Inquiry Suggestion [ ] Problem may be avoided until fixed
+
+[ ] Other______________ [ ] Problem is not time critical
+
+ [ ] Minor problem
+
+@end example
+
+
+Please provide a detailed description of the
+problem (Attachments including source code, example code,
+makefiles, possible solutions, and any other information
+describing the problem will be appreciated):
+
+
+
+
diff --git a/doc/relnotes/relnotes.texi b/doc/relnotes/relnotes.texi
new file mode 100644
index 0000000000..d7279ce418
--- /dev/null
+++ b/doc/relnotes/relnotes.texi
@@ -0,0 +1,113 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename relnotes.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file
+@c
+
+@c Joel's Questions
+@c
+@c 1. Why does paragraphindent only impact makeinfo?
+@c 2. Why does paragraphindent show up in HTML?
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS On-Line Manual
+@direntry
+* RTEMS Release Notes: (relnotes). Release Notes
+@end direntry
+@end ifset
+
+@c variable substitution info:
+@c
+@c @set LANGUAGE C
+@c the language is @value{LANGUAGE}
+@c NOTE: don't use underscore in the name
+@c
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage RTEMS Release Notes
+
+@setchapternewpage odd
+@settitle RTEMS Release Notes
+@titlepage
+@finalout
+
+@title RTEMS Release Notes
+@subtitle Edition @value{EDITION}, for RTEMS @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include intro.texi
+@include install.texi
+@include status.texi
+@include probrep.texi
+
+@ifinfo
+@node Top, Introduction, (dir), (dir)
+@top relnotes
+
+This is the online version of the RTEMS Release Notes.
+
+@menu
+* Introduction::
+* Installation Procedure::
+* Development Environment Status::
+* RTEMS PROBLEM REPORT::
+* Command and Variable Index::
+* Concept Index::
+@end menu
+
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@node Command and Variable Index, Concept Index, RTEMS PROBLEM REPORT, Top
+@unnumbered Command and Variable Index
+
+There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@node Concept Index, , Command and Variable Index, Top
+@unnumbered Concept Index
+
+There are currently no Concept Index entries.
+@c @printindex cp
+
+@contents
+@bye
+
diff --git a/doc/relnotes/status.texi b/doc/relnotes/status.texi
new file mode 100644
index 0000000000..dbc41b0333
--- /dev/null
+++ b/doc/relnotes/status.texi
@@ -0,0 +1,190 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Development Environment Status, Development Environment Status RTEMS Executive Status, Installation Procedure Installing RTEMS, Top
+@end ifinfo
+@chapter Development Environment Status
+@ifinfo
+@menu
+* Development Environment Status RTEMS Executive Status::
+* Development Environment Status Development Environment Status::
+* Development Environment Status Known Problems::
+@end menu
+@end ifinfo
+
+This chapter will describe the current status of
+release version @value{VERSION} of the RTEMS Development Environment.
+
+@ifinfo
+@node Development Environment Status RTEMS Executive Status, Development Environment Status Development Environment Status, Development Environment Status, Development Environment Status
+@end ifinfo
+@section RTEMS Executive Status
+
+Release @value{VERSION} of the RTEMS Executive contains support
+for both the classic RTEMS API based on the RTEID specification as well
+as support for POSIX threads and real-time extensions.
+
+The classic RTEMS API has the following managers based upon the RTEID
+specification:
+
+@itemize @bullet
+@item Task
+@item Initialization
+@item Clock
+@item Timer
+@item Interrupt
+@item Fatal Error
+@item Message
+@item Semaphore
+@item Event
+@item Signal
+@item Region
+@item Partition
+@item Dual Ported Memory
+@item I/O
+@item Multiprocessing
+@item Rate Monotonic
+@item User Extensions
+@end itemize
+
+RTEMS also has support for the following managers based upon the POSIX threads
+and real-time extensions:
+
+@itemize @bullet
+@item Thread
+@item Clock
+@item Key
+@item Condition Variable
+@item Mutex
+@item Signal
+@item Scheduler
+@end itemize
+
+This release of the C implementation supports the
+following processors and target boards:
+
+@itemize @bullet
+@item Motorola M68k family
+@itemize -
+@item DY-4 DMV152, SVME153
+@item Motorola IDP
+@item Motorola MVME135, MVME136
+@item Motorola MVME147, MVME147S
+@item Motorola MVME162
+@item EFI 68000 and 68332
+@item Generic 68302
+@item Generic 68360 and 68360 in companion mode with 68040
+@end itemize
+
+@item Intel i386 family
+@itemize -
+@item Force CPU386
+@item Intel i386ex eval board
+@item PC-AT i386 and above (go32)
+@end itemize
+
+@item Intel i960 family
+@itemize -
+@item Cyclone CVME960, CVME961
+@end itemize
+
+@item PowerPC
+@itemize -
+@item Papyrus (proprietary controller)
+@end itemize
+
+@item SPARC
+@itemize -
+@item ERC32 (space-hardened V7)
+@end itemize
+
+@item MIPS
+@itemize -
+@item P4000 with R4600 or R4650
+@end itemize
+
+@item AMD 29K
+@itemize -
+@item Portsw
+@end itemize
+
+@item UNIX
+@itemize -
+@item Hewlett Packard HPUX (PA-RISC)
+@item Sun Solaris 2.x (SPARC)
+@item Linux (i386)
+@end itemize
+
+@end itemize
+
+Support for the Cygnus NEWLIB Standard C Library is
+provided with this release which may be used on any of the RTEMS
+supported targets. The BSPs only provide support for console
+I/O only using this library. Support for the reentrancy
+capabilities of newlib is provided in the RTEMS distribution.
+
+@ifinfo
+@node Development Environment Status Development Environment Status, Development Environment Status Known Problems, Development Environment Status RTEMS Executive Status, Development Environment Status
+@end ifinfo
+@section Development Environment Status
+
+This section details the versions of the tools used
+to develop and maintain RTEMS @value{VERSION}:
+
+@itemize @bullet
+@item Cross Tools
+@itemize -
+@item gcc - 2.7.2.2 with rtems patch
+@item binutils - 2.7 with rtems patch
+@item zip - 1.2.4
+@item make - 3.74
+@end itemize
+@end itemize
+
+
+@ifinfo
+@node Development Environment Status Known Problems, Executive Problems, Development Environment Status Development Environment Status, Development Environment Status
+@end ifinfo
+@section Known Problems
+@ifinfo
+@menu
+* Executive Problems::
+* Development Environment Problems::
+* RTEMS Problem Reporting::
+@end menu
+@end ifinfo
+
+Problems which are known to exist at the time of
+release are described in the following sections. These are
+provided as warnings to the user and where possible, workarounds
+are provided until the problem is corrected.
+
+@ifinfo
+@node Executive Problems, Development Environment Problems, Development Environment Status Known Problems, Development Environment Status Known Problems
+@end ifinfo
+@subsection Executive Problems
+
+There are no known bugs in the executive itself.
+
+@ifinfo
+@node Development Environment Problems, RTEMS Problem Reporting, Executive Problems, Development Environment Status Known Problems
+@end ifinfo
+@subsection Development Environment Problems
+
+There are no known major problems with the
+development environment.
+
+@ifinfo
+@node RTEMS Problem Reporting, RTEMS PROBLEM REPORT, Development Environment Problems, Development Environment Status Known Problems
+@end ifinfo
+@subsection RTEMS Problem Reporting
+
+The RTEMS Project uses the GNATS Problem Reporting and Tracking System.
+Instructions for reporting a problem are located at
+@uref{http://www.rtems.com/bugs.html}.
diff --git a/doc/rgdb_specs/.cvsignore b/doc/rgdb_specs/.cvsignore
new file mode 100644
index 0000000000..8b5c9bdf74
--- /dev/null
+++ b/doc/rgdb_specs/.cvsignore
@@ -0,0 +1,35 @@
+comm.texi
+conclusion.texi
+daemon.texi
+gdbinternals.texi
+index.html
+interfacing.texi
+intro.texi
+layers.pdf
+Makefile
+Makefile.in
+mdate-sh
+objectives.texi
+process.pdf
+revision.texi
+rgdb_specs
+rgdb_specs.aux
+rgdb_specs.cp
+rgdb_specs.dvi
+rgdb_specs.fn
+rgdb_specs*.html
+rgdb_specs.ky
+rgdb_specs.log
+rgdb_specs.pdf
+rgdb_specs.pg
+rgdb_specs.ps
+rgdb_specs.toc
+rgdb_specs.tp
+rgdb_specs.vr
+rtems_footer.html
+rtems_header.html
+seqbreak.pdf
+seqdetach.pdf
+seqinit.pdf
+stamp-vti
+version.texi
diff --git a/doc/rgdb_specs/Makefile.am b/doc/rgdb_specs/Makefile.am
new file mode 100644
index 0000000000..e1cee9969a
--- /dev/null
+++ b/doc/rgdb_specs/Makefile.am
@@ -0,0 +1,80 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = rgdb_specs
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/main.am
+
+GENERATED_FILES = intro.texi revision.texi objectives.texi gdbinternals.texi \
+ interfacing.texi comm.texi daemon.texi conclusion.texi
+COMMON_FILES += $(top_srcdir)/common/cpright.texi
+
+FILES =
+
+info_TEXINFOS = rgdb_specs.texi
+rgdb_specs_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+JPEG_FILES = layers.jpg process.jpg seqinit.jpg seqbreak.jpg seqdetach.jpg
+
+PDF_IMAGES = layers.pdf process.pdf seqdetach.pdf seqbreak.pdf seqinit.pdf
+
+if USE_HTML
+html_project_DATA += $(JPEG_FILES)
+endif
+
+#
+# Process Automatically Generated Files
+#
+
+intro.texi: intro.t
+ $(BMENU2) -c -p "Top" \
+ -u "Top" \
+ -n "Document Revision History" < $< > $@
+
+revision.texi: revision.t
+ $(BMENU2) -c -p "Introduction" \
+ -u "Top" \
+ -n "Objectives" < $< > $@
+
+objectives.texi: objectives.t
+ $(BMENU2) -c -p "Document Revision History" \
+ -u "Top" \
+ -n "A Rapid Tour of GDB Internals" < $< > $@
+
+gdbinternals.texi: gdbinternals.t
+ $(BMENU2) -c -p "Implied Restrictions" \
+ -u "Top" \
+ -n "Interfacing GDB with RTEMS as a Target" < $< > $@
+
+interfacing.texi: interfacing.t
+ $(BMENU2) -c -p "A Rapid Tour of GDB Internals" \
+ -u "Top" \
+ -n "Communication with GDB" < $< > $@
+
+comm.texi: comm.t
+ $(BMENU2) -c -p "Interfacing GDB with RTEMS as a Target" \
+ -u "Top" \
+ -n "RTEMS Debugger Server Daemon" < $< > $@
+
+daemon.texi: daemon.t
+ $(BMENU2) -c -p "Communication with GDB" \
+ -u "Top" \
+ -n "Conclusion" < $< > $@
+
+conclusion.texi: conclusion.t
+ $(BMENU2) -c -p "Output of a Debug Session with the Prototype" \
+ -u "Top" \
+ -n "" < $< > $@
+
+noinst_DATA = layers.eps process.eps seqdetach.eps seqbreak.eps seqinit.eps
+
+EXTRA_DIST = comm.t conclusion.t daemon.t gdbinternals.t interfacing.t \
+ intro.t objectives.t revision.t $(noinst_DATA) $(JPEG_FILES)
+CLEANFILES += rgdb_specs.info
diff --git a/doc/rgdb_specs/comm.t b/doc/rgdb_specs/comm.t
new file mode 100644
index 0000000000..d7342154ed
--- /dev/null
+++ b/doc/rgdb_specs/comm.t
@@ -0,0 +1,115 @@
+@c
+@c RTEMS Remote Debugger Server Specifications
+@c
+@c Written by: Eric Valette <valette@crf.canon.fr>
+@c Emmanuel Raguet <raguet@crf.canon.fr>
+@c
+@c
+@c $Id$
+@c
+
+@chapter Communication with GDB
+
+The RTEMS remote debugger will be accessed by GDB on a host machine
+through a communication link. We will use the TCP/IP stack included in RTEMS
+: the FreeBSD stack. The communication link will be based based on the UDP protocol
+and the BSD sockets which are parts of the FreeBSD stack. On top of these layers,
+we will plug a module which allows a simple communication between different
+machines (especially between different endianess machines) : the SUN Remote
+Procedure Call (SUN RPC). This code is freely available on the net and comes
+with a BSD like license. With this module, a process can invoke a procedure
+on a remote system. The RTEMS remote debugger will be seen by GDB as a SUN RPC
+server. Commands will be packed by the GDB SUN RPC client and sent to the server.
+This server will unpack these commands, execute them and, if needed, return
+results to the SUN RPC client.
+
+
+Only a minimal subset of the SUN RPC library must be implemented.
+For example, the portmapper related API which allows a dynamic allocation of
+port numbers will not be implemented and some specific UDP port numbers will
+be used to establish the communication between the host and the target. The
+SUN RPC library implements the XDR module (eXternal Data Representation) which
+is a standard way of encoding data in a portable fashion between different endian
+systems. Below are figures describing the additional code and data size for
+the minimal library implementation we currently have already implemented for
+RTEMS :
+
+@example
+$ size -x librpc.a
+text data bss dec hex filename
+0x40e 0x0 0x0 1038 40e rpc_callmsg.o (ex librpc.a)
+0x2f1 0x18 0x0 777 309 rpc_prot.o (ex librpc.a)
+0x458 0x0 0x0 1112 458 svc.o (ex librpc.a)
+0x4f 0x4 0x0 83 53 svc_auth.o (ex librpc.a)
+0x75c 0x18 0x0 1908 774 svc_udp.o (ex librpc.a)
+0x711 0x4 0x10 1829 725 xdr.o (ex librpc.a)
+0x149 0x0 0x0 329 149 xdr_array.o (ex librpc.a)
+0x165 0x20 0x0 389 185 xdr_mem.o (ex librpc.a)
+@end example
+
+We have a constraint with the use of the UDP protocol. Because this
+protocol is connectionless, it is impossible, especially for the target, to
+detect if the connection is always active. On the other hand, using the TCP/IP
+protocols seems to be heavy especially if we plan to implement a dedicated micro
+stack for debug in the future. It can be a real problem to let the debugged
+process stopped during a long time even if there is no more debugger connected
+to the system. To avoid such a problem, the target must periodically test the
+connection with the host on another way than the one used to receive the commands.
+We must therefore open two communication ways so we need two fixed UDP port
+numbers.
+
+@enumerate
+@item One port will be used by the debugger to send its commands to the
+debugged process and to receive the result of these commands. View from the
+remote debugger, this port will be called primary port. For this one, we choose
+arbitrarily the port number 2000.
+@item The other socket will be used as secondary port by the target to sometimes
+test the connection between the host and the target. These tests will occur
+in specific situations, when a process will be stopped on a breakpoint, single
+step instruction or other means. This secondary port will also be used by the
+target to signal any change in the behavior of a debugged process (stopped,
+killed, waiting for,...). For the secondary port, we choose the port number
+2010.
+@end enumerate
+
+These two port numbers are used by the remote debugger to open the
+two communication sockets. GDB will use its own mean to choose its port numbers
+(probably the Unix portmapper). The figure layer shows the different
+layers we need to implement.
+
+@c
+@c Communications Layers Figure
+@c
+
+@ifset use-ascii
+@example
+@group
+XXXXX reference it in the previous paragraph
+XXXXX insert layers.eps
+XXXXX Caption Communications Layers
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@example
+@group
+@c XXXXX reference it in the previous paragraph
+@c XXXXX insert layers.eps
+@c XXXXX Caption Communications Layers
+@end group
+@end example
+@image{layers,,6in}
+@end ifset
+
+
+@ifset use-html
+@c <IMG SRC="layers.jpg" WIDTH=500 HEIGHT=600 ALT="Communications Layers">
+@html
+<IMG SRC="layers.jpg" ALT="Communications Layers">
+@end html
+@end ifset
+
+
+
+
diff --git a/doc/rgdb_specs/conclusion.t b/doc/rgdb_specs/conclusion.t
new file mode 100644
index 0000000000..b2ed9ca340
--- /dev/null
+++ b/doc/rgdb_specs/conclusion.t
@@ -0,0 +1,51 @@
+@c
+@c RTEMS Remote Debugger Server Specifications
+@c
+@c Written by: Eric Valette <valette@crf.canon.fr>
+@c Emmanuel Raguet <raguet@crf.canon.fr>
+@c
+@c
+@c $Id$
+@c
+
+@chapter Conclusion
+
+In this document we have presented how we envisage to add remote debugging facilities
+to RTEMS by implementing a remote debugger daemon for GDB. As any debug implemented
+in software, it will have limitation but we are confident that most of them
+can be removed by adding separate software components dedicated to debug activity.
+We must keep in mind that even with this approach, no software will enable the
+debug of code with interrupt entirely masked at processor level and that In
+Circuit Emulator (ICE) or use of BDM extension on the target board are the ultimate
+way to really debug any portion of an RTOS. BDM support in GDB is still weak
+but people are working on it and we may get something better in a near future.
+
+@ifset use-ascii
+@example
+@group
+XXXXX reference it in the previous paragraph
+XXXXX insert process.eps
+XXXXX Caption remote debugger tasks and handlers
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@example
+@group
+@c XXXXX reference it in the previous paragraph
+@c XXXXX insert process.eps
+@c XXXXX Caption remote debugger tasks and handlers
+@end group
+@end example
+@image{process,6in,}
+@end ifset
+
+
+@ifset use-html
+@c <IMG SRC="process.jpg" WIDTH=500 HEIGHT=600 ALT="remote debugger tasks and handlers">
+@html
+<IMG SRC="process.jpg" ALT="remote debugger tasks and handlers">
+@end html
+@end ifset
+
diff --git a/doc/rgdb_specs/daemon.t b/doc/rgdb_specs/daemon.t
new file mode 100644
index 0000000000..61d4762cd2
--- /dev/null
+++ b/doc/rgdb_specs/daemon.t
@@ -0,0 +1,437 @@
+@c
+@c RTEMS Remote Debugger Server Specifications
+@c
+@c Written by: Eric Valette <valette@crf.canon.fr>
+@c Emmanuel Raguet <raguet@crf.canon.fr>
+@c
+@c
+@c $Id$
+@c
+
+@chapter RTEMS Debugger Server Daemon
+
+We will describe in this section how this debugger server will be
+implemented on RTEMS environment. Our initial target is based on Intel Pentium
+and we will use an Ethernet link to communicate between the host and the target.
+
+The RTEMS remote debugger will be composed by several tasks and exception
+handlers :
+
+@itemize @bullet
+@item an initialization task which opens the sockets and runs the SUN RPC
+server. This task will also connect the interrupt handlers and launch the communication
+task
+@item a communication task which receives the SUN RPC commands, executes
+them and sends the result to the GDB client,
+@item A debuggee event management task which waits for events. We need a different
+task than the command management task in order to be able to still accept commands
+while no event has yet occurred for the debuggee. An example could be a continue
+command from GDB and then hitting to DEL key to see what is currently going
+on on the target side because an expected breakpoint is not caught...
+@item a debug exception handler which manages the hardware breakpoint and
+single step exceptions (INT 1 on Intel x86),
+@item a breakpoint exception handler which manages the software breakpoints
+exceptions (INT 3 on Intel x86),
+@item a default exception handler used to catch every possible errors make on the
+target system,
+@end itemize
+
+@c XXX figure reference
+@c XXX references to other sections
+Figure @b{remote debugger tasks and handlers} represents these
+different tasks and handlers. The synchronization between the different task
+and exception handlers will be described below in the section
+@b{Synchronization Among Tasks and Exception Handlers}.
+Some open issues we have faced for a prototype implementation are described
+in the section @b{Open Issues}. The temporary workaround we chose are described
+in chapter @b{Workarounds for Open Issues in Prototype}.
+
+
+@section The INITIALIZATION task
+
+This is the task that must be executed at the boot phase of RTEMS.
+It initializes the debug context. It must :
+
+@itemize @bullet
+@item open the UDP sockets,
+@item run the SUN RPC server main loop,
+@item create the COMMAND MANAGEMENT task,
+@item connect the DEBUG EXCEPTION handler,
+@item connect the SOFTWARE BREAKPOINT handler,
+@item delete itself.
+@end itemize
+If an error occurs at any step of the execution, the connections established
+before the error will be closed, before the initialization task deletes itself.
+
+
+@section The COMMAND_MNGT task
+
+This task is in charge of receiving the SUN RPC messages and executing
+the associated commands. This task must have an important priority because it
+must be executed each time a command message comes from the debugger. It must
+be executed even if one or both exception handlers are executed. But the COMMAND
+MANAGEMENT task must not block the TCP/IP module without which no message can
+be received.
+
+When not executing a command, this task is waiting for a SUN RPC message
+on the primary port. This idle state blocks the task, so the other active tasks
+can run. Once a message comes from Ethernet via the primary port, the COMMAND
+MANAGEMENT task wakes up and receives the message which is a request from GDB.
+This request is sent to the SUN RPC server code which extracts the command and
+its arguments, executes it and, if needed, sends a result to GDB. After having
+performed these actions, the task sleeps, waiting for another message.
+
+A particular case is the reception of the ATTACH command : in this
+case the COMMAND_MNGT task creates the EVENT_MNGT task described below before
+going to wait on UDP socket again.
+
+
+@section The EVENT_MNGT task
+
+This task is in charge of managing events happening on the debuggee such as
+breakpoint, exceptions. This task does a basic simple loop waiting for event
+on a synchronization variable. It is waken up by exception handlers code. It
+then signals GDB that an event occurred and then go sleeping again as further
+requests will be processed by the COMMAND_MNGT task.
+
+
+@section The DEBUG EXCEPTION handler
+
+This handler is connected to the DEBUG exception (INT 1 on Intel ix86).
+This exception is entered when :
+
+@itemize @bullet
+@item executing a single-step instruction,
+@item hardware breakpoint condition is true,
+@end itemize
+These events will be treated by the debugger because they are the
+primary event used when debugging a software for instruction stepping. In both
+cases, the DEBUG EXCEPTION handler code is executed. Please note that the execution
+context of the exception handler is the supervisor stack of the task that generated
+the exception. This implies:
+
+@itemize @bullet
+@item We may sleep in this context,
+@item We have as many possible execution context for the DEBUG EXCEPTION handler as
+we need to,
+@item When we enter the high level exception handler code, a normalized exception
+context has been pushed on the system stack and a pointer to this context is
+available as the first argument (cf cpukit/score/cpu/i386/cpu.c for more
+details),
+@end itemize
+First the exception handler wakeup the EVENT_MNGT task. Then it will
+cause the faulting thread to sleep on a synchronization object. As soon as GDB
+receives the event notifying that the debuggee status has changed, it will start
+sending requests to get the debuggee status (registers set, faulty task id,
+...). These requests are handled by the COMMAND MANAGEMENT task. When this task
+receive a PTRACE_CONT command it will resume the execution of the task that
+caused the exception by doing a V on the synchronization object.
+
+
+@section The BREAKPOINT EXCEPTION handler
+
+This handler is connected to the BREAKPOINT exception (INT3 on Intel
+Ix86). Each time the debugger wants to place a software breakpoint in the debuggee,
+a debuggee opcode is temporarily replaced by an instruction causing BREAKPOINT
+exception (the ``INT 3'' instruction on Intel ix86). When ``INT 3'' is executed,
+the BREAKPOINT handler is executed. Otherwise, the exception processing is the
+same than the one described in previous section.
+
+
+@section Synchronization Among Tasks and Exception Handlers
+
+The previous chapters have presented a simplified and static view of the various
+tasks and exceptions handlers. This chapter is more focussed on synchronization
+requirements about the various pieces of code executed when RGDBSD is operating.
+
+
+@subsection Implicit Synchronization Using Task Priorities
+
+This chapter is relevant on Uniprocessor System (UP) only. However, it will
+also list the requirements for explicit synchronization on Multi-processor Systems
+(MP). Below are the task priorities sorted by high priority. They are not supposed
+to be equal :
+
+@enumerate
+@item Network Input Task. This is the highest priority task. This can be regarded
+as a software interrupt task for FreeBSD code,
+@item RGDBSD command task. As this task waits on UDP sockets, it shall not prevent
+the previous task from running. As the main debug entry point, it should preempt
+any other task in the system,
+@item RGDBSD event task. This task should preempt any task but the two mentionned
+before to signal a debug event to GDB. The command task shall be able to preempt
+this task for emergency command such as DEL, or REBOOT,
+@item Applications tasks (task we are able to debug),
+@end enumerate
+
+Using theses priorities eliminates the need for adding more synchronization
+objects in the next section. My belief is that symmetric MP support will require
+more important change in the RTEMS than RGDBSD itself like multiple scheduler
+queues, task to processor binding for non symmetric IO, use a different implementation
+for @emph{task_disable_preemption}, ...
+
+
+@subsection Explicit Synchronization
+
+This chapter will describe the synchronization variables that need to be implemented
+in order to sequence debug events in a way that is compatible with what GDB
+code expects. The root of the problem is that GDB code mainly expects that once
+a debug event has occurred on the debuggee, the entire debuggee is frozen and
+no other event will occur before the CONTINUE command is issued. This behavior
+is hard to achieve in our case as once we hit a breakpoint, only the task that
+hits the breakpoint will be asleep on a synchronization object. Other tasks
+may hit other breakpoints while we are waiting commands from GDB generating
+potential unexpected events. There is a solutions if RGDBSD itself use RTEMS
+threads to fix this problem by creating a task that loops forever at a priority
+superior to any debugged task but below RGDBSD task priorities. Unfortunately
+this will not work for the case we use the nano-kernel implementation and we
+think it is better to study synchronization problems now. We also expects that
+multi-thread debug support hardening in GDB will remove some event serializations
+requirements. Here is the list of synchronization variables we plan to use and
+their usage. They are all regular semaphores. They are not binary semaphores
+because the task that does V is not the task that has done the P.
+
+@itemize @bullet
+@item @emph{WakeUpEventTask} : used by exception handler code to wake up the EVENT_MNGT
+task by doing a V operation on this object. When target code is running normally
+the EVENT_MNGT task sleeps due to a P operation on this semaphore,
+@item @emph{SerializeDebugEvent} : used to serialize events in a way compatible to
+what GDB expects. Before doing a V operation on @emph{WakeUpEventTask}, the
+exception handler does a P on this semaphore to be sure processing of another
+exception is not in progress. Upon reception of a CONTINUE command, the COMMAND_MNGT
+task will issue a V operation so that the exception code can wake up EVENT_MNGT
+task using the mechanism described above,
+@item @emph{RestartFromException} : (in fact one semaphore per task) used by exception
+handling code to put a faulty task to sleep once it has generated an exception
+by doing a P operation on this semaphore. In the case the exception was generated
+due to a breakpoint, GDB command will modify back the BREAKPOINT opcode to the
+original value before doing the CONTINUE command. This command will perform
+a V on this semaphore. In the case it is a real non restartable exception (faulty
+memory reference via invalid pointer for example), GDB will not allow to restart
+the program avoiding any loop. So not special analysis of cause of exception
+is foreseen as far as RGDBSD code is concerned,
+@end itemize
+
+@section Open Issues
+
+Here are some problems we have faced while implementing our prototype :
+
+@table @b
+@item [Protected ReadMem/WriteMem (I1)]:
+A GDB user can request to see the content
+of a corrupted pointer. The request PEEK_DATA will be performed by the COMMAND_MNGT
+task. It shall not enter the default exception handler set by RGDBSD or it will
+cause a dead lock in the RGDBSD code. Replacing the default exception vector
+before calling @b{readMem/writeMem} can be temporarily sufficient but :
+
+@itemize @bullet
+@item It will never work on MP system as it will rely on task priorities to insure
+that other task will not cause exceptions while we have removed the default
+exception handler,
+
+@item This feature should not be usable in RGDBSD only but also by an embedded debugger
+that may run without any task. It is also unavoidable in case of protected memory
+and in this case no priority mechanism can be used,
+
+@item In the case of using RGDBSD code on a dedicated nano kernel, this code will
+be called from interrupt level and we need a way to be sure we can debug other
+interrupts that may also cause exceptions,
+@end itemize
+
+@item [ATTACH Command Implementation (I2)]:
+After the @emph{target rtems symbolic_ip_target_name}
+command, the normal operation is to issue an @emph{attach lid} command where
+@emph{lid} represents a valid execution context. For Unix this is a process
+id, for other multi-tasking system this is the id of a thread. After the attach
+command, GDB expects to be waken up in the same manner as it is for normal events.
+Once waken up it expects to have a complete register context available and also
+that the target task is in a stopped state and that it can restart it using
+the regular CONTINUE command. In RTEMS there is a way to get force a thread
+to become inactive via @emph{rtems_task_suspend} but no way to get the full
+registers set for the thread. A partial context can be retrieved from the task
+@emph{Registers} data structure. On the other hand, relying on @emph{rtems_task_suspend}
+will be a problem for the nano-kernel implementation.
+
+@item [Stopping Target System (I3)]:
+Allthough it might not be obvious, most of the
+actions made by a GDB user assume the target is not running. If you modify a
+variable via the @emph{set variable = value} command you expect that the value
+is the one you have put when restarting. If a still running task modifies the
+same value in the mean time, this may be false. On the other hand, stopping
+all the tasks on the target system impose to have a very deep knowledge of the
+system. Using an interrupt driven RGDBSD, may facilitate the implementation
+on the nano-kernel.
+
+@item [Getting Tasks Contexts (I4)]:
+As previously mentionned there is no way to get
+tasks execution contexts via the RTEMS API. This is needed when debugging for
+example via this classical sequence :
+
+@enumerate
+
+@item @emph{(gdb) target rtems symbolic_ip_target_name}
+
+@item @emph{(gdb) info threads <=} get a thread list on screen
+
+@item @emph{(gdb)} @emph{attach thread_id} <= thread_id is one of the thread in
+the list
+
+@item @emph{(gdb) b a_function_of_interest }
+
+@item @emph{(gdb) continue}
+
+@item @emph{(gdb)} @emph{backtrace} <= print the call stack on the screen once we
+have hit the breakpoint
+
+@item @emph{(gdb) thread target another_thread_li <=} change implicit current thread
+value for gdb commands
+
+@item @emph{(gdb)} @emph{backtrace <=} should print the backtrace for the chosen thread
+@end enumerate
+In our execution model, we have a valid context only for the threads that hits
+the breakpoint as it has been pushed by the exception handler code. The other
+thread is still running and during the various RPC requesting memory access,
+it even changes as the COMMAND_MNGT thread is going to sleep. So the backtrace
+command will fail. We must find a way to make this work as it is very usefull
+when debugging multi-threaded programs,
+
+
+@item [Backtrace Stop convention (I5)]:
+The backtrace command on RTEMS task does not
+gracefully terminate as GDB does not find some backtrace termination condition
+it expects.
+@end table
+
+@section Workarounds for Open Issues in Prototype
+
+@table @b
+
+@item [(I1)]:
+Not implemented.We would rather like to work on the formalization of
+per thread flags and global flags that are much more general than any kludge
+we could implement,
+
+@item [(I2)]:
+We have tried two solutions in our prototype. The first one was to use
+the @emph{idle} thread context contained in the @emph{Registers} task control
+block field. The drawback of this solution was that we had to implement specific
+code for the continue operation immediately following the attach command. We
+then decided to create a dedicated task that will only exist during the attach
+phase. This task will call the ``ENTER_RGDB'' exception. This call will execute
+the Exception Handler that saves a valid context and that notifies a change
+to GDB. After the first CONTINUE command from GDB, this task will continue its
+execution and delete itself,
+
+@item [(I3)]:
+As explained above in the synchronization chapter, we choose to serialize
+events in a way that makes GDB think the system is frozen,
+
+@item [(I4)]:
+As a temporary fix, we have called @emph{rtems_task_suspend} and used
+the context switch contex for tasks that are unknown to RGDBSD,
+
+@item [(I5)]:
+Not Implemented yet. If I remember correctly, setting the frame pointer
+to 0 at task initialization for CISC processor solves this problem (ebp = 0x0
+on Intel or a6 = 0x0 on 680x0). This should be done in rtems_task_create function
+in the path to really starts the task for the first time. The processor/system
+specific stop condition can be found as macros in the GDB source tree.
+@end table
+
+@section Output of a Debug Session with the Prototype
+
+This is a sample session with the remote debugging prototype. Note that
+some lines have been broken so they would print properly when printed.
+
+@example
+GNU gdb 4.17
+Copyright 1998 Free Software Foundation, Inc.
+GDB is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions. Type "show copying" to see the conditions.
+There is absolutely no warranty for GDB.
+Type "show warranty" for details.
+This GDB was configured as --host=i686-pc-linux-gnu --target=i386-rtems.
+Attaching remote machine across net...
+Connected to net-test.
+Now the "run" command will start a remote process.
+Setting up the environment for debugging gdb.
+(gdb) attach 1
+Attaching program: /build-rtems/pc386/tests/debug.exe pid 1
+0x230715 in enterRdbg ()
+(gdb) info threads
+There are 8 threads:
+Id. Name Detached Suspended
+134283273 Rini No No <= current target thread
+0x230715 in enterRdbg ()
+134283272 Evnt No No
+_Thread_Dispatch () at /rtems/cpukit/score/src/thread.c:315
+134283271 SPE2 No No
+_Thread_Dispatch () at /rtems/cpukit/score/src/thread.c:315
+134283270 SPE1 No No
+_Thread_Handler () at /rtems/cpukit/score/src/thread.c:1107
+134283269 RDBG No No
+0x230715 in enterRdbg ()
+134283268 SCrx No No
+_Thread_Dispatch () at /rtems/cpukit/score/src/thread.c:315
+134283267 SCtx No No
+_Thread_Dispatch () at /rtems/cpukit/score/src/thread.c:315
+134283266 ntwk No No
+_Thread_Dispatch () at /rtems/cpukit/score/src/thread.c:315
+(gdb) b init.c:89
+Breakpoint 1 at 0x200180: file \
+ /rtems/c/src/tests/samples/debug/init.c, line 89.
+(gdb) c
+Continuing.
+Thread 134283273 (Rini) has been deleted.
+[Switching to Rtems thread 134283271 (Not suspended) \
+ ( <= current target thread )]
+Breakpoint 1, example2 (argument=4) at \
+ /rtems/c/src/tests/samples/debug/init.c:89
+89 tuto += tuti;
+(gdb) s
+90 if (print_enable2)
+(gdb) c
+Continuing.
+Breakpoint 1, example2 (argument=4) at \
+ /rtems/c/src/tests/samples/debug/init.c:89
+89 tuto += tuti;
+(gdb) b init.c:66
+Breakpoint 2 at 0x200128: file \
+ /rtems/c/src/tests/samples/debug/init.c, line 66.
+(gdb) c
+Continuing.
+Switching to Rtems thread 134283270 (Not suspended) \
+ ( <= current target thread )]
+Breakpoint 2, example1 (argument=4) at \
+ /rtems/c/src/tests/samples/debug/init.c:66
+66 toto += titi;
+(gdb) c
+Continuing.
+[Switching to Rtems thread 134283271 (Not suspended) \
+ ( <= current target thread )]
+Breakpoint 1, example2 (argument=4) at \
+ /rtems/c/src/tests/samples/debug/init.c:89
+89 tuto += tuti;
+(gdb) bt
+#0 example2 (argument=4)
+ at /rtems/c/src/tests/samples/debug/init.c:89
+#1 0xf0009bd0 in ?? ()
+(gdb) thread target 134283270
+thread 134283270 [SPE1], _Thread_Dispatch () at \
+ /rtems/cpukit/score/src/thread.c:315
+315 executing = _Thread_Executing;
+(gdb) c
+Continuing.
+Breakpoint 2, example1 (argument=4) at \
+ /rtems/c/src/tests/samples/debug/init.c:66
+66 toto += titi;
+(gdb) detach
+Detaching program: /build-rtems/pc386/tests/debug.exe pid 1
+Warning: the next command will be done localy! \
+ If you want to restart another remote
+program, reuse the target command
+(gdb)
+@end example
+
+
diff --git a/doc/rgdb_specs/gdbinternals.t b/doc/rgdb_specs/gdbinternals.t
new file mode 100644
index 0000000000..947130155a
--- /dev/null
+++ b/doc/rgdb_specs/gdbinternals.t
@@ -0,0 +1,309 @@
+@c
+@c RTEMS Remote Debugger Server Specifications
+@c
+@c Written by: Eric Valette <valette@crf.canon.fr>
+@c Emmanuel Raguet <raguet@crf.canon.fr>
+@c
+@c
+@c $Id$
+@c
+
+@chapter A Rapid Tour of GDB Internals
+
+To help the reader to understand what needs to be implemented, we
+will present briefly how GDB works regardless if the target is local or remote.
+A debugger is a tool which enables control of the execution of software on a
+target system. In most of cases, the debugger connects to a target system, attaches
+a process, inserts breakpoints and resumes execution. Then the normal execution
+is completely events driven (process execution stopped due to a breakpoint,
+process fault, single-step,...) coming from the debuggee. It can also directly
+access some parts of the target processor context (registers, data memory, code
+memory,...) and change their content. Native GDB debugger can just be seen as
+special cases where the host and the target are on the same machine and GDB
+can directly access the target system debug API.
+
+
+In our case, the host and the target are not on the same machine and
+an Ethernet link is used to communicate between the different machines. Because
+GDB needs to be able to support various targets (including Unix core file, ...),
+each action that needs to be performed on the debuggee is materialized by a
+field of the following @emph{targets_op}s structure :
+
+@example
+struct target_ops
+@{
+ char *to_shortname; /* Name this target type */
+ char *to_longname; /* Name for printing */
+ char *to_doc; /* Documentation. Does not include trailing
+ newline, and starts with a one-line
+ description (probably similar to
+ to_longname). */
+ void (*to_open) PARAMS ((char *, int));
+ void (*to_close) PARAMS ((int));
+ void (*to_attach) PARAMS ((char *, int));
+ void (*to_detach) PARAMS ((char *, int));
+ void (*to_resume) PARAMS ((int, int, enum target_signal));
+ int (*to_wait) PARAMS ((int, struct target_waitstatus *));
+ void (*to_fetch_registers) PARAMS ((int));
+ void (*to_store_registers) PARAMS ((int));
+ void (*to_prepare_to_store) PARAMS ((void));
+
+ /* Transfer LEN bytes of memory between GDB address MYADDR and
+ target address MEMADDR. If WRITE, transfer them to the target,
+ else transfer them from the target. TARGET is the target from
+ which we get this function.
+
+ Return value, N, is one of the following:
+
+ 0 means that we can't handle this. If errno has been set,
+ it is the error which prevented us from doing it (FIXME:
+ What about bfd_error?).
+
+ positive (call it N) means that we have transferred N bytes
+ starting at MEMADDR. We might be able to handle more bytes
+ beyond this length, but no promises.
+
+ negative (call its absolute value N) means that we cannot
+ transfer right at MEMADDR, but we could transfer at least
+ something at MEMADDR + N. */
+
+ int (*to_xfer_memory)
+ PARAMS ((CORE_ADDR memaddr, char *myaddr,
+ int len, int write,
+ struct target_ops * target));
+
+ void (*to_files_info) PARAMS ((struct target_ops *));
+ int (*to_insert_breakpoint) PARAMS ((CORE_ADDR, char *));
+ int (*to_remove_breakpoint) PARAMS ((CORE_ADDR, char *));
+ void (*to_terminal_init) PARAMS ((void));
+ void (*to_terminal_inferior) PARAMS ((void));
+ void (*to_terminal_ours_for_output) PARAMS ((void));
+ void (*to_terminal_ours) PARAMS ((void));
+ void (*to_terminal_info) PARAMS ((char *, int));
+ void (*to_kill) PARAMS ((void));
+ void (*to_load) PARAMS ((char *, int));
+ int (*to_lookup_symbol) PARAMS ((char *, CORE_ADDR *));
+ void (*to_create_inferior) PARAMS ((char *, char *, char **));
+ void (*to_mourn_inferior) PARAMS ((void));
+ int (*to_can_run) PARAMS ((void));
+ void (*to_notice_signals) PARAMS ((int pid));
+ int (*to_thread_alive) PARAMS ((int pid));
+ void (*to_stop) PARAMS ((void));
+ enum strata to_stratum;
+ struct target_ops
+ *DONT_USE; /* formerly to_next */
+ int to_has_all_memory;
+ int to_has_memory;
+ int to_has_stack;
+ int to_has_registers;
+ int to_has_execution;
+ struct section_table
+ *to_sections;
+ struct section_table
+ *to_sections_end;
+ int to_magic;
+ /* Need sub-structure for target machine related rather than comm related? */
+@};
+@end example
+
+This structure contains pointers to functions (in C++, this would
+be called a virtual class). Each different target supported by GDB has its own
+structure with the relevant implementation of the functions (some functions
+may be not implemented). When a user connects GDB to a target via the ``target''
+command, GDB points to the structure corresponding to this target. Then the
+user can attache GDB to a specific task via the ``attach'' command. We have
+therefore identified two steps to begin a remote debug session :
+
+@enumerate
+@item the choice of the target type (in our case RTEMS),
+@item the choice of what to debug (entire system, specific task,...),
+@end enumerate
+Note that in the case of natives debugger, the choice of the target is implicitly
+performed by commands like @b{run}, @b{attach}, @b{detach}. Several
+figures will now be described showing the main steps of a debug session.
+
+@c XXX figure reference
+Figure @b{Debug session initialization} explains how the debugger connects to the target
+:
+
+@enumerate
+@item The debugger opens a connection to the target. The word ``connection''
+doesn't only mean Ethernet or serial link connection but all the ways by which
+a process can communicate with another one (direct function call, messages mailbox,
+...),
+@item The targets checks if it can accept or reject this connection,
+@item If the connection is accepted, the host ``attaches'' the process,
+@item the target stops the process, notifies a child's stop to the host
+and waits for command,
+@item the host can ask information about the debugged process (name, registers,...)
+or perform some action like setting breakpoints, ...
+@end enumerate
+
+@c XXX figure reference
+Figure @b{Breakpoint and process execution} explains how the debugger manages the
+breakpoints and controls the execution of a process :
+
+@enumerate
+@item The host asks the debuggee what is the opcode at the concerned address
+in order for GDB to memorize this instruction,
+@item the host sends a CONTINUE command : it asks the target to write the
+``DEBUG'' opcode (for example, the INTEL ``DEBUG'' opcode is INT3 which
+generate a breakpoint trap) instead of the debugged opcode.
+@item then the host waits for events,
+@item after the change of instruction, the target resumes the execution
+of the debuggee,
+@item when the ``DEBUG'' opcode is executed, the breakpoint exception
+handler is executed and it notifies the host that the process is stopped. Then
+it waits for commands (if no command is sent after a certain amount of time,
+the connection will be closed by the target).
+@item the host asks the target to re-write the right opcode instead of the
+''DEBUG'' opcode and then can ask information
+@end enumerate
+
+@c XXX figure reference
+Figure @b{Breakpoint and process execution} also shows the case of other ``CONTINUE''
+commands (remember that the ``DEBUG'' opcode has been replaced by the right
+instruction):
+
+@enumerate
+@item Host sends first a ``single step'' command to execute the debugged
+instruction,
+@item It then waits for ``single step`` exception event,
+@item the target, once the single step executed, calls the debug exception
+handler. It notifies the host that execution is suspended and wait for commands.
+@item the host asks the target to re-write the ``DEBUG'' opcode (breakpoint
+trap) instead of the debugged one.
+@item then the host sends a ``CONTINUE'' command in order the target to
+resume the process execution to the next breakpoint.
+@end enumerate
+
+@c XXX figure reference
+Figure @b{Detach a process and close a connection} explains how the debugger disconnects from
+a target :
+
+@enumerate
+@item the host sends a detach command to the target.
+@item the target detaches the concerned process, notifies the detachment
+and resumes the process execution.
+@item once notified, the host sends a close connection command.
+@item the target closes the connection.
+@end enumerate
+These 3 examples show that the mains actions that are performed by
+the host debugger on the target are only simple actions which look like :
+
+@itemize @bullet
+@item read/write code,
+@item read/write data,
+@item read/write registers,
+@item manage exceptions,
+@item send/receive messages to/from the host.
+@end itemize
+
+
+@c
+@c Debug session initialization Figure
+@c
+
+@ifset use-ascii
+@example
+@group
+XXXXX reference it in the previous paragraph
+XXXXX insert seqinit.eps
+XXXXX Caption Debug session initialization
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@example
+@group
+@c XXXXX reference it in the previous paragraph
+@c XXXXX insert seqinit.eps
+@c XXXXX Caption Debug session initialization
+@end group
+@end example
+@page
+@image{seqinit}
+@end ifset
+
+
+@ifset use-html
+@c <IMG SRC="seqinit.jpg" WIDTH=500 HEIGHT=600 ALT="Debug session initialization">
+@html
+<IMG SRC="seqinit.jpg" ALT="Debug session initialization">
+@end html
+@end ifset
+
+
+@c
+@c Breakpoint and process execution Figure
+@c
+
+@ifset use-ascii
+@example
+@group
+XXXXX reference it in the previous paragraph
+XXXXX insert seqbreak.eps
+XXXXX Caption Breakpoint and process execution
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@example
+@group
+@c XXXXX reference it in the previous paragraph
+@c XXXXX insert seqbreak.eps
+@c XXXXX Caption Breakpoint and process execution
+@end group
+@end example
+@page
+@sp 5
+@image{seqbreak,,9in}
+@end ifset
+
+@ifset use-html
+@c <IMG SRC="seqbreak.jpg" WIDTH=500 HEIGHT=600 ALT="Breakpoint and process execution">
+@html
+<IMG SRC="seqbreak.jpg" ALT="Breakpoint and process execution">
+@end html
+@end ifset
+
+
+
+@c
+@c Detach a process and close a connection Figure
+@c
+
+@ifset use-ascii
+@example
+@group
+XXXXX reference it in the previous paragraph
+XXXXX insert seqdetach.eps
+XXXXX Caption Detach a process and close a connection
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@example
+@group
+@c XXXXX reference it in the previous paragraph
+@c XXXXX insert seqdetach.eps
+@c XXXXX Caption Detach a process and close a connection
+@end group
+@end example
+@sp 10
+@image{seqdetach}
+@end ifset
+
+@ifset use-html
+@c <IMG SRC="seqdetach.jpg" WIDTH=500 HEIGHT=600 ALT="Detach a process and close a connection">
+@html
+<IMG SRC="seqdetach.jpg" ALT="Detach a process and close a connection">
+@end html
+@end ifset
+
+
+
+
diff --git a/doc/rgdb_specs/interfacing.t b/doc/rgdb_specs/interfacing.t
new file mode 100644
index 0000000000..f10ccdf5e0
--- /dev/null
+++ b/doc/rgdb_specs/interfacing.t
@@ -0,0 +1,79 @@
+@c
+@c RTEMS Remote Debugger Server Specifications
+@c
+@c Written by: Eric Valette <valette@crf.canon.fr>
+@c Emmanuel Raguet <raguet@crf.canon.fr>
+@c
+@c
+@c $Id$
+@c
+
+@chapter Interfacing GDB with RTEMS as a Target
+
+@c XXX figure reference
+So, basically, porting GDB to RTEMS environment requires implementing
+the functions contained in the target_ops structure. The native debugger implementation
+(where the host machine is also the target one) uses direct function calls.
+For our needs (remote debugging), these functions must be implemented to support
+the encapsulation in UDP/IP layers and communications between different types
+of host machines : the best solution is use the SUN Remote Procedure Calls API
+(SUN RPC). This SUN RPC module will be explained below (see paragraph @b{Communication with GDB}).
+
+We can note that the functions described in the target_ops structure
+are high-level functions. The main reason is that GDB was designed in order
+to be able to use monitor firmware as a debug server. In the case of a Unix
+OS target, these high-level functions are implemented themselves using a lower
+level POSIX API. Because we want to simplify the code running on the target
+and decrease its size of this code, we propose to use the POSIX layer API used
+for the debug like @b{waitpid}, @b{ptrace}, ... Due to the GDB working
+mode and due to our requirements, we can establish here a non-exhaustive list
+of some commands required to implement the previously described functions :
+
+@itemize @bullet
+@item set up a connection with a target,
+@item close a connection,
+@item send a signal to the specified process,
+@item get a list of process/thread/connection running,
+@item control process under debug,
+@item ...
+@end itemize
+Control means that, with this function, we can read, write the memory
+of the debuggee, insert breakpoint to stop the process and resume the process
+execution. This command can be implemented by emulating in the RTEMS environment
+a Unix function called ``ptrace''. This function allows the control of a child
+process. The ``ptrace'' function has some sub-functions which are described
+below (some of these actions and standardized, the others are added due to our
+needs) :
+
+@itemize @bullet
+@item PTRACE_PEEKTEXT, PTRACE_PEEKDATA : read word at address,
+@item PTRACE_POKETEXT, PTRACE_POKEDATA :write word at address,
+@item PTRACE_CONT : restart after signal,
+@item PTRACE_KILL : send the child a SIGKILL to make it exit,
+@item PTRACE_SINGLESTEP : set the trap flag for single stepping,
+@item PTRACE_ATTACH : attach to the process specified,
+@item PTRACE_DETACH : detach a process that was previously attached.
+@end itemize
+This list only contains the command that are described in the ptrace
+Unix manpage. For some specific needs (debug of one task among several ones,
+register read/write,...), it is possible to create some special ptrace commands
+as described after :
+
+@itemize @bullet
+@item get current task registers,
+@item set current task registers,
+@item list of the threads,
+@item identifier of the target thread,
+@item restart to address,
+@item set breakpoint at address,
+@item clear breakpoint,
+@item get breakpoints,
+@item load dynamically a task,
+@item ...
+@end itemize
+This list is not exhaustive and can be increased due to the needs.
+All the described functions will not be implemented in a first version, only
+the strictly needed. If some commands are added, the modifications must be implemented
+both in RTEMS and in GDB.
+
+
diff --git a/doc/rgdb_specs/intro.t b/doc/rgdb_specs/intro.t
new file mode 100644
index 0000000000..5490eefa51
--- /dev/null
+++ b/doc/rgdb_specs/intro.t
@@ -0,0 +1,39 @@
+@c
+@c RTEMS Remote Debugger Server Specifications
+@c
+@c Written by: Eric Valette <valette@crf.canon.fr>
+@c Emmanuel Raguet <raguet@crf.canon.fr>
+@c
+@c
+@c $Id$
+@c
+
+@chapter Introduction
+
+The TOOLS project aims to provide a complete development environment
+for RTEMS OS. This environment must be as close as possible to the Chorus one
+(gnu compiler, gnu linker, gnu debugger, ...), because it is currently the OS
+which is the most used at CRF and we want to simplify the migration path from
+the ChorusOs environment to the RTEMS environment. One important item of this
+development environment is the remote debugger which allows the developer to
+debug his software on a target machine from a host machine via a communication
+link (Ethernet, serial link, ...).
+
+
+The choice of GDB as debugger has been made with because in CRF, every
+developer, which uses the ChorusOs development environment, debugs his software
+using the remote debugging functionality of GDB. Providing a remote GDB debug
+server running on RTEMS, will enable the developers to use transparently the
+same debugger for a different RTOS. Another reason for the choice of GDB is
+its constant evolution, and that it can be interfaced with graphic user interfaces
+like DDD providing a very powerfull debugging environment.
+
+
+The subject of this document is to explain how GDB works and the way
+to implement a daemon on RTEMS that will be used as a debugger server for a
+GDB client. We will call this daemon Rtems GDB Debug Server Daemon (RGDBSD).
+We aim to provide this debugger running at least on 2 host systems : Linux 2.x
+and Solaris 2.5.1 as they are the two platforms used for developing Chorus applications
+today.
+
+
diff --git a/doc/rgdb_specs/layers.eps b/doc/rgdb_specs/layers.eps
new file mode 100644
index 0000000000..e3427f67eb
--- /dev/null
+++ b/doc/rgdb_specs/layers.eps
@@ -0,0 +1,359 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: layers.eps
+%%Creator: fig2dev Version 3.2 Patchlevel 0-beta3
+%%CreationDate: Mon Oct 5 16:01:44 1998
+%%For: raguet@genesis (Emmanuel Raguet)
+%%Orientation: Portrait
+%%BoundingBox: 0 0 445 609
+%%Pages: 0
+%%BeginSetup
+%%EndSetup
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+-51.0 635.0 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+ bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+ 4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+%%EndProlog
+
+$F2psBegin
+10 setmiterlimit
+n -1000 11576 m -1000 -1000 l 9251 -1000 l 9251 11576 l cp clip
+ 0.06000 0.06000 sc
+% Polyline
+7.500 slw
+ [60] 0 sd
+gs clippath
+4530 2904 m 4500 3048 l 4470 2904 l 4470 3090 l 4530 3090 l cp
+clip
+n 5325 2100 m 5324 2101 l 5321 2104 l 5313 2111 l 5302 2121 l 5290 2133 l
+ 5278 2143 l 5267 2153 l 5257 2161 l 5248 2168 l 5238 2175 l
+ 5229 2181 l 5219 2187 l 5209 2193 l 5198 2199 l 5186 2205 l
+ 5173 2211 l 5161 2216 l 5148 2222 l 5135 2227 l 5123 2231 l
+ 5112 2234 l 5100 2238 l 5088 2240 l 5077 2242 l 5064 2244 l
+ 5051 2246 l 5037 2247 l 5023 2248 l 5009 2249 l 4994 2249 l
+ 4980 2250 l 4966 2250 l 4952 2250 l 4938 2250 l 4923 2250 l
+ 4908 2250 l 4891 2250 l 4874 2250 l 4857 2250 l 4839 2250 l
+ 4822 2250 l 4805 2250 l 4790 2250 l 4775 2250 l 4762 2250 l
+ 4750 2250 l 4737 2250 l 4724 2250 l 4712 2250 l 4701 2251 l
+ 4689 2252 l 4678 2253 l 4668 2255 l 4658 2257 l 4648 2259 l
+ 4638 2263 l 4627 2266 l 4615 2271 l 4603 2277 l 4590 2283 l
+ 4577 2291 l 4564 2299 l 4552 2308 l 4542 2318 l 4533 2327 l
+ 4525 2338 l 4520 2345 l 4516 2353 l 4513 2363 l 4510 2373 l
+ 4507 2385 l 4505 2398 l 4503 2412 l 4502 2428 l 4501 2445 l
+ 4501 2464 l 4500 2483 l 4500 2504 l 4500 2526 l 4500 2550 l
+ 4500 2566 l 4500 2583 l 4500 2602 l 4500 2622 l 4500 2644 l
+ 4500 2668 l 4500 2695 l 4500 2724 l 4500 2756 l 4500 2790 l
+ 4500 2826 l 4500 2864 l 4500 2903 l 4500 2940 l 4500 2975 l
+ 4500 3006 l 4500 3032 l 4500 3075 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+n 4530 2904 m 4500 3048 l 4470 2904 l 4500 2928 l 4530 2904 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+ [60] 0 sd
+gs clippath
+6180 2904 m 6150 3048 l 6120 2904 l 6120 3090 l 6180 3090 l cp
+clip
+n 5325 2100 m 5326 2101 l 5329 2104 l 5337 2111 l 5348 2121 l 5360 2133 l
+ 5372 2143 l 5383 2153 l 5393 2161 l 5402 2168 l 5413 2175 l
+ 5421 2181 l 5431 2187 l 5441 2193 l 5452 2199 l 5464 2205 l
+ 5477 2211 l 5489 2216 l 5502 2222 l 5515 2227 l 5527 2231 l
+ 5538 2234 l 5550 2238 l 5562 2240 l 5573 2242 l 5586 2244 l
+ 5599 2246 l 5613 2247 l 5627 2248 l 5641 2249 l 5656 2249 l
+ 5670 2250 l 5684 2250 l 5698 2250 l 5713 2250 l 5727 2250 l
+ 5742 2250 l 5759 2250 l 5776 2250 l 5793 2250 l 5811 2250 l
+ 5828 2250 l 5845 2250 l 5860 2250 l 5875 2250 l 5888 2250 l
+ 5900 2250 l 5913 2250 l 5926 2250 l 5938 2250 l 5949 2251 l
+ 5961 2252 l 5972 2253 l 5982 2255 l 5992 2257 l 6002 2259 l
+ 6013 2263 l 6023 2266 l 6035 2271 l 6047 2277 l 6060 2283 l
+ 6073 2291 l 6086 2299 l 6098 2308 l 6108 2318 l 6117 2327 l
+ 6125 2338 l 6130 2345 l 6134 2353 l 6137 2363 l 6140 2373 l
+ 6143 2385 l 6145 2398 l 6147 2412 l 6148 2428 l 6149 2445 l
+ 6149 2464 l 6150 2483 l 6150 2504 l 6150 2526 l 6150 2550 l
+ 6150 2566 l 6150 2583 l 6150 2602 l 6150 2622 l 6150 2644 l
+ 6150 2668 l 6150 2695 l 6150 2724 l 6150 2756 l 6150 2790 l
+ 6150 2826 l 6150 2864 l 6150 2903 l 6150 2940 l 6150 2975 l
+ 6150 3006 l 6150 3032 l 6150 3075 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+n 6180 2904 m 6150 3048 l 6120 2904 l 6150 2928 l 6180 2904 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+n 2614 5738 m 2615 5737 l 2619 5734 l 2628 5727 l 2642 5715 l 2659 5700 l
+ 2676 5685 l 2693 5670 l 2707 5656 l 2719 5644 l 2730 5632 l
+ 2738 5620 l 2746 5609 l 2752 5599 l 2758 5588 l 2763 5576 l
+ 2769 5563 l 2774 5550 l 2779 5535 l 2783 5520 l 2787 5504 l
+ 2791 5487 l 2795 5470 l 2798 5453 l 2801 5436 l 2804 5418 l
+ 2807 5400 l 2809 5385 l 2811 5370 l 2814 5353 l 2816 5336 l
+ 2818 5318 l 2821 5299 l 2823 5279 l 2825 5259 l 2828 5238 l
+ 2830 5217 l 2832 5196 l 2834 5174 l 2836 5153 l 2837 5133 l
+ 2839 5112 l 2840 5092 l 2842 5073 l 2843 5054 l 2844 5036 l
+ 2845 5019 l 2845 5001 l 2846 4982 l 2847 4963 l 2847 4944 l
+ 2848 4924 l 2848 4903 l 2849 4882 l 2849 4860 l 2849 4838 l
+ 2849 4816 l 2850 4794 l 2850 4773 l 2850 4751 l 2850 4729 l
+ 2850 4708 l 2850 4686 l 2850 4665 l 2850 4644 l 2850 4622 l
+ 2850 4599 l 2850 4576 l 2850 4552 l 2850 4527 l 2850 4501 l
+ 2850 4475 l 2850 4449 l 2850 4422 l 2850 4395 l 2850 4369 l
+ 2850 4343 l 2850 4318 l 2850 4293 l 2850 4270 l 2850 4248 l
+ 2850 4227 l 2850 4207 l 2850 4188 l 2850 4170 l 2850 4149 l
+ 2850 4129 l 2850 4109 l 2850 4090 l 2850 4072 l 2851 4054 l
+ 2851 4036 l 2852 4019 l 2852 4003 l 2853 3987 l 2854 3972 l
+ 2856 3957 l 2857 3943 l 2859 3930 l 2860 3917 l 2863 3904 l
+ 2865 3888 l 2868 3872 l 2872 3855 l 2875 3838 l 2880 3820 l
+ 2884 3801 l 2889 3783 l 2894 3765 l 2900 3748 l 2905 3731 l
+ 2910 3716 l 2915 3702 l 2920 3690 l 2925 3678 l 2932 3664 l
+ 2939 3651 l 2947 3638 l 2955 3627 l 2964 3618 l 2974 3609 l
+ 2983 3601 l 2993 3594 l 3002 3589 l 3013 3583 l 3021 3579 l
+ 3031 3574 l 3042 3569 l 3055 3563 l 3070 3557 l 3087 3550 l
+ 3105 3543 l 3122 3536 l 3136 3531 l 3145 3527 l 3149 3525 l
+ 3150 3525 l gs col0 s gr
+% Polyline
+n 2614 5735 m 2615 5736 l 2619 5739 l 2628 5746 l 2642 5758 l 2659 5772 l
+ 2676 5788 l 2693 5803 l 2707 5816 l 2719 5829 l 2730 5840 l
+ 2738 5852 l 2746 5863 l 2752 5874 l 2758 5884 l 2763 5896 l
+ 2769 5909 l 2774 5922 l 2779 5937 l 2783 5952 l 2787 5968 l
+ 2791 5985 l 2795 6002 l 2798 6019 l 2801 6036 l 2804 6054 l
+ 2807 6072 l 2809 6087 l 2811 6102 l 2814 6119 l 2816 6136 l
+ 2818 6154 l 2821 6173 l 2823 6193 l 2825 6213 l 2828 6234 l
+ 2830 6255 l 2832 6276 l 2834 6298 l 2836 6319 l 2837 6339 l
+ 2839 6360 l 2840 6380 l 2842 6399 l 2843 6418 l 2844 6436 l
+ 2845 6453 l 2845 6471 l 2846 6490 l 2847 6509 l 2847 6528 l
+ 2848 6548 l 2848 6569 l 2849 6590 l 2849 6612 l 2849 6634 l
+ 2849 6656 l 2850 6678 l 2850 6699 l 2850 6721 l 2850 6743 l
+ 2850 6764 l 2850 6786 l 2850 6807 l 2850 6829 l 2850 6850 l
+ 2850 6873 l 2850 6896 l 2850 6920 l 2850 6945 l 2850 6971 l
+ 2850 6997 l 2850 7023 l 2850 7050 l 2850 7077 l 2850 7103 l
+ 2850 7129 l 2850 7154 l 2850 7179 l 2850 7202 l 2850 7224 l
+ 2850 7245 l 2850 7265 l 2850 7284 l 2850 7302 l 2850 7323 l
+ 2850 7343 l 2850 7363 l 2850 7382 l 2850 7400 l 2851 7418 l
+ 2851 7436 l 2852 7453 l 2852 7469 l 2853 7485 l 2854 7500 l
+ 2856 7515 l 2857 7529 l 2859 7542 l 2860 7555 l 2863 7569 l
+ 2865 7584 l 2868 7600 l 2872 7617 l 2875 7635 l 2880 7653 l
+ 2884 7671 l 2889 7689 l 2894 7707 l 2900 7725 l 2905 7741 l
+ 2910 7756 l 2915 7770 l 2920 7783 l 2925 7795 l 2932 7809 l
+ 2939 7822 l 2947 7834 l 2955 7845 l 2964 7855 l 2974 7864 l
+ 2983 7871 l 2993 7878 l 3002 7884 l 3013 7889 l 3021 7893 l
+ 3031 7898 l 3042 7903 l 3055 7909 l 3070 7915 l 3087 7922 l
+ 3105 7929 l 3122 7936 l 3136 7941 l 3145 7945 l 3149 7947 l
+ 3150 7947 l gs col0 s gr
+% Polyline
+n 3930 8325 m 3825 8325 3825 9345 105 arcto 4 {pop} repeat
+ 3825 9450 6720 9450 105 arcto 4 {pop} repeat
+ 6825 9450 6825 8430 105 arcto 4 {pop} repeat
+ 6825 8325 3930 8325 105 arcto 4 {pop} repeat
+ cp gs col0 s gr
+% Polyline
+gs clippath
+5295 8046 m 5325 7902 l 5355 8046 l 5355 7860 l 5295 7860 l cp
+5355 8154 m 5325 8298 l 5295 8154 l 5295 8340 l 5355 8340 l cp
+clip
+n 5325 8325 m 5325 7875 l gs col0 s gr gr
+
+% arrowhead
+n 5355 8154 m 5325 8298 l 5295 8154 l 5325 8178 l 5355 8154 l cp gs 0.00 setgray ef gr col0 s
+% arrowhead
+n 5295 8046 m 5325 7902 l 5355 8046 l 5325 8022 l 5295 8046 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+n 3930 6750 m 3825 6750 3825 7770 105 arcto 4 {pop} repeat
+ 3825 7875 6720 7875 105 arcto 4 {pop} repeat
+ 6825 7875 6825 6855 105 arcto 4 {pop} repeat
+ 6825 6750 3930 6750 105 arcto 4 {pop} repeat
+ cp gs col0 s gr
+% Polyline
+gs clippath
+5295 6471 m 5325 6327 l 5355 6471 l 5355 6285 l 5295 6285 l cp
+5355 6579 m 5325 6723 l 5295 6579 l 5295 6765 l 5355 6765 l cp
+clip
+n 5325 6750 m 5325 6300 l gs col0 s gr gr
+
+% arrowhead
+n 5355 6579 m 5325 6723 l 5295 6579 l 5325 6603 l 5355 6579 l cp gs 0.00 setgray ef gr col0 s
+% arrowhead
+n 5295 6471 m 5325 6327 l 5355 6471 l 5325 6447 l 5295 6471 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+5295 4896 m 5325 4752 l 5355 4896 l 5355 4710 l 5295 4710 l cp
+5355 5004 m 5325 5148 l 5295 5004 l 5295 5190 l 5355 5190 l cp
+clip
+n 5325 5175 m 5325 4725 l gs col0 s gr gr
+
+% arrowhead
+n 5355 5004 m 5325 5148 l 5295 5004 l 5325 5028 l 5355 5004 l cp gs 0.00 setgray ef gr col0 s
+% arrowhead
+n 5295 4896 m 5325 4752 l 5355 4896 l 5325 4872 l 5295 4896 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+n 3930 3600 m 3825 3600 3825 4620 105 arcto 4 {pop} repeat
+ 3825 4725 6720 4725 105 arcto 4 {pop} repeat
+ 6825 4725 6825 3705 105 arcto 4 {pop} repeat
+ 6825 3600 3930 3600 105 arcto 4 {pop} repeat
+ cp gs col0 s gr
+% Polyline
+gs clippath
+4470 3321 m 4500 3177 l 4530 3321 l 4530 3135 l 4470 3135 l cp
+4530 3429 m 4500 3573 l 4470 3429 l 4470 3615 l 4530 3615 l cp
+clip
+n 4500 3600 m 4500 3150 l gs col0 s gr gr
+
+% arrowhead
+n 4530 3429 m 4500 3573 l 4470 3429 l 4500 3453 l 4530 3429 l cp gs 0.00 setgray ef gr col0 s
+% arrowhead
+n 4470 3321 m 4500 3177 l 4530 3321 l 4500 3297 l 4470 3321 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+n 3930 2025 m 3825 2025 3825 3045 105 arcto 4 {pop} repeat
+ 3825 3150 6720 3150 105 arcto 4 {pop} repeat
+ 6825 3150 6825 2130 105 arcto 4 {pop} repeat
+ 6825 2025 3930 2025 105 arcto 4 {pop} repeat
+ cp gs col0 s gr
+% Polyline
+gs clippath
+5295 1746 m 5325 1602 l 5355 1746 l 5355 1560 l 5295 1560 l cp
+5355 1854 m 5325 1998 l 5295 1854 l 5295 2040 l 5355 2040 l cp
+clip
+n 5325 2025 m 5325 1575 l gs col0 s gr gr
+
+% arrowhead
+n 5355 1854 m 5325 1998 l 5295 1854 l 5325 1878 l 5355 1854 l cp gs 0.00 setgray ef gr col0 s
+% arrowhead
+n 5295 1746 m 5325 1602 l 5355 1746 l 5325 1722 l 5295 1746 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+n 3930 450 m 3825 450 3825 1470 105 arcto 4 {pop} repeat
+ 3825 1575 6720 1575 105 arcto 4 {pop} repeat
+ 6825 1575 6825 555 105 arcto 4 {pop} repeat
+ 6825 450 3930 450 105 arcto 4 {pop} repeat
+ cp gs col0 s gr
+% Polyline
+gs clippath
+6120 3321 m 6150 3177 l 6180 3321 l 6180 3135 l 6120 3135 l cp
+6180 3429 m 6150 3573 l 6120 3429 l 6120 3615 l 6180 3615 l cp
+clip
+n 6150 3600 m 6150 3150 l gs col0 s gr gr
+
+% arrowhead
+n 6180 3429 m 6150 3573 l 6120 3429 l 6150 3453 l 6180 3429 l cp gs 0.00 setgray ef gr col0 s
+% arrowhead
+n 6120 3321 m 6150 3177 l 6180 3321 l 6150 3297 l 6120 3321 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+5364 10069 m 5263 10176 l 5312 10038 l 5217 10197 l 5268 10228 l cp
+5211 9581 m 5311 9473 l 5263 9612 l 5358 9453 l 5307 9422 l cp
+clip
+n 5325 9450 m 5100 9825 l 5475 9825 l 5250 10200 l gs col0 s gr gr
+
+% arrowhead
+n 5211 9581 m 5311 9473 l 5263 9612 l 5249 9576 l 5211 9581 l cp gs 0.00 setgray ef gr col0 s
+% arrowhead
+n 5364 10069 m 5263 10176 l 5312 10038 l 5326 10074 l 5364 10069 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+n 3930 5175 m 3825 5175 3825 6195 105 arcto 4 {pop} repeat
+ 3825 6300 6720 6300 105 arcto 4 {pop} repeat
+ 6825 6300 6825 5280 105 arcto 4 {pop} repeat
+ 6825 5175 3930 5175 105 arcto 4 {pop} repeat
+ cp gs col0 s gr
+/Times-Roman ff 300.00 scf sf
+5325 7500 m
+gs 1 -1 sc (IP Protocol) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+5325 9150 m
+gs 1 -1 sc (drivers) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+5325 5775 m
+gs 1 -1 sc (UDP Protocol) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+5250 4200 m
+gs 1 -1 sc (BSD Sockets) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+5325 1050 m
+gs 1 -1 sc (Remote Debugger) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+5325 8850 m
+gs 1 -1 sc (Ethernet / serial link / ...) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+1650 6075 m
+gs 1 -1 sc (TCP/IP stack) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+1575 5775 m
+gs 1 -1 sc (FreeBSD) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+5325 10500 m
+gs 1 -1 sc (Physical link) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 225.00 scf sf
+7275 3450 m
+gs 1 -1 sc (secondary port \(2010\)) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 225.00 scf sf
+3525 3450 m
+gs 1 -1 sc (primary port \(2000\)) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+5325 2700 m
+gs 1 -1 sc (SUN RPC Server) dup sw pop 2 div neg 0 rm col0 sh gr
+$F2psEnd
+rs
diff --git a/doc/rgdb_specs/layers.jpg b/doc/rgdb_specs/layers.jpg
new file mode 100644
index 0000000000..5e4b8ee675
--- /dev/null
+++ b/doc/rgdb_specs/layers.jpg
Binary files differ
diff --git a/doc/rgdb_specs/objectives.t b/doc/rgdb_specs/objectives.t
new file mode 100644
index 0000000000..a9ad4ba2c8
--- /dev/null
+++ b/doc/rgdb_specs/objectives.t
@@ -0,0 +1,307 @@
+@c
+@c RTEMS Remote Debugger Server Specifications
+@c
+@c Written by: Eric Valette <valette@crf.canon.fr>
+@c Emmanuel Raguet <raguet@crf.canon.fr>
+@c
+@c
+@c $Id$
+@c
+
+@chapter Objectives
+
+@c XXX reference
+This section is intended to clearly define the current objectives of our work.
+First, we will try here to list some ambitious requirements for the debugger
+in section @b{List of Requirements}. These requirements will deliberately be much more
+ambitious than what we will provide directly ourselves in the hope that the
+Internet development model will enable others to implement some features we
+rejected for man-power reasons in the first step. We are committed to do the
+core work and redistribute it but would appreciate any comment and enhancement.
+Then, in section @b{Requirements Analysis} we will analyze each requirement to see
+what technical problem must be solved if we want to fullfill it. After this
+analysis, we will determine in section @b{Requirements Selection} the requirements we
+chose to implement and the ones we will not. We will then clearly identify the
+limits of our solution in section @b{Implied Restrictions}.
+
+
+@section List of Requirements
+
+We will identify here possible requirements for the type of debug that may be
+provided :
+
+@table @b
+
+@item [(R1)]:
+We want to use GDB as the front-end debugger,
+
+@item [(R2)]:
+We want to support at least Intel and PowerPC as target processor architecture,
+
+@item [(R3)]:
+We want to use the GDB thread debugging interface,
+
+@item [(R4)]:
+We want to be able to debug a remote target over a serial line,
+
+@item [(R5)]:
+We want to be able to debug a remote target over Ethernet,
+
+@item [(R6)]:
+The set of target code path we will be able to debug using RGDBSD must
+be clearly identified. It will be called Debug Path Set (@emph{DPS}) in the
+remaining of this document,
+
+@item [(R7)]:
+@emph{DPS} must include the RTEMS core executive itself,
+
+@item [(R8)]:
+@emph{DPS} must include the FreeBSD stack,
+
+@item [(R9)]:
+@emph{DPS} must include anything but the FreeBSD stack and the RTEMS
+core executive,
+
+@item [(R10)]:
+We want to enable several persons to debug different parts of the code
+running on the target,
+
+@item [(R11)]:
+As much as possible the system must be frozen during a debug session
+so that debugging a particular portion of code does not prevent another part
+from functioning,
+@end table
+
+@section Requirements Analysis
+
+@table @b
+
+@item [(R1)]:
+Worth recalling it. It mainly imposes few restrictions on the binary
+files type, target processor type as :
+
+@itemize @bullet
+
+@item the binary format must be understood by GDB (to find debugging information).
+Elf, Coff and A.out are the main formats currently supported. Elf/Dwarf 2.0
+binary support will be our main target as they are the preferred format for
+Intel and PowerPC processors. No change in GDB will be required for other binaries
+except may be a new configuration file changing the binary/debug file format,
+
+@item the processor must be supported for disassemble/step instruction command,
+
+@item the target system must be supported. As far as I know RTEMS is not currently
+@emph{officially} supported anyway,
+@end itemize
+
+@item [(R2)]:
+Our primary targets are Intel and PowerPC. We however do not think implementing
+RGDBSD for other processors will be a heavy task. It will mainly require :
+
+@enumerate
+@item Implementing exception handling for the target processor,
+
+@item Interfacing the generic part of RGDBSD with the low level exception handling
+and make RGDBSD aware of exception used for debugging (usually illegal instruction
+or dedicated trap, single step),
+
+@item Making GDB aware of the frame layout pushed on exceptions,
+
+@item Implement the code for data transfer for the exception frame,
+
+@item Implement code to copy data cache back to main memory and invalidate instruction
+cache. This is needed in order to be sure opcode modification used to set breakpoint
+that use the data cache will be proagated to the instruction cache,
+@end enumerate
+
+As soon as we will have completed the first core work a document describing
+how to port it to a new processor should be written. So far we will organize
+the source tree with processor dependent directories so that port will be as
+easy as possible. May be a bare processor support should be created,
+
+
+@item [(R3)]:
+GDB already has an interface for manipulating multi-threaded programs.
+This interface is rather weak at the moment but it will certainly be improved
+in the future with the generalization of POSIX thread API on Linux and other
+operating systems. This implies that either GDB or RGDBSD is able to obtain
+the list of threads currently executing. The choice of implementing this in
+GDB or RGDBSD is a tradeof between target code size and simplicity,
+
+@item [(R4)]:
+Regular GDB code contains clients code for debugging over a serial line.
+However only few functions are implemented. We would like to provide a better
+support and to uniformize serial line debugging with debugging over Ethernet
+via the use of SLIP,
+
+@item [(R5)]:
+Regular GDB code contains client code for debugging over Ethernet for
+VxWorks via the SUN RPC library. So there will be at least one starting point
+to implement remote debugging over Ethernet via SUN RPC. The Chorus remote debugging
+code has been disclosed under GPL and also contains code for debugging suing
+SUN RPC,
+
+@item [(R6)]:
+Due to a classical chicken and egg problems, the remote debugging daemon
+cannot be used to debug code it uses to function. Thus depending on the API
+used by RGDBSD, some parts of the target system will not be debuggable via GDB.
+The most important point is documentation because my feeling is that implementing
+RGDBSD on a totally different @emph{dedicated} nano kernel should be possible,
+
+@item [(R7)]:
+RTEMS core executive is a real-time OS which implements priority level
+scheduling, synchronization objects, and interrupt handling. As mentioned in
+previous item, we may not debug theses features if RGDBSD uses them. This requirement
+is thus very strong because it impose that :
+
+@enumerate
+
+@item RGDBSD is totally interrupt driven (no thread API available),
+
+@item But it does not use RTEMS interrupt management,
+
+@item Nor does not use RTEMS exception management,
+
+@item RGDBSD must provide its own UDP/IP stack as the current FreeBSD code rely on
+tasks switching and RTEMS provided synchronization object for input path handling,
+@end enumerate
+
+So our feeling is that the @b{(R7)} more or less requires to write a @emph{dedicated}
+nano kernel with a very small dedicated UDP/IP stack.
+
+
+@item [(R8)]:
+GDB remote debugging over Ethernet code communicates with the remote
+target via the SUN RPC protocol. This requires a UDP/IP protocol and a minimal
+socket like interface. In RTEMS environment, this feature is currently provided
+by the FreeBSD stack. Again, if we use the FreeBSD stack itself for remote communication,
+it will be impossible to debug this stack as a breakpoint in the stack code
+will stop its execution and there would be no more way to communicate with the
+target. A solution consists in implementing a minimal, dedicated UDP/IP stack
+(with at least IP and UDP protocols, a minimal BSD sockets) and a simple SUN
+RPC library, which will be both dedicated to the debug. We can use RTEMS API
+to implement it if @b{(R7)} is not required. As the two stack will need
+to share the same chip, a kind of shared filter must be implemented at the bottom
+of the two stacks so that Ethernet frames can be dynamically directed either
+to the dedicated UDP/IP debug stack or to the regular FreeBSD stack. The fact
+that in the current design, the low level ethernet input routine mainly signal
+a thread should facilitate the design of this filter. The output path is less
+complicated as it is run by a task and thus can sleep on a synchronization object,
+
+@item [(R9)]:
+This requirement represents what we find reasonable as a first target.
+However, we can still present to the final user this kind of debugging via different
+model. RTEMS can be represented as a single threaded system or, because RTEMS
+is a multitasking system, as an ensemble of separate tasks. In the first representation,
+the debugger sees only 1 ``task'' without distinguishing the core executive
+part from the applicative part. This is the simplest way to implement the debugger
+but also implies that there is no way to protect the core executive. Some of
+these tasks are system tasks (tasks form the core executive and from the FreeBSD
+stack), the other ones are tasks implemented by the developer. The developer
+wants to debug his tasks, and sometimes only one of his tasks. We can provide
+a way to debug not the entire system but only the concerned task by testing
+if the current running task is a debugged task (test on the task identifier).
+GDB offers an API to ``detach'' thread so that if a detached thread hits a
+breakpoint it is automatically restarted without user intervention,
+
+@item [(R10)]:
+Several developers can work on a large project, each on a specific
+module. Sometimes only one target is available for everyone. This requirements
+is not really meaningfull until RTEMS supports dynamic code loading,
+
+@item [(R11)]:
+This requirement heavily depends on the @b{(R7)} and @b{(R8)}
+requirements.
+@end table
+
+@section Requirements Selection
+
+
+@subsection Requirement We Will Take Into Account For the First Implementation
+
+@table @b
+
+@item [(R1)]:
+Obviously.
+
+@item [(R2)]:
+As these are our targets. Of course other will be free to contribute.
+We will however document the works that needs to be done in order to port the
+debug code to other processors,
+
+@item [(R3)]:
+We think it is feasible with only few RTEMS modifications,
+
+@item [(R5)]:
+We think serial line debugging is nowadays too restrictive as most equipment
+are now connected via Ethernet,
+
+@item [(R6)]:
+This is a documentation problem and should be fairly easy to describe
+once we have the RGDBSD code,
+
+@item [(R9)]:
+We will try to provide the multi-thread target system presentation,
+@end table
+
+@subsection Requirements We Will Not Implement
+
+@table @b
+
+@item [(R4)]:
+it will not be implemented for the moment. It is just a matter on implementing
+SLIP in the FreeBSD stack and alternative solutions already exist in the meantime,
+
+@item [(R7)]:
+To simplify the first developments, we don't plan to implement a @emph{dedicated}
+nano-kernel to allow the RTEMS kernel to be debugged. It means that, if any
+breakpoint is set in the kernel, unpredictable behaviors can occur. So, developers
+must keep in mind to avoid stopping the kernel. They must also keep in mind,
+in order to not stop the kernel, that the user's tasks must have a lower priority
+than the tasks used for debug. The solution is to use a specific very-high priority
+level for the system tasks used directly or indirectly by RGDBSD. The SYSTEM_TASK
+attribute that already exists should be fine.
+
+@item [(R8)]:
+To avoid increasing the code size and the used memory and because the
+FreeBSD stack doesn't need to be debug any more, we choose not to implement
+a minimal TCP/IP stack but rather to use the FreeBSD one as communication protocol,
+
+@item [(R10)]:
+We will see later when a file system will be available and we can implement
+@b{exec} system call,
+
+@item [(R11)]:
+Without a separate TCP/IP stack it will be hard to freeze the system
+as some interrupts must occur in order to enable the FreeBSD stack to function,
+@end table
+
+@section Implied Restrictions
+
+High priority level must be used for these features :
+
+@itemize @bullet
+
+@item FreeBSD interrupt handling thread,
+
+@item Debugger threads.
+@end itemize
+
+This will allows these tasks not to be stopped when a process is stopped
+in debug mode
+
+If we don't want to use a ``specific'' priority level, we must affect
+priority to each of these tasks as follow :
+
+@itemize @bullet
+
+@item FreeBSD stack (high priority)
+
+@item Debugger (less high priority)
+@end itemize
+
+The user must remember the higher priority level he can use for his
+software in order not to block one of the previous threads and to not put breakpoints
+in part of the code executed by RGDBSD.
+
+
diff --git a/doc/rgdb_specs/process.eps b/doc/rgdb_specs/process.eps
new file mode 100644
index 0000000000..14ebd297e9
--- /dev/null
+++ b/doc/rgdb_specs/process.eps
@@ -0,0 +1,672 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: process.eps
+%%Creator: fig2dev Version 3.2 Patchlevel 1
+%%CreationDate: Tue Nov 10 13:55:53 1998
+%%For: valette@tri-yann (Eric Valette,,6891,)
+%%Orientation: Portrait
+%%BoundingBox: 0 0 1245 646
+%%Pages: 0
+%%BeginSetup
+%%EndSetup
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+-19.0 647.0 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+ bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+ 4 -2 roll mul srgb} bind def
+/reencdict 12 dict def /ReEncode { reencdict begin
+/newcodesandnames exch def /newfontname exch def /basefontname exch def
+/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def
+basefontdict { exch dup /FID ne { dup /Encoding eq
+{ exch dup length array copy newfont 3 1 roll put }
+{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall
+newfont /FontName newfontname put newcodesandnames aload pop
+128 1 255 { newfont /Encoding get exch /.notdef put } for
+newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat
+newfontname newfont definefont pop end } def
+/isovec [
+8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde
+8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis
+8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron
+8#220 /dotlessi 8#230 /oe 8#231 /OE
+8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling
+8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis
+8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot
+8#255 /endash 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus
+8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph
+8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine
+8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf
+8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute
+8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring
+8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute
+8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute
+8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve
+8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply
+8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex
+8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave
+8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring
+8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute
+8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute
+8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve
+8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide
+8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex
+8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def
+/Times-Roman /Times-Roman-iso isovec ReEncode
+ /DrawEllipse {
+ /endangle exch def
+ /startangle exch def
+ /yrad exch def
+ /xrad exch def
+ /y exch def
+ /x exch def
+ /savematrix mtrx currentmatrix def
+ x y tr xrad yrad sc 0 0 1 startangle endangle arc
+ closepath
+ savematrix setmatrix
+ } def
+
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+%%EndProlog
+
+$F2psBegin
+10 setmiterlimit
+n -1000 11779 m -1000 -1000 l 22054 -1000 l 22054 11779 l cp clip
+ 0.06000 0.06000 sc
+/Times-Roman-iso ff 300.00 scf sf
+2250 600 m
+gs 1 -1 sc (INITIALIZATION) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 300.00 scf sf
+2250 825 m
+gs 1 -1 sc (TASK) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 300.00 scf sf
+6150 825 m
+gs 1 -1 sc (TASK) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 300.00 scf sf
+6150 600 m
+gs 1 -1 sc (COMMAND MANAGEMENT) dup sw pop 2 div neg 0 rm col0 sh gr
+7.500 slw
+% Ellipse
+n 10050 3600 1275 525 0 360 DrawEllipse gs col0 s gr
+
+/Times-Roman-iso ff 180.00 scf sf
+10050 3450 m
+gs 1 -1 sc (WAIT FOR) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+10050 3900 m
+gs 1 -1 sc (SEMAPHORE) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+10050 3675 m
+gs 1 -1 sc (WAKE-UP) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+5925 1950 m
+gs 1 -1 sc (WAIT FOR) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+5925 2175 m
+gs 1 -1 sc (RPC MESSAGE) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+5925 2400 m
+gs 1 -1 sc (FROM GDB) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+5925 3750 m
+gs 1 -1 sc (EXECUTE) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+5925 3975 m
+gs 1 -1 sc (RECEIVED) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+5925 4200 m
+gs 1 -1 sc (COMMAND) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+5925 9150 m
+gs 1 -1 sc (SEND) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+5925 9375 m
+gs 1 -1 sc (RESULT) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+5925 9600 m
+gs 1 -1 sc (IF NEEDED) dup sw pop 2 div neg 0 rm col0 sh gr
+% Ellipse
+n 5925 9300 1275 525 0 360 DrawEllipse gs col0 s gr
+
+% Polyline
+n 5925 9825 m 5925 9826 l 5925 9830 l 5926 9839 l 5926 9855 l 5928 9876 l
+ 5929 9899 l 5931 9923 l 5934 9946 l 5937 9967 l 5941 9987 l
+ 5945 10004 l 5950 10020 l 5956 10035 l 5963 10050 l 5969 10063 l
+ 5977 10076 l 5986 10089 l 5996 10103 l 6007 10117 l 6020 10132 l
+ 6033 10146 l 6048 10161 l 6063 10175 l 6080 10189 l 6097 10203 l
+ 6114 10216 l 6132 10228 l 6150 10240 l 6169 10252 l 6188 10263 l
+ 6203 10271 l 6220 10279 l 6237 10288 l 6255 10296 l 6274 10305 l
+ 6293 10313 l 6314 10321 l 6335 10329 l 6356 10337 l 6378 10345 l
+ 6401 10352 l 6423 10359 l 6445 10366 l 6467 10372 l 6488 10378 l
+ 6509 10383 l 6529 10388 l 6549 10392 l 6568 10396 l 6588 10400 l
+ 6606 10403 l 6625 10406 l 6644 10409 l 6664 10411 l 6684 10413 l
+ 6704 10415 l 6724 10416 l 6745 10417 l 6766 10418 l 6788 10418 l
+ 6809 10418 l 6830 10417 l 6851 10416 l 6871 10415 l 6891 10413 l
+ 6911 10411 l 6931 10409 l 6950 10406 l 6969 10403 l 6988 10400 l
+ 7007 10396 l 7026 10392 l 7046 10388 l 7066 10383 l 7087 10378 l
+ 7108 10372 l 7129 10366 l 7151 10359 l 7173 10352 l 7195 10345 l
+ 7216 10337 l 7237 10329 l 7258 10321 l 7277 10313 l 7296 10305 l
+ 7313 10296 l 7330 10288 l 7346 10279 l 7361 10271 l 7375 10263 l
+ 7392 10252 l 7408 10240 l 7423 10228 l 7438 10216 l 7452 10203 l
+ 7465 10189 l 7478 10175 l 7490 10161 l 7501 10146 l 7510 10132 l
+ 7519 10117 l 7527 10103 l 7534 10089 l 7540 10076 l 7545 10063 l
+ 7550 10050 l 7555 10035 l 7558 10020 l 7562 10004 l 7565 9987 l
+ 7567 9967 l 7569 9946 l 7571 9923 l 7572 9899 l 7573 9876 l
+ 7574 9855 l 7575 9839 l 7575 9830 l 7575 9826 l 7575 9825 l gs col0 s gr
+/Times-Roman-iso ff 180.00 scf sf
+2250 8025 m
+gs 1 -1 sc (DELETE) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+2250 8250 m
+gs 1 -1 sc (INITIALIZATION) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+2250 8475 m
+gs 1 -1 sc (TASK) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+2250 6525 m
+gs 1 -1 sc (COMMAND MANAGEMENT) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+2250 6300 m
+gs 1 -1 sc (CREATE SEPARATE TASK) dup sw pop 2 div neg 0 rm col0 sh gr
+% Ellipse
+n 2250 6375 1275 525 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 2250 8175 1275 525 0 360 DrawEllipse gs col0 s gr
+
+% Polyline
+gs clippath
+2280 5730 m 2250 5850 l 2220 5730 l 2220 5865 l 2280 5865 l cp
+clip
+n 2250 5100 m 2250 5850 l gs col0 s gr gr
+
+% arrowhead
+n 2280 5730 m 2250 5850 l 2220 5730 l col0 s
+% Polyline
+gs clippath
+2280 7530 m 2250 7650 l 2220 7530 l 2220 7665 l 2280 7665 l cp
+clip
+n 2250 6900 m 2250 7650 l gs col0 s gr gr
+
+% arrowhead
+n 2280 7530 m 2250 7650 l 2220 7530 l col0 s
+% Ellipse
+n 2250 2775 1275 525 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 2250 4575 1275 525 0 360 DrawEllipse gs col0 s gr
+
+% Polyline
+gs clippath
+2280 3930 m 2250 4050 l 2220 3930 l 2220 4065 l 2280 4065 l cp
+clip
+n 2250 3300 m 2250 4050 l gs col0 s gr gr
+
+% arrowhead
+n 2280 3930 m 2250 4050 l 2220 3930 l col0 s
+/Times-Roman-iso ff 180.00 scf sf
+2250 2850 m
+gs 1 -1 sc (INITIALIZATION) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+2250 4425 m
+gs 1 -1 sc (CONNECT) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+2250 4875 m
+gs 1 -1 sc (HANDLER) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+2250 4650 m
+gs 1 -1 sc (EXCEPTION) dup sw pop 2 div neg 0 rm col0 sh gr
+% Ellipse
+n 10050 5400 1275 525 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 5925 2100 1275 525 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 5925 3900 1275 525 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 5943 5681 1275 525 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 5925 7500 1275 525 0 360 DrawEllipse gs col0 s gr
+
+% Polyline
+60.000 slw
+n 600 75 m 375 75 375 10500 225 arcto 4 {pop} repeat
+ 375 10725 12600 10725 225 arcto 4 {pop} repeat
+ 12825 10725 12825 300 225 arcto 4 {pop} repeat
+ 12825 75 600 75 225 arcto 4 {pop} repeat
+ cp gs col0 s gr
+% Polyline
+7.500 slw
+n 11700 3075 m 11700 5925 l gs col0 s gr
+% Polyline
+gs clippath
+10080 4755 m 10050 4875 l 10020 4755 l 10020 4890 l 10080 4890 l cp
+clip
+n 10050 4125 m 10050 4875 l gs col0 s gr gr
+
+% arrowhead
+n 10080 4755 m 10050 4875 l 10020 4755 l col0 s
+% Polyline
+gs clippath
+5955 3255 m 5925 3375 l 5895 3255 l 5895 3390 l 5955 3390 l cp
+clip
+n 5925 2625 m 5925 3375 l gs col0 s gr gr
+
+% arrowhead
+n 5955 3255 m 5925 3375 l 5895 3255 l col0 s
+% Polyline
+gs clippath
+5955 5055 m 5925 5175 l 5895 5055 l 5895 5190 l 5955 5190 l cp
+clip
+n 5925 4425 m 5925 5175 l gs col0 s gr gr
+
+% arrowhead
+n 5955 5055 m 5925 5175 l 5895 5055 l col0 s
+% Polyline
+n 7575 1500 m 7575 9900 l gs col0 s gr
+% Polyline
+gs clippath
+5955 6855 m 5925 6975 l 5895 6855 l 5895 6990 l 5955 6990 l cp
+clip
+n 5925 6225 m 5925 6975 l gs col0 s gr gr
+
+% arrowhead
+n 5955 6855 m 5925 6975 l 5895 6855 l col0 s
+% Polyline
+gs clippath
+5955 8655 m 5925 8775 l 5895 8655 l 5895 8790 l 5955 8790 l cp
+clip
+n 5925 8025 m 5925 8775 l gs col0 s gr gr
+
+% arrowhead
+n 5955 8655 m 5925 8775 l 5895 8655 l col0 s
+% Polyline
+45.000 slw
+n 4050 375 m 4050 10350 l gs col0 s gr
+% Polyline
+n 8175 375 m 8175 10425 l gs col0 s gr
+% Polyline
+30.000 slw
+ [60] 0 sd
+gs clippath
+4526 2104 m 4650 2100 l 4543 2162 l 4702 2116 l 4685 2059 l cp
+clip
+n 3525 6375 m 3526 6375 l 3528 6374 l 3531 6372 l 3537 6370 l 3544 6366 l
+ 3554 6361 l 3566 6354 l 3580 6345 l 3596 6334 l 3612 6322 l
+ 3630 6307 l 3648 6291 l 3666 6272 l 3684 6252 l 3702 6230 l
+ 3719 6207 l 3735 6181 l 3750 6153 l 3765 6124 l 3778 6092 l
+ 3791 6057 l 3804 6020 l 3815 5980 l 3826 5937 l 3837 5890 l
+ 3847 5839 l 3856 5785 l 3866 5726 l 3875 5663 l 3880 5624 l
+ 3885 5584 l 3891 5543 l 3896 5500 l 3901 5456 l 3906 5410 l
+ 3911 5363 l 3917 5314 l 3922 5264 l 3927 5213 l 3932 5160 l
+ 3938 5105 l 3943 5049 l 3948 4992 l 3954 4934 l 3959 4875 l
+ 3965 4814 l 3970 4753 l 3976 4690 l 3981 4627 l 3987 4563 l
+ 3993 4499 l 3999 4434 l 4004 4369 l 4010 4303 l 4016 4237 l
+ 4022 4172 l 4028 4106 l 4034 4041 l 4040 3976 l 4046 3912 l
+ 4052 3848 l 4058 3785 l 4064 3722 l 4070 3661 l 4076 3600 l
+ 4082 3541 l 4088 3483 l 4094 3426 l 4100 3370 l 4106 3315 l
+ 4112 3262 l 4118 3211 l 4124 3161 l 4130 3112 l 4137 3065 l
+ 4143 3019 l 4149 2975 l 4156 2932 l 4162 2891 l 4168 2851 l
+ 4175 2813 l 4186 2753 l 4197 2698 l 4209 2646 l 4221 2597 l
+ 4233 2553 l 4247 2511 l 4261 2472 l 4276 2436 l 4291 2403 l
+ 4308 2371 l 4326 2342 l 4345 2315 l 4365 2289 l 4385 2265 l
+ 4407 2243 l 4430 2223 l 4453 2204 l 4476 2187 l 4500 2171 l
+ 4523 2157 l 4545 2145 l 4566 2134 l 4585 2125 l 4601 2118 l
+ 4616 2112 l 4627 2107 l 4636 2104 l 4650 2100 l gs col4 s gr gr
+ [] 0 sd
+% arrowhead
+7.500 slw
+n 4526 2104 m 4650 2100 l 4543 2162 l col4 s
+% Polyline
+30.000 slw
+ [60] 0 sd
+gs clippath
+8652 3585 m 8775 3600 l 8659 3644 l 8823 3624 l 8816 3565 l cp
+clip
+n 7200 5700 m 7202 5700 l 7206 5699 l 7214 5698 l 7225 5697 l 7242 5695 l
+ 7262 5691 l 7287 5687 l 7315 5682 l 7346 5676 l 7379 5668 l
+ 7413 5660 l 7447 5650 l 7481 5640 l 7514 5628 l 7545 5616 l
+ 7575 5602 l 7603 5587 l 7629 5571 l 7654 5554 l 7676 5535 l
+ 7697 5515 l 7717 5492 l 7736 5468 l 7753 5442 l 7769 5414 l
+ 7785 5383 l 7800 5350 l 7811 5324 l 7821 5297 l 7832 5268 l
+ 7842 5238 l 7852 5207 l 7862 5174 l 7871 5140 l 7881 5104 l
+ 7891 5068 l 7901 5030 l 7910 4991 l 7920 4951 l 7930 4910 l
+ 7939 4868 l 7949 4825 l 7959 4782 l 7968 4738 l 7978 4694 l
+ 7987 4650 l 7997 4606 l 8007 4562 l 8016 4518 l 8026 4475 l
+ 8036 4432 l 8045 4390 l 8055 4349 l 8065 4309 l 8074 4270 l
+ 8084 4232 l 8094 4196 l 8104 4160 l 8113 4126 l 8123 4093 l
+ 8133 4062 l 8143 4032 l 8154 4003 l 8164 3976 l 8175 3950 l
+ 8190 3917 l 8206 3886 l 8222 3858 l 8239 3832 l 8258 3808 l
+ 8278 3785 l 8299 3765 l 8321 3746 l 8346 3729 l 8372 3713 l
+ 8400 3698 l 8430 3684 l 8461 3672 l 8494 3660 l 8528 3650 l
+ 8562 3640 l 8596 3632 l 8629 3624 l 8660 3618 l 8688 3613 l
+ 8713 3609 l 8733 3605 l 8750 3603 l 8775 3600 l gs col4 s gr gr
+ [] 0 sd
+% arrowhead
+7.500 slw
+n 8652 3585 m 8775 3600 l 8659 3644 l col4 s
+% Polyline
+gs clippath
+10084 2956 m 10050 3075 l 10024 2954 l 10020 3089 l 10079 3091 l cp
+clip
+n 10050 3075 m 10051 3045 l 10053 3024 l 10054 3001 l 10056 2977 l 10059 2954 l
+ 10062 2933 l 10066 2913 l 10070 2896 l 10075 2880 l 10081 2865 l
+ 10088 2850 l 10094 2837 l 10102 2824 l 10111 2811 l 10121 2797 l
+ 10132 2783 l 10145 2768 l 10158 2754 l 10173 2739 l 10188 2725 l
+ 10205 2711 l 10222 2697 l 10239 2684 l 10257 2672 l 10275 2660 l
+ 10294 2648 l 10313 2638 l 10328 2629 l 10345 2621 l 10362 2612 l
+ 10380 2604 l 10399 2595 l 10418 2587 l 10439 2579 l 10460 2571 l
+ 10481 2563 l 10503 2555 l 10526 2548 l 10548 2541 l 10570 2534 l
+ 10592 2528 l 10613 2522 l 10634 2517 l 10654 2512 l 10674 2508 l
+ 10693 2504 l 10713 2500 l 10731 2497 l 10750 2494 l 10769 2491 l
+ 10789 2489 l 10809 2487 l 10829 2485 l 10849 2484 l 10870 2483 l
+ 10891 2482 l 10913 2482 l 10934 2482 l 10955 2483 l 10976 2484 l
+ 10996 2485 l 11016 2487 l 11036 2489 l 11056 2491 l 11075 2494 l
+ 11094 2497 l 11113 2500 l 11132 2504 l 11151 2508 l 11171 2512 l
+ 11191 2517 l 11212 2522 l 11233 2528 l 11254 2534 l 11276 2541 l
+ 11298 2548 l 11320 2555 l 11341 2563 l 11362 2571 l 11383 2579 l
+ 11402 2587 l 11421 2595 l 11438 2604 l 11455 2612 l 11471 2621 l
+ 11486 2629 l 11500 2638 l 11517 2648 l 11533 2660 l 11548 2672 l
+ 11563 2684 l 11577 2697 l 11590 2711 l 11603 2725 l 11615 2739 l
+ 11626 2754 l 11635 2768 l 11644 2783 l 11652 2797 l 11659 2811 l
+ 11665 2824 l 11670 2837 l 11675 2850 l 11680 2865 l 11683 2880 l
+ 11687 2896 l 11690 2913 l 11692 2933 l 11694 2954 l 11696 2977 l
+ 11697 3001 l 11698 3024 l 11699 3045 l 11700 3061 l 11700 3070 l
+ 11700 3074 l 11700 3075 l gs col0 s gr gr
+
+% arrowhead
+n 10084 2956 m 10050 3075 l 10024 2954 l col0 s
+% Polyline
+n 10050 5925 m 10050 5926 l 10050 5930 l 10051 5939 l 10051 5955 l 10053 5976 l
+ 10054 5999 l 10056 6023 l 10059 6046 l 10062 6067 l 10066 6087 l
+ 10070 6104 l 10075 6120 l 10081 6135 l 10088 6150 l 10094 6163 l
+ 10102 6176 l 10111 6189 l 10121 6203 l 10132 6217 l 10145 6232 l
+ 10158 6246 l 10173 6261 l 10188 6275 l 10205 6289 l 10222 6303 l
+ 10239 6316 l 10257 6328 l 10275 6340 l 10294 6352 l 10313 6363 l
+ 10328 6371 l 10345 6379 l 10362 6388 l 10380 6396 l 10399 6405 l
+ 10418 6413 l 10439 6421 l 10460 6429 l 10481 6437 l 10503 6445 l
+ 10526 6452 l 10548 6459 l 10570 6466 l 10592 6472 l 10613 6478 l
+ 10634 6483 l 10654 6488 l 10674 6492 l 10693 6496 l 10713 6500 l
+ 10731 6503 l 10750 6506 l 10769 6509 l 10789 6511 l 10809 6513 l
+ 10829 6515 l 10849 6516 l 10870 6517 l 10891 6518 l 10913 6518 l
+ 10934 6518 l 10955 6517 l 10976 6516 l 10996 6515 l 11016 6513 l
+ 11036 6511 l 11056 6509 l 11075 6506 l 11094 6503 l 11113 6500 l
+ 11132 6496 l 11151 6492 l 11171 6488 l 11191 6483 l 11212 6478 l
+ 11233 6472 l 11254 6466 l 11276 6459 l 11298 6452 l 11320 6445 l
+ 11341 6437 l 11362 6429 l 11383 6421 l 11402 6413 l 11421 6405 l
+ 11438 6396 l 11455 6388 l 11471 6379 l 11486 6371 l 11500 6363 l
+ 11517 6352 l 11533 6340 l 11548 6328 l 11563 6316 l 11577 6303 l
+ 11590 6289 l 11603 6275 l 11615 6261 l 11626 6246 l 11635 6232 l
+ 11644 6217 l 11652 6203 l 11659 6189 l 11665 6176 l 11670 6163 l
+ 11675 6150 l 11680 6135 l 11683 6120 l 11687 6104 l 11690 6087 l
+ 11692 6067 l 11694 6046 l 11696 6023 l 11697 5999 l 11698 5976 l
+ 11699 5955 l 11700 5939 l 11700 5930 l 11700 5926 l 11700 5925 l gs col0 s gr
+% Polyline
+gs clippath
+5959 1456 m 5925 1575 l 5899 1454 l 5895 1589 l 5954 1591 l cp
+clip
+n 5925 1575 m 5926 1545 l 5928 1524 l 5929 1501 l 5931 1477 l 5934 1454 l
+ 5937 1433 l 5941 1413 l 5945 1396 l 5950 1380 l 5956 1365 l
+ 5963 1350 l 5969 1337 l 5977 1324 l 5986 1311 l 5996 1297 l
+ 6007 1283 l 6020 1268 l 6033 1254 l 6048 1239 l 6063 1225 l
+ 6080 1211 l 6097 1197 l 6114 1184 l 6132 1172 l 6150 1160 l
+ 6169 1148 l 6188 1138 l 6203 1129 l 6220 1121 l 6237 1112 l
+ 6255 1104 l 6274 1095 l 6293 1087 l 6314 1079 l 6335 1071 l
+ 6356 1063 l 6378 1055 l 6401 1048 l 6423 1041 l 6445 1034 l
+ 6467 1028 l 6488 1022 l 6509 1017 l 6529 1012 l 6549 1008 l
+ 6568 1004 l 6588 1000 l 6606 997 l 6625 994 l 6644 991 l
+ 6664 989 l 6684 987 l 6704 985 l 6724 984 l 6745 983 l
+ 6766 982 l 6788 982 l 6809 982 l 6830 983 l 6851 984 l
+ 6871 985 l 6891 987 l 6911 989 l 6931 991 l 6950 994 l
+ 6969 997 l 6988 1000 l 7007 1004 l 7026 1008 l 7046 1012 l
+ 7066 1017 l 7087 1022 l 7108 1028 l 7129 1034 l 7151 1041 l
+ 7173 1048 l 7195 1055 l 7216 1063 l 7237 1071 l 7258 1079 l
+ 7277 1087 l 7296 1095 l 7313 1104 l 7330 1112 l 7346 1121 l
+ 7361 1129 l 7375 1138 l 7392 1148 l 7408 1160 l 7423 1172 l
+ 7438 1184 l 7452 1197 l 7465 1211 l 7478 1225 l 7490 1239 l
+ 7501 1254 l 7510 1268 l 7519 1283 l 7527 1297 l 7534 1311 l
+ 7540 1324 l 7545 1337 l 7550 1350 l 7555 1365 l 7558 1380 l
+ 7562 1396 l 7565 1413 l 7567 1433 l 7569 1454 l 7571 1477 l
+ 7572 1501 l 7573 1524 l 7574 1545 l 7575 1561 l 7575 1570 l
+ 7575 1574 l 7575 1575 l gs col0 s gr gr
+
+% arrowhead
+n 5959 1456 m 5925 1575 l 5899 1454 l col0 s
+/Times-Roman-iso ff 300.00 scf sf
+10575 825 m
+gs 1 -1 sc (TASK) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 300.00 scf sf
+10575 600 m
+gs 1 -1 sc (EVENT MANAGEMENT) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+5025 6000 m
+gs 1 -1 sc (MANAGEMENT TASK) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+5250 5775 m
+gs 1 -1 sc (CREATE EVENT) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+4950 5550 m
+gs 1 -1 sc (IF ATTACH COMMAND) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+5925 7575 m
+gs 1 -1 sc (RELEASE SERIALIZE AND) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+5925 7350 m
+gs 1 -1 sc (IF CONTINUE COMMAND) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+5925 7800 m
+gs 1 -1 sc (CONTINUE SEMAPHORES) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+10050 5250 m
+gs 1 -1 sc (NOTIFY THE) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+10050 5475 m
+gs 1 -1 sc (DEBUGGEE CHANGES) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+10050 5700 m
+gs 1 -1 sc (TO GDB) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 300.00 scf sf
+6975 8175 m
+gs 1 -1 sc (\(1\)->) dup sw pop 2 div neg 0 rm col13 sh gr
+/Times-Roman-iso ff 300.00 scf sf
+11025 4275 m
+gs 1 -1 sc (\(2\)<-) dup sw pop 2 div neg 0 rm col1 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+18525 2775 m
+gs 1 -1 sc (WAIT FOR) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+18525 3000 m
+gs 1 -1 sc (SERIALIZE) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+18525 3225 m
+gs 1 -1 sc (SEMAPHORE) dup sw pop 2 div neg 0 rm col0 sh gr
+% Ellipse
+n 18525 2925 1275 525 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 18525 6450 1275 525 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 18525 8250 1275 525 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 18533 9976 1275 525 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 18511 4735 1275 525 0 360 DrawEllipse gs col0 s gr
+
+% Polyline
+gs clippath
+18597 2300 m 18525 2400 l 18542 2277 l 18492 2403 l 18547 2425 l cp
+clip
+n 18525 2400 m 18675 2025 l 18375 2025 l 18525 1650 l gs col0 s gr gr
+
+% arrowhead
+n 18597 2300 m 18525 2400 l 18542 2277 l col0 s
+% Polyline
+gs clippath
+18555 4080 m 18525 4200 l 18495 4080 l 18495 4215 l 18555 4215 l cp
+clip
+n 18525 3450 m 18525 4200 l gs col0 s gr gr
+
+% arrowhead
+n 18555 4080 m 18525 4200 l 18495 4080 l col0 s
+% Polyline
+gs clippath
+18555 7605 m 18525 7725 l 18495 7605 l 18495 7740 l 18555 7740 l cp
+clip
+n 18525 6975 m 18525 7725 l gs col0 s gr gr
+
+% arrowhead
+n 18555 7605 m 18525 7725 l 18495 7605 l col0 s
+% Polyline
+gs clippath
+18555 9330 m 18525 9450 l 18495 9330 l 18495 9465 l 18555 9465 l cp
+clip
+n 18525 8775 m 18525 9450 l gs col0 s gr gr
+
+% arrowhead
+n 18555 9330 m 18525 9450 l 18495 9330 l col0 s
+% Polyline
+gs clippath
+18555 5805 m 18525 5925 l 18495 5805 l 18495 5940 l 18555 5940 l cp
+clip
+n 18525 5250 m 18525 5925 l gs col0 s gr gr
+
+% arrowhead
+n 18555 5805 m 18525 5925 l 18495 5805 l col0 s
+/Times-Roman-iso ff 300.00 scf sf
+18450 600 m
+gs 1 -1 sc ( DEBUG AND BREAKPOINT) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 300.00 scf sf
+18450 825 m
+gs 1 -1 sc (EXCEPTION HANDLER) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+18525 6900 m
+gs 1 -1 sc (SEMAPHORE) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+18525 6450 m
+gs 1 -1 sc (OR BREAKPOINT EXCEP,) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+18525 6225 m
+gs 1 -1 sc (IF SINGLE STEP) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+18525 6675 m
+gs 1 -1 sc (RELEASE WAKE-UP) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+18525 8100 m
+gs 1 -1 sc (WAIT FOR) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+18525 8550 m
+gs 1 -1 sc (SEMAPHORE) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+18525 8325 m
+gs 1 -1 sc (CONTINUE) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+17700 1425 m
+gs 1 -1 sc (RECEIVE EXCEPTION) col0 sh gr
+/Times-Roman-iso ff 300.00 scf sf
+17250 8850 m
+gs 1 -1 sc (->\(1\)) dup sw pop 2 div neg 0 rm col13 sh gr
+/Times-Roman-iso ff 300.00 scf sf
+17175 6975 m
+gs 1 -1 sc (<-\(2\)) dup sw pop 2 div neg 0 rm col1 sh gr
+/Times-Roman-iso ff 300.00 scf sf
+17250 3525 m
+gs 1 -1 sc (->\(1\)) dup sw pop 2 div neg 0 rm col13 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+18525 10275 m
+gs 1 -1 sc (RETURN OF EXCEPTION) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+18525 10050 m
+gs 1 -1 sc (AND) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+18525 9825 m
+gs 1 -1 sc (RESTORE CONTEXT) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+18075 4950 m
+gs 1 -1 sc (CONTEXT) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+17700 4725 m
+gs 1 -1 sc (SAVE EXCEPTION ) col0 sh gr
+% Polyline
+60.000 slw
+n 16275 75 m 16050 75 16050 10500 225 arcto 4 {pop} repeat
+ 16050 10725 20775 10725 225 arcto 4 {pop} repeat
+ 21000 10725 21000 300 225 arcto 4 {pop} repeat
+ 21000 75 16275 75 225 arcto 4 {pop} repeat
+ cp gs col0 s gr
+$F2psEnd
+rs
diff --git a/doc/rgdb_specs/process.jpg b/doc/rgdb_specs/process.jpg
new file mode 100644
index 0000000000..ee14024a6d
--- /dev/null
+++ b/doc/rgdb_specs/process.jpg
Binary files differ
diff --git a/doc/rgdb_specs/revision.t b/doc/rgdb_specs/revision.t
new file mode 100644
index 0000000000..9751d77784
--- /dev/null
+++ b/doc/rgdb_specs/revision.t
@@ -0,0 +1,42 @@
+@c
+@c RTEMS Remote Debugger Server Specifications
+@c
+@c Written by: Eric Valette <valette@crf.canon.fr>
+@c Emmanuel Raguet <raguet@crf.canon.fr>
+@c
+@c
+@c $Id$
+@c
+
+@chapter Document Revision History
+
+@b{Current release} :
+
+@itemize @bullet
+@item Current applicable release is 2.0.
+@end itemize
+
+@b{Existing releases} :
+
+@itemize @bullet
+@item 0.1 : Released the 29/09/98. First draft of this document.
+
+@item 0.2 : Released the 05/10/98. Second draft version.
+
+@item 1.0 : Released the 08/10/98. Version Approved internally.
+
+@item 1.1 : Released the 13/13/98. Version Distributed for comments.
+
+@item 2.0 : Released the 01/11/98. Version including modifications related
+to comments we have got from the RTEMS mailing list. It also contains a
+more precise description of RGDBSD as we now have a first prototype,
+
+@end itemize
+
+@b{Planned releases} :
+
+@itemize @bullet
+@item 2.1 Final specification release intended to include a second round
+of comments,
+@end itemize
+
diff --git a/doc/rgdb_specs/rgdb_specs.texi b/doc/rgdb_specs/rgdb_specs.texi
new file mode 100644
index 0000000000..d9427556e2
--- /dev/null
+++ b/doc/rgdb_specs/rgdb_specs.texi
@@ -0,0 +1,109 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename rgdb_specs.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the Getting Started (C) Guide
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS On-Line Manual
+@direntry
+* RTEMS Remote Debugger Server Specifications: (rgdb_specs).
+@end direntry
+@end ifset
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage RTEMS Remote Debugger Server Specifications
+
+@setchapternewpage odd
+@settitle RTEMS Remote Debugger Server Specifications
+@titlepage
+@finalout
+
+@title RTEMS Remote Debugger Server Specifications
+@subtitle Edition @value{EDITION}, for @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author Emmanuel Raguet and Eric Valette, Canon Research Centre
+@author On-Line Applications Research Corporation
+@page
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include intro.texi
+@include revision.texi
+@include objectives.texi
+@include gdbinternals.texi
+@include interfacing.texi
+@include comm.texi
+@include daemon.texi
+@include conclusion.texi
+
+@ifinfo
+@node Top, Introduction, (dir), (dir)
+@top rgdb_specs
+
+This is the online version of the RTEMS Remote Debugger Server Specifications.
+
+@menu
+* Introduction::
+* Document Revision History::
+* Objectives::
+* A Rapid Tour of GDB Internals::
+* Interfacing GDB with RTEMS as a Target::
+* Communication with GDB::
+* RTEMS Debugger Server Daemon::
+* Conclusion::
+@end menu
+
+@c * Command and Variable Index::
+@c * Concept Index::
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@c @node Command and Variable Index, Concept Index, Installing GCC AND NEWLIB, Top
+@c @unnumbered Command and Variable Index
+
+@c There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@c @node Concept Index, , Command and Variable Index, Top
+@c @unnumbered Concept Index
+
+@c There are currently no Concept Index entries.
+@c @printindex cp
+
+@contents
+@bye
+
diff --git a/doc/rgdb_specs/seqbreak.eps b/doc/rgdb_specs/seqbreak.eps
new file mode 100644
index 0000000000..ef3cdb69cc
--- /dev/null
+++ b/doc/rgdb_specs/seqbreak.eps
@@ -0,0 +1,311 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: seq_break.eps
+%%Creator: fig2dev Version 3.2 Patchlevel 1
+%%CreationDate: Tue Oct 13 14:00:22 1998
+%%For: valette@tri-yann (Eric Valette,,6891,)
+%%Orientation: Portrait
+%%BoundingBox: 0 0 522 1067
+%%Pages: 0
+%%BeginSetup
+%%EndSetup
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+-40.0 1136.0 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+ bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+ 4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+%%EndProlog
+
+$F2psBegin
+10 setmiterlimit
+n -1000 19922 m -1000 -1000 l 10365 -1000 l 10365 19922 l cp clip
+ 0.06000 0.06000 sc
+/Times-Roman ff 300.00 scf sf
+7050 1350 m
+gs 1 -1 sc (TARGET) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+6825 1650 m
+gs 1 -1 sc (DEPENDENT) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+7275 1950 m
+gs 1 -1 sc (PART) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+975 1725 m
+gs 1 -1 sc (INDEPENDENT) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+1500 2025 m
+gs 1 -1 sc (PART) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+1350 1425 m
+gs 1 -1 sc (TARGET) col0 sh gr
+% Polyline
+15.000 slw
+n 6000 2400 m 6000 18900 l gs col0 s gr
+% Polyline
+n 3600 2400 m 3600 18900 l gs col0 s gr
+% Polyline
+7.500 slw
+gs clippath
+5857 14614 m 5996 14662 l 5849 14674 l 6007 14694 l 6015 14634 l cp
+clip
+n 3596 14362 m 5996 14662 l gs col0 s gr gr
+
+% arrowhead
+n 5857 14614 m 5996 14662 l 5849 14674 l 5877 14647 l 5857 14614 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+5855 16198 m 5994 16246 l 5847 16258 l 6005 16278 l 6013 16218 l cp
+clip
+n 3594 15946 m 5994 16246 l gs col0 s gr gr
+
+% arrowhead
+n 5855 16198 m 5994 16246 l 5847 16258 l 5875 16231 l 5855 16198 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+5853 16742 m 5992 16790 l 5845 16802 l 6003 16822 l 6011 16762 l cp
+clip
+n 3592 16490 m 5992 16790 l gs col0 s gr gr
+
+% arrowhead
+n 5853 16742 m 5992 16790 l 5845 16802 l 5873 16775 l 5853 16742 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+5857 10639 m 5996 10687 l 5849 10699 l 6007 10719 l 6015 10659 l cp
+clip
+n 3596 10387 m 5996 10687 l gs col0 s gr gr
+
+% arrowhead
+n 5857 10639 m 5996 10687 l 5849 10699 l 5877 10672 l 5857 10639 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+5867 11156 m 6006 11204 l 5859 11216 l 6017 11236 l 6025 11176 l cp
+clip
+n 3606 10904 m 6006 11204 l gs col0 s gr gr
+
+% arrowhead
+n 5867 11156 m 6006 11204 l 5859 11216 l 5887 11189 l 5867 11156 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+3746 11590 m 3599 11578 l 3738 11530 l 3580 11550 l 3588 11610 l cp
+clip
+n 5999 11278 m 3599 11578 l gs col0 s gr gr
+
+% arrowhead
+n 3746 11590 m 3599 11578 l 3738 11530 l 3718 11563 l 3746 11590 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+5855 7873 m 5994 7921 l 5847 7933 l 6005 7953 l 6013 7893 l cp
+clip
+n 3594 7621 m 5994 7921 l gs col0 s gr gr
+
+% arrowhead
+n 5855 7873 m 5994 7921 l 5847 7933 l 5875 7906 l 5855 7873 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+5853 8417 m 5992 8465 l 5845 8477 l 6003 8497 l 6011 8437 l cp
+clip
+n 3592 8165 m 5992 8465 l gs col0 s gr gr
+
+% arrowhead
+n 5853 8417 m 5992 8465 l 5845 8477 l 5873 8450 l 5853 8417 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+30.000 slw
+n 750 5625 m 9150 5625 l gs col0 s gr
+% Polyline
+n 825 12525 m 9225 12525 l gs col0 s gr
+% Polyline
+7.500 slw
+gs clippath
+5860 4386 m 5999 4434 l 5852 4446 l 6010 4466 l 6018 4406 l cp
+clip
+n 3599 4134 m 5999 4434 l gs col0 s gr gr
+
+% arrowhead
+n 5860 4386 m 5999 4434 l 5852 4446 l 5880 4419 l 5860 4386 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+3743 4813 m 3596 4801 l 3735 4753 l 3577 4773 l 3585 4833 l cp
+clip
+n 5996 4501 m 3596 4801 l gs col0 s gr gr
+
+% arrowhead
+n 3743 4813 m 3596 4801 l 3735 4753 l 3715 4786 l 3743 4813 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+3741 9894 m 3594 9882 l 3733 9834 l 3575 9854 l 3583 9914 l cp
+clip
+n 5994 9582 m 3594 9882 l gs col0 s gr gr
+
+% arrowhead
+n 3741 9894 m 3594 9882 l 3733 9834 l 3713 9867 l 3741 9894 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+3741 15519 m 3594 15507 l 3733 15459 l 3575 15479 l 3583 15539 l cp
+clip
+n 5994 15207 m 3594 15507 l gs col0 s gr gr
+
+% arrowhead
+n 3741 15519 m 3594 15507 l 3733 15459 l 3713 15492 l 3741 15519 l cp gs 0.00 setgray ef gr col0 s
+/Times-Roman ff 300.00 scf sf
+3525 14775 m
+gs 1 -1 sc (Wait for event...) dup sw pop neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+6075 15300 m
+gs 1 -1 sc (Notify a child change) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+8475 15600 m
+gs 1 -1 sc (Wait for command ...) dup sw pop neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+6075 15000 m
+gs 1 -1 sc (Debug Exception handler) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+3450 16950 m
+gs 1 -1 sc (Wait for event...) dup sw pop neg 0 rm col0 sh gr
+/Times-Bold ff 300.00 scf sf
+3150 6525 m
+gs 1 -1 sc (Continue process : first time) col0 sh gr
+/Times-Bold ff 300.00 scf sf
+5700 2925 m
+gs 1 -1 sc (Set Breakpoint) dup sw pop neg 0 rm col0 sh gr
+/Times-Bold ff 300.00 scf sf
+2925 13425 m
+gs 1 -1 sc (Continue process : next times) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+6150 9675 m
+gs 1 -1 sc (Notify a child change) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+8550 9975 m
+gs 1 -1 sc (Wait for command ...) dup sw pop neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+3525 11025 m
+gs 1 -1 sc (Ask information) dup sw pop neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+6150 11325 m
+gs 1 -1 sc (Give information) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+3450 11625 m
+gs 1 -1 sc (...) dup sw pop neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+3450 8250 m
+gs 1 -1 sc (Resume process) dup sw pop neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+3450 8625 m
+gs 1 -1 sc (Wait for event...) dup sw pop neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+2250 10650 m
+gs 1 -1 sc (at address) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+6150 9375 m
+gs 1 -1 sc (Breakpoint Except. handler) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+4800 1650 m
+gs 1 -1 sc (message exchange) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+3450 4800 m
+gs 1 -1 sc (...) dup sw pop neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+3450 4200 m
+gs 1 -1 sc (Ask opcode at address) dup sw pop neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+6150 4575 m
+gs 1 -1 sc (Send opcode ) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+675 7650 m
+gs 1 -1 sc (Write "DEBUG" opcode) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+8025 9075 m
+gs 1 -1 sc (DEBUG opcode) dup sw pop neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+900 10425 m
+gs 1 -1 sc (Write previous opcode) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+2400 7875 m
+gs 1 -1 sc (at address) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+750 15900 m
+gs 1 -1 sc (Write "DEBUG" opcode) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+2400 16125 m
+gs 1 -1 sc (at address) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+3450 14475 m
+gs 1 -1 sc (Single Step command) dup sw pop neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+3450 16575 m
+gs 1 -1 sc (Continue command) dup sw pop neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+6150 16950 m
+gs 1 -1 sc (Resume process) col0 sh gr
+$F2psEnd
+rs
diff --git a/doc/rgdb_specs/seqbreak.jpg b/doc/rgdb_specs/seqbreak.jpg
new file mode 100644
index 0000000000..2d31d9796d
--- /dev/null
+++ b/doc/rgdb_specs/seqbreak.jpg
Binary files differ
diff --git a/doc/rgdb_specs/seqdetach.eps b/doc/rgdb_specs/seqdetach.eps
new file mode 100644
index 0000000000..2a143977da
--- /dev/null
+++ b/doc/rgdb_specs/seqdetach.eps
@@ -0,0 +1,167 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: seq_detach.eps
+%%Creator: fig2dev Version 3.2 Patchlevel 1
+%%CreationDate: Tue Oct 13 14:00:31 1998
+%%For: valette@tri-yann (Eric Valette,,6891,)
+%%Orientation: Portrait
+%%BoundingBox: 0 0 427 293
+%%Pages: 0
+%%BeginSetup
+%%EndSetup
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+-72.0 362.0 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+ bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+ 4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+%%EndProlog
+
+$F2psBegin
+10 setmiterlimit
+n -1000 7022 m -1000 -1000 l 9307 -1000 l 9307 7022 l cp clip
+ 0.06000 0.06000 sc
+/Times-Roman ff 300.00 scf sf
+1200 1680 m
+gs 1 -1 sc (INDEPENDENT) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+1800 1950 m
+gs 1 -1 sc (PART) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+1575 1425 m
+gs 1 -1 sc (TARGET) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+6450 1680 m
+gs 1 -1 sc (DEPENDENT) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+6675 1350 m
+gs 1 -1 sc (TARGET) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+6900 1950 m
+gs 1 -1 sc (PART) col0 sh gr
+% Polyline
+15.000 slw
+n 3600 2400 m 3600 6000 l gs col0 s gr
+% Polyline
+n 6000 2400 m 6000 6000 l gs col0 s gr
+% Polyline
+7.500 slw
+gs clippath
+5861 3927 m 6000 3975 l 5853 3987 l 6011 4007 l 6019 3947 l cp
+clip
+n 3600 3675 m 6000 3975 l gs col0 s gr gr
+
+% arrowhead
+n 5861 3927 m 6000 3975 l 5853 3987 l 5881 3960 l 5861 3927 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+5861 5427 m 6000 5475 l 5853 5487 l 6011 5507 l 6019 5447 l cp
+clip
+n 3600 5175 m 6000 5475 l gs col0 s gr gr
+
+% arrowhead
+n 5861 5427 m 6000 5475 l 5853 5487 l 5881 5460 l 5861 5427 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+3747 4643 m 3600 4631 l 3739 4583 l 3581 4603 l 3589 4663 l cp
+clip
+n 6000 4331 m 3600 4631 l gs col0 s gr gr
+
+% arrowhead
+n 3747 4643 m 3600 4631 l 3739 4583 l 3719 4616 l 3747 4643 l cp gs 0.00 setgray ef gr col0 s
+/Times-Bold ff 300.00 scf sf
+4800 2700 m
+gs 1 -1 sc (Detach a process) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+2550 3750 m
+gs 1 -1 sc (Detach a process) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+7200 4050 m
+gs 1 -1 sc (Detach the process) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+6150 4425 m
+gs 1 -1 sc (Notify detach) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+6150 4800 m
+gs 1 -1 sc (Resume process) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+3450 5250 m
+gs 1 -1 sc (Close connection) dup sw pop neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+8100 5625 m
+gs 1 -1 sc (Close connection) dup sw pop neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+4800 1650 m
+gs 1 -1 sc (messages exchange) dup sw pop 2 div neg 0 rm col0 sh gr
+$F2psEnd
+rs
diff --git a/doc/rgdb_specs/seqdetach.jpg b/doc/rgdb_specs/seqdetach.jpg
new file mode 100644
index 0000000000..a42f9e5d7a
--- /dev/null
+++ b/doc/rgdb_specs/seqdetach.jpg
Binary files differ
diff --git a/doc/rgdb_specs/seqinit.eps b/doc/rgdb_specs/seqinit.eps
new file mode 100644
index 0000000000..496cf69218
--- /dev/null
+++ b/doc/rgdb_specs/seqinit.eps
@@ -0,0 +1,204 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: seq_init.eps
+%%Creator: fig2dev Version 3.2 Patchlevel 1
+%%CreationDate: Tue Oct 13 13:59:59 1998
+%%For: valette@tri-yann (Eric Valette,,6891,)
+%%Orientation: Portrait
+%%BoundingBox: 0 0 482 527
+%%Pages: 0
+%%BeginSetup
+%%EndSetup
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+-56.0 596.0 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+ bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+ 4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+%%EndProlog
+
+$F2psBegin
+10 setmiterlimit
+n -1000 10922 m -1000 -1000 l 9958 -1000 l 9958 10922 l cp clip
+ 0.06000 0.06000 sc
+/Times-Roman ff 300.00 scf sf
+1200 1680 m
+gs 1 -1 sc (INDEPENDENT) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+1500 1350 m
+gs 1 -1 sc (TARGET) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+1650 2025 m
+gs 1 -1 sc (PART) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+7125 1350 m
+gs 1 -1 sc (TARGET) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+7275 1950 m
+gs 1 -1 sc (PART) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+6750 1650 m
+gs 1 -1 sc (DEPENDENT) col0 sh gr
+% Polyline
+7.500 slw
+gs clippath
+5861 3927 m 6000 3975 l 5853 3987 l 6011 4007 l 6019 3947 l cp
+clip
+n 3600 3675 m 6000 3975 l gs col0 s gr gr
+
+% arrowhead
+n 5861 3927 m 6000 3975 l 5853 3987 l 5881 3960 l 5861 3927 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+3745 4380 m 3598 4368 l 3737 4320 l 3579 4340 l 3587 4400 l cp
+clip
+n 5998 4068 m 3598 4368 l gs col0 s gr gr
+
+% arrowhead
+n 3745 4380 m 3598 4368 l 3737 4320 l 3717 4353 l 3745 4380 l cp gs 0.00 setgray ef gr col0 s
+/Times-Roman ff 300.00 scf sf
+2550 3750 m
+gs 1 -1 sc (Open connection) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+7125 4050 m
+gs 1 -1 sc (Accept connection) dup sw pop 2 div neg 0 rm col0 sh gr
+% Polyline
+15.000 slw
+n 3600 2400 m 3600 9825 l gs col0 s gr
+% Polyline
+n 6000 2400 m 6000 9900 l gs col0 s gr
+% Polyline
+30.000 slw
+n 975 5100 m 8925 5100 l gs col0 s gr
+% Polyline
+7.500 slw
+gs clippath
+5861 7002 m 6000 7050 l 5853 7062 l 6011 7082 l 6019 7022 l cp
+clip
+n 3600 6750 m 6000 7050 l gs col0 s gr gr
+
+% arrowhead
+n 5861 7002 m 6000 7050 l 5853 7062 l 5881 7035 l 5861 7002 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+5865 8399 m 6004 8447 l 5857 8459 l 6015 8479 l 6023 8419 l cp
+clip
+n 3604 8147 m 6004 8447 l gs col0 s gr gr
+
+% arrowhead
+n 5865 8399 m 6004 8447 l 5857 8459 l 5885 8432 l 5865 8399 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+3746 8815 m 3599 8803 l 3738 8755 l 3580 8775 l 3588 8835 l cp
+clip
+n 5999 8503 m 3599 8803 l gs col0 s gr gr
+
+% arrowhead
+n 3746 8815 m 3599 8803 l 3738 8755 l 3718 8788 l 3746 8815 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+3748 7709 m 3601 7697 l 3740 7649 l 3582 7669 l 3590 7729 l cp
+clip
+n 6001 7397 m 3601 7697 l gs col0 s gr gr
+
+% arrowhead
+n 3748 7709 m 3601 7697 l 3740 7649 l 3720 7682 l 3748 7709 l cp gs 0.00 setgray ef gr col0 s
+/Times-Bold ff 300.00 scf sf
+4800 2850 m
+gs 1 -1 sc (Connect on target) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Bold ff 300.00 scf sf
+4800 5850 m
+gs 1 -1 sc (Attach a process) dup sw pop 2 div neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+3525 6825 m
+gs 1 -1 sc (Attach a process) dup sw pop neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+6150 7125 m
+gs 1 -1 sc (Stop the process) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+6150 7500 m
+gs 1 -1 sc (Notify a child change) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+6150 8550 m
+gs 1 -1 sc (Give information) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+3150 8850 m
+gs 1 -1 sc (...) dup sw pop neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+3525 8250 m
+gs 1 -1 sc (Ask information) dup sw pop neg 0 rm col0 sh gr
+/Times-Roman ff 300.00 scf sf
+4800 2025 m
+gs 1 -1 sc (messages exchange) dup sw pop 2 div neg 0 rm col0 sh gr
+$F2psEnd
+rs
diff --git a/doc/rgdb_specs/seqinit.jpg b/doc/rgdb_specs/seqinit.jpg
new file mode 100644
index 0000000000..29714a181d
--- /dev/null
+++ b/doc/rgdb_specs/seqinit.jpg
Binary files differ
diff --git a/doc/rtems_footer.html.in b/doc/rtems_footer.html.in
new file mode 100644
index 0000000000..620704503a
--- /dev/null
+++ b/doc/rtems_footer.html.in
@@ -0,0 +1 @@
+<P>Copyright &copy; 1988-2004 <A HREF="http://www.oarcorp.com" target="Text Frame">OAR Corporation</A>
diff --git a/doc/rtems_gdb/.cvsignore b/doc/rtems_gdb/.cvsignore
new file mode 100644
index 0000000000..ffe6d12db3
--- /dev/null
+++ b/doc/rtems_gdb/.cvsignore
@@ -0,0 +1,28 @@
+commands.texi
+example.texi
+index.html
+intro.texi
+Makefile
+Makefile.in
+mdate-sh
+rtems_footer.html
+rtems_gdb
+rtems_gdb.aux
+rtems_gdb.cp
+rtems_gdb.dvi
+rtems_gdb.fn
+rtems_gdb*.html
+rtems_gdb.ky
+rtems_gdb.log
+rtems_gdb.pdf
+rtems_gdb.pg
+rtems_gdb.ps
+rtems_gdb.toc
+rtems_gdb.tp
+rtems_gdb.vr
+rtems_header.html
+stamp-vti
+started.texi
+swarch.texi
+trouble.texi
+version.texi
diff --git a/doc/rtems_gdb/Makefile.am b/doc/rtems_gdb/Makefile.am
new file mode 100644
index 0000000000..7471f6224f
--- /dev/null
+++ b/doc/rtems_gdb/Makefile.am
@@ -0,0 +1,61 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = rtems_gdb
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/main.am
+
+GENERATED_FILES = intro.texi swarch.texi started.texi commands.texi \
+ trouble.texi example.texi
+
+COMMON_FILES += $(top_srcdir)/common/cpright.texi
+
+FILES =
+
+info_TEXINFOS = rtems_gdb.texi
+rtems_gdb_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+#
+# Process Automatically Generated Files
+#
+
+intro.texi: intro.t
+ $(BMENU2) -p "Top" \
+ -u "Top" \
+ -n "Software Architecture" < $< > $@
+
+swarch.texi: swarch.t
+ $(BMENU2) -p "Introduction" \
+ -u "Top" \
+ -n "Getting Started" < $< > $@
+
+started.texi: started.t
+ $(BMENU2) -p "Software Architecture" \
+ -u "Top" \
+ -n "Commands" < $< > $@
+
+commands.texi: commands.t
+ $(BMENU2) -p "Getting Started Attaching To The System" \
+ -u "Top" \
+ -n "Troubleshooting" < $< > $@
+
+trouble.texi: trouble.t
+ $(BMENU2) -p "Commands Thread control" \
+ -u "Top" \
+ -n "Debug Session Example" < $< > $@
+
+example.texi: example.t
+ $(BMENU2) -p "Troubleshooting Debug server not present" \
+ -u "Top" \
+ -n "" < $< > $@
+
+EXTRA_DIST = commands.t example.t intro.t started.t swarch.t trouble.t
+
+CLEANFILES += rtems_gdb.info
diff --git a/doc/rtems_gdb/commands.t b/doc/rtems_gdb/commands.t
new file mode 100644
index 0000000000..61800f60ee
--- /dev/null
+++ b/doc/rtems_gdb/commands.t
@@ -0,0 +1,51 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Commands
+
+The usual GDB commands are available to display or modify data structures and
+machine registers, disassemble code, display source listings, set and reset
+breakpoints, control the debuggee execution, etc. Refer to Debugging with GDB
+for a complete documentation of the standard GDB commands.
+
+GDB 4.17 has been extended with a number of commands specifically
+for multi-threaded debugging within a RTEMS host-target environment. These commands
+are described in this section.
+
+
+@section Host-target connection control
+
+@itemize @bullet
+@item (gdb) setrpcmode sun : specifies the SUN RPC type.
+@item (gdb) setdaemontype rdbg : specifies the RDBG debug server type.
+@item (gdb) target rtems target-name : specifies the target type.
+@end itemize
+
+@section System status information
+
+@itemize @bullet
+@item (gdb) info threads : gives a list of all threads in the debuggee,
+their names, identifiers and states. It also indicates which thread is
+the target thread.
+@end itemize
+
+
+@section Thread control
+
+@itemize @bullet
+@item (gdb) thread target [id] : allows the user to get/set the target thread.
+The argument id is either the thread's symbolic name or its local identifier.
+@item (gdb) thread detach [id...] : all stops (breakpoints) of some specified
+thread(s) can be ignored using the thread detach command. Each time a detached
+thread hits a breakpoint, RTEMS/GDB will automatically restart the debuggee
+without passing control to the user.
+@item (gdb) thread attach [id...] : (re)attach specified thread(s).
+@end itemize
+
+
+
diff --git a/doc/rtems_gdb/example.t b/doc/rtems_gdb/example.t
new file mode 100644
index 0000000000..531e478465
--- /dev/null
+++ b/doc/rtems_gdb/example.t
@@ -0,0 +1,88 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Debug Session Example
+
+The following is a debug session. Note that some lines have been broken
+to aviod formatting problems in the printed document.
+
+@example
+GNU gdb 4.17
+Copyright 1998 Free Software Foundation, Inc.
+GDB is free software, covered by the GNU General Public License, and
+you are welcome to change it and/or distribute copies of it under
+certain conditions. Type "show copying" to see the conditions.
+There is absolutely no warranty for GDB.
+Type "show warranty" for details.
+This GDB was configured as --host=i686-pc-linux-gnu --target=i386-rtems.
+(gdb) setrpcmode sun
+(gdb) setdaemontype rdbg
+(gdb) target rtems usnet-test
+Attaching remote machine across net...
+Connected to usnet-test.
+Now the "run" command will start a remote process.
+(gdb) file /buildr4/pc386/tests/debug.exe
+Reading symbols from /buildr4/pc386/tests/debug.exe...done.
+(gdb) attach 1
+Attaching program: /buildr4/pc386/tests/debug.exe pid 1
+0x22fe65 in enterRdbg ()
+(gdb) info threads
+There are 8 threads:
+Id. Name Detached Suspended
+134283273 Rini No No <= current target thread
+0x22fe65 in enterRdbg ()
+134283272 Evnt No No
+_Thread_Dispatch () at /rtems4/cpukit/score/src/thread.c:315
+134283271 SPE2 No No
+_Thread_Dispatch () at /rtems4/cpukit/score/src/thread.c:315
+134283270 SPE1 No No
+_Thread_Handler () at /rtems4/cpukit/score/src/thread.c:1107
+134283269 RDBG No No
+0x22fe65 in enterRdbg ()
+134283268 SCrx No No
+_Thread_Dispatch () at /rtems4/cpukit/score/src/thread.c:315
+134283267 SCtx No No
+_Thread_Dispatch () at /rtems4/cpukit/score/src/thread.c:315
+134283266 ntwk No No
+_Thread_Dispatch () at /rtems4/cpukit/score/src/thread.c:315
+(gdb) b init.c:92
+Breakpoint 1 at 0x200180: file \
+ /rtems4/c/src/tests/samples/debug/init.c, line 92.
+(gdb) c
+Continuing.
+Thread 134283273 (Rini) has been deleted.
+[Switching to Rtems thread 134283271 (Not suspended) \
+ ( <= current target thread )]
+Breakpoint 1, example2 (argument=4) at \
+ /rtems4/c/src/tests/samples/debug/init.c:92
+92 tuto += tuti;
+(gdb) b init.c:66
+Breakpoint 2 at 0x200128: file \
+ /rtems4/c/src/tests/samples/debug/init.c, line 66.
+(gdb) c
+Continuing.
+[Switching to Rtems thread 134283270 (Not suspended) \
+ ( <= current target thread )]
+Breakpoint 2, example1 (argument=4) at \
+ /rtems4/c/src/tests/samples/debug/init.c:66
+66 toto += titi;
+(gdb) c
+Continuing.
+[Switching to Rtems thread 134283271 (Not suspended) \
+ ( <= current target thread )]
+Breakpoint 1, example2 (argument=4) at \
+ /rtems4/c/src/tests/samples/debug/init.c:92
+92 tuto += tuti;
+(gdb) s
+93 if (print_enable2)
+(gdb) detach
+Detaching program: /buildr4/pc386/tests/debug.exe pid 1
+Warning: the next command will be done localy!
+If you want to restart another remote program, reuse the target command
+(gdb) quit
+@end example
diff --git a/doc/rtems_gdb/intro.t b/doc/rtems_gdb/intro.t
new file mode 100644
index 0000000000..70178b2aef
--- /dev/null
+++ b/doc/rtems_gdb/intro.t
@@ -0,0 +1,22 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Introduction
+
+GDB 4.17 is a source-level symbolic debugger for RTEMS environment.
+This version is an extension of GNU GDB version 4.17, adapted for the debugging
+of RTEMS applications in a heterogeneous host-target environment.
+
+This paper documents @b{only} the RTEMS/GDB extensions to GNU
+GDB 4.17, as well as its use in the RTEMS environment. The reader is assumed
+to be familiar with GNU GDB.
+
+The RTEMS project would like to thank Emmanuel Raguet (raguet@@crf.canon.fr)
+and Eric Valette (valette@@crf.canon.fr) of the Canon Research Centre
+France S.A. for developing and documenting RTEMS/GDB and submitting it.
+
diff --git a/doc/rtems_gdb/rtems_gdb.texi b/doc/rtems_gdb/rtems_gdb.texi
new file mode 100644
index 0000000000..13abf762da
--- /dev/null
+++ b/doc/rtems_gdb/rtems_gdb.texi
@@ -0,0 +1,105 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename rtems_gdb.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the Getting Started (C) Guide
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS On-Line Manual
+@direntry
+* RTEMS/GDB User's Guide: (rtems_gdb).
+@end direntry
+@end ifset
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage RTEMS/GDB User's Guide
+
+@setchapternewpage odd
+@settitle RTEMS/GDB User's Guide
+@titlepage
+@finalout
+
+@title RTEMS/GDB User's Guide
+@subtitle Edition @value{EDITION}, for @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author Emmanuel Raguet and Eric Valette, Canon Research Centre
+@author On-Line Applications Research Corporation
+@page
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include intro.texi
+@include swarch.texi
+@include started.texi
+@include commands.texi
+@include trouble.texi
+@include example.texi
+
+@ifinfo
+@node Top, Introduction, (dir), (dir)
+@top rtems_gdb
+
+This is the online version of the RTEMS/GDB User's Guide.
+
+@menu
+* Introduction::
+* Software Architecture::
+* Getting Started::
+* Commands::
+* Troubleshooting::
+* Debug Session Example::
+@end menu
+
+@c * Command and Variable Index::
+@c * Concept Index::
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@c @node Command and Variable Index, Concept Index, Installing GCC AND NEWLIB, Top
+@c @unnumbered Command and Variable Index
+
+@c There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@c @node Concept Index, , Command and Variable Index, Top
+@c @unnumbered Concept Index
+
+@c There are currently no Concept Index entries.
+@c @printindex cp
+
+@contents
+@bye
+
diff --git a/doc/rtems_gdb/started.t b/doc/rtems_gdb/started.t
new file mode 100644
index 0000000000..c8b4bad3e9
--- /dev/null
+++ b/doc/rtems_gdb/started.t
@@ -0,0 +1,53 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+
+@chapter Getting Started
+
+This section describes the steps which are necessary to set up a
+debugging session with RTEMS/GDB.
+
+
+@section Compiling The System Components
+
+The components that need to be debugged have to be compiled with the -g option
+in order the generated file to contain the required information for the debug
+session.
+
+
+@section Starting a debugging session
+
+After having launched GDB, the user must connect to the RTEMS target with the
+following commands:
+
+@example
+(gdb) setrpcmode sun
+(gdb) setdaemontype rdbg
+(gdb) target rtems target-name
+@end example
+
+Then he can use the file GDB command to specify the binary to be debugged.
+
+This initialization phase can be written in a @code{``.gdbinit''}
+file. Each time, the user will launch GDB, it will execute this initialization
+sequence.
+
+
+@section Attaching To The System
+
+The entire target system is viewed as a single multi-threaded process,
+the identifier of which is 1. To attach, use:
+
+@example
+(gdb) attach 1
+@end example
+
+When successfully attached, the user can control the execution of
+the target system from the debugger.
+
+
diff --git a/doc/rtems_gdb/swarch.t b/doc/rtems_gdb/swarch.t
new file mode 100644
index 0000000000..8e7eaf9840
--- /dev/null
+++ b/doc/rtems_gdb/swarch.t
@@ -0,0 +1,32 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+
+@chapter Software Architecture
+
+RTEMS/GDB host-target debugger is architectured around:
+
+@itemize @bullet
+@item One debugger, running on the host.
+@item One debug server, running on the target.
+@end itemize
+
+The host debugger communicates with the debug server using Sun RPC
+over UDP/IP (Ethernet).
+
+When opening a debugging session, the user takes the control over
+the entire target system. The target system is viewed as a single multi-threaded
+process.
+
+The debugger can observe the state of the system objects, without
+stopping the entire system. However, breakpoints and stepping affect (stop)
+the entire system.
+
+For a given target, only one single system debugging session is possible
+at a time.
+
diff --git a/doc/rtems_gdb/trouble.t b/doc/rtems_gdb/trouble.t
new file mode 100644
index 0000000000..7ed7364425
--- /dev/null
+++ b/doc/rtems_gdb/trouble.t
@@ -0,0 +1,46 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+
+@chapter Troubleshooting
+
+This section describes symptoms in some situations where the debugger does not
+work correctly, and it gives guidelines for resolving the problems encountered.
+
+
+@section Target machine name unknown on the host
+
+RTEMS/GDB fails to connect to target machine named my_target:
+
+@example
+(gdb) target rtems my_target
+
+Attaching remote machine across net... \
+ Invalid hostname. Couldn't find remote host address.
+@end example
+
+@i{==> Ask your system administrator to add an entry with the
+Internet number of machine my_target in the file /etc/hosts on your host machine. }
+
+
+@section Debug server not present
+
+The target rtems command fails:
+
+@example
+(gdb) target rtems my_target
+
+Attaching remote machine across net... RPC timed out. Couldn't connect
+to remote target
+@end example
+
+
+@i{==> Verify that the target system is properly configured,
+and is running the debugging daemon and communication stack.}
+
+
diff --git a/doc/rtems_header.html.in b/doc/rtems_header.html.in
new file mode 100644
index 0000000000..e3230eac83
--- /dev/null
+++ b/doc/rtems_header.html.in
@@ -0,0 +1,5 @@
+<BODY BGCOLOR="FFFFFF">
+<A HREF="http://www.rtems.com" target="Text Frame">
+ <IMG align=right BORDER=0 SRC="../images/rtems_logo.jpg" ALT="RTEMS Logo"> </A>
+<H1>RTEMS @VERSION@ On-Line Library</H1>
+<HR>
diff --git a/doc/started/.cvsignore b/doc/started/.cvsignore
new file mode 100644
index 0000000000..724537f0ad
--- /dev/null
+++ b/doc/started/.cvsignore
@@ -0,0 +1,33 @@
+binaries.texi
+buildc.texi
+buildrt.texi
+gdb.texi
+index.html
+intro.texi
+Makefile
+Makefile.in
+mdate-sh
+nextstep.texi
+nt.texi
+require.texi
+rtems_footer.html
+rtems_header.html
+sample.texi
+stamp-vti
+started
+started-?
+started.aux
+started.cp
+started.dvi
+started.fn
+started*.html
+started.ky
+started.log
+started.pdf
+started.pg
+started.ps
+started.toc
+started.tp
+started.vr
+version.texi
+tversions.sed
diff --git a/doc/started/Makefile.am b/doc/started/Makefile.am
new file mode 100644
index 0000000000..d7eb782a88
--- /dev/null
+++ b/doc/started/Makefile.am
@@ -0,0 +1,93 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = started
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/main.am
+
+GENERATED_FILES = binaries.texi buildc.texi buildrt.texi intro.texi nt.texi \
+ require.texi nextstep.texi sample.texi
+
+COMMON_FILES += $(top_srcdir)/common/cpright.texi
+
+FILES =
+
+info_TEXINFOS = started.texi
+started_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+intro.texi: intro.t tversions.texi
+ $(BMENU2) -c -p "Top" \
+ -u "Top" \
+ -n "Requirements" < $< > $@
+
+require.texi: require.t tversions.texi
+ $(BMENU2) -c -p "GCC Mailing Lists" \
+ -u "Top" \
+ -n "Prebuilt Toolset Executables" < $< > $@
+
+binaries.texi: binaries.t tversions.texi
+ $(BMENU2) -c -p "Archive and Build Directory Format" \
+ -u "Top" \
+ -n "Building the GNU Cross Compiler Toolset" < $< > $@
+
+buildc.texi: buildc.t tversions.texi
+ $(BMENU2) -c -p "Removing Zipped Tar Files" \
+ -u "Top" \
+ -n "Building RTEMS" < $< > $@
+
+buildrt.texi: buildrt.t tversions.texi
+ $(BMENU2) -c -p "Error Messages Indicating Configuration Problems" \
+ -u "Top" \
+ -n "Building the Sample Applications" < $< > $@
+
+sample.texi: sample.t tversions.texi
+ $(BMENU2) -c -p "Using the RTEMS configure Script Directly" \
+ -u "Top" \
+ -n "Where To Go From Here" < $< > $@
+
+nextstep.texi: nextstep.t tversions.texi
+ $(BMENU2) -c -p "More Information on RTEMS Application Makefiles" \
+ -u "Top" \
+ -n "Using MS-Windows as a Development Host" < $< > $@
+
+nt.texi: nt.t tversions.texi
+ $(BMENU2) -c -p "Writing an Application" \
+ -u "Top" \
+ -n "" < $< > $@
+
+EXTRA_DIST = binaries.t buildc.t buildrt.t intro.t nextstep.t nt.t require.t \
+ sample.t
+
+if USE_HTML
+html_project_DATA += pictures/sfile12c.jpg pictures/bit_c.jpg
+endif
+
+PICTURES = pictures/bit_ada.jpg pictures/bit_ada.vsd pictures/bit_c.jpg \
+ pictures/bit_c.vsd pictures/scfile10.jpg pictures/scfile10.vsd \
+ pictures/scfile11.jpg pictures/scfile11.vsd pictures/scfile12.jpg \
+ pictures/scfile12.vsd pictures/scfile13.jpg pictures/scfile13.vsd \
+ pictures/scsfile1.jpg pictures/scsfile1.vsd pictures/scsfile2.jpg \
+ pictures/scsfile2.vsd pictures/scsfile3.jpg pictures/scsfile3.vsd \
+ pictures/scsfile4.jpg pictures/scsfile4.vsd pictures/scsfile5.jpg \
+ pictures/scsfile5.vsd pictures/scsfile6.jpg pictures/scsfile6.vsd \
+ pictures/scsfile7.jpg pictures/scsfile7.vsd pictures/scsfile8.jpg \
+ pictures/scsfile8.vsd pictures/scsfile9.jpg pictures/scsfile9.vsd \
+ pictures/sfile12c.jpg pictures/sfile12c.vsd
+
+EXTRA_DIST += $(PICTURES)
+
+tversions.texi: tversions.texi.in tversions.sed
+ sed -f tversions.sed $(srcdir)/tversions.texi.in > tversions.texi
+CLEANFILES += tversions.texi
+
+EXTRA_DIST += tversions.texi.in
+DISTCLEANFILES = tversions.sed
+
+CLEANFILES += started.info started.info-?
diff --git a/doc/started/binaries.t b/doc/started/binaries.t
new file mode 100644
index 0000000000..9b53a9765f
--- /dev/null
+++ b/doc/started/binaries.t
@@ -0,0 +1,153 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Prebuilt Toolset Executables
+
+Precompiled toolsets are available for Linux, Cygwin, FreeBSD,
+and Solaris. These are packaged in the following formats:
+
+@itemize @bullet
+@item Linux - RPM
+@item Cygwin - tar.bz2
+@item Solaris - tar.bz2
+@end itemize
+
+RPM is an acronym for the RPM Package Manager. RPM is the
+native package installer for many Linux distributions including
+RedHat, SuSE, and Fedora.
+
+The prebuilt binaries are intended to be easy to install and
+the instructions are similar regardless of the host environment.
+There are a few structural issues with the packaging of the RTEMS
+Cross Toolset binaries that you need to be aware of.
+
+@enumerate
+@item There are dependencies between the various packages.
+This requires that certain packages be installed before others may be.
+Some packaging formats enforce this dependency.
+
+@item Some packages are target CPU family independent and shared
+across all target architectures. These are referred to as
+"base" packages.
+
+@item Depending upon the version of GCC as well as the development
+host and target CPU combination, pre-built supplemental packages may
+be provided for Ada (gnat), Chill, Java (gcj), Fortran (g77), and
+Objective-C (objc). These binaries are strictly optional.
+
+@end enumerate
+
+NOTE: Installing toolset binaries does not install RTEMS itself, only
+the tools required to build RTEMS. See @ref{Building RTEMS} for the next
+step in the process.
+
+@section RPMs
+
+This section provides information on installing and removing RPMs.
+
+@subsection Installing RPMs
+
+The following is a sample session illustrating the installation
+of a C/C++ toolset targeting the SPARC architecture.
+
+@example
+rpm -i @value{RTEMSRPMPREFIX}rtems-base-binutils-@value{BINUTILSVERSION}-@value{BINUTILSRPMRELEASE}.i386.rpm
+rpm -i @value{RTEMSRPMPREFIX}sparc-rtems-binutils-@value{BINUTILSVERSION}-@value{BINUTILSRPMRELEASE}.i386.rpm
+rpm -i @value{RTEMSRPMPREFIX}rtems-base-gcc-gcc@value{GCCVERSION}newlib@value{NEWLIBVERSION}-@value{GCCRPMRELEASE}.i386.rpm
+rpm -i @value{RTEMSRPMPREFIX}sparc-rtems-c++-gcc@value{GCCVERSION}newlib@value{NEWLIBVERSION}-@value{GCCRPMRELEASE}.i386.rpm
+rpm -i @value{RTEMSRPMPREFIX}sparc-rtems-gcc-gcc@value{GCCVERSION}newlib@value{NEWLIBVERSION}-@value{GCCRPMRELEASE}.i386.rpm
+rpm -i @value{RTEMSRPMPREFIX}rtems-base-gdb-@value{GDBVERSION}-@value{GDBRPMRELEASE}.i386.rpm
+rpm -i @value{RTEMSRPMPREFIX}sparc-rtems-gdb-@value{GDBVERSION}-@value{GDBRPMRELEASE}.i386.rpm
+@end example
+
+Upon successful completion of the above command sequence, a
+C/C++ cross development toolset targeting the SPARC is
+installed in @code{@value{RTEMSPREFIX}}. In order to use this toolset,
+the directory @code{@value{RTEMSPREFIX}/bin} must be included in your
+PATH.
+
+Once you have successfully installed the RPMs for BINUTILS, GCC,
+NEWLIB, and GDB, then you may proceed directly to @ref{Building RTEMS}.
+
+@subsection Determining Which RTEMS RPMs are Installed
+
+The following command will report which RTEMS RPMs are currently
+installed:
+
+@example
+rpm -q -g @value{RTEMSRPMGROUP}
+@end example
+
+@subsection Removing RPMs
+
+The following is a sample session illustrating the removal
+of a C/C++ toolset targeting the SPARC architecture.
+
+@example
+rpm -e @value{RTEMSRPMPREFIX}sparc-rtems-gdb-@value{GDBVERSION}-@value{GDBRPMRELEASE}.i386.rpm
+rpm -e @value{RTEMSRPMPREFIX}rtems-base-gdb-@value{GDBVERSION}-@value{GDBRPMRELEASE}.i386.rpm
+rpm -e @value{RTEMSRPMPREFIX}sparc-rtems-gcc-gcc@value{GCCVERSION}newlib@value{NEWLIBVERSION}-@value{GCCRPMRELEASE}.i386.rpm
+rpm -e @value{RTEMSRPMPREFIX}sparc-rtems-c++-gcc@value{GCCVERSION}newlib@value{NEWLIBVERSION}-@value{GCCRPMRELEASE}.i386.rpm
+rpm -e @value{RTEMSRPMPREFIX}rtems-base-gcc-gcc@value{GCCVERSION}newlib@value{NEWLIBVERSION}-@value{GCCRPMRELEASE}.i386.rpm
+rpm -e @value{RTEMSRPMPREFIX}sparc-rtems-binutils-@value{BINUTILSVERSION}-@value{BINUTILSRPMRELEASE}.i386.rpm
+rpm -e @value{RTEMSRPMPREFIX}rtems-base-binutils-@value{BINUTILSVERSION}-@value{BINUTILSRPMRELEASE}.i386.rpm
+@end example
+
+NOTE: If you have installed any RTEMS BSPs, then it is likely that
+RPM will complain about not being able to remove everything.
+
+@section Zipped Tar Files
+
+This section provides information on installing and removing
+Zipped Tar Files (e.g .tar.gz or .tar.bz2).
+
+@subsection Installing Zipped Tar Files
+
+The following is a sample session illustrating the installation
+of a C/C++ toolset targeting the SPARC architecture assuming
+that GNU tar is installed as @code{tar} for a set of archive
+files compressed with GNU Zip (gzip):
+
+@example
+cd /
+tar xzf @value{RTEMSRPMPREFIX}rtems-base-binutils-@value{BINUTILSVERSION}-@value{BINUTILSRPMRELEASE}.tar.gz
+tar xzf @value{RTEMSRPMPREFIX}sparc-rtems-binutils-@value{BINUTILSVERSION}-@value{BINUTILSRPMRELEASE}.tar.gz
+tar xzf @value{RTEMSRPMPREFIX}rtems-base-gcc-gcc@value{GCCVERSION}newlib@value{NEWLIBVERSION}-@value{GCCRPMRELEASE}.tar.gz
+tar xzf @value{RTEMSRPMPREFIX}sparc-rtems-gcc-gcc@value{GCCVERSION}newlib@value{NEWLIBVERSION}-@value{GCCRPMRELEASE}.tar.gz
+tar xzf @value{RTEMSRPMPREFIX}rtems-base-gdb-@value{GDBVERSION}-@value{GDBRPMRELEASE}.tar.gz
+tar xzf @value{RTEMSRPMPREFIX}sparc-rtems-gdb-@value{GDBVERSION}-@value{GDBRPMRELEASE}.tar.gz
+@end example
+
+The following command set is the equivalent command sequence
+for the same toolset assuming that is was compressed with
+GNU BZip (bzip2):
+
+@example
+cd /
+tar xjf @value{RTEMSRPMPREFIX}rtems-base-binutils-@value{BINUTILSVERSION}-@value{BINUTILSRPMRELEASE}.tar.bz2
+tar xjf @value{RTEMSRPMPREFIX}sparc-rtems-binutils-@value{BINUTILSVERSION}-@value{BINUTILSRPMRELEASE}.tar.bz2
+tar xjf @value{RTEMSRPMPREFIX}rtems-base-gcc-gcc@value{GCCVERSION}newlib@value{NEWLIBVERSION}-@value{GCCRPMRELEASE}.tar.bz2
+tar xjf @value{RTEMSRPMPREFIX}sparc-rtems-gcc-gcc@value{GCCVERSION}newlib@value{NEWLIBVERSION}-@value{GCCRPMRELEASE}.tar.bz2
+tar xjf @value{RTEMSRPMPREFIX}rtems-base-gdb-@value{GDBVERSION}-@value{GDBRPMRELEASE}.tar.bz2
+tar xjf @value{RTEMSRPMPREFIX}sparc-rtems-gdb-@value{GDBVERSION}-@value{GDBRPMRELEASE}.tar.bz2
+@end example
+
+Upon successful completion of the above command sequence, a
+C/C++ cross development toolset targeting the SPARC is
+installed in @code{@value{RTEMSPREFIX}}. In order to use this toolset,
+the directory @code{@value{RTEMSPREFIX}} must be included in your
+PATH.
+
+@subsection Removing Zipped Tar Files
+
+There is no automatic way to remove the contents of a @code{tar.gz}
+or @code{tar.bz2} once it is installed. The contents of the directory
+@code{@value{RTEMSPREFIX}} can be removed but this will likely result
+in other packages being removed as well.
+
+
diff --git a/doc/started/buildc.t b/doc/started/buildc.t
new file mode 100644
index 0000000000..b4f9f808f2
--- /dev/null
+++ b/doc/started/buildc.t
@@ -0,0 +1,952 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Building the GNU Cross Compiler Toolset
+
+NOTE: This chapter does @b{NOT} apply if you installed
+prebuilt toolset executables for BINUTILS, GCC, NEWLIB,
+and GDB. If you installed prebuilt executables for all
+of those, proceed to @ref{Building RTEMS}. If you require
+a GDB with a special configuration to connect to your
+target board, then proceed to @ref{Building the GNU Debugger GDB}
+for some advice.
+
+This chapter describes the steps required to acquire the
+source code for a GNU cross compiler toolset, apply
+any required RTEMS specific patches, compile that
+toolset and install it.
+
+It is recommended that when toolset binaries are available for
+your particular host, that they be used. Prebuilt binaries
+are much easier to install.
+
+@c
+@c Building BINUTILS GCC and NEWLIB
+@c
+@section Building BINUTILS GCC and NEWLIB
+
+NOTE: This step is NOT required if prebuilt executables for
+BINUTILS, GCC, and NEWLIB were installed.
+
+This section describes the process of building BINUTILS, GCC, and
+NEWLIB using a variety of methods. Included is information on
+obtaining the source code and patches, applying patches, and
+building and installing the tools using multiple methods.
+
+@c
+@c Obtain Source and Patches for BINUTILS GCC and NEWLIB
+@c
+
+@subsection Obtain Source and Patches for BINUTILS GCC and NEWLIB
+
+NOTE: This step is required for all methods of building BINUTILS,
+GCC, and NEWLIB.
+
+This section lists the components required to build BINUTILS, GCC,
+and NEWLIB from source to target RTEMS. These files should be
+placed in your @code{archive} directory. Included are the locations
+of each component as well as any required RTEMS specific patches.
+
+@need 1000
+@subheading @value{GCCUNTAR}
+@example
+ FTP Site: @value{GCCFTPSITE}
+ Directory: @value{GCCFTPDIR}
+ File: @value{GCCTAR}
+@c @ifset use-html
+ URL: @uref{ftp://@value{GCCFTPSITE}@value{GCCFTPDIR}/@value{GCCTAR},,ftp://@value{GCCFTPSITE}@value{GCCFTPDIR}/@value{GCCTAR}}
+@c URL: ftp://@value{GCCFTPSITE}@value{GCCFTPDIR}
+@c @end ifset
+@end example
+
+@need 1000
+@subheading @value{BINUTILSUNTAR}
+@example
+ FTP Site: @value{BINUTILSFTPSITE}
+ Directory: @value{BINUTILSFTPDIR}
+ File: @value{BINUTILSTAR}
+@c @ifset use-html
+ URL: @uref{ftp://@value{BINUTILSFTPSITE}@value{BINUTILSFTPDIR}/@value{BINUTILSTAR},,ftp://@value{BINUTILSFTPSITE}@value{BINUTILSFTPDIR}/@value{BINUTILSTAR}}
+@c URL: ftp://@value{BINUTILSFTPSITE}@value{BINUTILSFTPDIR}/@value{BINUTILSTAR}
+@c @end ifset
+@end example
+
+@need 1000
+@subheading @value{NEWLIBUNTAR}
+@example
+ FTP Site: @value{NEWLIBFTPSITE}
+ Directory: @value{NEWLIBFTPDIR}
+ File: @value{NEWLIBTAR}
+@c @ifset use-html
+ URL: @uref{ftp://@value{NEWLIBFTPSITE}@value{NEWLIBFTPDIR}/@value{NEWLIBTAR},,ftp://@value{NEWLIBFTPSITE}@value{NEWLIBFTPDIR}/@value{NEWLIBTAR}}
+@c URL: ftp://@value{NEWLIBFTPSITE}@value{NEWLIBFTPDIR}/@value{NEWLIBTAR}
+@c @end ifset
+@end example
+
+@need 1000
+@subheading RTEMS Specific Tool Patches and Scripts
+@example
+ FTP Site: @value{RTEMSFTPSITE}
+ Directory: @value{RTEMSFTPDIR}/@value{VERSION}
+@ifset BINUTILSPATCHVERSION
+ File: @value{BINUTILSRTEMSPATCH}
+@end ifset
+@ifset NEWLIBPATCHVERSION
+ File: @value{NEWLIBRTEMSPATCH}
+@end ifset
+@ifset GCCPATCHVERSION
+ File: @value{GCCRTEMSPATCH}
+@end ifset
+@ifset use-html
+@c URL: @uref{ftp://@value{RTEMSFTPSITE}@value{RTEMSFTPDIR}/SOURCES,Download RTEMS Patches and Scripts}
+ URL: ftp://@value{RTEMSFTPSITE}@value{RTEMSFTPDIR}/SOURCES
+@end ifset
+@end example
+
+@c
+@c Unarchiving the Tools
+@c
+@subsection Unarchiving the Tools
+
+NOTE: This step is required if building BINUTILS, GCC, and NEWLIB
+using the procedure described in @ref{Using configure and make}.
+It is @b{NOT} required if using the procedure
+described in @ref{Using RPM to Build BINUTILS GCC and NEWLIB}.
+
+GNU source distributions are archived using @code{tar} and
+compressed using either @code{gzip} or @code{bzip}.
+If compressed with @code{gzip}, the extension @code{.gz} is used.
+If compressed with @code{bzip}, the extension @code{.bz2} is used.
+
+While in the @code{tools} directory, unpack the compressed
+tar files for BINUTILS, GCC, and NEWLIB using the appropriate
+command based upon the compression program used.
+
+@example
+cd tools
+tar xzf ../archive/TOOLNAME.tar.gz # for gzip'ed tools
+tar xjf ../archive/TOOLNAME.tar.bz2 # for bzip'ed tools
+@end example
+
+After the compressed tar files have been unpacked using
+the appropriate commands, the following
+directories will have been created under tools.
+
+@itemize @bullet
+@item @value{BINUTILSUNTAR}
+@item @value{GCCUNTAR}
+@item @value{NEWLIBUNTAR}
+@end itemize
+
+The tree should look something like the following figure:
+
+@example
+@group
+/whatever/prefix/you/choose/
+ archive/
+ @value{GCCTAR}
+ @value{BINUTILSTAR}
+ @value{NEWLIBTAR}
+@ifset GCCPATCHVERSION
+ @value{GCCRTEMSPATCH}
+@end ifset
+@ifset BINUTILSPATCHVERSION
+ @value{BINUTILSRTEMSPATCH}
+@end ifset
+@ifset NEWLIBPATCHVERSION
+ @value{NEWLIBRTEMSPATCH}
+@end ifset
+ tools/
+ @value{BINUTILSUNTAR}/
+ @value{GCCUNTAR}/
+ @value{NEWLIBUNTAR}/
+@end group
+@end example
+
+@c
+@c Applying RTEMS Patches
+@c
+
+@subsection Applying RTEMS Patches
+
+NOTE: This step is required if building BINUTILS, GCC, and NEWLIB
+using the procedures described in @ref{Using configure and make}.
+It is @b{NOT} required if using the procedure
+described in @ref{Using RPM to Build BINUTILS GCC and NEWLIB}.
+
+This section describes the process of applying the RTEMS patches
+to GCC, NEWLIB, and BINUTILS.
+
+@c
+@c GCC patches
+@c
+
+@subheading Apply RTEMS Patch to GCC
+
+@ifclear GCCPATCHVERSION
+No RTEMS specific patches are required for @value{GCCUNTAR} to
+support @value{RTEMSVERSION}.
+@end ifclear
+
+@ifset GCCPATCHVERSION
+
+Apply the patch using the following command sequence:
+
+@example
+cd tools/@value{GCCUNTAR}
+cat ../../archive/@value{GCCRTEMSPATCH} | \
+ patch -p1
+@end example
+
+If the patch was compressed with the @code{gzip} program, it will
+have a suffix of @code{.gz} and you should use @code{zcat} instead
+of @code{cat} as shown above. If the patch was compressed with
+the @code{gzip} program, it will have a suffix of @code{.bz2} and
+you should use @code{bzcat} instead of @code{cat} as shown above.
+
+Check to see if any of these patches have been rejected using the following
+sequence:
+
+@example
+cd tools/@value{GCCUNTAR}
+find . -name "*.rej" -print
+@end example
+
+If any files are found with the .rej extension, a patch has been rejected.
+This should not happen with a good patch file which is properly applied.
+
+@end ifset
+
+@c
+@c BINUTILS patches
+@c
+
+@subheading Apply RTEMS Patch to binutils
+
+@ifclear BINUTILSPATCHVERSION
+No RTEMS specific patches are required for @value{BINUTILSUNTAR} to
+support @value{RTEMSVERSION}.
+@end ifclear
+
+@ifset BINUTILSPATCHVERSION
+Apply the patch using the following command sequence:
+
+@example
+cd tools/@value{BINUTILSUNTAR}
+cat ../../archive/@value{BINUTILSRTEMSPATCH} | \
+ patch -p1
+@end example
+
+If the patch was compressed with the @code{gzip} program, it will
+have a suffix of @code{.gz} and you should use @code{zcat} instead
+of @code{cat} as shown above. If the patch was compressed with
+the @code{gzip} program, it will have a suffix of @code{.bz2} and
+you should use @code{bzcat} instead of @code{cat} as shown above.
+
+Check to see if any of these patches have been rejected using the following
+sequence:
+
+@example
+cd tools/@value{BINUTILSUNTAR}
+find . -name "*.rej" -print
+@end example
+
+If any files are found with the .rej extension, a patch has been rejected.
+This should not happen with a good patch file which is properly applied.
+
+@end ifset
+
+@c
+@c Newlib patches
+@c
+
+@subheading Apply RTEMS Patch to newlib
+
+@ifclear NEWLIBPATCHVERSION
+No RTEMS specific patches are required for @value{NEWLIBUNTAR} to
+support @value{RTEMSVERSION}.
+@end ifclear
+
+@ifset NEWLIBPATCHVERSION
+
+Apply the patch using the following command sequence:
+
+@example
+cd tools/@value{NEWLIBUNTAR}
+cat ../../archive/@value{NEWLIBRTEMSPATCH} | \
+ patch -p1
+@end example
+
+If the patch was compressed with the @code{gzip} program, it will
+have a suffix of @code{.gz} and you should use @code{zcat} instead
+of @code{cat} as shown above. If the patch was compressed with
+the @code{gzip} program, it will have a suffix of @code{.bz2} and
+you should use @code{bzcat} instead of @code{cat} as shown above.
+
+Check to see if any of these patches have been rejected using the following
+sequence:
+
+@example
+cd tools/@value{NEWLIBUNTAR}
+find . -name "*.rej" -print
+@end example
+
+If any files are found with the .rej extension, a patch has been rejected.
+This should not happen with a good patch file which is properly applied.
+
+@end ifset
+
+
+@c
+@c Compiling and Installing BINUTILS GCC and NEWLIB
+@c
+
+@subsection Compiling and Installing BINUTILS GCC and NEWLIB
+
+There are two supported methods to compile and install BINUTILS, GCC,
+and NEWLIB:
+
+@itemize @bullet
+@item RPM
+@item direct invocation of @code{configure} and @code{make}
+@end itemize
+
+Direct invocation of @code{configure} and @code{make} provides more control
+and easier recovery from problems when building.
+
+@c
+@c Using RPM to Build BINUTILS GCC and NEWLIB
+@c
+
+@subsubsection Using RPM to Build BINUTILS GCC and NEWLIB
+
+NOTE: The procedures described in the following sections must
+be completed before this step:
+
+@itemize @bullet
+@item @ref{Obtain Source and Patches for BINUTILS GCC and NEWLIB}
+@end itemize
+
+RPM automatically unarchives the source and applies any needed
+patches so you do @b{NOT} have to manually perform the procedures
+described @ref{Unarchiving the Tools} and
+@ref{Applying RTEMS Patches}.
+
+This section describes the process of building binutils, gcc, and
+newlib using RPM. RPM is a packaging format which can be used to
+distribute binary files as well as to capture the procedure and
+source code used to produce those binary files. Before
+attempting to build any RPM from source, it is necessary to
+ensure that all required source and patches are in the @code{SOURCES}
+directory under the RPM root (probably @code{/usr/src/redhat} or
+@code{/usr/local/src/redhat}) on your machine. This procedure
+starts by installing the source RPMs as shown in the following
+example:
+
+@example
+rpm -i @value{RTEMSRPMPREFIX}i386-rtems-binutils-collection-@value{BINUTILSVERSION}-@value{BINUTILSRPMRELEASE}.nosrc.rpm
+rpm -i @value{RTEMSRPMPREFIX}i386-rtems-gcc-newlib-gcc@value{GCCVERSION}newlib@value{NEWLIBVERSION}-@value{GCCRPMRELEASE}.nosrc.rpm
+@end example
+
+The RTEMS tool source RPMS are called "nosrc" to indicate that one or
+more source files required to produce the RPMs are not present.
+The RTEMS source RPMs typically include all required patches, but do not
+include the large @code{.tar.gz} or @code{.tgz} files for
+each component such as BINUTILS, GCC, or NEWLIB. These are shared
+by all RTEMS RPMs regardless of target CPU and there was no reason
+to duplicate them. You will have to get the required source
+archive files by hand and place them in the @code{SOURCES} directory
+before attempting to build. If you forget to do this, RPM is
+smart -- it will tell you what is missing. To determine what is
+included or referenced by a particular RPM, use a command like the
+following:
+
+@example
+@c Don't use @value{GCC*} below. This is an example
+$ rpm -q -l -p @value{RTEMSRPMPREFIX}i386-rtems-gcc-newlib-gcc3.2.3newlib1.11.0-1.nosrc.rpm
+gcc-3.2.3-rtems-20030507a.diff
+i386-rtems-gcc-3.2.3-newlib-1.11.0.spec
+newlib-1.11.0-rtems-20030507.diff
+@end example
+
+Notice that there are patch files (the @code{.diff} files) and a file
+describing the build procedure and files produced (the @code{.spec} file),
+but no source archives (the @code{*tar.*} files).
+When installing this source RPM
+(@code{rpm -U @value{RTEMSRPMPREFIX}i386-rtems-gcc-newlib-gcc3.2.3newlib1.11.0-1.nosrc.rpm}),
+the @code{.spec} file is placed in the @code{SPECS} directory under the RPM root
+directory, while the @code{*.diff} files are placed into the @code{SOURCES}
+directory.
+
+@c
+@c Configuring and Building BINUTILS using RPM
+@c
+
+@subheading Configuring and Building BINUTILS using RPM
+
+The following example illustrates the invocation of RPM to build a new,
+locally compiled, binutils binary RPM that matches the installed source
+RPM. This example assumes that all of the required source is installed.
+
+@example
+cd <RPM_ROOT_DIRECTORY>/SPECS
+rpm -bb i386-rtems-binutils-@value{BINUTILSVERSION}.spec
+@end example
+
+If the build completes successfully, RPMS like the following will
+be generated in a build-host architecture specific subdirectory
+of the RPMS directory under the RPM root directory.
+
+@example
+@value{RTEMSRPMPREFIX}rtems-base-binutils-@value{BINUTILSVERSION}-@value{BINUTILSRPMRELEASE}.i386.rpm
+@value{RTEMSRPMPREFIX}i386-rtems-binutils-@value{BINUTILSVERSION}-@value{BINUTILSRPMRELEASE}.i386.rpm
+@end example
+
+NOTE: It may be necessary to remove the build tree in the
+@code{BUILD} directory under the RPM root directory.
+
+@c
+@c Configuring and Building GCC and NEWLIB using RPM
+@c
+
+@subheading Configuring and Building GCC and NEWLIB using RPM
+
+The following example illustrates the invocation of RPM to build a new,
+locally compiled, set of GCC and NEWLIB binary RPMs that match the
+installed source RPM. It is also necessary to install the BINUTILS
+RPMs and place them in your PATH. This example assumes that all of
+the required source is installed.
+
+@example
+cd <RPM_ROOT_DIRECTORY>/RPMS/i386
+rpm -i @value{RTEMSRPMPREFIX}rtems-base-binutils-@value{BINUTILSVERSION}-@value{BINUTILSRPMRELEASE}.i386.rpm
+rpm -i @value{RTEMSRPMPREFIX}i386-rtems-binutils-@value{BINUTILSVERSION}-@value{BINUTILSRPMRELEASE}.i386.rpm
+export PATH=@value{RTEMSPREFIX}/bin:$PATH
+cd <RPM_ROOT_DIRECTORY>/SPECS
+rpm -bb i386-rtems-gcc-@value{GCCVERSION}-newlib-@value{NEWLIBVERSION}.spec
+@end example
+
+If the build completes successfully, a set of RPMS like the following will
+be generated in a build-host architecture specific subdirectory
+of the RPMS directory under the RPM root directory.
+
+@example
+@value{RTEMSRPMPREFIX}rtems-base-gcc-gcc@value{GCCVERSION}newlib@value{NEWLIBVERSION}-@value{GCCRPMRELEASE}.i386.rpm
+@value{RTEMSRPMPREFIX}rtems-base-g77-gcc@value{GCCVERSION}newlib@value{NEWLIBVERSION}-@value{GCCRPMRELEASE}.i386.rpm
+@value{RTEMSRPMPREFIX}rtems-base-gcj-gcc@value{GCCVERSION}newlib@value{NEWLIBVERSION}-@value{GCCRPMRELEASE}.i386.rpm
+@value{RTEMSRPMPREFIX}i386-rtems-gcc-gcc@value{GCCVERSION}newlib@value{NEWLIBVERSION}-@value{GCCRPMRELEASE}.i386.rpm
+@value{RTEMSRPMPREFIX}i386-rtems-g77-gcc@value{GCCVERSION}newlib@value{NEWLIBVERSION}-@value{GCCRPMRELEASE}.i386.rpm
+@value{RTEMSRPMPREFIX}i386-rtems-gcj-gcc@value{GCCVERSION}newlib@value{NEWLIBVERSION}-@value{GCCRPMRELEASE}.i386.rpm
+@value{RTEMSRPMPREFIX}i386-rtems-objc-gcc@value{GCCVERSION}newlib@value{NEWLIBVERSION}-@value{GCCRPMRELEASE}.i386.rpm
+@end example
+
+NOTE: Some targets do not support building all languages.
+
+NOTE: It may be necessary to remove the build tree in the
+@code{BUILD} directory under the RPM root directory.
+
+@c
+@c Using configure and make
+@c
+
+@subsubsection Using configure and make
+
+NOTE: The procedures described in the following sections must
+be completed before this step:
+
+@itemize @bullet
+@item @ref{Obtain Source and Patches for BINUTILS GCC and NEWLIB}
+@item @ref{Unarchiving the Tools}
+@item @ref{Applying RTEMS Patches}
+@end itemize
+
+This section describes the process of building binutils, gcc, and
+newlib manually using @code{configure} and @code{make} directly.
+
+@c
+@c Configuring and Building BINUTILS
+@c
+
+@subheading Configuring and Building BINUTILS
+
+The following example illustrates the invocation of
+@code{configure} and @code{make}
+to build and install @value{BINUTILSUNTAR} for the
+sparc-rtems target:
+
+@example
+mkdir b-binutils
+cd b-binutils
+../@value{BINUTILSUNTAR}/configure --target=sparc-rtems \
+ --prefix=@value{RTEMSPREFIX}
+make all
+make info
+make install
+@end example
+
+After @value{BINUTILSUNTAR} is built and installed the
+build directory @code{b-binutils} may be removed.
+
+For more information on the invocation of @code{configure}, please
+refer to the documentation for @value{BINUTILSUNTAR} or
+invoke the @value{BINUTILSUNTAR} @code{configure} command with the
+@code{--help} option.
+
+NOTE: The shell PATH variable needs to be updated to include the path
+the binutils has been installed in. This the prefix used above with
+@file{bin} post-fixed.
+
+@example
+export PATH=$PATH:@value{RTEMSPREFIX}/bin
+@end example
+
+Failure to have the binutils in the path will cause the GCC and NEWLIB
+build to fail with an error message similar to:
+
+@example
+sparc-rtems-ar: command not found
+@end example
+
+@c
+@c Configuring and Building GCC and NEWLIB
+@c
+
+@subheading Configuring and Building GCC and NEWLIB
+
+Before building @value{GCCUNTAR} and @value{NEWLIBUNTAR},
+@value{BINUTILSUNTAR} must be installed and the directory
+containing those executables must be in your PATH.
+
+The C Library is built as a subordinate component of
+@value{GCCUNTAR}. Because of this, the @value{NEWLIBUNTAR}
+directory source must be available inside the @value{GCCUNTAR}
+source tree. This is normally accomplished using a symbolic
+link as shown in this example:
+
+@example
+cd @value{GCCUNTAR}
+ln -s ../@value{NEWLIBUNTAR}/newlib .
+@end example
+
+The following example illustrates the invocation of
+@code{configure} and @code{make}
+to build and install @value{GCCUNTAR} with only
+C and C++ support for the sparc-rtems target:
+
+@example
+mkdir b-gcc
+cd b-gcc
+../@value{GCCUNTAR}/configure --target=sparc-rtems \
+ --with-gnu-as --with-gnu-ld --with-newlib --verbose \
+ --enable-threads --enable-languages="c,c++" \
+ --prefix=@value{RTEMSPREFIX}
+make all
+make info
+make install
+@end example
+
+After @value{GCCUNTAR} is built and installed the
+build directory @code{b-gcc} may be removed.
+
+For more information on the invocation of @code{configure}, please
+refer to the documentation for @value{GCCUNTAR} or
+invoke the @value{GCCUNTAR} @code{configure} command with the
+@code{--help} option.
+
+@c
+@c Building GCC with Ada Support
+@c
+@subheading Building GCC with Ada Support
+
+If you want a GCC toolset that includes support for Ada
+(e.g. GNAT), there are some additional requirements on
+the host environment and additional build steps to perform.
+It is critical that you use the same version of GCC/GNAT as
+the native compiler. GNAT must be compiled with an Ada compiler
+and when building a GNAT cross-compiler, it should be
+the same version of GNAT itself.
+
+The build procedure is the same until the configure step.
+A GCC toolset with GNAT enabled requires that @code{ada}
+be included in the set of enabled languages.
+The following example illustrates the invocation of
+@code{configure} and @code{make}
+to build and install @value{GCCUNTAR} with only
+C, C++, and Ada support for the sparc-rtems target:
+
+@example
+mkdir b-gcc
+cd @value{GCCUNTAR}/gcc/ada
+touch treeprs.ads [es]info.h nmake.ad[bs]
+cd ../../../b-gcc
+../@value{GCCUNTAR}/configure --target=sparc-rtems \
+ --with-gnu-as --with-gnu-ld --with-newlib --verbose \
+ --enable-threads --enable-languages="c,c++,ada" \
+ --prefix=@value{RTEMSPREFIX}
+make all
+make info
+make -C gcc cross-gnattools
+make -C gcc ada.all.cross
+make -C gcc GNATLIBCFLAGS="USER_SELECTED_CPU_CFLAGS" gnatlib
+make install
+@end example
+
+After @value{GCCUNTAR} is built and installed the
+build directory @code{b-gcc} may be removed.
+
+@c
+@c Building the GNU Debugger GDB
+@c
+
+@section Building the GNU Debugger GDB
+
+NOTE: This step is NOT required if prebuilt executables for
+the GNU Debugger GDB were installed.
+
+The GNU Debugger GDB supports many configurations but requires some
+means of communicating between the host computer and target board.
+This communication can be via a serial port, Ethernet, BDM, or ROM emulator.
+The communication protocol can be the GDB remote protocol or GDB
+can talk directly to a ROM monitor. This setup is target board
+specific. The following configurations have been
+successfully used with RTEMS applications:
+
+@itemize @bullet
+@item BDM with ColdFire, 683xx, MPC860 CPUs
+@item Motorola Mxxxbug found on M68xxx VME boards
+@item Motorola PPCbug found on PowerPC VME, CompactPCI, and MTX boards
+@item ARM based Cogent EDP7312
+@item PC's using various Intel and AMD CPUs including i386,
+i486, Pentium and above, and Athlon
+@item PowerPC Instruction Simulator in GDB (PSIM)
+@item MIPS Instruction Simulator in GDB (JMR3904)
+@item Sparc Instruction Simulator in GDB (SIS)
+@item Sparc Instruction Simulator (TSIM)
+@item DINK32 on various PowerPC boards
+@end itemize
+
+GDB is currently RTEMS thread/task aware only if you are using the
+remote debugging support via Ethernet. These are configured
+using gdb targets of the form CPU-RTEMS. Note the capital RTEMS.
+
+It is recommended that when toolset binaries are available for
+your particular host, that they be used. Prebuilt binaries
+are much easier to install but in the case of gdb may or may
+not include support for your particular target board.
+
+@c
+@c Obtain Source and Patches for GDB
+@c
+
+@subsection Obtain Source and Patches for GDB
+
+NOTE: This step is required for all methods of building GDB.
+
+This section lists the components required to build GDB
+from source to target RTEMS. These files should be
+placed in your @code{archive} directory. Included are the locations
+of each component as well as any required RTEMS specific patches.
+
+@need 1000
+@subheading @value{GDBUNTAR}
+@example
+ FTP Site: @value{GDBFTPSITE}
+ Directory: @value{GDBFTPDIR}
+ File: @value{GDBTAR}
+ URL: @uref{@value{GDBFTPURL},,@value{GDBFTPURL}}
+@end example
+
+@need 1000
+@subheading RTEMS Specific Tool Patches and Scripts
+@example
+ FTP Site: @value{RTEMSFTPSITE}
+ Directory: @value{RTEMSFTPDIR}/SOURCES
+@ifset GDBPATCHVERSION
+ File: @value{GDBRTEMSPATCH}
+ URL: @uref{ftp://@value{RTEMSFTPSITE}@value{RTEMSFTPDIR}/SOURCES/@value{GDBRTEMSPATCH},,ftp://@value{RTEMSFTPSITE}@value{RTEMSFTPDIR}/SOURCES/@value{GDBRTEMSPATCH}}
+@end ifset
+@end example
+
+@c
+@c Unarchiving the GDB Distribution
+@c
+@subsection Unarchiving the GDB Distribution
+
+Use the following commands to unarchive the GDB distribution:
+
+@example
+cd tools
+tar xzf ../archive/@value{GDBTAR}
+@end example
+
+The directory @value{GDBUNTAR} is created under the tools directory.
+
+@c
+@c Applying RTEMS Patch to GDB
+@c
+
+@subsection Applying RTEMS Patch to GDB
+
+@ifclear GDBPATCHVERSION
+No RTEMS specific patches are required for @value{GDBVERSION} to
+support @value{RTEMSVERSION}.
+@end ifclear
+
+@ifset GDBPATCHVERSION
+
+Apply the patch using the following command sequence:
+
+@example
+cd tools/@value{GDBUNTAR}
+cat archive/@value{GDBRTEMSPATCH} | \
+ patch -p1
+@end example
+
+If the patch was compressed with the @code{gzip} program, it will
+have a suffix of @code{.gz} and you should use @code{zcat} instead
+of @code{cat} as shown above. If the patch was compressed with
+the @code{gzip} program, it will have a suffix of @code{.bz2} and
+you should use @code{bzcat} instead of @code{cat} as shown above.
+
+Check to see if any of these patches have been rejected using the following
+sequence:
+
+@example
+cd tools/@value{GDBUNTAR}
+find . -name "*.rej" -print
+@end example
+
+If any files are found with the .rej extension, a patch has been rejected.
+This should not happen with a good patch file.
+
+@end ifset
+
+@c
+@c Compiling and Installing the GNU Debugger GDB
+@c
+
+@subsection Compiling and Installing the GNU Debugger GDB
+
+There are three methods of building the GNU Debugger:
+
+@itemize @bullet
+@item RPM
+@item direct invocation of @code{configure} and @code{make}
+@end itemize
+
+Direct invocation of @code{configure} and @code{make} provides more control
+and easier recovery from problems when building.
+
+@c
+@c Using RPM to Build GDB
+@c
+
+@subsubsection Using RPM to Build GDB
+
+This section describes the process of building binutils, gcc, and
+newlib using RPM. RPM is a packaging format which can be used to
+distribute binary files as well as to capture the procedure and
+source code used to produce those binary files. Before
+attempting to build any RPM from source, it is necessary to
+ensure that all required source and patches are in the @code{SOURCES}
+directory under the RPM root (probably @code{/usr/src/redhat} or
+@code{/usr/local/src/redhat}) on your machine. This procedure
+starts by installing the source RPMs as shown in the following
+example:
+
+@example
+rpm -i @value{RTEMSRPMPREFIX}i386-rtems-gdb-collection-@value{GDBVERSION}-@value{GDBRPMRELEASE}.nosrc.rpm
+@end example
+
+Because RTEMS tool RPMS are called "nosrc" to indicate that one or
+more source files required to produce the RPMs are not present.
+The RTEMS source GDB RPM does not include the large @code{.tar.gz} or
+@code{.tgz} files for GDB. This is shared by all RTEMS RPMs
+regardless of target CPU and there was no reason
+to duplicate them. You will have to get the required source
+archive files by hand and place them in the @code{SOURCES} directory
+before attempting to build. If you forget to do this, RPM is
+smart -- it will tell you what is missing. To determine what is
+included or referenced by a particular RPM, use a command like the
+following:
+
+@example
+$ rpm -q -l -p @value{RTEMSRPMPREFIX}i386-rtems-gdb-collection-@value{GDBVERSION}-@value{GDBRPMRELEASE}.nosrc.rpm
+gdb-@value{GDBVERSION}-rtems-@value{GDBPATCHVERSION}.diff
+gdb-@value{GDBVERSION}.tar.gz
+i386-rtems-gdb-@value{GDBVERSION}.spec
+@end example
+
+Notice that there is a patch file (the @code{.diff} file), a source archive
+file (the @code{.tar.gz}), and a file describing the build procedure and
+files produced (the @code{.spec} file). The @code{.spec} file is placed
+in the @code{SPECS} directory under the RPM root directory.
+
+@c
+@c Configuring and Building GDB using RPM
+@c
+
+@subheading Configuring and Building GDB using RPM
+
+The following example illustrates the invocation of RPM to build a new,
+locally compiled, binutils binary RPM that matches the installed source
+RPM. This example assumes that all of the required source is installed.
+
+@example
+cd <RPM_ROOT_DIRECTORY>/SPECS
+rpm -bb i386-rtems-gdb-@value{GDBVERSION}.spec
+@end example
+
+If the build completes successfully, RPMS like the following will
+be generated in a build-host architecture specific subdirectory
+of the RPMS directory under the RPM root directory.
+
+@example
+@value{RTEMSRPMPREFIX}rtems-base-gdb-@value{GDBVERSION}-@value{GDBRPMRELEASE}.i386.rpm
+@value{RTEMSRPMPREFIX}i386-rtems-gdb-@value{GDBVERSION}-@value{GDBRPMRELEASE}.i386.rpm
+@end example
+
+NOTE: It may be necessary to remove the build tree in the
+@code{BUILD} directory under the RPM root directory.
+
+@c
+@c Using the GDB configure Script Directly
+@c
+
+@subsubsection Using the GDB configure Script Directly
+
+This section describes how to configure the GNU debugger for
+RTEMS targets using @code{configure} and @code{make} directly.
+The following example illustrates the invocation of @code{configure}
+and @code{make} to build and install @value{GDBUNTAR} for the
+m68k-rtems target:
+
+@example
+mkdir b-gdb
+cd b-gdb
+../@value{GDBUNTAR}/configure --target=m68k-rtems \
+ --prefix=@value{RTEMSPREFIX}
+make all
+make info
+make install
+@end example
+
+For some configurations, it is necessary to specify extra options
+to @code{configure} to enable and configure option components
+such as a processor simulator. The following is a list of
+configurations for which there are extra options:
+
+@table @b
+@item i960-rtems
+@code{--enable-sim}
+
+@item powerpc-rtems
+@code{--enable-sim --enable-sim-powerpc --enable-sim-timebase --enable-sim-hardware}
+
+@item sparc-rtems
+@code{--enable-sim}
+
+@end table
+
+After @value{GDBUNTAR} is built and installed the
+build directory @code{b-gdb} may be removed.
+
+For more information on the invocation of @code{configure}, please
+refer to the documentation for @value{GDBUNTAR} or
+invoke the @value{GDBUNTAR} @code{configure} command with the
+@code{--help} option.
+
+@c
+@c Common Problems
+@c
+
+@section Common Problems
+
+@subsection Error Message Indicates Invalid Option to Assembler
+
+If a message like this is printed then the new cross compiler
+is most likely using the native assembler instead of the cross
+assembler or vice-versa (native compiler using new cross assembler).
+This can occur for one of the following reasons:
+
+@itemize @bullet
+
+@item Binutils Patch Improperly Applied
+@item Binutils Not Built
+@item Current Directory is in Your PATH
+
+@end itemize
+
+If you are using binutils 2.9.1 or newer with certain older versions of
+gcc, they do not agree on what the name of the newly
+generated cross assembler is. Older binutils called it @code{as.new}
+which became @code{as.new.exe} under Windows. This is not a valid
+file name, so @code{as.new} is now called @code{as-new}. By using the latest
+released tool versions and RTEMS patches, this problem will be avoided.
+
+If binutils did not successfully build the cross assembler, then
+the new cross gcc (@code{xgcc}) used to build the libraries can not
+find it. Make sure the build of the binutils succeeded.
+
+If you include the current directory in your PATH, then there
+is a chance that the native compiler will accidentally use
+the new cross assembler instead of the native one. This usually
+indicates that "." is before the standard system directories
+in your PATH. As a general rule, including "." in your PATH
+is a security risk and should be avoided. Remove "." from
+your PATH.
+
+NOTE: In some environments, it may be difficult to remove "."
+completely from your PATH. In this case, make sure that "."
+is after the system directories containing "as" and "ld".
+
+@subsection Error Messages Indicating Configuration Problems
+
+If you see error messages like the following,
+
+@itemize @bullet
+
+@item cannot configure libiberty
+@item coff-emulation not found
+@item etc.
+
+@end itemize
+
+Then it is likely that one or more of your gnu tools is
+already configured locally in its source tree. You can check
+for this by searching for the @code{config.status} file
+in the various tool source trees. The following command
+does this for the binutils source:
+
+@example
+find @value{BINUTILSUNTAR} -name config.status -print
+@end example
+
+The solution for this is to execute the command
+@code{make distclean} in each of the GNU tools
+root source directory. This should remove all
+generated files including Makefiles.
+
+This situation usually occurs when you have previously
+built the tool source for some non-RTEMS target. The
+generated configuration specific files are still in
+the source tree and the include path specified during
+the RTEMS build accidentally picks up the previous
+configuration. The include path used is something like
+this:
+
+@example
+-I../../@value{BINUTILSUNTAR}/gcc -I/@value{BINUTILSUNTAR}/gcc/include -I.
+@end example
+
+Note that the tool source directory is searched before the
+build directory.
+
+This situation can be avoided entirely by never using
+the source tree as the build directory -- even for
+
diff --git a/doc/started/buildrt.t b/doc/started/buildrt.t
new file mode 100644
index 0000000000..91ff840161
--- /dev/null
+++ b/doc/started/buildrt.t
@@ -0,0 +1,178 @@
+@c
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Building RTEMS
+
+@section Obtain the RTEMS Source Code
+
+This section provides pointers to the RTEMS source code and
+Hello World example program. These files should be
+placed in your @code{archive} directory.
+
+@subheading @value{RTEMSVERSION}
+@example
+ FTP Site: @value{RTEMSFTPSITE}
+ Directory: @value{RTEMSFTPDIR}/@value{VERSION}
+ File: @value{RTEMSTAR}
+@ifset use-html
+@c URL: @uref{ftp://@value{RTEMSFTPSITE}@value{RTEMSFTPDIR}/@value{VERSION}, Download RTEMS components}
+ URL: ftp://@value{RTEMSFTPSITE}@value{RTEMSFTPDIR}/@value{VERSION}
+@end ifset
+@end example
+
+@subheading RTEMS Examples including Hello World
+@example
+ FTP Site: @value{RTEMSFTPSITE}
+ Directory: @value{RTEMSFTPDIR}/@value{VERSION}
+ File: examples-@value{VERSION}.tar.bz2
+ URL: @uref{ftp://@value{RTEMSFTPSITE}@value{RTEMSFTPDIR}/@value{VERSION}/examples-@value{VERSION}.tar.bz2,,ftp://@value{RTEMSFTPSITE}@value{RTEMSFTPDIR}/@value{VERSION}/examples-@value{VERSION}.tar.bz2}
+@end example
+
+@c
+@c Unarchive the RTEMS Source
+@c
+
+@section Unarchive the RTEMS Source
+
+Use the following command sequence to unpack the RTEMS source into the
+tools directory:
+
+@example
+cd tools
+tar xjf ../archive/@value{RTEMSTAR}
+@end example
+
+This creates the directory @value{RTEMSUNTAR}.
+
+
+@section Add <INSTALL_POINT>/bin to Executable PATH
+
+In order to compile RTEMS, you must have the cross compilation toolset
+in your search path. The following command appends the directory
+where the tools were installed prior to this point:
+
+@example
+export PATH=$PATH:<INSTALL_POINT>/bin
+@end example
+
+NOTE: The above command is in Bourne shell (@code{sh}) syntax and
+should work with the Korn (@code{ksh}) and GNU Bourne Again Shell
+(@code{bash}). It will not work with the C Shell (@code{csh}) or
+derivatives of the C Shell.
+
+@section Verifying the Operation of the Cross Toolset
+
+In order to insure that the cross-compiler is invoking the correct
+subprograms (like @code{as} and @code{ld}), one can test assemble
+a small program. When in verbose mode, @code{gcc} prints out information
+showing where it found the subprograms it invokes. In a temporary
+working directory, place the following function in a file named @code{f.c}:
+
+@example
+int f( int x )
+@{
+ return x + 1;
+@}
+@end example
+
+Then assemble the file using a command similar to the following:
+
+@example
+m68k-rtems-gcc -v -S f.c
+@end example
+
+Where @code{m68k-rtems-gcc} should be changed to match the installed
+name of your cross compiler. The result of this command will be
+a sequence of output showing where the cross-compiler searched for
+and found its subcomponents. Verify that these paths correspond
+to your <INSTALL_POINT>.
+
+Look at the created file @code{f.s} and verify that it is in fact
+for your target processor.
+
+Then try to compile the file @code{f.c} directly to object code
+using a command like the following:
+
+@example
+m68k-rtems-gcc -v -c f.c
+@end example
+
+If this produces messages that indicate the assembly code is
+not valid, then it is likely that you have fallen victim to
+one of the problems described in
+@ref{Error Message Indicates Invalid Option to Assembler}
+Don't feel bad about this, one of the most common installation errors
+is for the cross-compiler not to be able to find the cross assembler
+and default to using the native @code{as}. This can result in very confusing
+error messages.
+
+@section Building RTEMS for a Specific Target and BSP
+
+This section describes how to configure and build RTEMS
+so that it is specifically tailored for your BSP and the
+CPU model it uses. There is currently only one supported
+method to compile and install RTEMS:
+
+@itemize @bullet
+@item direct invocation of @code{configure} and @code{make}
+@end itemize
+
+Direct invocation of @code{configure} and @code{make} provides more control
+and easier recovery from problems when building.
+
+This section describes how to build RTEMS.
+
+@subsection Using the RTEMS configure Script Directly
+
+Make a build directory under tools and build the RTEMS product in this
+directory. The @code{../@value{RTEMSUNTAR}/configure}
+command has numerous command line
+arguments. These arguments are discussed in detail in documentation that
+comes with the RTEMS distribution. A full list of these arguments can be
+obtained by running @code{../@value{RTEMSUNTAR}/configure --help}
+If you followed the procedure
+described in the section @ref{Unarchive the RTEMS Source}, these
+configuration options can be found in the file
+tools/@value{RTEMSUNTAR}/README.configure.
+
+@b{NOTE}: The GNAT/RTEMS run-time implementation is based on the POSIX
+API. Thus the RTEMS configuration for a GNAT/RTEMS environment MUST
+include the @code{--enable-posix} flag.
+
+The following shows the command sequence required to configure,
+compile, and install RTEMS with the POSIX API, FreeBSD TCP/IP,
+and C++ support disabled. RTEMS will be built to target
+the @code{BOARD_SUPPORT_PACKAGE} board.
+
+@example
+mkdir build-rtems
+cd build-rtems
+../@value{RTEMSUNTAR}/configure --target=<TARGET_CONFIGURATION> \
+ --disable-posix --disable-networking --disable-cxx \
+ --enable-rtemsbsp=<BOARD_SUPPORT_PACKAGE>\
+ --prefix=<INSTALL_POINT>
+make all install
+@end example
+
+Where the list of currently supported <TARGET_CONFIGURATION>'s and
+<BOARD_SUPPORT_PACKAGE>'s can be found in
+tools/@value{RTEMSUNTAR}/README.configure.
+
+<INSTALL_POINT> is typically the installation point for the
+tools and defaults to @code{@value{RTEMSPREFIX}}.
+
+BSP is a supported BSP for the selected CPU family. The list of
+supported BSPs may be found in the file
+tools/@value{RTEMSUNTAR}/README.configure
+in the RTEMS source tree. If the BSP parameter is not specified,
+then all supported BSPs for the selected CPU family will be built.
+
+@b{NOTE:} The POSIX API must be enabled to use GNAT/RTEMS.
+
+@b{NOTE:} The @code{make} utility used should be GNU make.
diff --git a/doc/started/intro.t b/doc/started/intro.t
new file mode 100644
index 0000000000..bd59de7a78
--- /dev/null
+++ b/doc/started/intro.t
@@ -0,0 +1,189 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Introduction
+
+The purpose of this document is to guide you through the process of
+installing a GNU cross development environment to use with RTEMS.
+
+If you are already familiar with the concepts behind a cross compiler and
+have a background in Unix, these instructions should provide the bare
+essentials for performing a setup of the following items:
+
+@itemize @bullet
+@item GNU Cross Compilation Tools for RTEMS on your build-host system
+@item RTEMS OS for the target
+@item GDB Debugger
+@end itemize
+
+The remainder of this chapter provides background information on real-time
+embedded systems and cross development and an overview of other
+resources of interest on the Internet. If you are not familiar with
+real-time embedded systems or the other areas, please read those sections.
+These sections will help familiarize you with the
+types of systems RTEMS is designed to be used in and the cross development
+process used when developing RTEMS applications.
+
+@section Real-Time Embedded Systems
+
+Real-time embedded systems are found in practically every facet of our
+everyday lives. Today's systems range from the common telephone, automobile
+control systems, and kitchen appliances to complex air traffic control
+systems, military weapon systems, and production line control including
+robotics and automation. However, in the current climate of rapidly changing
+technology, it is difficult to reach a consensus on the definition of a
+real-time embedded system. Hardware costs are continuing to rapidly decline
+while at the same time the hardware is increasing in power and functionality.
+As a result, embedded systems that were not considered viable two years ago
+are suddenly a cost effective solution. In this domain, it is not uncommon
+for a single hardware configuration to employ a variety of architectures and
+technologies. Therefore, we shall define an embedded system as any computer
+system that is built into a larger system consisting of multiple technologies
+such as digital and analog electronics, mechanical devices, and sensors.
+
+Even as hardware platforms become more powerful, most embedded systems are
+critically dependent on the real-time software embedded in the systems
+themselves. Regardless of how efficiently the hardware operates, the
+performance of the embedded real-time software determines the success of the
+system. As the complexity of the embedded hardware platform grows, so does
+the size and complexity of the embedded software. Software systems must
+routinely perform activities which were only dreamed of a short time ago.
+These large, complex, real-time embedded applications now commonly contain
+one million lines of code or more.
+
+Real-time embedded systems have a complex set of characteristics that
+distinguish them from other software applications. Real-time embedded
+systems are driven by and must respond to real world events while adhering to
+rigorous requirements imposed by the environment with which they interact.
+The correctness of the system depends not only on the results of
+computations, but also on the time at which the results are produced. The
+most important and complex characteristic of real-time application systems is
+that they must receive and respond to a set of external stimuli within rigid
+and critical time constraints.
+
+A single real-time application can be composed of both soft and hard
+real-time components. A typical example of a hard real-time system is a
+nuclear reactor control system that must not only detect failures, but must
+also respond quickly enough to prevent a meltdown. This application also has
+soft real-time requirements because it may involve a man-machine interface.
+Providing an interactive input to the control system is not as critical as
+setting off an alarm to indicate a failure condition. However, the
+interactive system component must respond within an acceptable time limit to
+allow the operator to interact efficiently with the control system.
+
+@section Cross Development
+
+Today almost all real-time embedded software systems are developed in a
+@b{cross development} environment using cross development tools. In the cross
+development environment, software development activities are typically
+performed on one computer system, the @b{build-host} system, while the result of the
+development effort (produced by the cross tools) is a software system that
+executes on the @b{target} platform. The requirements for the target platform are
+usually incompatible and quite often in direct conflict with the requirements
+for the build-host. Moreover, the target hardware is often custom designed for a
+particular project. This means that the cross development toolset must allow
+the developer to customize the tools to address target specific run-time
+issues. The toolset must have provisions for board dependent initialization
+code, device drivers, and error handling code.
+
+The build-host computer is optimized to support the code development cycle with
+support for code editors, compilers, and linkers requiring large disk drives,
+user development windows, and multiple developer connections. Thus the build-host
+computer is typically a traditional UNIX workstation such as those available
+from SUN or Silicon Graphics, or a PC running either a version of MS-Windows
+or UNIX. The build-host system may also be required to execute
+office productivity applications to allow the software developer
+to write documentation, make presentations, or track the project's
+progress using a project management tool. This necessitates that the
+build-host computer be general purpose with resources such as a
+thirty-two or sixty-four bit processor, large amounts of
+RAM, a monitor, mouse, keyboard, hard and floppy disk drives, CD-ROM drive,
+and a graphics card. It is likely that the system will be multimedia capable
+and have some networking capability.
+
+Conversely, the target platform generally has limited traditional computer
+resources. The hardware is designed for the particular functionality and
+requirements of the embedded system and optimized to perform those tasks
+effectively. Instead of hard drives and keyboards, it is composed of
+sensors, relays, and stepper motors. The per-unit cost of the target platform
+is typically a critical concern. No hardware component is included without
+being cost justified. As a result, the processor of the target system is
+often from a different processor family than that of the build-host system and
+usually has lower performance. In addition to the processor families
+designed only for use in embedded systems, there are versions of nearly every
+general-purpose processor specifically tailored for real-time embedded
+systems. For example, many of the processors targeting the embedded market
+do not include hardware floating point units, but do include peripherals such
+as timers, serial controllers, or network interfaces.
+
+@section Resources on the Internet
+
+This section describes various resources on the Internet which are of
+use to RTEMS users.
+
+@c
+@c Online Tool Documentation
+@c
+
+@subsection Online Tool Documentation
+
+Each of the tools in the GNU development suite comes with documentation.
+It is in the reader's and tool maintainers' interest that one read the
+documentation before posting a problem to a mailing list or news group.
+The RTEMS Project provides formatted documentation for the primary
+tools in the cross development toolset including BINUTILS, GCC,
+NEWLIB, and GDB with the pre-built versions of those tools.
+
+Much of the documentation is available at other sites on the Internet.
+The following is a list of URLs where one can find HTML versions of
+the GNU manuals:
+
+@table @b
+
+@item Free Software Foundation
+@uref{http://www.gnu.org/manual/manual.html,
+http://www.gnu.org/manual/manual.html}
+
+@item Delorie Software
+@uref{http://www.delorie.com/gnu/docs, http://www.delorie.com/gnu/docs}
+
+@end table
+
+
+@subsection RTEMS Mailing List
+
+@uref{mailto:@value{RTEMSUSERS},@value{RTEMSUSERS}}
+
+This mailing list is dedicated to the discussion of issues related
+to RTEMS, including GNAT/RTEMS. If you have questions about RTEMS,
+wish to make suggestions, or just want to pick up hints, this is a
+good list to monitor. Subscribe by sending an empty mail message to
+@uref{mailto:@value{RTEMSUSERSSUBSCRIBE},@value{RTEMSUSERSSUBSCRIBE}}.
+Messages sent to @uref{mailto:@value{RTEMSUSERS},@value{RTEMSUSERS}}
+are posted to the list.
+
+@subsection CrossGCC Mailing List
+
+@uref{mailto:crossgcc@@sources.redhat.com,crossgcc@@sources.redhat.com}
+
+This mailing list is dedicated to the use of the GNU tools in
+cross development environments. Most of the discussions
+focus on embedded issues. Information on subscribing
+to this mailing list is included in the
+@uref{http://www.objsw.com/CrossGCC/,CrossGCC FAQ}.
+
+The CrossGCC FAQ and Wiki are are available
+at @uref{http://www.billgatliff.com,http://www.billgatliff.com}.
+
+@subsection GCC Mailing Lists
+
+
+The GCC Project is hosted at @uref{http://gcc.gnu.org,http://gcc.gnu.org}.
+They maintain multiple mailing lists that are described at the web site
+along with subscription information.
+
diff --git a/doc/started/nextstep.t b/doc/started/nextstep.t
new file mode 100644
index 0000000000..ad693af93a
--- /dev/null
+++ b/doc/started/nextstep.t
@@ -0,0 +1,150 @@
+@c
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Where To Go From Here
+
+At this point, you should have successfully installed a
+GNU Cross Compilation Tools for RTEMS on your host system
+as well as the RTEMS OS for the target host. You should
+have successfully linked the "hello world" program. You
+may even have downloaded the executable to that target
+and run it. What do you do next?
+
+The answer is that it depends. You may be interested in
+writing an application that uses one of the multiple
+APIs supported by RTEMS. You may need to investigate the
+network or filesystem support in RTEMS. The common
+thread is that you are largely finished with this
+manual and ready to move on to others.
+
+Whether or not you decide to dive in now and write
+application code or read some documentation first,
+this chapter is for you. The first section provides
+a quick roadmap of some of the RTEMS documentation.
+The next section provides a brief overview of the
+RTEMS application structure.
+
+@section Documentation Overview
+
+When writing RTEMS applications, you should find the
+following manuals useful because they define the
+calling interface to many of the services provided
+by RTEMS:
+
+@itemize @bullet
+@item @b{RTEMS Applications C User's Guide} describes the
+Classic RTEMS API based on the RTEID specification.
+
+@item @b{RTEMS POSIX API User's Guide} describes the
+RTEMS POSIX API that is based on the POSIX 1003.1b API.
+
+@item @b{RTEMS ITRON 3.0 API User's Guide} describes
+the RTEMS implementation of the ITRON 3.0 API.
+
+@item @b{RTEMS Network Supplement} provides information
+on the network services provided by RTEMS.
+
+@end itemize
+
+In addition, the following manuals from the GNU Cross
+Compilation Toolset include information on run-time services
+available.
+
+@itemize @bullet
+@item @b{Cygnus C Support Library} describes the Standard
+C Library functionality provided by Newlib's libc.
+
+@item @b{Cygnus C Math Library} describes the Standard
+C Math Library functionality provided by Newlib's libm.
+
+@end itemize
+
+Finally, the RTEMS FAQ and mailing list archives are available
+at @uref{@value{RTEMSHTTPURL}}.
+
+There is a wealth of documentation available for RTEMS and
+the GNU tools supporting it. If you run into something
+that is not clear or missing, bring it to our attention.
+
+Also, some of the RTEMS documentation is still under
+construction. If you would like to contribute to this
+effort, please contact the RTEMS Team at
+@uref{mailto:@value{RTEMSUSERS}, @value{RTEMSUSERS}}.
+If you are interested in sponsoring the development of a new
+feature, BSP, device driver, port of an existing library, etc.,
+please contact one of the RTEMS Service Providers listed
+at @uref{@value{RTEMSHTTPURL}/support.html,@value{RTEMSHTTPURL}/support.html}.
+
+@section Writing an Application
+
+From an application author's perspective, the structure of
+an RTEMS application is very familiar. In POSIX language,
+RTEMS provides a single process, multi-threaded run-time
+environment. However there are two important things that are
+different from a standard UNIX hosted program.
+
+First, the application developer must provide configuration
+information for RTEMS. This configuration information
+includes limits on the maximum number of various OS resources
+available and networking configuration among other things.
+See the @b{Configuring a System} in the
+@b{RTEMS Applications C User's Guide} for more details.
+
+Second, RTEMS applications may or may not start at
+@code{main()}. Applications begin execution at
+one or more user configurable application
+initialization tasks or threads. It is possible
+to configure an application to start with a
+single thread that whose entry point is @code{main()}.
+
+Each API supported by RTEMS (Classic, POSIX, and ITRON)
+allows the user to configure a set of one or more tasks
+that are created and started automatically
+during RTEMS initialization. The RTEMS Automatic
+Configuration Generation (@code{confdefs.h}) scheme can be
+used to easily generate the configuration information for
+an application that starts with a single initialization task.
+By convention, unless overridden, the default name of the
+initialization task varies based up API.
+
+@itemize @bullet
+@item @code{Init} - single Classic API Initialization Task
+
+@item @code{POSIX_Init} - single POSIX API Initialization Thread
+
+@item @code{ITRON_Init} - single ITRON API Initialization Task
+@end itemize
+
+Regardless of the API used, when the initialization task executes,
+all non-networking device drivers are normally initialized,
+processor interrupts are enabled, and any C++ global constructors
+have been run. The initialization task then goes about its
+business of performing application specific initialization which
+will include initializing the networking subsystem if it is to be
+used. The application initialization may also involve creating
+tasks and other system resources such as semaphores or message queues
+and allocating memory. In the RTEMS examples and tests, the
+file @code{init.c} usually contains the initialization task. Although
+not required, in most of the examples, the initialization task
+completes by deleting itself.
+
+As you begin to write RTEMS application code, you may be confused
+by the range of alternatives. Supporting multiple tasking
+APIs can make the choices confusing. Many application groups
+writing new code choose one of the APIs as their primary API
+and only use services from the others if nothing comparable
+is in their preferred one. However, the support for multiple
+APIs is a powerful feature when integrating code from multiple
+sources. You can write new code using POSIX services and
+still use services written in terms of the other APIs.
+Moreover, by adding support for yet another API, one could
+provide the infrastructure required to migrate from a
+legacy RTOS with a non-standard API to an API like POSIX.
+
+
diff --git a/doc/started/nt.t b/doc/started/nt.t
new file mode 100644
index 0000000000..b07261d274
--- /dev/null
+++ b/doc/started/nt.t
@@ -0,0 +1,158 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@appendix Using MS-Windows as a Development Host
+
+This chapter discusses the installation of the GNU tool chain
+on a computer running the Microsoft Windows operating system.
+
+This chapter was originally written by
+@uref{mailto:g_montel@@yahoo.com, Geoffroy Montel <g_montel@@yahoo.com>}
+with input from
+@uref{mailto:<D.J@@fiddes.surfaid.org>, David Fiddes <D.J@@fiddes.surfaid.org>}.
+It was based upon his successful but unnecessarily
+painful efforts with Cygwin beta versions.
+Cygwin and this chapter have been updated multiple times since
+those early days although their pioneering efforts
+and input is still greatly appreciated.
+
+@section Microsoft Windows Version Requirements
+
+RTEMS users report fewer problems when using Microsoft
+Windows NT, 2000, or XP. Although, the open source tools
+that are used in RTEMS development do execute on Windows 95,
+98, or ME, they tend to be more stable when used with
+the modern Windows variants.
+
+@section Cygwin
+
+For RTEMS development, the recommended approach is to use
+Cygwin 1.0 or later. Cygwin is available from
+@uref{http://sources.redhat.com/cygwin, http://sources.redhat.com/cygwin}
+Recent versions of Cygwin are vastly improved over the beta
+versions. Most of the oddities, instabilities, and performance
+problems have been resolved. The installation procedure
+is much simpler. However, there are a handful of issues
+that remain to successfully use Cygwin as an RTEMS development
+environment.
+
+@itemize @bullet
+
+@item There is no @code{cc} program by default. The GNU configure
+scripts used by RTEMS require this to be present to work properly.
+The solution is to link @code{gcc.exe} to @code{cc.exe} as follows:
+
+@example
+ln -s /bin/gcc.exe /bin/cc.exe
+@end example
+
+@item Make sure @code{/bin/sh.exe} is GNU Bash. Some Cygwin
+versions provide a light Bourne shell which is insufficient to build
+RTEMS. To see which shell is installed as @code{/bin/sh.exe}, execute
+the command @code{/bin/sh --version}. If it looks similar to
+the following, then it is GNU Bash and you are OK:
+
+@example
+GNU bash, version 2.04.5(12)-release (i686-pc-cygwin)
+Copyright 1999 Free Software Foundation, Inc.
+@end example
+
+If you get an error or it claims to be any other shell, you need
+to copy it to a fake name and copy
+@code{/bin/bash.exe} to @code{/bin/sh.exe}:
+
+@example
+cd /bin
+mv sh.exe old_sh.exe
+cp bash.exe sh.exe
+@end example
+
+The Bourne shell has to be present in @code{/bin} directory to run
+shell scripts properly.
+
+@item Make sure you unarchive and build in a binary mounted
+filesystem (e.g. mounted with the @code{-b} option). Otherwise,
+many confusing errors will result.
+
+@item A user has reported that they needed
+to set CYGWIN=ntsec for chmod to work correctly, but had to set
+CYGWIN=nontsec for compile to work properly (otherwise there were
+complaints about permissions on a temporary file).
+
+@item If you want to build the tools from source, you have the
+same options as UNIX users.
+
+@item You may have to uncompress archives during this
+process. You must @b{NOT} use @code{WinZip} or
+@code{PKZip}. Instead the un-archiving process uses
+the GNU @code{zip} and @code{tar} programs as shown below:
+
+@example
+tar -xzvf archive.tgz
+@end example
+
+@code{tar} is provided with Cygwin.
+
+@end itemize
+
+@section Text Editor
+
+You absolutely have to use a text editor which can
+save files with Unix format. So do @b{NOT} use Notepad
+or Wordpad! There are a number of editors
+freely available that can be used.
+
+@itemize @bullet
+@item @b{VIM} (@b{Vi IMproved}) is available from
+@uref{http://www.vim.org/,http://www.vim.org/}.
+This editor has the very handy ability to easily
+read and write files in either DOS or UNIX style.
+
+@item @b{GNU Emacs} is available for many platforms
+including MS-Windows. The official homepage
+is @uref{http://www.gnu.org/software/emacs/emacs.html,
+http://www.gnu.org/software/emacs/emacs.html}.
+The GNU Emacs on Windows NT and Windows 95/98 FAQ is at
+@uref{http://www.gnu.org/software/emacs/windows/ntemacs.html,
+http://www.gnu.org/software/emacs/windows/ntemacs.html}.
+
+@end itemize
+
+If you do accidentally end up with files
+having MS-DOS style line termination, then you
+may have to convert them to Unix format for some
+Cygwin programs to operate on them properly. The
+program @code{dos2unix} can be used to put them
+back into Unix format as shown below:
+
+@example
+$ dos2unix XYZ
+Dos2Unix: Cleaning file XYZ ...
+@end example
+
+@section System Requirements
+
+Although the finished cross-compiler is fairly easy on resources,
+building it can take a significant amount of processing power and
+disk space.
+
+@itemize @bullet
+
+@item The faster the CPU, the better. The tools and Cygwin can be
+@b{very} CPU hungry.
+
+@item The more RAM, the better. Reports are that when building GCC
+and GDB, peak memory usage can exceed 256 megabytes.
+
+@item The more disk space, the better. You need more if you are building
+the GNU tools and the amount of disk space for binaries is obviously
+directly dependent upon the number of CPUs you have cross toolsets
+installed for.
+
+@end itemize
+
diff --git a/doc/started/pictures/bit_ada.jpg b/doc/started/pictures/bit_ada.jpg
new file mode 100644
index 0000000000..774b103711
--- /dev/null
+++ b/doc/started/pictures/bit_ada.jpg
Binary files differ
diff --git a/doc/started/pictures/bit_ada.vsd b/doc/started/pictures/bit_ada.vsd
new file mode 100644
index 0000000000..51e8e1fe53
--- /dev/null
+++ b/doc/started/pictures/bit_ada.vsd
Binary files differ
diff --git a/doc/started/pictures/bit_c.jpg b/doc/started/pictures/bit_c.jpg
new file mode 100644
index 0000000000..158beb4bd1
--- /dev/null
+++ b/doc/started/pictures/bit_c.jpg
Binary files differ
diff --git a/doc/started/pictures/bit_c.vsd b/doc/started/pictures/bit_c.vsd
new file mode 100644
index 0000000000..a6db26bd15
--- /dev/null
+++ b/doc/started/pictures/bit_c.vsd
Binary files differ
diff --git a/doc/started/pictures/scfile10.jpg b/doc/started/pictures/scfile10.jpg
new file mode 100644
index 0000000000..22a83877ce
--- /dev/null
+++ b/doc/started/pictures/scfile10.jpg
Binary files differ
diff --git a/doc/started/pictures/scfile10.vsd b/doc/started/pictures/scfile10.vsd
new file mode 100644
index 0000000000..07efb1f18b
--- /dev/null
+++ b/doc/started/pictures/scfile10.vsd
Binary files differ
diff --git a/doc/started/pictures/scfile11.jpg b/doc/started/pictures/scfile11.jpg
new file mode 100644
index 0000000000..f70986ef55
--- /dev/null
+++ b/doc/started/pictures/scfile11.jpg
Binary files differ
diff --git a/doc/started/pictures/scfile11.vsd b/doc/started/pictures/scfile11.vsd
new file mode 100644
index 0000000000..25871be19a
--- /dev/null
+++ b/doc/started/pictures/scfile11.vsd
Binary files differ
diff --git a/doc/started/pictures/scfile12.jpg b/doc/started/pictures/scfile12.jpg
new file mode 100644
index 0000000000..22a83877ce
--- /dev/null
+++ b/doc/started/pictures/scfile12.jpg
Binary files differ
diff --git a/doc/started/pictures/scfile12.vsd b/doc/started/pictures/scfile12.vsd
new file mode 100644
index 0000000000..750e7cdf56
--- /dev/null
+++ b/doc/started/pictures/scfile12.vsd
Binary files differ
diff --git a/doc/started/pictures/scfile13.jpg b/doc/started/pictures/scfile13.jpg
new file mode 100644
index 0000000000..7ea418b7a7
--- /dev/null
+++ b/doc/started/pictures/scfile13.jpg
Binary files differ
diff --git a/doc/started/pictures/scfile13.vsd b/doc/started/pictures/scfile13.vsd
new file mode 100644
index 0000000000..581eff901c
--- /dev/null
+++ b/doc/started/pictures/scfile13.vsd
Binary files differ
diff --git a/doc/started/pictures/scsfile1.jpg b/doc/started/pictures/scsfile1.jpg
new file mode 100644
index 0000000000..d1d497e955
--- /dev/null
+++ b/doc/started/pictures/scsfile1.jpg
Binary files differ
diff --git a/doc/started/pictures/scsfile1.vsd b/doc/started/pictures/scsfile1.vsd
new file mode 100644
index 0000000000..a7314848fc
--- /dev/null
+++ b/doc/started/pictures/scsfile1.vsd
Binary files differ
diff --git a/doc/started/pictures/scsfile2.jpg b/doc/started/pictures/scsfile2.jpg
new file mode 100644
index 0000000000..afbe1db125
--- /dev/null
+++ b/doc/started/pictures/scsfile2.jpg
Binary files differ
diff --git a/doc/started/pictures/scsfile2.vsd b/doc/started/pictures/scsfile2.vsd
new file mode 100644
index 0000000000..d2bb29a6e8
--- /dev/null
+++ b/doc/started/pictures/scsfile2.vsd
Binary files differ
diff --git a/doc/started/pictures/scsfile3.jpg b/doc/started/pictures/scsfile3.jpg
new file mode 100644
index 0000000000..b0e135994d
--- /dev/null
+++ b/doc/started/pictures/scsfile3.jpg
Binary files differ
diff --git a/doc/started/pictures/scsfile3.vsd b/doc/started/pictures/scsfile3.vsd
new file mode 100644
index 0000000000..da98158c85
--- /dev/null
+++ b/doc/started/pictures/scsfile3.vsd
Binary files differ
diff --git a/doc/started/pictures/scsfile4.jpg b/doc/started/pictures/scsfile4.jpg
new file mode 100644
index 0000000000..1c01cbb460
--- /dev/null
+++ b/doc/started/pictures/scsfile4.jpg
Binary files differ
diff --git a/doc/started/pictures/scsfile4.vsd b/doc/started/pictures/scsfile4.vsd
new file mode 100644
index 0000000000..50823fa67e
--- /dev/null
+++ b/doc/started/pictures/scsfile4.vsd
Binary files differ
diff --git a/doc/started/pictures/scsfile5.jpg b/doc/started/pictures/scsfile5.jpg
new file mode 100644
index 0000000000..8fe8df173c
--- /dev/null
+++ b/doc/started/pictures/scsfile5.jpg
Binary files differ
diff --git a/doc/started/pictures/scsfile5.vsd b/doc/started/pictures/scsfile5.vsd
new file mode 100644
index 0000000000..614736593a
--- /dev/null
+++ b/doc/started/pictures/scsfile5.vsd
Binary files differ
diff --git a/doc/started/pictures/scsfile6.jpg b/doc/started/pictures/scsfile6.jpg
new file mode 100644
index 0000000000..58a3489242
--- /dev/null
+++ b/doc/started/pictures/scsfile6.jpg
Binary files differ
diff --git a/doc/started/pictures/scsfile6.vsd b/doc/started/pictures/scsfile6.vsd
new file mode 100644
index 0000000000..a970df509a
--- /dev/null
+++ b/doc/started/pictures/scsfile6.vsd
Binary files differ
diff --git a/doc/started/pictures/scsfile7.jpg b/doc/started/pictures/scsfile7.jpg
new file mode 100644
index 0000000000..68cff033b8
--- /dev/null
+++ b/doc/started/pictures/scsfile7.jpg
Binary files differ
diff --git a/doc/started/pictures/scsfile7.vsd b/doc/started/pictures/scsfile7.vsd
new file mode 100644
index 0000000000..0af5ae9f4f
--- /dev/null
+++ b/doc/started/pictures/scsfile7.vsd
Binary files differ
diff --git a/doc/started/pictures/scsfile8.jpg b/doc/started/pictures/scsfile8.jpg
new file mode 100644
index 0000000000..a2ef5954ca
--- /dev/null
+++ b/doc/started/pictures/scsfile8.jpg
Binary files differ
diff --git a/doc/started/pictures/scsfile8.vsd b/doc/started/pictures/scsfile8.vsd
new file mode 100644
index 0000000000..0ed6dedf6d
--- /dev/null
+++ b/doc/started/pictures/scsfile8.vsd
Binary files differ
diff --git a/doc/started/pictures/scsfile9.jpg b/doc/started/pictures/scsfile9.jpg
new file mode 100644
index 0000000000..04f623e62d
--- /dev/null
+++ b/doc/started/pictures/scsfile9.jpg
Binary files differ
diff --git a/doc/started/pictures/scsfile9.vsd b/doc/started/pictures/scsfile9.vsd
new file mode 100644
index 0000000000..ca3222b4cf
--- /dev/null
+++ b/doc/started/pictures/scsfile9.vsd
Binary files differ
diff --git a/doc/started/pictures/sfile12c.jpg b/doc/started/pictures/sfile12c.jpg
new file mode 100644
index 0000000000..aba5bf21a2
--- /dev/null
+++ b/doc/started/pictures/sfile12c.jpg
Binary files differ
diff --git a/doc/started/pictures/sfile12c.vsd b/doc/started/pictures/sfile12c.vsd
new file mode 100644
index 0000000000..fc0616cf1e
--- /dev/null
+++ b/doc/started/pictures/sfile12c.vsd
Binary files differ
diff --git a/doc/started/require.t b/doc/started/require.t
new file mode 100644
index 0000000000..5f148f21b3
--- /dev/null
+++ b/doc/started/require.t
@@ -0,0 +1,219 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Requirements
+
+This chapter describes the build-host system requirements and initial steps
+in installing the GNU Cross Compiler Tools and RTEMS on a build-host.
+
+@section Disk Space
+
+A fairly large amount of disk space is required to perform the build of the
+GNU C/C++ Cross Compiler Tools for RTEMS. The following table may help in
+assessing the amount of disk space required for your installation:
+
+@example
++------------------------------------+--------------------------+
+| Component | Disk Space Required |
++------------------------------------+--------------------------+
+| archive directory | 55 Mbytes |
+| tools src unarchived | 350 Mbytes |
+| each individual build directory | up to 750 Mbytes |
+| each installation directory | 20-200 Mbytes |
++------------------------------------+--------------------------+
+@end example
+
+It is important to understand that the above requirements only address
+the GNU C/C++ Cross Compiler Tools themselves. Adding additional
+languages such as Fortran or Objective-C can increase the size
+of the build and installation directories. Also, the unarchived
+source and build directories can be removed after the tools are
+installed.
+
+After the tools themselves are installed, RTEMS must be built
+and installed for each Board Support Package that you wish
+to use. Thus the precise amount of disk space required
+for each installation directory depends highly on the number
+of RTEMS BSPs which are to be installed. If a single BSP is
+installed, then the additional size of each install directory
+will tend to be in the 40-60 Mbyte range.
+
+There are a number of factors which must be taken into
+account in order to estimate the amount of disk space required
+to build RTEMS itself. Attempting to build multiple BSPs in
+a single step increases the disk space requirements. Similarly
+enabling optional features increases the build and install
+space requirements. In particular, enabling and building
+the RTEMS tests results in a significant increase in build
+space requirements but since the tests are not installed has,
+enabling them has no impact on installation requirements.
+
+@section General Host Software Requirements
+
+The instructions in this manual should work on any computer running
+a UNIX variant. Some native GNU tools are used by this procedure
+including:
+
+@itemize @bullet
+@item GCC
+@item GNU make
+@item GNU makeinfo
+@end itemize
+
+In addition, some native utilities may be deficient for building
+the GNU tools.
+
+@subsection GCC
+
+Although RTEMS itself is intended to execute on an embedded target,
+there is source code for some native programs included with the RTEMS
+distribution. Some of these programs are used to assist in the building
+of RTEMS itself, while others are BSP specific tools. Regardless,
+no attempt has been made to compile these programs with a non-GNU
+compiler.
+
+@subsection GNU Make
+
+Both NEWLIB and RTEMS use GNU make specific features and can only be built
+using GNU make. Many systems include a make utility that is not GNU make.
+The safest way to meet this requirement is to ensure that when you invoke
+the command @code{make}, it is GNU make. This can be verified by
+attempting to print the GNU make version information:
+
+@example
+make --version
+@end example
+
+If you have GNU make and another make on your system, it is common to put
+the directory containing GNU make before the directory containing other
+implementations of make.
+
+@subsection GNU makeinfo Version Requirements
+
+In order to build gcc 2.9.x or newer versions, the GNU @code{makeinfo} program
+installed on your system must be at least version 1.68. The appropriate
+version of @code{makeinfo} is distributed with @code{gcc}.
+
+The following demonstrates how to determine the version of @code{makeinfo}
+on your machine:
+
+@example
+makeinfo --version
+@end example
+
+@c
+@c Host Specific Notes
+@c
+
+@section Host Specific Notes
+
+@subsection Solaris 2.x
+
+The following problems have been reported by Solaris 2.x users:
+
+@itemize @bullet
+
+@item The build scripts are written in "shell". The program @code{/bin/sh}
+on Solaris 2.x is not robust enough to execute these scripts. If you
+are on a Solaris 2.x host, then use the @code{/bin/ksh} or
+@code{/bin/bash} shell instead.
+
+@item The native @code{patch} program is broken. Install the GNU version.
+
+@item The native @code{m4} program is deficient. Install the GNU version.
+
+@end itemize
+
+@subsection Linux
+
+The following problems have been reported by Linux users:
+
+@itemize @bullet
+
+@item Certain versions of GNU fileutils include a version of
+@code{install} which does not work properly. Please perform
+the following test to see if you need to upgrade:
+
+@example
+install -c -d /tmp/foo/bar
+@end example
+
+If this does not create the specified directories your install
+program will not install RTEMS properly. You will need to upgrade
+to at least GNU fileutils version 3.16 to resolve this problem.
+
+@end itemize
+
+@section Archive and Build Directories
+
+If you are using RPM or another packaging format that supports
+building a package from source, then there is probably a directory
+structure assumed by that packaging format. Otherwise, you
+are free to use whatever organization you like. However, this
+document will use the directory organization described
+in @ref{Archive and Build Directory Format}.
+
+@subsection RPM Archive and Build Directory Format
+
+For RPM, it is assumed that the following subdirectories
+are under a root directory such as @code{/usr/src/redhat}:
+
+@example
+BUILD
+RPMS
+SOURCES
+SPECS
+SRPMS
+@end example
+
+For the purposes of this document, the RPM @code{SOURCES} directory
+is the directory into which all tool source and patches are
+assumed to reside. The @code{BUILD} directory is where the actual
+build is performed when building binaries from a source RPM.
+The @code{SOURCES} and @code{BUILD} are logically equivalent to
+the @code{archive} and @code{tools} directory discussed in the
+next section.
+
+@subsection Archive and Build Directory Format
+
+When no packaging format requirements are present, the root directory for
+the storage of source archives and patches as well as for building the
+tools is up to the user. The only concern is that there be enough
+disk space to complete the build. In this document, the following
+organization will be used.
+
+Make an @code{archive} directory to contain the downloaded
+source code and a @code{tools} directory to be used as a build
+directory. The command sequence to do this is shown
+below:
+
+@example
+mkdir archive
+mkdir tools
+@end example
+
+This will result in an initial directory structure similar to the
+one shown in the following figure:
+
+@example
+@group
+/whatever/prefix/you/choose/
+ archive/
+ tools/
+
+@end group
+@end example
+
+@c @ifset use-html
+@c @html
+@c <IMG SRC="sfile12c.jpg" WIDTH=417 HEIGHT=178
+@c ALT="Starting Directory Organization">
+@c @end html
+@c @end ifset
+
+
diff --git a/doc/started/sample.t b/doc/started/sample.t
new file mode 100644
index 0000000000..4d34e9f709
--- /dev/null
+++ b/doc/started/sample.t
@@ -0,0 +1,274 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Building the Sample Applications
+
+The RTEMS distribution includes a number of sample C, C++,
+Ada, and networking applications. This chapter will provide
+an overview of those sample applications.
+
+@c
+@c Set the Environment Variable RTEMS_MAKEFILE_PATH
+@c
+@section Set the Environment Variable RTEMS_MAKEFILE_PATH
+
+The sample application sets use the RTEMS Application Makefiles.
+This requires that the environment variable
+@code{RTEMS_MAKEFILE_PATH} point to the appropriate directory containing
+the installed RTEMS image built to target your particular CPU and
+board support package combination.
+
+@example
+export RTEMS_MAKEFILE_PATH=<INSTALLATION_POINT>/<CPU>-rtems/<BOARD_SUPPORT_PACKAGE>
+@end example
+
+Where <INSTALLATION_POINT> and <BOARD_SUPPORT_PACKAGE> are those used when
+configuring and installing RTEMS.
+
+NOTE: In release 4.0, BSPs were installed at
+@code{<INSTALLATION_POINT>/rtems/<BOARD_SUPPORT_PACKAGE>}. This
+was changed to be more in compliance with GNU standards.
+
+NOTE: GNU make is the preferred @code{make} utility. Other @code{make}
+implementations may work but all testing is done with GNU make.
+
+If no errors are detected during the sample application build, it is
+reasonable to assume that the build of the GNU Cross Compiler Tools
+for RTEMS and RTEMS itself for the selected host and target
+combination was done properly.
+
+@c
+@c Executing the Sample Applications
+@c
+@section Executing the Sample Applications
+
+How each sample application executable is downloaded
+to your target board and executed is very dependent
+on the board you are using. The following is a list of
+commonly used BSPs classified by their RTEMS CPU family and pointers
+to instructions on how to use them. [NOTE: All file names should be
+prepended with @value{RTEMSUNTAR}/c/src/lib/libbsp.]
+
+@need 1000
+@table @b
+
+@item arm/edp7312
+The arm/edp7312 BSP is for the ARM7-based Cogent EDP7312 board.
+
+@item c4x/c4xsim
+The c4x/c4xsim BSP is designed to execute on any member of
+the Texas Instruments C3x/C4x DSP family using only on-CPU
+peripherals for the console and timers.
+
+@item i386/pc386
+See @code{i386/pc386/HOWTO}
+
+@item i386/pc486
+The i386/pc386 BSP specially compiled for an i486-class CPU.
+
+@item i386/pc586
+The i386/pc386 BSP specially compiled for a Pentium-class CPU.
+
+@item i386/pc686
+The i386/pc386 BSP specially compiled for a Pentium II.
+
+@item i386/pck6
+The i386/pc386 BSP specially compiled for an AMD K6.
+
+@item m68k/gen68360
+This BSP is for a MC68360 CPU. See @code{m68k/gen68360/README} for details.
+
+@item m68k/mvme162
+See @code{m68k/mvme162/README}.
+
+@item m68k/mvme167
+See @code{m68k/mvme167/README}.
+
+@item mips/jmr3904
+This is a BSP for the Toshiba TX3904 evaluation board
+simulator included with @code{mipstx39-rtems-gdb}. The
+BSP is located in @code{mips/jmr3904}.
+The TX3904 is a MIPS R3000 class CPU with serial ports and timers
+integrated with the processor. This BSP can be used with
+either real hardware or with the simulator included with
+@code{mipstx39-rtems-gdb}. An application can be run on the simulator
+by executing the following commands upon entering @code{mipstx39-rtems-gdb}:
+
+@example
+target sim --board=jmr3904
+load
+run
+@end example
+
+@item powerpc/mcp750
+See @code{powerpc/motorola_shared/README}.
+
+@item powerpc/mvme230x
+See @code{powerpc/motorola_shared/README.MVME2300}.
+
+@item powerpc/psim
+This is a BSP for the PowerPC simulator included with @code{powerpc-rtems-gdb}.
+The simulator is complicated to initialize by hand. The user is referred
+to the script @code{powerpc/psim/tools/psim}.
+
+@item sparc/erc32
+The ERC32 is a radiation hardened SPARC V7. This BSP can be used with
+either real ERC32 hardware or with the simulator included with
+@code{sparc-rtems-gdb}. An application can be run on the simulator
+by executing the following commands upon entering @code{sparc-rtems-gdb}:
+
+@example
+target sim
+load
+run
+@end example
+
+@end table
+
+RTEMS has many more BSPs and new BSPs for commercial boards and CPUs
+with on-CPU peripherals are generally welcomed.
+
+@c
+@c C/C++ Sample Applications
+@c
+@section C/C++ Sample Applications
+
+The C/C++ sample application set includes a number of simple applications.
+Some demonstrate some basic functionality in RTEMS such as writing
+a file, closing it, and reading it back while others can serve as
+starting points for RTEMS applications or libraries. Start by
+unarchiving them so you can peruse them. Use a command similar to
+the following to unarchive the sample applications:
+
+@example
+cd tools
+tar xjf ../archive/examples-VERSION.tgz
+@end example
+
+The sample applications most likely to be of interest to you are:
+
+@itemize @bullet
+@item hello_world_c - C Hello World application with a simple
+RTEMS configuration and an entry point not called @code{main()}.
+
+@item simple_main - Very simple program starting at @code{main()}
+and shutting down RTEMS via @code{exit()} without any other operations.
+It uses the default configuration inside RTEMS which is only
+intended to satisfy @code{autoconf} probes and extremely simple
+console-based applications.
+
+@item libcpp - Simple C++ library for RTEMS showing how to build an
+application library written in C++.
+
+@item psx_sched_report - POSIX Scheduler Reporter is a program
+that prints out some scheduler attributes of the RTEMS POSIX API.
+
+@end itemize
+
+Each tests is found in a separate subdirectory and built using the
+same command sequence. The @code{hello_world_c} sample will be used
+as an example.
+
+@c
+@c Build the C Hello World Application
+@c
+@subheading Build the C Hello World Application
+
+Use the following command to start the build of the sample hello
+world application:
+
+@example
+cd hello_world_c
+make
+@end example
+
+
+If the sample application has successfully been built, then the application
+executable is placed in the following directory:
+
+@example
+hello_world_c/o-optimize/<filename>.exe
+@end example
+
+The other C/C++ sample applications are built using a similar procedure.
+
+@c
+@c Ada Sample Applications
+@c
+@section Ada Sample Applications
+
+The Ada sample application set primarily includes a
+a simple Hello World Ada program which can be used
+as a starting point for GNAT/RTEMS applications.
+Use the following command to unarchive the Ada sample
+applications:
+
+@example
+cd tools
+tar xzf ../archive/hello_world_ada.tgz
+@end example
+
+@subheading Create a BSP Specific Makefile
+
+Currently, the procedure for building and linking an Ada application
+is a bit more difficult than a C or C++ application. This is certainly
+an opportunity for a volunteer project.
+
+At this time, there is a
+
+Provided are example Makefiles for multiple BSPs. Copy one of these to
+the file Makefile.<BOARD_SUPPORT_PACKAGE> and edit it as appropriate for
+your local configuration.
+
+Use the <INSTALLATION_POINT> and <BOARD_SUPPORT_PACKAGE> specified when
+configuring and installing RTEMS.
+
+@section Build the Sample Application
+
+Use the following command to start the build of the sample application:
+
+@example
+cd tools/hello_world_ada
+make -f Makefile.<BOARD_SUPPORT_PACKAGE>
+@end example
+
+NOTE: GNU make is the preferred @code{make} utility. Other @code{make}
+implementations may work but all testing is done with GNU make.
+
+If the BSP specific modifications to the Makefile were correct and
+no errors are detected during the sample application build, it is
+reasonable to assume that the build of the GNAT/RTEMS Cross Compiler Tools
+for RTEMS and RTEMS itself for the selected host and target
+combination was done properly.
+
+@section Application Executable
+
+If the sample application has successfully been build, then the application
+executable is placed in the following directory:
+
+@example
+tools/hello_world_ada/o-optimize/<filename>.exe
+@end example
+
+How this executable is downloaded to the target board is very dependent
+on the BOARD_SUPPORT_PACKAGE selected.
+
+@c
+@c More Information on RTEMS Application Makefiles
+@c
+@section More Information on RTEMS Application Makefiles
+
+These sample applications are examples of simple
+RTEMS applications that use the RTEMS Application Makefile
+system. This Makefile system simplifies building
+RTEMS applications by providing Makefile templates and
+capturing the configuration information used to build
+RTEMS specific to your BSP. Building an RTEMS application
+for different BSPs is as simple as switching the
+setting of @code{RTEMS_MAKEFILE_PATH}. This Makefile
+system is described in the file @code{make/README}.
diff --git a/doc/started/started.texi b/doc/started/started.texi
new file mode 100644
index 0000000000..3eba484cab
--- /dev/null
+++ b/doc/started/started.texi
@@ -0,0 +1,113 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename started.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@c @paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the Getting Started (C) Guide
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@c
+@c Now set all the tool version dependent information
+@c
+@include tversions.texi
+
+@ifset use-ascii
+@dircategory RTEMS On-Line Manual
+@direntry
+* Getting Started with RTEMS: (started).
+@end direntry
+@end ifset
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage Getting Started with RTEMS
+
+@setchapternewpage odd
+@settitle Getting Started with RTEMS
+@titlepage
+@finalout
+
+@title Getting Started with RTEMS
+@subtitle Edition @value{EDITION}, for @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include intro.texi
+@include require.texi
+@include binaries.texi
+@include buildc.texi
+@include buildrt.texi
+@include sample.texi
+@include nextstep.texi
+@include nt.texi
+
+@ifinfo
+@node Top, Introduction, (dir), (dir)
+@top started
+
+This is the online version of the Getting Started with RTEMS.
+
+@menu
+* Introduction::
+* Requirements::
+* Prebuilt Toolset Executables::
+* Building the GNU Cross Compiler Toolset::
+* Building RTEMS::
+* Building the Sample Applications::
+* Where To Go From Here::
+* Using MS-Windows as a Development Host::
+@end menu
+
+@c * Command and Variable Index::
+@c * Concept Index::
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@c @node Command and Variable Index, Concept Index, Installing GCC AND NEWLIB, Top
+@c @unnumbered Command and Variable Index
+
+@c There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@c @node Concept Index, , Command and Variable Index, Top
+@c @unnumbered Concept Index
+
+@c There are currently no Concept Index entries.
+@c @printindex cp
+
+@contents
+@bye
+
diff --git a/doc/started/tversions.texi.in b/doc/started/tversions.texi.in
new file mode 100644
index 0000000000..aae618c1e2
--- /dev/null
+++ b/doc/started/tversions.texi.in
@@ -0,0 +1,91 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c This file contains all toolset version dependent information
+@c
+
+@c
+@c Comment out setting the "XYZ-RTEMSPATCH" variable if there is no
+@c patch required. The documentation will detect this and print
+@c an appropriate message in a short section.
+@c
+
+
+@c
+@c GCC Version
+@c
+
+@set GCCVERSION @GCCVERSION@
+@set GCCUNTAR gcc-@value{GCCVERSION}
+@set GCCTAR @value{GCCUNTAR}.tar.bz2
+@set GCCFTPSITE ftp.gnu.org
+@set GCCFTPDIR /pub/gnu/gcc/@value{GCCUNTAR}
+@set GCCHTTPDIR /pub/gcc/releases/index.html
+@SETGCCPATCHVERSION@
+@ifset GCCPATCHVERSION
+@set GCCRTEMSPATCH @value{GCCUNTAR}-rtems-@value{GCCPATCHVERSION}.diff
+@end ifset
+@set GCCRPMRELEASE @GCCRPMRELEASE@
+
+@c
+@c BINUTILS Version
+@c
+
+@c The "official" binutils
+@set BINUTILSVERSION @BINUTILSVERSION@
+@set BINUTILSUNTAR binutils-@value{BINUTILSVERSION}
+@set BINUTILSTAR @value{BINUTILSUNTAR}.tar.gz
+@set BINUTILSFTPSITE ftp.gnu.org
+@set BINUTILSFTPDIR /pub/gnu/binutils
+@SETBINUTILSPATCHVERSION@
+@ifset BINUTILSPATCHVERSION
+@set BINUTILSRTEMSPATCH @value{BINUTILSUNTAR}-rtems-@value{BINUTILSPATCHVERSION}.diff
+@end ifset
+@set BINUTILSRPMRELEASE @BINUTILSRPMRELEASE@
+
+@c
+@c NEWLIB Version
+@c
+
+
+@set NEWLIBVERSION @NEWLIBVERSION@
+@set NEWLIBUNTAR newlib-@value{NEWLIBVERSION}
+@set NEWLIBTAR @value{NEWLIBUNTAR}.tar.gz
+@set NEWLIBFTPSITE sources.redhat.com
+@set NEWLIBFTPDIR /pub/newlib
+@SETNEWLIBPATCHVERSION@
+@ifset NEWLIBPATCHVERSION
+@set NEWLIBRTEMSPATCH @value{NEWLIBUNTAR}-rtems-@value{NEWLIBPATCHVERSION}.diff
+@end ifset
+
+@c
+@c GDB Version
+@c
+
+@set GDBVERSION @GDBVERSION@
+@set GDBUNTAR gdb-@value{GDBVERSION}
+@set GDBTAR @value{GDBUNTAR}.tar.gz
+@set GDBFTPSITE ftp.gnu.org
+@set GDBFTPDIR /pub/gnu/gdb
+@SETGDBPATCHVERSION@
+@ifset GDBPATCHVERSION
+@set GDBRTEMSPATCH @value{GDBUNTAR}-rtems-@value{GDBPATCHVERSION}.diff
+@end ifset
+@set GDBRPMRELEASE @GDBRPMRELEASE@
+@set GDBFTPURL ftp://@value{GDBFTPSITE}@value{GDBFTPDIR}/@value{GDBTAR}
+
+@c
+@c RTEMS Version
+@c
+
+@set RTEMSVERSION RTEMS @value{VERSION}
+@set RTEMSUNTAR rtems-@value{VERSION}
+@set RTEMSTAR @value{RTEMSUNTAR}.tar.bz2
+@set RTEMSFTPSITE ftp.rtems.com
+@set RTEMSFTPDIR /pub/rtems
diff --git a/doc/started_ada/.cvsignore b/doc/started_ada/.cvsignore
new file mode 100644
index 0000000000..7ddfdb3fb7
--- /dev/null
+++ b/doc/started_ada/.cvsignore
@@ -0,0 +1,28 @@
+buildada.texi
+buildrt.texi
+gdb.texi
+index.html
+intro.texi
+Makefile
+Makefile.in
+mdate-sh
+require.texi
+rtems_footer.html
+rtems_header.html
+sample.texi
+stamp-vti
+started_ada
+started_ada.aux
+started_ada.cp
+started_ada.dvi
+started_ada.fn
+started_ada*.html
+started_ada.ky
+started_ada.log
+started_ada.pdf
+started_ada.pg
+started_ada.ps
+started_ada.toc
+started_ada.tp
+started_ada.vr
+version.texi
diff --git a/doc/started_ada/Makefile.am b/doc/started_ada/Makefile.am
new file mode 100644
index 0000000000..46100111c3
--- /dev/null
+++ b/doc/started_ada/Makefile.am
@@ -0,0 +1,56 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = started_ada
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/main.am
+
+GENERATED_FILES = buildada.texi buildrt.texi gdb.texi intro.texi \
+ require.texi sample.texi
+
+COMMON_FILES += $(top_srcdir)/common/cpright.texi
+
+FILES = tversions.texi
+
+info_TEXINFOS = started_ada.texi
+started_ada_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+intro.texi: intro.t tversions.texi
+ $(BMENU2) -c -p "Top" \
+ -u "Top" \
+ -n "Requirements" < $< > $@
+
+require.texi: require.t tversions.texi
+ $(BMENU2) -c -p "GNAT Chat Mailing List" \
+ -u "Top" \
+ -n "Building the GNAT Cross Compiler Toolset" < $< > $@
+
+buildada.texi: buildada.t tversions.texi
+ $(BMENU2) -c -p "Insure GCC and GNAT Environment Variables Are Not Set" \
+ -u "Top" \
+ -n "Building RTEMS" < $< > $@
+
+buildrt.texi: $(top_srcdir)/started/buildrt.t tversions.texi
+ $(BMENU2) -c -p "Error Messages Indicating Configuration Problems" \
+ -u "Top" \
+ -n "Building the Sample Application" < $< > $@
+
+sample.texi: sample.t tversions.texi
+ $(BMENU2) -c -p "Using the RTEMS configure Script Directly" \
+ -u "Top" \
+ -n "Building the GNU Debugger" < $< > $@
+
+gdb.texi: gdb.t tversions.texi
+ $(BMENU2) -c -p "Application Executable" \
+ -u "Top" \
+ -n "" < $< > $@
+
+EXTRA_DIST = buildada.t gdb.t intro.t require.t sample.t
+CLEANFILES += started_ada.info
diff --git a/doc/started_ada/buildada.t b/doc/started_ada/buildada.t
new file mode 100644
index 0000000000..a1f00b7a35
--- /dev/null
+++ b/doc/started_ada/buildada.t
@@ -0,0 +1,699 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Building the GNAT Cross Compiler Toolset
+
+This chapter describes the steps required to acquire the
+source code for a GNU cross compiler toolset, apply
+any required RTEMS specific patches, compile that
+toolset and install it.
+
+@section Create the Archive and Build Directories
+
+Start by making the @code{archive} directory to contain the downloaded
+source code and the @code{tools} directory to be used as a build
+directory. The command sequence to do this is shown
+below:
+
+@example
+mkdir archive
+mkdir tools
+@end example
+
+This will result in an initial directory structure similar to the
+one shown in the following figure:
+
+@example
+@group
+/whatever/prefix/you/choose/
+ archive/
+ tools/
+
+@end group
+@end example
+
+@c @ifset use-html
+@c @html
+@c <IMG SRC="sfile12c.jpg" WIDTH=417 HEIGHT=178
+@c ALT="Starting Directory Organization">
+@c @end html
+@c @end ifset
+
+@section Get All the Pieces
+
+This section lists the components of an RTEMS cross development system.
+Included are the locations of each component as well as any required RTEMS
+specific patches.
+
+@subheading @value{GCCVERSION}
+@example
+ FTP Site: @value{GCCFTPSITE}
+ Directory: @value{GCCFTPDIR}
+ File: @value{GCCTAR}
+@ifset use-html
+@c URL: @uref{ftp://@value{GCCFTPSITE}@value{GCCFTPDIR}/@value{GCCTAR},Download @value{GCCVERSION}}
+ URL: ftp://@value{GCCFTPSITE}@value{GCCFTPDIR}/@value{GCCTAR}
+@end ifset
+@end example
+
+@subheading @value{GNAT-VERSION}
+@example
+ FTP Site: @value{GNAT-FTPSITE}
+ Directory: @value{GNAT-FTPDIR}
+ File: @value{GNAT-TAR}
+@ifset use-html
+@c URL: @uref{ ftp://@value{GNAT-FTPSITE}@value{GNAT-FTPDIR}/@value{GNAT-TAR}, Download @value{GNAT-VERSION}}
+ URL: ftp://@value{GNAT-FTPSITE}@value{GNAT-FTPDIR}/@value{GNAT-TAR}
+@end ifset
+@end example
+
+@subheading @value{BINUTILSVERSION}
+@example
+ FTP Site: @value{BINUTILSFTPSITE}
+ Directory: @value{BINUTILSFTPDIR}
+ File: @value{BINUTILSTAR}
+@ifset use-html
+@c URL: @uref{ftp://@value{BINUTILSFTPSITE}@value{BINUTILSFTPDIR}/@value{BINUTILSTAR}, Download @value{BINUTILSVERSION}}
+ URL: ftp://@value{BINUTILSFTPSITE}@value{BINUTILSFTPDIR}/@value{BINUTILSTAR}
+@end ifset
+@end example
+
+@subheading @value{NEWLIBVERSION}
+@example
+ FTP Site: @value{NEWLIBFTPSITE}
+ Directory: @value{NEWLIBFTPDIR}
+ File: @value{NEWLIBTAR}
+@ifset use-html
+@c URL: @uref{ftp://@value{NEWLIBFTPSITE}@value{NEWLIBFTPDIR}/@value{NEWLIBTAR}, Download @value{NEWLIBVERSION}}
+ URL: ftp://@value{NEWLIBFTPSITE}@value{NEWLIBFTPDIR}/@value{NEWLIBTAR}
+@end ifset
+@end example
+
+@subheading @value{RTEMSVERSION}
+@example
+ FTP Site: @value{RTEMSFTPSITE}
+ Directory: @value{RTEMSFTPDIR}
+ File: @value{RTEMSTAR}
+@ifset use-html
+@c URL: @uref{ftp://@value{RTEMSFTPSITE}@value{RTEMSFTPDIR}, Download RTEMS components}
+ URL: ftp://@value{RTEMSFTPSITE}@value{RTEMSFTPDIR}
+@end ifset
+@end example
+
+@subheading RTEMS Hello World
+@example
+ FTP Site: @value{RTEMSFTPSITE}
+ Directory: @value{RTEMSFTPDIR}
+ File: hello_world_ada.tgz
+@ifset use-html
+@c URL: @uref{ftp://@value{RTEMSFTPSITE}@value{RTEMSFTPDIR}/ada_tools/hello_world_ada.tgz, Download RTEMS Hello World}
+ URL: ftp://@value{RTEMSFTPSITE}@value{RTEMSFTPDIR}/ada_tools/hello_world_ada.tgz
+@end ifset
+@end example
+
+@subheading RTEMS Specific Tool Patches and Scripts
+@example
+ FTP Site: @value{RTEMSFTPSITE}
+ Directory: @value{RTEMSFTPDIR}/ada_tools/source
+ File: @value{BUILDTOOLSTAR}
+@ifset BINUTILSRTEMSPATCH
+ File: @value{BINUTILSRTEMSPATCH}
+@end ifset
+@ifset NEWLIBRTEMSPATCH
+ File: @value{NEWLIBRTEMSPATCH}
+@end ifset
+@ifset GCCRTEMSPATCH
+ File: @value{GCCRTEMSPATCH}
+@end ifset
+@ifset GNAT-RTEMSPATCH
+ File: @value{GNAT-RTEMSPATCH}
+@end ifset
+@ifset use-html
+@c URL: @uref{ftp://@value{RTEMSFTPSITE}@value{RTEMSFTPDIR}/ada_tools/source, Download RTEMS patches}
+ URL: ftp://@value{RTEMSFTPSITE}@value{RTEMSFTPDIR}/ada_tools/source
+@end ifset
+@end example
+
+@section Unarchiving the Tools
+
+While in the @code{tools} directory, unpack the compressed
+tar files using the following command sequence:
+
+@example
+cd tools
+tar xzf ../archive/@value{GCCTAR}
+tar xzf ../archive/@value{GNAT-TAR}
+tar xzf ../archive/@value{BINUTILSTAR}
+tar xzf ../archive/@value{NEWLIBTAR}
+tar xzf ../archive/@value{BUILDTOOLSTAR}
+@end example
+
+After the compressed tar files have been unpacked, the following
+directories will have been created under tools.
+
+@itemize @bullet
+@item @value{BINUTILSUNTAR}
+@item @value{GCCUNTAR}
+@item @value{GNAT-UNTAR}
+@item @value{NEWLIBUNTAR}
+@end itemize
+
+There will also be a set of scripts in the current directory
+which aid in building the tools and RTEMS. They are:
+
+@itemize @bullet
+@item bit_ada
+@item bit_gdb
+@item bit_rtems
+@item common.sh
+@item user.cfg
+@end itemize
+
+When the @code{bit_ada} script is executed later in this process,
+it will automatically create two other subdirectories:
+
+@itemize @bullet
+@item src
+@item build-$@{CPU@}-tools
+@end itemize
+
+Similarly, the @code{bit_gdb} script will create the
+subdirectory @code{build-$@{CPU@}-gdb} and
+the @code{bit_rtems} script will create the
+subdirectory @code{build-$@{CPU@}-rtems}.
+
+The directory tree should look something like the following figure:
+
+@example
+@group
+/whatever/prefix/you/choose/
+ archive/
+ @value{GCCTAR}
+ @value{GNAT-TAR}
+ @value{BINUTILSTAR}
+ @value{NEWLIBTAR}
+ @value{RTEMSTAR}
+ @value{BUILDTOOLSTAR}
+@ifset GCCRTEMSPATCH
+ @value{GCCRTEMSPATCH}
+@end ifset
+@ifset BINUTILSRTEMSPATCH
+ @value{BINUTILSRTEMSPATCH}
+@end ifset
+@ifset NEWLIBRTEMSPATCH
+ @value{NEWLIBRTEMSPATCH}
+@end ifset
+@ifset GNAT-RTEMSPATCH
+ @value{GNAT-RTEMSPATCH}
+@end ifset
+ hello_world_ada.tgz
+ bit_ada
+ tools/
+ @value{BINUTILSUNTAR}/
+ @value{GCCUNTAR}/
+ @value{GNAT-UNTAR}/
+ @value{NEWLIBUNTAR}/
+ bit_ada
+ bit_gdb
+ bit_rtems
+ common.sh
+ user.cfg
+@end group
+@end example
+
+@c @ifset use-html
+@c @html
+@c <IMG SRC="bit_ada.jpg" WIDTH=816 HEIGHT=267 ALT="Directory Organization">
+@c @end html
+@c @end ifset
+
+@c
+@c Host Specific Notes
+@c
+
+@section Host Specific Notes
+
+@subsection Solaris 2.x
+
+The build scripts are written in "shell". The program @code{/bin/sh}
+on Solaris 2.x is not robust enough to execute these scripts. If you
+are on a Solaris 2.x host, then change the first line of the files
+@code{bit_ada}, @code{bit_gdb}, and @code{bit_rtems} to use the
+@code{/bin/ksh} shell instead.
+
+@c
+@c Reading the Documentation
+@c
+
+@section Reading the Tools Documentation
+
+Each of the tools in the GNU development suite comes with documentation.
+It is in the reader's and tool maintainers' interest that one read the
+documentation before posting a problem to a mailing list or news group.
+
+
+@c
+@c GCC patches
+@c
+
+@section Apply RTEMS Patch to GCC
+
+@ifclear GCCRTEMSPATCH
+No RTEMS specific patches are required for @value{GCCVERSION} to
+support @value{RTEMSVERSION}.
+@end ifclear
+
+@ifset GCCRTEMSPATCH
+
+Apply the patch using the following command sequence:
+
+@example
+cd tools/@value{GCCUNTAR}
+zcat ../../archive/@value{GCCRTEMSPATCH} | patch -p1
+@end example
+
+Check to see if any of these patches have been rejected using the following
+sequence:
+
+@example
+cd tools/@value{GCCUNTAR}
+find . -name "*.rej" -print
+@end example
+
+If any files are found with the .rej extension, a patch has been rejected.
+This should not happen with a good patch file which is properly applied.
+
+@end ifset
+
+@c
+@c BINUTILS patches
+@c
+
+@section Apply RTEMS Patch to binutils
+
+@ifclear BINUTILSRTEMSPATCH
+No RTEMS specific patches are required for @value{BINUTILSVERSION} to
+support @value{RTEMSVERSION}.
+@end ifclear
+
+@ifset BINUTILSRTEMSPATCH
+Apply the patch using the following command sequence:
+
+@example
+cd tools/@value{BINUTILSUNTAR}
+zcat ../../archive/@value{BINUTILSRTEMSPATCH} | patch -p1
+@end example
+
+Check to see if any of these patches have been rejected using the following
+sequence:
+
+@example
+cd tools/@value{BINUTILSUNTAR}
+find . -name "*.rej" -print
+@end example
+
+If any files are found with the .rej extension, a patch has been rejected.
+This should not happen with a good patch file which is properly applied.
+
+@end ifset
+
+@c
+@c Newlib patches
+@c
+
+@section Apply RTEMS Patch to newlib
+
+@ifclear NEWLIBRTEMSPATCH
+No RTEMS specific patches are required for @value{NEWLIBVERSION} to
+support @value{RTEMSVERSION}.
+@end ifclear
+
+@ifset NEWLIBRTEMSPATCH
+
+Apply the patch using the following command sequence:
+
+@example
+cd tools/@value{NEWLIBUNTAR}
+zcat ../../archive/@value{NEWLIBRTEMSPATCH} | patch -p1
+@end example
+
+Check to see if any of these patches have been rejected using the following
+sequence:
+
+@example
+cd tools/@value{NEWLIBUNTAR}
+find . -name "*.rej" -print
+@end example
+
+If any files are found with the .rej extension, a patch has been rejected.
+This should not happen with a good patch file which is properly applied.
+
+@end ifset
+
+@c
+@c GNAT patches
+@c
+
+@section Apply RTEMS Patch to GNAT
+
+@ifclear GNAT-RTEMSPATCH
+No RTEMS specific patches are required for @value{GNAT-VERSION} to
+support @value{RTEMSVERSION}.
+@end ifclear
+
+@ifset GNAT-RTEMSPATCH
+
+Apply the patch using the following command sequence:
+
+@example
+cd tools/@value{GNAT-UNTAR}
+zcat ../../archive/@value{GNAT-RTEMSPATCH} | patch -p1
+@end example
+
+Check to see if any of these patches have been rejected using the following
+sequence:
+
+@example
+cd tools/@value{GNAT-UNTAR}
+find . -name "*.rej" -print
+@end example
+
+If any files are found with the .rej extension, a patch has been rejected.
+This should not happen with a good patch file which is properly applied.
+
+@end ifset
+
+@c
+@c Copy the ada directory
+@c
+
+
+@section Copy the ada Subdirectory to the GCC Source Tree
+
+Copy the ada subtree in the patched subtree of
+tools/@value{GNAT-UNTAR}/src to the
+tools/@value{GCCUNTAR} directory:
+
+@example
+cd tools/@value{GNAT-UNTAR}/src
+cp -r ada ../../@value{GCCUNTAR}
+@end example
+
+
+@c
+@c Localizing the Configuration
+@c
+
+@section Localizing the Configuration
+
+Edit the @code{user.cfg} file to alter the settings of various
+variables which are used to tailor the build process.
+Each of the variables set in @code{user.cfg} may be modified
+as described below:
+
+@table @code
+@item INSTALL_POINT
+is the location where you wish the GNU C/C++ cross compilation tools for
+RTEMS to be built. It is recommended that the directory chosen to receive
+these tools be named so that it is clear from which gcc distribution it
+was generated and for which target system the tools are to produce code for.
+
+@b{WARNING}: The @code{INSTALL_POINT} should not be a subdirectory
+under the build directory. The build directory will be removed
+automatically upon successful completion of the build procedure.
+
+@item BINUTILS
+is the directory under tools that contains @value{BINUTILSUNTAR}.
+For example:
+
+@example
+BINUTILS=@value{BINUTILSUNTAR}
+@end example
+
+@item GCC
+is the directory under tools that contains @value{GCCUNTAR}.
+For example,
+
+@example
+GCC=@value{GCCUNTAR}
+@end example
+
+Note that the gnat version is not needed because the gnat source
+is built as part of building gcc.
+
+@item NEWLIB
+is the directory under tools that contains @value{NEWLIBUNTAR}.
+For example:
+
+@example
+NEWLIB=@value{NEWLIBUNTAR}
+@end example
+
+@item BUILD_DOCS
+is set to "yes" if you want to install documentation. This requires
+that tools supporting documentation production be installed. This
+currently is limited to the GNU texinfo package.
+For example:
+
+@example
+BUILD_DOCS=yes
+@end example
+
+@item BUILD_OTHER_LANGUAGES
+is set to "yes" if you want to build languages other than C and C++. At
+the current time, the set of alternative languages includes Java, Fortran,
+and Objective-C. These alternative languages do not always build cross.
+Hence this option defaults to "no".
+
+For example:
+
+@example
+BUILD_OTHER_LANGUAGES=yes
+@end example
+
+@b{NOTE:} Based upon the version of the compiler being used, it may not
+be possible to build languages other than C and C++ cross. In many cases,
+the language run-time support libraries are not "multilib'ed". Thus the
+executable code in these libraries will be for the default compiler settings
+and not necessarily be correct for your CPU model.
+
+@item RTEMS
+is the directory under tools that contails @value{RTEMSUNTAR}.
+
+@item ENABLE_RTEMS_POSIX
+is set to "yes" if you want to enable the RTEMS POSIX API support.
+At this time, this feature is not supported by the UNIX ports of RTEMS
+and is forced to "no" for those targets. This corresponds to the
+@code{configure} option @code{--enable-posix}.
+
+This must be enabled to support the GNAT/RTEMS run-time.
+
+@item ENABLE_RTEMS_ITRON
+is set to "yes" if you want to enable the RTEMS ITRON API support.
+At this time, this feature is not supported by the UNIX ports of RTEMS
+and is forced to "no" for those targets. This corresponds to the
+@code{configure} option @code{--enable-itron}.
+
+@item ENABLE_RTEMS_MP
+is set to "yes" if you want to enable the RTEMS multiprocessing
+support. This feature is not supported by all RTEMS BSPs and
+is automatically forced to "no" for those BSPs. This corresponds to the
+@code{configure} option @code{--enable-multiprocessing}.
+
+@item ENABLE_RTEMS_CXX
+is set to "yes" if you want to build the RTEMS C++ support including
+the C++ Wrapper for the Classic API. This corresponds to the
+@code{configure} option @code{--enable-cxx}.
+
+@item ENABLE_RTEMS_TESTS
+is set to "yes" if you want to build the RTEMS Test Suite. If this
+is set to "no", then only the Sample Tests will be built. Setting
+this option to "yes" significantly increases the amount of disk
+space required to build RTEMS.
+This corresponds to the @code{configure} option @code{--enable-tests}.
+
+@item ENABLE_RTEMS_TCPIP
+is set to "yes" if you want to build the RTEMS TCP/IP Stack. If a
+particular BSP does not support TCP/IP, then this feature is automatically
+disabled. This corresponds to the @code{configure} option
+@code{--enable-tcpip}.
+
+@item ENABLE_RTEMS_NONDEBUG
+is set to "yes" if you want to build RTEMS in a fully optimized
+state. This corresponds to executing @code{make} after configuring
+the source tree.
+
+@item ENABLE_RTEMS_DEBUG
+is set to "yes" if you want to build RTEMS in a debug version.
+When built for debug, RTEMS will include run-time code to
+perform consistency checks such as heap consistency checks.
+Although the precise compilation arguments are BSP dependent,
+the debug version of RTEMS is usually built at a lower optimization
+level. This is usually done to reduce inlining which can make
+tracing code execution difficult. This corresponds to executing
+@code{make VARIANT=debug} after configuring
+the source tree.
+
+@item INSTALL_RTEMS
+is set to "yes" if you want to install RTEMS after building it.
+This corresponds to executing @code{make install} after configuring
+and building the source tree.
+
+@item ENABLE_RTEMS_MAINTAINER_MODE
+is set to "yes" if you want to enabled maintainer mode functionality
+in the RTEMS Makefile. This is disabled by default and it is not
+expected that most users will want to enable this. When this option
+is enabled, the build process may attempt to regenerate files that
+require tools not required when this option is disabled.
+This corresponds to the @code{configure} option
+@code{--enable-maintainer-mode}.
+
+@end table
+
+@section Running the bit_ada Script
+
+After the @code{bit_ada} script has been modified to reflect the
+local installation, the modified @code{bit_ada} script is run
+using the following sequence:
+
+@example
+cd tools
+./bit_ada <target configuration>
+@end example
+
+Where <target configuration> is one of the following:
+
+@itemize @bullet
+@item hppa1.1
+@item i386
+@item i960
+@item m68k
+@item powerpc
+@item sh
+@item sparc
+@end itemize
+
+NOTE: The above list of target configurations is the list of RTEMS supported
+targets. Only a subset of these have been tested with GNAT/RTEMS. For more
+information, contact your GNAT/RTEMS representative.
+
+The build process can take a while to complete. Many users find it
+handy to run the build process in the background, capture the output
+in a file, and monitor the output. This can be done as follows:
+
+@example
+./bit_ada <target configuration> >bit.log 2>&1 &
+tail -f bit.log
+@end example
+
+If no errors are encountered, the @code{bit_ada} script will conclude by
+printing messages similar to the following:
+
+@example
+
+The src and build-i386-tools subdirectory may now be removed.
+
+Started: Fri Apr 10 10:14:07 CDT 1998
+Finished: Fri Apr 10 12:01:33 CDT 1998
+@end example
+
+If the @code{bit_ada} script successfully completes, then the
+GNU C/C++ cross compilation tools are installed.
+
+If the @code{bit_ada} script does not successfully complete, then investigation
+will be required to determine the source of the error.
+
+@c
+@c Common Problems
+@c
+
+@section Common Problems
+
+@subsection Error Message Indicates Invalid Option to Assembler
+
+If a message like this is printed then the new cross compiler
+is most likely using the native assembler instead of the cross
+assembler or vice-versa (native compiler using new cross assembler).
+This can occur for one of the following reasons:
+
+@itemize @bullet
+
+@item Binutils Patch Improperly Applied
+@item Binutils Not Built
+@item Current Directory is in Your PATH
+
+@end itemize
+
+If you are using binutils 2.9.1 or newer with certain older versions of
+gcc, they do not agree on what the name of the newly
+generated cross assembler is. Older binutils called it @code{as.new}
+which became @code{as.new.exe} under Windows. This is not a valid
+file name, so @code{as.new} is now called @code{as-new}. By using the latest
+released tool versions and RTEMS patches, this problem will be avoided.
+
+If binutils did not successfully build the cross assembler, then
+the new cross gcc (@code{xgcc}) used to build the libraries can not
+find it. Make sure the build of the binutils succeeded.
+
+If you include the current directory in your PATH, then there
+is a chance that the native compiler will accidentally use
+the new cross assembler instead of the native one. This usually
+indicates that "." is before the standard system directories
+in your PATH. As a general rule, including "." in your PATH
+is a security risk and should be avoided. Remove "." from
+your PATH.
+
+NOTE: In some environments, it may be difficult to remove "."
+completely from your PATH. In this case, make sure that "."
+is after the system directories containing "as" and "ld".
+
+@subsection Error Messages Indicating Configuration Problems
+
+If you see error messages like the following,
+
+@itemize @bullet
+
+@item cannot configure libiberty
+@item coff-emulation not found
+@item etc.
+
+@end itemize
+
+Then it is likely that one or more of your gnu tools is
+already configured locally in its source tree. You can check
+for this by searching for the @code{config.status} file
+in the various tool source trees. The following command
+does this for the binutils source:
+
+@example
+find @value{BINUTILSUNTAR} -name config.status -print
+@end example
+
+The solution for this is to execute the command
+@code{make distclean} in each of the GNU tools
+root source directory. This should remove all
+generated files including Makefiles.
+
+This situation usually occurs when you have previously
+built the tool source for some non-RTEMS target. The
+generated configuration specific files are still in
+the source tree and the include path specified during
+the RTEMS build accidentally picks up the previous
+configuration. The include path used is something like
+this:
+
+@example
+-I../../@value{BINUTILSUNTAR}/gcc -I/@value{BINUTILSUNTAR}/gcc/include -I.
+@end example
+
+Note that the tool source directory is searched before the
+build directory.
+
+This situation can be avoided entirely by never using
+the source tree as the build directory -- even for
+
diff --git a/doc/started_ada/gdb.t b/doc/started_ada/gdb.t
new file mode 100644
index 0000000000..01094bf384
--- /dev/null
+++ b/doc/started_ada/gdb.t
@@ -0,0 +1,235 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Building the GNU Debugger
+
+GDB is not currently RTEMS aware. The following configurations have been
+successfully used with RTEMS applications:
+
+@itemize @bullet
+@item Sparc Instruction Simulator (SIS)
+@item PowerPC Instruction Simulator (PSIM)
+@item DINK32
+@end itemize
+
+Other configurations of gdb have successfully been used by RTEMS users
+but are not documented here.
+
+@section Unarchive the gdb Distribution
+
+Use the following commands to unarchive the gdb distribution:
+
+@example
+cd tools
+tar xzf ../archive/@value{GDBTAR}
+@end example
+
+The directory @value{GDBUNTAR} is created under the tools directory.
+
+@c
+@c GDB GNAT Patch
+@c
+
+@section Apply GNAT Patch to GDB
+
+@ifclear GDB-GNATPATCH
+No GNAT specific patches are required for @value{GDBVERSION} to
+support @value{RTEMSVERSION} and @value{GNAT-VERSION}.
+@end ifclear
+
+@ifset GDB-GNATPATCH
+
+Apply the patch using the following command sequence:
+
+@example
+cd tools/@value{GDBUNTAR}
+zcat archive/@value{GDB-GNATPATCH} | patch -p1
+@end example
+
+Check to see if any of these patches have been rejected using the following
+sequence:
+
+@example
+cd tools/@value{GDBUNTAR}
+find . -name "*.rej" -print
+@end example
+
+If any files are found with the .rej extension, a patch has been rejected.
+This should not happen with a good patch file.
+
+To see the files that have been modified use the sequence:
+
+@example
+cd tools/@value{GDBUNTAR}
+find . -name "*.orig" -print
+@end example
+
+The files that are found, have been modified by the patch file.
+
+@end ifset
+
+@c
+@c GDB RTEMS Patch
+@c
+
+@section Apply RTEMS Patch to GDB
+
+@ifclear GDBRTEMSPATCH
+No RTEMS specific patches are required for @value{GDBVERSION} to
+support @value{RTEMSVERSION}.
+@end ifclear
+
+@ifset GDBRTEMSPATCH
+
+Apply the patch using the following command sequence:
+
+@example
+cd tools/@value{GDBUNTAR}
+zcat archive/@value{GDBRTEMSPATCH} | patch -p1
+@end example
+
+Check to see if any of these patches have been rejected using the following
+sequence:
+
+@example
+cd tools/@value{GDBUNTAR}
+find . -name "*.rej" -print
+@end example
+
+If any files are found with the .rej extension, a patch has been rejected.
+This should not happen with a good patch file.
+
+To see the files that have been modified use the sequence:
+
+@example
+cd tools/@value{GDBUNTAR}
+find . -name "*.orig" -print
+@end example
+
+The files that are found, have been modified by the patch file.
+
+@end ifset
+
+
+@section GDB with Sparc Instruction Simulation (SIS)
+
+@subheading Make the Build Directory
+
+Create a build directory for the SIS Debugger
+
+@example
+cd tools
+mkdir build-sis
+@end example
+
+@subheading Configure for the Build
+
+Configure the GNU Debugger for the
+Sparc Instruction Simulator (SIS):
+
+@example
+cd tools/build-sis
+../@value{GDBUNTAR}/configure --target-sparc-erc32-aout \
+ --program-prefix=sparc-rtems- \
+ --disable-gdbtk \
+ --enable-targets=all \
+ --prefix=<INSTALL_POINT_FOR_SIS>
+@end example
+
+Where <INSTALL_POINT_FOR_SIS> is a unique location where the gdb
+with SIS will be created.
+
+@subheading Make the Debugger
+
+From tools/build-sis execute the following command sequence:
+
+@example
+make all install
+@end example
+
+NOTE: The @code{make} utility used should be GNU make.
+
+@section GDB with PowerPC Instruction Simulator
+
+@subheading Make the Build Directory
+
+Create a build directory for the SIS Debugger
+
+@example
+cd tools
+mkdir build-ppc
+@end example
+
+@subheading Configure for the Build
+
+Configure the GNU Debugger for the PowerPC
+Instruction Simulator (PSIM):
+
+@example
+cd tools/build-ppc
+../@value{GDBUNTAR}/configure \
+ --target=powerpc-unknown-eabi \
+ --program-prefix=powerpc-rtems- \
+ --enable-sim-powerpc \
+ --enable-sim-timebase \
+ --enable-sim-inline \
+ --enable-sim-hardware \
+ --enable-targets=all \
+ --prefix=<INSTALL_POINT_FOR_PPC>
+@end example
+
+Where <INSTALL_POINT_FOR_PPC> is a unique location where the gdb
+with PSIM will be created.
+
+
+@subheading Make the Debugger
+
+From tools/build-ppc execute the following command sequence:
+
+@example
+make all install
+@end example
+
+NOTE: The @code{make} utility used should be GNU make.
+
+@section GDB for DINK32
+
+@subheading Make the Build Directory
+
+Create a build directory for the DINK32 Debugger
+
+@example
+cd tools
+mkdir build-dink32
+@end example
+
+@subheading Configure for the Build
+
+Configure the GNU Debugger to communicate with
+the DINK32 ROM monitor:
+
+@example
+cd tools/build-dink32
+../@value{GDBUNTAR}/configure --target-powerpc-elf \
+ --program-prefix=powerpc-rtems- \
+ --enable-targets=all \
+ --prefix=<INSTALL_POINT_FOR_DINK32>
+@end example
+
+Where <INSTALL_POINT_FOR_DINK32> is a unique location where the
+gdb Dink32 will be created.
+
+@subheading Make the Debugger
+
+From tools/build-dink32 execute the following command sequence:
+
+@example
+make all install
+@end example
+
+NOTE: The @code{make} utility used should be GNU make.
diff --git a/doc/started_ada/intro.t b/doc/started_ada/intro.t
new file mode 100644
index 0000000000..55cbf26ebe
--- /dev/null
+++ b/doc/started_ada/intro.t
@@ -0,0 +1,162 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Introduction
+
+The purpose of this document is to guide you through the process of
+installing a GNU cross development environment to use with RTEMS.
+
+If you are already familiar with the concepts behind a cross compiler and
+have a background in Unix, these instructions should provide the bare
+essentials for performing a setup of the following items:
+
+@itemize @bullet
+@item GNAT/RTEMS Cross Compilation Tools on your host system
+@item RTEMS OS for the target host
+@item GDB Debugger
+@end itemize
+
+The remainder of this chapter provides background information on real-time
+embedded systems and cross development and an overview of other
+resources of interest on the Internet. If you are not familiar with
+real-time embedded systems or the other areas, please read those sections.
+These sections will help familiarize you with the
+types of systems RTEMS is designed to be used in and the cross development
+process used when developing RTEMS applications.
+
+@section Real-Time Embedded Systems
+
+Real-time embedded systems are found in practically every facet of our
+everyday lives. Today's systems range from the common telephone, automobile
+control systems, and kitchen appliances to complex air traffic control
+systems, military weapon systems, an d production line control including
+robotics and automation. However, in the current climate of rapidly changing
+technology, it is difficult to reach a consensus on the definition of a
+real-time embedded system. Hardware costs are continuing to rapidly decline
+while at the same time the hardware is increasing in power and functionality.
+As a result, embedded systems that were not considered viable two years ago
+are suddenly a cost effective solution. In this domain, it is not uncommon
+for a single hardware configuration to employ a variety of architectures and
+technologies. Therefore, we shall define an embedded system as any computer
+system that is built into a larger system consisting of multiple technologies
+such as digital and analog electronics, mechanical devices, and sensors.
+
+Even as hardware platforms become more powerful, most embedded systems are
+critically dependent on the real-time software embedded in the systems
+themselves. Regardless of how efficiently the hardware operates, the
+performance of the embedded real-time software determines the success of the
+system. As the complexity of the embedded hardware platform grows, so does
+the size and complexity of the embedded software. Software systems must
+routinely perform activities which were only dreamed of a short time ago.
+These large, complex, real-time embedded applications now commonly contain
+one million lines of code or more.
+
+Real-time embedded systems have a complex set of characteristics that
+distinguish them from other software applications. Real-time embedded
+systems are driven by and must respond to real world events while adhering to
+rigorous requirements imposed by the environment with which they interact.
+The correctness of the system depends not only on the results of
+computations, but also on the time at which the results are produced. The
+most important and complex characteristic of real-time application systems is
+that they must receive and respond to a set of external stimuli within rigid
+and critical time constraints.
+
+A single real-time application can be composed of both soft and hard
+real-time components. A typical example of a hard real-time system is a
+nuclear reactor control system that must not only detect failures, but must
+also respond quickly enough to prevent a meltdown. This application also has
+soft real-time requirements because it may involve a man-machine interface.
+Providing an interactive input to the control system is not as critical as
+setting off an alarm to indicate a failure condition. However, th e
+interactive system component must respond within an acceptable time limit to
+allow the operator to interact efficiently with the control system.
+
+@section Cross Development
+
+Today almost all real-time embedded software systems are developed in a
+@b{cross development} environment using cross development tools. In the cross
+development environment, software development activities are typically
+performed on one computer system, the @b{host} system, while the result of the
+development effort (produced by the cross tools) is a software system that
+executes on the @b{target} platform. The requirements for the target platform are
+usually incompatible and quite often in direct conflict with the requirements
+for the host. Moreover, the target hardware is often custom designed for a
+particular project. This means that the cross development toolset must allow
+the developer to customize the tools to address target specific run-time
+issues. The toolset must have provisions for board dependent initialization
+code, device drivers, and error handling code.
+
+The host computer is optimized to support the code development cycle with
+support for code editors, compilers, and linkers requiring large disk drives,
+user development windows, and multiple developer connections. Thus the host
+computer is typically a traditional UNIX workstation such as are available
+from SUN or Silicon Graphics, or a PC running either a version of MS-Windows
+or UNIX. The host system may also be required to execute office productivity
+applications to allow the software developer to write documentation, make
+presentations, or track the project's progress using a project management
+tool. This necessitates that the host computer be general purpose with
+resources such as a thirty-two or sixty-four bit processor, large amounts of
+RAM, a monitor, mouse, keyboard, hard and floppy disk drives, CD-ROM drive,
+and a graphics card. It is likely that the system will be multimedia capable
+and have some networking capability.
+
+Conversely, the target platform generally has limited traditional computer
+resources. The hardware is designed for the particular functionality and
+requirements of the embedded system and optimized to perform those tasks
+effectively. Instead of hard driverss and keyboards, it is composed of
+sensors, relays, and stepper motors. The per-unit cost of the target platform
+is typically a critical concern. No hardware component is included without
+being cost justified. As a result, the processor of the target system is
+often from a different processor family than that of the host system and
+usually has lower performance. In addition to the processor families
+targeted only for use in embedded systems, there are versions of nearly every
+general-purpose process or specifically tailored for real-time embedded
+systems. For example, many of the processors targeting the embedded market
+do not include hardware floating point units, but do include peripherals such
+as timers, serial controllers, or network interfaces.
+
+@section Resources on the Internet
+
+This section describes various resources on the Internet which are of
+use to GNAT/RTEMS users.
+
+@subsection RTEMS Mailing List
+
+rtems-users@@rtems.com
+
+This mailing list is dedicated to the discussion of issues related
+to RTEMS, including GNAT/RTEMS. If you have questions about RTEMS,
+wish to make suggestions, or just want to pick up hints, this is a
+good list to subscribe to. Subscribe by sending an empty mail
+message to rtems-users-subscribe@@rtems.com. Messages sent
+to rtems-users@@rtems.com are posted to the list.
+
+@subsection CrossGCC Mailing List
+
+crossgcc@@cygnus.com
+
+This mailing list is dedicated to the use of the GNU tools in
+cross development environments. Most of the discussions
+focus on embedded issues. Subscribe by sending a message with
+the one line "subscribe" to crossgcc-request@@cygnus.com.
+
+The crossgcc FAQ as well as a number of patches and utiliities
+of interest to cross development system users are available
+at ftp://ftp.cygnus.com/pub/embedded/crossgcc.
+
+@subsection GNAT Chat Mailing List
+
+chat@@gnat.com
+
+This mailing list is dedicated to the general discussion
+of GNAT specific issues. The discussions try to avoid
+more general Ada95 language issues which have other
+forums. Subscribe by sending a message with
+the one line "subscribe" to chat-request@@gnat.com.
+
+
diff --git a/doc/started_ada/require.t b/doc/started_ada/require.t
new file mode 100644
index 0000000000..53f9738063
--- /dev/null
+++ b/doc/started_ada/require.t
@@ -0,0 +1,122 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Requirements
+
+A fairly large amount of disk space is required to perform the build of the
+GNU C/C++ Cross Compiler Tools for RTEMS. The following table may help in
+assessing the amount of disk space required for your installation:
+
+@example
++------------------------------------+--------------------------+
+| Component | Disk Space Required |
++------------------------------------+--------------------------+
+| archive directory | 40 Mbytes |
+| tools src unarchived | 200 Mbytes |
+| each individual build directory | up to 500 Mbytes |
+| each installation directory | 20-200 Mbytes |
++------------------------------------+--------------------------+
+@end example
+
+It is important to understand that the above requirements only address
+the GNU C/C++ Cross Compiler Tools themselves. Adding additional
+languages such as Fortran or Objective-C can increase the size
+of the build and installation directories. Also, the unarchived
+source and build directories can be removed after the tools are
+installed.
+
+After the tools themselves are installed, RTEMS must be built
+and installed for each Board Support Package that you wish
+to use. Thus the precise amount of disk space required
+for each installation directory depends highly on the number
+of RTEMS BSPs which are to be installed. If a single BSP is
+installed, then the additional size of each install directory
+will tend to be in the 40-60 Mbyte range.
+
+There are a number of factors which must be taken into
+account in oreder to estimate the amount of disk space required
+to build RTEMS itself. Attempting to build multiple BSPs in
+a single step increases the disk space requirements. Similarly
+enabling optional features increases the build and install
+space requirements. In particular, enabling and building
+the RTEMS tests results in a significant increase in build
+space requirements but since the test are not installed has
+no impact on installation requirements.
+
+The instructions in this manual should work on any computer running
+a UNIX variant. Some native GNU tools are used by this procedure
+including:
+
+@itemize @bullet
+@item GCC
+@item GNAT
+@item GNU make
+@end itemize
+
+In addition, some native utilities may be deficient for building
+the GNU tools.
+
+@section Native GNAT
+
+The native GNAT must be installed in the default location or built
+from source. No GCC or GNAT environment variables should be set during
+the build or use of the cross GNAT/RTEMS toolset as this could result in
+an unpredictable mix of native and cross toolsets.
+
+Binaries for native GNAT installations are available at the primary
+GNAT ftp site (@value{GNAT-FTP}. Installation instructions are
+included with the binary GNAT distributions. The binary installation
+should be installed in the default location or installed in a
+non-default location and used ONLY to build a native GNAT from source.
+This final native GNAT will be used to build the GNAT/RTEMS cross
+development toolset.
+
+@subsection Verifying Correct Operation of Native GNAT
+
+It is imperative that the native GNAT installation work correctly for
+the installation of GNAT/RTEMS to succeed. It is recommended that the
+user verify that the native GNAT is installed correctly by performing
+these tests:
+
+@subsubsection Native Hello World Test
+
+Place the following Ada source code in hello.adb:
+
+@example
+with Text_IO; use Text_IO;
+
+procedure Hello is
+begin
+ Put_Line ( "Hello World");
+end Hello;
+@end example
+
+Use the following command sequence to ompile and execute the above program:
+
+@example
+gnatmake hello
+./hello
+@end example
+
+If the message @code{Hello World} is printed, then the native installation
+of GNAT operates well enough to proceed.
+
+@subsubsection Insure GCC and GNAT Environment Variables Are Not Set
+
+If any of the following commands produce output, then you have
+environment variables overriding the default behavior of the
+native GNAT toolset. These variables will conflict with the cross
+toolset. Please resolve this problem before proceeding further.
+
+@example
+echo $GCC_EXEC_PREFIX
+echo $ADA_INCLUDE_PATH
+echo $ADA_OBJECTS_PATH
+echo $LD_RUN_PATH
+echo $C_INCLUDE_PATH
+@end example
diff --git a/doc/started_ada/sample.t b/doc/started_ada/sample.t
new file mode 100644
index 0000000000..e66b3a3776
--- /dev/null
+++ b/doc/started_ada/sample.t
@@ -0,0 +1,57 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Building the Sample Application
+
+@section Unpack the Sample Application
+
+Use the following command to unarchive the sample application:
+
+@example
+cd tools
+tar xzf ../archive/hello_world_ada.tgz
+@end example
+
+@section Create a BSP Specific Makefile
+
+Provided are example Makefiles for multiple BSPs. Copy one of these to
+the file Makefile.<BOARD_SUPPORT_PACKAGE> and edit it as appropriate for
+your local configuration.
+
+Use the <INSTALLATION_POINT> and <BOARD_SUPPORT_PACKAGE> specified when
+configuring and installing RTEMS.
+
+@section Build the Sample Application
+
+Use the following command to start the build of the sample application:
+
+@example
+cd tools/hello_world_ada
+make -f Makefile.<BOARD_SUPPORT_PACKAGE>
+@end example
+
+NOTE: GNU make is the preferred @code{make} utility. Other @code{make}
+implementations may work but all testing is done with GNU make.
+
+If the BSP specific modifications to the Makefile were correct and
+no errors are detected during the sample application build, it is
+reasonable to assume that the build of the GNAT/RTEMS Cross Compiler Tools
+for RTEMS and RTEMS itself for the selected host and target
+combination was done properly.
+
+@section Application Executable
+
+If the sample application has successfully been build, then the application
+executable is placed in the following directory:
+
+@example
+tools/hello_world_ada/o-optimize/<filename>.exe
+@end example
+
+How this executable is downloaded to the target board is very dependent
+on the BOARD_SUPPORT_PACKAGE selected.
diff --git a/doc/started_ada/started_ada.texi b/doc/started_ada/started_ada.texi
new file mode 100644
index 0000000000..50a7911c3c
--- /dev/null
+++ b/doc/started_ada/started_ada.texi
@@ -0,0 +1,109 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename started_ada.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the Getting Started (C) Guide
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@c
+@c Now set all the tool version dependent information
+@c
+@include tversions.texi
+
+@ifset use-ascii
+@dircategory RTEMS On-Line Manual
+@direntry
+* Getting Started with GNAT/RTEMS: (started_ada)
+@end direntry
+@end ifset
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage Getting Started with RTEMS
+
+@setchapternewpage odd
+@settitle Getting Started with GNAT/RTEMS
+@titlepage
+@finalout
+
+@title Getting Started with GNAT/RTEMS
+@subtitle Edition @value{EDITION}, for @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include intro.texi
+@include require.texi
+@include buildada.texi
+@include buildrt.texi
+@include sample.texi
+@include gdb.texi
+
+@ifinfo
+@node Top, Introduction, (dir), (dir)
+@top started_ada
+
+This is the online version of the Getting Started with GNAT/RTEMS.
+
+@menu
+* Introduction::
+* Requirements::
+* Building the GNAT Cross Compiler Toolset::
+* Building RTEMS::
+* Building the Sample Application::
+* Building the GNU Debugger::
+@end menu
+
+@c * Command and Variable Index::
+@c * Concept Index::
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@c @node Command and Variable Index, Concept Index, GDB for DINK32, Top
+@c @unnumbered Command and Variable Index
+
+@c There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@c @node Concept Index, , Command and Variable Index, Top
+@c @unnumbered Concept Index
+
+@c There are currently no Concept Index entries.
+@c @printindex cp
+
+@contents
+@bye
+
diff --git a/doc/started_ada/tversions.texi b/doc/started_ada/tversions.texi
new file mode 100644
index 0000000000..67de6b0b3f
--- /dev/null
+++ b/doc/started_ada/tversions.texi
@@ -0,0 +1,86 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c This file contains all toolset version dependent information
+@c
+
+@c
+@c Comment out setting the "XYZ-RTEMSPATCH" variable if there is no
+@c patch required. The documentation will detect this and print
+@c an appropriate message in a short section.
+@c
+
+
+@c
+@c GCC Version
+@c
+
+@set GCCVERSION gcc 2.8.1
+@set GCCTAR gcc-2.8.1.tar.gz
+@set GCCUNTAR gcc-2.8.1
+@set GCCFTPSITE ftp.gnu.org
+@set GCCFTPDIR /pub/gnu/gcc
+@set GCCRTEMSPATCH gcc-2.8.1-rtems-gnat-3.13p-20000429.diff.gz
+
+@c
+@c GNAT Version
+@c
+
+@set GNAT-VERSION gnat 3.13p
+@set GNAT-TAR gnat-3.13p-src.tar.gz
+@set GNAT-UNTAR gnat-3.13p-src
+@set GNAT-FTPSITE NONE
+@set GNAT-FTPDIR NO_DIRECTORY
+@set GNAT-RTEMSPATCH gnat-3.13p-rtems-20000829.diff
+
+@c
+@c BINUTILS Version
+@c
+
+@c The "official" binutils
+@set BINUTILSVERSION binutils 2.10
+@set BINUTILSTAR binutils-2.10.tar.gz
+@set BINUTILSUNTAR binutils-2.10
+@set BINUTILSFTPSITE ftp.gnu.org
+@set BINUTILSFTPDIR /pub/gnu/binutils
+@set BINUTILSRTEMSPATCH binutils-2.10-rtems-gnat-3.13p-20001107.diff
+
+@c
+@c NEWLIB Version
+@c
+
+@set NEWLIBVERSION newlib 1.8.2
+@set NEWLIBTAR newlib-1.8.2.tar.gz
+@set NEWLIBUNTAR newlib-1.8.2
+@set NEWLIBFTPSITE sources.redhat.com
+@set NEWLIBFTPDIR /pub/newlib
+@set NEWLIBRTEMSPATCH newlib-1.8.2-rtems-20000606.diff.gz
+
+@c
+@c GDB Version
+@c
+
+@set GDBVERSION gdb 4.17
+@set GDBTAR gdb-4.17.tar.gz
+@set GDBUNTAR gdb-4.17
+@set GDBFTPSITE ftp.gnu.org
+@set GDBFTPDIR /pub/gnu/gdb/
+@set GDBRTEMSPATCH gdb-4.17-rtems-gnat-3.13p-20000918.diff
+@c @set GDB-GNATPATCH gdb-ada-patch-1.17.8.gz
+
+@c
+@c RTEMS Version
+@c
+
+@set RTEMSVERSION RTEMS Snapshot
+@set RTEMSTAR rtems-ss-DATE.tgz
+@set RTEMSUNTAR rtems-DATE
+@set RTEMSFTPSITE ftp.rtems.com
+@set RTEMSFTPDIR /pub/rtems/snapshots/current
+
diff --git a/doc/supplements/.cvsignore b/doc/supplements/.cvsignore
new file mode 100644
index 0000000000..282522db03
--- /dev/null
+++ b/doc/supplements/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/doc/supplements/Makefile.am b/doc/supplements/Makefile.am
new file mode 100644
index 0000000000..c2f88d2318
--- /dev/null
+++ b/doc/supplements/Makefile.am
@@ -0,0 +1,14 @@
+## $Id$
+
+SUBDIRS = arm
+SUBDIRS += c4x
+SUBDIRS += i386
+SUBDIRS += i960
+SUBDIRS += m68k
+SUBDIRS += mips
+SUBDIRS += powerpc
+SUBDIRS += sh
+SUBDIRS += sparc
+SUBDIRS += template
+
+EXTRA_DIST = supplement.am
diff --git a/doc/supplements/arm/.cvsignore b/doc/supplements/arm/.cvsignore
new file mode 100644
index 0000000000..22c2f96860
--- /dev/null
+++ b/doc/supplements/arm/.cvsignore
@@ -0,0 +1,38 @@
+arm
+arm-?
+arm-??
+arm.aux
+arm.cp
+arm.dvi
+arm.fn
+arm*.html
+arm.ky
+arm.log
+arm.pdf
+arm.pg
+arm.ps
+arm.toc
+arm.tp
+arm.vr
+bsp.texi
+callconv.texi
+cpumodel.texi
+cputable.texi
+fatalerr.texi
+index.html
+intr.t
+intr.texi
+Makefile
+Makefile.in
+mdate-sh
+memmodel.texi
+rtems_footer.html
+rtems_header.html
+stamp-vti
+timeBSP_.t
+timeBSP.texi
+timing.t
+timing.texi
+version.texi
+wksheets.t
+wksheets.texi
diff --git a/doc/supplements/arm/BSP_TIMES b/doc/supplements/arm/BSP_TIMES
new file mode 100644
index 0000000000..296602a23f
--- /dev/null
+++ b/doc/supplements/arm/BSP_TIMES
@@ -0,0 +1,247 @@
+#
+# CPU MODEL/BSP Timing and Size Information
+#
+# $Id$
+#
+
+#
+# CPU Model Information
+#
+RTEMS_BSP generic-arm9dtmi
+RTEMS_CPU_MODEL arm9dtmi
+#
+# Interrupt Latency
+#
+# NOTE: In general, the text says it is hand-calculated to be
+# RTEMS_MAXIMUM_DISABLE_PERIOD at RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+# Mhz and this was last calculated for Release
+# RTEMS_VERSION_FOR_MAXIMUM_DISABLE_PERIOD.
+#
+RTEMS_MAXIMUM_DISABLE_PERIOD TBD
+RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ 100
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD ss-20020301
+#
+# Context Switch Times
+#
+RTEMS_NO_FP_CONTEXTS 11
+RTEMS_RESTORE_1ST_FP_TASK NA
+RTEMS_SAVE_INIT_RESTORE_INIT NA
+RTEMS_SAVE_IDLE_RESTORE_INIT NA
+RTEMS_SAVE_IDLE_RESTORE_IDLE NA
+#
+# Task Manager Times
+#
+RTEMS_TASK_CREATE_ONLY 43
+RTEMS_TASK_IDENT_ONLY 85
+RTEMS_TASK_START_ONLY 19
+RTEMS_TASK_RESTART_CALLING_TASK 26
+RTEMS_TASK_RESTART_SUSPENDED_RETURNS_TO_CALLER 23
+RTEMS_TASK_RESTART_BLOCKED_RETURNS_TO_CALLER 28
+RTEMS_TASK_RESTART_READY_RETURNS_TO_CALLER 24
+RTEMS_TASK_RESTART_SUSPENDED_PREEMPTS_CALLER 35
+RTEMS_TASK_RESTART_BLOCKED_PREEMPTS_CALLER 64
+RTEMS_TASK_RESTART_READY_PREEMPTS_CALLER 64
+RTEMS_TASK_DELETE_CALLING_TASK 55
+RTEMS_TASK_DELETE_SUSPENDED_TASK 42
+RTEMS_TASK_DELETE_BLOCKED_TASK 43
+RTEMS_TASK_DELETE_READY_TASK 43
+RTEMS_TASK_SUSPEND_CALLING_TASK 21
+RTEMS_TASK_SUSPEND_RETURNS_TO_CALLER 9
+RTEMS_TASK_RESUME_TASK_READIED_RETURNS_TO_CALLER 10
+RTEMS_TASK_RESUME_TASK_READIED_PREEMPTS_CALLER 18
+RTEMS_TASK_SET_PRIORITY_OBTAIN_CURRENT_PRIORITY 7
+RTEMS_TASK_SET_PRIORITY_RETURNS_TO_CALLER 15
+RTEMS_TASK_SET_PRIORITY_PREEMPTS_CALLER 29
+RTEMS_TASK_MODE_OBTAIN_CURRENT_MODE 4
+RTEMS_TASK_MODE_NO_RESCHEDULE 4
+RTEMS_TASK_MODE_RESCHEDULE_RETURNS_TO_CALLER 13
+RTEMS_TASK_MODE_RESCHEDULE_PREEMPTS_CALLER 30
+RTEMS_TASK_GET_NOTE_ONLY 8
+RTEMS_TASK_SET_NOTE_ONLY 7
+RTEMS_TASK_WAKE_AFTER_YIELD_RETURNS_TO_CALLER 5
+RTEMS_TASK_WAKE_AFTER_YIELD_PREEMPTS_CALLER 17
+RTEMS_TASK_WAKE_WHEN_ONLY 33
+#
+# Interrupt Manager
+#
+RTEMS_INTR_ENTRY_RETURNS_TO_NESTED unavailable
+RTEMS_INTR_ENTRY_RETURNS_TO_INTERRUPTED_TASK unavailable
+RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK unavailable
+RTEMS_INTR_EXIT_RETURNS_TO_NESTED unavailable
+RTEMS_INTR_EXIT_RETURNS_TO_INTERRUPTED_TASK unavailable
+RTEMS_INTR_EXIT_RETURNS_TO_PREEMPTING_TASK unavailable
+#
+# Clock Manager
+#
+RTEMS_CLOCK_SET_ONLY 21
+RTEMS_CLOCK_GET_ONLY 1
+RTEMS_CLOCK_TICK_ONLY 10
+#
+# Timer Manager
+#
+RTEMS_TIMER_CREATE_ONLY 8
+RTEMS_TIMER_IDENT_ONLY 83
+RTEMS_TIMER_DELETE_INACTIVE 11
+RTEMS_TIMER_DELETE_ACTIVE 12
+RTEMS_TIMER_FIRE_AFTER_INACTIVE 14
+RTEMS_TIMER_FIRE_AFTER_ACTIVE 15
+RTEMS_TIMER_FIRE_WHEN_INACTIVE 21
+RTEMS_TIMER_FIRE_WHEN_ACTIVE 21
+RTEMS_TIMER_RESET_INACTIVE 14
+RTEMS_TIMER_RESET_ACTIVE 15
+RTEMS_TIMER_CANCEL_INACTIVE 7
+RTEMS_TIMER_CANCEL_ACTIVE 9
+#
+# Semaphore Manager
+#
+RTEMS_SEMAPHORE_CREATE_ONLY 27
+RTEMS_SEMAPHORE_IDENT_ONLY 97
+RTEMS_SEMAPHORE_DELETE_ONLY 24
+RTEMS_SEMAPHORE_OBTAIN_AVAILABLE 5
+RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_NO_WAIT 5
+RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_CALLER_BLOCKS 28
+RTEMS_SEMAPHORE_RELEASE_NO_WAITING_TASKS 9
+RTEMS_SEMAPHORE_RELEASE_TASK_READIED_RETURNS_TO_CALLER 14
+RTEMS_SEMAPHORE_RELEASE_TASK_READIED_PREEMPTS_CALLER 22
+#
+# Message Manager
+#
+RTEMS_MESSAGE_QUEUE_CREATE_ONLY 54
+RTEMS_MESSAGE_QUEUE_IDENT_ONLY 83
+RTEMS_MESSAGE_QUEUE_DELETE_ONLY 32
+RTEMS_MESSAGE_QUEUE_SEND_NO_WAITING_TASKS 14
+RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_RETURNS_TO_CALLER 16
+RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_PREEMPTS_CALLER 25
+RTEMS_MESSAGE_QUEUE_URGENT_NO_WAITING_TASKS 14
+RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_RETURNS_TO_CALLER 16
+RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_PREEMPTS_CALLER 25
+RTEMS_MESSAGE_QUEUE_BROADCAST_NO_WAITING_TASKS 11
+RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_RETURNS_TO_CALLER 35
+RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_PREEMPTS_CALLER 42
+RTEMS_MESSAGE_QUEUE_RECEIVE_AVAILABLE 15
+RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_NO_WAIT 10
+RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS 29
+RTEMS_MESSAGE_QUEUE_FLUSH_NO_MESSAGES_FLUSHED 8
+RTEMS_MESSAGE_QUEUE_FLUSH_MESSAGES_FLUSHED 9
+#
+# Event Manager
+#
+RTEMS_EVENT_SEND_NO_TASK_READIED 7
+RTEMS_EVENT_SEND_TASK_READIED_RETURNS_TO_CALLER 13
+RTEMS_EVENT_SEND_TASK_READIED_PREEMPTS_CALLER 22
+RTEMS_EVENT_RECEIVE_OBTAIN_CURRENT_EVENTS 1
+RTEMS_EVENT_RECEIVE_AVAILABLE 14
+RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_NO_WAIT 7
+RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS 24
+#
+# Signal Manager
+#
+RTEMS_SIGNAL_CATCH_ONLY 7
+RTEMS_SIGNAL_SEND_RETURNS_TO_CALLER 16
+RTEMS_SIGNAL_SEND_SIGNAL_TO_SELF 29
+RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_CALLING_TASK 22
+RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_PREEMPTING_TASK 25
+#
+# Partition Manager
+#
+RTEMS_PARTITION_CREATE_ONLY 27
+RTEMS_PARTITION_IDENT_ONLY 83
+RTEMS_PARTITION_DELETE_ONLY 18
+RTEMS_PARTITION_GET_BUFFER_AVAILABLE 14
+RTEMS_PARTITION_GET_BUFFER_NOT_AVAILABLE 10
+RTEMS_PARTITION_RETURN_BUFFER_ONLY 17
+#
+# Region Manager
+#
+RTEMS_REGION_CREATE_ONLY 29
+RTEMS_REGION_IDENT_ONLY 84
+RTEMS_REGION_DELETE_ONLY 17
+RTEMS_REGION_GET_SEGMENT_AVAILABLE 14
+RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_NO_WAIT 18
+RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_CALLER_BLOCKS 56
+RTEMS_REGION_RETURN_SEGMENT_NO_WAITING_TASKS 15
+RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_RETURNS_TO_CALLER 40
+RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_PREEMPTS_CALLER 58
+#
+# Dual-Ported Memory Manager
+#
+RTEMS_PORT_CREATE_ONLY 18
+RTEMS_PORT_IDENT_ONLY 83
+RTEMS_PORT_DELETE_ONLY 19
+RTEMS_PORT_INTERNAL_TO_EXTERNAL_ONLY 6
+RTEMS_PORT_EXTERNAL_TO_INTERNAL_ONLY 6
+#
+# IO Manager
+#
+RTEMS_IO_INITIALIZE_ONLY 2
+RTEMS_IO_OPEN_ONLY 1
+RTEMS_IO_CLOSE_ONLY 1
+RTEMS_IO_READ_ONLY 1
+RTEMS_IO_WRITE_ONLY 1
+RTEMS_IO_CONTROL_ONLY 1
+#
+# Rate Monotonic Manager
+#
+RTEMS_RATE_MONOTONIC_CREATE_ONLY 18
+RTEMS_RATE_MONOTONIC_IDENT_ONLY 83
+RTEMS_RATE_MONOTONIC_CANCEL_ONLY 18
+RTEMS_RATE_MONOTONIC_DELETE_ACTIVE 23
+RTEMS_RATE_MONOTONIC_DELETE_INACTIVE 21
+RTEMS_RATE_MONOTONIC_PERIOD_INITIATE_PERIOD_RETURNS_TO_CALLER 25
+RTEMS_RATE_MONOTONIC_PERIOD_CONCLUDE_PERIOD_CALLER_BLOCKS 20
+RTEMS_RATE_MONOTONIC_PERIOD_OBTAIN_STATUS 13
+#
+# Size Information
+#
+#
+# xxx alloted for numbers
+#
+RTEMS_DATA_SPACE na
+RTEMS_MINIMUM_CONFIGURATION na
+RTEMS_MAXIMUM_CONFIGURATION na
+# x,xxx alloted for numbers
+RTEMS_CORE_CODE_SIZE na
+RTEMS_INITIALIZATION_CODE_SIZE na
+RTEMS_TASK_CODE_SIZE na
+RTEMS_INTERRUPT_CODE_SIZE na
+RTEMS_CLOCK_CODE_SIZE na
+RTEMS_TIMER_CODE_SIZE na
+RTEMS_SEMAPHORE_CODE_SIZE na
+RTEMS_MESSAGE_CODE_SIZE na
+RTEMS_EVENT_CODE_SIZE na
+RTEMS_SIGNAL_CODE_SIZE na
+RTEMS_PARTITION_CODE_SIZE na
+RTEMS_REGION_CODE_SIZE na
+RTEMS_DPMEM_CODE_SIZE na
+RTEMS_IO_CODE_SIZE na
+RTEMS_FATAL_ERROR_CODE_SIZE na
+RTEMS_RATE_MONOTONIC_CODE_SIZE na
+RTEMS_MULTIPROCESSING_CODE_SIZE na
+# xxx alloted for numbers
+RTEMS_TIMER_CODE_OPTSIZE na
+RTEMS_SEMAPHORE_CODE_OPTSIZE na
+RTEMS_MESSAGE_CODE_OPTSIZE na
+RTEMS_EVENT_CODE_OPTSIZE na
+RTEMS_SIGNAL_CODE_OPTSIZE na
+RTEMS_PARTITION_CODE_OPTSIZE na
+RTEMS_REGION_CODE_OPTSIZE na
+RTEMS_DPMEM_CODE_OPTSIZE na
+RTEMS_IO_CODE_OPTSIZE na
+RTEMS_RATE_MONOTONIC_CODE_OPTSIZE na
+RTEMS_MULTIPROCESSING_CODE_OPTSIZE na
+# xxx alloted for numbers
+RTEMS_BYTES_PER_TASK na
+RTEMS_BYTES_PER_TIMER na
+RTEMS_BYTES_PER_SEMAPHORE na
+RTEMS_BYTES_PER_MESSAGE_QUEUE na
+RTEMS_BYTES_PER_REGION na
+RTEMS_BYTES_PER_PARTITION na
+RTEMS_BYTES_PER_PORT na
+RTEMS_BYTES_PER_PERIOD na
+RTEMS_BYTES_PER_EXTENSION na
+RTEMS_BYTES_PER_FP_TASK na
+RTEMS_BYTES_PER_NODE na
+RTEMS_BYTES_PER_GLOBAL_OBJECT na
+RTEMS_BYTES_PER_PROXY na
+# x,xxx alloted for numbers
+RTEMS_BYTES_OF_FIXED_SYSTEM_REQUIREMENTS na
diff --git a/doc/supplements/arm/ChangeLog b/doc/supplements/arm/ChangeLog
new file mode 100644
index 0000000000..74092a8203
--- /dev/null
+++ b/doc/supplements/arm/ChangeLog
@@ -0,0 +1,83 @@
+2003-12-12 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-12-11 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-11-26 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Add *.info to CLEANFILES to accomodate
+ automake-1.7f/1.8 breaking building infos.
+
+2003-09-26 Joel Sherrill <joel@OARcorp.com>
+
+ * cpumodel.t: Obsoleting HP PA-RISC port and removing all references.
+
+2003-09-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Merger from rtems-4-6-branch.
+
+2003-09-19 Joel Sherrill <joel@OARcorp.com>
+
+ * arm.texi: Merge from branch.
+
+2003-01-25 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * arm.texi: Set @setfilename arm.info.
+
+2003-01-24 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Put GENERATED_FILES into $builddir.
+
+2003-01-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * version.texi: Remove from CVS.
+ * stamp-vti: Remove from CVS.
+ * .cvsignore: Add version.texi.
+ Add stamp-vti.
+ Re-sort.
+
+2003-01-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * wksheets.texi: Remove from CVS.
+ * timing.texi: Remove from CVS.
+
+2003-01-21 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-11-13 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-11-13 Jay Monkman <jtm@smoothsmoothie.com>
+
+ * intr_NOTIMES.t: Real version submitted.
+
+2002-10-24 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-08-01 Joel Sherrill <joel@OARcorp.com>
+
+ * BSP_TIMES, wksheets.texi: Updated to reflect ARM times
+ reported by Jay Monkman <jmonkman@adventnetworks.com>. These
+ times are subject to change as he tunes the ARM port and their BSP.
+
+2002-07-30 Joel Sherrill <joel@OARcorp.com>
+
+ * .cvsignore: Corrected by tailoring for the ARM.
+
+2002-07-30 Joel Sherrill <joel@OARcorp.com>
+
+ * .cvsignore: New file.
+
+2002-07-30 Joel Sherrill <joel@OARcorp.com>
+
+ * BSP_TIMES, ChangeLog, Makefile.am, arm.texi, bsp.t, callconv.t,
+ cpumodel.t, cputable.t, fatalerr.t, intr_NOTIMES.t, memmodel.t,
+ preface.texi, stamp-vti, timeBSP.t, timing.texi, version.texi,
+ wksheets.texi: New files as ARM supplement initial version added.
+
diff --git a/doc/supplements/arm/Makefile.am b/doc/supplements/arm/Makefile.am
new file mode 100644
index 0000000000..3a83e7184d
--- /dev/null
+++ b/doc/supplements/arm/Makefile.am
@@ -0,0 +1,110 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = arm
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/supplements/supplement.am
+
+GENERATED_FILES = cpumodel.texi callconv.texi memmodel.texi intr.texi \
+ fatalerr.texi bsp.texi cputable.texi wksheets.texi timing.texi \
+ timeBSP.texi
+COMMON_FILES += $(top_srcdir)/common/cpright.texi \
+ $(top_srcdir)/common/timemac.texi
+
+FILES = preface.texi
+
+info_TEXINFOS = arm.texi
+arm_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+#
+# Chapters which get automatic processing
+#
+
+cpumodel.texi: cpumodel.t
+ $(BMENU2) -p "Preface" \
+ -u "Top" \
+ -n "Calling Conventions" < $< > $@
+
+callconv.texi: callconv.t
+ $(BMENU2) -p "CPU Model Dependent Features Floating Point Unit" \
+ -u "Top" \
+ -n "Memory Model" < $< > $@
+
+memmodel.texi: memmodel.t
+ $(BMENU2) -p "Calling Conventions User-Provided Routines" \
+ -u "Top" \
+ -n "Interrupt Processing" < $< > $@
+
+# Interrupt Chapter:
+# 1. Replace Times and Sizes
+# 2. Build Node Structure
+intr.texi: intr_NOTIMES.t BSP_TIMES
+ ${REPLACE2} -p $(srcdir)/BSP_TIMES $(srcdir)/intr_NOTIMES.t | \
+ $(BMENU2) -p "Memory Model Flat Memory Model" \
+ -u "Top" \
+ -n "Default Fatal Error Processing" > $@
+
+fatalerr.texi: fatalerr.t
+ $(BMENU2) -p "Interrupt Processing Interrupt Stack" \
+ -u "Top" \
+ -n "Board Support Packages" < $< > $@
+
+bsp.texi: bsp.t
+ $(BMENU2) -p "Default Fatal Error Processing Default Fatal Error Handler Operations" \
+ -u "Top" \
+ -n "Processor Dependent Information Table" < $< > $@
+
+cputable.texi: cputable.t
+ $(BMENU2) -p "Board Support Packages Processor Initialization" \
+ -u "Top" \
+ -n "Memory Requirements" < $< > $@
+
+# Worksheets Chapter:
+# 1. Obtain the Shared File
+# 2. Replace Times and Sizes
+# 3. Build Node Structure
+
+wksheets.texi: $(top_srcdir)/common/wksheets.t BSP_TIMES
+ ${REPLACE2} -p $(srcdir)/BSP_TIMES \
+ $(top_srcdir)/common/wksheets.t | \
+ $(BMENU2) -p "Processor Dependent Information Table CPU Dependent Information Table" \
+ -u "Top" \
+ -n "Timing Specification" > $@
+
+# Timing Specification Chapter:
+# 1. Copy the Shared File
+# 3. Build Node Structure
+
+timing.texi: $(top_srcdir)/common/timing.t
+ $(BMENU2) -p "Memory Requirements RTEMS RAM Workspace Worksheet" \
+ -u "Top" \
+ -n "MYBSP Timing Data" < $< > $@
+
+# Timing Data for BSP BSP Chapter:
+# 1. Copy the Shared File
+# 2. Replace Times and Sizes
+# 3. Build Node Structure
+
+timeBSP.texi: $(top_srcdir)/common/timetbl.t timeBSP.t
+ cat $(srcdir)/timeBSP.t $(top_srcdir)/common/timetbl.t >timeBSP_.t
+ @echo >>timeBSP_.t
+ @echo "@tex" >>timeBSP_.t
+ @echo "\\global\\advance \\smallskipamount by 4pt" >>timeBSP_.t
+ @echo "@end tex" >>timeBSP_.t
+ ${REPLACE2} -p $(srcdir)/BSP_TIMES timeBSP_.t | \
+ $(BMENU2) -p "Timing Specification Terminology" \
+ -u "Top" \
+ -n "Command and Variable Index" > $@
+CLEANFILES += timeBSP_.t
+
+EXTRA_DIST = BSP_TIMES bsp.t callconv.t cpumodel.t cputable.t fatalerr.t \
+ intr_NOTIMES.t memmodel.t timeBSP.t
+
+CLEANFILES += arm.info
diff --git a/doc/supplements/arm/arm.texi b/doc/supplements/arm/arm.texi
new file mode 100644
index 0000000000..32c3dcab18
--- /dev/null
+++ b/doc/supplements/arm/arm.texi
@@ -0,0 +1,115 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename arm.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the ARM Applications Supplement
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS Target Supplements
+@direntry
+* RTEMS ARM Applications Supplement: (arm).
+@end direntry
+@end ifset
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage RTEMS ARM Applications Supplement
+
+@setchapternewpage odd
+@settitle RTEMS ARM Applications Supplement
+@titlepage
+@finalout
+
+@title RTEMS ARM Applications Supplement
+@subtitle Edition @value{EDITION}, for RTEMS @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include preface.texi
+@include cpumodel.texi
+@include callconv.texi
+@include memmodel.texi
+@include intr.texi
+@include fatalerr.texi
+@include bsp.texi
+@include cputable.texi
+@include wksheets.texi
+@include timing.texi
+@include timeBSP.texi
+@ifinfo
+@node Top, Preface, (dir), (dir)
+@top arm
+
+This is the online version of the RTEMS ARM
+Applications Supplement.
+
+@menu
+* Preface::
+* CPU Model Dependent Features::
+* Calling Conventions::
+* Memory Model::
+* Interrupt Processing::
+* Default Fatal Error Processing::
+* Board Support Packages::
+* Processor Dependent Information Table::
+* Memory Requirements::
+* Timing Specification::
+* MYBSP Timing Data::
+* Command and Variable Index::
+* Concept Index::
+@end menu
+
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@node Command and Variable Index, Concept Index, MYBSP Timing Data Rate Monotonic Manager, Top
+@unnumbered Command and Variable Index
+
+There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@node Concept Index, , Command and Variable Index, Top
+@unnumbered Concept Index
+
+There are currently no Concept Index entries.
+@c @printindex cp
+
+@contents
+@bye
+
diff --git a/doc/supplements/arm/bsp.t b/doc/supplements/arm/bsp.t
new file mode 100644
index 0000000000..657c359a96
--- /dev/null
+++ b/doc/supplements/arm/bsp.t
@@ -0,0 +1,93 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Board Support Packages
+
+@section Introduction
+
+An RTEMS Board Support Package (BSP) must be designed
+to support a particular processor and target board combination.
+This chapter presents a discussion of XXX specific BSP
+issues. For more information on developing a BSP, refer to the
+chapter titled Board Support Packages in the RTEMS
+Applications User's Guide.
+
+@section System Reset
+
+An RTEMS based application is initiated or
+re-initiated when the XXX processor is reset. When the
+XXX is reset, the processor performs the following actions:
+
+@itemize @bullet
+@item The tracing bits of the status register are cleared to
+disable tracing.
+
+@item The supervisor interrupt state is entered by setting the
+supervisor (S) bit and clearing the master/interrupt (M) bit of
+the status register.
+
+@item The interrupt mask of the status register is set to
+level 7 to effectively disable all maskable interrupts.
+
+@item The vector base register (VBR) is set to zero.
+
+@item The cache control register (CACR) is set to zero to
+disable and freeze the processor cache.
+
+@item The interrupt stack pointer (ISP) is set to the value
+stored at vector 0 (bytes 0-3) of the exception vector table
+(EVT).
+
+@item The program counter (PC) is set to the value stored at
+vector 1 (bytes 4-7) of the EVT.
+
+@item The processor begins execution at the address stored in
+the PC.
+@end itemize
+
+@section Processor Initialization
+
+The address of the application's initialization code
+should be stored in the first vector of the EVT which will allow
+the immediate vectoring to the application code. If the
+application requires that the VBR be some value besides zero,
+then it should be set to the required value at this point. All
+tasks share the same XXX's VBR value. Because interrupts
+are enabled automatically by RTEMS as part of the initialize
+executive directive, the VBR MUST be set before this directive
+is invoked to insure correct interrupt vectoring. If processor
+caching is to be utilized, then it should be enabled during the
+reset application initialization code.
+
+In addition to the requirements described in the
+Board Support Packages chapter of the Applications User's
+Manual for the reset code which is executed before the call to
+initialize executive, the XXX version has the following
+specific requirements:
+
+@itemize @bullet
+@item Must leave the S bit of the status register set so that
+the XXX remains in the supervisor state.
+
+@item Must set the M bit of the status register to remove the
+XXX from the interrupt state.
+
+@item Must set the master stack pointer (MSP) such that a
+minimum stack size of MINIMUM_STACK_SIZE bytes is provided for
+the initialize executive directive.
+
+@item Must initialize the XXX's vector table.
+@end itemize
+
+Note that the BSP is not responsible for allocating
+or installing the interrupt stack. RTEMS does this
+automatically as part of initialization. If the BSP does not
+install an interrupt stack and -- for whatever reason -- an
+interrupt occurs before initialize_executive is invoked, then
+the results are unpredictable.
+
diff --git a/doc/supplements/arm/callconv.t b/doc/supplements/arm/callconv.t
new file mode 100644
index 0000000000..167f5b8fa5
--- /dev/null
+++ b/doc/supplements/arm/callconv.t
@@ -0,0 +1,73 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Calling Conventions
+
+@section Introduction
+
+Each high-level language compiler generates
+subroutine entry and exit code based upon a set of rules known
+as the compiler's calling convention. These rules address the
+following issues:
+
+@itemize @bullet
+@item register preservation and usage
+@item parameter passing
+@item call and return mechanism
+@end itemize
+
+A compiler's calling convention is of importance when
+interfacing to subroutines written in another language either
+assembly or high-level. Even when the high-level language and
+target processor are the same, different compilers may use
+different calling conventions. As a result, calling conventions
+are both processor and compiler dependent.
+
+@section Processor Background
+
+The ARM architecture supports a simple yet
+effective call and return mechanism. A subroutine is invoked
+via the branch and link (@code{bl}) instruction. This instruction
+saves the return address in the @code{lr} register. Returning
+from a subroutine only requires that the return address be
+moved into the program counter (@code{pc}), possibly with
+an offset. It is is important to
+note that the @code{bl} instruction does not
+automatically save or restore any registers. It is the
+responsibility of the high-level language compiler to define the
+register preservation and usage convention.
+
+@section Calling Mechanism
+
+All RTEMS directives are invoked using the @code{bl}
+instruction and return to the user application via the
+mechanism described above.
+
+@section Register Usage
+
+As discussed above, the ARM's call and return mechanism dos
+not automatically save any registers. RTEMS uses the registers
+@code{r0}, @code{r1}, @code{r2}, and @code{r3} as scratch registers and
+per ARM calling convention, the @code{lr} register is altered
+as well. These registers are not preserved by RTEMS directives
+therefore, the contents of these registers should not be assumed
+upon return from any RTEMS directive.
+
+@section Parameter Passing
+
+RTEMS assumes that ARM calling conventions are followed and that
+the first four arguments are placed in registers @code{r0} through
+@code{r3}. If there are more arguments, than that, then they
+are place on the stack.
+
+@section User-Provided Routines
+
+All user-provided routines invoked by RTEMS, such as
+user extensions, device drivers, and MPCI routines, must also
+adhere to these calling conventions.
+
diff --git a/doc/supplements/arm/cpumodel.t b/doc/supplements/arm/cpumodel.t
new file mode 100644
index 0000000000..a5891950bc
--- /dev/null
+++ b/doc/supplements/arm/cpumodel.t
@@ -0,0 +1,85 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter CPU Model Dependent Features
+
+@section Introduction
+
+Microprocessors are generally classified into
+families with a variety of CPU models or implementations within
+that family. Within a processor family, there is a high level
+of binary compatibility. This family may be based on either an
+architectural specification or on maintaining compatibility with
+a popular processor. Recent microprocessor families such as the
+ARM, SPARC, and PowerPC are based on an architectural specification
+which is independent or any particular CPU model or
+implementation. Older families such as the M68xxx and the iX86
+evolved as the manufacturer strived to produce higher
+performance processor models which maintained binary
+compatibility with older models.
+
+RTEMS takes advantage of the similarity of the
+various models within a CPU family. Although the models do vary
+in significant ways, the high level of compatibility makes it
+possible to share the bulk of the CPU dependent executive code
+across the entire family. Each processor family supported by
+RTEMS has a list of features which vary between CPU models
+within a family. For example, the most common model dependent
+feature regardless of CPU family is the presence or absence of a
+floating point unit or coprocessor. When defining the list of
+features present on a particular CPU model, one simply notes
+that floating point hardware is or is not present and defines a
+single constant appropriately. Conditional compilation is
+utilized to include the appropriate source code for this CPU
+model's feature set. It is important to note that this means
+that RTEMS is thus compiled using the appropriate feature set
+and compilation flags optimal for this CPU model used. The
+alternative would be to generate a binary which would execute on
+all family members using only the features which were always
+present.
+
+This chapter presents the set of features which vary
+across ARM implementations and are of importance to RTEMS.
+The set of CPU model feature macros are defined in the file
+cpukit/score/cpu/arm/rtems/score/arm.h based upon the particular CPU
+model defined on the compilation command line.
+
+@section CPU Model Name
+
+The macro @code{CPU_MODEL_NAME} is a string which designates
+the architectural level of this CPU model. The following is
+a list of the settings for this string based upon @code{gcc}
+CPU model predefines:
+
+@example
+__ARM_ARCH4__ "ARMv4"
+__ARM_ARCH4T__ "ARMv4T"
+__ARM_ARCH5__ "ARMv5"
+__ARM_ARCH5T__ "ARMv5T"
+__ARM_ARCH5E__ "ARMv5E"
+__ARM_ARCH5TE__ "ARMv5TE"
+@end example
+
+@section Count Leading Zeroes Instruction
+
+The macro @code{ARM_HAS_CLZ} is set to 1 to indicate that
+the architectural version has the @code{clz} instruction.
+On ARM architectural version 5 and above, the count
+leading zeroes instruction (@code{clz}) is available and
+can be used to speed up the find first bit operation.
+The use of this instruction significantly speeds up the
+scheduling associated with a thread blocking.
+
+@section Floating Point Unit
+
+The macro ARM_HAS_FPU is set to 1 to indicate that
+this CPU model has a hardware floating point unit and 0
+otherwise. It does not matter whether the hardware floating
+point support is incorporated on-chip or is an external
+coprocessor.
+
diff --git a/doc/supplements/arm/cputable.t b/doc/supplements/arm/cputable.t
new file mode 100644
index 0000000000..75d0fc15f6
--- /dev/null
+++ b/doc/supplements/arm/cputable.t
@@ -0,0 +1,109 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Processor Dependent Information Table
+
+@section Introduction
+
+Any highly processor dependent information required
+to describe a processor to RTEMS is provided in the CPU
+Dependent Information Table. This table is not required for all
+processors supported by RTEMS. This chapter describes the
+contents, if any, for a particular processor type.
+
+@section CPU Dependent Information Table
+
+The XXX version of the RTEMS CPU Dependent
+Information Table contains the information required to interface
+a Board Support Package and RTEMS on the XXX. This
+information is provided to allow RTEMS to interoperate
+effectively with the BSP. The C structure definition is given
+here:
+
+@example
+@group
+typedef struct @{
+ void (*pretasking_hook)( void );
+ void (*predriver_hook)( void );
+ void (*postdriver_hook)( void );
+ void (*idle_task)( void );
+ boolean do_zero_of_workspace;
+ unsigned32 idle_task_stack_size;
+ unsigned32 interrupt_stack_size;
+ unsigned32 extra_mpci_receive_server_stack;
+ void * (*stack_allocate_hook)( unsigned32 );
+ void (*stack_free_hook)( void* );
+ /* end of fields required on all CPUs */
+
+ /* XXX CPU family dependent stuff */
+@} rtems_cpu_table;
+@end group
+@end example
+
+@table @code
+@item pretasking_hook
+is the address of the user provided routine which is invoked
+once RTEMS APIs are initialized. This routine will be invoked
+before any system tasks are created. Interrupts are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item predriver_hook
+is the address of the user provided
+routine that is invoked immediately before the
+the device drivers and MPCI are initialized. RTEMS
+initialization is complete but interrupts and tasking are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item postdriver_hook
+is the address of the user provided
+routine that is invoked immediately after the
+the device drivers and MPCI are initialized. RTEMS
+initialization is complete but interrupts and tasking are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item idle_task
+is the address of the optional user
+provided routine which is used as the system's IDLE task. If
+this field is not NULL, then the RTEMS default IDLE task is not
+used. This field may be NULL to indicate that the default IDLE
+is to be used.
+
+@item do_zero_of_workspace
+indicates whether RTEMS should
+zero the Workspace as part of its initialization. If set to
+TRUE, the Workspace is zeroed. Otherwise, it is not.
+
+@item idle_task_stack_size
+is the size of the RTEMS idle task stack in bytes.
+If this number is less than MINIMUM_STACK_SIZE, then the
+idle task's stack will be MINIMUM_STACK_SIZE in byte.
+
+@item interrupt_stack_size
+is the size of the RTEMS
+allocated interrupt stack in bytes. This value must be at least
+as large as MINIMUM_STACK_SIZE.
+
+@item extra_mpci_receive_server_stack
+is the extra stack space allocated for the RTEMS MPCI receive server task
+in bytes. The MPCI receive server may invoke nearly all directives and
+may require extra stack space on some targets.
+
+@item stack_allocate_hook
+is the address of the optional user provided routine which allocates
+memory for task stacks. If this hook is not NULL, then a stack_free_hook
+must be provided as well.
+
+@item stack_free_hook
+is the address of the optional user provided routine which frees
+memory for task stacks. If this hook is not NULL, then a stack_allocate_hook
+must be provided as well.
+
+@item XXX
+is where the CPU family dependent stuff goes.
+
+@end table
diff --git a/doc/supplements/arm/fatalerr.t b/doc/supplements/arm/fatalerr.t
new file mode 100644
index 0000000000..8a703718ea
--- /dev/null
+++ b/doc/supplements/arm/fatalerr.t
@@ -0,0 +1,37 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Default Fatal Error Processing
+
+@section Introduction
+
+Upon detection of a fatal error by either the
+application or RTEMS the fatal error manager is invoked. The
+fatal error manager will invoke the user-supplied fatal error
+handlers. If no user-supplied handlers are configured, the
+RTEMS provided default fatal error handler is invoked. If the
+user-supplied fatal error handlers return to the executive the
+default fatal error handler is then invoked. This chapter
+describes the precise operations of the default fatal error
+handler.
+
+@section Default Fatal Error Handler Operations
+
+The default fatal error handler which is invoked by
+the @code{rtems_fatal_error_occurred} directive when there is
+no user handler configured or the user handler returns control to
+RTEMS. The default fatal error handler performs the
+following actions:
+
+@itemize @bullet
+@item disables processor interrupts,
+@item places the error code in @b{r0}, and
+@item executes an infinite loop (@code{while(0);} to
+simulate a halt processor instruction.
+@end itemize
+
diff --git a/doc/supplements/arm/intr_NOTIMES.t b/doc/supplements/arm/intr_NOTIMES.t
new file mode 100644
index 0000000000..f4c61fa448
--- /dev/null
+++ b/doc/supplements/arm/intr_NOTIMES.t
@@ -0,0 +1,122 @@
+@c
+@c Interrupt Stack Frame Picture
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Interrupt Processing
+
+@section Introduction
+
+Different types of processors respond to the
+occurrence of an interrupt in its own unique fashion. In
+addition, each processor type provides a control mechanism to
+allow for the proper handling of an interrupt. The processor
+dependent response to the interrupt modifies the current
+execution state and results in a change in the execution stream.
+Most processors require that an interrupt handler utilize some
+special control mechanisms to return to the normal processing
+stream. Although RTEMS hides many of the processor dependent
+details of interrupt processing, it is important to understand
+how the RTEMS interrupt manager is mapped onto the processor's
+unique architecture. Discussed in this chapter are the ARM's
+interrupt response and control mechanisms as they pertain to
+RTEMS.
+
+The ARM has 7 exception types:
+@itemize @bullet
+
+@item Reset
+@item Undefined instruction
+@item Software interrupt (SWI)
+@item Prefetch Abort
+@item Data Abort
+@item Interrupt (IRQ)
+@item Fast Interrupt (FIQ)
+
+@end itemize
+
+Of these types, only IRQ and FIQ are handled through RTEMS's interrupt
+vectoring.
+
+@section Vectoring of an Interrupt Handler
+
+
+Unlike many other architectures, the ARM has seperate stacks for each
+interrupt. When the CPU receives an interrupt, it:
+
+@itemize @bullet
+@item switches to the exception mode corresponding to the interrupt,
+
+@item saves the Current Processor Status Register (CPSR) to the
+exception mode's Saved Processor Status Register (SPSR),
+
+@item masks off the IRQ and if the interrupt source was FIQ, the FIQ
+is masked off as well,
+
+@item saves the Program Counter (PC) to the exception mode's Link
+Register (LR - same as R14),
+
+@item and sets the PC to the exception's vector address.
+
+@end itemize
+
+The vectors for both IRQ and FIQ point to the _ISR_Handler function.
+_ISR_Handler() calls the BSP specific handler, ExecuteITHandler(). Before
+calling ExecuteITHandler(), registers R0-R3, R12, and R14(LR) are saved so
+that it is safe to call C functions. Even ExecuteITHandler() can be written
+in C.
+
+@section Interrupt Levels
+
+The ARM architecture supports two external interrupts - IRQ and FIQ. FIQ
+has a higher priority than IRQ, and has its own version of register R8 - R14,
+however RTEMS does not take advantage of them. Both interrupts are enabled
+through the CPSR.
+
+The RTEMS interrupt level mapping scheme for the AEM is not a numeric level
+as on most RTEMS ports. It is a bit mapping that corresponds the enable
+bits's postions in the CPSR:
+
+@table @b
+@item FIQ
+Setting bit 6 (0 is least significant bit) disables the FIQ.
+
+@item IRQ
+Setting bit 7 (0 is least significant bit) disables the IRQ.
+
+@end table
+
+
+@section Disabling of Interrupts by RTEMS
+
+During the execution of directive calls, critical
+sections of code may be executed. When these sections are
+encountered, RTEMS disables interrupts to level seven (7) before
+the execution of this section and restores them to the previous
+level upon completion of the section. RTEMS has been optimized
+to insure that interrupts are disabled for less than
+RTEMS_MAXIMUM_DISABLE_PERIOD microseconds on a
+RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ Mhz processor with
+zero wait states. These numbers will vary based the
+number of wait states and processor speed present on the target board.
+[NOTE: The maximum period with interrupts disabled is hand calculated. This
+calculation was last performed for Release
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD.]
+
+Non-maskable interrupts (NMI) cannot be disabled, and
+ISRs which execute at this level MUST NEVER issue RTEMS system
+calls. If a directive is invoked, unpredictable results may
+occur due to the inability of RTEMS to protect its critical
+sections. However, ISRs that make no system calls may safely
+execute as non-maskable interrupts.
+
+@section Interrupt Stack
+
+RTEMS expects the interrupt stacks to be set up in bsp_start(). The memory
+for the stacks is reserved in the linker script.
+
diff --git a/doc/supplements/arm/memmodel.t b/doc/supplements/arm/memmodel.t
new file mode 100644
index 0000000000..bf543364c7
--- /dev/null
+++ b/doc/supplements/arm/memmodel.t
@@ -0,0 +1,38 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Memory Model
+
+@section Introduction
+
+A processor may support any combination of memory
+models ranging from pure physical addressing to complex demand
+paged virtual memory systems. RTEMS supports a flat memory
+model which ranges contiguously over the processor's allowable
+address space. RTEMS does not support segmentation or virtual
+memory of any kind. The appropriate memory model for RTEMS
+provided by the targeted processor and related characteristics
+of that model are described in this chapter.
+
+@section Flat Memory Model
+
+Members of the ARM family newer than Version 3 support a flat
+32-bit address space with addresses ranging from 0x00000000 to
+0xFFFFFFFF (4 gigabytes). Each address is represented by a
+32-bit value and is byte addressable.
+The address may be used to reference a
+single byte, word (2-bytes), or long word (4 bytes). Memory
+accesses within this address space are performed in the endian
+mode that the processor is configured for. In general, ARM
+processors are used in little endian mode.
+
+Some of the ARM family members such as the
+920 and 720 include an MMU and thus support virtual memory and
+segmentation. RTEMS does not support virtual memory or
+segmentation on any of the ARM family members.
+
diff --git a/doc/supplements/arm/preface.texi b/doc/supplements/arm/preface.texi
new file mode 100644
index 0000000000..27bb11a558
--- /dev/null
+++ b/doc/supplements/arm/preface.texi
@@ -0,0 +1,49 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Preface, CPU Model Dependent Features, Top, Top
+@end ifinfo
+@unnumbered Preface
+
+The Real Time Executive for Multiprocessor Systems (RTEMS)
+is designed to be portable across multiple processor
+architectures. However, the nature of real-time systems makes
+it essential that the application designer understand certain
+processor dependent implementation details. These processor
+dependencies include calling convention, board support package
+issues, interrupt processing, exact RTEMS memory requirements,
+performance data, header files, and the assembly language
+interface to the executive.
+
+This document discusses the ARM architecture dependencies
+in this port of RTEMS. The ARM family has a wide variety
+of implementations by a wide range of vendors. Consequently,
+there are 100's of CPU models within it.
+
+It is highly recommended that the ARM
+RTEMS application developer obtain and become familiar with the
+documentation for the processor being used as well as the
+documentation for the ARM architecture as a whole.
+
+@subheading Architecture Documents
+
+For information on the ARM architecture,
+refer to the following documents available from Arm, Limited
+(@file{http//www.arm.com/}). There does not appear to
+be an electronic version of a manual on the architecture
+in general on that site. The following book is a good
+resource:
+
+@itemize @bullet
+@item @cite{David Seal. "ARM Architecture Reference Manual."
+Addison-Wesley. @b{ISBN 0-201-73719-1}. 2001.}
+
+@end itemize
+
+
diff --git a/doc/supplements/arm/timeBSP.t b/doc/supplements/arm/timeBSP.t
new file mode 100644
index 0000000000..742272f775
--- /dev/null
+++ b/doc/supplements/arm/timeBSP.t
@@ -0,0 +1,113 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@include common/timemac.texi
+@tex
+\global\advance \smallskipamount by -4pt
+@end tex
+
+@chapter MYBSP Timing Data
+
+@section Introduction
+
+The timing data for the ARM version of RTEMS is
+provided along with the target dependent aspects concerning the
+gathering of the timing data. The hardware platform used to
+gather the times is described to give the reader a better
+understanding of each directive time provided. Also, provided
+is a description of the interrupt latency and the context switch
+times as they pertain to the ARM version of RTEMS.
+
+@section Hardware Platform
+
+All times reported except for the maximum period
+interrupts are disabled by RTEMS were measured using a Motorola
+MYBSP CPU board. The MYBSP is a RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+Mhz board with SDRAM and no numeric coprocessor. A
+countdown timer on this board was used to measure
+elapsed time with a 20 nanosecond resolution. All
+sources of hardware interrupts were disabled, although the
+interrupt level of the ARM microprocessor allows all interrupts.
+
+The maximum period interrupts are disabled was
+measured by summing the number of CPU cycles required by each
+assembly language instruction executed while interrupts were
+disabled. The worst case times of the ARM9DTMI microprocessor
+were used for each instruction. Zero wait state memory was
+assumed. The total CPU cycles executed with interrupts
+disabled, including the instructions to disable and enable
+interrupts, was divided by TBD to simulate a TBD Mhz processor. It
+should be noted that the worst case instruction times
+assume that the internal cache is disabled and that no
+instructions overlap.
+
+@section Interrupt Latency
+
+The maximum period with interrupts disabled within
+RTEMS is less than RTEMS_MAXIMUM_DISABLE_PERIOD
+microseconds including the instructions
+which disable and re-enable interrupts. The time required for
+the processor to vector an interrupt and for the RTEMS entry
+overhead before invoking the user's interrupt handler are a
+total of RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK
+microseconds. These combine to yield a worst case
+interrupt latency of less than
+RTEMS_MAXIMUM_DISABLE_PERIOD + RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK
+microseconds at RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+Mhz. [NOTE: The maximum period with interrupts
+disabled was last determined for Release
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD.]
+
+It should be noted again that the maximum period with
+interrupts disabled within RTEMS is hand-timed and based upon
+worst case (i.e. CPU cache disabled and no instruction overlap)
+times for a RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ Mhz processor.
+The interrupt vector and entry
+overhead time was generated on an MYBSP benchmark platform
+using the Multiprocessing Communications registers to generate
+as the interrupt source.
+
+@section Context Switch
+
+The RTEMS processor context switch time is RTEMS_NO_FP_CONTEXTS
+microseconds on the MYBSP benchmark platform when no floating
+point context is saved or restored. Additional execution time
+is required when a TASK_SWITCH user extension is configured.
+The use of the TASK_SWITCH extension is application dependent.
+Thus, its execution time is not considered part of the raw
+context switch time.
+
+The ARM processor benchmarked does not have a floating point
+unit and consequently no FPU results are reported.
+
+@c Since RTEMS was designed specifically for embedded
+@c missile applications which are floating point intensive, the
+@c executive is optimized to avoid unnecessarily saving and
+@c restoring the state of the numeric coprocessor. The state of
+@c the numeric coprocessor is only saved when an FLOATING_POINT
+@c task is dispatched and that task was not the last task to
+@c utilize the coprocessor. In a system with only one
+@c FLOATING_POINT task, the state of the numeric coprocessor will
+@c never be saved or restored. When the first FLOATING_POINT task
+@c is dispatched, RTEMS does not need to save the current state of
+@c the numeric coprocessor.
+
+@c The exact amount of time required to save and restore
+@c floating point context is dependent on whether an XXX or
+@c XXX is being used as well as the state of the numeric
+@c coprocessor. These numeric coprocessors define three operating
+@c states: initialized, idle, and busy. RTEMS places the
+@c coprocessor in the initialized state when a task is started or
+@c restarted. Once the task has utilized the coprocessor, it is in
+@c the idle state when floating point instructions are not
+@c executing and the busy state when floating point instructions
+@c are executing. The state of the coprocessor is task specific.
+
+The following table summarizes the context switch
+times for the MYBSP benchmark platform:
+
diff --git a/doc/supplements/c4x/.cvsignore b/doc/supplements/c4x/.cvsignore
new file mode 100644
index 0000000000..566ff6dc5f
--- /dev/null
+++ b/doc/supplements/c4x/.cvsignore
@@ -0,0 +1,38 @@
+c4x
+c4x-?
+c4x-??
+c4x.aux
+c4x.cp
+c4x.dvi
+c4x.fn
+c4x*.html
+c4x.ky
+c4x.log
+c4x.pdf
+c4x.pg
+c4x.ps
+c4x.toc
+c4x.tp
+c4x.vr
+bsp.texi
+callconv.texi
+cpumodel.texi
+cputable.texi
+fatalerr.texi
+index.html
+intr.t
+intr.texi
+Makefile
+Makefile.in
+mdate-sh
+memmodel.texi
+rtems_footer.html
+rtems_header.html
+stamp-vti
+timeBSP_.t
+timeBSP.texi
+timing.t
+timing.texi
+version.texi
+wksheets.t
+wksheets.texi
diff --git a/doc/supplements/c4x/BSP_TIMES b/doc/supplements/c4x/BSP_TIMES
new file mode 100644
index 0000000000..c80ed37148
--- /dev/null
+++ b/doc/supplements/c4x/BSP_TIMES
@@ -0,0 +1,247 @@
+#
+# CPU MODEL/BSP Timing and Size Information
+#
+# $Id$
+#
+
+#
+# CPU Model Information
+#
+RTEMS_BSP BSP_FOR_TIMES
+RTEMS_CPU_MODEL BSP_CPU_MODEL
+#
+# Interrupt Latency
+#
+# NOTE: In general, the text says it is hand-calculated to be
+# RTEMS_MAXIMUM_DISABLE_PERIOD at RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+# Mhz and this was last calculated for Release
+# RTEMS_VERSION_FOR_MAXIMUM_DISABLE_PERIOD.
+#
+RTEMS_MAXIMUM_DISABLE_PERIOD TBD
+RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ 20
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD 4.0.0
+#
+# Context Switch Times
+#
+RTEMS_NO_FP_CONTEXTS 35
+RTEMS_RESTORE_1ST_FP_TASK 39
+RTEMS_SAVE_INIT_RESTORE_INIT 66
+RTEMS_SAVE_IDLE_RESTORE_INIT 66
+RTEMS_SAVE_IDLE_RESTORE_IDLE 68
+#
+# Task Manager Times
+#
+RTEMS_TASK_CREATE_ONLY 148
+RTEMS_TASK_IDENT_ONLY 350
+RTEMS_TASK_START_ONLY 76
+RTEMS_TASK_RESTART_CALLING_TASK 95
+RTEMS_TASK_RESTART_SUSPENDED_RETURNS_TO_CALLER 89
+RTEMS_TASK_RESTART_BLOCKED_RETURNS_TO_CALLER 124
+RTEMS_TASK_RESTART_READY_RETURNS_TO_CALLER 92
+RTEMS_TASK_RESTART_SUSPENDED_PREEMPTS_CALLER 125
+RTEMS_TASK_RESTART_BLOCKED_PREEMPTS_CALLER 149
+RTEMS_TASK_RESTART_READY_PREEMPTS_CALLER 142
+RTEMS_TASK_DELETE_CALLING_TASK 170
+RTEMS_TASK_DELETE_SUSPENDED_TASK 138
+RTEMS_TASK_DELETE_BLOCKED_TASK 143
+RTEMS_TASK_DELETE_READY_TASK 144
+RTEMS_TASK_SUSPEND_CALLING_TASK 71
+RTEMS_TASK_SUSPEND_RETURNS_TO_CALLER 43
+RTEMS_TASK_RESUME_TASK_READIED_RETURNS_TO_CALLER 45
+RTEMS_TASK_RESUME_TASK_READIED_PREEMPTS_CALLER 67
+RTEMS_TASK_SET_PRIORITY_OBTAIN_CURRENT_PRIORITY 31
+RTEMS_TASK_SET_PRIORITY_RETURNS_TO_CALLER 64
+RTEMS_TASK_SET_PRIORITY_PREEMPTS_CALLER 106
+RTEMS_TASK_MODE_OBTAIN_CURRENT_MODE 14
+RTEMS_TASK_MODE_NO_RESCHEDULE 16
+RTEMS_TASK_MODE_RESCHEDULE_RETURNS_TO_CALLER 23
+RTEMS_TASK_MODE_RESCHEDULE_PREEMPTS_CALLER 60
+RTEMS_TASK_GET_NOTE_ONLY 33
+RTEMS_TASK_SET_NOTE_ONLY 33
+RTEMS_TASK_WAKE_AFTER_YIELD_RETURNS_TO_CALLER 16
+RTEMS_TASK_WAKE_AFTER_YIELD_PREEMPTS_CALLER 56
+RTEMS_TASK_WAKE_WHEN_ONLY 117
+#
+# Interrupt Manager
+#
+RTEMS_INTR_ENTRY_RETURNS_TO_NESTED 12
+RTEMS_INTR_ENTRY_RETURNS_TO_INTERRUPTED_TASK 9
+RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK 9
+RTEMS_INTR_EXIT_RETURNS_TO_NESTED <1
+RTEMS_INTR_EXIT_RETURNS_TO_INTERRUPTED_TASK 8
+RTEMS_INTR_EXIT_RETURNS_TO_PREEMPTING_TASK 54
+#
+# Clock Manager
+#
+RTEMS_CLOCK_SET_ONLY 86
+RTEMS_CLOCK_GET_ONLY 1
+RTEMS_CLOCK_TICK_ONLY 17
+#
+# Timer Manager
+#
+RTEMS_TIMER_CREATE_ONLY 28
+RTEMS_TIMER_IDENT_ONLY 343
+RTEMS_TIMER_DELETE_INACTIVE 43
+RTEMS_TIMER_DELETE_ACTIVE 47
+RTEMS_TIMER_FIRE_AFTER_INACTIVE 58
+RTEMS_TIMER_FIRE_AFTER_ACTIVE 61
+RTEMS_TIMER_FIRE_WHEN_INACTIVE 88
+RTEMS_TIMER_FIRE_WHEN_ACTIVE 88
+RTEMS_TIMER_RESET_INACTIVE 54
+RTEMS_TIMER_RESET_ACTIVE 58
+RTEMS_TIMER_CANCEL_INACTIVE 31
+RTEMS_TIMER_CANCEL_ACTIVE 34
+#
+# Semaphore Manager
+#
+RTEMS_SEMAPHORE_CREATE_ONLY 60
+RTEMS_SEMAPHORE_IDENT_ONLY 367
+RTEMS_SEMAPHORE_DELETE_ONLY 58
+RTEMS_SEMAPHORE_OBTAIN_AVAILABLE 38
+RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_NO_WAIT 38
+RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_CALLER_BLOCKS 109
+RTEMS_SEMAPHORE_RELEASE_NO_WAITING_TASKS 44
+RTEMS_SEMAPHORE_RELEASE_TASK_READIED_RETURNS_TO_CALLER 66
+RTEMS_SEMAPHORE_RELEASE_TASK_READIED_PREEMPTS_CALLER 87
+#
+# Message Manager
+#
+RTEMS_MESSAGE_QUEUE_CREATE_ONLY 200
+RTEMS_MESSAGE_QUEUE_IDENT_ONLY 341
+RTEMS_MESSAGE_QUEUE_DELETE_ONLY 80
+RTEMS_MESSAGE_QUEUE_SEND_NO_WAITING_TASKS 97
+RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_RETURNS_TO_CALLER 101
+RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_PREEMPTS_CALLER 123
+RTEMS_MESSAGE_QUEUE_URGENT_NO_WAITING_TASKS 96
+RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_RETURNS_TO_CALLER 101
+RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_PREEMPTS_CALLER 123
+RTEMS_MESSAGE_QUEUE_BROADCAST_NO_WAITING_TASKS 53
+RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_RETURNS_TO_CALLER 111
+RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_PREEMPTS_CALLER 133
+RTEMS_MESSAGE_QUEUE_RECEIVE_AVAILABLE 79
+RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_NO_WAIT 43
+RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS 114
+RTEMS_MESSAGE_QUEUE_FLUSH_NO_MESSAGES_FLUSHED 29
+RTEMS_MESSAGE_QUEUE_FLUSH_MESSAGES_FLUSHED 39
+#
+# Event Manager
+#
+RTEMS_EVENT_SEND_NO_TASK_READIED 24
+RTEMS_EVENT_SEND_TASK_READIED_RETURNS_TO_CALLER 60
+RTEMS_EVENT_SEND_TASK_READIED_PREEMPTS_CALLER 84
+RTEMS_EVENT_RECEIVE_OBTAIN_CURRENT_EVENTS 1
+RTEMS_EVENT_RECEIVE_AVAILABLE 28
+RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_NO_WAIT 23
+RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS 84
+#
+# Signal Manager
+#
+RTEMS_SIGNAL_CATCH_ONLY 15
+RTEMS_SIGNAL_SEND_RETURNS_TO_CALLER 37
+RTEMS_SIGNAL_SEND_SIGNAL_TO_SELF 55
+RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_CALLING_TASK 37
+RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_PREEMPTING_TASK 54
+#
+# Partition Manager
+#
+RTEMS_PARTITION_CREATE_ONLY 70
+RTEMS_PARTITION_IDENT_ONLY 341
+RTEMS_PARTITION_DELETE_ONLY 42
+RTEMS_PARTITION_GET_BUFFER_AVAILABLE 35
+RTEMS_PARTITION_GET_BUFFER_NOT_AVAILABLE 33
+RTEMS_PARTITION_RETURN_BUFFER_ONLY 43
+#
+# Region Manager
+#
+RTEMS_REGION_CREATE_ONLY 63
+RTEMS_REGION_IDENT_ONLY 348
+RTEMS_REGION_DELETE_ONLY 39
+RTEMS_REGION_GET_SEGMENT_AVAILABLE 52
+RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_NO_WAIT 49
+RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_CALLER_BLOCKS 123
+RTEMS_REGION_RETURN_SEGMENT_NO_WAITING_TASKS 54
+RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_RETURNS_TO_CALLER 114
+RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_PREEMPTS_CALLER 136
+#
+# Dual-Ported Memory Manager
+#
+RTEMS_PORT_CREATE_ONLY 35
+RTEMS_PORT_IDENT_ONLY 340
+RTEMS_PORT_DELETE_ONLY 39
+RTEMS_PORT_INTERNAL_TO_EXTERNAL_ONLY 26
+RTEMS_PORT_EXTERNAL_TO_INTERNAL_ONLY 27
+#
+# IO Manager
+#
+RTEMS_IO_INITIALIZE_ONLY 4
+RTEMS_IO_OPEN_ONLY 2
+RTEMS_IO_CLOSE_ONLY 1
+RTEMS_IO_READ_ONLY 2
+RTEMS_IO_WRITE_ONLY 3
+RTEMS_IO_CONTROL_ONLY 2
+#
+# Rate Monotonic Manager
+#
+RTEMS_RATE_MONOTONIC_CREATE_ONLY 32
+RTEMS_RATE_MONOTONIC_IDENT_ONLY 341
+RTEMS_RATE_MONOTONIC_CANCEL_ONLY 39
+RTEMS_RATE_MONOTONIC_DELETE_ACTIVE 51
+RTEMS_RATE_MONOTONIC_DELETE_INACTIVE 48
+RTEMS_RATE_MONOTONIC_PERIOD_INITIATE_PERIOD_RETURNS_TO_CALLER 54
+RTEMS_RATE_MONOTONIC_PERIOD_CONCLUDE_PERIOD_CALLER_BLOCKS 74
+RTEMS_RATE_MONOTONIC_PERIOD_OBTAIN_STATUS 31
+#
+# Size Information
+#
+#
+# xxx alloted for numbers
+#
+RTEMS_DATA_SPACE 723
+RTEMS_MINIMUM_CONFIGURATION 18,980
+RTEMS_MAXIMUM_CONFIGURATION 36,438
+# x,xxx alloted for numbers
+RTEMS_CORE_CODE_SIZE 12,674
+RTEMS_INITIALIZATION_CODE_SIZE 970
+RTEMS_TASK_CODE_SIZE 3,562
+RTEMS_INTERRUPT_CODE_SIZE 54
+RTEMS_CLOCK_CODE_SIZE 334
+RTEMS_TIMER_CODE_SIZE 1,110
+RTEMS_SEMAPHORE_CODE_SIZE 1,632
+RTEMS_MESSAGE_CODE_SIZE 1,754
+RTEMS_EVENT_CODE_SIZE 1,000
+RTEMS_SIGNAL_CODE_SIZE 418
+RTEMS_PARTITION_CODE_SIZE 1,164
+RTEMS_REGION_CODE_SIZE 1,494
+RTEMS_DPMEM_CODE_SIZE 724
+RTEMS_IO_CODE_SIZE 686
+RTEMS_FATAL_ERROR_CODE_SIZE 24
+RTEMS_RATE_MONOTONIC_CODE_SIZE 1,212
+RTEMS_MULTIPROCESSING_CODE_SIZE 6.952
+# xxx alloted for numbers
+RTEMS_TIMER_CODE_OPTSIZE 184
+RTEMS_SEMAPHORE_CODE_OPTSIZE 172
+RTEMS_MESSAGE_CODE_OPTSIZE 288
+RTEMS_EVENT_CODE_OPTSIZE 56
+RTEMS_SIGNAL_CODE_OPTSIZE 56
+RTEMS_PARTITION_CODE_OPTSIZE 132
+RTEMS_REGION_CODE_OPTSIZE 160
+RTEMS_DPMEM_CODE_OPTSIZE 132
+RTEMS_IO_CODE_OPTSIZE 00
+RTEMS_RATE_MONOTONIC_CODE_OPTSIZE 184
+RTEMS_MULTIPROCESSING_CODE_OPTSIZE 332
+# xxx alloted for numbers
+RTEMS_BYTES_PER_TASK 400
+RTEMS_BYTES_PER_TIMER 68
+RTEMS_BYTES_PER_SEMAPHORE 124
+RTEMS_BYTES_PER_MESSAGE_QUEUE 148
+RTEMS_BYTES_PER_REGION 144
+RTEMS_BYTES_PER_PARTITION 56
+RTEMS_BYTES_PER_PORT 36
+RTEMS_BYTES_PER_PERIOD 36
+RTEMS_BYTES_PER_EXTENSION 64
+RTEMS_BYTES_PER_FP_TASK 332
+RTEMS_BYTES_PER_NODE 48
+RTEMS_BYTES_PER_GLOBAL_OBJECT 20
+RTEMS_BYTES_PER_PROXY 124
+# x,xxx alloted for numbers
+RTEMS_BYTES_OF_FIXED_SYSTEM_REQUIREMENTS 8,872
diff --git a/doc/supplements/c4x/ChangeLog b/doc/supplements/c4x/ChangeLog
new file mode 100644
index 0000000000..d18962cd77
--- /dev/null
+++ b/doc/supplements/c4x/ChangeLog
@@ -0,0 +1,49 @@
+2003-12-12 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-12-11 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-11-26 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Add *.info to CLEANFILES to accomodate
+ automake-1.7f/1.8 breaking building infos.
+
+2003-09-26 Joel Sherrill <joel@OARcorp.com>
+
+ * cpumodel.t: Obsoleting HP PA-RISC port and removing all references.
+
+2003-09-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Merger from rtems-4-6-branch.
+
+2003-09-19 Joel Sherrill <joel@OARcorp.com>
+
+ * c4x.texi: Merge from branch.
+
+2003-05-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * cpumodel.t: Reflect c/src/exec having moved to cpukit.
+
+2003-01-28 Joel Sherrill <joel@OARcorp.com>
+
+ * .cvsignore: New file.
+
+2003-01-25 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * c4x.texi: Set @setfilename c4x.info.
+
+2003-01-25 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: New.
+ * c4x.texi, cpumodel.t, timeBSP.t: Various minor changes to get them
+ building.
+
+2003-01-24 Joel Sherrill <joel@OARcorp.com>
+
+ * BSP_TIMES, bsp.t, c4x.texi, callconv.t, cpumodel.t, cputable.t,
+ fatalerr.t, intr_NOTIMES.t, memmodel.t, preface.texi, timeBSP.t:
+ New files. These should have been added long ago.
+
diff --git a/doc/supplements/c4x/Makefile.am b/doc/supplements/c4x/Makefile.am
new file mode 100644
index 0000000000..55f666f8f5
--- /dev/null
+++ b/doc/supplements/c4x/Makefile.am
@@ -0,0 +1,108 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = c4x
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/supplements/supplement.am
+
+GENERATED_FILES = cpumodel.texi callconv.texi memmodel.texi intr.texi \
+ fatalerr.texi bsp.texi cputable.texi timing.texi wksheets.texi \
+ timeBSP.texi
+
+COMMON_FILES += $(top_srcdir)/common/cpright.texi
+
+FILES = preface.texi
+
+info_TEXINFOS = c4x.texi
+c4x_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+#
+# Chapters which get automatic processing
+#
+
+cpumodel.texi: cpumodel.t
+ $(BMENU2) -p "Preface" \
+ -u "Top" \
+ -n "Calling Conventions" < $< > $@
+
+callconv.texi: callconv.t
+ $(BMENU2) -p "CPU Model Dependent Features Floating Point Unit" \
+ -u "Top" \
+ -n "Memory Model" < $< > $@
+
+memmodel.texi: memmodel.t
+ $(BMENU2) -p "Calling Conventions User-Provided Routines" \
+ -u "Top" \
+ -n "Interrupt Processing" < $< > $@
+
+# Interrupt Chapter:
+# 1. Replace Times and Sizes
+# 2. Build Node Structure
+intr.texi: intr_NOTIMES.t BSP_TIMES
+ ${REPLACE2} -p $(srcdir)/BSP_TIMES $(srcdir)/intr_NOTIMES.t | \
+ $(BMENU2) -p "Memory Model Large Memory Model" \
+ -u "Top" \
+ -n "Default Fatal Error Processing" > $@
+
+fatalerr.texi: fatalerr.t
+ $(BMENU2) -p "Interrupt Processing Interrupt Stack" \
+ -u "Top" \
+ -n "Board Support Packages" < $< > $@
+
+bsp.texi: bsp.t
+ $(BMENU2) -p "Default Fatal Error Processing Default Fatal Error Handler Operations" \
+ -u "Top" \
+ -n "Processor Dependent Information Table" < $< > $@
+
+cputable.texi: cputable.t
+ $(BMENU2) -p "Board Support Packages Processor Initialization" \
+ -u "Top" \
+ -n "Memory Requirements" < $< > $@
+
+# Worksheets Chapter:
+# 1. Obtain the Shared File
+# 2. Replace Times and Sizes
+# 3. Build Node Structure
+
+wksheets.texi: $(top_srcdir)/common/wksheets.t BSP_TIMES
+ ${REPLACE2} -p $(srcdir)/BSP_TIMES $(top_srcdir)/common/wksheets.t | \
+ $(BMENU2) -p "Processor Dependent Information Table CPU Dependent Information Table" \
+ -u "Top" \
+ -n "Timing Specification" > $@
+
+# Timing Specification Chapter:
+# 1. Copy the Shared File
+# 3. Build Node Structure
+timing.texi: $(top_srcdir)/common/timing.t
+ $(BMENU2) -p "Memory Requirements RTEMS RAM Workspace Worksheet" \
+ -u "Top" \
+ -n "BSP_FOR_TIMES Timing Data" < $< > $@
+
+# Timing Data for BSP BSP_FOR_TIMES Chapter:
+# 1. Copy the Shared File
+# 2. Replace Times and Sizes
+# 3. Build Node Structure
+
+timeBSP.texi: $(top_srcdir)/common/timetbl.t timeBSP.t
+ cat $(srcdir)/timeBSP.t $(top_srcdir)/common/timetbl.t >timeBSP_.t
+ @echo >>timeBSP_.t
+ @echo "@tex" >>timeBSP_.t
+ @echo "\\global\\advance \\smallskipamount by 4pt" >>timeBSP_.t
+ @echo "@end tex" >>timeBSP_.t
+ ${REPLACE2} -p $(srcdir)/BSP_TIMES timeBSP_.t | \
+ $(BMENU2) -p "Timing Specification Terminology" \
+ -u "Top" \
+ -n "Command and Variable Index" > $@
+CLEANFILES += timeBSP_.t
+
+EXTRA_DIST = BSP_TIMES bsp.t callconv.t cpumodel.t cputable.t fatalerr.t \
+ intr_NOTIMES.t memmodel.t timeBSP.t
+
+CLEANFILES += c4x.info c4x.info-?
diff --git a/doc/supplements/c4x/bsp.t b/doc/supplements/c4x/bsp.t
new file mode 100644
index 0000000000..a19aa06129
--- /dev/null
+++ b/doc/supplements/c4x/bsp.t
@@ -0,0 +1,93 @@
+@c
+@c COPYRIGHT (c) 1988-1999.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Board Support Packages
+
+@section Introduction
+
+An RTEMS Board Support Package (BSP) must be designed
+to support a particular processor and target board combination.
+This chapter presents a discussion of XXX specific BSP
+issues. For more information on developing a BSP, refer to the
+chapter titled Board Support Packages in the RTEMS
+Applications User's Guide.
+
+@section System Reset
+
+An RTEMS based application is initiated or
+re-initiated when the XXX processor is reset. When the
+XXX is reset, the processor performs the following actions:
+
+@itemize @bullet
+@item The tracing bits of the status register are cleared to
+disable tracing.
+
+@item The supervisor interrupt state is entered by setting the
+supervisor (S) bit and clearing the master/interrupt (M) bit of
+the status register.
+
+@item The interrupt mask of the status register is set to
+level 7 to effectively disable all maskable interrupts.
+
+@item The vector base register (VBR) is set to zero.
+
+@item The cache control register (CACR) is set to zero to
+disable and freeze the processor cache.
+
+@item The interrupt stack pointer (ISP) is set to the value
+stored at vector 0 (bytes 0-3) of the exception vector table
+(EVT).
+
+@item The program counter (PC) is set to the value stored at
+vector 1 (bytes 4-7) of the EVT.
+
+@item The processor begins execution at the address stored in
+the PC.
+@end itemize
+
+@section Processor Initialization
+
+The address of the application's initialization code
+should be stored in the first vector of the EVT which will allow
+the immediate vectoring to the application code. If the
+application requires that the VBR be some value besides zero,
+then it should be set to the required value at this point. All
+tasks share the same XXX's VBR value. Because interrupts
+are enabled automatically by RTEMS as part of the initialize
+executive directive, the VBR MUST be set before this directive
+is invoked to insure correct interrupt vectoring. If processor
+caching is to be utilized, then it should be enabled during the
+reset application initialization code.
+
+In addition to the requirements described in the
+Board Support Packages chapter of the Applications User's
+Manual for the reset code which is executed before the call to
+initialize executive, the XXX version has the following
+specific requirements:
+
+@itemize @bullet
+@item Must leave the S bit of the status register set so that
+the XXX remains in the supervisor state.
+
+@item Must set the M bit of the status register to remove the
+XXX from the interrupt state.
+
+@item Must set the master stack pointer (MSP) such that a
+minimum stack size of MINIMUM_STACK_SIZE bytes is provided for
+the initialize executive directive.
+
+@item Must initialize the XXX's vector table.
+@end itemize
+
+Note that the BSP is not responsible for allocating
+or installing the interrupt stack. RTEMS does this
+automatically as part of initialization. If the BSP does not
+install an interrupt stack and -- for whatever reason -- an
+interrupt occurs before initialize_executive is invoked, then
+the results are unpredictable.
+
diff --git a/doc/supplements/c4x/c4x.texi b/doc/supplements/c4x/c4x.texi
new file mode 100644
index 0000000000..49fa76fd34
--- /dev/null
+++ b/doc/supplements/c4x/c4x.texi
@@ -0,0 +1,116 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename c4x.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c @smallbook
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-1999.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the TI C3x/C4x Applications Supplement
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS Target Supplements
+@direntry
+* RTEMS TI C3x/C4x Applications Supplement: (c4x).
+@end direntry
+@end ifset
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage RTEMS TI C3x/C4x Applications Supplement
+
+@setchapternewpage odd
+@settitle RTEMS TI C3x/C4x Applications Supplement
+@titlepage
+@finalout
+
+@title RTEMS TI C3x/C4x Applications Supplement
+@subtitle Edition @value{EDITION}, for RTEMS @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include preface.texi
+@include cpumodel.texi
+@include callconv.texi
+@include memmodel.texi
+@include intr.texi
+@include fatalerr.texi
+@include bsp.texi
+@include cputable.texi
+@include wksheets.texi
+@include timing.texi
+@include timeBSP.texi
+@ifinfo
+@node Top, Preface, (dir), (dir)
+@top c4x
+
+This is the online version of the RTEMS TI C3x/C4x
+Applications Supplement.
+
+@menu
+* Preface::
+* CPU Model Dependent Features::
+* Calling Conventions::
+* Memory Model::
+* Interrupt Processing::
+* Default Fatal Error Processing::
+* Board Support Packages::
+* Processor Dependent Information Table::
+* Memory Requirements::
+* Timing Specification::
+* BSP_FOR_TIMES Timing Data::
+* Command and Variable Index::
+* Concept Index::
+@end menu
+
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@node Command and Variable Index, Concept Index, BSP_FOR_TIMES Timing Data Rate Monotonic Manager, Top
+@unnumbered Command and Variable Index
+
+There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@node Concept Index, , Command and Variable Index, Top
+@unnumbered Concept Index
+
+There are currently no Concept Index entries.
+@c @printindex cp
+
+@contents
+@bye
+
diff --git a/doc/supplements/c4x/callconv.t b/doc/supplements/c4x/callconv.t
new file mode 100644
index 0000000000..94d52a05a3
--- /dev/null
+++ b/doc/supplements/c4x/callconv.t
@@ -0,0 +1,161 @@
+@c
+@c COPYRIGHT (c) 1988-1999.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Calling Conventions
+
+@section Introduction
+
+Each high-level language compiler generates
+subroutine entry and exit code based upon a set of rules known
+as the compiler's calling convention. These rules address the
+following issues:
+
+@itemize @bullet
+@item register preservation and usage
+@item parameter passing
+@item call and return mechanism
+@end itemize
+
+A compiler's calling convention is of importance when
+interfacing to subroutines written in another language either
+assembly or high-level. Even when the high-level language and
+target processor are the same, different compilers may use
+different calling conventions. As a result, calling conventions
+are both processor and compiler dependent.
+
+The GNU Compiler Suite follows the same calling conventions
+as the Texas Instruments toolset.
+
+@section Processor Background
+
+The TI C3x and C4x processors support a simple yet
+effective call and return mechanism. A subroutine is invoked
+via the branch to subroutine (@code{XXX}) or the jump to subroutine
+(@code{XXX}) instructions. These instructions push the return address
+on the current stack. The return from subroutine (@code{XXX})
+instruction pops the return address off the current stack and
+transfers control to that instruction. It is important to
+note that the call and return mechanism for the C3x/C4x does not
+automatically save or restore any registers. It is the
+responsibility of the high-level language compiler to define the
+register preservation and usage convention.
+
+XXX other supplements may have "is is".
+
+@section Calling Mechanism
+
+All subroutines are invoked using either a @code{XXX}
+or @code{XXX} instruction and return to the user application via the
+@code{XXX} instruction.
+
+@section Register Usage
+
+XXX
+
+As discussed above, the @code{XXX} and @code{XXX} instructions do
+not automatically save any registers. Subroutines use the registers
+@b{D0}, @b{D1}, @b{A0}, and @b{A1} as scratch registers. These registers are
+not preserved by subroutines therefore, the contents of
+these registers should not be assumed upon return from any subroutine
+call including but not limited to an RTEMS directive.
+
+The GNU and Texas Instruments compilers follow the same conventions
+for register usage.
+
+@section Parameter Passing
+
+Both the GNU and Texas Instruments compilers support two conventions
+for passing parameters to subroutines. Arguments may be passed in
+memory on the stack or in registers.
+
+@subsection Parameters Passed in Memory
+
+When passing parameters on the stack, the calling convention assumes
+that arguments are placed on the current stack before the subroutine
+is invoked via the @code{XXX} instruction. The first argument is
+assumed to be closest to the return address on the stack. This means
+that the first argument of the C calling sequence is pushed last. The
+following pseudo-code illustrates the typical sequence used to call a
+subroutine with three (3) arguments:
+
+@example
+@group
+push third argument
+push second argument
+push first argument
+invoke subroutine
+remove arguments from the stack
+@end group
+@end example
+
+The arguments to RTEMS are typically pushed onto the
+stack using a @code{sti} instruction with a pre-incremented stack
+pointer as the destination. These arguments must be removed
+from the stack after control is returned to the caller. This
+removal is typically accomplished by subtracting the size of the
+argument list in words from the current stack pointer.
+
+@c XXX XXX instruction .. XXX should be code format.
+
+With the GNU Compiler Suite, parameter passing via the
+stack is selected by invoking the compiler with the
+@code{-mmemparm XXX} argument. This argument must be
+included when linking the application in order to
+ensure that support libraries also compiled assuming
+parameter passing via the stack are used. The default
+parameter passing mechanism is XXX.
+
+When this parameter passing mecahanism is selected, the @code{XXX}
+symbol is predefined by the C and C++ compilers
+and the @code{XXX} symbol is predefined by the assembler.
+This behavior is the same for the GNU and Texas Instruments
+toolsets. RTEMS uses these predefines to determine how
+parameters are passed in to those C3x/C4x specific routines
+that were written in assembly language.
+
+@subsection Parameters Passed in Registers
+
+When passing parameters via registers, the calling convention assumes
+that the arguments are placed in particular registers based upon
+their position and data type before the subroutine is invoked via
+the @code{XXX} instruction.
+
+The following pseudo-code illustrates
+the typical sequence used to call a subroutine with three (3) arguments:
+
+@example
+@group
+move third argument to XXX
+move second argument to XXX
+move first argument to XXX
+invoke subroutine
+@end group
+@end example
+
+With the GNU Compiler Suite, parameter passing via
+registers is selected by invoking the compiler with the
+@code{-mregparm XXX} argument. This argument must be
+included when linking the application in order to
+ensure that support libraries also compiled assuming
+parameter passing via the stack are used. The default
+parameter passing mechanism is XXX.
+
+When this parameter passing mecahanism is selected, the @code{XXX}
+symbol is predefined by the C and C++ compilers
+and the @code{XXX} symbol is predefined by the assembler.
+This behavior is the same for the GNU and Texas Instruments
+toolsets. RTEMS uses these predefines to determine how
+parameters are passed in to those C3x/C4x specific routines
+that were written in assembly language.
+
+@section User-Provided Routines
+
+All user-provided routines invoked by RTEMS, such as
+user extensions, device drivers, and MPCI routines, must also
+adhere to these calling conventions.
+
diff --git a/doc/supplements/c4x/cpumodel.t b/doc/supplements/c4x/cpumodel.t
new file mode 100644
index 0000000000..079c6e15c7
--- /dev/null
+++ b/doc/supplements/c4x/cpumodel.t
@@ -0,0 +1,82 @@
+@c
+@c COPYRIGHT (c) 1988-1999.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter CPU Model Dependent Features
+
+@section Introduction
+
+Microprocessors are generally classified into
+families with a variety of CPU models or implementations within
+that family. Within a processor family, there is a high level
+of binary compatibility. This family may be based on either an
+architectural specification or on maintaining compatibility with
+a popular processor. Recent microprocessor families such as the
+SPARC or PowerPC are based on an architectural specification
+which is independent or any particular CPU model or
+implementation. Older families such as the M68xxx and the iX86
+evolved as the manufacturer strived to produce higher
+performance processor models which maintained binary
+compatibility with older models.
+
+RTEMS takes advantage of the similarity of the
+various models within a CPU family. Although the models do vary
+in significant ways, the high level of compatibility makes it
+possible to share the bulk of the CPU dependent executive code
+across the entire family. Each processor family supported by
+RTEMS has a list of features which vary between CPU models
+within a family. For example, the most common model dependent
+feature regardless of CPU family is the presence or absence of a
+floating point unit or coprocessor. When defining the list of
+features present on a particular CPU model, one simply notes
+that floating point hardware is or is not present and defines a
+single constant appropriately. Conditional compilation is
+utilized to include the appropriate source code for this CPU
+model's feature set. It is important to note that this means
+that RTEMS is thus compiled using the appropriate feature set
+and compilation flags optimal for this CPU model used. The
+alternative would be to generate a binary which would execute on
+all family members using only the features which were always
+present.
+
+This chapter presents the set of features which vary
+across the various implementations of the C3x/C4x architecture
+that are of importance to rtems.
+the set of cpu model feature macros are defined in the file
+cpukit/score/cpu/c4x/rtems/score/c4x.h and are based upon
+the particular cpu model defined in the bsp's custom configuration
+file as well as the compilation command line.
+
+@section CPU Model Name
+
+The macro @code{CPU_MODEL_NAME} is a string which designates
+the name of this cpu model. for example, for the c32
+processor, this macro is set to the string "c32".
+
+@section Floating Point Unit
+
+The Texas Instruments C3x/C4x family makes little distinction
+between the various cpu registers. Although floating point
+operations may only be performed on a subset of the cpu registers,
+these same registers may be used for normal integer operations.
+as a result of this, this port of rtems makes no distinction
+between integer and floating point contexts. The routine
+@code{_CPU_Context_switch} saves all of the registers that
+comprise a task's context. the routines that initialize,
+save, and restore floating point contexts are not present
+in this port.
+
+Moreover, there is no floating point context pointer and
+the code in @code{_Thread_Dispatch} that manages the
+floating point context switching process is disabled
+on this port.
+
+This not only simplifies the port, it also speeds up context
+switches by reducing the code involved and reduces the code
+space footprint of the executive on the Texas Instruments
+C3x/C4x.
+
diff --git a/doc/supplements/c4x/cputable.t b/doc/supplements/c4x/cputable.t
new file mode 100644
index 0000000000..1a9f1e50d9
--- /dev/null
+++ b/doc/supplements/c4x/cputable.t
@@ -0,0 +1,109 @@
+@c
+@c COPYRIGHT (c) 1988-1999.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Processor Dependent Information Table
+
+@section Introduction
+
+Any highly processor dependent information required
+to describe a processor to RTEMS is provided in the CPU
+Dependent Information Table. This table is not required for all
+processors supported by RTEMS. This chapter describes the
+contents, if any, for a particular processor type.
+
+@section CPU Dependent Information Table
+
+The XXX version of the RTEMS CPU Dependent
+Information Table contains the information required to interface
+a Board Support Package and RTEMS on the XXX. This
+information is provided to allow RTEMS to interoperate
+effectively with the BSP. The C structure definition is given
+here:
+
+@example
+@group
+typedef struct @{
+ void (*pretasking_hook)( void );
+ void (*predriver_hook)( void );
+ void (*postdriver_hook)( void );
+ void (*idle_task)( void );
+ boolean do_zero_of_workspace;
+ unsigned32 idle_task_stack_size;
+ unsigned32 interrupt_stack_size;
+ unsigned32 extra_mpci_receive_server_stack;
+ void * (*stack_allocate_hook)( unsigned32 );
+ void (*stack_free_hook)( void* );
+ /* end of fields required on all CPUs */
+
+ /* XXX CPU family dependent stuff */
+@} rtems_cpu_table;
+@end group
+@end example
+
+@table @code
+@item pretasking_hook
+is the address of the user provided routine which is invoked
+once RTEMS APIs are initialized. This routine will be invoked
+before any system tasks are created. Interrupts are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item predriver_hook
+is the address of the user provided
+routine that is invoked immediately before the
+the device drivers and MPCI are initialized. RTEMS
+initialization is complete but interrupts and tasking are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item postdriver_hook
+is the address of the user provided
+routine that is invoked immediately after the
+the device drivers and MPCI are initialized. RTEMS
+initialization is complete but interrupts and tasking are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item idle_task
+is the address of the optional user
+provided routine which is used as the system's IDLE task. If
+this field is not NULL, then the RTEMS default IDLE task is not
+used. This field may be NULL to indicate that the default IDLE
+is to be used.
+
+@item do_zero_of_workspace
+indicates whether RTEMS should
+zero the Workspace as part of its initialization. If set to
+TRUE, the Workspace is zeroed. Otherwise, it is not.
+
+@item idle_task_stack_size
+is the size of the RTEMS idle task stack in bytes.
+If this number is less than MINIMUM_STACK_SIZE, then the
+idle task's stack will be MINIMUM_STACK_SIZE in byte.
+
+@item interrupt_stack_size
+is the size of the RTEMS
+allocated interrupt stack in bytes. This value must be at least
+as large as MINIMUM_STACK_SIZE.
+
+@item extra_mpci_receive_server_stack
+is the extra stack space allocated for the RTEMS MPCI receive server task
+in bytes. The MPCI receive server may invoke nearly all directives and
+may require extra stack space on some targets.
+
+@item stack_allocate_hook
+is the address of the optional user provided routine which allocates
+memory for task stacks. If this hook is not NULL, then a stack_free_hook
+must be provided as well.
+
+@item stack_free_hook
+is the address of the optional user provided routine which frees
+memory for task stacks. If this hook is not NULL, then a stack_allocate_hook
+must be provided as well.
+
+@item XXX
+is where the CPU family dependent stuff goes.
+
+@end table
diff --git a/doc/supplements/c4x/fatalerr.t b/doc/supplements/c4x/fatalerr.t
new file mode 100644
index 0000000000..0871fa3cb9
--- /dev/null
+++ b/doc/supplements/c4x/fatalerr.t
@@ -0,0 +1,31 @@
+@c
+@c COPYRIGHT (c) 1988-1999.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Default Fatal Error Processing
+
+@section Introduction
+
+Upon detection of a fatal error by either the
+application or RTEMS the fatal error manager is invoked. The
+fatal error manager will invoke the user-supplied fatal error
+handlers. If no user-supplied handlers are configured, the
+RTEMS provided default fatal error handler is invoked. If the
+user-supplied fatal error handlers return to the executive the
+default fatal error handler is then invoked. This chapter
+describes the precise operations of the default fatal error
+handler.
+
+@section Default Fatal Error Handler Operations
+
+The default fatal error handler which is invoked by
+the @code{rtems_fatal_error_occurred} directive when there is
+no user handler configured or the user handler returns control to
+RTEMS. The default fatal error handler disables processor interrupts,
+places the error code in @b{XXX}, and executes a @code{XXX}
+instruction to simulate a halt processor instruction.
+
diff --git a/doc/supplements/c4x/intr_NOTIMES.t b/doc/supplements/c4x/intr_NOTIMES.t
new file mode 100644
index 0000000000..074420f2c9
--- /dev/null
+++ b/doc/supplements/c4x/intr_NOTIMES.t
@@ -0,0 +1,196 @@
+@c
+@c Interrupt Stack Frame Picture
+@c
+@c COPYRIGHT (c) 1988-1999.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Interrupt Processing
+
+@section Introduction
+
+Different types of processors respond to the
+occurrence of an interrupt in its own unique fashion. In
+addition, each processor type provides a control mechanism to
+allow for the proper handling of an interrupt. The processor
+dependent response to the interrupt modifies the current
+execution state and results in a change in the execution stream.
+Most processors require that an interrupt handler utilize some
+special control mechanisms to return to the normal processing
+stream. Although RTEMS hides many of the processor dependent
+details of interrupt processing, it is important to understand
+how the RTEMS interrupt manager is mapped onto the processor's
+unique architecture. Discussed in this chapter are the XXX's
+interrupt response and control mechanisms as they pertain to
+RTEMS.
+
+@section Vectoring of an Interrupt Handler
+
+Depending on whether or not the particular CPU
+supports a separate interrupt stack, the XXX family has two
+different interrupt handling models.
+
+@subsection Models Without Separate Interrupt Stacks
+
+Upon receipt of an interrupt the XXX family
+members without separate interrupt stacks automatically perform
+the following actions:
+
+@itemize @bullet
+@item To Be Written
+@end itemize
+
+@subsection Models With Separate Interrupt Stacks
+
+Upon receipt of an interrupt the XXX family
+members with separate interrupt stacks automatically perform the
+following actions:
+
+@itemize @bullet
+@item saves the current status register (SR),
+
+@item clears the master/interrupt (M) bit of the SR to
+indicate the switch from master state to interrupt state,
+
+@item sets the privilege mode to supervisor,
+
+@item suppresses tracing,
+
+@item sets the interrupt mask level equal to the level of the
+interrupt being serviced,
+
+@item pushes an interrupt stack frame (ISF), which includes
+the program counter (PC), the status register (SR), and the
+format/exception vector offset (FVO) word, onto the supervisor
+and interrupt stacks,
+
+@item switches the current stack to the interrupt stack and
+vectors to an interrupt service routine (ISR). If the ISR was
+installed with the interrupt_catch directive, then the RTEMS
+interrupt handler will begin execution. The RTEMS interrupt
+handler saves all registers which are not preserved according to
+the calling conventions and invokes the application's ISR.
+@end itemize
+
+A nested interrupt is processed similarly by these
+CPU models with the exception that only a single ISF is placed
+on the interrupt stack and the current stack need not be
+switched.
+
+The FVO word in the Interrupt Stack Frame is examined
+by RTEMS to determine when an outer most interrupt is being
+exited. Since the FVO is used by RTEMS for this purpose, the
+user application code MUST NOT modify this field.
+
+The following shows the Interrupt Stack Frame for
+XXX CPU models with separate interrupt stacks:
+
+@ifset use-ascii
+@example
+@group
+ +----------------------+
+ | Status Register | 0x0
+ +----------------------+
+ | Program Counter High | 0x2
+ +----------------------+
+ | Program Counter Low | 0x4
+ +----------------------+
+ | Format/Vector Offset | 0x6
+ +----------------------+
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@sp 1
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\strut\vrule#&
+\hbox to 2.00in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 0.50in{\enskip\hfil#\hfil}
+\cr
+\multispan{3}\hrulefill\cr
+& Status Register && 0x0\cr
+\multispan{3}\hrulefill\cr
+& Program Counter High && 0x2\cr
+\multispan{3}\hrulefill\cr
+& Program Counter Low && 0x4\cr
+\multispan{3}\hrulefill\cr
+& Format/Vector Offset && 0x6\cr
+\multispan{3}\hrulefill\cr
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=2 WIDTH="40%" BORDER=2>
+<TR><TD ALIGN=center><STRONG>Status Register</STRONG></TD>
+ <TD ALIGN=center>0x0</TD></TR>
+<TR><TD ALIGN=center><STRONG>Program Counter High</STRONG></TD>
+ <TD ALIGN=center>0x2</TD></TR>
+<TR><TD ALIGN=center><STRONG>Program Counter Low</STRONG></TD>
+ <TD ALIGN=center>0x4</TD></TR>
+<TR><TD ALIGN=center><STRONG>Format/Vector Offset</STRONG></TD>
+ <TD ALIGN=center>0x6</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+@section Interrupt Levels
+
+Eight levels (0-7) of interrupt priorities are
+supported by XXX family members with level seven (7) being
+the highest priority. Level zero (0) indicates that interrupts
+are fully enabled. Interrupt requests for interrupts with
+priorities less than or equal to the current interrupt mask
+level are ignored.
+
+Although RTEMS supports 256 interrupt levels, the
+XXX family only supports eight. RTEMS interrupt levels 0
+through 7 directly correspond to XXX interrupt levels. All
+other RTEMS interrupt levels are undefined and their behavior is
+unpredictable.
+
+@section Disabling of Interrupts by RTEMS
+
+During the execution of directive calls, critical
+sections of code may be executed. When these sections are
+encountered, RTEMS disables interrupts to level seven (7) before
+the execution of this section and restores them to the previous
+level upon completion of the section. RTEMS has been optimized
+to insure that interrupts are disabled for less than
+RTEMS_MAXIMUM_DISABLE_PERIOD microseconds on a
+RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ Mhz XXX with
+zero wait states. These numbers will vary based the
+number of wait states and processor speed present on the target board.
+[NOTE: The maximum period with interrupts disabled is hand calculated. This
+calculation was last performed for Release
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD.]
+
+Non-maskable interrupts (NMI) cannot be disabled, and
+ISRs which execute at this level MUST NEVER issue RTEMS system
+calls. If a directive is invoked, unpredictable results may
+occur due to the inability of RTEMS to protect its critical
+sections. However, ISRs that make no system calls may safely
+execute as non-maskable interrupts.
+
+@section Interrupt Stack
+
+RTEMS allocates the interrupt stack from the
+Workspace Area. The amount of memory allocated for the
+interrupt stack is determined by the interrupt_stack_size field
+in the CPU Configuration Table. During the initialization
+process, RTEMS will install its interrupt stack.
+
+The XXX port of RTEMS supports a software managed
+dedicated interrupt stack on those CPU models which do not
+support a separate interrupt stack in hardware.
+
+
diff --git a/doc/supplements/c4x/memmodel.t b/doc/supplements/c4x/memmodel.t
new file mode 100644
index 0000000000..0f6189ca26
--- /dev/null
+++ b/doc/supplements/c4x/memmodel.t
@@ -0,0 +1,160 @@
+@c
+@c COPYRIGHT (c) 1988-1999.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Memory Model
+
+@section Introduction
+
+A processor may support any combination of memory
+models ranging from pure physical addressing to complex demand
+paged virtual memory systems. RTEMS supports a flat memory
+model which ranges contiguously over the processor's allowable
+address space. RTEMS does not support segmentation or virtual
+memory of any kind. The appropriate memory model for RTEMS
+provided by the targeted processor and related characteristics
+of that model are described in this chapter.
+
+@section Byte Addressable versus Word Addressable
+
+Processor in the Texas Instruments C3x/C4x family are
+word addressable. This is in sharp contrast to CISC and
+RISC processors that are typically byte addressable. In a word
+addressable architecture, each address points not to an
+8-bit byte or octet but to 32 bits.
+
+On first glance, byte versus word addressability does not
+sound like a problem but in fact, this issue can result in
+subtle problems in high-level language software that is ported
+to a word addressable processor family. The following is a
+list of the commonly encountered problems:
+
+@table @b
+
+@item String Optimizations
+Although each character in a string occupies a single address just
+as it does on a byte addressable CPU, each character occupies
+32 rather than 8 bits. The most significant 24 bytes are
+of each address are ignored. This in and of itself does not
+cause problems but it violates the assumption that two
+adjacent characters in a string have no intervening bits.
+This assumption is often implicit in string and memory comparison
+routines that are optimized to compare 4 adjacent characters
+with a word oriented operation. This optimization is
+invalid on word addressable processors.
+
+@item Sizeof
+The C operation @code{sizeof} returns very different results
+on the C3x/C4x than on traditional RISC/CISC processors.
+The @code{sizeof(char)}, @code{sizeof(short)}, and @code{sizeof(int)}
+are all 1 since each occupies a single addressable unit that is
+thirty-two bits wide. On most thirty-two bit processors,
+@code{sizeof(char} is one, @code{sizeof(short)} is two,
+and @code{sizeof(int)} is four. Just as software makes assumptions
+about the sizes of the primitive data types has problems
+when ported to a sixty-four bit architecture, these same
+assumptions cause problems on the C3x/C4x.
+
+@item Alignment
+Since each addressable unit is thirty-two bit wide, there
+are no alignment restrictions. The native integer type
+need only be aligned on a "one unit" boundary not a "four
+unit" boundary as on numerous other processors.
+
+@end table
+
+@section Flat Memory Model
+
+XXX check actual bits on the various processor families.
+
+The XXX family supports a flat 32-bit address
+space with addresses ranging from 0x00000000 to 0xFFFFFFFF (4
+gigabytes). Each address is represented by a 32-bit value and
+is byte addressable. The address may be used to reference a
+single byte, word (2-bytes), or long word (4 bytes). Memory
+accesses within this address space are performed in big endian
+fashion by the processors in this family.
+
+@section Compiler Memory Models
+
+The Texas Instruments C3x/C4x processors include a Data Page
+(@code{dp}) register that logically is a base address. The
+@code{dp} register allows the use of shorter offsets in
+instructions. Up to 64K words may be addressed using
+offsets from the @code{dp} register. In order to address
+words not addressable based on the current value of
+@code{dp}, the register must be loaded with a different
+value.
+
+The @code{dp} register is managed automatically by
+the high-level language compilers.
+The various compilers for this processor family support
+two memory models that manage the @code{dp} register
+in very different manners. The large and small memory
+models are discussed in the following sections.
+
+NOTE: The C3x/C4x port of RTEMS has been written
+so that it should support either memory model.
+However, it has only been tested using the
+large memory model.
+
+@subsection Small Memory Model
+
+The small memory model is the simplest and most
+efficient. However, it includes a limitation that
+make it inappropriate for numerous applications. The
+small memory model assumes that the application needs
+to access no more than 64K words. Thus the @code{dp}
+register can be loaded at application start time
+and never reloaded. Thus the compiler will not
+even generate instructions to load the @code{dp}.
+
+This can significantly reduce the code space
+required by an application but the application
+is limited in the amount of data it can access.
+
+With the GNU Compiler Suite, small memory model is
+selected by invoking the compiler with either the
+@code{-msmall} or @code{-msmallmemoryXXX} argument.
+This argument must be included when linking the application
+in order to ensure that support libraries also compiled
+for the large memory model are used.
+The default memory model is XXX.
+
+When this memory model is selected, the @code{XXX}
+symbol is predefined by the C and C++ compilers
+and the @code{XXX} symbol is predefined by the assembler.
+This behavior is the same for the GNU and Texas Instruments
+toolsets. RTEMS uses these predefines to determine the proper handling
+of the @code{dp} register in those C3x/C4x specific routines
+that were written in assembly language.
+
+@subsection Large Memory Model
+
+The large memory model is more complex and less efficient
+than the small memory model. However, it removes the
+64K uninitialized data restriction from applications.
+The @code{dp} register is reloaded automatically
+by the compiler each time data is accessed. This leads
+to an increase in the code space requirements for the
+application but gives it access to much more data space.
+
+With the GNU Compiler Suite, large memory model is
+selected by invoking the compiler with either the
+@code{-mlarge} or @code{-mlargememoryXXX} argument.
+This argument must be included when linking the application
+in order to ensure that support libraries also compiled
+for the large memory model are used.
+The default memory model is XXX.
+
+When this memory model is selected, the @code{XXX}
+symbol is predefined by the C and C++ compilers
+and the @code{XXX} symbol is predefined by the assembler.
+This behavior is the same for the GNU and Texas Instruments
+toolsets. RTEMS uses these predefines to determine the proper handling
+of the @code{dp} register in those C3x/C4x specific routines
+that were written in assembly language.
diff --git a/doc/supplements/c4x/preface.texi b/doc/supplements/c4x/preface.texi
new file mode 100644
index 0000000000..c0eecf3ff6
--- /dev/null
+++ b/doc/supplements/c4x/preface.texi
@@ -0,0 +1,64 @@
+@c
+@c COPYRIGHT (c) 1988-1999.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Preface, CPU Model Dependent Features, Top, Top
+@end ifinfo
+@unnumbered Preface
+
+The Real Time Executive for Multiprocessor Systems (RTEMS)
+is designed to be portable across multiple processor
+architectures. However, the nature of real-time systems makes
+it essential that the application designer understand certain
+processor dependent implementation details. These processor
+dependencies include calling convention, board support package
+issues, interrupt processing, exact RTEMS memory requirements,
+performance data, header files, and the assembly language
+interface to the executive.
+
+This document discusses the Texas Instrument C3x/C4x
+architecture dependencies in this port of RTEMS. The C3x/C4x
+family has a wide variety of CPU models within it. The following
+CPU model numbers could be supported by this port:
+
+@itemize
+@item C30 - TMSXXX
+@item C31 - TMSXXX
+@item C32 - TMSXXX
+@item C41 - TMSXXX
+@item C44 - TMSXXX
+@end itemize
+
+Initiially, this port does not include full support for C4x models.
+Primarily, the C4x specific implementations of interrupt flag and
+mask management routines have not been completed.
+
+It is highly recommended that the RTEMS application developer obtain
+and become familiar with the documentation for the processor being
+used as well as the documentation for the family as a whole.
+
+@subheading Architecture Documents
+
+For information on the Texas Instruments C3x/C4x architecture,
+refer to the following documents available from VENDOR
+(@file{http//www.ti.com/}):
+
+@itemize @bullet
+@item @cite{XXX Family Reference, Texas Instruments, PART NUMBER}.
+@end itemize
+
+@subheading MODEL SPECIFIC DOCUMENTS
+
+For information on specific processor models and
+their associated coprocessors, refer to the following documents:
+
+@itemize @bullet
+@item @cite{XXX MODEL Manual, Texas Instruments, PART NUMBER}.
+@item @cite{XXX MODEL Manual, Texas Instruments, PART NUMBER}.
+@end itemize
+
diff --git a/doc/supplements/c4x/timeBSP.t b/doc/supplements/c4x/timeBSP.t
new file mode 100644
index 0000000000..a64dc93ca9
--- /dev/null
+++ b/doc/supplements/c4x/timeBSP.t
@@ -0,0 +1,108 @@
+@c
+@c COPYRIGHT (c) 1988-1999.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@include common/timemac.texi
+@tex
+\global\advance \smallskipamount by -4pt
+@end tex
+
+@chapter BSP_FOR_TIMES Timing Data
+
+@section Introduction
+
+The timing data for the XXX version of RTEMS is
+provided along with the target dependent aspects concerning the
+gathering of the timing data. The hardware platform used to
+gather the times is described to give the reader a better
+understanding of each directive time provided. Also, provided
+is a description of the interrupt latency and the context switch
+times as they pertain to the XXX version of RTEMS.
+
+@section Hardware Platform
+
+All times reported except for the maximum period
+interrupts are disabled by RTEMS were measured using a Motorola
+BSP_FOR_TIMES CPU board. The BSP_FOR_TIMES is a 20Mhz board with one wait
+state dynamic memory and a XXX numeric coprocessor. The
+Zilog 8036 countdown timer on this board was used to measure
+elapsed time with a one-half microsecond resolution. All
+sources of hardware interrupts were disabled, although the
+interrupt level of the XXX allows all interrupts.
+
+The maximum period interrupts are disabled was
+measured by summing the number of CPU cycles required by each
+assembly language instruction executed while interrupts were
+disabled. The worst case times of the XXX microprocessor
+were used for each instruction. Zero wait state memory was
+assumed. The total CPU cycles executed with interrupts
+disabled, including the instructions to disable and enable
+interrupts, was divided by 20 to simulate a 20Mhz XXX. It
+should be noted that the worst case instruction times for the
+XXX assume that the internal cache is disabled and that no
+instructions overlap.
+
+@section Interrupt Latency
+
+The maximum period with interrupts disabled within
+RTEMS is less than RTEMS_MAXIMUM_DISABLE_PERIOD
+microseconds including the instructions
+which disable and re-enable interrupts. The time required for
+the XXX to vector an interrupt and for the RTEMS entry
+overhead before invoking the user's interrupt handler are a
+total of RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK
+microseconds. These combine to yield a worst case
+interrupt latency of less than
+RTEMS_MAXIMUM_DISABLE_PERIOD + RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK
+microseconds at 20Mhz. [NOTE: The maximum period with interrupts
+disabled was last determined for Release
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD.]
+
+It should be noted again that the maximum period with
+interrupts disabled within RTEMS is hand-timed and based upon
+worst case (i.e. CPU cache disabled and no instruction overlap)
+times for a 20Mhz XXX. The interrupt vector and entry
+overhead time was generated on an BSP_FOR_TIMES benchmark platform
+using the Multiprocessing Communications registers to generate
+as the interrupt source.
+
+@section Context Switch
+
+The RTEMS processor context switch time is RTEMS_NO_FP_CONTEXTS
+microseconds on the BSP_FOR_TIMES benchmark platform when no floating
+point context is saved or restored. Additional execution time
+is required when a TASK_SWITCH user extension is configured.
+The use of the TASK_SWITCH extension is application dependent.
+Thus, its execution time is not considered part of the raw
+context switch time.
+
+Since RTEMS was designed specifically for embedded
+missile applications which are floating point intensive, the
+executive is optimized to avoid unnecessarily saving and
+restoring the state of the numeric coprocessor. The state of
+the numeric coprocessor is only saved when an FLOATING_POINT
+task is dispatched and that task was not the last task to
+utilize the coprocessor. In a system with only one
+FLOATING_POINT task, the state of the numeric coprocessor will
+never be saved or restored. When the first FLOATING_POINT task
+is dispatched, RTEMS does not need to save the current state of
+the numeric coprocessor.
+
+The exact amount of time required to save and restore
+floating point context is dependent on whether an XXX or
+XXX is being used as well as the state of the numeric
+coprocessor. These numeric coprocessors define three operating
+states: initialized, idle, and busy. RTEMS places the
+coprocessor in the initialized state when a task is started or
+restarted. Once the task has utilized the coprocessor, it is in
+the idle state when floating point instructions are not
+executing and the busy state when floating point instructions
+are executing. The state of the coprocessor is task specific.
+
+The following table summarizes the context switch
+times for the BSP_FOR_TIMES benchmark platform:
+
diff --git a/doc/supplements/i386/.cvsignore b/doc/supplements/i386/.cvsignore
new file mode 100644
index 0000000000..460ed44761
--- /dev/null
+++ b/doc/supplements/i386/.cvsignore
@@ -0,0 +1,38 @@
+bsp.texi
+callconv.texi
+cpumodel.texi
+cputable.texi
+fatalerr.texi
+i386
+i386-?
+i386-??
+i386.aux
+i386.cp
+i386.dvi
+i386.fn
+i386*.html
+i386.ky
+i386.log
+i386.pdf
+i386.pg
+i386.ps
+i386.toc
+i386.tp
+i386.vr
+index.html
+intr.t
+intr.texi
+Makefile
+Makefile.in
+mdate-sh
+memmodel.texi
+rtems_footer.html
+rtems_header.html
+stamp-vti
+timeFORCE386_.t
+timeFORCE386.texi
+timing.t
+timing.texi
+version.texi
+wksheets.t
+wksheets.texi
diff --git a/doc/supplements/i386/ChangeLog b/doc/supplements/i386/ChangeLog
new file mode 100644
index 0000000000..438b5fe127
--- /dev/null
+++ b/doc/supplements/i386/ChangeLog
@@ -0,0 +1,72 @@
+2003-12-12 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-12-11 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-11-26 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Add *.info to CLEANFILES to accomodate
+ automake-1.7f/1.8 breaking building infos.
+
+2003-09-26 Joel Sherrill <joel@OARcorp.com>
+
+ * cpumodel.t: Obsoleting HP PA-RISC port and removing all references.
+
+2003-09-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Merger from rtems-4-6-branch.
+
+2003-09-19 Joel Sherrill <joel@OARcorp.com>
+
+ * i386.texi: Merge from branch.
+
+2003-05-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * cpumodel.t: Reflect c/src/exec having moved to cpukit.
+
+2003-01-25 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * i386.texi: Set @setfilename i386.info.
+
+2003-01-24 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Put GENERATED_FILES into $builddir.
+
+2003-01-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * version.texi: Remove from CVS.
+ * stamp-vti: Remove from CVS.
+ * .cvsignore: Add version.texi.
+ Add stamp-vti.
+ Re-sort.
+
+2003-01-21 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-11-13 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-10-24 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-03-27 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Remove AUTOMAKE_OPTIONS.
+
+2002-01-18 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Require automake-1.5.
+
+2001-01-17 Joel Sherrill <joel@OARcorp.com>
+
+ * .cvsignore: Added rtems_header.html and rtems_footer.html.
+
+2000-08-10 Joel Sherrill <joel@OARcorp.com>
+
+ * ChangeLog: New file.
diff --git a/doc/supplements/i386/FORCE386_TIMES b/doc/supplements/i386/FORCE386_TIMES
new file mode 100644
index 0000000000..b40f8ad50b
--- /dev/null
+++ b/doc/supplements/i386/FORCE386_TIMES
@@ -0,0 +1,247 @@
+#
+# Intel i386/Force CPU-386 Timing and Size Information
+#
+# $Id$
+#
+
+#
+# CPU Model Information
+#
+RTEMS_BSP CPU386
+RTEMS_CPU_MODEL i386
+#
+# Interrupt Latency
+#
+# NOTE: In general, the text says it is hand-calculated to be
+# RTEMS_MAXIMUM_DISABLE_PERIOD at RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+# Mhz and this was last calculated for Release
+# RTEMS_VERSION_FOR_MAXIMUM_DISABLE_PERIOD.
+#
+RTEMS_MAXIMUM_DISABLE_PERIOD 13.0
+RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ 16
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD 3.1.0
+#
+# Context Switch Times
+#
+RTEMS_NO_FP_CONTEXTS 34
+RTEMS_RESTORE_1ST_FP_TASK 57
+RTEMS_SAVE_INIT_RESTORE_INIT 59
+RTEMS_SAVE_IDLE_RESTORE_INIT 59
+RTEMS_SAVE_IDLE_RESTORE_IDLE 83
+#
+# Task Manager Times
+#
+RTEMS_TASK_CREATE_ONLY 157
+RTEMS_TASK_IDENT_ONLY 748
+RTEMS_TASK_START_ONLY 86
+RTEMS_TASK_RESTART_CALLING_TASK 118
+RTEMS_TASK_RESTART_SUSPENDED_RETURNS_TO_CALLER 45
+RTEMS_TASK_RESTART_BLOCKED_RETURNS_TO_CALLER 138
+RTEMS_TASK_RESTART_READY_RETURNS_TO_CALLER 105
+RTEMS_TASK_RESTART_SUSPENDED_PREEMPTS_CALLER 149
+RTEMS_TASK_RESTART_BLOCKED_PREEMPTS_CALLER 162
+RTEMS_TASK_RESTART_READY_PREEMPTS_CALLER 156
+RTEMS_TASK_DELETE_CALLING_TASK 187
+RTEMS_TASK_DELETE_SUSPENDED_TASK 147
+RTEMS_TASK_DELETE_BLOCKED_TASK 153
+RTEMS_TASK_DELETE_READY_TASK 157
+RTEMS_TASK_SUSPEND_CALLING_TASK 81
+RTEMS_TASK_SUSPEND_RETURNS_TO_CALLER 45
+RTEMS_TASK_RESUME_TASK_READIED_RETURNS_TO_CALLER 46
+RTEMS_TASK_RESUME_TASK_READIED_PREEMPTS_CALLER 71
+RTEMS_TASK_SET_PRIORITY_OBTAIN_CURRENT_PRIORITY 30
+RTEMS_TASK_SET_PRIORITY_RETURNS_TO_CALLER 67
+RTEMS_TASK_SET_PRIORITY_PREEMPTS_CALLER 115
+RTEMS_TASK_MODE_OBTAIN_CURRENT_MODE 19
+RTEMS_TASK_MODE_NO_RESCHEDULE 21
+RTEMS_TASK_MODE_RESCHEDULE_RETURNS_TO_CALLER 27
+RTEMS_TASK_MODE_RESCHEDULE_PREEMPTS_CALLER 66
+RTEMS_TASK_GET_NOTE_ONLY 32
+RTEMS_TASK_SET_NOTE_ONLY 32
+RTEMS_TASK_WAKE_AFTER_YIELD_RETURNS_TO_CALLER 18
+RTEMS_TASK_WAKE_AFTER_YIELD_PREEMPTS_CALLER 63
+RTEMS_TASK_WAKE_WHEN_ONLY 128
+#
+# Interrupt Manager
+#
+RTEMS_INTR_ENTRY_RETURNS_TO_NESTED 12
+RTEMS_INTR_ENTRY_RETURNS_TO_INTERRUPTED_TASK 13
+RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK 12
+RTEMS_INTR_EXIT_RETURNS_TO_NESTED 10
+RTEMS_INTR_EXIT_RETURNS_TO_INTERRUPTED_TASK 13
+RTEMS_INTR_EXIT_RETURNS_TO_PREEMPTING_TASK 58
+#
+# Clock Manager
+#
+RTEMS_CLOCK_SET_ONLY 85
+RTEMS_CLOCK_GET_ONLY 2
+RTEMS_CLOCK_TICK_ONLY 16
+#
+# Timer Manager
+#
+RTEMS_TIMER_CREATE_ONLY 34
+RTEMS_TIMER_IDENT_ONLY 729
+RTEMS_TIMER_DELETE_INACTIVE 48
+RTEMS_TIMER_DELETE_ACTIVE 52
+RTEMS_TIMER_FIRE_AFTER_INACTIVE 65
+RTEMS_TIMER_FIRE_AFTER_ACTIVE 69
+RTEMS_TIMER_FIRE_WHEN_INACTIVE 92
+RTEMS_TIMER_FIRE_WHEN_ACTIVE 92
+RTEMS_TIMER_RESET_INACTIVE 58
+RTEMS_TIMER_RESET_ACTIVE 63
+RTEMS_TIMER_CANCEL_INACTIVE 32
+RTEMS_TIMER_CANCEL_ACTIVE 37
+#
+# Semaphore Manager
+#
+RTEMS_SEMAPHORE_CREATE_ONLY 64
+RTEMS_SEMAPHORE_IDENT_ONLY 787
+RTEMS_SEMAPHORE_DELETE_ONLY 60
+RTEMS_SEMAPHORE_OBTAIN_AVAILABLE 41
+RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_NO_WAIT 40
+RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_CALLER_BLOCKS 123
+RTEMS_SEMAPHORE_RELEASE_NO_WAITING_TASKS 47
+RTEMS_SEMAPHORE_RELEASE_TASK_READIED_RETURNS_TO_CALLER 70
+RTEMS_SEMAPHORE_RELEASE_TASK_READIED_PREEMPTS_CALLER 95
+#
+# Message Manager
+#
+RTEMS_MESSAGE_QUEUE_CREATE_ONLY 294
+RTEMS_MESSAGE_QUEUE_IDENT_ONLY 730
+RTEMS_MESSAGE_QUEUE_DELETE_ONLY 81
+RTEMS_MESSAGE_QUEUE_SEND_NO_WAITING_TASKS 117
+RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_RETURNS_TO_CALLER 118
+RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_PREEMPTS_CALLER 144
+RTEMS_MESSAGE_QUEUE_URGENT_NO_WAITING_TASKS 117
+RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_RETURNS_TO_CALLER 116
+RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_PREEMPTS_CALLER 144
+RTEMS_MESSAGE_QUEUE_BROADCAST_NO_WAITING_TASKS 53
+RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_RETURNS_TO_CALLER 122
+RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_PREEMPTS_CALLER 146
+RTEMS_MESSAGE_QUEUE_RECEIVE_AVAILABLE 93
+RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_NO_WAIT 45
+RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS 127
+RTEMS_MESSAGE_QUEUE_FLUSH_NO_MESSAGES_FLUSHED 29
+RTEMS_MESSAGE_QUEUE_FLUSH_MESSAGES_FLUSHED 41
+#
+# Event Manager
+#
+RTEMS_EVENT_SEND_NO_TASK_READIED 26
+RTEMS_EVENT_SEND_TASK_READIED_RETURNS_TO_CALLER 60
+RTEMS_EVENT_SEND_TASK_READIED_PREEMPTS_CALLER 89
+RTEMS_EVENT_RECEIVE_OBTAIN_CURRENT_EVENTS <1
+RTEMS_EVENT_RECEIVE_AVAILABLE 27
+RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_NO_WAIT 25
+RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS 94
+#
+# Signal Manager
+#
+RTEMS_SIGNAL_CATCH_ONLY 13
+RTEMS_SIGNAL_SEND_RETURNS_TO_CALLER 34
+RTEMS_SIGNAL_SEND_SIGNAL_TO_SELF 59
+RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_CALLING_TASK 39
+RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_PREEMPTING_TASK 60
+#
+# Partition Manager
+#
+RTEMS_PARTITION_CREATE_ONLY 83
+RTEMS_PARTITION_IDENT_ONLY 730
+RTEMS_PARTITION_DELETE_ONLY 40
+RTEMS_PARTITION_GET_BUFFER_AVAILABLE 34
+RTEMS_PARTITION_GET_BUFFER_NOT_AVAILABLE 33
+RTEMS_PARTITION_RETURN_BUFFER_ONLY 40
+#
+# Region Manager
+#
+RTEMS_REGION_CREATE_ONLY 68
+RTEMS_REGION_IDENT_ONLY 739
+RTEMS_REGION_DELETE_ONLY 39
+RTEMS_REGION_GET_SEGMENT_AVAILABLE 49
+RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_NO_WAIT 45
+RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_CALLER_BLOCKS 127
+RTEMS_REGION_RETURN_SEGMENT_NO_WAITING_TASKS 52
+RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_RETURNS_TO_CALLER 113
+RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_PREEMPTS_CALLER 138
+#
+# Dual-Ported Memory Manager
+#
+RTEMS_PORT_CREATE_ONLY 39
+RTEMS_PORT_IDENT_ONLY 728
+RTEMS_PORT_DELETE_ONLY 39
+RTEMS_PORT_INTERNAL_TO_EXTERNAL_ONLY 26
+RTEMS_PORT_EXTERNAL_TO_INTERNAL_ONLY 26
+#
+# IO Manager
+#
+RTEMS_IO_INITIALIZE_ONLY 4
+RTEMS_IO_OPEN_ONLY 1
+RTEMS_IO_CLOSE_ONLY 1
+RTEMS_IO_READ_ONLY <1
+RTEMS_IO_WRITE_ONLY 1
+RTEMS_IO_CONTROL_ONLY 1
+#
+# Rate Monotonic Manager
+#
+RTEMS_RATE_MONOTONIC_CREATE_ONLY 36
+RTEMS_RATE_MONOTONIC_IDENT_ONLY 725
+RTEMS_RATE_MONOTONIC_CANCEL_ONLY 39
+RTEMS_RATE_MONOTONIC_DELETE_ACTIVE 53
+RTEMS_RATE_MONOTONIC_DELETE_INACTIVE 49
+RTEMS_RATE_MONOTONIC_PERIOD_INITIATE_PERIOD_RETURNS_TO_CALLER 53
+RTEMS_RATE_MONOTONIC_PERIOD_CONCLUDE_PERIOD_CALLER_BLOCKS 82
+RTEMS_RATE_MONOTONIC_PERIOD_OBTAIN_STATUS 30
+#
+# Size Information
+#
+#
+# xxx alloted for numbers
+#
+RTEMS_DATA_SPACE 833
+RTEMS_MINIMUM_CONFIGURATION 22,660
+RTEMS_MAXIMUM_CONFIGURATION 39,592
+# x,xxx alloted for numbers
+RTEMS_CORE_CODE_SIZE 16,948
+RTEMS_INITIALIZATION_CODE_SIZE 916
+RTEMS_TASK_CODE_SIZE 3,436
+RTEMS_INTERRUPT_CODE_SIZE 52
+RTEMS_CLOCK_CODE_SIZE 296
+RTEMS_TIMER_CODE_SIZE 1,084
+RTEMS_SEMAPHORE_CODE_SIZE 1,500
+RTEMS_MESSAGE_CODE_SIZE 1,596
+RTEMS_EVENT_CODE_SIZE 1,036
+RTEMS_SIGNAL_CODE_SIZE 396
+RTEMS_PARTITION_CODE_SIZE 1,052
+RTEMS_REGION_CODE_SIZE 1,392
+RTEMS_DPMEM_CODE_SIZE 664
+RTEMS_IO_CODE_SIZE 676
+RTEMS_FATAL_ERROR_CODE_SIZE 20
+RTEMS_RATE_MONOTONIC_CODE_SIZE 1,132
+RTEMS_MULTIPROCESSING_CODE_SIZE 6,840
+# xxx alloted for numbers
+RTEMS_TIMER_CODE_OPTSIZE 144
+RTEMS_SEMAPHORE_CODE_OPTSIZE 136
+RTEMS_MESSAGE_CODE_OPTSIZE 224
+RTEMS_EVENT_CODE_OPTSIZE 44
+RTEMS_SIGNAL_CODE_OPTSIZE 44
+RTEMS_PARTITION_CODE_OPTSIZE 104
+RTEMS_REGION_CODE_OPTSIZE 124
+RTEMS_DPMEM_CODE_OPTSIZE 104
+RTEMS_IO_CODE_OPTSIZE 00
+RTEMS_RATE_MONOTONIC_CODE_OPTSIZE 136
+RTEMS_MULTIPROCESSING_CODE_OPTSIZE 228
+# xxx alloted for numbers
+RTEMS_BYTES_PER_TASK 372
+RTEMS_BYTES_PER_TIMER 68
+RTEMS_BYTES_PER_SEMAPHORE 124
+RTEMS_BYTES_PER_MESSAGE_QUEUE 148
+RTEMS_BYTES_PER_REGION 144
+RTEMS_BYTES_PER_PARTITION 56
+RTEMS_BYTES_PER_PORT 36
+RTEMS_BYTES_PER_PERIOD 36
+RTEMS_BYTES_PER_EXTENSION 64
+RTEMS_BYTES_PER_FP_TASK 108
+RTEMS_BYTES_PER_NODE 48
+RTEMS_BYTES_PER_GLOBAL_OBJECT 20
+RTEMS_BYTES_PER_PROXY 124
+# x,xxx alloted for numbers
+RTEMS_BYTES_OF_FIXED_SYSTEM_REQUIREMENTS 6,768
diff --git a/doc/supplements/i386/Makefile.am b/doc/supplements/i386/Makefile.am
new file mode 100644
index 0000000000..a8a27d839b
--- /dev/null
+++ b/doc/supplements/i386/Makefile.am
@@ -0,0 +1,111 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = i386
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/supplements/supplement.am
+
+GENERATED_FILES = cpumodel.texi callconv.texi memmodel.texi intr.texi \
+ fatalerr.texi bsp.texi cputable.texi timing.texi wksheets.texi \
+ timeFORCE386.texi
+
+COMMON_FILES += $(top_srcdir)/common/cpright.texi \
+ $(top_srcdir)/common/timemac.texi
+
+FILES = preface.texi
+
+info_TEXINFOS = i386.texi
+i386_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+#
+# Chapters which get automatic processing
+#
+
+cpumodel.texi: cpumodel.t
+ $(BMENU2) -p "Preface" \
+ -u "Top" \
+ -n "Calling Conventions" < $< > $@
+
+callconv.texi: callconv.t
+ $(BMENU2) -p "CPU Model Dependent Features Floating Point Unit" \
+ -u "Top" \
+ -n "Memory Model" < $< > $@
+
+memmodel.texi: memmodel.t
+ $(BMENU2) -p "Calling Conventions User-Provided Routines" \
+ -u "Top" \
+ -n "Interrupt Processing" < $< > $@
+
+# Interrupt Chapter:
+# 1. Replace Times and Sizes
+# 2. Build Node Structure
+
+intr.texi: intr_NOTIMES.t FORCE386_TIMES
+ ${REPLACE2} -p $(srcdir)/FORCE386_TIMES $(srcdir)/intr_NOTIMES.t | \
+ $(BMENU2) -p "Memory Model Flat Memory Model" \
+ -u "Top" \
+ -n "Default Fatal Error Processing" > $@
+
+fatalerr.texi: fatalerr.t
+ $(BMENU2) -p "Interrupt Processing Interrupt Stack" \
+ -u "Top" \
+ -n "Board Support Packages" < $< > $@
+
+bsp.texi: bsp.t
+ $(BMENU2) -p "Default Fatal Error Processing Default Fatal Error Handler Operations" \
+ -u "Top" \
+ -n "Processor Dependent Information Table" < $< > $@
+
+cputable.texi: cputable.t
+ $(BMENU2) -p "Board Support Packages Processor Initialization" \
+ -u "Top" \
+ -n "Memory Requirements" < $< > $@
+
+# Worksheets Chapter:
+# 1. Obtain the Shared File
+# 2. Replace Times and Sizes
+# 3. Build Node Structure
+
+wksheets.texi: $(top_srcdir)/common/wksheets.t FORCE386_TIMES
+ ${REPLACE2} -p $(srcdir)/FORCE386_TIMES \
+ $(top_srcdir)/common/wksheets.t | \
+ $(BMENU2) -p "Processor Dependent Information Table CPU Dependent Information Table" \
+ -u "Top" \
+ -n "Timing Specification" > $@
+
+# Timing Specification Chapter:
+# 1. Copy the Shared File
+# 3. Build Node Structure
+timing.texi: $(top_srcdir)/common/timing.t
+ $(BMENU2) -p "Memory Requirements RTEMS RAM Workspace Worksheet" \
+ -u "Top" \
+ -n "CPU386 Timing Data" < $< > $@
+
+# Timing Data for BSP Chapter:
+# 1. Copy the Shared File
+# 2. Replace Times and Sizes
+# 3. Build Node Structure
+
+timeFORCE386.texi: $(top_srcdir)/common/timetbl.t timeFORCE386.t
+ cat $(srcdir)/timeFORCE386.t $(top_srcdir)/common/timetbl.t >timeFORCE386_.t
+ @echo >>timeFORCE386_.t
+ @echo "@tex" >>timeFORCE386_.t
+ @echo "\\global\\advance \\smallskipamount by 4pt" >>timeFORCE386_.t
+ @echo "@end tex" >>timeFORCE386_.t
+ ${REPLACE2} -p $(srcdir)/FORCE386_TIMES timeFORCE386_.t | \
+ $(BMENU2) -p "Timing Specification Terminology" \
+ -u "Top" \
+ -n "Command and Variable Index" > $@
+CLEANFILES += timeFORCE386_.t
+
+EXTRA_DIST = FORCE386_TIMES bsp.t callconv.t cpumodel.t cputable.t \
+ fatalerr.t intr_NOTIMES.t memmodel.t timeFORCE386.t
+
+CLEANFILES += i386.info i386.info-?
diff --git a/doc/supplements/i386/bsp.t b/doc/supplements/i386/bsp.t
new file mode 100644
index 0000000000..9ac99901f1
--- /dev/null
+++ b/doc/supplements/i386/bsp.t
@@ -0,0 +1,109 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Board Support Packages
+
+@section Introduction
+
+An RTEMS Board Support Package (BSP) must be designed to support a
+particular processor and target board combination. This chapter presents a
+discussion of i386 specific BSP issues. For more information on developing
+a BSP, refer to the chapter titled Board Support Packages in the RTEMS
+Applications User's Guide.
+
+@section System Reset
+
+An RTEMS based application is initiated when the i386
+processor is reset. When the i386 is reset,
+
+@itemize @bullet
+
+@item The EAX register is set to indicate the results of the processor's
+power-up self test. If the self-test was not executed, the contents of
+this register are undefined. Otherwise, a non-zero value indicates the
+processor is faulty and a zero value indicates a successful self-test.
+
+@item The DX register holds a component identifier and revision level. DH
+contains 3 to indicate an i386 component and DL contains a unique revision
+level indicator.
+
+@item Control register zero (CR0) is set such that the processor is in real
+mode with paging disabled. Other portions of CR0 are used to indicate the
+presence of a numeric coprocessor.
+
+@item All bits in the extended flags register (EFLAG) which are not
+permanently set are cleared. This inhibits all maskable interrupts.
+
+@item The Interrupt Descriptor Register (IDTR) is set to point at address
+zero.
+
+@item All segment registers are set to zero.
+
+@item The instruction pointer is set to 0x0000FFF0. The first instruction
+executed after a reset is actually at 0xFFFFFFF0 because the i386 asserts
+the upper twelve address until the first intersegment (FAR) JMP or CALL
+instruction. When a JMP or CALL is executed, the upper twelve address
+lines are lowered and the processor begins executing in the first megabyte
+of memory.
+
+@end itemize
+
+Typically, an intersegment JMP to the application's initialization code is
+placed at address 0xFFFFFFF0.
+
+@section Processor Initialization
+
+This initialization code is responsible for initializing all data
+structures required by the i386 in protected mode and for actually entering
+protected mode. The i386 must be placed in protected mode and the segment
+registers and associated selectors must be initialized before the
+initialize_executive directive is invoked.
+
+The initialization code is responsible for initializing the Global
+Descriptor Table such that the i386 is in the thirty-two bit flat memory
+model with paging disabled. In this mode, the i386 automatically converts
+every address from a logical to a physical address each time it is used.
+For more information on the memory model used by RTEMS, please refer to the
+Memory Model chapter in this document.
+
+Since the processor is in real mode upon reset, the processor must be
+switched to protected mode before RTEMS can execute. Before switching to
+protected mode, at least one descriptor table and two descriptors must be
+created. Descriptors are needed for a code segment and a data segment. (
+This will give you the flat memory model.) The stack can be placed in a
+normal read/write data segment, so no descriptor for the stack is needed.
+Before the GDT can be used, the base address and limit must be loaded into
+the GDTR register using an LGDT instruction.
+
+If the hardware allows an NMI to be generated, you need to create the IDT
+and a gate for the NMI interrupt handler. Before the IDT can be used, the
+base address and limit for the idt must be loaded into the IDTR register
+using an LIDT instruction.
+
+Protected mode is entered by setting thye PE bit in the CR0 register.
+Either a LMSW or MOV CR0 instruction may be used to set this bit. Because
+the processor overlaps the interpretation of several instructions, it is
+necessary to discard the instructions from the read-ahead cache. A JMP
+instruction immediately after the LMSW changes the flow and empties the
+processor if intructions which have been pre-fetched and/or decoded. At
+this point, the processor is in protected mode and begins to perform
+protected mode application initialization.
+
+If the application requires that the IDTR be some value besides zero, then
+it should set it to the required value at this point. All tasks share the
+same i386 IDTR value. Because interrupts are enabled automatically by
+RTEMS as part of the initialize_executive directive, the IDTR MUST be set
+properly before this directive is invoked to insure correct interrupt
+vectoring. If processor caching is to be utilized, then it should be
+enabled during the reset application initialization code. The reset code
+which is executed before the call to initialize_executive has the following
+requirements:
+
+For more information regarding the i386s data structures and their
+contents, refer to Intel's 386 Programmer's Reference Manual.
+
diff --git a/doc/supplements/i386/callconv.t b/doc/supplements/i386/callconv.t
new file mode 100644
index 0000000000..f3e428dfad
--- /dev/null
+++ b/doc/supplements/i386/callconv.t
@@ -0,0 +1,90 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Calling Conventions
+
+@section Introduction
+
+Each high-level language compiler generates
+subroutine entry and exit code based upon a set of rules known
+as the compiler's calling convention. These rules address the
+following issues:
+
+@itemize @bullet
+@item register preservation and usage
+
+@item parameter passing
+
+@item call and return mechanism
+@end itemize
+
+A compiler's calling convention is of importance when
+interfacing to subroutines written in another language either
+assembly or high-level. Even when the high-level language and
+target processor are the same, different compilers may use
+different calling conventions. As a result, calling conventions
+are both processor and compiler dependent.
+
+@section Processor Background
+
+The i386 architecture supports a simple yet effective
+call and return mechanism. A subroutine is invoked via the call
+(call) instruction. This instruction pushes the return address
+on the stack. The return from subroutine (ret) instruction pops
+the return address off the current stack and transfers control
+to that instruction. It is is important to note that the i386
+call and return mechanism does not automatically save or restore
+any registers. It is the responsibility of the high-level
+language compiler to define the register preservation and usage
+convention.
+
+@section Calling Mechanism
+
+All RTEMS directives are invoked using a call
+instruction and return to the user application via the ret
+instruction.
+
+@section Register Usage
+
+As discussed above, the call instruction does not
+automatically save any registers. RTEMS uses the registers EAX,
+ECX, and EDX as scratch registers. These registers are not
+preserved by RTEMS directives therefore, the contents of these
+registers should not be assumed upon return from any RTEMS
+directive.
+
+@section Parameter Passing
+
+RTEMS assumes that arguments are placed on the
+current stack before the directive is invoked via the call
+instruction. The first argument is assumed to be closest to the
+return address on the stack. This means that the first argument
+of the C calling sequence is pushed last. The following
+pseudo-code illustrates the typical sequence used to call a
+RTEMS directive with three (3) arguments:
+
+@example
+push third argument
+push second argument
+push first argument
+invoke directive
+remove arguments from the stack
+@end example
+
+The arguments to RTEMS are typically pushed onto the
+stack using a push instruction. These arguments must be removed
+from the stack after control is returned to the caller. This
+removal is typically accomplished by adding the size of the
+argument list in bytes to the stack pointer.
+
+@section User-Provided Routines
+
+All user-provided routines invoked by RTEMS, such as
+user extensions, device drivers, and MPCI routines, must also
+adhere to these calling conventions.
+
diff --git a/doc/supplements/i386/cpumodel.t b/doc/supplements/i386/cpumodel.t
new file mode 100644
index 0000000000..30109f23a2
--- /dev/null
+++ b/doc/supplements/i386/cpumodel.t
@@ -0,0 +1,72 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter CPU Model Dependent Features
+
+@section Introduction
+
+Microprocessors are generally classified into
+families with a variety of CPU models or implementations within
+that family. Within a processor family, there is a high level
+of binary compatibility. This family may be based on either an
+architectural specification or on maintaining compatibility with
+a popular processor. Recent microprocessor families such as the
+SPARC or PowerPC are based on an architectural specification
+which is independent or any particular CPU model or
+implementation. Older families such as the M68xxx and the iX86
+evolved as the manufacturer strived to produce higher
+performance processor models which maintained binary
+compatibility with older models.
+
+RTEMS takes advantage of the similarity of the
+various models within a CPU family. Although the models do vary
+in significant ways, the high level of compatibility makes it
+possible to share the bulk of the CPU dependent executive code
+across the entire family. Each processor family supported by
+RTEMS has a list of features which vary between CPU models
+within a family. For example, the most common model dependent
+feature regardless of CPU family is the presence or absence of a
+floating point unit or coprocessor. When defining the list of
+features present on a particular CPU model, one simply notes
+that floating point hardware is or is not present and defines a
+single constant appropriately. Conditional compilation is
+utilized to include the appropriate source code for this CPU
+model's feature set. It is important to note that this means
+that RTEMS is thus compiled using the appropriate feature set
+and compilation flags optimal for this CPU model used. The
+alternative would be to generate a binary which would execute on
+all family members using only the features which were always
+present.
+
+This chapter presents the set of features which vary
+across i386 implementations and are of importance to RTEMS.
+The set of CPU model feature macros are defined in the file
+cpukit/score/cpu/i386/i386.h based upon the particular CPU
+model defined on the compilation command line.
+
+@section CPU Model Name
+
+The macro CPU_MODEL_NAME is a string which designates
+the name of this CPU model. For example, for the Intel i386 without an
+i387 coprocessor, this macro is set to the string "i386 with i387".
+
+@section bswap Instruction
+
+The macro I386_HAS_BSWAP is set to 1 to indicate that
+this CPU model has the @code{bswap} instruction which
+endian swaps a thirty-two bit quantity. This instruction
+appears to be present in all CPU models
+i486's and above.
+
+@section Floating Point Unit
+
+The macro I386_HAS_FPU is set to 1 to indicate that
+this CPU model has a hardware floating point unit and 0
+otherwise. The hardware floating point may be on-chip (as in the
+case of an i486DX or Pentium) or as a coprocessor (as in the case of
+an i386/i387 combination).
diff --git a/doc/supplements/i386/cputable.t b/doc/supplements/i386/cputable.t
new file mode 100644
index 0000000000..e7dbf045aa
--- /dev/null
+++ b/doc/supplements/i386/cputable.t
@@ -0,0 +1,119 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Processor Dependent Information Table
+
+@section Introduction
+
+Any highly processor dependent information required
+to describe a processor to RTEMS is provided in the CPU
+Dependent Information Table. This table is not required for all
+processors supported by RTEMS. This chapter describes the
+contents, if any, for a particular processor type.
+
+@section CPU Dependent Information Table
+
+The i386 version of the RTEMS CPU Dependent
+Information Table contains the information required to interface
+a Board Support Package and RTEMS on the i386. This information
+is provided to allow RTEMS to interoperate effectively with the
+BSP. The C structure definition is given here:
+
+@example
+@group
+typedef struct @{
+ void (*pretasking_hook)( void );
+ void (*predriver_hook)( void );
+ void (*idle_task)( void );
+ boolean do_zero_of_workspace;
+ unsigned32 idle_task_stack_size;
+ unsigned32 interrupt_stack_size;
+ unsigned32 extra_mpci_receive_server_stack;
+ void * (*stack_allocate_hook)( unsigned32 );
+ void (*stack_free_hook)( void* );
+ /* end of fields required on all CPUs */
+
+ unsigned32 interrupt_segment;
+ void *interrupt_vector_table;
+@} rtems_cpu_table;
+@end group
+@end example
+
+@table @code
+@item pretasking_hook
+is the address of the user provided routine which is invoked
+once RTEMS APIs are initialized. This routine will be invoked
+before any system tasks are created. Interrupts are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item predriver_hook
+is the address of the user provided
+routine that is invoked immediately before the
+the device drivers and MPCI are initialized. RTEMS
+initialization is complete but interrupts and tasking are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item postdriver_hook
+is the address of the user provided
+routine that is invoked immediately after the
+the device drivers and MPCI are initialized. RTEMS
+initialization is complete but interrupts and tasking are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item idle_task
+is the address of the optional user
+provided routine which is used as the system's IDLE task. If
+this field is not NULL, then the RTEMS default IDLE task is not
+used. This field may be NULL to indicate that the default IDLE
+is to be used.
+
+@item do_zero_of_workspace
+indicates whether RTEMS should
+zero the Workspace as part of its initialization. If set to
+TRUE, the Workspace is zeroed. Otherwise, it is not.
+
+@item idle_task_stack_size
+is the size of the RTEMS idle task stack in bytes.
+If this number is less than MINIMUM_STACK_SIZE, then the
+idle task's stack will be MINIMUM_STACK_SIZE in byte.
+
+@item interrupt_stack_size
+is the size of the RTEMS
+allocated interrupt stack in bytes. This value must be at least
+as large as MINIMUM_STACK_SIZE.
+
+@item extra_mpci_receive_server_stack
+is the extra stack space allocated for the RTEMS MPCI receive server task
+in bytes. The MPCI receive server may invoke nearly all directives and
+may require extra stack space on some targets.
+
+@item stack_allocate_hook
+is the address of the optional user provided routine which allocates
+memory for task stacks. If this hook is not NULL, then a stack_free_hook
+must be provided as well.
+
+@item stack_free_hook
+is the address of the optional user provided routine which frees
+memory for task stacks. If this hook is not NULL, then a stack_allocate_hook
+must be provided as well.
+
+@item interrupt_segment
+is the value of the selector which should be placed in a segment
+register to access the Interrupt Descriptor Table.
+
+@item interrupt_vector_table
+is the base address of the Interrupt Descriptor Table relative to the
+interrupt_segment.
+
+@end table
+
+The contents of the i386 Interrupt Descriptor Table
+are discussed in Intel's i386 User's Manual. Structure
+definitions for the i386 IDT is provided by including the file
+rtems.h.
+
diff --git a/doc/supplements/i386/fatalerr.t b/doc/supplements/i386/fatalerr.t
new file mode 100644
index 0000000000..add48ab643
--- /dev/null
+++ b/doc/supplements/i386/fatalerr.t
@@ -0,0 +1,31 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Default Fatal Error Processing
+
+@section Introduction
+
+Upon detection of a fatal error by either the
+application or RTEMS the fatal error manager is invoked. The
+fatal error manager will invoke the user-supplied fatal error
+handlers. If no user-supplied handlers are configured, the
+RTEMS provided default fatal error handler is invoked. If the
+user-supplied fatal error handlers return to the executive the
+default fatal error handler is then invoked. This chapter
+describes the precise operations of the default fatal error
+handler.
+
+@section Default Fatal Error Handler Operations
+
+The default fatal error handler which is invoked by
+the fatal_error_occurred directive when there is no user handler
+configured or the user handler returns control to RTEMS. The
+default fatal error handler disables processor interrupts,
+places the error code in EAX, and executes a HLT instruction to
+halt the processor.
+
diff --git a/doc/supplements/i386/i386.texi b/doc/supplements/i386/i386.texi
new file mode 100644
index 0000000000..23c92718bc
--- /dev/null
+++ b/doc/supplements/i386/i386.texi
@@ -0,0 +1,114 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename i386.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the Intel i386 Applications Supplement
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS Target Supplements
+@direntry
+* RTEMS Intel i386 Applications Supplement: (i386).
+@end direntry
+@end ifset
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage RTEMS Intel i386 Applications Supplement
+
+@setchapternewpage odd
+@settitle RTEMS Intel i386 Applications Supplement
+@titlepage
+@finalout
+
+@title RTEMS Intel i386 Applications Supplement
+@subtitle Edition @value{EDITION}, for RTEMS @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include preface.texi
+@include cpumodel.texi
+@include callconv.texi
+@include memmodel.texi
+@include intr.texi
+@include fatalerr.texi
+@include bsp.texi
+@include cputable.texi
+@include wksheets.texi
+@include timing.texi
+@include timeFORCE386.texi
+@ifinfo
+@node Top, Preface, (dir), (dir)
+@top i386
+
+This is the online version of the RTEMS Intel i386
+Applications Supplement.
+
+@menu
+* Preface::
+* CPU Model Dependent Features::
+* Calling Conventions::
+* Memory Model::
+* Interrupt Processing::
+* Default Fatal Error Processing::
+* Board Support Packages::
+* Processor Dependent Information Table::
+* Memory Requirements::
+* Timing Specification::
+* CPU386 Timing Data::
+* Command and Variable Index::
+* Concept Index::
+@end menu
+
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@node Command and Variable Index, Concept Index, CPU386 Timing Data Rate Monotonic Manager, Top
+@unnumbered Command and Variable Index
+
+There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@node Concept Index, , Command and Variable Index, Top
+@unnumbered Concept Index
+
+There are currently no Concept Index entries.
+@c @printindex cp
+
+@contents
+@bye
+
diff --git a/doc/supplements/i386/intr_NOTIMES.t b/doc/supplements/i386/intr_NOTIMES.t
new file mode 100644
index 0000000000..1db03127ec
--- /dev/null
+++ b/doc/supplements/i386/intr_NOTIMES.t
@@ -0,0 +1,168 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Interrupt Processing
+
+@section Introduction
+
+Different types of processors respond to the
+occurrence of an interrupt in their own unique fashion. In
+addition, each processor type provides a control mechanism to
+allow the proper handling of an interrupt. The processor
+dependent response to the interrupt modifies the execution state
+and results in the modification of the execution stream. This
+modification usually requires that an interrupt handler utilize
+the provided control mechanisms to return to the normal
+processing stream. Although RTEMS hides many of the processor
+dependent details of interrupt processing, it is important to
+understand how the RTEMS interrupt manager is mapped onto the
+processor's unique architecture. Discussed in this chapter are
+the the processor's response and control mechanisms as they
+pertain to RTEMS.
+
+@section Vectoring of Interrupt Handler
+
+Although the i386 supports multiple privilege levels,
+RTEMS and all user software executes at privilege level 0. This
+decision was made by the RTEMS designers to enhance
+compatibility with processors which do not provide sophisticated
+protection facilities like those of the i386. This decision
+greatly simplifies the discussion of i386 processing, as one
+need only consider interrupts without privilege transitions.
+
+Upon receipt of an interrupt the i386 automatically
+performs the following actions:
+
+@itemize @bullet
+@item pushes the EFLAGS register
+
+@item pushes the far address of the interrupted instruction
+
+@item vectors to the interrupt service routine (ISR).
+@end itemize
+
+A nested interrupt is processed similarly by the
+i386.
+
+@section Interrupt Stack Frame
+
+The structure of the Interrupt Stack Frame for the
+i386 which is placed on the interrupt stack by the processor in
+response to an interrupt is as follows:
+
+@ifset use-ascii
+@example
+@group
+ +----------------------+
+ | Old EFLAGS Register | ESP+8
+ +----------+-----------+
+ | UNUSED | Old CS | ESP+4
+ +----------+-----------+
+ | Old EIP | ESP
+ +----------------------+
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@sp 1
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\strut\vrule#&
+\hbox to 1.00in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 1.00in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 0.75in{\enskip\hfil#\hfil}
+\cr
+\multispan{4}\hrulefill\cr
+& \multispan{3} Old EFLAGS Register\quad&&ESP+8\cr
+\multispan{4}\hrulefill\cr
+&UNUSED &&Old CS &&ESP+4\cr
+\multispan{4}\hrulefill\cr
+& \multispan{3} Old EIP && ESP\cr
+\multispan{4}\hrulefill\cr
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=3 WIDTH="40%" BORDER=2>
+<TR><TD ALIGN=center COLSPAN=2><STRONG>Old EFLAGS Register</STRONG></TD>
+ <TD ALIGN=center>0x0</TD></TR>
+<TR><TD ALIGN=center><STRONG>UNUSED</STRONG></TD>
+ <TD ALIGN=center><STRONG>Old CS</STRONG></TD>
+ <TD ALIGN=center>0x2</TD></TR>
+<TR><TD ALIGN=center COLSPAN=2><STRONG>Old EIP</STRONG></TD>
+ <TD ALIGN=center>0x4</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+@section Interrupt Levels
+
+Although RTEMS supports 256 interrupt levels, the
+i386 only supports two -- enabled and disabled. Interrupts are
+enabled when the interrupt-enable flag (IF) in the extended
+flags (EFLAGS) is set. Conversely, interrupt processing is
+inhibited when the IF is cleared. During a non-maskable
+interrupt, all other interrupts, including other non-maskable
+ones, are inhibited.
+
+RTEMS interrupt levels 0 and 1 such that level zero
+(0) indicates that interrupts are fully enabled and level one
+that interrupts are disabled. All other RTEMS interrupt levels
+are undefined and their behavior is unpredictable.
+
+@section Disabling of Interrupts by RTEMS
+
+During the execution of directive calls, critical
+sections of code may be executed. When these sections are
+encountered, RTEMS disables interrupts before the execution of
+this section and restores them to the previous level upon
+completion of the section. RTEMS has been optimized to insure
+that interrupts are disabled for less than RTEMS_MAXIMUM_DISABLE_PERIOD
+microseconds on a RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ Mhz i386 with zero
+wait states. These numbers will vary based the number of wait states
+and processor speed present on the target board. [NOTE: The maximum
+period with interrupts disabled within RTEMS was last calculated for
+Release RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD.]
+
+Non-maskable interrupts (NMI) cannot be disabled, and
+ISRs which execute at this level MUST NEVER issue RTEMS system
+calls. If a directive is invoked, unpredictable results may
+occur due to the inability of RTEMS to protect its critical
+sections. However, ISRs that make no system calls may safely
+execute as non-maskable interrupts.
+
+@section Interrupt Stack
+
+The i386 family does not support a dedicated hardware
+interrupt stack. On this processor, RTEMS allocates and manages
+a dedicated interrupt stack. As part of vectoring a non-nested
+interrupt service routine, RTEMS switches from the stack of the
+interrupted task to a dedicated interrupt stack. When a
+non-nested interrupt returns, RTEMS switches back to the stack
+of the interrupted stack. The current stack pointer is not
+altered by RTEMS on nested interrupt.
+
+Without a dedicated interrupt stack, every task in
+the system MUST have enough stack space to accommodate the worst
+case stack usage of that particular task and the interrupt
+service routines COMBINED. By supporting a dedicated interrupt
+stack, RTEMS significantly lowers the stack requirements for
+each task.
+
+RTEMS allocates the dedicated interrupt stack from
+the Workspace Area. The amount of memory allocated for the
+interrupt stack is determined by the interrupt_stack_size field
+in the CPU Configuration Table.
+
diff --git a/doc/supplements/i386/memmodel.t b/doc/supplements/i386/memmodel.t
new file mode 100644
index 0000000000..4ed5c53b7c
--- /dev/null
+++ b/doc/supplements/i386/memmodel.t
@@ -0,0 +1,72 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Memory Model
+
+@section Introduction
+
+A processor may support any combination of memory
+models ranging from pure physical addressing to complex demand
+paged virtual memory systems. RTEMS supports a flat memory
+model which ranges contiguously over the processor's allowable
+address space. RTEMS does not support segmentation or virtual
+memory of any kind. The appropriate memory model for RTEMS
+provided by the targeted processor and related characteristics
+of that model are described in this chapter.
+
+@section Flat Memory Model
+
+RTEMS supports the i386 protected mode, flat memory
+model with paging disabled. In this mode, the i386
+automatically converts every address from a logical to a
+physical address each time it is used. The i386 uses
+information provided in the segment registers and the Global
+Descriptor Table to convert these addresses. RTEMS assumes the
+existence of the following segments:
+
+@itemize @bullet
+@item a single code segment at protection level (0) which
+contains all application and executive code.
+
+@item a single data segment at protection level zero (0) which
+contains all application and executive data.
+@end itemize
+
+The i386 segment registers and associated selectors
+must be initialized when the initialize_executive directive is
+invoked. RTEMS treats the segment registers as system registers
+and does not modify or context switch them.
+
+This i386 memory model supports a flat 32-bit address
+space with addresses ranging from 0x00000000 to 0xFFFFFFFF (4
+gigabytes). Each address is represented by a 32-bit value and
+is byte addressable. The address may be used to reference a
+single byte, half-word (2-bytes), or word (4 bytes).
+
+RTEMS does not require that logical addresses map
+directly to physical addresses, although it is desirable in many
+applications to do so. If logical and physical addresses are
+not the same, then an additional selector will be required so
+RTEMS can access the Interrupt Descriptor Table to install
+interrupt service routines. The selector number of this segment
+is provided to RTEMS in the CPU Dependent Information Table.
+
+By not requiring that logical addresses map directly
+to physical addresses, the memory space of an RTEMS application
+can be separated from that of a ROM monitor. For example, on
+the Force Computers CPU386, the ROM monitor loads application
+programs into a logical address space where logical address
+0x00000000 corresponds to physical address 0x0002000. On this
+board, RTEMS and the application use virtual addresses which do
+not map to physical addresses.
+
+RTEMS assumes that the DS and ES registers contain
+the selector for the single data segment when a directive is
+invoked. This assumption is especially important when
+developing interrupt service routines.
+
diff --git a/doc/supplements/i386/preface.texi b/doc/supplements/i386/preface.texi
new file mode 100644
index 0000000000..b33c0671c6
--- /dev/null
+++ b/doc/supplements/i386/preface.texi
@@ -0,0 +1,41 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Preface, CPU Model Dependent Features, Top, Top
+@end ifinfo
+@unnumbered Preface
+
+The Real Time Executive for Multiprocessor Systems
+(RTEMS) is designed to be portable across multiple processor
+architectures. However, the nature of real-time systems makes
+it essential that the application designer understand certain
+processor dependent implementation details. These processor
+dependencies include calling convention, board support package
+issues, interrupt processing, exact RTEMS memory requirements,
+performance data, header files, and the assembly language
+interface to the executive.
+
+For information on the i386 processor, refer to the
+following documents:
+
+@itemize @bullet
+@item @cite{386 Programmer's Reference Manual, Intel, Order No. 230985-002}.
+
+@item @cite{386 Microprocessor Hardware Reference Manual, Intel,
+Order No. 231732-003}.
+
+@item @cite{80386 System Software Writer's Guide, Intel, Order No. 231499-001}.
+
+@item @cite{80387 Programmer's Reference Manual, Intel, Order No. 231917-001}.
+@end itemize
+
+It is highly recommended that the i386 RTEMS
+application developer obtain and become familiar with Intel's
+386 Programmer's Reference Manual.
+
diff --git a/doc/supplements/i386/timeFORCE386.t b/doc/supplements/i386/timeFORCE386.t
new file mode 100644
index 0000000000..56f01ae855
--- /dev/null
+++ b/doc/supplements/i386/timeFORCE386.t
@@ -0,0 +1,101 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@include common/timemac.texi
+@tex
+\global\advance \smallskipamount by -4pt
+@end tex
+
+@chapter CPU386 Timing Data
+
+@section Introduction
+
+The timing data for the i386 version of RTEMS is
+provided along with the target dependent aspects concerning the
+gathering of the timing data. The hardware platform used to
+gather the times is described to give the reader a better
+understanding of each directive time provided. Also, provided
+is a description of the interrupt latency and the context
+switch times as they pertain to the i386 version of RTEMS.
+
+@section Hardware Platform
+
+All times reported except for the maximum period
+interrupts are disabled by RTEMS were measured using a Force
+Computers CPU386 board. The CPU386 is a 16 Mhz board with zero
+wait state dynamic memory and an i80387 numeric coprocessor.
+One of the count-down timers provided by a Motorola MC68901 was
+used to measure elapsed time with one microsecond resolution.
+All sources of hardware interrupts are disabled, although the
+interrupt level of the i386 allows all interrupts.
+
+The maximum period interrupts are disabled was
+measured by summing the number of CPU cycles required by each
+assembly language instruction executed while interrupts were
+disabled. Zero wait state memory was assumed. The total CPU
+cycles executed with interrupts disabled, including the
+instructions to disable and enable interrupts, was divided by 16
+to simulate a i386 executing at 16 Mhz.
+
+@section Interrupt Latency
+
+The maximum period with interrupts disabled within
+RTEMS is less than RTEMS_MAXIMUM_DISABLE_PERIOD microseconds
+including the instructions
+which disable and re-enable interrupts. The time required for
+the i386 to generate an interrupt using the int instruction,
+vectoring to an interrupt handler, and for the RTEMS entry
+overhead before invoking the user's interrupt handler are a
+total of 12 microseconds. These combine to yield a worst case
+interrupt latency of less
+RTEMS_MAXIMUM_DISABLE_PERIOD + RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK
+microseconds. [NOTE: The
+maximum period with interrupts disabled within RTEMS was last
+calculated for Release RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD.]
+
+It should be noted again that the maximum period with
+interrupts disabled within RTEMS is hand-timed. The interrupt
+vector and entry overhead time was generated on the Force
+Computers CPU386 benchmark platform using the int instruction as
+the interrupt source.
+
+@section Context Switch
+
+The RTEMS processor context switch time is RTEMS_NO_FP_CONTEXTS
+microseconds on the Force Computers CPU386 benchmark platform.
+This time represents the raw context switch time with no user
+extensions configured. Additional execution time is required
+when a TASK_SWITCH user extension is configured. The use of the
+TASK_SWITCH extension is application dependent. Thus, its
+execution time is not considered part of the base context switch
+time.
+
+Since RTEMS was designed specifically for embedded
+missile applications which are floating point intensive, the
+executive is optimized to avoid unnecessarily saving and
+restoring the state of the numeric coprocessor. The state of
+the numeric coprocessor is only saved when a FLOATING_POINT task
+is dispatched and that task was not the last task to utilize the
+coprocessor. In a system with only one FLOATING_POINT task, the
+state of the numeric coprocessor will never be saved or
+restored. When the first FLOATING_POINT task is dispatched,
+RTEMS does not need to save the current state of the numeric
+coprocessor.
+
+The exact amount of time required to save and restore
+floating point context is dependent on the state of the numeric
+coprocessor. RTEMS places the coprocessor in the initialized
+state when a task is started or restarted. Once the task has
+utilized the coprocessor, it is in the idle state when floating
+point instructions are not executing and the busy state when
+floating point instructions are executing. The state of the
+coprocessor is task specific.
+
+The following table summarizes the context switch
+times for the Force Computers CPU386 benchmark platform:
+
diff --git a/doc/supplements/i960/.cvsignore b/doc/supplements/i960/.cvsignore
new file mode 100644
index 0000000000..4cc6285a98
--- /dev/null
+++ b/doc/supplements/i960/.cvsignore
@@ -0,0 +1,36 @@
+bsp.texi
+callconv.texi
+cpumodel.texi
+cputable.texi
+fatalerr.texi
+i960
+i960.aux
+i960.cp
+i960.dvi
+i960.fn
+i960*.html
+i960.ky
+i960.log
+i960.pdf
+i960.pg
+i960.ps
+i960.toc
+i960.tp
+i960.vr
+index.html
+intr.t
+intr.texi
+Makefile
+Makefile.in
+mdate-sh
+memmodel.texi
+rtems_footer.html
+rtems_header.html
+stamp-vti
+timeCVME961_.t
+timeCVME961.texi
+timing.t
+timing.texi
+version.texi
+wksheets.t
+wksheets.texi
diff --git a/doc/supplements/i960/CVME961_TIMES b/doc/supplements/i960/CVME961_TIMES
new file mode 100644
index 0000000000..17e022c0f5
--- /dev/null
+++ b/doc/supplements/i960/CVME961_TIMES
@@ -0,0 +1,247 @@
+#
+# Intel i960/Cyclone CVME961 (i960CA) Timing and Size Information
+#
+# $Id$
+#
+
+#
+# CPU Model Information
+#
+RTEMS_BSP CVME961
+RTEMS_CPU_MODEL i960CA
+#
+# Interrupt Latency
+#
+# NOTE: In general, the text says it is hand-calculated to be
+# RTEMS_MAXIMUM_DISABLE_PERIOD at RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+# Mhz and this was last calculated for Release
+# RTEMS_VERSION_FOR_MAXIMUM_DISABLE_PERIOD.
+#
+RTEMS_MAXIMUM_DISABLE_PERIOD 2.5
+RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ 33
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD 3.2.1
+#
+# Context Switch Times
+#
+RTEMS_NO_FP_CONTEXTS 1
+RTEMS_RESTORE_1ST_FP_TASK 2
+RTEMS_SAVE_INIT_RESTORE_INIT 3
+RTEMS_SAVE_IDLE_RESTORE_INIT 4
+RTEMS_SAVE_IDLE_RESTORE_IDLE 5
+#
+# Task Manager Times
+#
+RTEMS_TASK_CREATE_ONLY 6
+RTEMS_TASK_IDENT_ONLY 7
+RTEMS_TASK_START_ONLY 8
+RTEMS_TASK_RESTART_CALLING_TASK 9
+RTEMS_TASK_RESTART_SUSPENDED_RETURNS_TO_CALLER 9
+RTEMS_TASK_RESTART_BLOCKED_RETURNS_TO_CALLER 10
+RTEMS_TASK_RESTART_READY_RETURNS_TO_CALLER 11
+RTEMS_TASK_RESTART_SUSPENDED_PREEMPTS_CALLER 12
+RTEMS_TASK_RESTART_BLOCKED_PREEMPTS_CALLER 13
+RTEMS_TASK_RESTART_READY_PREEMPTS_CALLER 14
+RTEMS_TASK_DELETE_CALLING_TASK 15
+RTEMS_TASK_DELETE_SUSPENDED_TASK 16
+RTEMS_TASK_DELETE_BLOCKED_TASK 17
+RTEMS_TASK_DELETE_READY_TASK 18
+RTEMS_TASK_SUSPEND_CALLING_TASK 19
+RTEMS_TASK_SUSPEND_RETURNS_TO_CALLER 20
+RTEMS_TASK_RESUME_TASK_READIED_RETURNS_TO_CALLER 21
+RTEMS_TASK_RESUME_TASK_READIED_PREEMPTS_CALLER 22
+RTEMS_TASK_SET_PRIORITY_OBTAIN_CURRENT_PRIORITY 23
+RTEMS_TASK_SET_PRIORITY_RETURNS_TO_CALLER 24
+RTEMS_TASK_SET_PRIORITY_PREEMPTS_CALLER 25
+RTEMS_TASK_MODE_OBTAIN_CURRENT_MODE 26
+RTEMS_TASK_MODE_NO_RESCHEDULE 27
+RTEMS_TASK_MODE_RESCHEDULE_RETURNS_TO_CALLER 28
+RTEMS_TASK_MODE_RESCHEDULE_PREEMPTS_CALLER 29
+RTEMS_TASK_GET_NOTE_ONLY 30
+RTEMS_TASK_SET_NOTE_ONLY 31
+RTEMS_TASK_WAKE_AFTER_YIELD_RETURNS_TO_CALLER 32
+RTEMS_TASK_WAKE_AFTER_YIELD_PREEMPTS_CALLER 33
+RTEMS_TASK_WAKE_WHEN_ONLY 34
+#
+# Interrupt Manager
+#
+RTEMS_INTR_ENTRY_RETURNS_TO_NESTED 35
+RTEMS_INTR_ENTRY_RETURNS_TO_INTERRUPTED_TASK 36
+RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK 37
+RTEMS_INTR_EXIT_RETURNS_TO_NESTED 38
+RTEMS_INTR_EXIT_RETURNS_TO_INTERRUPTED_TASK 39
+RTEMS_INTR_EXIT_RETURNS_TO_PREEMPTING_TASK 40
+#
+# Clock Manager
+#
+RTEMS_CLOCK_SET_ONLY 41
+RTEMS_CLOCK_GET_ONLY 42
+RTEMS_CLOCK_TICK_ONLY 43
+#
+# Timer Manager
+#
+RTEMS_TIMER_CREATE_ONLY 44
+RTEMS_TIMER_IDENT_ONLY 45
+RTEMS_TIMER_DELETE_INACTIVE 46
+RTEMS_TIMER_DELETE_ACTIVE 47
+RTEMS_TIMER_FIRE_AFTER_INACTIVE 48
+RTEMS_TIMER_FIRE_AFTER_ACTIVE 49
+RTEMS_TIMER_FIRE_WHEN_INACTIVE 50
+RTEMS_TIMER_FIRE_WHEN_ACTIVE 51
+RTEMS_TIMER_RESET_INACTIVE 52
+RTEMS_TIMER_RESET_ACTIVE 53
+RTEMS_TIMER_CANCEL_INACTIVE 54
+RTEMS_TIMER_CANCEL_ACTIVE 55
+#
+# Semaphore Manager
+#
+RTEMS_SEMAPHORE_CREATE_ONLY 56
+RTEMS_SEMAPHORE_IDENT_ONLY 57
+RTEMS_SEMAPHORE_DELETE_ONLY 58
+RTEMS_SEMAPHORE_OBTAIN_AVAILABLE 59
+RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_NO_WAIT 60
+RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_CALLER_BLOCKS 61
+RTEMS_SEMAPHORE_RELEASE_NO_WAITING_TASKS 62
+RTEMS_SEMAPHORE_RELEASE_TASK_READIED_RETURNS_TO_CALLER 63
+RTEMS_SEMAPHORE_RELEASE_TASK_READIED_PREEMPTS_CALLER 64
+#
+# Message Manager
+#
+RTEMS_MESSAGE_QUEUE_CREATE_ONLY 65
+RTEMS_MESSAGE_QUEUE_IDENT_ONLY 66
+RTEMS_MESSAGE_QUEUE_DELETE_ONLY 67
+RTEMS_MESSAGE_QUEUE_SEND_NO_WAITING_TASKS 68
+RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_RETURNS_TO_CALLER 69
+RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_PREEMPTS_CALLER 70
+RTEMS_MESSAGE_QUEUE_URGENT_NO_WAITING_TASKS 71
+RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_RETURNS_TO_CALLER 72
+RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_PREEMPTS_CALLER 73
+RTEMS_MESSAGE_QUEUE_BROADCAST_NO_WAITING_TASKS 74
+RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_RETURNS_TO_CALLER 75
+RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_PREEMPTS_CALLER 76
+RTEMS_MESSAGE_QUEUE_RECEIVE_AVAILABLE 77
+RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_NO_WAIT 78
+RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS 79
+RTEMS_MESSAGE_QUEUE_FLUSH_NO_MESSAGES_FLUSHED 80
+RTEMS_MESSAGE_QUEUE_FLUSH_MESSAGES_FLUSHED 81
+#
+# Event Manager
+#
+RTEMS_EVENT_SEND_NO_TASK_READIED 82
+RTEMS_EVENT_SEND_TASK_READIED_RETURNS_TO_CALLER 83
+RTEMS_EVENT_SEND_TASK_READIED_PREEMPTS_CALLER 84
+RTEMS_EVENT_RECEIVE_OBTAIN_CURRENT_EVENTS 85
+RTEMS_EVENT_RECEIVE_AVAILABLE 86
+RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_NO_WAIT 87
+RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS 88
+#
+# Signal Manager
+#
+RTEMS_SIGNAL_CATCH_ONLY 89
+RTEMS_SIGNAL_SEND_RETURNS_TO_CALLER 90
+RTEMS_SIGNAL_SEND_SIGNAL_TO_SELF 91
+RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_CALLING_TASK 92
+RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_PREEMPTING_TASK 93
+#
+# Partition Manager
+#
+RTEMS_PARTITION_CREATE_ONLY 94
+RTEMS_PARTITION_IDENT_ONLY 95
+RTEMS_PARTITION_DELETE_ONLY 96
+RTEMS_PARTITION_GET_BUFFER_AVAILABLE 97
+RTEMS_PARTITION_GET_BUFFER_NOT_AVAILABLE 98
+RTEMS_PARTITION_RETURN_BUFFER_ONLY 99
+#
+# Region Manager
+#
+RTEMS_REGION_CREATE_ONLY 100
+RTEMS_REGION_IDENT_ONLY 101
+RTEMS_REGION_DELETE_ONLY 102
+RTEMS_REGION_GET_SEGMENT_AVAILABLE 103
+RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_NO_WAIT 104
+RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_CALLER_BLOCKS 105
+RTEMS_REGION_RETURN_SEGMENT_NO_WAITING_TASKS 106
+RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_RETURNS_TO_CALLER 107
+RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_PREEMPTS_CALLER 108
+#
+# Dual-Ported Memory Manager
+#
+RTEMS_PORT_CREATE_ONLY 109
+RTEMS_PORT_IDENT_ONLY 110
+RTEMS_PORT_DELETE_ONLY 111
+RTEMS_PORT_INTERNAL_TO_EXTERNAL_ONLY 112
+RTEMS_PORT_EXTERNAL_TO_INTERNAL_ONLY 113
+#
+# IO Manager
+#
+RTEMS_IO_INITIALIZE_ONLY 114
+RTEMS_IO_OPEN_ONLY 115
+RTEMS_IO_CLOSE_ONLY 116
+RTEMS_IO_READ_ONLY 117
+RTEMS_IO_WRITE_ONLY 118
+RTEMS_IO_CONTROL_ONLY 119
+#
+# Rate Monotonic Manager
+#
+RTEMS_RATE_MONOTONIC_CREATE_ONLY 120
+RTEMS_RATE_MONOTONIC_IDENT_ONLY 121
+RTEMS_RATE_MONOTONIC_CANCEL_ONLY 122
+RTEMS_RATE_MONOTONIC_DELETE_ACTIVE 123
+RTEMS_RATE_MONOTONIC_DELETE_INACTIVE 124
+RTEMS_RATE_MONOTONIC_PERIOD_INITIATE_PERIOD_RETURNS_TO_CALLER 125
+RTEMS_RATE_MONOTONIC_PERIOD_CONCLUDE_PERIOD_CALLER_BLOCKS 126
+RTEMS_RATE_MONOTONIC_PERIOD_OBTAIN_STATUS 127
+#
+# Size Information
+#
+#
+# xxx alloted for numbers
+#
+RTEMS_DATA_SPACE 128
+RTEMS_MINIMUM_CONFIGURATION xx,129
+RTEMS_MAXIMUM_CONFIGURATION xx,130
+# x,xxx alloted for numbers
+RTEMS_CORE_CODE_SIZE x,131
+RTEMS_INITIALIZATION_CODE_SIZE x,132
+RTEMS_TASK_CODE_SIZE x,133
+RTEMS_INTERRUPT_CODE_SIZE x,134
+RTEMS_CLOCK_CODE_SIZE x,135
+RTEMS_TIMER_CODE_SIZE x,136
+RTEMS_SEMAPHORE_CODE_SIZE x,137
+RTEMS_MESSAGE_CODE_SIZE x,138
+RTEMS_EVENT_CODE_SIZE x,139
+RTEMS_SIGNAL_CODE_SIZE x,140
+RTEMS_PARTITION_CODE_SIZE x,141
+RTEMS_REGION_CODE_SIZE x,142
+RTEMS_DPMEM_CODE_SIZE x,143
+RTEMS_IO_CODE_SIZE x,144
+RTEMS_FATAL_ERROR_CODE_SIZE x,145
+RTEMS_RATE_MONOTONIC_CODE_SIZE x,146
+RTEMS_MULTIPROCESSING_CODE_SIZE x,147
+# xxx alloted for numbers
+RTEMS_TIMER_CODE_OPTSIZE 148
+RTEMS_SEMAPHORE_CODE_OPTSIZE 149
+RTEMS_MESSAGE_CODE_OPTSIZE 150
+RTEMS_EVENT_CODE_OPTSIZE 151
+RTEMS_SIGNAL_CODE_OPTSIZE 152
+RTEMS_PARTITION_CODE_OPTSIZE 153
+RTEMS_REGION_CODE_OPTSIZE 154
+RTEMS_DPMEM_CODE_OPTSIZE 155
+RTEMS_IO_CODE_OPTSIZE 156
+RTEMS_RATE_MONOTONIC_CODE_OPTSIZE 157
+RTEMS_MULTIPROCESSING_CODE_OPTSIZE 158
+# xxx alloted for numbers
+RTEMS_BYTES_PER_TASK 159
+RTEMS_BYTES_PER_TIMER 160
+RTEMS_BYTES_PER_SEMAPHORE 161
+RTEMS_BYTES_PER_MESSAGE_QUEUE 162
+RTEMS_BYTES_PER_REGION 163
+RTEMS_BYTES_PER_PARTITION 164
+RTEMS_BYTES_PER_PORT 165
+RTEMS_BYTES_PER_PERIOD 166
+RTEMS_BYTES_PER_EXTENSION 167
+RTEMS_BYTES_PER_FP_TASK 168
+RTEMS_BYTES_PER_NODE 169
+RTEMS_BYTES_PER_GLOBAL_OBJECT 170
+RTEMS_BYTES_PER_PROXY 171
+# x,xxx alloted for numbers
+RTEMS_BYTES_OF_FIXED_SYSTEM_REQUIREMENTS x,172
diff --git a/doc/supplements/i960/ChangeLog b/doc/supplements/i960/ChangeLog
new file mode 100644
index 0000000000..2d39131a19
--- /dev/null
+++ b/doc/supplements/i960/ChangeLog
@@ -0,0 +1,76 @@
+2003-12-12 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-12-11 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-11-26 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Add *.info to CLEANFILES to accomodate
+ automake-1.7f/1.8 breaking building infos.
+
+2003-09-26 Joel Sherrill <joel@OARcorp.com>
+
+ * cpumodel.t: Obsoleting HP PA-RISC port and removing all references.
+
+2003-09-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Merger from rtems-4-6-branch.
+
+2003-09-19 Joel Sherrill <joel@OARcorp.com>
+
+ * i960.texi: Merge from branch.
+
+2003-05-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * cpumodel.t: Reflect c/src/exec having moved to cpukit.
+
+2003-01-25 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * i960.texi: Set @setfilename i960.info.
+
+2003-01-24 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Put GENERATED_FILES into $builddir.
+
+2003-01-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * version.texi: Remove from CVS.
+ * stamp-vti: Remove from CVS.
+ * .cvsignore: Add version.texi.
+ Add stamp-vti.
+ Re-sort.
+
+2003-01-21 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-11-13 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-10-24 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-07-30 Joel Sherrill <joel@OARcorp.com>
+
+ * callconf.t: Added some markups for fonts and clarified
+ some places.
+2002-03-27 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Remove AUTOMAKE_OPTIONS.
+
+2002-01-18 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Require automake-1.5.
+
+2001-01-17 Joel Sherrill <joel@OARcorp.com>
+
+ * .cvsignore: Added rtems_header.html and rtems_footer.html.
+
+2000-08-10 Joel Sherrill <joel@OARcorp.com>
+
+ * ChangeLog: New file.
diff --git a/doc/supplements/i960/Makefile.am b/doc/supplements/i960/Makefile.am
new file mode 100644
index 0000000000..40d41cd9f2
--- /dev/null
+++ b/doc/supplements/i960/Makefile.am
@@ -0,0 +1,110 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = i960
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/supplements/supplement.am
+
+GENERATED_FILES = cpumodel.texi callconv.texi memmodel.texi intr.texi \
+ fatalerr.texi bsp.texi cputable.texi timing.texi wksheets.texi \
+ timeCVME961.texi
+COMMON_FILES += $(top_srcdir)/common/cpright.texi \
+ $(top_srcdir)/common/timemac.texi
+
+FILES = preface.texi
+
+info_TEXINFOS = i960.texi
+i960_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+#
+# Chapters which get automatic processing
+#
+
+cpumodel.texi: cpumodel.t
+ $(BMENU2) -p "Preface" \
+ -u "Top" \
+ -n "Calling Conventions" < $< > $@
+
+callconv.texi: callconv.t
+ $(BMENU2) -p "CPU Model Dependent Features Floating Point Unit" \
+ -u "Top" \
+ -n "Memory Model" < $< > $@
+
+memmodel.texi: memmodel.t
+ $(BMENU2) -p "Calling Conventions Leaf Procedures" \
+ -u "Top" \
+ -n "Interrupt Processing" < $< > $@
+
+# Interrupt Chapter:
+# 1. Replace Times and Sizes
+# 2. Build Node Structure
+intr.texi: intr_NOTIMES.t CVME961_TIMES
+ ${REPLACE2} -p $(srcdir)/CVME961_TIMES $(srcdir)/intr_NOTIMES.t | \
+ $(BMENU2) -p "Memory Model Flat Memory Model" \
+ -u "Top" \
+ -n "Default Fatal Error Processing" > $@
+
+fatalerr.texi: fatalerr.t
+ $(BMENU2) -p "Interrupt Processing Interrupt Stack" \
+ -u "Top" \
+ -n "Board Support Packages" < $< > $@
+
+bsp.texi: bsp.t
+ $(BMENU2) -p "Default Fatal Error Processing Default Fatal Error Handler Operations" \
+ -u "Top" \
+ -n "Processor Dependent Information Table" < $< > $@
+
+cputable.texi: cputable.t
+ $(BMENU2) -p "Board Support Packages Processor Initialization" \
+ -u "Top" \
+ -n "Memory Requirements" < $< > $@
+
+# Worksheets Chapter:
+# 1. Obtain the Shared File
+# 2. Replace Times and Sizes
+# 3. Build Node Structure
+
+wksheets.texi: $(top_srcdir)/common/wksheets.t CVME961_TIMES
+ ${REPLACE2} -p $(srcdir)/CVME961_TIMES \
+ $(top_srcdir)/common/wksheets.t | \
+ $(BMENU2) -p "Processor Dependent Information Table CPU Dependent Information Table" \
+ -u "Top" \
+ -n "Timing Specification" > $@
+
+# Timing Specification Chapter:
+# 1. Copy the Shared File
+# 3. Build Node Structure
+
+timing.texi: $(top_srcdir)/common/timing.t
+ $(BMENU2) -p "Memory Requirements RTEMS RAM Workspace Worksheet" \
+ -u "Top" \
+ -n "CVME961 Timing Data" < $< > $@
+
+# Timing Data for BSP Chapter:
+# 1. Copy the Shared File
+# 2. Replace Times and Sizes
+# 3. Build Node Structure
+
+timeCVME961.texi: $(top_srcdir)/common/timetbl.t timeCVME961.t
+ cat $(srcdir)/timeCVME961.t $(top_srcdir)/common/timetbl.t >timeCVME961_.t
+ @echo >>timeCVME961_.t
+ @echo "@tex" >>timeCVME961_.t
+ @echo "\\global\\advance \\smallskipamount by 4pt" >>timeCVME961_.t
+ @echo "@end tex" >>timeCVME961_.t
+ ${REPLACE2} -p $(srcdir)/CVME961_TIMES timeCVME961_.t | \
+ $(BMENU2) -p "Timing Specification Terminology" \
+ -u "Top" \
+ -n "Command and Variable Index" > $@
+CLEANFILES += timeCVME961_.t
+
+EXTRA_DIST = CVME961_TIMES bsp.t callconv.t cpumodel.t cputable.t fatalerr.t \
+ intr_NOTIMES.t memmodel.t timeCVME961.t
+
+CLEANFILES += i960.info i960.info-?
diff --git a/doc/supplements/i960/bsp.t b/doc/supplements/i960/bsp.t
new file mode 100644
index 0000000000..cbfb05e340
--- /dev/null
+++ b/doc/supplements/i960/bsp.t
@@ -0,0 +1,54 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Board Support Packages
+
+@section Introduction
+
+An RTEMS Board Support Package (BSP) must be designed
+to support a particular processor and target board combination.
+This chapter presents a discussion of i960CA specific BSP
+issues. For more information on developing a BSP, refer to the
+chapter titled Board Support Packages in the RTEMS
+Applications User's Guide.
+
+@section System Reset
+
+An RTEMS based application is initiated when the
+i960CA processor is reset. When the i960CA is reset, the
+processor reads an Initial Memory Image (IMI) to establish its
+state. The IMI consists of the Initialization Boot Record (IBR)
+and the Process Control Block (PRCB) from an Initial Memory
+Image (IMI) at location 0xFFFFFF00. The IBR contains the
+initial bus configuration data, the address of the first
+instruction to execute after reset, the address of the PRCB, and
+the checksum used by the processor's self-test.
+
+@section Processor Initialization
+
+The PRCB contains the base addresses for system data
+structures, and initial configuration information for the core
+and integrated peripherals. In particular, the PRCB contains
+the initial contents of the Arithmetic Control (AC) Register as
+well as the base addresses of the Interrupt Vector Table, System
+Procedure Entry Table, Fault Entry Table, and the Control Table.
+In addition, the PRCB is used to configure the depth of the
+instruction and register caches and the actions when certain
+types of faults are encountered.
+
+The Process Controls (PC) Register is initialized to
+0xC01F2002 which sets the i960CA's interrupt level to 0x1F (31
+decimal). In addition, the Interrupt Mask (IMSK) Register
+(alternately referred to as Special Function Register 1 or sf1)
+is set to 0x00000000 to mask all external and DMA interrupt
+sources. Thus, all interrupts are disabled when the first
+instruction is executed.
+
+For more information regarding the i960CA's data
+structures and their contents, refer to Intel's i960CA User's
+Manual.
diff --git a/doc/supplements/i960/callconv.t b/doc/supplements/i960/callconv.t
new file mode 100644
index 0000000000..d112e67123
--- /dev/null
+++ b/doc/supplements/i960/callconv.t
@@ -0,0 +1,97 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Calling Conventions
+
+@section Introduction
+
+Each high-level language compiler generates
+subroutine entry and exit code based upon a set of rules known
+as the compiler's calling convention. These rules address the
+following issues:
+
+@itemize @bullet
+@item register preservation and usage
+
+@item parameter passing
+
+@item call and return mechanism
+@end itemize
+
+A compiler's calling convention is of importance when
+interfacing to subroutines written in another language either
+assembly or high-level. Even when the high-level language and
+target processor are the same, different compilers may use
+different calling conventions. As a result, calling conventions
+are both processor and compiler dependent.
+
+@section Processor Background
+
+All members of the i960 architecture family support
+two methods for performing procedure calls: a RISC-style
+branch-and-link and an integrated call and return mechanism.
+
+On a branch-and-link, the processor branches to the
+invoked procedure and saves the return address in a register,
+@code{G14}. Typically, the invoked procedure will not invoke another
+procedure and is referred to as a leaf procedure. Many
+high-level language compilers for the i960 family recognize leaf
+procedures and automatically optimize them to utilize the
+branch-and-link mechanism. Branch-and-link procedures are
+invoked using the @code{bal} and @code{balx} instructions and return control
+via the @code{bx} instruction. By convention, @code{G14} is zero when not in
+a leaf procedure. It is the responsibility of the leaf
+procedure to clear @code{G14} before returning.
+
+The integrated call and return mechanism also
+branches to the invoked procedure and saves the return address
+as did the branch and link mechanism. However, the important
+difference is that the @code{call}, @code{callx}, and @code{calls} instructions save
+the local register set (@code{R0} through @code{R15}) before transferring
+control to the invoked procedure. The @code{ret} instruction
+automatically restores the previous local register set. The
+i960CA provides a register cache which can be configured to
+retain the last five to sixteen recent register caches. When
+the register cache is full, the oldest cached register set is
+written to the stack.
+
+@section Calling Mechanism
+
+All RTEMS directives are invoked using either a @code{call}
+or @code{callx} instruction and return to the user via the @code{ret}
+instruction.
+
+@section Register Usage
+
+As discussed above, the @code{call} and @code{callx} instructions
+automatically save the current contents of the local register
+set (@code{R0} through @code{R15}). The contents of the local registers will
+be restored as part of returning to the application. The
+contents of global registers @code{G0} through @code{G7} are not preserved by
+RTEMS directives.
+
+@section Parameter Passing
+
+RTEMS uses the standard i960 family C parameter
+passing mechanism in which @code{G0} contains the first parameter, @code{G1}
+the second, and so on for the remaining parameters. No RTEMS
+directive requires more than six parameters.
+
+@section User-Provided Routines
+
+All user-provided routines invoked by RTEMS, such as
+user extensions, device drivers, and MPCI routines, must also
+adhere to these calling conventions.
+
+@section Leaf Procedures
+
+RTEMS utilizes leaf procedures internally to improve
+performance. This improves execution speed as well as reducing
+stack usage and the number of register sets which must be cached.
+
+
diff --git a/doc/supplements/i960/cpumodel.t b/doc/supplements/i960/cpumodel.t
new file mode 100644
index 0000000000..3e5676d61b
--- /dev/null
+++ b/doc/supplements/i960/cpumodel.t
@@ -0,0 +1,62 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter CPU Model Dependent Features
+
+@section Introduction
+
+Microprocessors are generally classified into
+families with a variety of CPU models or implementations within
+that family. Within a processor family, there is a high level
+of binary compatibility. This family may be based on either an
+architectural specification or on maintaining compatibility with
+a popular processor. Recent microprocessor families such as the
+SPARC or PowerPC are based on an architectural specification
+which is independent or any particular CPU model or
+implementation. Older families such as the M68xxx and the iX86
+evolved as the manufacturer strived to produce higher
+performance processor models which maintained binary
+compatibility with older models.
+
+RTEMS takes advantage of the similarity of the
+various models within a CPU family. Although the models do vary
+in significant ways, the high level of compatibility makes it
+possible to share the bulk of the CPU dependent executive code
+across the entire family. Each processor family supported by
+RTEMS has a list of features which vary between CPU models
+within a family. For example, the most common model dependent
+feature regardless of CPU family is the presence or absence of a
+floating point unit or coprocessor. When defining the list of
+features present on a particular CPU model, one simply notes
+that floating point hardware is or is not present and defines a
+single constant appropriately. Conditional compilation is
+utilized to include the appropriate source code for this CPU
+model's feature set. It is important to note that this means
+that RTEMS is thus compiled using the appropriate feature set
+and compilation flags optimal for this CPU model used. The
+alternative would be to generate a binary which would execute on
+all family members using only the features which were always
+present.
+
+This chapter presents the set of features which vary
+across i960 implementations and are of importance to RTEMS.
+The set of CPU model feature macros are defined in the file
+cpukit/score/cpu/i960/i960.h based upon the particular CPU
+model defined on the compilation command line.
+
+@section CPU Model Name
+
+The macro CPU_MODEL_NAME is a string which designates
+the name of this CPU model. For example, for the Intel i960CA,
+this macro is set to the string "i960ca".
+
+@section Floating Point Unit
+
+The macro I960_HAS_FPU is set to 1 to indicate that
+this CPU model has a hardware floating point unit and 0
+otherwise.
diff --git a/doc/supplements/i960/cputable.t b/doc/supplements/i960/cputable.t
new file mode 100644
index 0000000000..65f98f5516
--- /dev/null
+++ b/doc/supplements/i960/cputable.t
@@ -0,0 +1,121 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Processor Dependent Information Table
+
+@section Introduction
+
+Any highly processor dependent information required
+to describe a processor to RTEMS is provided in the CPU
+Dependent Information Table. This table is not required for all
+processors supported by RTEMS. This chapter describes the
+contents, if any, for a particular processor type.
+
+@section CPU Dependent Information Table
+
+The i960CA version of the RTEMS CPU Dependent
+Information Table contains the information required to interface
+a Board Support Package and RTEMS on the i960CA. This
+information is provided to allow RTEMS to interoperate
+effectively with the BSP. The C structure definition is given
+here:
+
+@example
+@group
+typedef struct @{
+ void (*pretasking_hook)( void );
+ void (*predriver_hook)( void );
+ void (*postdriver_hook)( void );
+ void (*idle_task)( void );
+ boolean do_zero_of_workspace;
+ unsigned32 idle_task_stack_size;
+ unsigned32 interrupt_stack_size;
+ unsigned32 extra_mpci_receive_server_stack;
+ void (*stack_free_hook)( void* );
+ /* end of fields required on all CPUs */
+
+ i960_PRCB *Prcb;
+
+@} rtems_cpu_table;
+@end group
+@end example
+
+The contents of the i960 Processor Control Block
+are discussed in the User's Manual for the particular
+i960 model being used. Structure definitions for the
+i960CA and i960HA PRCB and Control Table are provided
+by including the file @code{rtems.h}.
+
+@table @code
+@item pretasking_hook
+is the address of the user provided routine which is invoked
+once RTEMS APIs are initialized. This routine will be invoked
+before any system tasks are created. Interrupts are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item predriver_hook
+is the address of the user provided
+routine that is invoked immediately before the
+the device drivers and MPCI are initialized. RTEMS
+initialization is complete but interrupts and tasking are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item postdriver_hook
+is the address of the user provided
+routine that is invoked immediately after the
+the device drivers and MPCI are initialized. RTEMS
+initialization is complete but interrupts and tasking are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item idle_task
+is the address of the optional user
+provided routine which is used as the system's IDLE task. If
+this field is not NULL, then the RTEMS default IDLE task is not
+used. This field may be NULL to indicate that the default IDLE
+is to be used.
+
+@item do_zero_of_workspace
+indicates whether RTEMS should
+zero the Workspace as part of its initialization. If set to
+TRUE, the Workspace is zeroed. Otherwise, it is not.
+
+@item idle_task_stack_size
+is the size of the RTEMS idle task stack in bytes.
+If this number is less than MINIMUM_STACK_SIZE, then the
+idle task's stack will be MINIMUM_STACK_SIZE in byte.
+
+@item interrupt_stack_size
+is the size of the RTEMS
+allocated interrupt stack in bytes. This value must be at least
+as large as MINIMUM_STACK_SIZE.
+
+@item extra_mpci_receive_server_stack
+is the extra stack space allocated for the RTEMS MPCI receive server task
+in bytes. The MPCI receive server may invoke nearly all directives and
+may require extra stack space on some targets.
+
+@item stack_allocate_hook
+is the address of the optional user provided routine which allocates
+memory for task stacks. If this hook is not NULL, then a stack_free_hook
+must be provided as well.
+
+@item stack_free_hook
+is the address of the optional user provided routine which frees
+memory for task stacks. If this hook is not NULL, then a stack_allocate_hook
+must be provided as well.
+
+@item Prcb
+is the base address of the Processor Control Block. It
+is primarily used by RTEMS to install interrupt handlers.
+@end table
+
+
+
+
+
+
diff --git a/doc/supplements/i960/fatalerr.t b/doc/supplements/i960/fatalerr.t
new file mode 100644
index 0000000000..7f67b40fe8
--- /dev/null
+++ b/doc/supplements/i960/fatalerr.t
@@ -0,0 +1,30 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Default Fatal Error Processing
+
+@section Introduction
+
+Upon detection of a fatal error by either the
+application or RTEMS the fatal error manager is invoked. The
+fatal error manager will invoke the user-supplied fatal error
+handlers. If no user-supplied handlers is configured, the
+RTEMS provided default fatal error handler is invoked. If the
+user-supplied fatal error handlers return to the executive the
+default fatal error handler is then invoked. This chapter
+describes the precise operations of the default fatal error
+handler.
+
+@section Default Fatal Error Handler Operations
+
+The default fatal error handler which is invoked by
+the fatal_error_occurred directive when there is no user handler
+configured or the user handler returns control to RTEMS. The
+default fatal error handler disables processor interrupts to
+level 31, places the error code in G0, and executes a branch to
+self instruction to simulate a halt processor instruction.
diff --git a/doc/supplements/i960/i960.texi b/doc/supplements/i960/i960.texi
new file mode 100644
index 0000000000..573964e02a
--- /dev/null
+++ b/doc/supplements/i960/i960.texi
@@ -0,0 +1,114 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename i960.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the Intel i960 Applications Supplement
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS Target Supplements
+@direntry
+* RTEMS Intel i960 Applications Supplement: (i960).
+@end direntry
+@end ifset
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage RTEMS Intel i960 Applications Supplement
+
+@setchapternewpage odd
+@settitle RTEMS Intel i960 Applications Supplement
+@titlepage
+@finalout
+
+@title RTEMS Intel i960 Applications Supplement
+@subtitle Edition @value{EDITION}, for RTEMS @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include preface.texi
+@include cpumodel.texi
+@include callconv.texi
+@include memmodel.texi
+@include intr.texi
+@include fatalerr.texi
+@include bsp.texi
+@include cputable.texi
+@include wksheets.texi
+@include timing.texi
+@include timeCVME961.texi
+@ifinfo
+@node Top, Preface, (dir), (dir)
+@top i960
+
+This is the online version of the RTEMS Intel i960
+Applications Supplement.
+
+@menu
+* Preface::
+* CPU Model Dependent Features::
+* Calling Conventions::
+* Memory Model::
+* Interrupt Processing::
+* Default Fatal Error Processing::
+* Board Support Packages::
+* Processor Dependent Information Table::
+* Memory Requirements::
+* Timing Specification::
+* CVME961 Timing Data::
+* Command and Variable Index::
+* Concept Index::
+@end menu
+
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@node Command and Variable Index, Concept Index, CVME961 Timing Data Rate Monotonic Manager, Top
+@unnumbered Command and Variable Index
+
+There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@node Concept Index, , Command and Variable Index, Top
+@unnumbered Concept Index
+
+There are currently no Concept Index entries.
+@c @printindex cp
+
+@contents
+@bye
+
diff --git a/doc/supplements/i960/intr_NOTIMES.t b/doc/supplements/i960/intr_NOTIMES.t
new file mode 100644
index 0000000000..47b003bf6e
--- /dev/null
+++ b/doc/supplements/i960/intr_NOTIMES.t
@@ -0,0 +1,193 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Interrupt Processing
+
+@section Introduction
+
+Different types of processors respond to the
+occurrence of an interrupt in its own unique fashion. In
+addition, each processor type provides a control mechanism to
+allow the proper handling of an interrupt. The processor
+dependent response to the interrupt which modifies the execution
+state and results in the modification of the execution stream.
+This modification usually requires that an interrupt handler
+utilize the provided control mechanisms to return to the normal
+processing stream. Although RTEMS hides many of the processor
+dependent details of interrupt processing, it is important to
+understand how the RTEMS interrupt manager is mapped onto the
+processor's unique architecture. Discussed in this chapter are
+the the processor's response and control mechanisms as they
+pertain to RTEMS.
+
+@section Vectoring of Interrupt Handler
+
+Upon receipt of an interrupt the i960CA
+automatically performs the following actions:
+
+@itemize @bullet
+@item saves the local register set,
+
+@item sets the Frame Pointer (FP) to point to the interrupt
+stack,
+
+@item increments the FP by sixteen (16) to make room for the
+Interrupt Record,
+
+@item saves the current values of the arithmetic-controls (AC)
+register, the process-controls (PC) register, and the interrupt
+vector number are saved in the Interrupt Record,
+
+@item the CPU sets the Instruction Pointer (IP) to the address
+of the first instruction in the interrupt handler,
+
+@item the return-status field of the Previous Frame Pointer
+(PFP or R0) register is set to interrupt return,
+
+@item sets the PC state bit to interrupted,
+
+@item sets the current interrupt disable level in the PC to
+the level of the current interrupt, and
+
+@item disables tracing.
+@end itemize
+
+A nested interrupt is processed similarly by the
+i960CA with the exception that the Frame Pointer (FP) already
+points to the interrupt stack. This means that the FP is NOT
+overwritten before space for the Interrupt Record is allocated.
+
+The state flag bit of the saved PC register in the
+Interrupt Record is examined by RTEMS to determine when an outer
+most interrupt is being exited. Therefore, the user application
+code MUST NOT modify this bit.
+
+@section Interrupt Record
+
+The structure of the Interrupt Record for the i960CA
+which is placed on the interrupt stack by the processor in
+response to an interrupt is as follows:
+
+@ifset use-ascii
+@example
+@group
+ +---------------------------+
+ | Saved Process Controls | NFP-16
+ +---------------------------+
+ | Saved Arithmetic Controls | NFP-12
+ +---------------------------+
+ | UNUSED | NFP-8
+ +---------------------------+
+ | UNUSED | NFP-4
+ +---------------------------+
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@sp 1
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\strut\vrule#&
+\hbox to 2.00in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 1.00in{\enskip\hfil#\hfil}
+\cr
+\multispan{3}\hrulefill\cr
+& Saved Process Controls && NFP-16\cr
+\multispan{3}\hrulefill\cr
+& Saved Arithmetic Controls && NFP-12\cr
+\multispan{3}\hrulefill\cr
+& UNUSED && NFP-8\cr
+\multispan{3}\hrulefill\cr
+& UNUSED && NFP-4\cr
+\multispan{3}\hrulefill\cr
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=2 WIDTH="40%" BORDER=2>
+<TR><TD ALIGN=center><STRONG>Saved Process Controls</STRONG></TD>
+ <TD ALIGN=center>NFP-16</TD></TR>
+<TR><TD ALIGN=center><STRONG>Saved Arithmetic Controls</STRONG></TD>
+ <TD ALIGN=center>NFP-12</TD></TR>
+<TR><TD ALIGN=center><STRONG>UNUSED</STRONG></TD>
+ <TD ALIGN=center>NFP-8</TD></TR>
+<TR><TD ALIGN=center><STRONG>UNUSED</STRONG></TD>
+ <TD ALIGN=center>NFP-4</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+@section Interrupt Levels
+
+Thirty-two levels (0-31) of interrupt priorities are
+supported by the i960CA microprocessor with level thirty-one
+(31) being the highest priority. Level zero (0) indicates that
+interrupts are fully enabled. Interrupt requests for interrupts
+with priorities less than or equal to the current interrupt mask
+level are ignored.
+
+Although RTEMS supports 256 interrupt levels, the
+i960CA only supports thirty-two. RTEMS interrupt levels 0
+through 31 directly correspond to i960CA interrupt levels. All
+other RTEMS interrupt levels are undefined and their behavior is
+unpredictable.
+
+@section Disabling of Interrupts by RTEMS
+
+During the execution of directive calls, critical
+sections of code may be executed. When these sections are
+encountered, RTEMS disables interrupts to level thirty-one (31)
+before the execution of this section and restores them to the
+previous level upon completion of the section. RTEMS has been
+optimized to insure that interrupts are disabled for less than
+RTEMS_MAXIMUM_DISABLE_PERIOD microseconds on a
+RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ Mhz i960CA with zero wait states.
+These numbers will vary based the number of wait states and
+processor speed present on the target board. [NOTE: This
+calculation was most recently performed for Release
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD.]
+
+Non-maskable interrupts (NMI) cannot be disabled, and
+ISRs which execute at this level MUST NEVER issue RTEMS system
+calls. If a directive is invoked, unpredictable results may
+occur due to the inability of RTEMS to protect its critical
+sections. However, ISRs that make no system calls may safely
+execute as non-maskable interrupts.
+
+@section Register Cache Flushing
+
+The i960CA version of the RTEMS interrupt manager is
+optimized to insure that the flushreg instruction is only
+executed when a context switch is necessary. The flushreg
+instruction flushes the i960CA register set cache and takes (14
++ 23 * number of sets flushed) cycles to execute. As the i960CA
+supports caching of from five to sixteen register sets, this
+instruction takes from 129 to 382 cycles (3.90 to 11.57
+microseconds at 33 Mhz) to execute given no wait state memory.
+RTEMS flushes the register set cache only at the conclusion of
+the outermost ISR when a context switch is necessary. The
+register set cache will not be flushed as part of processing a
+nested interrupt or when a context switch is not necessary.
+This optimization is essential to providing high-performance
+interrupt management on the i960CA.
+
+@section Interrupt Stack
+
+On the i960CA, RTEMS allocates the interrupt stack
+from the Workspace Area. The amount of memory allocated for the
+interrupt stack is determined by the interrupt_stack_size field
+in the CPU Configuration Table. During the initialization
+process, RTEMS will install its interrupt stack.
+
+
diff --git a/doc/supplements/i960/memmodel.t b/doc/supplements/i960/memmodel.t
new file mode 100644
index 0000000000..80636c0da9
--- /dev/null
+++ b/doc/supplements/i960/memmodel.t
@@ -0,0 +1,40 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Memory Model
+
+@section Introduction
+
+A processor may support any combination of memory
+models ranging from pure physical addressing to complex demand
+paged virtual memory systems. RTEMS supports a flat memory
+model which ranges contiguously over the processor's allowable
+address space. RTEMS does not support segmentation or virtual
+memory of any kind. The appropriate memory model for RTEMS
+provided by the targeted processor and related characteristics
+of that model are described in this chapter.
+
+@section Flat Memory Model
+
+The i960CA supports a flat 32-bit address space with
+addresses ranging from 0x00000000 to 0xFFFFFFFF (4 gigabytes).
+Although the i960CA reserves portions of this address space,
+application code and data may be placed in any non-reserved
+areas. Each address is represented by a 32-bit value and is
+byte addressable. The address may be used to reference a single
+byte, half-word (2-bytes), word (4 bytes), double-word (8
+bytes), triple-word (12 bytes) or quad-word (16 bytes). The
+i960CA does not support virtual memory or segmentation.
+
+The i960CA allows the memory space to be partitioned
+into sixteen regions which may be configured individually as big
+or little endian. RTEMS assumes that the memory regions in
+which its code, data, and the RTEMS Workspace reside are
+configured as little endian.
+
+
diff --git a/doc/supplements/i960/preface.texi b/doc/supplements/i960/preface.texi
new file mode 100644
index 0000000000..6c4d9fd34b
--- /dev/null
+++ b/doc/supplements/i960/preface.texi
@@ -0,0 +1,40 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Preface, CPU Model Dependent Features, Top, Top
+@end ifinfo
+@unnumbered Preface
+
+The Real Time Executive for Multiprocessor Systems
+(RTEMS) is designed to be portable across multiple processor
+architectures. However, the nature of real-time systems makes
+it essential that the application designer understand certain
+processor dependent implementation details. These processor
+dependencies include calling convention, board support package
+issues, interrupt processing, exact RTEMS memory requirements,
+performance data, header files, and the assembly language
+interface to the executive.
+
+For information on the i960CA and the i960 processor
+family in general, refer to the following documents:
+
+@itemize @bullet
+@item @cite{80960CA User's Manual, Intel, Order No. 270710}.
+
+@item @cite{32-Bit Embedded Controller Handbook, Intel, Order No. 270647}.
+
+@item @cite{Glenford J. Meyers and David L. Budde. The 80960
+Microprocessor Architecture. Wiley. New York. 1988}.
+@end itemize
+
+It is highly recommended that the i960CA RTEMS
+application developer obtain and become familiar with Intel's
+i960CA User's Manual.
+
+
diff --git a/doc/supplements/i960/timeCVME961.t b/doc/supplements/i960/timeCVME961.t
new file mode 100644
index 0000000000..a312aecad8
--- /dev/null
+++ b/doc/supplements/i960/timeCVME961.t
@@ -0,0 +1,88 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@include common/timemac.texi
+@tex
+\global\advance \smallskipamount by -4pt
+@end tex
+
+@chapter CVME961 Timing Data
+
+NOTE: The CVME961 board used by the RTEMS Project to
+obtain i960CA times is currently broken. The information in
+this chapter was obtained using Release 3.2.1.
+
+@section Introduction
+
+The timing data for the i960CA version of RTEMS is
+provided along with the target dependent aspects concerning the
+gathering of the timing data. The hardware platform used to
+gather the times is described to give the reader a better
+understanding of each directive time provided. Also, provided
+is a description of the interrupt latency and the context
+switch times as they pertain to the i960CA version of RTEMS.
+
+@section Hardware Platform
+
+All times reported except for the maximum period
+interrupts are disabled by RTEMS were measured using a Cyclone
+Microsystems CVME961 board. The CVME961 is a 33 Mhz board with
+dynamic RAM which has two wait state dynamic memory (four CPU
+cycles) for read accesses and one wait state (two CPU cycles)
+for write accesses. The Z8536 on a SQUALL SQSIO4 mezzanine
+board was used to measure elapsed time with one-half microsecond
+resolution. All sources of hardware interrupts are disabled,
+although the interrupt level of the i960CA allows all interrupts.
+
+The maximum interrupt disable period was measured by
+summing the number of CPU cycles required by each assembly
+language instruction executed while interrupts were disabled.
+Zero wait state memory was assumed. The total CPU cycles
+executed with interrupts disabled, including the instructions to
+disable and enable interrupts, was divided by 33 to simulate a
+i960CA executing at 33 Mhz with zero wait states.
+
+@section Interrupt Latency
+
+The maximum period with interrupts disabled within
+RTEMS is less than
+RTEMS_MAXIMUM_DISABLE_PERIOD microseconds including the instructions
+which disable and re-enable interrupts. The time required for
+the i960CA to generate an interrupt using the sysctl
+instruction, vectoring to an interrupt handler, and for the
+RTEMS entry overhead before invoking the user's interrupt
+handler are a total of RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK
+microseconds. These combine to yield
+a worst case interrupt latency of less than
+RTEMS_MAXIMUM_DISABLE_PERIOD + RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK
+microseconds. [NOTE: The maximum period with interrupts
+disabled within RTEMS was last calculated for Release
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD.]
+
+It should be noted again that the maximum period with
+interrupts disabled within RTEMS is hand-timed. The interrupt
+vector and entry overhead time was generated on the Cyclone
+CVME961 benchmark platform using the sysctl instruction as the
+interrupt source.
+
+@section Context Switch
+
+The RTEMS processor context switch time is RTEMS_NO_FP_CONTEXTS
+microseconds on the Cyclone CVME961 benchmark platform. This
+time represents the raw context switch time with no user
+extensions configured. Additional execution time is required
+when a TSWITCH user extension is configured. The use of the
+TSWITCH extension is application dependent. Thus, its execution
+time is not considered part of the base context switch time.
+
+The CVME961 has no hardware floating point capability
+and floating point tasks are not supported.
+
+The following table summarizes the context switch
+times for the CVME961 benchmark platform:
+
diff --git a/doc/supplements/m68k/.cvsignore b/doc/supplements/m68k/.cvsignore
new file mode 100644
index 0000000000..fe584dba97
--- /dev/null
+++ b/doc/supplements/m68k/.cvsignore
@@ -0,0 +1,38 @@
+bsp.texi
+callconv.texi
+cpumodel.texi
+cputable.texi
+fatalerr.texi
+index.html
+intr.t
+intr.texi
+m68k
+m68k-?
+m68k-??
+m68k.aux
+m68k.cp
+m68k.dvi
+m68k.fn
+m68k*.html
+m68k.ky
+m68k.log
+m68k.pdf
+m68k.pg
+m68k.ps
+m68k.toc
+m68k.tp
+m68k.vr
+Makefile
+Makefile.in
+mdate-sh
+memmodel.texi
+rtems_footer.html
+rtems_header.html
+stamp-vti
+timeMVME136_.t
+timeMVME136.texi
+timing.t
+timing.texi
+version.texi
+wksheets.t
+wksheets.texi
diff --git a/doc/supplements/m68k/ChangeLog b/doc/supplements/m68k/ChangeLog
new file mode 100644
index 0000000000..5d5375e336
--- /dev/null
+++ b/doc/supplements/m68k/ChangeLog
@@ -0,0 +1,86 @@
+2003-12-12 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-12-11 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-11-26 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Add *.info to CLEANFILES to accomodate
+ automake-1.7f/1.8 breaking building infos.
+
+2003-09-26 Joel Sherrill <joel@OARcorp.com>
+
+ * cpumodel.t: Obsoleting HP PA-RISC port and removing all references.
+
+2003-09-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Merger from rtems-4-6-branch.
+
+2003-09-19 Joel Sherrill <joel@OARcorp.com>
+
+ * m68k.texi: Merge from branch.
+
+2003-05-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * cpumodel.t: Reflect c/src/exec having moved to cpukit.
+
+2003-01-25 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * m68k.texi: Set @setfilename m68k.info.
+
+2003-01-24 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Put GENERATED_FILES into $builddir.
+
+2003-01-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * version.texi: Remove from CVS.
+ * stamp-vti: Remove from CVS.
+ * .cvsignore: Add version.texi.
+ Add stamp-vti.
+ Re-sort.
+
+2003-01-21 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-11-13 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-10-24 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-07-30 Joel Sherrill <joel@OARcorp.com>
+
+ * timeMVME136.t, timedata.t: Replaced XXX's with real info.
+
+2002-07-26 Joel Sherrill <joel@OARcorp.com>
+
+ * intr_NOTIMES.t: Per PR258, changed single @ to double @ in email
+ address to make texinfo happy.
+
+2002-06-28 Joel Sherrill <joel@OARcorp.com>
+
+ * intr_NOTIMES.t: Per PR70 incorporate the posting by
+ Zoltan Kocsi <zoltan@bendor.com.au> explaining a m68k vectoring trick.
+
+2002-03-27 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Remove AUTOMAKE_OPTIONS.
+
+2002-01-18 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Require automake-1.5.
+
+2001-01-17 Joel Sherrill <joel@OARcorp.com>
+
+ * .cvsignore: Added rtems_header.html and rtems_footer.html.
+
+2000-08-10 Joel Sherrill <joel@OARcorp.com>
+
+ * ChangeLog: New file.
diff --git a/doc/supplements/m68k/MVME136_TIMES b/doc/supplements/m68k/MVME136_TIMES
new file mode 100644
index 0000000000..5b0dfe6fda
--- /dev/null
+++ b/doc/supplements/m68k/MVME136_TIMES
@@ -0,0 +1,247 @@
+#
+# M68020/MVME136 Timing and Size Information
+#
+# $Id$
+#
+
+#
+# CPU Model Information
+#
+RTEMS_BSP MVME136
+RTEMS_CPU_MODEL MC68020
+#
+# Interrupt Latency
+#
+# NOTE: In general, the text says it is hand-calculated to be
+# RTEMS_MAXIMUM_DISABLE_PERIOD at RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+# Mhz and this was last calculated for Release
+# RTEMS_VERSION_FOR_MAXIMUM_DISABLE_PERIOD.
+#
+RTEMS_MAXIMUM_DISABLE_PERIOD TBD
+RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ 20
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD 3.2.1
+#
+# Context Switch Times
+#
+RTEMS_NO_FP_CONTEXTS 35
+RTEMS_RESTORE_1ST_FP_TASK 39
+RTEMS_SAVE_INIT_RESTORE_INIT 66
+RTEMS_SAVE_IDLE_RESTORE_INIT 66
+RTEMS_SAVE_IDLE_RESTORE_IDLE 68
+#
+# Task Manager Times
+#
+RTEMS_TASK_CREATE_ONLY 148
+RTEMS_TASK_IDENT_ONLY 350
+RTEMS_TASK_START_ONLY 76
+RTEMS_TASK_RESTART_CALLING_TASK 95
+RTEMS_TASK_RESTART_SUSPENDED_RETURNS_TO_CALLER 89
+RTEMS_TASK_RESTART_BLOCKED_RETURNS_TO_CALLER 124
+RTEMS_TASK_RESTART_READY_RETURNS_TO_CALLER 92
+RTEMS_TASK_RESTART_SUSPENDED_PREEMPTS_CALLER 125
+RTEMS_TASK_RESTART_BLOCKED_PREEMPTS_CALLER 149
+RTEMS_TASK_RESTART_READY_PREEMPTS_CALLER 142
+RTEMS_TASK_DELETE_CALLING_TASK 170
+RTEMS_TASK_DELETE_SUSPENDED_TASK 138
+RTEMS_TASK_DELETE_BLOCKED_TASK 143
+RTEMS_TASK_DELETE_READY_TASK 144
+RTEMS_TASK_SUSPEND_CALLING_TASK 71
+RTEMS_TASK_SUSPEND_RETURNS_TO_CALLER 43
+RTEMS_TASK_RESUME_TASK_READIED_RETURNS_TO_CALLER 45
+RTEMS_TASK_RESUME_TASK_READIED_PREEMPTS_CALLER 67
+RTEMS_TASK_SET_PRIORITY_OBTAIN_CURRENT_PRIORITY 31
+RTEMS_TASK_SET_PRIORITY_RETURNS_TO_CALLER 64
+RTEMS_TASK_SET_PRIORITY_PREEMPTS_CALLER 106
+RTEMS_TASK_MODE_OBTAIN_CURRENT_MODE 14
+RTEMS_TASK_MODE_NO_RESCHEDULE 16
+RTEMS_TASK_MODE_RESCHEDULE_RETURNS_TO_CALLER 23
+RTEMS_TASK_MODE_RESCHEDULE_PREEMPTS_CALLER 60
+RTEMS_TASK_GET_NOTE_ONLY 33
+RTEMS_TASK_SET_NOTE_ONLY 33
+RTEMS_TASK_WAKE_AFTER_YIELD_RETURNS_TO_CALLER 16
+RTEMS_TASK_WAKE_AFTER_YIELD_PREEMPTS_CALLER 56
+RTEMS_TASK_WAKE_WHEN_ONLY 117
+#
+# Interrupt Manager
+#
+RTEMS_INTR_ENTRY_RETURNS_TO_NESTED 12
+RTEMS_INTR_ENTRY_RETURNS_TO_INTERRUPTED_TASK 9
+RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK 9
+RTEMS_INTR_EXIT_RETURNS_TO_NESTED <1
+RTEMS_INTR_EXIT_RETURNS_TO_INTERRUPTED_TASK 8
+RTEMS_INTR_EXIT_RETURNS_TO_PREEMPTING_TASK 54
+#
+# Clock Manager
+#
+RTEMS_CLOCK_SET_ONLY 86
+RTEMS_CLOCK_GET_ONLY 1
+RTEMS_CLOCK_TICK_ONLY 17
+#
+# Timer Manager
+#
+RTEMS_TIMER_CREATE_ONLY 28
+RTEMS_TIMER_IDENT_ONLY 343
+RTEMS_TIMER_DELETE_INACTIVE 43
+RTEMS_TIMER_DELETE_ACTIVE 47
+RTEMS_TIMER_FIRE_AFTER_INACTIVE 58
+RTEMS_TIMER_FIRE_AFTER_ACTIVE 61
+RTEMS_TIMER_FIRE_WHEN_INACTIVE 88
+RTEMS_TIMER_FIRE_WHEN_ACTIVE 88
+RTEMS_TIMER_RESET_INACTIVE 54
+RTEMS_TIMER_RESET_ACTIVE 58
+RTEMS_TIMER_CANCEL_INACTIVE 31
+RTEMS_TIMER_CANCEL_ACTIVE 34
+#
+# Semaphore Manager
+#
+RTEMS_SEMAPHORE_CREATE_ONLY 60
+RTEMS_SEMAPHORE_IDENT_ONLY 367
+RTEMS_SEMAPHORE_DELETE_ONLY 58
+RTEMS_SEMAPHORE_OBTAIN_AVAILABLE 38
+RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_NO_WAIT 38
+RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_CALLER_BLOCKS 109
+RTEMS_SEMAPHORE_RELEASE_NO_WAITING_TASKS 44
+RTEMS_SEMAPHORE_RELEASE_TASK_READIED_RETURNS_TO_CALLER 66
+RTEMS_SEMAPHORE_RELEASE_TASK_READIED_PREEMPTS_CALLER 87
+#
+# Message Manager
+#
+RTEMS_MESSAGE_QUEUE_CREATE_ONLY 200
+RTEMS_MESSAGE_QUEUE_IDENT_ONLY 341
+RTEMS_MESSAGE_QUEUE_DELETE_ONLY 80
+RTEMS_MESSAGE_QUEUE_SEND_NO_WAITING_TASKS 97
+RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_RETURNS_TO_CALLER 101
+RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_PREEMPTS_CALLER 123
+RTEMS_MESSAGE_QUEUE_URGENT_NO_WAITING_TASKS 96
+RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_RETURNS_TO_CALLER 101
+RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_PREEMPTS_CALLER 123
+RTEMS_MESSAGE_QUEUE_BROADCAST_NO_WAITING_TASKS 53
+RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_RETURNS_TO_CALLER 111
+RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_PREEMPTS_CALLER 133
+RTEMS_MESSAGE_QUEUE_RECEIVE_AVAILABLE 79
+RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_NO_WAIT 43
+RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS 114
+RTEMS_MESSAGE_QUEUE_FLUSH_NO_MESSAGES_FLUSHED 29
+RTEMS_MESSAGE_QUEUE_FLUSH_MESSAGES_FLUSHED 39
+#
+# Event Manager
+#
+RTEMS_EVENT_SEND_NO_TASK_READIED 24
+RTEMS_EVENT_SEND_TASK_READIED_RETURNS_TO_CALLER 60
+RTEMS_EVENT_SEND_TASK_READIED_PREEMPTS_CALLER 84
+RTEMS_EVENT_RECEIVE_OBTAIN_CURRENT_EVENTS 1
+RTEMS_EVENT_RECEIVE_AVAILABLE 28
+RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_NO_WAIT 23
+RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS 84
+#
+# Signal Manager
+#
+RTEMS_SIGNAL_CATCH_ONLY 15
+RTEMS_SIGNAL_SEND_RETURNS_TO_CALLER 37
+RTEMS_SIGNAL_SEND_SIGNAL_TO_SELF 55
+RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_CALLING_TASK 37
+RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_PREEMPTING_TASK 54
+#
+# Partition Manager
+#
+RTEMS_PARTITION_CREATE_ONLY 70
+RTEMS_PARTITION_IDENT_ONLY 341
+RTEMS_PARTITION_DELETE_ONLY 42
+RTEMS_PARTITION_GET_BUFFER_AVAILABLE 35
+RTEMS_PARTITION_GET_BUFFER_NOT_AVAILABLE 33
+RTEMS_PARTITION_RETURN_BUFFER_ONLY 43
+#
+# Region Manager
+#
+RTEMS_REGION_CREATE_ONLY 63
+RTEMS_REGION_IDENT_ONLY 348
+RTEMS_REGION_DELETE_ONLY 39
+RTEMS_REGION_GET_SEGMENT_AVAILABLE 52
+RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_NO_WAIT 49
+RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_CALLER_BLOCKS 123
+RTEMS_REGION_RETURN_SEGMENT_NO_WAITING_TASKS 54
+RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_RETURNS_TO_CALLER 114
+RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_PREEMPTS_CALLER 136
+#
+# Dual-Ported Memory Manager
+#
+RTEMS_PORT_CREATE_ONLY 35
+RTEMS_PORT_IDENT_ONLY 340
+RTEMS_PORT_DELETE_ONLY 39
+RTEMS_PORT_INTERNAL_TO_EXTERNAL_ONLY 26
+RTEMS_PORT_EXTERNAL_TO_INTERNAL_ONLY 27
+#
+# IO Manager
+#
+RTEMS_IO_INITIALIZE_ONLY 4
+RTEMS_IO_OPEN_ONLY 2
+RTEMS_IO_CLOSE_ONLY 1
+RTEMS_IO_READ_ONLY 2
+RTEMS_IO_WRITE_ONLY 3
+RTEMS_IO_CONTROL_ONLY 2
+#
+# Rate Monotonic Manager
+#
+RTEMS_RATE_MONOTONIC_CREATE_ONLY 32
+RTEMS_RATE_MONOTONIC_IDENT_ONLY 341
+RTEMS_RATE_MONOTONIC_CANCEL_ONLY 39
+RTEMS_RATE_MONOTONIC_DELETE_ACTIVE 51
+RTEMS_RATE_MONOTONIC_DELETE_INACTIVE 48
+RTEMS_RATE_MONOTONIC_PERIOD_INITIATE_PERIOD_RETURNS_TO_CALLER 54
+RTEMS_RATE_MONOTONIC_PERIOD_CONCLUDE_PERIOD_CALLER_BLOCKS 74
+RTEMS_RATE_MONOTONIC_PERIOD_OBTAIN_STATUS 31
+#
+# Size Information
+#
+#
+# xxx alloted for numbers
+#
+RTEMS_DATA_SPACE 723
+RTEMS_MINIMUM_CONFIGURATION 18,980
+RTEMS_MAXIMUM_CONFIGURATION 36,438
+# x,xxx alloted for numbers
+RTEMS_CORE_CODE_SIZE 12,674
+RTEMS_INITIALIZATION_CODE_SIZE 970
+RTEMS_TASK_CODE_SIZE 3,562
+RTEMS_INTERRUPT_CODE_SIZE 54
+RTEMS_CLOCK_CODE_SIZE 334
+RTEMS_TIMER_CODE_SIZE 1,110
+RTEMS_SEMAPHORE_CODE_SIZE 1,632
+RTEMS_MESSAGE_CODE_SIZE 1,754
+RTEMS_EVENT_CODE_SIZE 1,000
+RTEMS_SIGNAL_CODE_SIZE 418
+RTEMS_PARTITION_CODE_SIZE 1,164
+RTEMS_REGION_CODE_SIZE 1,494
+RTEMS_DPMEM_CODE_SIZE 724
+RTEMS_IO_CODE_SIZE 686
+RTEMS_FATAL_ERROR_CODE_SIZE 24
+RTEMS_RATE_MONOTONIC_CODE_SIZE 1,212
+RTEMS_MULTIPROCESSING_CODE_SIZE 6.952
+# xxx alloted for numbers
+RTEMS_TIMER_CODE_OPTSIZE 184
+RTEMS_SEMAPHORE_CODE_OPTSIZE 172
+RTEMS_MESSAGE_CODE_OPTSIZE 288
+RTEMS_EVENT_CODE_OPTSIZE 56
+RTEMS_SIGNAL_CODE_OPTSIZE 56
+RTEMS_PARTITION_CODE_OPTSIZE 132
+RTEMS_REGION_CODE_OPTSIZE 160
+RTEMS_DPMEM_CODE_OPTSIZE 132
+RTEMS_IO_CODE_OPTSIZE 00
+RTEMS_RATE_MONOTONIC_CODE_OPTSIZE 184
+RTEMS_MULTIPROCESSING_CODE_OPTSIZE 332
+# xxx alloted for numbers
+RTEMS_BYTES_PER_TASK 400
+RTEMS_BYTES_PER_TIMER 68
+RTEMS_BYTES_PER_SEMAPHORE 124
+RTEMS_BYTES_PER_MESSAGE_QUEUE 148
+RTEMS_BYTES_PER_REGION 144
+RTEMS_BYTES_PER_PARTITION 56
+RTEMS_BYTES_PER_PORT 36
+RTEMS_BYTES_PER_PERIOD 36
+RTEMS_BYTES_PER_EXTENSION 64
+RTEMS_BYTES_PER_FP_TASK 332
+RTEMS_BYTES_PER_NODE 48
+RTEMS_BYTES_PER_GLOBAL_OBJECT 20
+RTEMS_BYTES_PER_PROXY 124
+# x,xxx alloted for numbers
+RTEMS_BYTES_OF_FIXED_SYSTEM_REQUIREMENTS 8,872
diff --git a/doc/supplements/m68k/Makefile.am b/doc/supplements/m68k/Makefile.am
new file mode 100644
index 0000000000..31752d1548
--- /dev/null
+++ b/doc/supplements/m68k/Makefile.am
@@ -0,0 +1,111 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = m68k
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/supplements/supplement.am
+
+GENERATED_FILES = cpumodel.texi callconv.texi memmodel.texi intr.texi \
+ fatalerr.texi bsp.texi cputable.texi timing.texi wksheets.texi \
+ timeMVME136.texi
+
+COMMON_FILES += $(top_srcdir)/common/cpright.texi \
+ $(top_srcdir)/common/timemac.texi
+
+FILES = preface.texi
+
+info_TEXINFOS = m68k.texi
+m68k_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+#
+# Chapters which get automatic processing
+#
+
+cpumodel.texi: cpumodel.t
+ $(BMENU2) -p "Preface" \
+ -u "Top" \
+ -n "Calling Conventions" < $< > $@
+
+callconv.texi: callconv.t
+ $(BMENU2) -p "CPU Model Dependent Features Extend Byte to Long Instruction" \
+ -u "Top" \
+ -n "Memory Model" < $< > $@
+
+memmodel.texi: memmodel.t
+ $(BMENU2) -p "Calling Conventions User-Provided Routines" \
+ -u "Top" \
+ -n "Interrupt Processing" < $< > $@
+
+# Interrupt Chapter:
+# 1. Replace Times and Sizes
+# 2. Build Node Structure
+intr.texi: intr_NOTIMES.t MVME136_TIMES
+ ${REPLACE2} -p $(srcdir)/MVME136_TIMES $(srcdir)/intr_NOTIMES.t | \
+ $(BMENU2) -p "Memory Model Flat Memory Model" \
+ -u "Top" \
+ -n "Default Fatal Error Processing" > $@
+
+fatalerr.texi: fatalerr.t
+ $(BMENU2) -p "Interrupt Processing Interrupt Stack" \
+ -u "Top" \
+ -n "Board Support Packages" < $< > $@
+
+bsp.texi: bsp.t
+ $(BMENU2) -p "Default Fatal Error Processing Default Fatal Error Handler Operations" \
+ -u "Top" \
+ -n "Processor Dependent Information Table" < $< > $@
+
+cputable.texi: cputable.t
+ $(BMENU2) -p "Board Support Packages Processor Initialization" \
+ -u "Top" \
+ -n "Memory Requirements" < $< > $@
+
+# Worksheets Chapter:
+# 1. Obtain the Shared File
+# 2. Replace Times and Sizes
+# 3. Build Node Structure
+
+wksheets.texi: $(top_srcdir)/common/wksheets.t MVME136_TIMES
+ ${REPLACE2} -p $(srcdir)/MVME136_TIMES \
+ $(top_srcdir)/common/wksheets.t | \
+ $(BMENU2) -p "Processor Dependent Information Table CPU Dependent Information Table" \
+ -u "Top" \
+ -n "Timing Specification" > $@
+
+# Timing Specification Chapter:
+# 1. Copy the Shared File
+# 3. Build Node Structure
+
+timing.texi: $(top_srcdir)/common/timing.t
+ $(BMENU2) -p "Memory Requirements RTEMS RAM Workspace Worksheet" \
+ -u "Top" \
+ -n "MVME136 Timing Data" < $< > $@
+
+# Timing Data for BSP Chapter:
+# 1. Copy the Shared File
+# 2. Replace Times and Sizes
+# 3. Build Node Structure
+
+timeMVME136.texi: $(top_srcdir)/common/timetbl.t timeMVME136.t
+ cat $(srcdir)/timeMVME136.t $(top_srcdir)/common/timetbl.t >timeMVME136_.t
+ @echo >>timeMVME136_.t
+ @echo "@tex" >>timeMVME136_.t
+ @echo "\\global\\advance \\smallskipamount by 4pt" >>timeMVME136_.t
+ @echo "@end tex" >>timeMVME136_.t
+ ${REPLACE2} -p $(srcdir)/MVME136_TIMES timeMVME136_.t | \
+ $(BMENU2) -p "Timing Specification Terminology" \
+ -u "Top" \
+ -n "Command and Variable Index" > $@
+CLEANFILES += timeMVME136_.t
+
+EXTRA_DIST = MVME136_TIMES bsp.t callconv.t cpumodel.t cputable.t fatalerr.t \
+ intr_NOTIMES.t memmodel.t timeMVME136.t timedata.t
+
+CLEANFILES += m68k.info m68k.info-?
diff --git a/doc/supplements/m68k/bsp.t b/doc/supplements/m68k/bsp.t
new file mode 100644
index 0000000000..3d245c7719
--- /dev/null
+++ b/doc/supplements/m68k/bsp.t
@@ -0,0 +1,93 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Board Support Packages
+
+@section Introduction
+
+An RTEMS Board Support Package (BSP) must be designed
+to support a particular processor and target board combination.
+This chapter presents a discussion of MC68020 specific BSP
+issues. For more information on developing a BSP, refer to the
+chapter titled Board Support Packages in the RTEMS
+Applications User's Guide.
+
+@section System Reset
+
+An RTEMS based application is initiated or
+re-initiated when the MC68020 processor is reset. When the
+MC68020 is reset, the processor performs the following actions:
+
+@itemize @bullet
+@item The tracing bits of the status register are cleared to
+disable tracing.
+
+@item The supervisor interrupt state is entered by setting the
+supervisor (S) bit and clearing the master/interrupt (M) bit of
+the status register.
+
+@item The interrupt mask of the status register is set to
+level 7 to effectively disable all maskable interrupts.
+
+@item The vector base register (VBR) is set to zero.
+
+@item The cache control register (CACR) is set to zero to
+disable and freeze the processor cache.
+
+@item The interrupt stack pointer (ISP) is set to the value
+stored at vector 0 (bytes 0-3) of the exception vector table
+(EVT).
+
+@item The program counter (PC) is set to the value stored at
+vector 1 (bytes 4-7) of the EVT.
+
+@item The processor begins execution at the address stored in
+the PC.
+@end itemize
+
+@section Processor Initialization
+
+The address of the application's initialization code
+should be stored in the first vector of the EVT which will allow
+the immediate vectoring to the application code. If the
+application requires that the VBR be some value besides zero,
+then it should be set to the required value at this point. All
+tasks share the same MC68020's VBR value. Because interrupts
+are enabled automatically by RTEMS as part of the initialize
+executive directive, the VBR MUST be set before this directive
+is invoked to insure correct interrupt vectoring. If processor
+caching is to be utilized, then it should be enabled during the
+reset application initialization code.
+
+In addition to the requirements described in the
+Board Support Packages chapter of the Applications User's
+Manual for the reset code which is executed before the call to
+initialize executive, the MC68020 version has the following
+specific requirements:
+
+@itemize @bullet
+@item Must leave the S bit of the status register set so that
+the MC68020 remains in the supervisor state.
+
+@item Must set the M bit of the status register to remove the
+MC68020 from the interrupt state.
+
+@item Must set the master stack pointer (MSP) such that a
+minimum stack size of MINIMUM_STACK_SIZE bytes is provided for
+the initialize executive directive.
+
+@item Must initialize the MC68020's vector table.
+@end itemize
+
+Note that the BSP is not responsible for allocating
+or installing the interrupt stack. RTEMS does this
+automatically as part of initialization. If the BSP does not
+install an interrupt stack and -- for whatever reason -- an
+interrupt occurs before initialize_executive is invoked, then
+the results are unpredictable.
+
diff --git a/doc/supplements/m68k/callconv.t b/doc/supplements/m68k/callconv.t
new file mode 100644
index 0000000000..e572fb4e64
--- /dev/null
+++ b/doc/supplements/m68k/callconv.t
@@ -0,0 +1,92 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Calling Conventions
+
+@section Introduction
+
+Each high-level language compiler generates
+subroutine entry and exit code based upon a set of rules known
+as the compiler's calling convention. These rules address the
+following issues:
+
+@itemize @bullet
+@item register preservation and usage
+@item parameter passing
+@item call and return mechanism
+@end itemize
+
+A compiler's calling convention is of importance when
+interfacing to subroutines written in another language either
+assembly or high-level. Even when the high-level language and
+target processor are the same, different compilers may use
+different calling conventions. As a result, calling conventions
+are both processor and compiler dependent.
+
+@section Processor Background
+
+The MC68xxx architecture supports a simple yet
+effective call and return mechanism. A subroutine is invoked
+via the branch to subroutine (bsr) or the jump to subroutine
+(jsr) instructions. These instructions push the return address
+on the current stack. The return from subroutine (rts)
+instruction pops the return address off the current stack and
+transfers control to that instruction. It is is important to
+note that the MC68xxx call and return mechanism does not
+automatically save or restore any registers. It is the
+responsibility of the high-level language compiler to define the
+register preservation and usage convention.
+
+@section Calling Mechanism
+
+All RTEMS directives are invoked using either a bsr
+or jsr instruction and return to the user application via the
+rts instruction.
+
+@section Register Usage
+
+As discussed above, the bsr and jsr instructions do
+not automatically save any registers. RTEMS uses the registers
+D0, D1, A0, and A1 as scratch registers. These registers are
+not preserved by RTEMS directives therefore, the contents of
+these registers should not be assumed upon return from any RTEMS
+directive.
+
+@section Parameter Passing
+
+RTEMS assumes that arguments are placed on the
+current stack before the directive is invoked via the bsr or jsr
+instruction. The first argument is assumed to be closest to the
+return address on the stack. This means that the first argument
+of the C calling sequence is pushed last. The following
+pseudo-code illustrates the typical sequence used to call a
+RTEMS directive with three (3) arguments:
+
+@example
+@group
+push third argument
+push second argument
+push first argument
+invoke directive
+remove arguments from the stack
+@end group
+@end example
+
+The arguments to RTEMS are typically pushed onto the
+stack using a move instruction with a pre-decremented stack
+pointer as the destination. These arguments must be removed
+from the stack after control is returned to the caller. This
+removal is typically accomplished by adding the size of the
+argument list in bytes to the current stack pointer.
+
+@section User-Provided Routines
+
+All user-provided routines invoked by RTEMS, such as
+user extensions, device drivers, and MPCI routines, must also
+adhere to these calling conventions.
+
diff --git a/doc/supplements/m68k/cpumodel.t b/doc/supplements/m68k/cpumodel.t
new file mode 100644
index 0000000000..1566b322b5
--- /dev/null
+++ b/doc/supplements/m68k/cpumodel.t
@@ -0,0 +1,91 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter CPU Model Dependent Features
+
+@section Introduction
+
+Microprocessors are generally classified into
+families with a variety of CPU models or implementations within
+that family. Within a processor family, there is a high level
+of binary compatibility. This family may be based on either an
+architectural specification or on maintaining compatibility with
+a popular processor. Recent microprocessor families such as the
+SPARC or PowerPC are based on an architectural specification
+which is independent or any particular CPU model or
+implementation. Older families such as the M68xxx and the iX86
+evolved as the manufacturer strived to produce higher
+performance processor models which maintained binary
+compatibility with older models.
+
+RTEMS takes advantage of the similarity of the
+various models within a CPU family. Although the models do vary
+in significant ways, the high level of compatibility makes it
+possible to share the bulk of the CPU dependent executive code
+across the entire family. Each processor family supported by
+RTEMS has a list of features which vary between CPU models
+within a family. For example, the most common model dependent
+feature regardless of CPU family is the presence or absence of a
+floating point unit or coprocessor. When defining the list of
+features present on a particular CPU model, one simply notes
+that floating point hardware is or is not present and defines a
+single constant appropriately. Conditional compilation is
+utilized to include the appropriate source code for this CPU
+model's feature set. It is important to note that this means
+that RTEMS is thus compiled using the appropriate feature set
+and compilation flags optimal for this CPU model used. The
+alternative would be to generate a binary which would execute on
+all family members using only the features which were always
+present.
+
+This chapter presents the set of features which vary
+across SPARC implementations and are of importance to RTEMS.
+The set of CPU model feature macros are defined in the file
+cpukit/score/cpu/m68k/m68k.h based upon the particular CPU
+model defined on the compilation command line.
+
+@section CPU Model Name
+
+The macro CPU_MODEL_NAME is a string which designates
+the name of this CPU model. For example, for the MC68020
+processor, this macro is set to the string "mc68020".
+
+@section Floating Point Unit
+
+The macro M68K_HAS_FPU is set to 1 to indicate that
+this CPU model has a hardware floating point unit and 0
+otherwise. It does not matter whether the hardware floating
+point support is incorporated on-chip or is an external
+coprocessor.
+
+@section BFFFO Instruction
+
+The macro M68K_HAS_BFFFO is set to 1 to indicate that
+this CPU model has the bfffo instruction.
+
+@section Vector Base Register
+
+The macro M68K_HAS_VBR is set to 1 to indicate that
+this CPU model has a vector base register (vbr).
+
+@section Separate Stacks
+
+The macro M68K_HAS_SEPARATE_STACKS is set to 1 to
+indicate that this CPU model has separate interrupt, user, and
+supervisor mode stacks.
+
+@section Pre-Indexing Address Mode
+
+The macro M68K_HAS_PREINDEXING is set to 1 to indicate that
+this CPU model has the pre-indexing address mode.
+
+@section Extend Byte to Long Instruction
+
+The macro M68K_HAS_EXTB_L is set to 1 to indicate that this CPU model
+has the extb.l instruction. This instruction is supposed to be available
+in all models based on the cpu32 core as well as mc68020 and up models.
diff --git a/doc/supplements/m68k/cputable.t b/doc/supplements/m68k/cputable.t
new file mode 100644
index 0000000000..a70e89929f
--- /dev/null
+++ b/doc/supplements/m68k/cputable.t
@@ -0,0 +1,109 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Processor Dependent Information Table
+
+@section Introduction
+
+Any highly processor dependent information required
+to describe a processor to RTEMS is provided in the CPU
+Dependent Information Table. This table is not required for all
+processors supported by RTEMS. This chapter describes the
+contents, if any, for a particular processor type.
+
+@section CPU Dependent Information Table
+
+The MC68xxx version of the RTEMS CPU Dependent
+Information Table contains the information required to interface
+a Board Support Package and RTEMS on the MC68xxx. This
+information is provided to allow RTEMS to interoperate
+effectively with the BSP. The C structure definition is given
+here:
+
+@example
+@group
+typedef struct @{
+ void (*pretasking_hook)( void );
+ void (*predriver_hook)( void );
+ void (*postdriver_hook)( void );
+ void (*idle_task)( void );
+ boolean do_zero_of_workspace;
+ unsigned32 idle_task_stack_size;
+ unsigned32 interrupt_stack_size;
+ unsigned32 extra_mpci_receive_server_stack;
+ void * (*stack_allocate_hook)( unsigned32 );
+ void (*stack_free_hook)( void* );
+ /* end of fields required on all CPUs */
+
+ m68k_isr *interrupt_vector_table;
+@} rtems_cpu_table;
+@end group
+@end example
+
+@table @code
+@item pretasking_hook
+is the address of the user provided routine which is invoked
+once RTEMS APIs are initialized. This routine will be invoked
+before any system tasks are created. Interrupts are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item predriver_hook
+is the address of the user provided
+routine that is invoked immediately before the
+the device drivers and MPCI are initialized. RTEMS
+initialization is complete but interrupts and tasking are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item postdriver_hook
+is the address of the user provided
+routine that is invoked immediately after the
+the device drivers and MPCI are initialized. RTEMS
+initialization is complete but interrupts and tasking are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item idle_task
+is the address of the optional user
+provided routine which is used as the system's IDLE task. If
+this field is not NULL, then the RTEMS default IDLE task is not
+used. This field may be NULL to indicate that the default IDLE
+is to be used.
+
+@item do_zero_of_workspace
+indicates whether RTEMS should
+zero the Workspace as part of its initialization. If set to
+TRUE, the Workspace is zeroed. Otherwise, it is not.
+
+@item idle_task_stack_size
+is the size of the RTEMS idle task stack in bytes.
+If this number is less than MINIMUM_STACK_SIZE, then the
+idle task's stack will be MINIMUM_STACK_SIZE in byte.
+
+@item interrupt_stack_size
+is the size of the RTEMS
+allocated interrupt stack in bytes. This value must be at least
+as large as MINIMUM_STACK_SIZE.
+
+@item extra_mpci_receive_server_stack
+is the extra stack space allocated for the RTEMS MPCI receive server task
+in bytes. The MPCI receive server may invoke nearly all directives and
+may require extra stack space on some targets.
+
+@item stack_allocate_hook
+is the address of the optional user provided routine which allocates
+memory for task stacks. If this hook is not NULL, then a stack_free_hook
+must be provided as well.
+
+@item stack_free_hook
+is the address of the optional user provided routine which frees
+memory for task stacks. If this hook is not NULL, then a stack_allocate_hook
+must be provided as well.
+
+@item interrupt_vector_table
+is the base address of the CPU's Exception Vector Table.
+
+@end table
diff --git a/doc/supplements/m68k/fatalerr.t b/doc/supplements/m68k/fatalerr.t
new file mode 100644
index 0000000000..728d149f37
--- /dev/null
+++ b/doc/supplements/m68k/fatalerr.t
@@ -0,0 +1,31 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Default Fatal Error Processing
+
+@section Introduction
+
+Upon detection of a fatal error by either the
+application or RTEMS the fatal error manager is invoked. The
+fatal error manager will invoke the user-supplied fatal error
+handlers. If no user-supplied handlers are configured, the
+RTEMS provided default fatal error handler is invoked. If the
+user-supplied fatal error handlers return to the executive the
+default fatal error handler is then invoked. This chapter
+describes the precise operations of the default fatal error
+handler.
+
+@section Default Fatal Error Handler Operations
+
+The default fatal error handler which is invoked by
+the fatal_error_occurred directive when there is no user handler
+configured or the user handler returns control to RTEMS. The
+default fatal error handler disables processor interrupts to
+level 7, places the error code in D0, and executes a stop
+instruction to simulate a halt processor instruction.
+
diff --git a/doc/supplements/m68k/intr_NOTIMES.t b/doc/supplements/m68k/intr_NOTIMES.t
new file mode 100644
index 0000000000..2568c9f5fa
--- /dev/null
+++ b/doc/supplements/m68k/intr_NOTIMES.t
@@ -0,0 +1,266 @@
+@c
+@c Interrupt Stack Frame Picture
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Interrupt Processing
+
+@section Introduction
+
+Different types of processors respond to the
+occurrence of an interrupt in its own unique fashion. In
+addition, each processor type provides a control mechanism to
+allow for the proper handling of an interrupt. The processor
+dependent response to the interrupt modifies the current
+execution state and results in a change in the execution stream.
+Most processors require that an interrupt handler utilize some
+special control mechanisms to return to the normal processing
+stream. Although RTEMS hides many of the processor dependent
+details of interrupt processing, it is important to understand
+how the RTEMS interrupt manager is mapped onto the processor's
+unique architecture. Discussed in this chapter are the MC68xxx's
+interrupt response and control mechanisms as they pertain to
+RTEMS.
+
+@section Vectoring of an Interrupt Handler
+
+Depending on whether or not the particular CPU
+supports a separate interrupt stack, the MC68xxx family has two
+different interrupt handling models.
+
+@subsection Models Without Separate Interrupt Stacks
+
+Upon receipt of an interrupt the MC68xxx family
+members without separate interrupt stacks automatically perform
+the following actions:
+
+@itemize @bullet
+@item To Be Written
+@end itemize
+
+@subsection Models With Separate Interrupt Stacks
+
+Upon receipt of an interrupt the MC68xxx family
+members with separate interrupt stacks automatically perform the
+following actions:
+
+@itemize @bullet
+@item saves the current status register (SR),
+
+@item clears the master/interrupt (M) bit of the SR to
+indicate the switch from master state to interrupt state,
+
+@item sets the privilege mode to supervisor,
+
+@item suppresses tracing,
+
+@item sets the interrupt mask level equal to the level of the
+interrupt being serviced,
+
+@item pushes an interrupt stack frame (ISF), which includes
+the program counter (PC), the status register (SR), and the
+format/exception vector offset (FVO) word, onto the supervisor
+and interrupt stacks,
+
+@item switches the current stack to the interrupt stack and
+vectors to an interrupt service routine (ISR). If the ISR was
+installed with the interrupt_catch directive, then the RTEMS
+interrupt handler will begin execution. The RTEMS interrupt
+handler saves all registers which are not preserved according to
+the calling conventions and invokes the application's ISR.
+@end itemize
+
+A nested interrupt is processed similarly by these
+CPU models with the exception that only a single ISF is placed
+on the interrupt stack and the current stack need not be
+switched.
+
+The FVO word in the Interrupt Stack Frame is examined
+by RTEMS to determine when an outer most interrupt is being
+exited. Since the FVO is used by RTEMS for this purpose, the
+user application code MUST NOT modify this field.
+
+The following shows the Interrupt Stack Frame for
+MC68xxx CPU models with separate interrupt stacks:
+
+@ifset use-ascii
+@example
+@group
+ +----------------------+
+ | Status Register | 0x0
+ +----------------------+
+ | Program Counter High | 0x2
+ +----------------------+
+ | Program Counter Low | 0x4
+ +----------------------+
+ | Format/Vector Offset | 0x6
+ +----------------------+
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@sp 1
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\strut\vrule#&
+\hbox to 2.00in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 0.50in{\enskip\hfil#\hfil}
+\cr
+\multispan{3}\hrulefill\cr
+& Status Register && 0x0\cr
+\multispan{3}\hrulefill\cr
+& Program Counter High && 0x2\cr
+\multispan{3}\hrulefill\cr
+& Program Counter Low && 0x4\cr
+\multispan{3}\hrulefill\cr
+& Format/Vector Offset && 0x6\cr
+\multispan{3}\hrulefill\cr
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=2 WIDTH="40%" BORDER=2>
+<TR><TD ALIGN=center><STRONG>Status Register</STRONG></TD>
+ <TD ALIGN=center>0x0</TD></TR>
+<TR><TD ALIGN=center><STRONG>Program Counter High</STRONG></TD>
+ <TD ALIGN=center>0x2</TD></TR>
+<TR><TD ALIGN=center><STRONG>Program Counter Low</STRONG></TD>
+ <TD ALIGN=center>0x4</TD></TR>
+<TR><TD ALIGN=center><STRONG>Format/Vector Offset</STRONG></TD>
+ <TD ALIGN=center>0x6</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+@section CPU Models Without VBR and RAM at 0
+
+This is from a post by Zoltan Kocsi <zoltan@@bendor.com.au> and is
+a nice trick in certain situations. In his words:
+
+I think somebody on this list asked about the interupt vector
+handling w/o VBR and RAM at 0. The usual trick is
+to initialise the vector table (except the first 2 two entries, of
+course) to point to the same location BUT you also add the vector
+number times 0x1000000 to them. That is, bits 31-24 contain the vector
+number and 23-0 the address of the common handler.
+Since the PC is 32 bit wide but the actual address bus is only 24,
+the top byte will be in the PC but will be ignored when jumping
+onto your routine.
+
+Then your common interrupt routine gets this info by loading the PC
+into some register and based on that info, you can jump to a vector
+in a vector table pointed by a virtual VBR:
+
+@example
+//
+// Real vector table at 0
+//
+
+ .long initial_sp
+ .long initial_pc
+ .long myhandler+0x02000000
+ .long myhandler+0x03000000
+ .long myhandler+0x04000000
+ ...
+ .long myhandler+0xff000000
+
+
+//
+// This handler will jump to the interrupt routine of which
+// the address is stored at VBR[ vector_no ]
+// The registers and stackframe will be intact, the interrupt
+// routine will see exactly what it would see if it was called
+// directly from the HW vector table at 0.
+//
+
+ .comm VBR,4,2 // This defines the 'virtual' VBR
+ // From C: extern void *VBR;
+
+myhandler: // At entry, PC contains the full vector
+ move.l %d0,-(%sp) // Save d0
+ move.l %a0,-(%sp) // Save a0
+ lea 0(%pc),%a0 // Get the value of the PC
+ move.l %a0,%d0 // Copy it to a data reg, d0 is VV??????
+ swap %d0 // Now d0 is ????VV??
+ and.w #0xff00,%d0 // Now d0 is ????VV00 (1)
+ lsr.w #6,%d0 // Now d0.w contains the VBR table offset
+ move.l VBR,%a0 // Get the address from VBR to a0
+ move.l (%a0,%d0.w),%a0 // Fetch the vector
+ move.l 4(%sp),%d0 // Restore d0
+ move.l %a0,4(%sp) // Place target address to the stack
+ move.l (%sp)+,%a0 // Restore a0, target address is on TOS
+ ret // This will jump to the handler and
+ // restore the stack
+
+(1) If 'myhandler' is guaranteed to be in the first 64K, e.g. just
+ after the vector table then that insn is not needed.
+
+@end example
+
+There are probably shorter ways to do this, but it I believe is enough
+to illustrate the trick. Optimisation is left as an exercise to the
+reader :-)
+
+
+@section Interrupt Levels
+
+Eight levels (0-7) of interrupt priorities are
+supported by MC68xxx family members with level seven (7) being
+the highest priority. Level zero (0) indicates that interrupts
+are fully enabled. Interrupt requests for interrupts with
+priorities less than or equal to the current interrupt mask
+level are ignored.
+
+Although RTEMS supports 256 interrupt levels, the
+MC68xxx family only supports eight. RTEMS interrupt levels 0
+through 7 directly correspond to MC68xxx interrupt levels. All
+other RTEMS interrupt levels are undefined and their behavior is
+unpredictable.
+
+@section Disabling of Interrupts by RTEMS
+
+During the execution of directive calls, critical
+sections of code may be executed. When these sections are
+encountered, RTEMS disables interrupts to level seven (7) before
+the execution of this section and restores them to the previous
+level upon completion of the section. RTEMS has been optimized
+to insure that interrupts are disabled for less than
+RTEMS_MAXIMUM_DISABLE_PERIOD microseconds on a
+RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ Mhz MC68020 with
+zero wait states. These numbers will vary based the
+number of wait states and processor speed present on the target board.
+[NOTE: The maximum period with interrupts disabled is hand calculated. This
+calculation was last performed for Release
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD.]
+
+Non-maskable interrupts (NMI) cannot be disabled, and
+ISRs which execute at this level MUST NEVER issue RTEMS system
+calls. If a directive is invoked, unpredictable results may
+occur due to the inability of RTEMS to protect its critical
+sections. However, ISRs that make no system calls may safely
+execute as non-maskable interrupts.
+
+@section Interrupt Stack
+
+RTEMS allocates the interrupt stack from the
+Workspace Area. The amount of memory allocated for the
+interrupt stack is determined by the interrupt_stack_size field
+in the CPU Configuration Table. During the initialization
+process, RTEMS will install its interrupt stack.
+
+The MC68xxx port of RTEMS supports a software managed
+dedicated interrupt stack on those CPU models which do not
+support a separate interrupt stack in hardware.
+
+
diff --git a/doc/supplements/m68k/m68k.texi b/doc/supplements/m68k/m68k.texi
new file mode 100644
index 0000000000..b14c58e62f
--- /dev/null
+++ b/doc/supplements/m68k/m68k.texi
@@ -0,0 +1,115 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename m68k.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the Motorola MC68xxx Applications Supplement
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS Target Supplements
+@direntry
+* RTEMS Motorola MC68xxx Applications Supplement: (m68k).
+@end direntry
+@end ifset
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage RTEMS Motorola MC68xxx Applications Supplement
+
+@setchapternewpage odd
+@settitle RTEMS Motorola MC68xxx Applications Supplement
+@titlepage
+@finalout
+
+@title RTEMS Motorola MC68xxx Applications Supplement
+@subtitle Edition @value{EDITION}, for RTEMS @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include preface.texi
+@include cpumodel.texi
+@include callconv.texi
+@include memmodel.texi
+@include intr.texi
+@include fatalerr.texi
+@include bsp.texi
+@include cputable.texi
+@include wksheets.texi
+@include timing.texi
+@include timeMVME136.texi
+@ifinfo
+@node Top, Preface, (dir), (dir)
+@top m68k
+
+This is the online version of the RTEMS Motorola MC68xxx
+Applications Supplement.
+
+@menu
+* Preface::
+* CPU Model Dependent Features::
+* Calling Conventions::
+* Memory Model::
+* Interrupt Processing::
+* Default Fatal Error Processing::
+* Board Support Packages::
+* Processor Dependent Information Table::
+* Memory Requirements::
+* Timing Specification::
+* MVME136 Timing Data::
+* Command and Variable Index::
+* Concept Index::
+@end menu
+
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@node Command and Variable Index, Concept Index, MVME136 Timing Data Rate Monotonic Manager, Top
+@unnumbered Command and Variable Index
+
+There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@node Concept Index, , Command and Variable Index, Top
+@unnumbered Concept Index
+
+There are currently no Concept Index entries.
+@c @printindex cp
+
+@contents
+@bye
+
diff --git a/doc/supplements/m68k/memmodel.t b/doc/supplements/m68k/memmodel.t
new file mode 100644
index 0000000000..7b7776050c
--- /dev/null
+++ b/doc/supplements/m68k/memmodel.t
@@ -0,0 +1,39 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Memory Model
+
+@section Introduction
+
+A processor may support any combination of memory
+models ranging from pure physical addressing to complex demand
+paged virtual memory systems. RTEMS supports a flat memory
+model which ranges contiguously over the processor's allowable
+address space. RTEMS does not support segmentation or virtual
+memory of any kind. The appropriate memory model for RTEMS
+provided by the targeted processor and related characteristics
+of that model are described in this chapter.
+
+@section Flat Memory Model
+
+The MC68xxx family supports a flat 32-bit address
+space with addresses ranging from 0x00000000 to 0xFFFFFFFF (4
+gigabytes). Each address is represented by a 32-bit value and
+is byte addressable. The address may be used to reference a
+single byte, word (2-bytes), or long word (4 bytes). Memory
+accesses within this address space are performed in big endian
+fashion by the processors in this family.
+
+Some of the MC68xxx family members such as the
+MC68020, MC68030, and MC68040 support virtual memory and
+segmentation. The MC68020 requires external hardware support
+such as the MC68851 Paged Memory Management Unit coprocessor
+which is typically used to perform address translations for
+these systems. RTEMS does not support virtual memory or
+segmentation on any of the MC68xxx family members.
+
diff --git a/doc/supplements/m68k/preface.texi b/doc/supplements/m68k/preface.texi
new file mode 100644
index 0000000000..e37038f439
--- /dev/null
+++ b/doc/supplements/m68k/preface.texi
@@ -0,0 +1,60 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Preface, CPU Model Dependent Features, Top, Top
+@end ifinfo
+@unnumbered Preface
+
+The Real Time Executive for Multiprocessor Systems (RTEMS)
+is designed to be portable across multiple processor
+architectures. However, the nature of real-time systems makes
+it essential that the application designer understand certain
+processor dependent implementation details. These processor
+dependencies include calling convention, board support package
+issues, interrupt processing, exact RTEMS memory requirements,
+performance data, header files, and the assembly language
+interface to the executive.
+
+This document discusses the Motorola MC68xxx
+architecture dependencies in this port of RTEMS. The MC68xxx
+family has a wide variety of CPU models within it. The part
+numbers for these models are generally divided into MC680xx and
+MC683xx. The MC680xx models are more general purpose processors
+with no integrated peripherals. The MC683xx models, on the
+other hand, are more specialized and have a variety of
+peripherals on chip including sophisticated timers and serial
+communications controllers.
+
+It is highly recommended that the Motorola MC68xxx
+RTEMS application developer obtain and become familiar with the
+documentation for the processor being used as well as the
+documentation for the family as a whole.
+
+@subheading Architecture Documents
+
+For information on the Motorola MC68xxx architecture,
+refer to the following documents available from Motorola
+(@file{http//www.moto.com/}):
+
+@itemize @bullet
+@item @cite{M68000 Family Reference, Motorola, FR68K/D}.
+@end itemize
+
+@subheading MODEL SPECIFIC DOCUMENTS
+
+For information on specific processor models and
+their associated coprocessors, refer to the following documents:
+
+@itemize @bullet
+@item @cite{MC68020 User's Manual, Motorola, MC68020UM/AD}.
+
+@item @cite{MC68881/MC68882 Floating-Point Coprocessor User's
+Manual, Motorola, MC68881UM/AD}.
+@end itemize
+
diff --git a/doc/supplements/m68k/timeMVME136.t b/doc/supplements/m68k/timeMVME136.t
new file mode 100644
index 0000000000..16933e8055
--- /dev/null
+++ b/doc/supplements/m68k/timeMVME136.t
@@ -0,0 +1,112 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@include common/timemac.texi
+@tex
+\global\advance \smallskipamount by -4pt
+@end tex
+
+@chapter MVME136 Timing Data
+
+@section Introduction
+
+The timing data for the MC68020 version of RTEMS is
+provided along with the target dependent aspects concerning the
+gathering of the timing data. The hardware platform used to
+gather the times is described to give the reader a better
+understanding of each directive time provided. Also, provided
+is a description of the interrupt latency and the context switch
+times as they pertain to the MC68020 version of RTEMS.
+
+@section Hardware Platform
+
+All times reported except for the maximum period
+interrupts are disabled by RTEMS were measured using a Motorola
+MVME135 CPU board. The MVME135 is a RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+Mhz board with one wait
+state dynamic memory and a MC68881 numeric coprocessor. The
+Zilog 8036 countdown timer on this board was used to measure
+elapsed time with a one-half microsecond resolution. All
+sources of hardware interrupts were disabled, although the
+interrupt level of the MC68020 allows all interrupts.
+
+The maximum period interrupts are disabled was
+measured by summing the number of CPU cycles required by each
+assembly language instruction executed while interrupts were
+disabled. The worst case times of the MC68020 microprocessor
+were used for each instruction. Zero wait state memory was
+assumed. The total CPU cycles executed with interrupts
+disabled, including the instructions to disable and enable
+interrupts, was divided by 20 to simulate a RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+Mhz MC68020. It
+should be noted that the worst case instruction times for the
+MC68020 assume that the internal cache is disabled and that no
+instructions overlap.
+
+@section Interrupt Latency
+
+The maximum period with interrupts disabled within
+RTEMS is less than RTEMS_MAXIMUM_DISABLE_PERIOD
+microseconds including the instructions
+which disable and re-enable interrupts. The time required for
+the MC68020 to vector an interrupt and for the RTEMS entry
+overhead before invoking the user's interrupt handler are a
+total of RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK
+microseconds. These combine to yield a worst case
+interrupt latency of less than
+RTEMS_MAXIMUM_DISABLE_PERIOD + RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK
+microseconds at RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+Mhz. [NOTE: The maximum period with interrupts
+disabled was last determined for Release
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD.]
+
+It should be noted again that the maximum period with
+interrupts disabled within RTEMS is hand-timed and based upon
+worst case (i.e. CPU cache disabled and no instruction overlap)
+times for a RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+Mhz MC68020. The interrupt vector and entry
+overhead time was generated on an MVME135 benchmark platform
+using the Multiprocessing Communications registers to generate
+as the interrupt source.
+
+@section Context Switch
+
+The RTEMS processor context switch time is RTEMS_NO_FP_CONTEXTS
+microseconds on the MVME135 benchmark platform when no floating
+point context is saved or restored. Additional execution time
+is required when a TASK_SWITCH user extension is configured.
+The use of the TASK_SWITCH extension is application dependent.
+Thus, its execution time is not considered part of the raw
+context switch time.
+
+Since RTEMS was designed specifically for embedded
+missile applications which are floating point intensive, the
+executive is optimized to avoid unnecessarily saving and
+restoring the state of the numeric coprocessor. The state of
+the numeric coprocessor is only saved when an FLOATING_POINT
+task is dispatched and that task was not the last task to
+utilize the coprocessor. In a system with only one
+FLOATING_POINT task, the state of the numeric coprocessor will
+never be saved or restored. When the first FLOATING_POINT task
+is dispatched, RTEMS does not need to save the current state of
+the numeric coprocessor.
+
+The exact amount of time required to save and restore
+floating point context is dependent on whether an MC68881 or
+MC68882 is being used as well as the state of the numeric
+coprocessor. These numeric coprocessors define three operating
+states: initialized, idle, and busy. RTEMS places the
+coprocessor in the initialized state when a task is started or
+restarted. Once the task has utilized the coprocessor, it is in
+the idle state when floating point instructions are not
+executing and the busy state when floating point instructions
+are executing. The state of the coprocessor is task specific.
+
+The following table summarizes the context switch
+times for the MVME135 benchmark platform:
+
diff --git a/doc/supplements/m68k/timedata.t b/doc/supplements/m68k/timedata.t
new file mode 100644
index 0000000000..72171445ab
--- /dev/null
+++ b/doc/supplements/m68k/timedata.t
@@ -0,0 +1,154 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@include common/timemac.texi
+@tex
+\global\advance \smallskipamount by -4pt
+@end tex
+
+@ifinfo
+@node MVME136 Timing Data, MVME136 Timing Data Introduction, Timing Specification Terminology, Top
+@end ifinfo
+@chapter MVME136 Timing Data
+@ifinfo
+@menu
+* MVME136 Timing Data Introduction::
+* MVME136 Timing Data Hardware Platform::
+* MVME136 Timing Data Interrupt Latency::
+* MVME136 Timing Data Context Switch::
+* MVME136 Timing Data Directive Times::
+* MVME136 Timing Data Task Manager::
+* MVME136 Timing Data Interrupt Manager::
+* MVME136 Timing Data Clock Manager::
+* MVME136 Timing Data Timer Manager::
+* MVME136 Timing Data Semaphore Manager::
+* MVME136 Timing Data Message Manager::
+* MVME136 Timing Data Event Manager::
+* MVME136 Timing Data Signal Manager::
+* MVME136 Timing Data Partition Manager::
+* MVME136 Timing Data Region Manager::
+* MVME136 Timing Data Dual-Ported Memory Manager::
+* MVME136 Timing Data I/O Manager::
+* MVME136 Timing Data Rate Monotonic Manager::
+@end menu
+@end ifinfo
+
+@ifinfo
+@node MVME136 Timing Data Introduction, MVME136 Timing Data Hardware Platform, MVME136 Timing Data, MVME136 Timing Data
+@end ifinfo
+@section Introduction
+
+The timing data for the MC68020 version of RTEMS is
+provided along with the target dependent aspects concerning the
+gathering of the timing data. The hardware platform used to
+gather the times is described to give the reader a better
+understanding of each directive time provided. Also, provided
+is a description of the interrupt latency and the context switch
+times as they pertain to the MC68020 version of RTEMS.
+
+@ifinfo
+@node MVME136 Timing Data Hardware Platform, MVME136 Timing Data Interrupt Latency, MVME136 Timing Data Introduction, MVME136 Timing Data
+@end ifinfo
+@section Hardware Platform
+
+All times reported except for the maximum period
+interrupts are disabled by RTEMS were measured using a Motorola
+MVME135 CPU board. The MVME135 is a RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+Mhz board with one wait
+state dynamic memory and a MC68881 numeric coprocessor. The
+Zilog 8036 countdown timer on this board was used to measure
+elapsed time with a one-half microsecond resolution. All
+sources of hardware interrupts were disabled, although the
+interrupt level of the MC68020 allows all interrupts.
+
+The maximum period interrupts are disabled was
+measured by summing the number of CPU cycles required by each
+assembly language instruction executed while interrupts were
+disabled. The worst case times of the MC68020 microprocessor
+were used for each instruction. Zero wait state memory was
+assumed. The total CPU cycles executed with interrupts
+disabled, including the instructions to disable and enable
+interrupts, was divided by 20 to simulate a RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+Mhz MC68020. It
+should be noted that the worst case instruction times for the
+MC68020 assume that the internal cache is disabled and that no
+instructions overlap.
+
+@ifinfo
+@node MVME136 Timing Data Interrupt Latency, MVME136 Timing Data Context Switch, MVME136 Timing Data Hardware Platform, MVME136 Timing Data
+@end ifinfo
+@section Interrupt Latency
+
+The maximum period with interrupts disabled within
+RTEMS is less than RTEMS_MAXIMUM_DISABLE_PERIOD
+microseconds including the instructions
+which disable and re-enable interrupts. The time required for
+the MC68020 to vector an interrupt and for the RTEMS entry
+overhead before invoking the user's interrupt handler are a
+total of RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK
+microseconds. These combine to yield a worst case
+interrupt latency of less than
+RTEMS_MAXIMUM_DISABLE_PERIOD + RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK
+microseconds at RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+Mhz. [NOTE: The maximum period with interrupts
+disabled was last determined for Release
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD.]
+
+It should be noted again that the maximum period with
+interrupts disabled within RTEMS is hand-timed and based upon
+worst case (i.e. CPU cache disabled and no instruction overlap)
+times for a RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+Mhz MC68020. The interrupt vector and entry
+overhead time was generated on an MVME135 benchmark platform
+using the Multiprocessing Communications registers to generate
+as the interrupt source.
+
+@ifinfo
+@node MVME136 Timing Data Context Switch, MVME136 Timing Data Directive Times, MVME136 Timing Data Interrupt Latency, MVME136 Timing Data
+@end ifinfo
+@section Context Switch
+
+The RTEMS processor context switch time is RTEMS_NO_FP_CONTEXTS
+microseconds on the MVME135 benchmark platform when no floating
+point context is saved or restored. Additional execution time
+is required when a TASK_SWITCH user extension is configured.
+The use of the TASK_SWITCH extension is application dependent.
+Thus, its execution time is not considered part of the raw
+context switch time.
+
+Since RTEMS was designed specifically for embedded
+missile applications which are floating point intensive, the
+executive is optimized to avoid unnecessarily saving and
+restoring the state of the numeric coprocessor. The state of
+the numeric coprocessor is only saved when an FLOATING_POINT
+task is dispatched and that task was not the last task to
+utilize the coprocessor. In a system with only one
+FLOATING_POINT task, the state of the numeric coprocessor will
+never be saved or restored. When the first FLOATING_POINT task
+is dispatched, RTEMS does not need to save the current state of
+the numeric coprocessor.
+
+The exact amount of time required to save and restore
+floating point context is dependent on whether an MC68881 or
+MC68882 is being used as well as the state of the numeric
+coprocessor. These numeric coprocessors define three operating
+states: initialized, idle, and busy. RTEMS places the
+coprocessor in the initialized state when a task is started or
+restarted. Once the task has utilized the coprocessor, it is in
+the idle state when floating point instructions are not
+executing and the busy state when floating point instructions
+are executing. The state of the coprocessor is task specific.
+
+The following table summarizes the context switch
+times for the MVME135 benchmark platform:
+
+@include timetbl.texi
+
+@tex
+\global\advance \smallskipamount by 4pt
+@end tex
diff --git a/doc/supplements/mips/.cvsignore b/doc/supplements/mips/.cvsignore
new file mode 100644
index 0000000000..8e6ec4ee94
--- /dev/null
+++ b/doc/supplements/mips/.cvsignore
@@ -0,0 +1,38 @@
+bsp.texi
+callconv.texi
+cpumodel.texi
+cputable.texi
+fatalerr.texi
+index.html
+intr.t
+intr.texi
+Makefile
+Makefile.in
+mdate-sh
+memmodel.texi
+mips
+mips-?
+mips-??
+mips.aux
+mips.cp
+mips.dvi
+mips.fn
+mips*.html
+mips.ky
+mips.log
+mips.pdf
+mips.pg
+mips.ps
+mips.toc
+mips.tp
+mips.vr
+rtems_footer.html
+rtems_header.html
+stamp-vti
+timeBSP_.t
+timeBSP.texi
+timing.t
+timing.texi
+version.texi
+wksheets.t
+wksheets.texi
diff --git a/doc/supplements/mips/BSP_TIMES b/doc/supplements/mips/BSP_TIMES
new file mode 100644
index 0000000000..82b8160aa5
--- /dev/null
+++ b/doc/supplements/mips/BSP_TIMES
@@ -0,0 +1,247 @@
+#
+# CPU MODEL/BSP Timing and Size Information
+#
+# $Id$
+#
+
+#
+# CPU Model Information
+#
+RTEMS_BSP BSPFORTIMES
+RTEMS_CPU_MODEL BSP_CPU_MODEL
+#
+# Interrupt Latency
+#
+# NOTE: In general, the text says it is hand-calculated to be
+# RTEMS_MAXIMUM_DISABLE_PERIOD at RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+# Mhz and this was last calculated for Release
+# RTEMS_VERSION_FOR_MAXIMUM_DISABLE_PERIOD.
+#
+RTEMS_MAXIMUM_DISABLE_PERIOD TBD
+RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ 20
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD 4.0.0
+#
+# Context Switch Times
+#
+RTEMS_NO_FP_CONTEXTS 35
+RTEMS_RESTORE_1ST_FP_TASK 39
+RTEMS_SAVE_INIT_RESTORE_INIT 66
+RTEMS_SAVE_IDLE_RESTORE_INIT 66
+RTEMS_SAVE_IDLE_RESTORE_IDLE 68
+#
+# Task Manager Times
+#
+RTEMS_TASK_CREATE_ONLY 148
+RTEMS_TASK_IDENT_ONLY 350
+RTEMS_TASK_START_ONLY 76
+RTEMS_TASK_RESTART_CALLING_TASK 95
+RTEMS_TASK_RESTART_SUSPENDED_RETURNS_TO_CALLER 89
+RTEMS_TASK_RESTART_BLOCKED_RETURNS_TO_CALLER 124
+RTEMS_TASK_RESTART_READY_RETURNS_TO_CALLER 92
+RTEMS_TASK_RESTART_SUSPENDED_PREEMPTS_CALLER 125
+RTEMS_TASK_RESTART_BLOCKED_PREEMPTS_CALLER 149
+RTEMS_TASK_RESTART_READY_PREEMPTS_CALLER 142
+RTEMS_TASK_DELETE_CALLING_TASK 170
+RTEMS_TASK_DELETE_SUSPENDED_TASK 138
+RTEMS_TASK_DELETE_BLOCKED_TASK 143
+RTEMS_TASK_DELETE_READY_TASK 144
+RTEMS_TASK_SUSPEND_CALLING_TASK 71
+RTEMS_TASK_SUSPEND_RETURNS_TO_CALLER 43
+RTEMS_TASK_RESUME_TASK_READIED_RETURNS_TO_CALLER 45
+RTEMS_TASK_RESUME_TASK_READIED_PREEMPTS_CALLER 67
+RTEMS_TASK_SET_PRIORITY_OBTAIN_CURRENT_PRIORITY 31
+RTEMS_TASK_SET_PRIORITY_RETURNS_TO_CALLER 64
+RTEMS_TASK_SET_PRIORITY_PREEMPTS_CALLER 106
+RTEMS_TASK_MODE_OBTAIN_CURRENT_MODE 14
+RTEMS_TASK_MODE_NO_RESCHEDULE 16
+RTEMS_TASK_MODE_RESCHEDULE_RETURNS_TO_CALLER 23
+RTEMS_TASK_MODE_RESCHEDULE_PREEMPTS_CALLER 60
+RTEMS_TASK_GET_NOTE_ONLY 33
+RTEMS_TASK_SET_NOTE_ONLY 33
+RTEMS_TASK_WAKE_AFTER_YIELD_RETURNS_TO_CALLER 16
+RTEMS_TASK_WAKE_AFTER_YIELD_PREEMPTS_CALLER 56
+RTEMS_TASK_WAKE_WHEN_ONLY 117
+#
+# Interrupt Manager
+#
+RTEMS_INTR_ENTRY_RETURNS_TO_NESTED 12
+RTEMS_INTR_ENTRY_RETURNS_TO_INTERRUPTED_TASK 9
+RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK 9
+RTEMS_INTR_EXIT_RETURNS_TO_NESTED <1
+RTEMS_INTR_EXIT_RETURNS_TO_INTERRUPTED_TASK 8
+RTEMS_INTR_EXIT_RETURNS_TO_PREEMPTING_TASK 54
+#
+# Clock Manager
+#
+RTEMS_CLOCK_SET_ONLY 86
+RTEMS_CLOCK_GET_ONLY 1
+RTEMS_CLOCK_TICK_ONLY 17
+#
+# Timer Manager
+#
+RTEMS_TIMER_CREATE_ONLY 28
+RTEMS_TIMER_IDENT_ONLY 343
+RTEMS_TIMER_DELETE_INACTIVE 43
+RTEMS_TIMER_DELETE_ACTIVE 47
+RTEMS_TIMER_FIRE_AFTER_INACTIVE 58
+RTEMS_TIMER_FIRE_AFTER_ACTIVE 61
+RTEMS_TIMER_FIRE_WHEN_INACTIVE 88
+RTEMS_TIMER_FIRE_WHEN_ACTIVE 88
+RTEMS_TIMER_RESET_INACTIVE 54
+RTEMS_TIMER_RESET_ACTIVE 58
+RTEMS_TIMER_CANCEL_INACTIVE 31
+RTEMS_TIMER_CANCEL_ACTIVE 34
+#
+# Semaphore Manager
+#
+RTEMS_SEMAPHORE_CREATE_ONLY 60
+RTEMS_SEMAPHORE_IDENT_ONLY 367
+RTEMS_SEMAPHORE_DELETE_ONLY 58
+RTEMS_SEMAPHORE_OBTAIN_AVAILABLE 38
+RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_NO_WAIT 38
+RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_CALLER_BLOCKS 109
+RTEMS_SEMAPHORE_RELEASE_NO_WAITING_TASKS 44
+RTEMS_SEMAPHORE_RELEASE_TASK_READIED_RETURNS_TO_CALLER 66
+RTEMS_SEMAPHORE_RELEASE_TASK_READIED_PREEMPTS_CALLER 87
+#
+# Message Manager
+#
+RTEMS_MESSAGE_QUEUE_CREATE_ONLY 200
+RTEMS_MESSAGE_QUEUE_IDENT_ONLY 341
+RTEMS_MESSAGE_QUEUE_DELETE_ONLY 80
+RTEMS_MESSAGE_QUEUE_SEND_NO_WAITING_TASKS 97
+RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_RETURNS_TO_CALLER 101
+RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_PREEMPTS_CALLER 123
+RTEMS_MESSAGE_QUEUE_URGENT_NO_WAITING_TASKS 96
+RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_RETURNS_TO_CALLER 101
+RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_PREEMPTS_CALLER 123
+RTEMS_MESSAGE_QUEUE_BROADCAST_NO_WAITING_TASKS 53
+RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_RETURNS_TO_CALLER 111
+RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_PREEMPTS_CALLER 133
+RTEMS_MESSAGE_QUEUE_RECEIVE_AVAILABLE 79
+RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_NO_WAIT 43
+RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS 114
+RTEMS_MESSAGE_QUEUE_FLUSH_NO_MESSAGES_FLUSHED 29
+RTEMS_MESSAGE_QUEUE_FLUSH_MESSAGES_FLUSHED 39
+#
+# Event Manager
+#
+RTEMS_EVENT_SEND_NO_TASK_READIED 24
+RTEMS_EVENT_SEND_TASK_READIED_RETURNS_TO_CALLER 60
+RTEMS_EVENT_SEND_TASK_READIED_PREEMPTS_CALLER 84
+RTEMS_EVENT_RECEIVE_OBTAIN_CURRENT_EVENTS 1
+RTEMS_EVENT_RECEIVE_AVAILABLE 28
+RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_NO_WAIT 23
+RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS 84
+#
+# Signal Manager
+#
+RTEMS_SIGNAL_CATCH_ONLY 15
+RTEMS_SIGNAL_SEND_RETURNS_TO_CALLER 37
+RTEMS_SIGNAL_SEND_SIGNAL_TO_SELF 55
+RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_CALLING_TASK 37
+RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_PREEMPTING_TASK 54
+#
+# Partition Manager
+#
+RTEMS_PARTITION_CREATE_ONLY 70
+RTEMS_PARTITION_IDENT_ONLY 341
+RTEMS_PARTITION_DELETE_ONLY 42
+RTEMS_PARTITION_GET_BUFFER_AVAILABLE 35
+RTEMS_PARTITION_GET_BUFFER_NOT_AVAILABLE 33
+RTEMS_PARTITION_RETURN_BUFFER_ONLY 43
+#
+# Region Manager
+#
+RTEMS_REGION_CREATE_ONLY 63
+RTEMS_REGION_IDENT_ONLY 348
+RTEMS_REGION_DELETE_ONLY 39
+RTEMS_REGION_GET_SEGMENT_AVAILABLE 52
+RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_NO_WAIT 49
+RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_CALLER_BLOCKS 123
+RTEMS_REGION_RETURN_SEGMENT_NO_WAITING_TASKS 54
+RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_RETURNS_TO_CALLER 114
+RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_PREEMPTS_CALLER 136
+#
+# Dual-Ported Memory Manager
+#
+RTEMS_PORT_CREATE_ONLY 35
+RTEMS_PORT_IDENT_ONLY 340
+RTEMS_PORT_DELETE_ONLY 39
+RTEMS_PORT_INTERNAL_TO_EXTERNAL_ONLY 26
+RTEMS_PORT_EXTERNAL_TO_INTERNAL_ONLY 27
+#
+# IO Manager
+#
+RTEMS_IO_INITIALIZE_ONLY 4
+RTEMS_IO_OPEN_ONLY 2
+RTEMS_IO_CLOSE_ONLY 1
+RTEMS_IO_READ_ONLY 2
+RTEMS_IO_WRITE_ONLY 3
+RTEMS_IO_CONTROL_ONLY 2
+#
+# Rate Monotonic Manager
+#
+RTEMS_RATE_MONOTONIC_CREATE_ONLY 32
+RTEMS_RATE_MONOTONIC_IDENT_ONLY 341
+RTEMS_RATE_MONOTONIC_CANCEL_ONLY 39
+RTEMS_RATE_MONOTONIC_DELETE_ACTIVE 51
+RTEMS_RATE_MONOTONIC_DELETE_INACTIVE 48
+RTEMS_RATE_MONOTONIC_PERIOD_INITIATE_PERIOD_RETURNS_TO_CALLER 54
+RTEMS_RATE_MONOTONIC_PERIOD_CONCLUDE_PERIOD_CALLER_BLOCKS 74
+RTEMS_RATE_MONOTONIC_PERIOD_OBTAIN_STATUS 31
+#
+# Size Information
+#
+#
+# xxx alloted for numbers
+#
+RTEMS_DATA_SPACE 723
+RTEMS_MINIMUM_CONFIGURATION 18,980
+RTEMS_MAXIMUM_CONFIGURATION 36,438
+# x,xxx alloted for numbers
+RTEMS_CORE_CODE_SIZE 12,674
+RTEMS_INITIALIZATION_CODE_SIZE 970
+RTEMS_TASK_CODE_SIZE 3,562
+RTEMS_INTERRUPT_CODE_SIZE 54
+RTEMS_CLOCK_CODE_SIZE 334
+RTEMS_TIMER_CODE_SIZE 1,110
+RTEMS_SEMAPHORE_CODE_SIZE 1,632
+RTEMS_MESSAGE_CODE_SIZE 1,754
+RTEMS_EVENT_CODE_SIZE 1,000
+RTEMS_SIGNAL_CODE_SIZE 418
+RTEMS_PARTITION_CODE_SIZE 1,164
+RTEMS_REGION_CODE_SIZE 1,494
+RTEMS_DPMEM_CODE_SIZE 724
+RTEMS_IO_CODE_SIZE 686
+RTEMS_FATAL_ERROR_CODE_SIZE 24
+RTEMS_RATE_MONOTONIC_CODE_SIZE 1,212
+RTEMS_MULTIPROCESSING_CODE_SIZE 6.952
+# xxx alloted for numbers
+RTEMS_TIMER_CODE_OPTSIZE 184
+RTEMS_SEMAPHORE_CODE_OPTSIZE 172
+RTEMS_MESSAGE_CODE_OPTSIZE 288
+RTEMS_EVENT_CODE_OPTSIZE 56
+RTEMS_SIGNAL_CODE_OPTSIZE 56
+RTEMS_PARTITION_CODE_OPTSIZE 132
+RTEMS_REGION_CODE_OPTSIZE 160
+RTEMS_DPMEM_CODE_OPTSIZE 132
+RTEMS_IO_CODE_OPTSIZE 00
+RTEMS_RATE_MONOTONIC_CODE_OPTSIZE 184
+RTEMS_MULTIPROCESSING_CODE_OPTSIZE 332
+# xxx alloted for numbers
+RTEMS_BYTES_PER_TASK 400
+RTEMS_BYTES_PER_TIMER 68
+RTEMS_BYTES_PER_SEMAPHORE 124
+RTEMS_BYTES_PER_MESSAGE_QUEUE 148
+RTEMS_BYTES_PER_REGION 144
+RTEMS_BYTES_PER_PARTITION 56
+RTEMS_BYTES_PER_PORT 36
+RTEMS_BYTES_PER_PERIOD 36
+RTEMS_BYTES_PER_EXTENSION 64
+RTEMS_BYTES_PER_FP_TASK 332
+RTEMS_BYTES_PER_NODE 48
+RTEMS_BYTES_PER_GLOBAL_OBJECT 20
+RTEMS_BYTES_PER_PROXY 124
+# x,xxx alloted for numbers
+RTEMS_BYTES_OF_FIXED_SYSTEM_REQUIREMENTS 8,872
diff --git a/doc/supplements/mips/ChangeLog b/doc/supplements/mips/ChangeLog
new file mode 100644
index 0000000000..1b34f35c37
--- /dev/null
+++ b/doc/supplements/mips/ChangeLog
@@ -0,0 +1,76 @@
+2003-12-12 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-12-11 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-11-26 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Add *.info to CLEANFILES to accomodate
+ automake-1.7f/1.8 breaking building infos.
+
+2003-09-26 Joel Sherrill <joel@OARcorp.com>
+
+ * cpumodel.t: Obsoleting HP PA-RISC port and removing all references.
+
+2003-09-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Merger from rtems-4-6-branch.
+
+2003-09-19 Joel Sherrill <joel@OARcorp.com>
+
+ * mips.texi: Merge from branch.
+
+2003-05-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * cpumodel.t: Reflect c/src/exec having moved to cpukit.
+
+2003-01-25 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * mips.texi: Set @setfilename mips.info.
+
+2003-01-24 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Put GENERATED_FILES into $builddir.
+
+2003-01-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * version.texi: Remove from CVS.
+ * stamp-vti: Remove from CVS.
+ * .cvsignore: Add version.texi.
+ Add stamp-vti.
+ Re-sort.
+
+2003-01-21 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-11-13 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-10-24 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-07-30 Joel Sherrill <joel@OARcorp.com>
+
+ * .cvsignore: Corrected some errors.
+ * intr_NOTIMES.t, timeBSP.t: Replaced XXX's with real info.
+
+2002-03-27 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Remove AUTOMAKE_OPTIONS.
+
+2001-03-01 Joel Sherrill <joel@OARcorp.com>
+
+ * .cvsignore: New file.
+
+2002-02-04 Joel Sherrill <joel@OARcorp.com>
+
+ * bsp.t, BSP_TIMES, callconv.t, ChangeLog, cpumodel.t, cputable.t,
+ fatalerr.t, intr_NOTIMES.t, Makefile.am, memmodel.t, mips.texi,
+ preface.texi, stamp-vti, timeBSP.t, version.texi: New files.
+
diff --git a/doc/supplements/mips/Makefile.am b/doc/supplements/mips/Makefile.am
new file mode 100644
index 0000000000..e45ba428fa
--- /dev/null
+++ b/doc/supplements/mips/Makefile.am
@@ -0,0 +1,111 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = mips
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/supplements/supplement.am
+
+GENERATED_FILES = cpumodel.texi callconv.texi memmodel.texi intr.texi \
+ fatalerr.texi bsp.texi cputable.texi wksheets.texi timing.texi \
+ timeBSP.texi
+
+COMMON_FILES += $(top_srcdir)/common/cpright.texi \
+ $(top_srcdir)/common/timemac.texi
+
+FILES = preface.texi
+
+info_TEXINFOS = mips.texi
+mips_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+#
+# Chapters which get automatic processing
+#
+
+cpumodel.texi: cpumodel.t
+ $(BMENU2) -p "Preface" \
+ -u "Top" \
+ -n "Calling Conventions" < $< > $@
+
+callconv.texi: callconv.t
+ $(BMENU2) -p "CPU Model Dependent Features Another Optional Feature" \
+ -u "Top" \
+ -n "Memory Model" < $< > $@
+
+memmodel.texi: memmodel.t
+ $(BMENU2) -p "Calling Conventions User-Provided Routines" \
+ -u "Top" \
+ -n "Interrupt Processing" < $< > $@
+
+# Interrupt Chapter:
+# 1. Replace Times and Sizes
+# 2. Build Node Structure
+intr.texi: intr_NOTIMES.t BSP_TIMES
+ ${REPLACE2} -p $(srcdir)/BSP_TIMES $(srcdir)/intr_NOTIMES.t | \
+ $(BMENU2) -p "Memory Model Flat Memory Model" \
+ -u "Top" \
+ -n "Default Fatal Error Processing" > $@
+
+fatalerr.texi: fatalerr.t
+ $(BMENU2) -p "Interrupt Processing Interrupt Stack" \
+ -u "Top" \
+ -n "Board Support Packages" < $< > $@
+
+bsp.texi: bsp.t
+ $(BMENU2) -p "Default Fatal Error Processing Default Fatal Error Handler Operations" \
+ -u "Top" \
+ -n "Processor Dependent Information Table" < $< > $@
+
+cputable.texi: cputable.t
+ $(BMENU2) -p "Board Support Packages Processor Initialization" \
+ -u "Top" \
+ -n "Memory Requirements" < $< > $@
+
+# Worksheets Chapter:
+# 1. Copy the Shared File
+# 2. Replace Times and Sizes
+# 3. Build Node Structure
+
+wksheets.texi: $(top_srcdir)/common/wksheets.t BSP_TIMES
+ ${REPLACE2} -p $(srcdir)/BSP_TIMES \
+ $(top_srcdir)/common/wksheets.t | \
+ $(BMENU2) -p "Processor Dependent Information Table CPU Dependent Information Table" \
+ -u "Top" \
+ -n "Timing Specification" > $@
+
+# Timing Specification Chapter:
+# 1. Copy the Shared File
+# 3. Build Node Structure
+
+timing.texi: $(top_srcdir)/common/timing.t
+ $(BMENU2) -p "Memory Requirements RTEMS RAM Workspace Worksheet" \
+ -u "Top" \
+ -n "BSP_FOR_TIMES Timing Data" < $< > $@
+
+# Timing Data for BSP Chapter:
+# 1. Copy the Shared File
+# 2. Replace Times and Sizes
+# 3. Build Node Structure
+
+timeBSP.texi: $(top_srcdir)/common/timetbl.t timeBSP.t
+ cat $(srcdir)/timeBSP.t $(top_srcdir)/common/timetbl.t >timeBSP_.t
+ @echo >>timeBSP_.t
+ @echo "@tex" >>timeBSP_.t
+ @echo "\\global\\advance \\smallskipamount by 4pt" >>timeBSP_.t
+ @echo "@end tex" >>timeBSP_.t
+ ${REPLACE2} -p $(srcdir)/BSP_TIMES timeBSP_.t | \
+ $(BMENU2) -p "Timing Specification Terminology" \
+ -u "Top" \
+ -n "Command and Variable Index" > $@
+CLEANFILES += timeBSP_.t
+
+EXTRA_DIST = BSP_TIMES bsp.t callconv.t cpumodel.t cputable.t fatalerr.t \
+ intr_NOTIMES.t memmodel.t timeBSP.t
+
+CLEANFILES += mips.info mips.info-?
diff --git a/doc/supplements/mips/bsp.t b/doc/supplements/mips/bsp.t
new file mode 100644
index 0000000000..657c359a96
--- /dev/null
+++ b/doc/supplements/mips/bsp.t
@@ -0,0 +1,93 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Board Support Packages
+
+@section Introduction
+
+An RTEMS Board Support Package (BSP) must be designed
+to support a particular processor and target board combination.
+This chapter presents a discussion of XXX specific BSP
+issues. For more information on developing a BSP, refer to the
+chapter titled Board Support Packages in the RTEMS
+Applications User's Guide.
+
+@section System Reset
+
+An RTEMS based application is initiated or
+re-initiated when the XXX processor is reset. When the
+XXX is reset, the processor performs the following actions:
+
+@itemize @bullet
+@item The tracing bits of the status register are cleared to
+disable tracing.
+
+@item The supervisor interrupt state is entered by setting the
+supervisor (S) bit and clearing the master/interrupt (M) bit of
+the status register.
+
+@item The interrupt mask of the status register is set to
+level 7 to effectively disable all maskable interrupts.
+
+@item The vector base register (VBR) is set to zero.
+
+@item The cache control register (CACR) is set to zero to
+disable and freeze the processor cache.
+
+@item The interrupt stack pointer (ISP) is set to the value
+stored at vector 0 (bytes 0-3) of the exception vector table
+(EVT).
+
+@item The program counter (PC) is set to the value stored at
+vector 1 (bytes 4-7) of the EVT.
+
+@item The processor begins execution at the address stored in
+the PC.
+@end itemize
+
+@section Processor Initialization
+
+The address of the application's initialization code
+should be stored in the first vector of the EVT which will allow
+the immediate vectoring to the application code. If the
+application requires that the VBR be some value besides zero,
+then it should be set to the required value at this point. All
+tasks share the same XXX's VBR value. Because interrupts
+are enabled automatically by RTEMS as part of the initialize
+executive directive, the VBR MUST be set before this directive
+is invoked to insure correct interrupt vectoring. If processor
+caching is to be utilized, then it should be enabled during the
+reset application initialization code.
+
+In addition to the requirements described in the
+Board Support Packages chapter of the Applications User's
+Manual for the reset code which is executed before the call to
+initialize executive, the XXX version has the following
+specific requirements:
+
+@itemize @bullet
+@item Must leave the S bit of the status register set so that
+the XXX remains in the supervisor state.
+
+@item Must set the M bit of the status register to remove the
+XXX from the interrupt state.
+
+@item Must set the master stack pointer (MSP) such that a
+minimum stack size of MINIMUM_STACK_SIZE bytes is provided for
+the initialize executive directive.
+
+@item Must initialize the XXX's vector table.
+@end itemize
+
+Note that the BSP is not responsible for allocating
+or installing the interrupt stack. RTEMS does this
+automatically as part of initialization. If the BSP does not
+install an interrupt stack and -- for whatever reason -- an
+interrupt occurs before initialize_executive is invoked, then
+the results are unpredictable.
+
diff --git a/doc/supplements/mips/callconv.t b/doc/supplements/mips/callconv.t
new file mode 100644
index 0000000000..5387032c60
--- /dev/null
+++ b/doc/supplements/mips/callconv.t
@@ -0,0 +1,92 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Calling Conventions
+
+@section Introduction
+
+Each high-level language compiler generates
+subroutine entry and exit code based upon a set of rules known
+as the compiler's calling convention. These rules address the
+following issues:
+
+@itemize @bullet
+@item register preservation and usage
+@item parameter passing
+@item call and return mechanism
+@end itemize
+
+A compiler's calling convention is of importance when
+interfacing to subroutines written in another language either
+assembly or high-level. Even when the high-level language and
+target processor are the same, different compilers may use
+different calling conventions. As a result, calling conventions
+are both processor and compiler dependent.
+
+@section Processor Background
+
+The MC68xxx architecture supports a simple yet
+effective call and return mechanism. A subroutine is invoked
+via the branch to subroutine (@code{XXX}) or the jump to subroutine
+(@code{XXX}) instructions. These instructions push the return address
+on the current stack. The return from subroutine (@code{XXX})
+instruction pops the return address off the current stack and
+transfers control to that instruction. It is is important to
+note that the XXX call and return mechanism does not
+automatically save or restore any registers. It is the
+responsibility of the high-level language compiler to define the
+register preservation and usage convention.
+
+@section Calling Mechanism
+
+All RTEMS directives are invoked using either a @code{XXX}
+or @code{XXX} instruction and return to the user application via the
+@code{XXX} instruction.
+
+@section Register Usage
+
+As discussed above, the @code{XXX} and @code{XXX} instructions do
+not automatically save any registers. RTEMS uses the registers
+@b{D0}, @b{D1}, @b{A0}, and @b{A1} as scratch registers. These registers are
+not preserved by RTEMS directives therefore, the contents of
+these registers should not be assumed upon return from any RTEMS
+directive.
+
+@section Parameter Passing
+
+RTEMS assumes that arguments are placed on the
+current stack before the directive is invoked via the @code{XXX} or @code{XXX}
+instruction. The first argument is assumed to be closest to the
+return address on the stack. This means that the first argument
+of the C calling sequence is pushed last. The following
+pseudo-code illustrates the typical sequence used to call a
+RTEMS directive with three (3) arguments:
+
+@example
+@group
+push third argument
+push second argument
+push first argument
+invoke directive
+remove arguments from the stack
+@end group
+@end example
+
+The arguments to RTEMS are typically pushed onto the
+stack using a move instruction with a pre-decremented stack
+pointer as the destination. These arguments must be removed
+from the stack after control is returned to the caller. This
+removal is typically accomplished by adding the size of the
+argument list in bytes to the current stack pointer.
+
+@section User-Provided Routines
+
+All user-provided routines invoked by RTEMS, such as
+user extensions, device drivers, and MPCI routines, must also
+adhere to these calling conventions.
+
diff --git a/doc/supplements/mips/cpumodel.t b/doc/supplements/mips/cpumodel.t
new file mode 100644
index 0000000000..c366970ae1
--- /dev/null
+++ b/doc/supplements/mips/cpumodel.t
@@ -0,0 +1,68 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter CPU Model Dependent Features
+
+@section Introduction
+
+Microprocessors are generally classified into
+families with a variety of CPU models or implementations within
+that family. Within a processor family, there is a high level
+of binary compatibility. This family may be based on either an
+architectural specification or on maintaining compatibility with
+a popular processor. Recent microprocessor families such as the
+SPARC or PowerPC are based on an architectural specification
+which is independent or any particular CPU model or
+implementation. Older families such as the M68xxx and the iX86
+evolved as the manufacturer strived to produce higher
+performance processor models which maintained binary
+compatibility with older models.
+
+RTEMS takes advantage of the similarity of the
+various models within a CPU family. Although the models do vary
+in significant ways, the high level of compatibility makes it
+possible to share the bulk of the CPU dependent executive code
+across the entire family. Each processor family supported by
+RTEMS has a list of features which vary between CPU models
+within a family. For example, the most common model dependent
+feature regardless of CPU family is the presence or absence of a
+floating point unit or coprocessor. When defining the list of
+features present on a particular CPU model, one simply notes
+that floating point hardware is or is not present and defines a
+single constant appropriately. Conditional compilation is
+utilized to include the appropriate source code for this CPU
+model's feature set. It is important to note that this means
+that RTEMS is thus compiled using the appropriate feature set
+and compilation flags optimal for this CPU model used. The
+alternative would be to generate a binary which would execute on
+all family members using only the features which were always
+present.
+
+This chapter presents the set of features which vary
+across SPARC implementations and are of importance to RTEMS.
+The set of CPU model feature macros are defined in the file
+cpukit/score/cpu/XXX/XXX.h based upon the particular CPU
+model defined on the compilation command line.
+
+@section CPU Model Name
+
+The macro CPU_MODEL_NAME is a string which designates
+the name of this CPU model. For example, for the MODEL
+processor, this macro is set to the string "XXX".
+
+@section Floating Point Unit
+
+The macro XXX_HAS_FPU is set to 1 to indicate that
+this CPU model has a hardware floating point unit and 0
+otherwise. It does not matter whether the hardware floating
+point support is incorporated on-chip or is an external
+coprocessor.
+
+@section Another Optional Feature
+
+The macro XXX
diff --git a/doc/supplements/mips/cputable.t b/doc/supplements/mips/cputable.t
new file mode 100644
index 0000000000..75d0fc15f6
--- /dev/null
+++ b/doc/supplements/mips/cputable.t
@@ -0,0 +1,109 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Processor Dependent Information Table
+
+@section Introduction
+
+Any highly processor dependent information required
+to describe a processor to RTEMS is provided in the CPU
+Dependent Information Table. This table is not required for all
+processors supported by RTEMS. This chapter describes the
+contents, if any, for a particular processor type.
+
+@section CPU Dependent Information Table
+
+The XXX version of the RTEMS CPU Dependent
+Information Table contains the information required to interface
+a Board Support Package and RTEMS on the XXX. This
+information is provided to allow RTEMS to interoperate
+effectively with the BSP. The C structure definition is given
+here:
+
+@example
+@group
+typedef struct @{
+ void (*pretasking_hook)( void );
+ void (*predriver_hook)( void );
+ void (*postdriver_hook)( void );
+ void (*idle_task)( void );
+ boolean do_zero_of_workspace;
+ unsigned32 idle_task_stack_size;
+ unsigned32 interrupt_stack_size;
+ unsigned32 extra_mpci_receive_server_stack;
+ void * (*stack_allocate_hook)( unsigned32 );
+ void (*stack_free_hook)( void* );
+ /* end of fields required on all CPUs */
+
+ /* XXX CPU family dependent stuff */
+@} rtems_cpu_table;
+@end group
+@end example
+
+@table @code
+@item pretasking_hook
+is the address of the user provided routine which is invoked
+once RTEMS APIs are initialized. This routine will be invoked
+before any system tasks are created. Interrupts are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item predriver_hook
+is the address of the user provided
+routine that is invoked immediately before the
+the device drivers and MPCI are initialized. RTEMS
+initialization is complete but interrupts and tasking are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item postdriver_hook
+is the address of the user provided
+routine that is invoked immediately after the
+the device drivers and MPCI are initialized. RTEMS
+initialization is complete but interrupts and tasking are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item idle_task
+is the address of the optional user
+provided routine which is used as the system's IDLE task. If
+this field is not NULL, then the RTEMS default IDLE task is not
+used. This field may be NULL to indicate that the default IDLE
+is to be used.
+
+@item do_zero_of_workspace
+indicates whether RTEMS should
+zero the Workspace as part of its initialization. If set to
+TRUE, the Workspace is zeroed. Otherwise, it is not.
+
+@item idle_task_stack_size
+is the size of the RTEMS idle task stack in bytes.
+If this number is less than MINIMUM_STACK_SIZE, then the
+idle task's stack will be MINIMUM_STACK_SIZE in byte.
+
+@item interrupt_stack_size
+is the size of the RTEMS
+allocated interrupt stack in bytes. This value must be at least
+as large as MINIMUM_STACK_SIZE.
+
+@item extra_mpci_receive_server_stack
+is the extra stack space allocated for the RTEMS MPCI receive server task
+in bytes. The MPCI receive server may invoke nearly all directives and
+may require extra stack space on some targets.
+
+@item stack_allocate_hook
+is the address of the optional user provided routine which allocates
+memory for task stacks. If this hook is not NULL, then a stack_free_hook
+must be provided as well.
+
+@item stack_free_hook
+is the address of the optional user provided routine which frees
+memory for task stacks. If this hook is not NULL, then a stack_allocate_hook
+must be provided as well.
+
+@item XXX
+is where the CPU family dependent stuff goes.
+
+@end table
diff --git a/doc/supplements/mips/fatalerr.t b/doc/supplements/mips/fatalerr.t
new file mode 100644
index 0000000000..53efad0435
--- /dev/null
+++ b/doc/supplements/mips/fatalerr.t
@@ -0,0 +1,31 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Default Fatal Error Processing
+
+@section Introduction
+
+Upon detection of a fatal error by either the
+application or RTEMS the fatal error manager is invoked. The
+fatal error manager will invoke the user-supplied fatal error
+handlers. If no user-supplied handlers are configured, the
+RTEMS provided default fatal error handler is invoked. If the
+user-supplied fatal error handlers return to the executive the
+default fatal error handler is then invoked. This chapter
+describes the precise operations of the default fatal error
+handler.
+
+@section Default Fatal Error Handler Operations
+
+The default fatal error handler which is invoked by
+the @code{rtems_fatal_error_occurred} directive when there is
+no user handler configured or the user handler returns control to
+RTEMS. The default fatal error handler disables processor interrupts,
+places the error code in @b{XXX}, and executes a @code{XXX}
+instruction to simulate a halt processor instruction.
+
diff --git a/doc/supplements/mips/intr_NOTIMES.t b/doc/supplements/mips/intr_NOTIMES.t
new file mode 100644
index 0000000000..5b1025e873
--- /dev/null
+++ b/doc/supplements/mips/intr_NOTIMES.t
@@ -0,0 +1,196 @@
+@c
+@c Interrupt Stack Frame Picture
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Interrupt Processing
+
+@section Introduction
+
+Different types of processors respond to the
+occurrence of an interrupt in its own unique fashion. In
+addition, each processor type provides a control mechanism to
+allow for the proper handling of an interrupt. The processor
+dependent response to the interrupt modifies the current
+execution state and results in a change in the execution stream.
+Most processors require that an interrupt handler utilize some
+special control mechanisms to return to the normal processing
+stream. Although RTEMS hides many of the processor dependent
+details of interrupt processing, it is important to understand
+how the RTEMS interrupt manager is mapped onto the processor's
+unique architecture. Discussed in this chapter are the XXX's
+interrupt response and control mechanisms as they pertain to
+RTEMS.
+
+@section Vectoring of an Interrupt Handler
+
+Depending on whether or not the particular CPU
+supports a separate interrupt stack, the XXX family has two
+different interrupt handling models.
+
+@subsection Models Without Separate Interrupt Stacks
+
+Upon receipt of an interrupt the XXX family
+members without separate interrupt stacks automatically perform
+the following actions:
+
+@itemize @bullet
+@item To Be Written
+@end itemize
+
+@subsection Models With Separate Interrupt Stacks
+
+Upon receipt of an interrupt the XXX family
+members with separate interrupt stacks automatically perform the
+following actions:
+
+@itemize @bullet
+@item saves the current status register (SR),
+
+@item clears the master/interrupt (M) bit of the SR to
+indicate the switch from master state to interrupt state,
+
+@item sets the privilege mode to supervisor,
+
+@item suppresses tracing,
+
+@item sets the interrupt mask level equal to the level of the
+interrupt being serviced,
+
+@item pushes an interrupt stack frame (ISF), which includes
+the program counter (PC), the status register (SR), and the
+format/exception vector offset (FVO) word, onto the supervisor
+and interrupt stacks,
+
+@item switches the current stack to the interrupt stack and
+vectors to an interrupt service routine (ISR). If the ISR was
+installed with the interrupt_catch directive, then the RTEMS
+interrupt handler will begin execution. The RTEMS interrupt
+handler saves all registers which are not preserved according to
+the calling conventions and invokes the application's ISR.
+@end itemize
+
+A nested interrupt is processed similarly by these
+CPU models with the exception that only a single ISF is placed
+on the interrupt stack and the current stack need not be
+switched.
+
+The FVO word in the Interrupt Stack Frame is examined
+by RTEMS to determine when an outer most interrupt is being
+exited. Since the FVO is used by RTEMS for this purpose, the
+user application code MUST NOT modify this field.
+
+The following shows the Interrupt Stack Frame for
+XXX CPU models with separate interrupt stacks:
+
+@ifset use-ascii
+@example
+@group
+ +----------------------+
+ | Status Register | 0x0
+ +----------------------+
+ | Program Counter High | 0x2
+ +----------------------+
+ | Program Counter Low | 0x4
+ +----------------------+
+ | Format/Vector Offset | 0x6
+ +----------------------+
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@sp 1
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\strut\vrule#&
+\hbox to 2.00in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 0.50in{\enskip\hfil#\hfil}
+\cr
+\multispan{3}\hrulefill\cr
+& Status Register && 0x0\cr
+\multispan{3}\hrulefill\cr
+& Program Counter High && 0x2\cr
+\multispan{3}\hrulefill\cr
+& Program Counter Low && 0x4\cr
+\multispan{3}\hrulefill\cr
+& Format/Vector Offset && 0x6\cr
+\multispan{3}\hrulefill\cr
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=2 WIDTH="40%" BORDER=2>
+<TR><TD ALIGN=center><STRONG>Status Register</STRONG></TD>
+ <TD ALIGN=center>0x0</TD></TR>
+<TR><TD ALIGN=center><STRONG>Program Counter High</STRONG></TD>
+ <TD ALIGN=center>0x2</TD></TR>
+<TR><TD ALIGN=center><STRONG>Program Counter Low</STRONG></TD>
+ <TD ALIGN=center>0x4</TD></TR>
+<TR><TD ALIGN=center><STRONG>Format/Vector Offset</STRONG></TD>
+ <TD ALIGN=center>0x6</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+@section Interrupt Levels
+
+Eight levels (0-7) of interrupt priorities are
+supported by XXX family members with level seven (7) being
+the highest priority. Level zero (0) indicates that interrupts
+are fully enabled. Interrupt requests for interrupts with
+priorities less than or equal to the current interrupt mask
+level are ignored.
+
+Although RTEMS supports 256 interrupt levels, the
+XXX family only supports eight. RTEMS interrupt levels 0
+through 7 directly correspond to XXX interrupt levels. All
+other RTEMS interrupt levels are undefined and their behavior is
+unpredictable.
+
+@section Disabling of Interrupts by RTEMS
+
+During the execution of directive calls, critical
+sections of code may be executed. When these sections are
+encountered, RTEMS disables interrupts to level seven (7) before
+the execution of this section and restores them to the previous
+level upon completion of the section. RTEMS has been optimized
+to insure that interrupts are disabled for less than
+RTEMS_MAXIMUM_DISABLE_PERIOD microseconds on a
+RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ Mhz processor with
+zero wait states. These numbers will vary based the
+number of wait states and processor speed present on the target board.
+[NOTE: The maximum period with interrupts disabled is hand calculated. This
+calculation was last performed for Release
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD.]
+
+Non-maskable interrupts (NMI) cannot be disabled, and
+ISRs which execute at this level MUST NEVER issue RTEMS system
+calls. If a directive is invoked, unpredictable results may
+occur due to the inability of RTEMS to protect its critical
+sections. However, ISRs that make no system calls may safely
+execute as non-maskable interrupts.
+
+@section Interrupt Stack
+
+RTEMS allocates the interrupt stack from the
+Workspace Area. The amount of memory allocated for the
+interrupt stack is determined by the interrupt_stack_size field
+in the CPU Configuration Table. During the initialization
+process, RTEMS will install its interrupt stack.
+
+The mips port of RTEMS supports a software managed
+dedicated interrupt stack on those CPU models which do not
+support a separate interrupt stack in hardware.
+
+
diff --git a/doc/supplements/mips/memmodel.t b/doc/supplements/mips/memmodel.t
new file mode 100644
index 0000000000..ef35072230
--- /dev/null
+++ b/doc/supplements/mips/memmodel.t
@@ -0,0 +1,39 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Memory Model
+
+@section Introduction
+
+A processor may support any combination of memory
+models ranging from pure physical addressing to complex demand
+paged virtual memory systems. RTEMS supports a flat memory
+model which ranges contiguously over the processor's allowable
+address space. RTEMS does not support segmentation or virtual
+memory of any kind. The appropriate memory model for RTEMS
+provided by the targeted processor and related characteristics
+of that model are described in this chapter.
+
+@section Flat Memory Model
+
+The XXX family supports a flat 32-bit address
+space with addresses ranging from 0x00000000 to 0xFFFFFFFF (4
+gigabytes). Each address is represented by a 32-bit value and
+is byte addressable. The address may be used to reference a
+single byte, word (2-bytes), or long word (4 bytes). Memory
+accesses within this address space are performed in big endian
+fashion by the processors in this family.
+
+Some of the XXX family members such as the
+XXX, XXX, and XXX support virtual memory and
+segmentation. The XXX requires external hardware support
+such as the XXX Paged Memory Management Unit coprocessor
+which is typically used to perform address translations for
+these systems. RTEMS does not support virtual memory or
+segmentation on any of the XXX family members.
+
diff --git a/doc/supplements/mips/mips.texi b/doc/supplements/mips/mips.texi
new file mode 100644
index 0000000000..e33d69332c
--- /dev/null
+++ b/doc/supplements/mips/mips.texi
@@ -0,0 +1,114 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename mips.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the Template Applications Supplement
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS Target Supplements
+@direntry
+* RTEMS MIPS Applications Supplement: (mips).
+@end direntry
+@end ifset
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage RTEMS MIPS Applications Supplement
+
+@setchapternewpage odd
+@settitle RTEMS MIPS Applications Supplement
+@titlepage
+@finalout
+
+@title RTEMS MIPS Applications Supplement
+@subtitle Edition @value{EDITION}, for RTEMS @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include preface.texi
+@include cpumodel.texi
+@include callconv.texi
+@include memmodel.texi
+@include intr.texi
+@include fatalerr.texi
+@include bsp.texi
+@include cputable.texi
+@include wksheets.texi
+@include timing.texi
+@include timeBSP.texi
+@ifinfo
+@node Top, Preface, (dir), (dir)
+@top mips
+
+This is the online version of the RTEMS MIPS Applications Supplement.
+
+@menu
+* Preface::
+* CPU Model Dependent Features::
+* Calling Conventions::
+* Memory Model::
+* Interrupt Processing::
+* Default Fatal Error Processing::
+* Board Support Packages::
+* Processor Dependent Information Table::
+* Memory Requirements::
+* Timing Specification::
+* BSP_FOR_TIMES Timing Data::
+* Command and Variable Index::
+* Concept Index::
+@end menu
+
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@node Command and Variable Index, Concept Index, BSP_FOR_TIMES Timing Data Rate Monotonic Manager, Top
+@unnumbered Command and Variable Index
+
+There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@node Concept Index, , Command and Variable Index, Top
+@unnumbered Concept Index
+
+There are currently no Concept Index entries.
+@c @printindex cp
+
+@contents
+@bye
+
diff --git a/doc/supplements/mips/preface.texi b/doc/supplements/mips/preface.texi
new file mode 100644
index 0000000000..c4f4f3ee0b
--- /dev/null
+++ b/doc/supplements/mips/preface.texi
@@ -0,0 +1,57 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Preface, CPU Model Dependent Features, Top, Top
+@end ifinfo
+@unnumbered Preface
+
+The Real Time Executive for Multiprocessor Systems (RTEMS)
+is designed to be portable across multiple processor
+architectures. However, the nature of real-time systems makes
+it essential that the application designer understand certain
+processor dependent implementation details. These processor
+dependencies include calling convention, board support package
+issues, interrupt processing, exact RTEMS memory requirements,
+performance data, header files, and the assembly language
+interface to the executive.
+
+This document discusses the VENDOR XXX
+architecture dependencies in this port of RTEMS. The XXX
+family has a wide variety of CPU models within it. The part
+numbers ...
+
+XXX fill in some things here
+
+It is highly recommended that the XXX
+RTEMS application developer obtain and become familiar with the
+documentation for the processor being used as well as the
+documentation for the family as a whole.
+
+@subheading Architecture Documents
+
+IDT docs are online at http://www.idt.com/products/risc/Welcome.html
+
+For information on the XXX architecture,
+refer to the following documents available from VENDOR
+(@file{http//www.XXX.com/}):
+
+@itemize @bullet
+@item @cite{XXX Family Reference, VENDOR, PART NUMBER}.
+@end itemize
+
+@subheading MODEL SPECIFIC DOCUMENTS
+
+For information on specific processor models and
+their associated coprocessors, refer to the following documents:
+
+@itemize @bullet
+@item @cite{XXX MODEL Manual, VENDOR, PART NUMBER}.
+@item @cite{XXX MODEL Manual, VENDOR, PART NUMBER}.
+@end itemize
+
diff --git a/doc/supplements/mips/timeBSP.t b/doc/supplements/mips/timeBSP.t
new file mode 100644
index 0000000000..a00259ec94
--- /dev/null
+++ b/doc/supplements/mips/timeBSP.t
@@ -0,0 +1,112 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@include common/timemac.texi
+@tex
+\global\advance \smallskipamount by -4pt
+@end tex
+
+@chapter BSP_FOR_TIMES Timing Data
+
+@section Introduction
+
+The timing data for the MIPS version of RTEMS is
+provided along with the target dependent aspects concerning the
+gathering of the timing data. The hardware platform used to
+gather the times is described to give the reader a better
+understanding of each directive time provided. Also, provided
+is a description of the interrupt latency and the context switch
+times as they pertain to the MIPS version of RTEMS.
+
+@section Hardware Platform
+
+All times reported except for the maximum period
+interrupts are disabled by RTEMS were measured using a Motorola
+BSP_FOR_TIMES CPU board. The BSP_FOR_TIMES is a RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+Mhz board with one wait
+state dynamic memory and a XXX numeric coprocessor. The
+Zilog 8036 countdown timer on this board was used to measure
+elapsed time with a one-half microsecond resolution. All
+sources of hardware interrupts were disabled, although the
+interrupt level of the XXX allows all interrupts.
+
+The maximum period interrupts are disabled was
+measured by summing the number of CPU cycles required by each
+assembly language instruction executed while interrupts were
+disabled. The worst case times of the XXX microprocessor
+were used for each instruction. Zero wait state memory was
+assumed. The total CPU cycles executed with interrupts
+disabled, including the instructions to disable and enable
+interrupts, was divided by 20 to simulate a RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+Mhz processor. It
+should be noted that the worst case instruction times for the
+XXX assume that the internal cache is disabled and that no
+instructions overlap.
+
+@section Interrupt Latency
+
+The maximum period with interrupts disabled within
+RTEMS is less than RTEMS_MAXIMUM_DISABLE_PERIOD
+microseconds including the instructions
+which disable and re-enable interrupts. The time required for
+the XXX to vector an interrupt and for the RTEMS entry
+overhead before invoking the user's interrupt handler are a
+total of RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK
+microseconds. These combine to yield a worst case
+interrupt latency of less than
+RTEMS_MAXIMUM_DISABLE_PERIOD + RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK
+microseconds at RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+Mhz. [NOTE: The maximum period with interrupts
+disabled was last determined for Release
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD.]
+
+It should be noted again that the maximum period with
+interrupts disabled within RTEMS is hand-timed and based upon
+worst case (i.e. CPU cache disabled and no instruction overlap)
+times for a RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+Mhz processor. The interrupt vector and entry
+overhead time was generated on an BSP_FOR_TIMES benchmark platform
+using the Multiprocessing Communications registers to generate
+as the interrupt source.
+
+@section Context Switch
+
+The RTEMS processor context switch time is RTEMS_NO_FP_CONTEXTS
+microseconds on the BSP_FOR_TIMES benchmark platform when no floating
+point context is saved or restored. Additional execution time
+is required when a TASK_SWITCH user extension is configured.
+The use of the TASK_SWITCH extension is application dependent.
+Thus, its execution time is not considered part of the raw
+context switch time.
+
+Since RTEMS was designed specifically for embedded
+missile applications which are floating point intensive, the
+executive is optimized to avoid unnecessarily saving and
+restoring the state of the numeric coprocessor. The state of
+the numeric coprocessor is only saved when an FLOATING_POINT
+task is dispatched and that task was not the last task to
+utilize the coprocessor. In a system with only one
+FLOATING_POINT task, the state of the numeric coprocessor will
+never be saved or restored. When the first FLOATING_POINT task
+is dispatched, RTEMS does not need to save the current state of
+the numeric coprocessor.
+
+The exact amount of time required to save and restore
+floating point context is dependent which FPU is being
+used as well as the state of the numeric
+coprocessor. These numeric coprocessors define three operating
+states: initialized, idle, and busy. RTEMS places the
+coprocessor in the initialized state when a task is started or
+restarted. Once the task has utilized the coprocessor, it is in
+the idle state when floating point instructions are not
+executing and the busy state when floating point instructions
+are executing. The state of the coprocessor is task specific.
+
+The following table summarizes the context switch
+times for the BSP_FOR_TIMES benchmark platform:
+
diff --git a/doc/supplements/powerpc/.cvsignore b/doc/supplements/powerpc/.cvsignore
new file mode 100644
index 0000000000..5d75eb2bfe
--- /dev/null
+++ b/doc/supplements/powerpc/.cvsignore
@@ -0,0 +1,40 @@
+bsp.texi
+callconv.texi
+cpumodel.texi
+cputable.texi
+fatalerr.texi
+index.html
+intr.t
+intr.texi
+Makefile
+Makefile.in
+mdate-sh
+memmodel.texi
+powerpc
+powerpc-?
+powerpc-??
+powerpc.aux
+powerpc.cp
+powerpc.dvi
+powerpc.fn
+powerpc*.html
+powerpc.ky
+powerpc.log
+powerpc.pdf
+powerpc.pg
+powerpc.ps
+powerpc.toc
+powerpc.tp
+powerpc.vr
+rtems_footer.html
+rtems_header.html
+stamp-vti
+timeDMV177_.t
+timeDMV177.texi
+timePSIM_.t
+timePSIM.texi
+timing.t
+timing.texi
+version.texi
+wksheets.t
+wksheets.texi
diff --git a/doc/supplements/powerpc/ChangeLog b/doc/supplements/powerpc/ChangeLog
new file mode 100644
index 0000000000..9e7df2eec7
--- /dev/null
+++ b/doc/supplements/powerpc/ChangeLog
@@ -0,0 +1,72 @@
+2003-12-12 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-12-11 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-11-26 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Add *.info to CLEANFILES to accomodate
+ automake-1.7f/1.8 breaking building infos.
+
+2003-09-26 Joel Sherrill <joel@OARcorp.com>
+
+ * cpumodel.t: Obsoleting HP PA-RISC port and removing all references.
+
+2003-09-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Merger from rtems-4-6-branch.
+
+2003-09-19 Joel Sherrill <joel@OARcorp.com>
+
+ * powerpc.texi: Merge from branch.
+
+2003-05-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * cpumodel.t: Reflect c/src/exec having moved to cpukit.
+
+2003-01-25 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * powerpc.texi: Set @setfilename powerpc.info.
+
+2003-01-24 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Put GENERATED_FILES into $builddir.
+
+2003-01-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * version.texi: Remove from CVS.
+ * stamp-vti: Remove from CVS.
+ * .cvsignore: Add version.texi.
+ Add stamp-vti.
+ Re-sort.
+
+2003-01-21 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-11-13 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-10-24 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-03-27 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Remove AUTOMAKE_OPTIONS.
+
+2002-01-18 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Require automake-1.5.
+
+2001-01-17 Joel Sherrill <joel@OARcorp.com>
+
+ * .cvsignore: Added rtems_header.html and rtems_footer.html.
+
+2000-08-10 Joel Sherrill <joel@OARcorp.com>
+
+ * ChangeLog: New file.
diff --git a/doc/supplements/powerpc/DMV177_TIMES b/doc/supplements/powerpc/DMV177_TIMES
new file mode 100644
index 0000000000..8f6ff2e3c0
--- /dev/null
+++ b/doc/supplements/powerpc/DMV177_TIMES
@@ -0,0 +1,248 @@
+#
+# PowerPC/603e/PSIM Timing and Size Information
+#
+# $Id$
+#
+
+#
+# CPU Model Information
+#
+RTEMS_BSP DMV177
+RTEMS_CPU_MODEL PPC603e
+#
+# Interrupt Latency
+#
+# NOTE: In general, the text says it is hand-calculated to be
+# RTEMS_MAXIMUM_DISABLE_PERIOD at RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+# Mhz and this was last calculated for Release
+# RTEMS_VERSION_FOR_MAXIMUM_DISABLE_PERIOD.
+#
+RTEMS_MAXIMUM_DISABLE_PERIOD TBD
+RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ 100.0
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD 4.0.0-lmco
+#
+# Context Switch Times
+#
+RTEMS_NO_FP_CONTEXTS 585
+RTEMS_RESTORE_1ST_FP_TASK 730
+RTEMS_SAVE_INIT_RESTORE_INIT 478
+RTEMS_SAVE_IDLE_RESTORE_INIT 825
+RTEMS_SAVE_IDLE_RESTORE_IDLE 478
+#
+# Task Manager Times
+#
+RTEMS_TASK_CREATE_ONLY 2301
+RTEMS_TASK_IDENT_ONLY 2900
+RTEMS_TASK_START_ONLY 794
+RTEMS_TASK_RESTART_CALLING_TASK 1137
+RTEMS_TASK_RESTART_SUSPENDED_RETURNS_TO_CALLER 906
+RTEMS_TASK_RESTART_BLOCKED_RETURNS_TO_CALLER 1102
+RTEMS_TASK_RESTART_READY_RETURNS_TO_CALLER 928
+RTEMS_TASK_RESTART_SUSPENDED_PREEMPTS_CALLER 1483
+RTEMS_TASK_RESTART_BLOCKED_PREEMPTS_CALLER 1640
+RTEMS_TASK_RESTART_READY_PREEMPTS_CALLER 1601
+RTEMS_TASK_DELETE_CALLING_TASK 2117
+RTEMS_TASK_DELETE_SUSPENDED_TASK 1555
+RTEMS_TASK_DELETE_BLOCKED_TASK 1609
+RTEMS_TASK_DELETE_READY_TASK 1620
+RTEMS_TASK_SUSPEND_CALLING_TASK 960
+RTEMS_TASK_SUSPEND_RETURNS_TO_CALLER 433
+RTEMS_TASK_RESUME_TASK_READIED_RETURNS_TO_CALLER 960
+RTEMS_TASK_RESUME_TASK_READIED_PREEMPTS_CALLER 803
+RTEMS_TASK_SET_PRIORITY_OBTAIN_CURRENT_PRIORITY 368
+RTEMS_TASK_SET_PRIORITY_RETURNS_TO_CALLER 633
+RTEMS_TASK_SET_PRIORITY_PREEMPTS_CALLER 1211
+RTEMS_TASK_MODE_OBTAIN_CURRENT_MODE 184
+RTEMS_TASK_MODE_NO_RESCHEDULE 213
+RTEMS_TASK_MODE_RESCHEDULE_RETURNS_TO_CALLER 247
+RTEMS_TASK_MODE_RESCHEDULE_PREEMPTS_CALLER 919
+RTEMS_TASK_GET_NOTE_ONLY 382
+RTEMS_TASK_SET_NOTE_ONLY 383
+RTEMS_TASK_WAKE_AFTER_YIELD_RETURNS_TO_CALLER 245
+RTEMS_TASK_WAKE_AFTER_YIELD_PREEMPTS_CALLER 851
+RTEMS_TASK_WAKE_WHEN_ONLY 1275
+#
+# Interrupt Manager
+#
+RTEMS_INTR_ENTRY_RETURNS_TO_NESTED 201
+RTEMS_INTR_ENTRY_RETURNS_TO_INTERRUPTED_TASK 206
+RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK 202
+RTEMS_INTR_EXIT_RETURNS_TO_NESTED 201
+RTEMS_INTR_EXIT_RETURNS_TO_INTERRUPTED_TASK 213
+RTEMS_INTR_EXIT_RETURNS_TO_PREEMPTING_TASK 857
+#
+# Clock Manager
+#
+RTEMS_CLOCK_SET_ONLY 792
+RTEMS_CLOCK_GET_ONLY 78
+RTEMS_CLOCK_TICK_ONLY 214
+#
+# Timer Manager
+#
+RTEMS_TIMER_CREATE_ONLY 357
+RTEMS_TIMER_IDENT_ONLY 2828
+RTEMS_TIMER_DELETE_INACTIVE 432
+RTEMS_TIMER_DELETE_ACTIVE 471
+RTEMS_TIMER_FIRE_AFTER_INACTIVE 607
+RTEMS_TIMER_FIRE_AFTER_ACTIVE 646
+RTEMS_TIMER_FIRE_WHEN_INACTIVE 766
+RTEMS_TIMER_FIRE_WHEN_ACTIVE 764
+RTEMS_TIMER_RESET_INACTIVE 552
+RTEMS_TIMER_RESET_ACTIVE 766
+RTEMS_TIMER_CANCEL_INACTIVE 339
+RTEMS_TIMER_CANCEL_ACTIVE 378
+#
+# Semaphore Manager
+#
+RTEMS_SEMAPHORE_CREATE_ONLY 571
+RTEMS_SEMAPHORE_IDENT_ONLY 3243
+RTEMS_SEMAPHORE_DELETE_ONLY 575
+RTEMS_SEMAPHORE_OBTAIN_AVAILABLE 414
+RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_NO_WAIT 414
+RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_CALLER_BLOCKS 1254
+RTEMS_SEMAPHORE_RELEASE_NO_WAITING_TASKS 501
+RTEMS_SEMAPHORE_RELEASE_TASK_READIED_RETURNS_TO_CALLER 636
+RTEMS_SEMAPHORE_RELEASE_TASK_READIED_PREEMPTS_CALLER 982
+#
+# Message Manager
+#
+RTEMS_MESSAGE_QUEUE_CREATE_ONLY 2270
+RTEMS_MESSAGE_QUEUE_IDENT_ONLY 2828
+RTEMS_MESSAGE_QUEUE_DELETE_ONLY 708
+RTEMS_MESSAGE_QUEUE_SEND_NO_WAITING_TASKS 923
+RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_RETURNS_TO_CALLER 955
+RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_PREEMPTS_CALLER 1322
+RTEMS_MESSAGE_QUEUE_URGENT_NO_WAITING_TASKS 919
+RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_RETURNS_TO_CALLER 955
+RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_PREEMPTS_CALLER 1322
+RTEMS_MESSAGE_QUEUE_BROADCAST_NO_WAITING_TASKS 589
+RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_RETURNS_TO_CALLER 1079
+RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_PREEMPTS_CALLER 1435
+RTEMS_MESSAGE_QUEUE_RECEIVE_AVAILABLE 755
+RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_NO_WAIT 467
+RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS 1283
+RTEMS_MESSAGE_QUEUE_FLUSH_NO_MESSAGES_FLUSHED 369
+RTEMS_MESSAGE_QUEUE_FLUSH_MESSAGES_FLUSHED 431
+#
+# Event Manager
+#
+RTEMS_EVENT_SEND_NO_TASK_READIED 354
+RTEMS_EVENT_SEND_TASK_READIED_RETURNS_TO_CALLER 571
+RTEMS_EVENT_SEND_TASK_READIED_PREEMPTS_CALLER 946
+RTEMS_EVENT_RECEIVE_OBTAIN_CURRENT_EVENTS 43
+RTEMS_EVENT_RECEIVE_AVAILABLE 357
+RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_NO_WAIT 331
+RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS 1043
+#
+# Signal Manager
+#
+RTEMS_SIGNAL_CATCH_ONLY 267
+RTEMS_SIGNAL_SEND_RETURNS_TO_CALLER 408
+RTEMS_SIGNAL_SEND_SIGNAL_TO_SELF 607
+RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_CALLING_TASK 464
+RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_PREEMPTING_TASK 752
+#
+# Partition Manager
+#
+RTEMS_PARTITION_CREATE_ONLY 762
+RTEMS_PARTITION_IDENT_ONLY 2828
+RTEMS_PARTITION_DELETE_ONLY 426
+RTEMS_PARTITION_GET_BUFFER_AVAILABLE 394
+RTEMS_PARTITION_GET_BUFFER_NOT_AVAILABLE 376
+RTEMS_PARTITION_RETURN_BUFFER_ONLY 420
+#
+# Region Manager
+#
+RTEMS_REGION_CREATE_ONLY 614
+RTEMS_REGION_IDENT_ONLY 2878
+RTEMS_REGION_DELETE_ONLY 425
+RTEMS_REGION_GET_SEGMENT_AVAILABLE 515
+RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_NO_WAIT 472
+RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_CALLER_BLOCKS 1345
+RTEMS_REGION_RETURN_SEGMENT_NO_WAITING_TASKS 544
+RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_RETURNS_TO_CALLER 935
+RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_PREEMPTS_CALLER 1296
+#
+# Dual-Ported Memory Manager
+#
+RTEMS_PORT_CREATE_ONLY 428
+RTEMS_PORT_IDENT_ONLY 2828
+RTEMS_PORT_DELETE_ONLY 421
+RTEMS_PORT_INTERNAL_TO_EXTERNAL_ONLY 339
+RTEMS_PORT_EXTERNAL_TO_INTERNAL_ONLY 339
+#
+# IO Manager
+#
+RTEMS_IO_INITIALIZE_ONLY 52
+RTEMS_IO_OPEN_ONLY 42
+RTEMS_IO_CLOSE_ONLY 44
+RTEMS_IO_READ_ONLY 42
+RTEMS_IO_WRITE_ONLY 44
+RTEMS_IO_CONTROL_ONLY 42
+#
+# Rate Monotonic Manager
+#
+RTEMS_RATE_MONOTONIC_CREATE_ONLY 388
+RTEMS_RATE_MONOTONIC_IDENT_ONLY 2826
+RTEMS_RATE_MONOTONIC_CANCEL_ONLY 427
+RTEMS_RATE_MONOTONIC_DELETE_ACTIVE 519
+RTEMS_RATE_MONOTONIC_DELETE_INACTIVE 465
+RTEMS_RATE_MONOTONIC_PERIOD_INITIATE_PERIOD_RETURNS_TO_CALLER 556
+RTEMS_RATE_MONOTONIC_PERIOD_CONCLUDE_PERIOD_CALLER_BLOCKS 842
+RTEMS_RATE_MONOTONIC_PERIOD_OBTAIN_STATUS 377
+#
+# Size Information
+#
+#
+# xxx alloted for numbers
+#
+RTEMS_DATA_SPACE 428
+RTEMS_MINIMUM_CONFIGURATION 30,980
+RTEMS_MAXIMUM_CONFIGURATION 55540
+# x,xxx alloted for numbers
+RTEMS_CORE_CODE_SIZE 21,516
+RTEMS_INITIALIZATION_CODE_SIZE 1,412
+RTEMS_TASK_CODE_SIZE 4,804
+RTEMS_INTERRUPT_CODE_SIZE 96
+RTEMS_CLOCK_CODE_SIZE 536
+RTEMS_TIMER_CODE_SIZE 1,380
+RTEMS_SEMAPHORE_CODE_SIZE 1,928
+RTEMS_MESSAGE_CODE_SIZE 532
+RTEMS_EVENT_CODE_SIZE 100
+RTEMS_SIGNAL_CODE_SIZE 100
+RTEMS_PARTITION_CODE_SIZE 1,384
+RTEMS_REGION_CODE_SIZE 1,780
+RTEMS_DPMEM_CODE_SIZE 928
+RTEMS_IO_CODE_SIZE 1,244
+RTEMS_FATAL_ERROR_CODE_SIZE 44
+RTEMS_RATE_MONOTONIC_CODE_SIZE 1,756
+RTEMS_MULTIPROCESSING_CODE_SIZE 11,448
+# xxx alloted for numbers
+RTEMS_TIMER_CODE_OPTSIZE 340
+RTEMS_SEMAPHORE_CODE_OPTSIZE 308
+RTEMS_MESSAGE_CODE_OPTSIZE 532
+RTEMS_EVENT_CODE_OPTSIZE 100
+RTEMS_SIGNAL_CODE_OPTSIZE 100
+RTEMS_PARTITION_CODE_OPTSIZE 244
+RTEMS_REGION_CODE_OPTSIZE 292
+RTEMS_DPMEM_CODE_OPTSIZE 244
+RTEMS_IO_CODE_OPTSIZE NA
+RTEMS_RATE_MONOTONIC_CODE_OPTSIZE 336
+RTEMS_MULTIPROCESSING_CODE_OPTSIZE 612
+# xxx alloted for numbers
+RTEMS_BYTES_PER_TASK 456
+RTEMS_BYTES_PER_TIMER 68
+RTEMS_BYTES_PER_SEMAPHORE 120
+RTEMS_BYTES_PER_MESSAGE_QUEUE 144
+RTEMS_BYTES_PER_REGION 140
+RTEMS_BYTES_PER_PARTITION 56
+RTEMS_BYTES_PER_PORT 36
+RTEMS_BYTES_PER_PERIOD 36
+RTEMS_BYTES_PER_EXTENSION 64
+RTEMS_BYTES_PER_FP_TASK 264
+RTEMS_BYTES_PER_NODE 48
+RTEMS_BYTES_PER_GLOBAL_OBJECT 20
+RTEMS_BYTES_PER_PROXY 124
+# x,xxx alloted for numbers
+RTEMS_BYTES_OF_FIXED_SYSTEM_REQUIREMENTS 10008
+
diff --git a/doc/supplements/powerpc/Makefile.am b/doc/supplements/powerpc/Makefile.am
new file mode 100644
index 0000000000..3dcdf95c6f
--- /dev/null
+++ b/doc/supplements/powerpc/Makefile.am
@@ -0,0 +1,125 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = powerpc
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/supplements/supplement.am
+
+GENERATED_FILES = cpumodel.texi callconv.texi memmodel.texi intr.texi \
+ fatalerr.texi bsp.texi cputable.texi timing.texi wksheets.texi \
+ timePSIM.texi timeDMV177.texi
+COMMON_FILES += $(top_srcdir)/common/cpright.texi \
+ $(top_srcdir)/common/timemac.texi
+
+FILES = preface.texi
+
+info_TEXINFOS = powerpc.texi
+powerpc_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+#
+# Chapters which get automatic processing
+#
+
+cpumodel.texi: cpumodel.t
+ $(BMENU2) -p "Preface" \
+ -u "Top" \
+ -n "Calling Conventions" < $< > $@
+
+callconv.texi: callconv.t
+ $(BMENU2) -p "CPU Model Dependent Features Low Power Model" \
+ -u "Top" \
+ -n "Memory Model" < $< > $@
+
+memmodel.texi: memmodel.t
+ $(BMENU2) -p "Calling Conventions User-Provided Routines" \
+ -u "Top" \
+ -n "Interrupt Processing" < $< > $@
+
+# Interrupt Chapter:
+# 1. Replace Times and Sizes
+# 2. Build Node Structure
+intr.texi: intr_NOTIMES.t PSIM_TIMES
+ ${REPLACE2} -p $(srcdir)/PSIM_TIMES $(srcdir)/intr_NOTIMES.t | \
+ $(BMENU2) -p "Memory Model Flat Memory Model" \
+ -u "Top" \
+ -n "Default Fatal Error Processing" > $@
+
+fatalerr.texi: fatalerr.t
+ $(BMENU2) -p "Interrupt Processing Interrupt Stack" \
+ -u "Top" \
+ -n "Board Support Packages" < $< > $@
+
+bsp.texi: bsp.t
+ $(BMENU2) -p "Default Fatal Error Processing Default Fatal Error Handler Operations" \
+ -u "Top" \
+ -n "Processor Dependent Information Table" < $< > $@
+
+cputable.texi: cputable.t
+ $(BMENU2) -p "Board Support Packages Processor Initialization" \
+ -u "Top" \
+ -n "Memory Requirements" < $< > $@
+
+# Worksheets Chapter:
+# 1. Obtain the Shared File
+# 2. Replace Times and Sizes
+# 3. Build Node Structure
+
+wksheets.texi: $(top_srcdir)/common/wksheets.t PSIM_TIMES
+ ${REPLACE2} -p $(srcdir)/PSIM_TIMES \
+ $(top_srcdir)/common/wksheets.t | \
+ $(BMENU2) -p "Processor Dependent Information Table CPU Dependent Information Table" \
+ -u "Top" \
+ -n "Timing Specification" > $@
+
+# Timing Specification Chapter:
+# 1. Copy the Shared File
+# 3. Build Node Structure
+timing.texi: $(top_srcdir)/common/timing.t
+ $(BMENU2) -p "Memory Requirements RTEMS RAM Workspace Worksheet" \
+ -u "Top" \
+ -n "PSIM Timing Data" < $< > $@
+
+# Timing Data for PSIM BSP Chapter:
+# 1. Copy the Shared File
+# 2. Replace Times and Sizes
+# 3. Build Node Structure
+
+timePSIM.texi: $(top_srcdir)/common/timetbl.t timePSIM.t
+ cat $(srcdir)/timePSIM.t $(top_srcdir)/common/timetbl.t >timePSIM_.t
+ @echo >>timePSIM_.t
+ @echo "@tex" >>timePSIM_.t
+ @echo "\\global\\advance \\smallskipamount by 4pt" >>timePSIM_.t
+ @echo "@end tex" >>timePSIM_.t
+ ${REPLACE2} -p $(srcdir)/PSIM_TIMES timePSIM_.t | \
+ $(BMENU2) -p "Timing Specification Terminology" \
+ -u "Top" \
+ -n "DMV177 Timing Data" > $@
+CLEANFILES += timePSIM_.t timeDMV177_.t
+
+# Timing Data for DMV177 BSP Chapter:
+# 1. Copy the Shared File
+# 2. Replace Times and Sizes
+# 3. Build Node Structure
+
+timeDMV177.texi: $(top_srcdir)/common/timetbl.t timeDMV177.t
+ cat $(srcdir)/timeDMV177.t $(top_srcdir)/common/timetbl.t >timeDMV177_.t
+ @echo >>timeDMV177_.t
+ @echo "@tex" >>timeDMV177_.t
+ @echo "\\global\\advance \\smallskipamount by 4pt" >>timeDMV177_.t
+ @echo "@end tex" >>timeDMV177_.t
+ ${REPLACE2} -p $(srcdir)/DMV177_TIMES timeDMV177_.t | \
+ $(BMENU2) -p "PSIM Timing Data Rate Monotonic Manager" \
+ -u "Top" \
+ -n "Command and Variable Index" > $@
+
+EXTRA_DIST = DMV177_TIMES PSIM_TIMES bsp.t callconv.t cpumodel.t cputable.t \
+ fatalerr.t intr_NOTIMES.t memmodel.t timeDMV177.t timePSIM.t
+
+CLEANFILES += powerpc.info powerpc.info-?
diff --git a/doc/supplements/powerpc/PSIM_TIMES b/doc/supplements/powerpc/PSIM_TIMES
new file mode 100644
index 0000000000..b357a1fc3c
--- /dev/null
+++ b/doc/supplements/powerpc/PSIM_TIMES
@@ -0,0 +1,248 @@
+#
+# PowerPC/603e/PSIM Timing and Size Information
+#
+# $Id$
+#
+
+#
+# CPU Model Information
+#
+RTEMS_BSP PSIM
+RTEMS_CPU_MODEL PPC603e
+#
+# Interrupt Latency
+#
+# NOTE: In general, the text says it is hand-calculated to be
+# RTEMS_MAXIMUM_DISABLE_PERIOD at RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+# Mhz and this was last calculated for Release
+# RTEMS_VERSION_FOR_MAXIMUM_DISABLE_PERIOD.
+#
+RTEMS_MAXIMUM_DISABLE_PERIOD TBD
+RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ na
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD 4.0.0-lmco
+#
+# Context Switch Times
+#
+RTEMS_NO_FP_CONTEXTS 214
+RTEMS_RESTORE_1ST_FP_TASK 255
+RTEMS_SAVE_INIT_RESTORE_INIT 140
+RTEMS_SAVE_IDLE_RESTORE_INIT 140
+RTEMS_SAVE_IDLE_RESTORE_IDLE 290
+#
+# Task Manager Times
+#
+RTEMS_TASK_CREATE_ONLY 1075
+RTEMS_TASK_IDENT_ONLY 1637
+RTEMS_TASK_START_ONLY 345
+RTEMS_TASK_RESTART_CALLING_TASK 483
+RTEMS_TASK_RESTART_SUSPENDED_RETURNS_TO_CALLER 396
+RTEMS_TASK_RESTART_BLOCKED_RETURNS_TO_CALLER 491
+RTEMS_TASK_RESTART_READY_RETURNS_TO_CALLER 404
+RTEMS_TASK_RESTART_SUSPENDED_PREEMPTS_CALLER 644
+RTEMS_TASK_RESTART_BLOCKED_PREEMPTS_CALLER 709
+RTEMS_TASK_RESTART_READY_PREEMPTS_CALLER 686
+RTEMS_TASK_DELETE_CALLING_TASK 941
+RTEMS_TASK_DELETE_SUSPENDED_TASK 703
+RTEMS_TASK_DELETE_BLOCKED_TASK 723
+RTEMS_TASK_DELETE_READY_TASK 729
+RTEMS_TASK_SUSPEND_CALLING_TASK 403
+RTEMS_TASK_SUSPEND_RETURNS_TO_CALLER 181
+RTEMS_TASK_RESUME_TASK_READIED_RETURNS_TO_CALLER 191
+RTEMS_TASK_RESUME_TASK_READIED_PREEMPTS_CALLER 803
+RTEMS_TASK_SET_PRIORITY_OBTAIN_CURRENT_PRIORITY 147
+RTEMS_TASK_SET_PRIORITY_RETURNS_TO_CALLER 264
+RTEMS_TASK_SET_PRIORITY_PREEMPTS_CALLER 517
+RTEMS_TASK_MODE_OBTAIN_CURRENT_MODE 88
+RTEMS_TASK_MODE_NO_RESCHEDULE 110
+RTEMS_TASK_MODE_RESCHEDULE_RETURNS_TO_CALLER 112
+RTEMS_TASK_MODE_RESCHEDULE_PREEMPTS_CALLER 386
+RTEMS_TASK_GET_NOTE_ONLY 156
+RTEMS_TASK_SET_NOTE_ONLY 155
+RTEMS_TASK_WAKE_AFTER_YIELD_RETURNS_TO_CALLER 92
+RTEMS_TASK_WAKE_AFTER_YIELD_PREEMPTS_CALLER 348
+RTEMS_TASK_WAKE_WHEN_ONLY 546
+#
+# Interrupt Manager
+#
+RTEMS_INTR_ENTRY_RETURNS_TO_NESTED 60
+RTEMS_INTR_ENTRY_RETURNS_TO_INTERRUPTED_TASK 62
+RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK 61
+RTEMS_INTR_EXIT_RETURNS_TO_NESTED 55
+RTEMS_INTR_EXIT_RETURNS_TO_INTERRUPTED_TASK 67
+RTEMS_INTR_EXIT_RETURNS_TO_PREEMPTING_TASK 344
+#
+# Clock Manager
+#
+RTEMS_CLOCK_SET_ONLY 340
+RTEMS_CLOCK_GET_ONLY 29
+RTEMS_CLOCK_TICK_ONLY 81
+#
+# Timer Manager
+#
+RTEMS_TIMER_CREATE_ONLY 144
+RTEMS_TIMER_IDENT_ONLY 1595
+RTEMS_TIMER_DELETE_INACTIVE 197
+RTEMS_TIMER_DELETE_ACTIVE 181
+RTEMS_TIMER_FIRE_AFTER_INACTIVE 252
+RTEMS_TIMER_FIRE_AFTER_ACTIVE 269
+RTEMS_TIMER_FIRE_WHEN_INACTIVE 333
+RTEMS_TIMER_FIRE_WHEN_ACTIVE 334
+RTEMS_TIMER_RESET_INACTIVE 233
+RTEMS_TIMER_RESET_ACTIVE 250
+RTEMS_TIMER_CANCEL_INACTIVE 156
+RTEMS_TIMER_CANCEL_ACTIVE 140
+#
+# Semaphore Manager
+#
+RTEMS_SEMAPHORE_CREATE_ONLY 223
+RTEMS_SEMAPHORE_IDENT_ONLY 1836
+RTEMS_SEMAPHORE_DELETE_ONLY 1836
+RTEMS_SEMAPHORE_OBTAIN_AVAILABLE 175
+RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_NO_WAIT 175
+RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_CALLER_BLOCKS 530
+RTEMS_SEMAPHORE_RELEASE_NO_WAITING_TASKS 206
+RTEMS_SEMAPHORE_RELEASE_TASK_READIED_RETURNS_TO_CALLER 272
+RTEMS_SEMAPHORE_RELEASE_TASK_READIED_PREEMPTS_CALLER 415
+#
+# Message Manager
+#
+RTEMS_MESSAGE_QUEUE_CREATE_ONLY 1022
+RTEMS_MESSAGE_QUEUE_IDENT_ONLY 1596
+RTEMS_MESSAGE_QUEUE_DELETE_ONLY 308
+RTEMS_MESSAGE_QUEUE_SEND_NO_WAITING_TASKS 421
+RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_RETURNS_TO_CALLER 434
+RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_PREEMPTS_CALLER 581
+RTEMS_MESSAGE_QUEUE_URGENT_NO_WAITING_TASKS 422
+RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_RETURNS_TO_CALLER 435
+RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_PREEMPTS_CALLER 582
+RTEMS_MESSAGE_QUEUE_BROADCAST_NO_WAITING_TASKS 244
+RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_RETURNS_TO_CALLER 482
+RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_PREEMPTS_CALLER 630
+RTEMS_MESSAGE_QUEUE_RECEIVE_AVAILABLE 345
+RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_NO_WAIT 197
+RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS 542
+RTEMS_MESSAGE_QUEUE_FLUSH_NO_MESSAGES_FLUSHED 142
+RTEMS_MESSAGE_QUEUE_FLUSH_MESSAGES_FLUSHED 170
+#
+# Event Manager
+#
+RTEMS_EVENT_SEND_NO_TASK_READIED 145
+RTEMS_EVENT_SEND_TASK_READIED_RETURNS_TO_CALLER 250
+RTEMS_EVENT_SEND_TASK_READIED_PREEMPTS_CALLER 407
+RTEMS_EVENT_RECEIVE_OBTAIN_CURRENT_EVENTS 17
+RTEMS_EVENT_RECEIVE_AVAILABLE 133
+RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_NO_WAIT 130
+RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS 442
+#
+# Signal Manager
+#
+RTEMS_SIGNAL_CATCH_ONLY 95
+RTEMS_SIGNAL_SEND_RETURNS_TO_CALLER 165
+RTEMS_SIGNAL_SEND_SIGNAL_TO_SELF 275
+RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_CALLING_TASK 216
+RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_PREEMPTING_TASK 329
+#
+# Partition Manager
+#
+RTEMS_PARTITION_CREATE_ONLY 320
+RTEMS_PARTITION_IDENT_ONLY 1596
+RTEMS_PARTITION_DELETE_ONLY 168
+RTEMS_PARTITION_GET_BUFFER_AVAILABLE 157
+RTEMS_PARTITION_GET_BUFFER_NOT_AVAILABLE 149
+RTEMS_PARTITION_RETURN_BUFFER_ONLY 172
+#
+# Region Manager
+#
+RTEMS_REGION_CREATE_ONLY 239
+RTEMS_REGION_IDENT_ONLY 1625
+RTEMS_REGION_DELETE_ONLY 167
+RTEMS_REGION_GET_SEGMENT_AVAILABLE 206
+RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_NO_WAIT 190
+RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_CALLER_BLOCKS 556
+RTEMS_REGION_RETURN_SEGMENT_NO_WAITING_TASKS 230
+RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_RETURNS_TO_CALLER 412
+RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_PREEMPTS_CALLER 562
+#
+# Dual-Ported Memory Manager
+#
+RTEMS_PORT_CREATE_ONLY 167
+RTEMS_PORT_IDENT_ONLY 1594
+RTEMS_PORT_DELETE_ONLY 165
+RTEMS_PORT_INTERNAL_TO_EXTERNAL_ONLY 133
+RTEMS_PORT_EXTERNAL_TO_INTERNAL_ONLY 134
+#
+# IO Manager
+#
+RTEMS_IO_INITIALIZE_ONLY 23
+RTEMS_IO_OPEN_ONLY 18
+RTEMS_IO_CLOSE_ONLY 18
+RTEMS_IO_READ_ONLY 18
+RTEMS_IO_WRITE_ONLY 18
+RTEMS_IO_CONTROL_ONLY 18
+#
+# Rate Monotonic Manager
+#
+RTEMS_RATE_MONOTONIC_CREATE_ONLY 149
+RTEMS_RATE_MONOTONIC_IDENT_ONLY 1595
+RTEMS_RATE_MONOTONIC_CANCEL_ONLY 169
+RTEMS_RATE_MONOTONIC_DELETE_ACTIVE 212
+RTEMS_RATE_MONOTONIC_DELETE_INACTIVE 186
+RTEMS_RATE_MONOTONIC_PERIOD_INITIATE_PERIOD_RETURNS_TO_CALLER 226
+RTEMS_RATE_MONOTONIC_PERIOD_CONCLUDE_PERIOD_CALLER_BLOCKS 362
+RTEMS_RATE_MONOTONIC_PERIOD_OBTAIN_STATUS 142
+#
+# Size Information
+#
+#
+# xxx alloted for numbers
+#
+RTEMS_DATA_SPACE 428
+RTEMS_MINIMUM_CONFIGURATION 30,912
+RTEMS_MAXIMUM_CONFIGURATION 55,572
+# x,xxx alloted for numbers
+RTEMS_CORE_CODE_SIZE 21,452
+RTEMS_INITIALIZATION_CODE_SIZE 1,408
+RTEMS_TASK_CODE_SIZE 4,804
+RTEMS_INTERRUPT_CODE_SIZE 96
+RTEMS_CLOCK_CODE_SIZE 536
+RTEMS_TIMER_CODE_SIZE 1,380
+RTEMS_SEMAPHORE_CODE_SIZE 1,928
+RTEMS_MESSAGE_CODE_SIZE 2,400
+RTEMS_EVENT_CODE_SIZE 1,460
+RTEMS_SIGNAL_CODE_SIZE 576
+RTEMS_PARTITION_CODE_SIZE 1,384
+RTEMS_REGION_CODE_SIZE 1,780
+RTEMS_DPMEM_CODE_SIZE 928
+RTEMS_IO_CODE_SIZE 1,244
+RTEMS_FATAL_ERROR_CODE_SIZE 44
+RTEMS_RATE_MONOTONIC_CODE_SIZE 1,756
+RTEMS_MULTIPROCESSING_CODE_SIZE 11,448
+# xxx alloted for numbers
+RTEMS_TIMER_CODE_OPTSIZE 340
+RTEMS_SEMAPHORE_CODE_OPTSIZE 308
+RTEMS_MESSAGE_CODE_OPTSIZE 532
+RTEMS_EVENT_CODE_OPTSIZE 100
+RTEMS_SIGNAL_CODE_OPTSIZE 100
+RTEMS_PARTITION_CODE_OPTSIZE 244
+RTEMS_REGION_CODE_OPTSIZE 292
+RTEMS_DPMEM_CODE_OPTSIZE 244
+RTEMS_IO_CODE_OPTSIZE NA
+RTEMS_RATE_MONOTONIC_CODE_OPTSIZE 336
+RTEMS_MULTIPROCESSING_CODE_OPTSIZE 612
+# xxx alloted for numbers
+RTEMS_BYTES_PER_TASK 456
+RTEMS_BYTES_PER_TIMER 68
+RTEMS_BYTES_PER_SEMAPHORE 120
+RTEMS_BYTES_PER_MESSAGE_QUEUE 144
+RTEMS_BYTES_PER_REGION 140
+RTEMS_BYTES_PER_PARTITION 56
+RTEMS_BYTES_PER_PORT 36
+RTEMS_BYTES_PER_PERIOD 36
+RTEMS_BYTES_PER_EXTENSION 64
+RTEMS_BYTES_PER_FP_TASK 264
+RTEMS_BYTES_PER_NODE 48
+RTEMS_BYTES_PER_GLOBAL_OBJECT 20
+RTEMS_BYTES_PER_PROXY 124
+# x,xxx alloted for numbers
+RTEMS_BYTES_OF_FIXED_SYSTEM_REQUIREMENTS 10,008
+
diff --git a/doc/supplements/powerpc/bsp.t b/doc/supplements/powerpc/bsp.t
new file mode 100644
index 0000000000..cf71029fa6
--- /dev/null
+++ b/doc/supplements/powerpc/bsp.t
@@ -0,0 +1,76 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Board Support Packages
+
+@section Introduction
+
+An RTEMS Board Support Package (BSP) must be designed
+to support a particular processor and target board combination.
+This chapter presents a discussion of PowerPC specific BSP issues.
+For more information on developing a BSP, refer to the chapter
+titled Board Support Packages in the RTEMS
+Applications User's Guide.
+
+@section System Reset
+
+An RTEMS based application is initiated or
+re-initiated when the PowerPC processor is reset. The PowerPC
+architecture defines a Reset Exception, but leaves the
+details of the CPU state as implementation specific. Please
+refer to the User's Manual for the CPU model in question.
+
+In general, at power-up the PowerPC begin execution at address
+0xFFF00100 in supervisor mode with all exceptions disabled. For
+soft resets, the CPU will vector to either 0xFFF00100 or 0x00000100
+depending upon the setting of the Exception Prefix bit in the MSR.
+If during a soft reset, a Machine Check Exception occurs, then the
+CPU may execute a hard reset.
+
+@section Processor Initialization
+
+It is the responsibility of the application's
+initialization code to initialize the CPU and board
+to a quiescent state before invoking the @code{rtems_initialize_executive}
+directive. It is recommended that the BSP utilize the @code{predriver_hook}
+to install default handlers for all exceptions. These default handlers
+may be overwritten as various device drivers and subsystems install
+their own exception handlers. Upon completion of RTEMS executive
+initialization, all interrupts are enabled.
+
+If this PowerPC implementation supports on-chip caching
+and this is to be utilized, then it should be enabled during the
+reset application initialization code. On-chip caching has been
+observed to prevent some emulators from working properly, so it
+may be necessary to run with caching disabled to use these emulators.
+
+In addition to the requirements described in the
+@b{Board Support Packages} chapter of the @b{@value{LANGUAGE}
+Applications User's Manual} for the reset code
+which is executed before the call to @code{rtems_initialize_executive},
+the PowrePC version has the following specific requirements:
+
+@itemize @bullet
+@item Must leave the PR bit of the Machine State Register (MSR) set
+to 0 so the PowerPC remains in the supervisor state.
+
+@item Must set stack pointer (sp or r1) such that a minimum stack
+size of MINIMUM_STACK_SIZE bytes is provided for the
+@code{rtems_initialize_executive} directive.
+
+@item Must disable all external interrupts (i.e. clear the EI (EE)
+bit of the machine state register).
+
+@item Must enable traps so window overflow and underflow
+conditions can be properly handled.
+
+@item Must initialize the PowerPC's initial Exception Table with default
+handlers.
+
+@end itemize
+
diff --git a/doc/supplements/powerpc/callconv.t b/doc/supplements/powerpc/callconv.t
new file mode 100644
index 0000000000..7722589058
--- /dev/null
+++ b/doc/supplements/powerpc/callconv.t
@@ -0,0 +1,229 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Calling Conventions
+
+@section Introduction
+
+Each high-level language compiler generates
+subroutine entry and exit code based upon a set of rules known
+as the compiler's calling convention. These rules address the
+following issues:
+
+@itemize @bullet
+@item register preservation and usage
+
+@item parameter passing
+
+@item call and return mechanism
+@end itemize
+
+A compiler's calling convention is of importance when
+interfacing to subroutines written in another language either
+assembly or high-level. Even when the high-level language and
+target processor are the same, different compilers may use
+different calling conventions. As a result, calling conventions
+are both processor and compiler dependent.
+
+RTEMS supports the Embedded Application Binary Interface (EABI)
+calling convention. Documentation for EABI is available by sending
+a message with a subject line of "EABI" to eabi@@goth.sis.mot.com.
+
+@section Programming Model
+
+This section discusses the programming model for the
+PowerPC architecture.
+
+@subsection Non-Floating Point Registers
+
+The PowerPC architecture defines thirty-two non-floating point registers
+directly visible to the programmer. In thirty-two bit implementations, each
+register is thirty-two bits wide. In sixty-four bit implementations, each
+register is sixty-four bits wide.
+
+These registers are referred to as @code{gpr0} to @code{gpr31}.
+
+Some of the registers serve defined roles in the EABI programming model.
+The following table describes the role of each of these registers:
+
+@ifset use-ascii
+@example
+@group
+ +---------------+----------------+------------------------------+
+ | Register Name | Alternate Name | Description |
+ +---------------+----------------+------------------------------+
+ | r1 | sp | stack pointer |
+ +---------------+----------------+------------------------------+
+ | | | global pointer to the Small |
+ | r2 | na | Constant Area (SDA2) |
+ +---------------+----------------+------------------------------+
+ | r3 - r12 | na | parameter and result passing |
+ +---------------+----------------+------------------------------+
+ | | | global pointer to the Small |
+ | r13 | na | Data Area (SDA) |
+ +---------------+----------------+------------------------------+
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@sp 1
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\vrule\strut#&
+\hbox to 1.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 1.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 2.50in{\enskip\hfil#\hfil}&
+\vrule#\cr
+\noalign{\hrule}
+&\bf Register Name &&\bf Alternate Names&&\bf Description&\cr\noalign{\hrule}
+&r1&&sp&&stack pointer&\cr\noalign{\hrule}
+&r2&&NA&&global pointer to the Small&\cr
+&&&&&Constant Area (SDA2)&\cr\noalign{\hrule}
+&r3 - r12&&NA&&parameter and result passing&\cr\noalign{\hrule}
+&r13&&NA&&global pointer to the Small&\cr
+&&&&&Data Area (SDA2)&\cr\noalign{\hrule}
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=3 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=center><STRONG>Register Name</STRONG></TD>
+ <TD ALIGN=center><STRONG>Alternate Name</STRONG></TD>
+ <TD ALIGN=center><STRONG>Description</STRONG></TD></TR>
+<TR><TD ALIGN=center>r1</TD>
+ <TD ALIGN=center>sp</TD>
+ <TD ALIGN=center>stack pointer</TD></TR>
+<TR><TD ALIGN=center>r2</TD>
+ <TD ALIGN=center>na</TD>
+ <TD ALIGN=center>global pointer to the Small Constant Area (SDA2)</TD></TR>
+<TR><TD ALIGN=center>r3 - r12</TD>
+ <TD ALIGN=center>NA</TD>
+ <TD ALIGN=center>parameter and result passing</TD></TR>
+<TR><TD ALIGN=center>r13</TD>
+ <TD ALIGN=center>NA</TD>
+ <TD ALIGN=center>global pointer to the Small Data Area (SDA)</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+
+@subsection Floating Point Registers
+
+The PowerPC architecture includes thirty-two, sixty-four bit
+floating point registers. All PowerPC floating point instructions
+interpret these registers as 32 double precision floating point registers,
+regardless of whether the processor has 64-bit or 32-bit implementation.
+
+The floating point status and control register (fpscr) records exceptions
+and the type of result generated by floating-point operations.
+Additionally, it controls the rounding mode of operations and allows the
+reporting of floating exceptions to be enabled or disabled.
+
+@subsection Special Registers
+
+The PowerPC architecture includes a number of special registers
+which are critical to the programming model:
+
+@table @b
+
+@item Machine State Register
+
+The MSR contains the processor mode, power management mode, endian mode,
+exception information, privilege level, floating point available and
+floating point excepiton mode, address translation information and
+the exception prefix.
+
+@item Link Register
+
+The LR contains the return address after a function call. This register
+must be saved before a subsequent subroutine call can be made. The
+use of this register is discussed further in the @b{Call and Return
+Mechanism} section below.
+
+@item Count Register
+
+The CTR contains the iteration variable for some loops. It may also be used
+for indirect function calls and jumps.
+
+@end table
+
+@section Call and Return Mechanism
+
+The PowerPC architecture supports a simple yet effective call
+and return mechanism. A subroutine is invoked
+via the "branch and link" (@code{bl}) and
+"brank and link absolute" (@code{bla})
+instructions. This instructions place the return address
+in the Link Register (LR). The callee returns to the caller by
+executing a "branch unconditional to the link register" (@code{blr})
+instruction. Thus the callee returns to the caller via a jump
+to the return address which is stored in the LR.
+
+The previous contents of the LR are not automatically saved
+by either the @code{bl} or @code{bla}. It is the responsibility
+of the callee to save the contents of the LR before invoking
+another subroutine. If the callee invokes another subroutine,
+it must restore the LR before executing the @code{blr} instruction
+to return to the caller.
+
+It is important to note that the PowerPC subroutine
+call and return mechanism does not automatically save and
+restore any registers.
+
+The LR may be accessed as special purpose register 8 (@code{SPR8}) using the
+"move from special register" (@code{mfspr}) and
+"move to special register" (@code{mtspr}) instructions.
+
+@section Calling Mechanism
+
+All RTEMS directives are invoked using the regular
+PowerPC EABI calling convention via the @code{bl} or
+@code{bla} instructions.
+
+@section Register Usage
+
+As discussed above, the call instruction does not
+automatically save any registers. It is the responsibility
+of the callee to save and restore any registers which must be preserved
+across subroutine calls. The callee is responsible for saving
+callee-preserved registers to the program stack and restoring them
+before returning to the caller.
+
+@section Parameter Passing
+
+RTEMS assumes that arguments are placed in the
+general purpose registers with the first argument in
+register 3 (@code{r3}), the second argument in general purpose
+register 4 (@code{r4}), and so forth until the seventh
+argument is in general purpose register 10 (@code{r10}).
+If there are more than seven arguments, then subsequent arguments
+are placed on the program stack. The following pseudo-code
+illustrates the typical sequence used to call a RTEMS directive
+with three (3) arguments:
+
+@example
+load third argument into r5
+load second argument into r4
+load first argument into r3
+invoke directive
+@end example
+
+@section User-Provided Routines
+
+All user-provided routines invoked by RTEMS, such as
+user extensions, device drivers, and MPCI routines, must also
+adhere to these same calling conventions.
+
+
diff --git a/doc/supplements/powerpc/cpumodel.t b/doc/supplements/powerpc/cpumodel.t
new file mode 100644
index 0000000000..3173dc15f0
--- /dev/null
+++ b/doc/supplements/powerpc/cpumodel.t
@@ -0,0 +1,156 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter CPU Model Dependent Features
+
+@section Introduction
+
+Microprocessors are generally classified into
+families with a variety of CPU models or implementations within
+that family. Within a processor family, there is a high level
+of binary compatibility. This family may be based on either an
+architectural specification or on maintaining compatibility with
+a popular processor. Recent microprocessor families such as the
+SPARC, and PowerPC are based on an architectural specification
+which is independent or any particular CPU model or
+implementation. Older families such as the M68xxx and the iX86
+evolved as the manufacturer strived to produce higher
+performance processor models which maintained binary
+compatibility with older models.
+
+RTEMS takes advantage of the similarity of the
+various models within a CPU family. Although the models do vary
+in significant ways, the high level of compatibility makes it
+possible to share the bulk of the CPU dependent executive code
+across the entire family.
+
+@section CPU Model Feature Flags
+
+Each processor family supported by RTEMS has a
+list of features which vary between CPU models
+within a family. For example, the most common model dependent
+feature regardless of CPU family is the presence or absence of a
+floating point unit or coprocessor. When defining the list of
+features present on a particular CPU model, one simply notes
+that floating point hardware is or is not present and defines a
+single constant appropriately. Conditional compilation is
+utilized to include the appropriate source code for this CPU
+model's feature set. It is important to note that this means
+that RTEMS is thus compiled using the appropriate feature set
+and compilation flags optimal for this CPU model used. The
+alternative would be to generate a binary which would execute on
+all family members using only the features which were always
+present.
+
+This section presents the set of features which vary
+across PowerPC implementations and are of importance to RTEMS.
+The set of CPU model feature macros are defined in the file
+cpukit/score/cpu/ppc/ppc.h based upon the particular CPU
+model defined on the compilation command line.
+
+@subsection CPU Model Name
+
+The macro CPU_MODEL_NAME is a string which designates
+the name of this CPU model. For example, for the PowerPC 603e
+model, this macro is set to the string "PowerPC 603e".
+
+@subsection Floating Point Unit
+
+The macro PPC_HAS_FPU is set to 1 to indicate that this CPU model
+has a hardware floating point unit and 0 otherwise.
+
+@subsection Alignment
+
+The macro PPC_ALIGNMENT is set to the PowerPC model's worst case alignment
+requirement for data types on a byte boundary. This value is used
+to derive the alignment restrictions for memory allocated from
+regions and partitions.
+
+@subsection Cache Alignment
+
+The macro PPC_CACHE_ALIGNMENT is set to the line size of the cache. It is
+used to align the entry point of critical routines so that as much code
+as possible can be retrieved with the initial read into cache. This
+is done for the interrupt handler as well as the context switch routines.
+
+In addition, the "shortcut" data structure used by the PowerPC implementation
+to ease access to data elements frequently accessed by RTEMS routines
+implemented in assembly language is aligned using this value.
+
+@subsection Maximum Interrupts
+
+The macro PPC_INTERRUPT_MAX is set to the number of exception sources
+supported by this PowerPC model.
+
+@subsection Has Double Precision Floating Point
+
+The macro PPC_HAS_DOUBLE is set to 1 to indicate that the PowerPC model
+has support for double precision floating point numbers. This is
+important because the floating point registers need only be four bytes
+wide (not eight) if double precision is not supported.
+
+@subsection Critical Interrupts
+
+The macro PPC_HAS_RFCI is set to 1 to indicate that the PowerPC model
+has the Critical Interrupt capability as defined by the IBM 403 models.
+
+@subsection Use Multiword Load/Store Instructions
+
+The macro PPC_USE_MULTIPLE is set to 1 to indicate that multiword load and
+store instructions should be used to perform context switch operations.
+The relative efficiency of multiword load and store instructions versus
+an equivalent set of single word load and store instructions varies based
+upon the PowerPC model.
+
+@subsection Instruction Cache Size
+
+The macro PPC_I_CACHE is set to the size in bytes of the instruction cache.
+
+@subsection Data Cache Size
+
+The macro PPC_D_CACHE is set to the size in bytes of the data cache.
+
+@subsection Debug Model
+
+The macro PPC_DEBUG_MODEL is set to indicate the debug support features
+present in this CPU model. The following debug support feature sets
+are currently supported:
+
+@table @b
+
+@item @code{PPC_DEBUG_MODEL_STANDARD}
+indicates that the single-step trace enable (SE) and branch trace
+enable (BE) bits in the MSR are supported by this CPU model.
+
+@item @code{PPC_DEBUG_MODEL_SINGLE_STEP_ONLY}
+indicates that only the single-step trace enable (SE) bit in the MSR
+is supported by this CPU model.
+
+@item @code{PPC_DEBUG_MODEL_IBM4xx}
+indicates that the debug exception enable (DE) bit in the MSR is supported
+by this CPU model. At this time, this particular debug feature set
+has only been seen in the IBM 4xx series.
+
+@end table
+
+@subsection Low Power Model
+
+The macro PPC_LOW_POWER_MODE is set to indicate the low power model
+supported by this CPU model. The following low power modes are currently
+supported.
+
+@table @b
+
+@item @code{PPC_LOW_POWER_MODE_NONE}
+indicates that this CPU model has no low power mode support.
+
+@item @code{PPC_LOW_POWER_MODE_STANDARD}
+indicates that this CPU model follows the low power model defined for
+the PPC603e.
+
+@end table
diff --git a/doc/supplements/powerpc/cputable.t b/doc/supplements/powerpc/cputable.t
new file mode 100644
index 0000000000..42f67b1a70
--- /dev/null
+++ b/doc/supplements/powerpc/cputable.t
@@ -0,0 +1,155 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Processor Dependent Information Table
+
+@section Introduction
+
+Any highly processor dependent information required
+to describe a processor to RTEMS is provided in the CPU
+Dependent Information Table. This table is not required for all
+processors supported by RTEMS. This chapter describes the
+contents, if any, for a particular processor type.
+
+@section CPU Dependent Information Table
+
+The PowerPC version of the RTEMS CPU Dependent
+Information Table is given by the C structure definition is
+shown below:
+
+@example
+typedef struct @{
+ void (*pretasking_hook)( void );
+ void (*predriver_hook)( void );
+ void (*postdriver_hook)( void );
+ void (*idle_task)( void );
+ boolean do_zero_of_workspace;
+ unsigned32 idle_task_stack_size;
+ unsigned32 interrupt_stack_size;
+ unsigned32 extra_mpci_receive_server_stack;
+ void * (*stack_allocate_hook)( unsigned32 );
+ void (*stack_free_hook)( void* );
+ /* end of fields required on all CPUs */
+
+ unsigned32 clicks_per_usec; /* Timer clicks per microsecond */
+ void (*spurious_handler)(
+ unsigned32 vector, CPU_Interrupt_frame *);
+ boolean exceptions_in_RAM; /* TRUE if in RAM */
+
+#if defined(ppc403)
+ unsigned32 serial_per_sec; /* Serial clocks per second */
+ boolean serial_external_clock;
+ boolean serial_xon_xoff;
+ boolean serial_cts_rts;
+ unsigned32 serial_rate;
+ unsigned32 timer_average_overhead; /* in ticks */
+ unsigned32 timer_least_valid; /* Least valid number from timer */
+#endif
+@};
+@end example
+
+@table @code
+@item pretasking_hook
+is the address of the user provided routine which is invoked
+once RTEMS APIs are initialized. This routine will be invoked
+before any system tasks are created. Interrupts are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item predriver_hook
+is the address of the user provided
+routine that is invoked immediately before the
+the device drivers and MPCI are initialized. RTEMS
+initialization is complete but interrupts and tasking are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item postdriver_hook
+is the address of the user provided
+routine that is invoked immediately after the
+the device drivers and MPCI are initialized. RTEMS
+initialization is complete but interrupts and tasking are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item idle_task
+is the address of the optional user
+provided routine which is used as the system's IDLE task. If
+this field is not NULL, then the RTEMS default IDLE task is not
+used. This field may be NULL to indicate that the default IDLE
+is to be used.
+
+@item do_zero_of_workspace
+indicates whether RTEMS should
+zero the Workspace as part of its initialization. If set to
+TRUE, the Workspace is zeroed. Otherwise, it is not.
+
+@item idle_task_stack_size
+is the size of the RTEMS idle task stack in bytes.
+If this number is less than MINIMUM_STACK_SIZE, then the
+idle task's stack will be MINIMUM_STACK_SIZE in byte.
+
+@item interrupt_stack_size
+is the size of the RTEMS allocated interrupt stack in bytes.
+This value must be at least as large as MINIMUM_STACK_SIZE.
+
+@item extra_mpci_receive_server_stack
+is the extra stack space allocated for the RTEMS MPCI receive server task
+in bytes. The MPCI receive server may invoke nearly all directives and
+may require extra stack space on some targets.
+
+@item stack_allocate_hook
+is the address of the optional user provided routine which allocates
+memory for task stacks. If this hook is not NULL, then a stack_free_hook
+must be provided as well.
+
+@item stack_free_hook
+is the address of the optional user provided routine which frees
+memory for task stacks. If this hook is not NULL, then a stack_allocate_hook
+must be provided as well.
+
+@item clicks_per_usec
+is the number of decrementer interupts that occur each microsecond.
+
+@item spurious_handler
+is the address of the
+routine which is invoked when a spurious interrupt occurs.
+
+@item exceptions_in_RAM
+indicates whether the exception vectors are located in RAM or ROM. If
+they are located in RAM dynamic vector installation occurs, otherwise
+it does not.
+
+@item serial_per_sec
+is a PPC403 specific field which specifies the number of clock
+ticks per second for the PPC403 serial timer.
+
+@item serial_rate
+is a PPC403 specific field which specifies the baud rate for the
+PPC403 serial port.
+
+@item serial_external_clock
+is a PPC403 specific field which indicates whether or not to mask in a 0x2 into
+the Input/Output Configuration Register (IOCR) during initialization of the
+PPC403 console. (NOTE: This bit is defined as "reserved" 6-12?)
+
+@item serial_xon_xoff
+is a PPC403 specific field which indicates whether or not
+XON/XOFF flow control is supported for the PPC403 serial port.
+
+@item serial_cts_rts
+is a PPC403 specific field which indicates whether or not to set the
+least significant bit of the Input/Output Configuration Register
+(IOCR) during initialization of the PPC403 console. (NOTE: This
+bit is defined as "reserved" 6-12?)
+
+@item timer_average_overhead
+is a PPC403 specific field which specifies the average number of overhead ticks that occur on the PPC403 timer.
+
+@item timer_least_valid
+is a PPC403 specific field which specifies the maximum valid PPC403 timer value.
+
+@end table
+
diff --git a/doc/supplements/powerpc/fatalerr.t b/doc/supplements/powerpc/fatalerr.t
new file mode 100644
index 0000000000..8a03d57674
--- /dev/null
+++ b/doc/supplements/powerpc/fatalerr.t
@@ -0,0 +1,47 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Default Fatal Error Processing
+
+@section Introduction
+
+Upon detection of a fatal error by either the
+application or RTEMS the fatal error manager is invoked. The
+fatal error manager will invoke the user-supplied fatal error
+handlers. If no user-supplied handlers are configured, the
+RTEMS provided default fatal error handler is invoked. If the
+user-supplied fatal error handlers return to the executive the
+default fatal error handler is then invoked. This chapter
+describes the precise operations of the default fatal error
+handler.
+
+@section Default Fatal Error Handler Operations
+
+The default fatal error handler which is invoked by
+the @code{rtems_fatal_error_occurred} directive when there is no user handler
+configured or the user handler returns control to RTEMS. The
+default fatal error handler performs the following actions:
+
+@itemize @bullet
+
+@item places the error code in r3, and
+
+@item executes a trap instruction which results in a Program Exception.
+
+@end itemize
+
+If the Program Exception returns, then the following actions are performed:
+
+@itemize @bullet
+
+@item disables all processor exceptions by loading a 0 into the MSR, and
+
+@item goes into an infinite loop to simulate a halt processor instruction.
+
+@end itemize
+
diff --git a/doc/supplements/powerpc/intr_NOTIMES.t b/doc/supplements/powerpc/intr_NOTIMES.t
new file mode 100644
index 0000000000..514e27c9a5
--- /dev/null
+++ b/doc/supplements/powerpc/intr_NOTIMES.t
@@ -0,0 +1,184 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Interrupt Processing
+
+@section Introduction
+
+Different types of processors respond to the
+occurrence of an interrupt in its own unique fashion. In
+addition, each processor type provides a control mechanism to
+allow for the proper handling of an interrupt. The processor
+dependent response to the interrupt modifies the current
+execution state and results in a change in the execution stream.
+Most processors require that an interrupt handler utilize some
+special control mechanisms to return to the normal processing
+stream. Although RTEMS hides many of the processor dependent
+details of interrupt processing, it is important to understand
+how the RTEMS interrupt manager is mapped onto the processor's
+unique architecture. Discussed in this chapter are the PowerPC's
+interrupt response and control mechanisms as they pertain to
+RTEMS.
+
+RTEMS and associated documentation uses the terms
+interrupt and vector. In the PowerPC architecture, these terms
+correspond to exception and exception handler, respectively. The terms will
+be used interchangeably in this manual.
+
+@section Synchronous Versus Asynchronous Exceptions
+
+In the PowerPC architecture exceptions can be either precise or
+imprecise and either synchronous or asynchronous. Asynchronous
+exceptions occur when an external event interrupts the processor.
+Synchronous exceptions are caused by the actions of an
+instruction. During an exception SRR0 is used to calculate where
+instruction processing should resume. All instructions prior to
+the resume instruction will have completed execution. SRR1 is used to
+store the machine status.
+
+There are two asynchronous nonmaskable, highest-priority exceptions
+system reset and machine check. There are two asynchrononous maskable
+low-priority exceptions external interrupt and decrementer. Nonmaskable
+execptions are never delayed, therefore if two nonmaskable, asynchronous
+exceptions occur in immediate succession, the state information saved by
+the first exception may be overwritten when the subsequent exception occurs.
+
+The PowerPC arcitecure defines one imprecise exception, the imprecise
+floating point enabled exception. All other synchronous exceptions are
+precise. The synchronization occuring during asynchronous precise
+exceptions conforms to the requirements for context synchronization.
+
+@section Vectoring of Interrupt Handler
+
+Upon determining that an exception can be taken the PowerPC automatically
+performs the following actions:
+
+@itemize @bullet
+@item an instruction address is loaded into SRR0
+
+@item bits 33-36 and 42-47 of SRR1 are loaded with information
+specific to the exception.
+
+@item bits 0-32, 37-41, and 48-63 of SRR1 are loaded with corresponding
+bits from the MSR.
+
+@item the MSR is set based upon the exception type.
+
+@item instruction fetch and execution resumes, using the new MSR value, at a location specific to the execption type.
+
+@end itemize
+
+If the interrupt handler was installed as an RTEMS
+interrupt handler, then upon receipt of the interrupt, the
+processor passes control to the RTEMS interrupt handler which
+performs the following actions:
+
+@itemize @bullet
+@item saves the state of the interrupted task on it's stack,
+
+@item saves all registers which are not normally preserved
+by the calling sequence so the user's interrupt service
+routine can be written in a high-level language.
+
+@item if this is the outermost (i.e. non-nested) interrupt,
+then the RTEMS interrupt handler switches from the current stack
+to the interrupt stack,
+
+@item enables exceptions,
+
+@item invokes the vectors to a user interrupt service routine (ISR).
+@end itemize
+
+Asynchronous interrupts are ignored while exceptions are
+disabled. Synchronous interrupts which occur while are
+disabled result in the CPU being forced into an error mode.
+
+A nested interrupt is processed similarly with the
+exception that the current stack need not be switched to the
+interrupt stack.
+
+@section Interrupt Levels
+
+The PowerPC architecture supports only a single external
+asynchronous interrupt source. This interrupt source
+may be enabled and disabled via the External Interrupt Enable (EE)
+bit in the Machine State Register (MSR). Thus only two level (enabled
+and disabled) of external device interrupt priorities are
+directly supported by the PowerPC architecture.
+
+Some PowerPC implementations include a Critical Interrupt capability
+which is often used to receive interrupts from high priority external
+devices.
+
+The RTEMS interrupt level mapping scheme for the PowerPC is not
+a numeric level as on most RTEMS ports. It is a bit mapping in
+which the least three significiant bits of the interrupt level
+are mapped directly to the enabling of specific interrupt
+sources as follows:
+
+@table @b
+
+@item Critical Interrupt
+Setting bit 0 (the least significant bit) of the interrupt level
+enables the Critical Interrupt source, if it is available on this
+CPU model.
+
+@item Machine Check
+Setting bit 1 of the interrupt level enables Machine Check execptions.
+
+@item External Interrupt
+Setting bit 2 of the interrupt level enables External Interrupt execptions.
+
+@end table
+
+All other bits in the RTEMS task interrupt level are ignored.
+
+@section Disabling of Interrupts by RTEMS
+
+During the execution of directive calls, critical
+sections of code may be executed. When these sections are
+encountered, RTEMS disables Critical Interrupts, External Interrupts
+and Machine Checks before the execution of this section and restores
+them to the previous level upon completion of the section. RTEMS has been
+optimized to insure that interrupts are disabled for less than
+RTEMS_MAXIMUM_DISABLE_PERIOD microseconds on a
+RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ Mhz PowerPC 603e with zero
+wait states. These numbers will vary based the number of wait
+states and processor speed present on the target board.
+[NOTE: The maximum period with interrupts disabled is hand calculated. This
+calculation was last performed for Release
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD.]
+
+If a PowerPC implementation provides non-maskable interrupts (NMI)
+which cannot be disabled, ISRs which process these interrupts
+MUST NEVER issue RTEMS system calls. If a directive is invoked,
+unpredictable results may occur due to the inability of RTEMS
+to protect its critical sections. However, ISRs that make no
+system calls may safely execute as non-maskable interrupts.
+
+@section Interrupt Stack
+
+The PowerPC architecture does not provide for a
+dedicated interrupt stack. Thus by default, exception handlers would
+execute on the stack of the RTEMS task which they interrupted.
+This artificially inflates the stack requirements for each task
+since EVERY task stack would have to include enough space to
+account for the worst case interrupt stack requirements in
+addition to it's own worst case usage. RTEMS addresses this
+problem on the PowerPC by providing a dedicated interrupt stack
+managed by software.
+
+During system initialization, RTEMS allocates the
+interrupt stack from the Workspace Area. The amount of memory
+allocated for the interrupt stack is determined by the
+interrupt_stack_size field in the CPU Configuration Table. As
+part of processing a non-nested interrupt, RTEMS will switch to
+the interrupt stack before invoking the installed handler.
+
+
+
diff --git a/doc/supplements/powerpc/memmodel.t b/doc/supplements/powerpc/memmodel.t
new file mode 100644
index 0000000000..13341696cf
--- /dev/null
+++ b/doc/supplements/powerpc/memmodel.t
@@ -0,0 +1,110 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Memory Model
+
+@section Introduction
+
+A processor may support any combination of memory
+models ranging from pure physical addressing to complex demand
+paged virtual memory systems. RTEMS supports a flat memory
+model which ranges contiguously over the processor's allowable
+address space. RTEMS does not support segmentation or virtual
+memory of any kind. The appropriate memory model for RTEMS
+provided by the targeted processor and related characteristics
+of that model are described in this chapter.
+
+@section Flat Memory Model
+
+The PowerPC architecture supports a variety of memory models.
+RTEMS supports the PowerPC using a flat memory model with
+paging disabled. In this mode, the PowerPC automatically
+converts every address from a logical to a physical address
+each time it is used. The PowerPC uses information provided
+in the Block Address Translation (BAT) to convert these addresses.
+
+Implementations of the PowerPC architecture may be thirty-two or sixty-four bit.
+The PowerPC architecture supports a flat thirty-two or sixty-four bit address
+space with addresses ranging from 0x00000000 to 0xFFFFFFFF (4
+gigabytes) in thirty-two bit implementations or to 0xFFFFFFFFFFFFFFFF
+in sixty-four bit implementations. Each address is represented
+by either a thirty-two bit or sixty-four bit value and is byte addressable.
+The address may be used to reference a single byte, half-word
+(2-bytes), word (4 bytes), or in sixty-four bit implementations a
+doubleword (8 bytes). Memory accesses within the address space are
+performed in big or little endian fashion by the PowerPC based
+upon the current setting of the Little-endian mode enable bit (LE)
+in the Machine State Register (MSR). While the processor is in
+big endian mode, memory accesses which are not properly aligned
+generate an "alignment exception" (vector offset 0x00600). In
+little endian mode, the PowerPC architecture does not require
+the processor to generate alignment exceptions.
+
+The following table lists the alignment requirements for a variety
+of data accesses:
+
+@ifset use-ascii
+@example
+@group
+ +--------------+-----------------------+
+ | Data Type | Alignment Requirement |
+ +--------------+-----------------------+
+ | byte | 1 |
+ | half-word | 2 |
+ | word | 4 |
+ | doubleword | 8 |
+ +--------------+-----------------------+
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@sp 1
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\vrule\strut#&
+\hbox to 1.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 1.75in{\enskip\hfil#\hfil}&
+\vrule#\cr
+\noalign{\hrule}
+&\bf Data Type &&\bf Alignment Requirement&\cr\noalign{\hrule}
+&byte&&1&\cr\noalign{\hrule}
+&half-word&&2&\cr\noalign{\hrule}
+&word&&4&\cr\noalign{\hrule}
+&doubleword&&8&\cr\noalign{\hrule}
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=2 WIDTH="60%" BORDER=2>
+<TR><TD ALIGN=center><STRONG>Data Type</STRONG></TD>
+ <TD ALIGN=center><STRONG>Alignment Requirement</STRONG></TD></TR>
+<TR><TD ALIGN=center>byte</TD>
+ <TD ALIGN=center>1</TD></TR>
+<TR><TD ALIGN=center>half-word</TD>
+ <TD ALIGN=center>2</TD></TR>
+<TR><TD ALIGN=center>word</TD>
+ <TD ALIGN=center>4</TD></TR>
+<TR><TD ALIGN=center>doubleword</TD>
+ <TD ALIGN=center>8</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+Doubleword load and store operations are only available in
+PowerPC CPU models which are sixty-four bit implementations.
+
+RTEMS does not directly support any PowerPC Memory Management
+Units, therefore, virtual memory or segmentation systems
+involving the PowerPC are not supported.
+
diff --git a/doc/supplements/powerpc/powerpc.texi b/doc/supplements/powerpc/powerpc.texi
new file mode 100644
index 0000000000..4e27aa0ee0
--- /dev/null
+++ b/doc/supplements/powerpc/powerpc.texi
@@ -0,0 +1,115 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename powerpc.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the PowerPC Applications Supplement
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS Target Supplements
+@direntry
+* RTEMS PowerPC Applications Supplement: (powerpc).
+@end direntry
+@end ifset
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage RTEMS PowerPC Applications Supplement
+
+@setchapternewpage odd
+@settitle RTEMS PowerPC Applications Supplement
+@titlepage
+@finalout
+
+@title RTEMS PowerPC Applications Supplement
+@subtitle Edition @value{EDITION}, for RTEMS @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include preface.texi
+@include cpumodel.texi
+@include callconv.texi
+@include memmodel.texi
+@include intr.texi
+@include fatalerr.texi
+@include bsp.texi
+@include cputable.texi
+@include wksheets.texi
+@include timing.texi
+@include timePSIM.texi
+@include timeDMV177.texi
+@ifinfo
+@node Top, Preface, (dir), (dir)
+@top powerpc
+
+This is the online version of the RTEMS PowerPC Applications Supplement.
+
+@menu
+* Preface::
+* CPU Model Dependent Features::
+* Calling Conventions::
+* Memory Model::
+* Interrupt Processing::
+* Default Fatal Error Processing::
+* Board Support Packages::
+* Processor Dependent Information Table::
+* Memory Requirements::
+* Timing Specification::
+* PSIM Timing Data::
+* DMV177 Timing Data::
+* Command and Variable Index::
+* Concept Index::
+@end menu
+
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@node Command and Variable Index, Concept Index, DMV177 Timing Data Rate Monotonic Manager, Top
+@unnumbered Command and Variable Index
+
+There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@node Concept Index, , Command and Variable Index, Top
+@unnumbered Concept Index
+
+There are currently no Concept Index entries.
+@c @printindex cp
+
+@contents
+@bye
+
diff --git a/doc/supplements/powerpc/preface.texi b/doc/supplements/powerpc/preface.texi
new file mode 100644
index 0000000000..607953e00c
--- /dev/null
+++ b/doc/supplements/powerpc/preface.texi
@@ -0,0 +1,94 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Preface, CPU Model Dependent Features, Top, Top
+@end ifinfo
+@unnumbered Preface
+
+The Real Time Executive for Multiprocessor Systems
+(RTEMS) is designed to be portable across multiple processor
+architectures. However, the nature of real-time systems makes
+it essential that the application designer understand certain
+processor dependent implementation details. These processor
+dependencies include calling convention, board support package
+issues, interrupt processing, exact RTEMS memory requirements,
+performance data, header files, and the assembly language
+interface to the executive.
+
+This document discusses the PowerPC architecture
+dependencies in this port of RTEMS.
+
+It is highly recommended that the PowerPC RTEMS
+application developer obtain and become familiar with the
+documentation for the processor being used as well as the
+specification for the revision of the PowerPC architecture which
+corresponds to that processor.
+
+@subheading PowerPC Architecture Documents
+
+For information on the PowerPC architecture, refer to
+the following documents available from Motorola and IBM:
+
+@itemize @bullet
+
+@item @cite{PowerPC Microprocessor Family: The Programming Environment}
+(Motorola Document MPRPPCFPE-01).
+
+@item @cite{IBM PPC403GB Embedded Controller User's Manual}.
+
+@item @cite{PoweRisControl MPC500 Family RCPU RISC Central Processing
+Unit Reference Manual} (Motorola Document RCPUURM/AD).
+
+@item @cite{PowerPC 601 RISC Microprocessor User's Manual}
+(Motorola Document MPR601UM/AD).
+
+@item @cite{PowerPC 603 RISC Microprocessor User's Manual}
+(Motorola Document MPR603UM/AD).
+
+@item @cite{PowerPC 603e RISC Microprocessor User's Manual}
+(Motorola Document MPR603EUM/AD).
+
+@item @cite{PowerPC 604 RISC Microprocessor User's Manual}
+(Motorola Document MPR604UM/AD).
+
+@item @cite{PowerPC MPC821 Portable Systems Microprocessor User's Manual}
+(Motorola Document MPC821UM/AD).
+
+@item @cite{PowerQUICC MPC860 User's Manual} (Motorola Document MPC860UM/AD).
+
+
+@end itemize
+
+Motorola maintains an on-line electronic library for the PowerPC
+at the following URL:
+
+@itemize @code{ }
+@item @cite{http://www.mot.com/powerpc/library/library.html}
+@end itemize
+
+This site has a a wealth of information and examples. Many of the
+manuals are available from that site in electronic format.
+
+@subheading PowerPC Processor Simulator Information
+
+PSIM is a program which emulates the Instruction Set Architecture
+of the PowerPC microprocessor family. It is reely available in source
+code form under the terms of the GNU General Public License (version
+2 or later). PSIM can be integrated with the GNU Debugger (gdb) to
+execute and debug PowerPC executables on non-PowerPC hosts. PSIM
+supports the addition of user provided device models which can be
+used to allow one to develop and debug embedded applications using
+the simulator.
+
+The latest version of PSIM is made available to the public via
+anonymous ftp at ftp://ftp.ci.com.au/pub/psim or
+ftp://cambridge.cygnus.com/pub/psim. There is also a mailing list
+at powerpc-psim@@ci.com.au.
+
+
diff --git a/doc/supplements/powerpc/timeDMV177.t b/doc/supplements/powerpc/timeDMV177.t
new file mode 100644
index 0000000000..301bfee4c1
--- /dev/null
+++ b/doc/supplements/powerpc/timeDMV177.t
@@ -0,0 +1,113 @@
+@c
+@c Timing information for the DMV177
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@include common/timemac.texi
+@tex
+\global\advance \smallskipamount by -4pt
+@end tex
+
+@chapter RTEMS_BSP Timing Data
+
+@section Introduction
+
+The timing data for RTEMS on the DY-4 RTEMS_BSP board
+is provided along with the target
+dependent aspects concerning the gathering of the timing data.
+The hardware platform used to gather the times is described to
+give the reader a better understanding of each directive time
+provided. Also, provided is a description of the interrupt
+latency and the context switch times as they pertain to the
+PowerPC version of RTEMS.
+
+@section Hardware Platform
+
+All times reported in this chapter were measured using a RTEMS_BSP board.
+All data and code caching was disabled. This results in very deterministic
+times which represent the worst possible performance. Many embedded
+applications disable caching to insure that execution times are
+repeatable. Moreover, the JTAG port on certain revisions of the PowerPC
+603e does not operate properly if caching is enabled. Thus during
+development and debug, caching must be off.
+
+The PowerPC decrementer register was was used to gather
+all timing information. In the PowerPC architecture,
+this register typically counts
+something like CPU cycles or is a function of the clock
+speed. On the PPC603e decrements once for every four (4) bus cycles.
+On the RTEMS_BSP, the bus operates at a clock speed of
+33 Mhz. This result in a very accurate number since it is a function of the
+microprocessor itself. Thus all measurements in this
+chapter are reported as the actual number of decrementer
+clicks reported.
+
+To convert the numbers reported to microseconds, one should
+divide the number reported by 8.650752. This number was derived as
+shown below:
+
+@example
+((33 * 1048576) / 1000000) / 4 = 8.650752
+@end example
+
+All sources of hardware interrupts were disabled,
+although traps were enabled and the interrupt level of the
+PowerPC allows all interrupts.
+
+@section Interrupt Latency
+
+The maximum period with traps disabled or the
+processor interrupt level set to it's highest value inside RTEMS
+is less than RTEMS_MAXIMUM_DISABLE_PERIOD
+microseconds including the instructions which
+disable and re-enable interrupts. The time required for the
+PowerPC to vector an interrupt and for the RTEMS entry overhead
+before invoking the user's trap handler are a total of
+RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK
+microseconds. These combine to yield a worst case interrupt
+latency of less than RTEMS_MAXIMUM_DISABLE_PERIOD +
+RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK microseconds at
+RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ Mhz.
+[NOTE: The maximum period with interrupts disabled was last
+determined for Release RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD.]
+
+The maximum period with interrupts disabled within
+RTEMS is hand-timed with some assistance from the PowerPC simulator.
+The maximum period with interrupts disabled with RTEMS has not
+been calculated on this target.
+
+The interrupt vector and entry overhead time was
+generated on the PSIM benchmark platform using the PowerPC's
+decrementer register. This register was programmed to generate
+an interrupt after one countdown.
+
+@section Context Switch
+
+The RTEMS processor context switch time is RTEMS_NO_FP_CONTEXTS
+bus cycle on the RTEMS_BSP benchmark platform when no floating
+point context is saved or restored. Additional execution time
+is required when a TASK_SWITCH user extension is configured.
+The use of the TASK_SWITCH extension is application dependent.
+Thus, its execution time is not considered part of the raw
+context switch time.
+
+Since RTEMS was designed specifically for embedded
+missile applications which are floating point intensive, the
+executive is optimized to avoid unnecessarily saving and
+restoring the state of the numeric coprocessor. The state of
+the numeric coprocessor is only saved when an FLOATING_POINT
+task is dispatched and that task was not the last task to
+utilize the coprocessor. In a system with only one
+FLOATING_POINT task, the state of the numeric coprocessor will
+never be saved or restored. When the first FLOATING_POINT task
+is dispatched, RTEMS does not need to save the current state of
+the numeric coprocessor.
+
+The following table summarizes the context switch
+times for the RTEMS_BSP benchmark platform:
+
diff --git a/doc/supplements/powerpc/timePSIM.t b/doc/supplements/powerpc/timePSIM.t
new file mode 100644
index 0000000000..b0516c828b
--- /dev/null
+++ b/doc/supplements/powerpc/timePSIM.t
@@ -0,0 +1,97 @@
+@c
+@c Timing information for PSIM
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@include common/timemac.texi
+@tex
+\global\advance \smallskipamount by -4pt
+@end tex
+
+@chapter RTEMS_BSP Timing Data
+
+@section Introduction
+
+The timing data for RTEMS on the RTEMS_BSP target
+is provided along with the target
+dependent aspects concerning the gathering of the timing data.
+The hardware platform used to gather the times is described to
+give the reader a better understanding of each directive time
+provided. Also, provided is a description of the interrupt
+latency and the context switch times as they pertain to the
+PowerPC version of RTEMS.
+
+@section Hardware Platform
+
+All times reported in this chapter were measured using the PowerPC
+Instruction Simulator (PSIM). PSIM simulates a variety of PowerPC
+6xx models with the PPC603e being used as the basis for the measurements
+reported in this chapter.
+
+The PowerPC decrementer register was was used to gather
+all timing information. In real hardware implementations
+of the PowerPC architecture, this register would typically
+count something like CPU cycles or be a function of the clock
+speed. However, with PSIM each count of the decrementer register
+represents an instruction. Thus all measurements in this
+chapter are reported as the actual number of instructions
+executed. All sources of hardware interrupts were disabled,
+although traps were enabled and the interrupt level of the
+PowerPC allows all interrupts.
+
+@section Interrupt Latency
+
+The maximum period with traps disabled or the
+processor interrupt level set to it's highest value inside RTEMS
+is less than RTEMS_MAXIMUM_DISABLE_PERIOD
+microseconds including the instructions which
+disable and re-enable interrupts. The time required for the
+PowerPC to vector an interrupt and for the RTEMS entry overhead
+before invoking the user's trap handler are a total of
+RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK
+microseconds. These combine to yield a worst case interrupt
+latency of less than RTEMS_MAXIMUM_DISABLE_PERIOD +
+RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK microseconds at
+RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ Mhz.
+[NOTE: The maximum period with interrupts disabled was last
+determined for Release RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD.]
+
+The maximum period with interrupts disabled within
+RTEMS is hand-timed with some assistance from RTEMS_BSP. The maximum
+period with interrupts disabled with RTEMS occurs was not measured
+on this target.
+
+The interrupt vector and entry overhead time was
+generated on the RTEMS_BSP benchmark platform using the PowerPC's
+decrementer register. This register was programmed to generate
+an interrupt after one countdown.
+
+@section Context Switch
+
+The RTEMS processor context switch time is RTEMS_NO_FP_CONTEXTS
+instructions on the RTEMS_BSP benchmark platform when no floating
+point context is saved or restored. Additional execution time
+is required when a TASK_SWITCH user extension is configured.
+The use of the TASK_SWITCH extension is application dependent.
+Thus, its execution time is not considered part of the raw
+context switch time.
+
+Since RTEMS was designed specifically for embedded
+missile applications which are floating point intensive, the
+executive is optimized to avoid unnecessarily saving and
+restoring the state of the numeric coprocessor. The state of
+the numeric coprocessor is only saved when an FLOATING_POINT
+task is dispatched and that task was not the last task to
+utilize the coprocessor. In a system with only one
+FLOATING_POINT task, the state of the numeric coprocessor will
+never be saved or restored. When the first FLOATING_POINT task
+is dispatched, RTEMS does not need to save the current state of
+the numeric coprocessor.
+
+The following table summarizes the context switch
+times for the RTEMS_BSP benchmark platform:
diff --git a/doc/supplements/sh/.cvsignore b/doc/supplements/sh/.cvsignore
new file mode 100644
index 0000000000..c39c8d920a
--- /dev/null
+++ b/doc/supplements/sh/.cvsignore
@@ -0,0 +1,38 @@
+bsp.texi
+callconv.texi
+cpumodel.texi
+cputable.texi
+fatalerr.texi
+index.html
+intr.t
+intr.texi
+Makefile
+Makefile.in
+mdate-sh
+memmodel.texi
+rtems_footer.html
+rtems_header.html
+sh
+sh-?
+sh-??
+sh.aux
+sh.cp
+sh.dvi
+sh.fn
+sh*.html
+sh.ky
+sh.log
+sh.pdf
+sh.pg
+sh.ps
+sh.toc
+sh.tp
+sh.vr
+stamp-vti
+timeBSP_.t
+timeBSP.texi
+timing.t
+timing.texi
+version.texi
+wksheets.t
+wksheets.texi
diff --git a/doc/supplements/sh/BSP_TIMES b/doc/supplements/sh/BSP_TIMES
new file mode 100644
index 0000000000..82b8160aa5
--- /dev/null
+++ b/doc/supplements/sh/BSP_TIMES
@@ -0,0 +1,247 @@
+#
+# CPU MODEL/BSP Timing and Size Information
+#
+# $Id$
+#
+
+#
+# CPU Model Information
+#
+RTEMS_BSP BSPFORTIMES
+RTEMS_CPU_MODEL BSP_CPU_MODEL
+#
+# Interrupt Latency
+#
+# NOTE: In general, the text says it is hand-calculated to be
+# RTEMS_MAXIMUM_DISABLE_PERIOD at RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+# Mhz and this was last calculated for Release
+# RTEMS_VERSION_FOR_MAXIMUM_DISABLE_PERIOD.
+#
+RTEMS_MAXIMUM_DISABLE_PERIOD TBD
+RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ 20
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD 4.0.0
+#
+# Context Switch Times
+#
+RTEMS_NO_FP_CONTEXTS 35
+RTEMS_RESTORE_1ST_FP_TASK 39
+RTEMS_SAVE_INIT_RESTORE_INIT 66
+RTEMS_SAVE_IDLE_RESTORE_INIT 66
+RTEMS_SAVE_IDLE_RESTORE_IDLE 68
+#
+# Task Manager Times
+#
+RTEMS_TASK_CREATE_ONLY 148
+RTEMS_TASK_IDENT_ONLY 350
+RTEMS_TASK_START_ONLY 76
+RTEMS_TASK_RESTART_CALLING_TASK 95
+RTEMS_TASK_RESTART_SUSPENDED_RETURNS_TO_CALLER 89
+RTEMS_TASK_RESTART_BLOCKED_RETURNS_TO_CALLER 124
+RTEMS_TASK_RESTART_READY_RETURNS_TO_CALLER 92
+RTEMS_TASK_RESTART_SUSPENDED_PREEMPTS_CALLER 125
+RTEMS_TASK_RESTART_BLOCKED_PREEMPTS_CALLER 149
+RTEMS_TASK_RESTART_READY_PREEMPTS_CALLER 142
+RTEMS_TASK_DELETE_CALLING_TASK 170
+RTEMS_TASK_DELETE_SUSPENDED_TASK 138
+RTEMS_TASK_DELETE_BLOCKED_TASK 143
+RTEMS_TASK_DELETE_READY_TASK 144
+RTEMS_TASK_SUSPEND_CALLING_TASK 71
+RTEMS_TASK_SUSPEND_RETURNS_TO_CALLER 43
+RTEMS_TASK_RESUME_TASK_READIED_RETURNS_TO_CALLER 45
+RTEMS_TASK_RESUME_TASK_READIED_PREEMPTS_CALLER 67
+RTEMS_TASK_SET_PRIORITY_OBTAIN_CURRENT_PRIORITY 31
+RTEMS_TASK_SET_PRIORITY_RETURNS_TO_CALLER 64
+RTEMS_TASK_SET_PRIORITY_PREEMPTS_CALLER 106
+RTEMS_TASK_MODE_OBTAIN_CURRENT_MODE 14
+RTEMS_TASK_MODE_NO_RESCHEDULE 16
+RTEMS_TASK_MODE_RESCHEDULE_RETURNS_TO_CALLER 23
+RTEMS_TASK_MODE_RESCHEDULE_PREEMPTS_CALLER 60
+RTEMS_TASK_GET_NOTE_ONLY 33
+RTEMS_TASK_SET_NOTE_ONLY 33
+RTEMS_TASK_WAKE_AFTER_YIELD_RETURNS_TO_CALLER 16
+RTEMS_TASK_WAKE_AFTER_YIELD_PREEMPTS_CALLER 56
+RTEMS_TASK_WAKE_WHEN_ONLY 117
+#
+# Interrupt Manager
+#
+RTEMS_INTR_ENTRY_RETURNS_TO_NESTED 12
+RTEMS_INTR_ENTRY_RETURNS_TO_INTERRUPTED_TASK 9
+RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK 9
+RTEMS_INTR_EXIT_RETURNS_TO_NESTED <1
+RTEMS_INTR_EXIT_RETURNS_TO_INTERRUPTED_TASK 8
+RTEMS_INTR_EXIT_RETURNS_TO_PREEMPTING_TASK 54
+#
+# Clock Manager
+#
+RTEMS_CLOCK_SET_ONLY 86
+RTEMS_CLOCK_GET_ONLY 1
+RTEMS_CLOCK_TICK_ONLY 17
+#
+# Timer Manager
+#
+RTEMS_TIMER_CREATE_ONLY 28
+RTEMS_TIMER_IDENT_ONLY 343
+RTEMS_TIMER_DELETE_INACTIVE 43
+RTEMS_TIMER_DELETE_ACTIVE 47
+RTEMS_TIMER_FIRE_AFTER_INACTIVE 58
+RTEMS_TIMER_FIRE_AFTER_ACTIVE 61
+RTEMS_TIMER_FIRE_WHEN_INACTIVE 88
+RTEMS_TIMER_FIRE_WHEN_ACTIVE 88
+RTEMS_TIMER_RESET_INACTIVE 54
+RTEMS_TIMER_RESET_ACTIVE 58
+RTEMS_TIMER_CANCEL_INACTIVE 31
+RTEMS_TIMER_CANCEL_ACTIVE 34
+#
+# Semaphore Manager
+#
+RTEMS_SEMAPHORE_CREATE_ONLY 60
+RTEMS_SEMAPHORE_IDENT_ONLY 367
+RTEMS_SEMAPHORE_DELETE_ONLY 58
+RTEMS_SEMAPHORE_OBTAIN_AVAILABLE 38
+RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_NO_WAIT 38
+RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_CALLER_BLOCKS 109
+RTEMS_SEMAPHORE_RELEASE_NO_WAITING_TASKS 44
+RTEMS_SEMAPHORE_RELEASE_TASK_READIED_RETURNS_TO_CALLER 66
+RTEMS_SEMAPHORE_RELEASE_TASK_READIED_PREEMPTS_CALLER 87
+#
+# Message Manager
+#
+RTEMS_MESSAGE_QUEUE_CREATE_ONLY 200
+RTEMS_MESSAGE_QUEUE_IDENT_ONLY 341
+RTEMS_MESSAGE_QUEUE_DELETE_ONLY 80
+RTEMS_MESSAGE_QUEUE_SEND_NO_WAITING_TASKS 97
+RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_RETURNS_TO_CALLER 101
+RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_PREEMPTS_CALLER 123
+RTEMS_MESSAGE_QUEUE_URGENT_NO_WAITING_TASKS 96
+RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_RETURNS_TO_CALLER 101
+RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_PREEMPTS_CALLER 123
+RTEMS_MESSAGE_QUEUE_BROADCAST_NO_WAITING_TASKS 53
+RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_RETURNS_TO_CALLER 111
+RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_PREEMPTS_CALLER 133
+RTEMS_MESSAGE_QUEUE_RECEIVE_AVAILABLE 79
+RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_NO_WAIT 43
+RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS 114
+RTEMS_MESSAGE_QUEUE_FLUSH_NO_MESSAGES_FLUSHED 29
+RTEMS_MESSAGE_QUEUE_FLUSH_MESSAGES_FLUSHED 39
+#
+# Event Manager
+#
+RTEMS_EVENT_SEND_NO_TASK_READIED 24
+RTEMS_EVENT_SEND_TASK_READIED_RETURNS_TO_CALLER 60
+RTEMS_EVENT_SEND_TASK_READIED_PREEMPTS_CALLER 84
+RTEMS_EVENT_RECEIVE_OBTAIN_CURRENT_EVENTS 1
+RTEMS_EVENT_RECEIVE_AVAILABLE 28
+RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_NO_WAIT 23
+RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS 84
+#
+# Signal Manager
+#
+RTEMS_SIGNAL_CATCH_ONLY 15
+RTEMS_SIGNAL_SEND_RETURNS_TO_CALLER 37
+RTEMS_SIGNAL_SEND_SIGNAL_TO_SELF 55
+RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_CALLING_TASK 37
+RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_PREEMPTING_TASK 54
+#
+# Partition Manager
+#
+RTEMS_PARTITION_CREATE_ONLY 70
+RTEMS_PARTITION_IDENT_ONLY 341
+RTEMS_PARTITION_DELETE_ONLY 42
+RTEMS_PARTITION_GET_BUFFER_AVAILABLE 35
+RTEMS_PARTITION_GET_BUFFER_NOT_AVAILABLE 33
+RTEMS_PARTITION_RETURN_BUFFER_ONLY 43
+#
+# Region Manager
+#
+RTEMS_REGION_CREATE_ONLY 63
+RTEMS_REGION_IDENT_ONLY 348
+RTEMS_REGION_DELETE_ONLY 39
+RTEMS_REGION_GET_SEGMENT_AVAILABLE 52
+RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_NO_WAIT 49
+RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_CALLER_BLOCKS 123
+RTEMS_REGION_RETURN_SEGMENT_NO_WAITING_TASKS 54
+RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_RETURNS_TO_CALLER 114
+RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_PREEMPTS_CALLER 136
+#
+# Dual-Ported Memory Manager
+#
+RTEMS_PORT_CREATE_ONLY 35
+RTEMS_PORT_IDENT_ONLY 340
+RTEMS_PORT_DELETE_ONLY 39
+RTEMS_PORT_INTERNAL_TO_EXTERNAL_ONLY 26
+RTEMS_PORT_EXTERNAL_TO_INTERNAL_ONLY 27
+#
+# IO Manager
+#
+RTEMS_IO_INITIALIZE_ONLY 4
+RTEMS_IO_OPEN_ONLY 2
+RTEMS_IO_CLOSE_ONLY 1
+RTEMS_IO_READ_ONLY 2
+RTEMS_IO_WRITE_ONLY 3
+RTEMS_IO_CONTROL_ONLY 2
+#
+# Rate Monotonic Manager
+#
+RTEMS_RATE_MONOTONIC_CREATE_ONLY 32
+RTEMS_RATE_MONOTONIC_IDENT_ONLY 341
+RTEMS_RATE_MONOTONIC_CANCEL_ONLY 39
+RTEMS_RATE_MONOTONIC_DELETE_ACTIVE 51
+RTEMS_RATE_MONOTONIC_DELETE_INACTIVE 48
+RTEMS_RATE_MONOTONIC_PERIOD_INITIATE_PERIOD_RETURNS_TO_CALLER 54
+RTEMS_RATE_MONOTONIC_PERIOD_CONCLUDE_PERIOD_CALLER_BLOCKS 74
+RTEMS_RATE_MONOTONIC_PERIOD_OBTAIN_STATUS 31
+#
+# Size Information
+#
+#
+# xxx alloted for numbers
+#
+RTEMS_DATA_SPACE 723
+RTEMS_MINIMUM_CONFIGURATION 18,980
+RTEMS_MAXIMUM_CONFIGURATION 36,438
+# x,xxx alloted for numbers
+RTEMS_CORE_CODE_SIZE 12,674
+RTEMS_INITIALIZATION_CODE_SIZE 970
+RTEMS_TASK_CODE_SIZE 3,562
+RTEMS_INTERRUPT_CODE_SIZE 54
+RTEMS_CLOCK_CODE_SIZE 334
+RTEMS_TIMER_CODE_SIZE 1,110
+RTEMS_SEMAPHORE_CODE_SIZE 1,632
+RTEMS_MESSAGE_CODE_SIZE 1,754
+RTEMS_EVENT_CODE_SIZE 1,000
+RTEMS_SIGNAL_CODE_SIZE 418
+RTEMS_PARTITION_CODE_SIZE 1,164
+RTEMS_REGION_CODE_SIZE 1,494
+RTEMS_DPMEM_CODE_SIZE 724
+RTEMS_IO_CODE_SIZE 686
+RTEMS_FATAL_ERROR_CODE_SIZE 24
+RTEMS_RATE_MONOTONIC_CODE_SIZE 1,212
+RTEMS_MULTIPROCESSING_CODE_SIZE 6.952
+# xxx alloted for numbers
+RTEMS_TIMER_CODE_OPTSIZE 184
+RTEMS_SEMAPHORE_CODE_OPTSIZE 172
+RTEMS_MESSAGE_CODE_OPTSIZE 288
+RTEMS_EVENT_CODE_OPTSIZE 56
+RTEMS_SIGNAL_CODE_OPTSIZE 56
+RTEMS_PARTITION_CODE_OPTSIZE 132
+RTEMS_REGION_CODE_OPTSIZE 160
+RTEMS_DPMEM_CODE_OPTSIZE 132
+RTEMS_IO_CODE_OPTSIZE 00
+RTEMS_RATE_MONOTONIC_CODE_OPTSIZE 184
+RTEMS_MULTIPROCESSING_CODE_OPTSIZE 332
+# xxx alloted for numbers
+RTEMS_BYTES_PER_TASK 400
+RTEMS_BYTES_PER_TIMER 68
+RTEMS_BYTES_PER_SEMAPHORE 124
+RTEMS_BYTES_PER_MESSAGE_QUEUE 148
+RTEMS_BYTES_PER_REGION 144
+RTEMS_BYTES_PER_PARTITION 56
+RTEMS_BYTES_PER_PORT 36
+RTEMS_BYTES_PER_PERIOD 36
+RTEMS_BYTES_PER_EXTENSION 64
+RTEMS_BYTES_PER_FP_TASK 332
+RTEMS_BYTES_PER_NODE 48
+RTEMS_BYTES_PER_GLOBAL_OBJECT 20
+RTEMS_BYTES_PER_PROXY 124
+# x,xxx alloted for numbers
+RTEMS_BYTES_OF_FIXED_SYSTEM_REQUIREMENTS 8,872
diff --git a/doc/supplements/sh/ChangeLog b/doc/supplements/sh/ChangeLog
new file mode 100644
index 0000000000..5bbba06126
--- /dev/null
+++ b/doc/supplements/sh/ChangeLog
@@ -0,0 +1,76 @@
+2003-12-12 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-12-11 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-11-26 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Add *.info to CLEANFILES to accomodate
+ automake-1.7f/1.8 breaking building infos.
+
+2003-09-26 Joel Sherrill <joel@OARcorp.com>
+
+ * cpumodel.t: Obsoleting HP PA-RISC port and removing all references.
+
+2003-09-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Merger from rtems-4-6-branch.
+
+2003-09-19 Joel Sherrill <joel@OARcorp.com>
+
+ * sh.texi: Merge from branch.
+
+2003-05-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * cpumodel.t: Reflect c/src/exec having moved to cpukit.
+
+2003-01-25 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * sh.texi: Set @setfilename sh.info.
+
+2003-01-24 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Put GENERATED_FILES into $builddir.
+
+2003-01-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * version.texi: Remove from CVS.
+ * stamp-vti: Remove from CVS.
+ * .cvsignore: Add version.texi.
+ Add stamp-vti.
+ Re-sort.
+
+2003-01-21 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-11-13 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-10-24 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-07-30 Joel Sherrill <joel@OARcorp.com>
+
+ * intr_NOTIMES.t, timeBSP.t: Replaced XXX's with real info.
+
+2002-03-27 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Remove AUTOMAKE_OPTIONS.
+
+2002-01-18 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Require automake-1.5.
+
+2001-01-17 Joel Sherrill <joel@OARcorp.com>
+
+ * .cvsignore: Added rtems_header.html and rtems_footer.html.
+
+2000-08-10 Joel Sherrill <joel@OARcorp.com>
+
+ * ChangeLog: New file.
diff --git a/doc/supplements/sh/Makefile.am b/doc/supplements/sh/Makefile.am
new file mode 100644
index 0000000000..388173e524
--- /dev/null
+++ b/doc/supplements/sh/Makefile.am
@@ -0,0 +1,111 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = sh
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/supplements/supplement.am
+
+GENERATED_FILES = cpumodel.texi callconv.texi memmodel.texi intr.texi \
+ fatalerr.texi bsp.texi cputable.texi wksheets.texi timing.texi \
+ timeBSP.texi
+
+COMMON_FILES += $(top_srcdir)/common/cpright.texi \
+ $(top_srcdir)/common/timemac.texi
+
+FILES = preface.texi
+
+info_TEXINFOS = sh.texi
+sh_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+#
+# Chapters which get automatic processing
+#
+
+cpumodel.texi: cpumodel.t
+ $(BMENU2) -p "Preface" \
+ -u "Top" \
+ -n "Calling Conventions" < $< > $@
+
+callconv.texi: callconv.t
+ $(BMENU2) -p "CPU Model Dependent Features Another Optional Feature" \
+ -u "Top" \
+ -n "Memory Model" < $< > $@
+
+memmodel.texi: memmodel.t
+ $(BMENU2) -p "Calling Conventions User-Provided Routines" \
+ -u "Top" \
+ -n "Interrupt Processing" < $< > $@
+
+# Interrupt Chapter:
+# 1. Replace Times and Sizes
+# 2. Build Node Structure
+intr.texi: intr_NOTIMES.t BSP_TIMES
+ ${REPLACE2} -p $(srcdir)/BSP_TIMES $(srcdir)/intr_NOTIMES.t | \
+ $(BMENU2) -p "Memory Model Flat Memory Model" \
+ -u "Top" \
+ -n "Default Fatal Error Processing" > $@
+
+fatalerr.texi: fatalerr.t
+ $(BMENU2) -p "Interrupt Processing Interrupt Stack" \
+ -u "Top" \
+ -n "Board Support Packages" < $< > $@
+
+bsp.texi: bsp.t
+ $(BMENU2) -p "Default Fatal Error Processing Default Fatal Error Handler Operations" \
+ -u "Top" \
+ -n "Processor Dependent Information Table" < $< > $@
+
+cputable.texi: cputable.t
+ $(BMENU2) -p "Board Support Packages Processor Initialization" \
+ -u "Top" \
+ -n "Memory Requirements" < $< > $@
+
+# Worksheets Chapter:
+# 1. Copy the Shared File
+# 2. Replace Times and Sizes
+# 3. Build Node Structure
+
+wksheets.texi: $(top_srcdir)/common/wksheets.t BSP_TIMES
+ ${REPLACE2} -p $(srcdir)/BSP_TIMES \
+ $(top_srcdir)/common/wksheets.t | \
+ $(BMENU2) -p "Processor Dependent Information Table CPU Dependent Information Table" \
+ -u "Top" \
+ -n "Timing Specification" > $@
+
+# Timing Specification Chapter:
+# 1. Copy the Shared File
+# 3. Build Node Structure
+
+timing.texi: $(top_srcdir)/common/timing.t
+ $(BMENU2) -p "Memory Requirements RTEMS RAM Workspace Worksheet" \
+ -u "Top" \
+ -n "BSP_FOR_TIMES Timing Data" < $< > $@
+
+# Timing Data for BSP Chapter:
+# 1. Copy the Shared File
+# 2. Replace Times and Sizes
+# 3. Build Node Structure
+
+timeBSP.texi: $(top_srcdir)/common/timetbl.t timeBSP.t
+ cat $(srcdir)/timeBSP.t $(top_srcdir)/common/timetbl.t >timeBSP_.t
+ @echo >>timeBSP_.t
+ @echo "@tex" >>timeBSP_.t
+ @echo "\\global\\advance \\smallskipamount by 4pt" >>timeBSP_.t
+ @echo "@end tex" >>timeBSP_.t
+ ${REPLACE2} -p $(srcdir)/BSP_TIMES timeBSP_.t | \
+ $(BMENU2) -p "Timing Specification Terminology" \
+ -u "Top" \
+ -n "Command and Variable Index" > $@
+CLEANFILES += timeBSP_.t
+
+EXTRA_DIST = BSP_TIMES bsp.t callconv.t cpumodel.t cputable.t fatalerr.t \
+ intr_NOTIMES.t memmodel.t timeBSP.t
+
+CLEANFILES += sh.info sh.info-?
diff --git a/doc/supplements/sh/bsp.t b/doc/supplements/sh/bsp.t
new file mode 100644
index 0000000000..657c359a96
--- /dev/null
+++ b/doc/supplements/sh/bsp.t
@@ -0,0 +1,93 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Board Support Packages
+
+@section Introduction
+
+An RTEMS Board Support Package (BSP) must be designed
+to support a particular processor and target board combination.
+This chapter presents a discussion of XXX specific BSP
+issues. For more information on developing a BSP, refer to the
+chapter titled Board Support Packages in the RTEMS
+Applications User's Guide.
+
+@section System Reset
+
+An RTEMS based application is initiated or
+re-initiated when the XXX processor is reset. When the
+XXX is reset, the processor performs the following actions:
+
+@itemize @bullet
+@item The tracing bits of the status register are cleared to
+disable tracing.
+
+@item The supervisor interrupt state is entered by setting the
+supervisor (S) bit and clearing the master/interrupt (M) bit of
+the status register.
+
+@item The interrupt mask of the status register is set to
+level 7 to effectively disable all maskable interrupts.
+
+@item The vector base register (VBR) is set to zero.
+
+@item The cache control register (CACR) is set to zero to
+disable and freeze the processor cache.
+
+@item The interrupt stack pointer (ISP) is set to the value
+stored at vector 0 (bytes 0-3) of the exception vector table
+(EVT).
+
+@item The program counter (PC) is set to the value stored at
+vector 1 (bytes 4-7) of the EVT.
+
+@item The processor begins execution at the address stored in
+the PC.
+@end itemize
+
+@section Processor Initialization
+
+The address of the application's initialization code
+should be stored in the first vector of the EVT which will allow
+the immediate vectoring to the application code. If the
+application requires that the VBR be some value besides zero,
+then it should be set to the required value at this point. All
+tasks share the same XXX's VBR value. Because interrupts
+are enabled automatically by RTEMS as part of the initialize
+executive directive, the VBR MUST be set before this directive
+is invoked to insure correct interrupt vectoring. If processor
+caching is to be utilized, then it should be enabled during the
+reset application initialization code.
+
+In addition to the requirements described in the
+Board Support Packages chapter of the Applications User's
+Manual for the reset code which is executed before the call to
+initialize executive, the XXX version has the following
+specific requirements:
+
+@itemize @bullet
+@item Must leave the S bit of the status register set so that
+the XXX remains in the supervisor state.
+
+@item Must set the M bit of the status register to remove the
+XXX from the interrupt state.
+
+@item Must set the master stack pointer (MSP) such that a
+minimum stack size of MINIMUM_STACK_SIZE bytes is provided for
+the initialize executive directive.
+
+@item Must initialize the XXX's vector table.
+@end itemize
+
+Note that the BSP is not responsible for allocating
+or installing the interrupt stack. RTEMS does this
+automatically as part of initialization. If the BSP does not
+install an interrupt stack and -- for whatever reason -- an
+interrupt occurs before initialize_executive is invoked, then
+the results are unpredictable.
+
diff --git a/doc/supplements/sh/callconv.t b/doc/supplements/sh/callconv.t
new file mode 100644
index 0000000000..89ac51db68
--- /dev/null
+++ b/doc/supplements/sh/callconv.t
@@ -0,0 +1,102 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Calling Conventions
+
+@section Introduction
+
+Each high-level language compiler generates
+subroutine entry and exit code based upon a set of rules known
+as the compiler's calling convention. These rules address the
+following issues:
+
+@itemize @bullet
+@item register preservation and usage
+@item parameter passing
+@item call and return mechanism
+@end itemize
+
+A compiler's calling convention is of importance when
+interfacing to subroutines written in another language either
+assembly or high-level. Even when the high-level language and
+target processor are the same, different compilers may use
+different calling conventions. As a result, calling conventions
+are both processor and compiler dependent.
+
+The Hitachi SH architecture supports a simple yet
+effective call and return mechanism. A subroutine is invoked
+via the branch to subroutine (XXX) or the jump to subroutine
+(XXX) instructions. These instructions push the return address
+on the current stack. The return from subroutine (rts)
+instruction pops the return address off the current stack and
+transfers control to that instruction. It is is important to
+note that the MC68xxx call and return mechanism does not
+automatically save or restore any registers. It is the
+responsibility of the high-level language compiler to define the
+register preservation and usage convention.
+
+@section Calling Mechanism
+
+All RTEMS directives are invoked using either a bsr
+or jsr instruction and return to the user application via the
+rts instruction.
+
+@section Register Usage
+
+As discussed above, the bsr and jsr instructions do
+not automatically save any registers. RTEMS uses the registers
+D0, D1, A0, and A1 as scratch registers. These registers are
+not preserved by RTEMS directives therefore, the contents of
+these registers should not be assumed upon return from any RTEMS
+directive.
+
+
+> > The SH1 has 16 general registers (r0..r15)
+> > r0..r3 used as general volatile registers
+> > r4..r7 used to pass up to 4 arguments to functions, arguments above 4 are
+> > passed via the stack)
+> > r8..13 caller saved registers (i.e. push them to the stack if you need them
+> > inside of a function)
+> > r14 frame pointer
+> > r15 stack pointer
+>
+
+
+@section Parameter Passing
+
+RTEMS assumes that arguments are placed on the
+current stack before the directive is invoked via the bsr or jsr
+instruction. The first argument is assumed to be closest to the
+return address on the stack. This means that the first argument
+of the C calling sequence is pushed last. The following
+pseudo-code illustrates the typical sequence used to call a
+RTEMS directive with three (3) arguments:
+
+@example
+@group
+push third argument
+push second argument
+push first argument
+invoke directive
+remove arguments from the stack
+@end group
+@end example
+
+The arguments to RTEMS are typically pushed onto the
+stack using a move instruction with a pre-decremented stack
+pointer as the destination. These arguments must be removed
+from the stack after control is returned to the caller. This
+removal is typically accomplished by adding the size of the
+argument list in bytes to the current stack pointer.
+
+@section User-Provided Routines
+
+All user-provided routines invoked by RTEMS, such as
+user extensions, device drivers, and MPCI routines, must also
+adhere to these calling conventions.
+
diff --git a/doc/supplements/sh/cpumodel.t b/doc/supplements/sh/cpumodel.t
new file mode 100644
index 0000000000..c366970ae1
--- /dev/null
+++ b/doc/supplements/sh/cpumodel.t
@@ -0,0 +1,68 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter CPU Model Dependent Features
+
+@section Introduction
+
+Microprocessors are generally classified into
+families with a variety of CPU models or implementations within
+that family. Within a processor family, there is a high level
+of binary compatibility. This family may be based on either an
+architectural specification or on maintaining compatibility with
+a popular processor. Recent microprocessor families such as the
+SPARC or PowerPC are based on an architectural specification
+which is independent or any particular CPU model or
+implementation. Older families such as the M68xxx and the iX86
+evolved as the manufacturer strived to produce higher
+performance processor models which maintained binary
+compatibility with older models.
+
+RTEMS takes advantage of the similarity of the
+various models within a CPU family. Although the models do vary
+in significant ways, the high level of compatibility makes it
+possible to share the bulk of the CPU dependent executive code
+across the entire family. Each processor family supported by
+RTEMS has a list of features which vary between CPU models
+within a family. For example, the most common model dependent
+feature regardless of CPU family is the presence or absence of a
+floating point unit or coprocessor. When defining the list of
+features present on a particular CPU model, one simply notes
+that floating point hardware is or is not present and defines a
+single constant appropriately. Conditional compilation is
+utilized to include the appropriate source code for this CPU
+model's feature set. It is important to note that this means
+that RTEMS is thus compiled using the appropriate feature set
+and compilation flags optimal for this CPU model used. The
+alternative would be to generate a binary which would execute on
+all family members using only the features which were always
+present.
+
+This chapter presents the set of features which vary
+across SPARC implementations and are of importance to RTEMS.
+The set of CPU model feature macros are defined in the file
+cpukit/score/cpu/XXX/XXX.h based upon the particular CPU
+model defined on the compilation command line.
+
+@section CPU Model Name
+
+The macro CPU_MODEL_NAME is a string which designates
+the name of this CPU model. For example, for the MODEL
+processor, this macro is set to the string "XXX".
+
+@section Floating Point Unit
+
+The macro XXX_HAS_FPU is set to 1 to indicate that
+this CPU model has a hardware floating point unit and 0
+otherwise. It does not matter whether the hardware floating
+point support is incorporated on-chip or is an external
+coprocessor.
+
+@section Another Optional Feature
+
+The macro XXX
diff --git a/doc/supplements/sh/cputable.t b/doc/supplements/sh/cputable.t
new file mode 100644
index 0000000000..75d0fc15f6
--- /dev/null
+++ b/doc/supplements/sh/cputable.t
@@ -0,0 +1,109 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Processor Dependent Information Table
+
+@section Introduction
+
+Any highly processor dependent information required
+to describe a processor to RTEMS is provided in the CPU
+Dependent Information Table. This table is not required for all
+processors supported by RTEMS. This chapter describes the
+contents, if any, for a particular processor type.
+
+@section CPU Dependent Information Table
+
+The XXX version of the RTEMS CPU Dependent
+Information Table contains the information required to interface
+a Board Support Package and RTEMS on the XXX. This
+information is provided to allow RTEMS to interoperate
+effectively with the BSP. The C structure definition is given
+here:
+
+@example
+@group
+typedef struct @{
+ void (*pretasking_hook)( void );
+ void (*predriver_hook)( void );
+ void (*postdriver_hook)( void );
+ void (*idle_task)( void );
+ boolean do_zero_of_workspace;
+ unsigned32 idle_task_stack_size;
+ unsigned32 interrupt_stack_size;
+ unsigned32 extra_mpci_receive_server_stack;
+ void * (*stack_allocate_hook)( unsigned32 );
+ void (*stack_free_hook)( void* );
+ /* end of fields required on all CPUs */
+
+ /* XXX CPU family dependent stuff */
+@} rtems_cpu_table;
+@end group
+@end example
+
+@table @code
+@item pretasking_hook
+is the address of the user provided routine which is invoked
+once RTEMS APIs are initialized. This routine will be invoked
+before any system tasks are created. Interrupts are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item predriver_hook
+is the address of the user provided
+routine that is invoked immediately before the
+the device drivers and MPCI are initialized. RTEMS
+initialization is complete but interrupts and tasking are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item postdriver_hook
+is the address of the user provided
+routine that is invoked immediately after the
+the device drivers and MPCI are initialized. RTEMS
+initialization is complete but interrupts and tasking are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item idle_task
+is the address of the optional user
+provided routine which is used as the system's IDLE task. If
+this field is not NULL, then the RTEMS default IDLE task is not
+used. This field may be NULL to indicate that the default IDLE
+is to be used.
+
+@item do_zero_of_workspace
+indicates whether RTEMS should
+zero the Workspace as part of its initialization. If set to
+TRUE, the Workspace is zeroed. Otherwise, it is not.
+
+@item idle_task_stack_size
+is the size of the RTEMS idle task stack in bytes.
+If this number is less than MINIMUM_STACK_SIZE, then the
+idle task's stack will be MINIMUM_STACK_SIZE in byte.
+
+@item interrupt_stack_size
+is the size of the RTEMS
+allocated interrupt stack in bytes. This value must be at least
+as large as MINIMUM_STACK_SIZE.
+
+@item extra_mpci_receive_server_stack
+is the extra stack space allocated for the RTEMS MPCI receive server task
+in bytes. The MPCI receive server may invoke nearly all directives and
+may require extra stack space on some targets.
+
+@item stack_allocate_hook
+is the address of the optional user provided routine which allocates
+memory for task stacks. If this hook is not NULL, then a stack_free_hook
+must be provided as well.
+
+@item stack_free_hook
+is the address of the optional user provided routine which frees
+memory for task stacks. If this hook is not NULL, then a stack_allocate_hook
+must be provided as well.
+
+@item XXX
+is where the CPU family dependent stuff goes.
+
+@end table
diff --git a/doc/supplements/sh/fatalerr.t b/doc/supplements/sh/fatalerr.t
new file mode 100644
index 0000000000..53efad0435
--- /dev/null
+++ b/doc/supplements/sh/fatalerr.t
@@ -0,0 +1,31 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Default Fatal Error Processing
+
+@section Introduction
+
+Upon detection of a fatal error by either the
+application or RTEMS the fatal error manager is invoked. The
+fatal error manager will invoke the user-supplied fatal error
+handlers. If no user-supplied handlers are configured, the
+RTEMS provided default fatal error handler is invoked. If the
+user-supplied fatal error handlers return to the executive the
+default fatal error handler is then invoked. This chapter
+describes the precise operations of the default fatal error
+handler.
+
+@section Default Fatal Error Handler Operations
+
+The default fatal error handler which is invoked by
+the @code{rtems_fatal_error_occurred} directive when there is
+no user handler configured or the user handler returns control to
+RTEMS. The default fatal error handler disables processor interrupts,
+places the error code in @b{XXX}, and executes a @code{XXX}
+instruction to simulate a halt processor instruction.
+
diff --git a/doc/supplements/sh/intr_NOTIMES.t b/doc/supplements/sh/intr_NOTIMES.t
new file mode 100644
index 0000000000..d642ce1ddf
--- /dev/null
+++ b/doc/supplements/sh/intr_NOTIMES.t
@@ -0,0 +1,196 @@
+@c
+@c Interrupt Stack Frame Picture
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Interrupt Processing
+
+@section Introduction
+
+Different types of processors respond to the
+occurrence of an interrupt in its own unique fashion. In
+addition, each processor type provides a control mechanism to
+allow for the proper handling of an interrupt. The processor
+dependent response to the interrupt modifies the current
+execution state and results in a change in the execution stream.
+Most processors require that an interrupt handler utilize some
+special control mechanisms to return to the normal processing
+stream. Although RTEMS hides many of the processor dependent
+details of interrupt processing, it is important to understand
+how the RTEMS interrupt manager is mapped onto the processor's
+unique architecture. Discussed in this chapter are the SH's
+interrupt response and control mechanisms as they pertain to
+RTEMS.
+
+@section Vectoring of an Interrupt Handler
+
+Depending on whether or not the particular CPU
+supports a separate interrupt stack, the SH family has two
+different interrupt handling models.
+
+@subsection Models Without Separate Interrupt Stacks
+
+Upon receipt of an interrupt the SH family
+members without separate interrupt stacks automatically perform
+the following actions:
+
+@itemize @bullet
+@item To Be Written
+@end itemize
+
+@subsection Models With Separate Interrupt Stacks
+
+Upon receipt of an interrupt the SH family
+members with separate interrupt stacks automatically perform the
+following actions:
+
+@itemize @bullet
+@item saves the current status register (SR),
+
+@item clears the master/interrupt (M) bit of the SR to
+indicate the switch from master state to interrupt state,
+
+@item sets the privilege mode to supervisor,
+
+@item suppresses tracing,
+
+@item sets the interrupt mask level equal to the level of the
+interrupt being serviced,
+
+@item pushes an interrupt stack frame (ISF), which includes
+the program counter (PC), the status register (SR), and the
+format/exception vector offset (FVO) word, onto the supervisor
+and interrupt stacks,
+
+@item switches the current stack to the interrupt stack and
+vectors to an interrupt service routine (ISR). If the ISR was
+installed with the interrupt_catch directive, then the RTEMS
+interrupt handler will begin execution. The RTEMS interrupt
+handler saves all registers which are not preserved according to
+the calling conventions and invokes the application's ISR.
+@end itemize
+
+A nested interrupt is processed similarly by these
+CPU models with the exception that only a single ISF is placed
+on the interrupt stack and the current stack need not be
+switched.
+
+The FVO word in the Interrupt Stack Frame is examined
+by RTEMS to determine when an outer most interrupt is being
+exited. Since the FVO is used by RTEMS for this purpose, the
+user application code MUST NOT modify this field.
+
+The following shows the Interrupt Stack Frame for
+XXX CPU models with separate interrupt stacks:
+
+@ifset use-ascii
+@example
+@group
+ +----------------------+
+ | Status Register | 0x0
+ +----------------------+
+ | Program Counter High | 0x2
+ +----------------------+
+ | Program Counter Low | 0x4
+ +----------------------+
+ | Format/Vector Offset | 0x6
+ +----------------------+
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@sp 1
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\strut\vrule#&
+\hbox to 2.00in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 0.50in{\enskip\hfil#\hfil}
+\cr
+\multispan{3}\hrulefill\cr
+& Status Register && 0x0\cr
+\multispan{3}\hrulefill\cr
+& Program Counter High && 0x2\cr
+\multispan{3}\hrulefill\cr
+& Program Counter Low && 0x4\cr
+\multispan{3}\hrulefill\cr
+& Format/Vector Offset && 0x6\cr
+\multispan{3}\hrulefill\cr
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=2 WIDTH="40%" BORDER=2>
+<TR><TD ALIGN=center><STRONG>Status Register</STRONG></TD>
+ <TD ALIGN=center>0x0</TD></TR>
+<TR><TD ALIGN=center><STRONG>Program Counter High</STRONG></TD>
+ <TD ALIGN=center>0x2</TD></TR>
+<TR><TD ALIGN=center><STRONG>Program Counter Low</STRONG></TD>
+ <TD ALIGN=center>0x4</TD></TR>
+<TR><TD ALIGN=center><STRONG>Format/Vector Offset</STRONG></TD>
+ <TD ALIGN=center>0x6</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+@section Interrupt Levels
+
+Eight levels (0-7) of interrupt priorities are
+supported by XXX family members with level seven (7) being
+the highest priority. Level zero (0) indicates that interrupts
+are fully enabled. Interrupt requests for interrupts with
+priorities less than or equal to the current interrupt mask
+level are ignored.
+
+Although RTEMS supports 256 interrupt levels, the
+XXX family only supports eight. RTEMS interrupt levels 0
+through 7 directly correspond to XXX interrupt levels. All
+other RTEMS interrupt levels are undefined and their behavior is
+unpredictable.
+
+@section Disabling of Interrupts by RTEMS
+
+During the execution of directive calls, critical
+sections of code may be executed. When these sections are
+encountered, RTEMS disables interrupts to level seven (7) before
+the execution of this section and restores them to the previous
+level upon completion of the section. RTEMS has been optimized
+to insure that interrupts are disabled for less than
+RTEMS_MAXIMUM_DISABLE_PERIOD microseconds on a
+RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ Mhz XXX with
+zero wait states. These numbers will vary based the
+number of wait states and processor speed present on the target board.
+[NOTE: The maximum period with interrupts disabled is hand calculated. This
+calculation was last performed for Release
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD.]
+
+Non-maskable interrupts (NMI) cannot be disabled, and
+ISRs which execute at this level MUST NEVER issue RTEMS system
+calls. If a directive is invoked, unpredictable results may
+occur due to the inability of RTEMS to protect its critical
+sections. However, ISRs that make no system calls may safely
+execute as non-maskable interrupts.
+
+@section Interrupt Stack
+
+RTEMS allocates the interrupt stack from the
+Workspace Area. The amount of memory allocated for the
+interrupt stack is determined by the interrupt_stack_size field
+in the CPU Configuration Table. During the initialization
+process, RTEMS will install its interrupt stack.
+
+The XXX port of RTEMS supports a software managed
+dedicated interrupt stack on those CPU models which do not
+support a separate interrupt stack in hardware.
+
+
diff --git a/doc/supplements/sh/memmodel.t b/doc/supplements/sh/memmodel.t
new file mode 100644
index 0000000000..ef35072230
--- /dev/null
+++ b/doc/supplements/sh/memmodel.t
@@ -0,0 +1,39 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Memory Model
+
+@section Introduction
+
+A processor may support any combination of memory
+models ranging from pure physical addressing to complex demand
+paged virtual memory systems. RTEMS supports a flat memory
+model which ranges contiguously over the processor's allowable
+address space. RTEMS does not support segmentation or virtual
+memory of any kind. The appropriate memory model for RTEMS
+provided by the targeted processor and related characteristics
+of that model are described in this chapter.
+
+@section Flat Memory Model
+
+The XXX family supports a flat 32-bit address
+space with addresses ranging from 0x00000000 to 0xFFFFFFFF (4
+gigabytes). Each address is represented by a 32-bit value and
+is byte addressable. The address may be used to reference a
+single byte, word (2-bytes), or long word (4 bytes). Memory
+accesses within this address space are performed in big endian
+fashion by the processors in this family.
+
+Some of the XXX family members such as the
+XXX, XXX, and XXX support virtual memory and
+segmentation. The XXX requires external hardware support
+such as the XXX Paged Memory Management Unit coprocessor
+which is typically used to perform address translations for
+these systems. RTEMS does not support virtual memory or
+segmentation on any of the XXX family members.
+
diff --git a/doc/supplements/sh/preface.texi b/doc/supplements/sh/preface.texi
new file mode 100644
index 0000000000..686a17b48d
--- /dev/null
+++ b/doc/supplements/sh/preface.texi
@@ -0,0 +1,55 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Preface, CPU Model Dependent Features, Top, Top
+@end ifinfo
+@unnumbered Preface
+
+The Real Time Executive for Multiprocessor Systems (RTEMS)
+is designed to be portable across multiple processor
+architectures. However, the nature of real-time systems makes
+it essential that the application designer understand certain
+processor dependent implementation details. These processor
+dependencies include calling convention, board support package
+issues, interrupt processing, exact RTEMS memory requirements,
+performance data, header files, and the assembly language
+interface to the executive.
+
+This document discusses the VENDOR XXX
+architecture dependencies in this port of RTEMS. The XXX
+family has a wide variety of CPU models within it. The part
+numbers ...
+
+XXX fill in some things here
+
+It is highly recommended that the XXX
+RTEMS application developer obtain and become familiar with the
+documentation for the processor being used as well as the
+documentation for the family as a whole.
+
+@subheading Architecture Documents
+
+For information on the XXX architecture,
+refer to the following documents available from VENDOR
+(@file{http//www.XXX.com/}):
+
+@itemize @bullet
+@item @cite{XXX Family Reference, VENDOR, PART NUMBER}.
+@end itemize
+
+@subheading MODEL SPECIFIC DOCUMENTS
+
+For information on specific processor models and
+their associated coprocessors, refer to the following documents:
+
+@itemize @bullet
+@item @cite{XXX MODEL Manual, VENDOR, PART NUMBER}.
+@item @cite{XXX MODEL Manual, VENDOR, PART NUMBER}.
+@end itemize
+
diff --git a/doc/supplements/sh/sh.texi b/doc/supplements/sh/sh.texi
new file mode 100644
index 0000000000..50dff26ec6
--- /dev/null
+++ b/doc/supplements/sh/sh.texi
@@ -0,0 +1,114 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename sh.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the Template Applications Supplement
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS Target Supplements
+@direntry
+* RTEMS Hitachi SH Applications Supplement: (sh).
+@end direntry
+@end ifset
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage RTEMS Hitachi SH Applications Supplement
+
+@setchapternewpage odd
+@settitle RTEMS Hitachi SH Applications Supplement
+@titlepage
+@finalout
+
+@title RTEMS Hitachi SH Applications Supplement
+@subtitle Edition @value{EDITION}, for RTEMS @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include preface.texi
+@include cpumodel.texi
+@include callconv.texi
+@include memmodel.texi
+@include intr.texi
+@include fatalerr.texi
+@include bsp.texi
+@include cputable.texi
+@include wksheets.texi
+@include timing.texi
+@include timeBSP.texi
+@ifinfo
+@node Top, Preface, (dir), (dir)
+@top sh
+
+This is the online version of the RTEMS Hitachi SH Applications Supplement.
+
+@menu
+* Preface::
+* CPU Model Dependent Features::
+* Calling Conventions::
+* Memory Model::
+* Interrupt Processing::
+* Default Fatal Error Processing::
+* Board Support Packages::
+* Processor Dependent Information Table::
+* Memory Requirements::
+* Timing Specification::
+* BSP_FOR_TIMES Timing Data::
+* Command and Variable Index::
+* Concept Index::
+@end menu
+
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@node Command and Variable Index, Concept Index, BSP_FOR_TIMES Timing Data Rate Monotonic Manager, Top
+@unnumbered Command and Variable Index
+
+There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@node Concept Index, , Command and Variable Index, Top
+@unnumbered Concept Index
+
+There are currently no Concept Index entries.
+@c @printindex cp
+
+@contents
+@bye
+
diff --git a/doc/supplements/sh/timeBSP.t b/doc/supplements/sh/timeBSP.t
new file mode 100644
index 0000000000..1439bb56bf
--- /dev/null
+++ b/doc/supplements/sh/timeBSP.t
@@ -0,0 +1,112 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@include common/timemac.texi
+@tex
+\global\advance \smallskipamount by -4pt
+@end tex
+
+@chapter BSP_FOR_TIMES Timing Data
+
+@section Introduction
+
+The timing data for the SH version of RTEMS is
+provided along with the target dependent aspects concerning the
+gathering of the timing data. The hardware platform used to
+gather the times is described to give the reader a better
+understanding of each directive time provided. Also, provided
+is a description of the interrupt latency and the context switch
+times as they pertain to the SH version of RTEMS.
+
+@section Hardware Platform
+
+All times reported except for the maximum period
+interrupts are disabled by RTEMS were measured using a Motorola
+BSP_FOR_TIMES CPU board. The BSP_FOR_TIMES is a RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+Mhz board with one wait
+state dynamic memory and a XXX numeric coprocessor. The
+Zilog 8036 countdown timer on this board was used to measure
+elapsed time with a one-half microsecond resolution. All
+sources of hardware interrupts were disabled, although the
+interrupt level of the XXX allows all interrupts.
+
+The maximum period interrupts are disabled was
+measured by summing the number of CPU cycles required by each
+assembly language instruction executed while interrupts were
+disabled. The worst case times of the XXX microprocessor
+were used for each instruction. Zero wait state memory was
+assumed. The total CPU cycles executed with interrupts
+disabled, including the instructions to disable and enable
+interrupts, was divided by 20 to simulate a RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+Mhz processor. It
+should be noted that the worst case instruction times for the
+processor assume that the internal cache is disabled and that no
+instructions overlap.
+
+@section Interrupt Latency
+
+The maximum period with interrupts disabled within
+RTEMS is less than RTEMS_MAXIMUM_DISABLE_PERIOD
+microseconds including the instructions
+which disable and re-enable interrupts. The time required for
+the processor to vector an interrupt and for the RTEMS entry
+overhead before invoking the user's interrupt handler are a
+total of RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK
+microseconds. These combine to yield a worst case
+interrupt latency of less than
+RTEMS_MAXIMUM_DISABLE_PERIOD + RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK
+microseconds at RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+Mhz. [NOTE: The maximum period with interrupts
+disabled was last determined for Release
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD.]
+
+It should be noted again that the maximum period with
+interrupts disabled within RTEMS is hand-timed and based upon
+worst case (i.e. CPU cache disabled and no instruction overlap)
+times for a RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+Mhz processor. The interrupt vector and entry
+overhead time was generated on an BSP_FOR_TIMES benchmark platform
+using the Multiprocessing Communications registers to generate
+as the interrupt source.
+
+@section Context Switch
+
+The RTEMS processor context switch time is RTEMS_NO_FP_CONTEXTS
+microseconds on the BSP_FOR_TIMES benchmark platform when no floating
+point context is saved or restored. Additional execution time
+is required when a TASK_SWITCH user extension is configured.
+The use of the TASK_SWITCH extension is application dependent.
+Thus, its execution time is not considered part of the raw
+context switch time.
+
+Since RTEMS was designed specifically for embedded
+missile applications which are floating point intensive, the
+executive is optimized to avoid unnecessarily saving and
+restoring the state of the numeric coprocessor. The state of
+the numeric coprocessor is only saved when an FLOATING_POINT
+task is dispatched and that task was not the last task to
+utilize the coprocessor. In a system with only one
+FLOATING_POINT task, the state of the numeric coprocessor will
+never be saved or restored. When the first FLOATING_POINT task
+is dispatched, RTEMS does not need to save the current state of
+the numeric coprocessor.
+
+The exact amount of time required to save and restore
+floating point context is dependent on whether an XXX or
+XXX is being used as well as the state of the numeric
+coprocessor. These numeric coprocessors define three operating
+states: initialized, idle, and busy. RTEMS places the
+coprocessor in the initialized state when a task is started or
+restarted. Once the task has utilized the coprocessor, it is in
+the idle state when floating point instructions are not
+executing and the busy state when floating point instructions
+are executing. The state of the coprocessor is task specific.
+
+The following table summarizes the context switch
+times for the BSP_FOR_TIMES benchmark platform:
+
diff --git a/doc/supplements/sparc/.cvsignore b/doc/supplements/sparc/.cvsignore
new file mode 100644
index 0000000000..382a5745fc
--- /dev/null
+++ b/doc/supplements/sparc/.cvsignore
@@ -0,0 +1,38 @@
+bsp.texi
+callconv.texi
+cpumodel.texi
+cputable.texi
+fatalerr.texi
+index.html
+intr.t
+intr.texi
+Makefile
+Makefile.in
+mdate-sh
+memmodel.texi
+rtems_footer.html
+rtems_header.html
+sparc
+sparc-?
+sparc-??
+sparc.aux
+sparc.cp
+sparc.dvi
+sparc.fn
+sparc*.html
+sparc.ky
+sparc.log
+sparc.pdf
+sparc.pg
+sparc.ps
+sparc.toc
+sparc.tp
+sparc.vr
+stamp-vti
+timeERC32_.t
+timeERC32.texi
+timing.t
+timing.texi
+version.texi
+wksheets.t
+wksheets.texi
diff --git a/doc/supplements/sparc/ChangeLog b/doc/supplements/sparc/ChangeLog
new file mode 100644
index 0000000000..ee5e300ac1
--- /dev/null
+++ b/doc/supplements/sparc/ChangeLog
@@ -0,0 +1,72 @@
+2003-12-12 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-12-11 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-11-26 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Add *.info to CLEANFILES to accomodate
+ automake-1.7f/1.8 breaking building infos.
+
+2003-09-26 Joel Sherrill <joel@OARcorp.com>
+
+ * cpumodel.t: Obsoleting HP PA-RISC port and removing all references.
+
+2003-09-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Merger from rtems-4-6-branch.
+
+2003-09-19 Joel Sherrill <joel@OARcorp.com>
+
+ * sparc.texi: Merge from branch.
+
+2003-05-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * cpumodel.t: Reflect c/src/exec having moved to cpukit.
+
+2003-01-25 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * sparc.texi: Set @setfilename sparc.info.
+
+2003-01-24 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Put GENERATED_FILES into $builddir.
+
+2003-01-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * version.texi: Remove from CVS.
+ * stamp-vti: Remove from CVS.
+ * .cvsignore: Add version.texi.
+ Add stamp-vti.
+ Re-sort.
+
+2003-01-21 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-11-13 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-10-24 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-03-27 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Remove AUTOMAKE_OPTIONS.
+
+2002-01-18 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Require automake-1.5.
+
+2001-01-17 Joel Sherrill <joel@OARcorp.com>
+
+ * .cvsignore: Added rtems_header.html and rtems_footer.html.
+
+2000-08-10 Joel Sherrill <joel@OARcorp.com>
+
+ * ChangeLog: New file.
diff --git a/doc/supplements/sparc/ERC32_TIMES b/doc/supplements/sparc/ERC32_TIMES
new file mode 100644
index 0000000000..4f9ce4c98b
--- /dev/null
+++ b/doc/supplements/sparc/ERC32_TIMES
@@ -0,0 +1,247 @@
+#
+# SPARC/ERC32/SIS Timing and Size Information
+#
+# $Id$
+#
+
+#
+# CPU Model Information
+#
+RTEMS_BSP ERC32
+RTEMS_CPU_MODEL ERC32
+#
+# Interrupt Latency
+#
+# NOTE: In general, the text says it is hand-calculated to be
+# RTEMS_MAXIMUM_DISABLE_PERIOD at RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+# Mhz and this was last calculated for Release
+# RTEMS_VERSION_FOR_MAXIMUM_DISABLE_PERIOD.
+#
+RTEMS_MAXIMUM_DISABLE_PERIOD TBD
+RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ 15.0
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD 4.2.0-prerelease
+#
+# Context Switch Times
+#
+RTEMS_NO_FP_CONTEXTS 21
+RTEMS_RESTORE_1ST_FP_TASK 26
+RTEMS_SAVE_INIT_RESTORE_INIT 24
+RTEMS_SAVE_IDLE_RESTORE_INIT 23
+RTEMS_SAVE_IDLE_RESTORE_IDLE 33
+#
+# Task Manager Times
+#
+RTEMS_TASK_CREATE_ONLY 59
+RTEMS_TASK_IDENT_ONLY 163
+RTEMS_TASK_START_ONLY 30
+RTEMS_TASK_RESTART_CALLING_TASK 64
+RTEMS_TASK_RESTART_SUSPENDED_RETURNS_TO_CALLER 36
+RTEMS_TASK_RESTART_BLOCKED_RETURNS_TO_CALLER 47
+RTEMS_TASK_RESTART_READY_RETURNS_TO_CALLER 37
+RTEMS_TASK_RESTART_SUSPENDED_PREEMPTS_CALLER 77
+RTEMS_TASK_RESTART_BLOCKED_PREEMPTS_CALLER 84
+RTEMS_TASK_RESTART_READY_PREEMPTS_CALLER 75
+RTEMS_TASK_DELETE_CALLING_TASK 91
+RTEMS_TASK_DELETE_SUSPENDED_TASK 47
+RTEMS_TASK_DELETE_BLOCKED_TASK 50
+RTEMS_TASK_DELETE_READY_TASK 51
+RTEMS_TASK_SUSPEND_CALLING_TASK 56
+RTEMS_TASK_SUSPEND_RETURNS_TO_CALLER 16
+RTEMS_TASK_RESUME_TASK_READIED_RETURNS_TO_CALLER 17
+RTEMS_TASK_RESUME_TASK_READIED_PREEMPTS_CALLER 52
+RTEMS_TASK_SET_PRIORITY_OBTAIN_CURRENT_PRIORITY 10
+RTEMS_TASK_SET_PRIORITY_RETURNS_TO_CALLER 25
+RTEMS_TASK_SET_PRIORITY_PREEMPTS_CALLER 67
+RTEMS_TASK_MODE_OBTAIN_CURRENT_MODE 5
+RTEMS_TASK_MODE_NO_RESCHEDULE 6
+RTEMS_TASK_MODE_RESCHEDULE_RETURNS_TO_CALLER 9
+RTEMS_TASK_MODE_RESCHEDULE_PREEMPTS_CALLER 42
+RTEMS_TASK_GET_NOTE_ONLY 10
+RTEMS_TASK_SET_NOTE_ONLY 10
+RTEMS_TASK_WAKE_AFTER_YIELD_RETURNS_TO_CALLER 6
+RTEMS_TASK_WAKE_AFTER_YIELD_PREEMPTS_CALLER 49
+RTEMS_TASK_WAKE_WHEN_ONLY 75
+#
+# Interrupt Manager
+#
+RTEMS_INTR_ENTRY_RETURNS_TO_NESTED 7
+RTEMS_INTR_ENTRY_RETURNS_TO_INTERRUPTED_TASK 8
+RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK 8
+RTEMS_INTR_EXIT_RETURNS_TO_NESTED 5
+RTEMS_INTR_EXIT_RETURNS_TO_INTERRUPTED_TASK 7
+RTEMS_INTR_EXIT_RETURNS_TO_PREEMPTING_TASK 14
+#
+# Clock Manager
+#
+RTEMS_CLOCK_SET_ONLY 33
+RTEMS_CLOCK_GET_ONLY 4
+RTEMS_CLOCK_TICK_ONLY 6
+#
+# Timer Manager
+#
+RTEMS_TIMER_CREATE_ONLY 11
+RTEMS_TIMER_IDENT_ONLY 159
+RTEMS_TIMER_DELETE_INACTIVE 15
+RTEMS_TIMER_DELETE_ACTIVE 17
+RTEMS_TIMER_FIRE_AFTER_INACTIVE 21
+RTEMS_TIMER_FIRE_AFTER_ACTIVE 23
+RTEMS_TIMER_FIRE_WHEN_INACTIVE 34
+RTEMS_TIMER_FIRE_WHEN_ACTIVE 34
+RTEMS_TIMER_RESET_INACTIVE 20
+RTEMS_TIMER_RESET_ACTIVE 22
+RTEMS_TIMER_CANCEL_INACTIVE 10
+RTEMS_TIMER_CANCEL_ACTIVE 13
+#
+# Semaphore Manager
+#
+RTEMS_SEMAPHORE_CREATE_ONLY 19
+RTEMS_SEMAPHORE_IDENT_ONLY 171
+RTEMS_SEMAPHORE_DELETE_ONLY 19
+RTEMS_SEMAPHORE_OBTAIN_AVAILABLE 12
+RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_NO_WAIT 12
+RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_CALLER_BLOCKS 67
+RTEMS_SEMAPHORE_RELEASE_NO_WAITING_TASKS 14
+RTEMS_SEMAPHORE_RELEASE_TASK_READIED_RETURNS_TO_CALLER 23
+RTEMS_SEMAPHORE_RELEASE_TASK_READIED_PREEMPTS_CALLER 57
+#
+# Message Manager
+#
+RTEMS_MESSAGE_QUEUE_CREATE_ONLY 114
+RTEMS_MESSAGE_QUEUE_IDENT_ONLY 159
+RTEMS_MESSAGE_QUEUE_DELETE_ONLY 25
+RTEMS_MESSAGE_QUEUE_SEND_NO_WAITING_TASKS 36
+RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_RETURNS_TO_CALLER 38
+RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_PREEMPTS_CALLER 76
+RTEMS_MESSAGE_QUEUE_URGENT_NO_WAITING_TASKS 36
+RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_RETURNS_TO_CALLER 38
+RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_PREEMPTS_CALLER 76
+RTEMS_MESSAGE_QUEUE_BROADCAST_NO_WAITING_TASKS 15
+RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_RETURNS_TO_CALLER 42
+RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_PREEMPTS_CALLER 83
+RTEMS_MESSAGE_QUEUE_RECEIVE_AVAILABLE 30
+RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_NO_WAIT 13
+RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS 67
+RTEMS_MESSAGE_QUEUE_FLUSH_NO_MESSAGES_FLUSHED 9
+RTEMS_MESSAGE_QUEUE_FLUSH_MESSAGES_FLUSHED 13
+#
+# Event Manager
+#
+RTEMS_EVENT_SEND_NO_TASK_READIED 9
+RTEMS_EVENT_SEND_TASK_READIED_RETURNS_TO_CALLER 22
+RTEMS_EVENT_SEND_TASK_READIED_PREEMPTS_CALLER 58
+RTEMS_EVENT_RECEIVE_OBTAIN_CURRENT_EVENTS 1
+RTEMS_EVENT_RECEIVE_AVAILABLE 10
+RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_NO_WAIT 9
+RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS 60
+#
+# Signal Manager
+#
+RTEMS_SIGNAL_CATCH_ONLY 6
+RTEMS_SIGNAL_SEND_RETURNS_TO_CALLER 14
+RTEMS_SIGNAL_SEND_SIGNAL_TO_SELF 22
+RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_CALLING_TASK 27
+RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_PREEMPTING_TASK 56
+#
+# Partition Manager
+#
+RTEMS_PARTITION_CREATE_ONLY 34
+RTEMS_PARTITION_IDENT_ONLY 159
+RTEMS_PARTITION_DELETE_ONLY 14
+RTEMS_PARTITION_GET_BUFFER_AVAILABLE 12
+RTEMS_PARTITION_GET_BUFFER_NOT_AVAILABLE 10
+RTEMS_PARTITION_RETURN_BUFFER_ONLY 16
+#
+# Region Manager
+#
+RTEMS_REGION_CREATE_ONLY 22
+RTEMS_REGION_IDENT_ONLY 162
+RTEMS_REGION_DELETE_ONLY 14
+RTEMS_REGION_GET_SEGMENT_AVAILABLE 19
+RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_NO_WAIT 19
+RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_CALLER_BLOCKS 67
+RTEMS_REGION_RETURN_SEGMENT_NO_WAITING_TASKS 17
+RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_RETURNS_TO_CALLER 44
+RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_PREEMPTS_CALLER 77
+#
+# Dual-Ported Memory Manager
+#
+RTEMS_PORT_CREATE_ONLY 14
+RTEMS_PORT_IDENT_ONLY 159
+RTEMS_PORT_DELETE_ONLY 13
+RTEMS_PORT_INTERNAL_TO_EXTERNAL_ONLY 9
+RTEMS_PORT_EXTERNAL_TO_INTERNAL_ONLY 9
+#
+# IO Manager
+#
+RTEMS_IO_INITIALIZE_ONLY 2
+RTEMS_IO_OPEN_ONLY 1
+RTEMS_IO_CLOSE_ONLY 1
+RTEMS_IO_READ_ONLY 1
+RTEMS_IO_WRITE_ONLY 1
+RTEMS_IO_CONTROL_ONLY 1
+#
+# Rate Monotonic Manager
+#
+RTEMS_RATE_MONOTONIC_CREATE_ONLY 12
+RTEMS_RATE_MONOTONIC_IDENT_ONLY 159
+RTEMS_RATE_MONOTONIC_CANCEL_ONLY 14
+RTEMS_RATE_MONOTONIC_DELETE_ACTIVE 19
+RTEMS_RATE_MONOTONIC_DELETE_INACTIVE 16
+RTEMS_RATE_MONOTONIC_PERIOD_INITIATE_PERIOD_RETURNS_TO_CALLER 20
+RTEMS_RATE_MONOTONIC_PERIOD_CONCLUDE_PERIOD_CALLER_BLOCKS 55
+RTEMS_RATE_MONOTONIC_PERIOD_OBTAIN_STATUS 9
+#
+# Size Information
+#
+#
+# xxx alloted for numbers
+#
+RTEMS_DATA_SPACE 9059
+RTEMS_MINIMUM_CONFIGURATION 28,288
+RTEMS_MAXIMUM_CONFIGURATION 50,432
+# x,xxx alloted for numbers
+RTEMS_CORE_CODE_SIZE 20,336
+RTEMS_INITIALIZATION_CODE_SIZE 1,408
+RTEMS_TASK_CODE_SIZE 4,496
+RTEMS_INTERRUPT_CODE_SIZE 72
+RTEMS_CLOCK_CODE_SIZE 576
+RTEMS_TIMER_CODE_SIZE 1,336
+RTEMS_SEMAPHORE_CODE_SIZE 1,888
+RTEMS_MESSAGE_CODE_SIZE 2,032
+RTEMS_EVENT_CODE_SIZE 1,696
+RTEMS_SIGNAL_CODE_SIZE 664
+RTEMS_PARTITION_CODE_SIZE 1,368
+RTEMS_REGION_CODE_SIZE 1,736
+RTEMS_DPMEM_CODE_SIZE 872
+RTEMS_IO_CODE_SIZE 1,144
+RTEMS_FATAL_ERROR_CODE_SIZE 32
+RTEMS_RATE_MONOTONIC_CODE_SIZE 1,656
+RTEMS_MULTIPROCESSING_CODE_SIZE 8,328
+# xxx alloted for numbers
+RTEMS_TIMER_CODE_OPTSIZE 208
+RTEMS_SEMAPHORE_CODE_OPTSIZE 192
+RTEMS_MESSAGE_CODE_OPTSIZE 320
+RTEMS_EVENT_CODE_OPTSIZE 64
+RTEMS_SIGNAL_CODE_OPTSIZE 64
+RTEMS_PARTITION_CODE_OPTSIZE 152
+RTEMS_REGION_CODE_OPTSIZE 176
+RTEMS_DPMEM_CODE_OPTSIZE 152
+RTEMS_IO_CODE_OPTSIZE 00
+RTEMS_RATE_MONOTONIC_CODE_OPTSIZE 208
+RTEMS_MULTIPROCESSING_CODE_OPTSIZE 408
+# xxx alloted for numbers
+RTEMS_BYTES_PER_TASK 488
+RTEMS_BYTES_PER_TIMER 68
+RTEMS_BYTES_PER_SEMAPHORE 124
+RTEMS_BYTES_PER_MESSAGE_QUEUE 148
+RTEMS_BYTES_PER_REGION 144
+RTEMS_BYTES_PER_PARTITION 56
+RTEMS_BYTES_PER_PORT 36
+RTEMS_BYTES_PER_PERIOD 36
+RTEMS_BYTES_PER_EXTENSION 64
+RTEMS_BYTES_PER_FP_TASK 136
+RTEMS_BYTES_PER_NODE 48
+RTEMS_BYTES_PER_GLOBAL_OBJECT 20
+RTEMS_BYTES_PER_PROXY 124
+# x,xxx alloted for numbers
+RTEMS_BYTES_OF_FIXED_SYSTEM_REQUIREMENTS 10,072
diff --git a/doc/supplements/sparc/Makefile.am b/doc/supplements/sparc/Makefile.am
new file mode 100644
index 0000000000..14ec898a66
--- /dev/null
+++ b/doc/supplements/sparc/Makefile.am
@@ -0,0 +1,108 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = sparc
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/supplements/supplement.am
+
+GENERATED_FILES = cpumodel.texi callconv.texi memmodel.texi intr.texi \
+ fatalerr.texi bsp.texi cputable.texi timing.texi wksheets.texi \
+ timeERC32.texi
+
+COMMON_FILES += $(top_srcdir)/common/cpright.texi
+
+FILES = preface.texi
+
+info_TEXINFOS = sparc.texi
+sparc_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+#
+# Chapters which get automatic processing
+#
+
+cpumodel.texi: cpumodel.t
+ $(BMENU2) -p "Preface" \
+ -u "Top" \
+ -n "Calling Conventions" < $< > $@
+
+callconv.texi: callconv.t
+ $(BMENU2) -p "CPU Model Dependent Features CPU Model Implementation Notes" \
+ -u "Top" \
+ -n "Memory Model" < $< > $@
+
+memmodel.texi: memmodel.t
+ $(BMENU2) -p "Calling Conventions User-Provided Routines" \
+ -u "Top" \
+ -n "Interrupt Processing" < $< > $@
+
+# Interrupt Chapter:
+# 1. Replace Times and Sizes
+# 2. Build Node Structure
+intr.texi: intr_NOTIMES.t ERC32_TIMES
+ ${REPLACE2} -p $(srcdir)/ERC32_TIMES $(srcdir)/intr_NOTIMES.t | \
+ $(BMENU2) -p "Memory Model Flat Memory Model" \
+ -u "Top" \
+ -n "Default Fatal Error Processing" > $@
+
+fatalerr.texi: fatalerr.t
+ $(BMENU2) -p "Interrupt Processing Interrupt Stack" \
+ -u "Top" \
+ -n "Board Support Packages" < $< > $@
+
+bsp.texi: bsp.t
+ $(BMENU2) -p "Default Fatal Error Processing Default Fatal Error Handler Operations" \
+ -u "Top" \
+ -n "Processor Dependent Information Table" < $< > $@
+
+cputable.texi: cputable.t
+ $(BMENU2) -p "Board Support Packages Processor Initialization" \
+ -u "Top" \
+ -n "Memory Requirements" < $< > $@
+
+# Worksheets Chapter:
+# 1. Obtain the Shared File
+# 2. Replace Times and Sizes
+# 3. Build Node Structure
+
+wksheets.texi: $(top_srcdir)/common/wksheets.t ERC32_TIMES
+ ${REPLACE2} -p $(srcdir)/ERC32_TIMES $(top_srcdir)/common/wksheets.t | \
+ $(BMENU2) -p "Processor Dependent Information Table CPU Dependent Information Table" \
+ -u "Top" \
+ -n "Timing Specification" > $@
+
+# Timing Specification Chapter:
+# 1. Copy the Shared File
+# 3. Build Node Structure
+timing.texi: $(top_srcdir)/common/timing.t
+ $(BMENU2) -p "Memory Requirements RTEMS RAM Workspace Worksheet" \
+ -u "Top" \
+ -n "ERC32 Timing Data" < $< > $@
+
+# Timing Data for ERC32 BSP Chapter:
+# 1. Copy the Shared File
+# 2. Replace Times and Sizes
+# 3. Build Node Structure
+
+timeERC32.texi: $(top_srcdir)/common/timetbl.t timeERC32.t
+ cat $(srcdir)/timeERC32.t $(top_srcdir)/common/timetbl.t >timeERC32_.t
+ @echo >>timeERC32_.t
+ @echo "@tex" >>timeERC32_.t
+ @echo "\\global\\advance \\smallskipamount by 4pt" >>timeERC32_.t
+ @echo "@end tex" >>timeERC32_.t
+ ${REPLACE2} -p $(srcdir)/ERC32_TIMES timeERC32_.t | \
+ $(BMENU2) -p "Timing Specification Terminology" \
+ -u "Top" \
+ -n "Command and Variable Index" > $@
+CLEANFILES += timeERC32_.t
+
+EXTRA_DIST = ERC32_TIMES bsp.t callconv.t cpumodel.t cputable.t fatalerr.t \
+ intr_NOTIMES.t memmodel.t timeERC32.t
+
+CLEANFILES += sparc.info sparc.info-?
diff --git a/doc/supplements/sparc/bsp.t b/doc/supplements/sparc/bsp.t
new file mode 100644
index 0000000000..8810614825
--- /dev/null
+++ b/doc/supplements/sparc/bsp.t
@@ -0,0 +1,87 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Board Support Packages
+
+@section Introduction
+
+An RTEMS Board Support Package (BSP) must be designed
+to support a particular processor and target board combination.
+This chapter presents a discussion of SPARC specific BSP issues.
+For more information on developing a BSP, refer to the chapter
+titled Board Support Packages in the RTEMS
+Applications User's Guide.
+
+@section System Reset
+
+An RTEMS based application is initiated or
+re-initiated when the SPARC processor is reset. When the SPARC
+is reset, the processor performs the following actions:
+
+@itemize @bullet
+@item the enable trap (ET) of the psr is set to 0 to disable
+traps,
+
+@item the supervisor bit (S) of the psr is set to 1 to enter
+supervisor mode, and
+
+@item the PC is set 0 and the nPC is set to 4.
+@end itemize
+
+The processor then begins to execute the code at
+location 0. It is important to note that all fields in the psr
+are not explicitly set by the above steps and all other
+registers retain their value from the previous execution mode.
+This is true even of the Trap Base Register (TBR) whose contents
+reflect the last trap which occurred before the reset.
+
+@section Processor Initialization
+
+It is the responsibility of the application's
+initialization code to initialize the TBR and install trap
+handlers for at least the register window overflow and register
+window underflow conditions. Traps should be enabled before
+invoking any subroutines to allow for register window
+management. However, interrupts should be disabled by setting
+the Processor Interrupt Level (pil) field of the psr to 15.
+RTEMS installs it's own Trap Table as part of initialization
+which is initialized with the contents of the Trap Table in
+place when the @code{rtems_initialize_executive} directive was invoked.
+Upon completion of executive initialization, interrupts are
+enabled.
+
+If this SPARC implementation supports on-chip caching
+and this is to be utilized, then it should be enabled during the
+reset application initialization code.
+
+In addition to the requirements described in the
+Board Support Packages chapter of the @value{LANGUAGE}
+Applications User's Manual for the reset code
+which is executed before the call to
+@code{rtems_initialize_executive}, the SPARC version has the following
+specific requirements:
+
+@itemize @bullet
+@item Must leave the S bit of the status register set so that
+the SPARC remains in the supervisor state.
+
+@item Must set stack pointer (sp) such that a minimum stack
+size of MINIMUM_STACK_SIZE bytes is provided for the
+@code{rtems_initialize_executive} directive.
+
+@item Must disable all external interrupts (i.e. set the pil
+to 15).
+
+@item Must enable traps so window overflow and underflow
+conditions can be properly handled.
+
+@item Must initialize the SPARC's initial trap table with at
+least trap handlers for register window overflow and register
+window underflow.
+@end itemize
+
diff --git a/doc/supplements/sparc/callconv.t b/doc/supplements/sparc/callconv.t
new file mode 100644
index 0000000000..2b968ebb0b
--- /dev/null
+++ b/doc/supplements/sparc/callconv.t
@@ -0,0 +1,392 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Calling Conventions
+
+@section Introduction
+
+Each high-level language compiler generates
+subroutine entry and exit code based upon a set of rules known
+as the compiler's calling convention. These rules address the
+following issues:
+
+@itemize @bullet
+@item register preservation and usage
+
+@item parameter passing
+
+@item call and return mechanism
+@end itemize
+
+A compiler's calling convention is of importance when
+interfacing to subroutines written in another language either
+assembly or high-level. Even when the high-level language and
+target processor are the same, different compilers may use
+different calling conventions. As a result, calling conventions
+are both processor and compiler dependent.
+
+@section Programming Model
+
+This section discusses the programming model for the
+SPARC architecture.
+
+@subsection Non-Floating Point Registers
+
+The SPARC architecture defines thirty-two
+non-floating point registers directly visible to the programmer.
+These are divided into four sets:
+
+@itemize @bullet
+@item input registers
+
+@item local registers
+
+@item output registers
+
+@item global registers
+@end itemize
+
+Each register is referred to by either two or three
+names in the SPARC reference manuals. First, the registers are
+referred to as r0 through r31 or with the alternate notation
+r[0] through r[31]. Second, each register is a member of one of
+the four sets listed above. Finally, some registers have an
+architecturally defined role in the programming model which
+provides an alternate name. The following table describes the
+mapping between the 32 registers and the register sets:
+
+@ifset use-ascii
+@example
+@group
+ +-----------------+----------------+------------------+
+ | Register Number | Register Names | Description |
+ +-----------------+----------------+------------------+
+ | 0 - 7 | g0 - g7 | Global Registers |
+ +-----------------+----------------+------------------+
+ | 8 - 15 | o0 - o7 | Output Registers |
+ +-----------------+----------------+------------------+
+ | 16 - 23 | l0 - l7 | Local Registers |
+ +-----------------+----------------+------------------+
+ | 24 - 31 | i0 - i7 | Input Registers |
+ +-----------------+----------------+------------------+
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@sp 1
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\vrule\strut#&
+\hbox to 1.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 1.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 1.75in{\enskip\hfil#\hfil}&
+\vrule#\cr
+\noalign{\hrule}
+&\bf Register Number &&\bf Register Names&&\bf Description&\cr\noalign{\hrule}
+&0 - 7&&g0 - g7&&Global Registers&\cr\noalign{\hrule}
+&8 - 15&&o0 - o7&&Output Registers&\cr\noalign{\hrule}
+&16 - 23&&l0 - l7&&Local Registers&\cr\noalign{\hrule}
+&24 - 31&&i0 - i7&&Input Registers&\cr\noalign{\hrule}
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=3 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=center><STRONG>Register Number</STRONG></TD>
+ <TD ALIGN=center><STRONG>Register Names</STRONG></TD>
+ <TD ALIGN=center><STRONG>Description</STRONG></TD>
+<TR><TD ALIGN=center>0 - 7</TD>
+ <TD ALIGN=center>g0 - g7</TD>
+ <TD ALIGN=center>Global Registers</TD></TR>
+<TR><TD ALIGN=center>8 - 15</TD>
+ <TD ALIGN=center>o0 - o7</TD>
+ <TD ALIGN=center>Output Registers</TD></TR>
+<TR><TD ALIGN=center>16 - 23</TD>
+ <TD ALIGN=center>l0 - l7</TD>
+ <TD ALIGN=center>Local Registers</TD></TR>
+<TR><TD ALIGN=center>24 - 31</TD>
+ <TD ALIGN=center>i0 - i7</TD>
+ <TD ALIGN=center>Input Registers</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+As mentioned above, some of the registers serve
+defined roles in the programming model. The following table
+describes the role of each of these registers:
+
+@ifset use-ascii
+@example
+@group
+ +---------------+----------------+----------------------+
+ | Register Name | Alternate Name | Description |
+ +---------------+----------------+----------------------+
+ | g0 | na | reads return 0 |
+ | | | writes are ignored |
+ +---------------+----------------+----------------------+
+ | o6 | sp | stack pointer |
+ +---------------+----------------+----------------------+
+ | i6 | fp | frame pointer |
+ +---------------+----------------+----------------------+
+ | i7 | na | return address |
+ +---------------+----------------+----------------------+
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@sp 1
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\vrule\strut#&
+\hbox to 1.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 1.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 1.75in{\enskip\hfil#\hfil}&
+\vrule#\cr
+\noalign{\hrule}
+&\bf Register Name &&\bf Alternate Names&&\bf Description&\cr\noalign{\hrule}
+&g0&&NA&&reads return 0; &\cr
+&&&&&writes are ignored&\cr\noalign{\hrule}
+&o6&&sp&&stack pointer&\cr\noalign{\hrule}
+&i6&&fp&&frame pointer&\cr\noalign{\hrule}
+&i7&&NA&&return address&\cr\noalign{\hrule}
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=3 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=center><STRONG>Register Name</STRONG></TD>
+ <TD ALIGN=center><STRONG>Alternate Name</STRONG></TD>
+ <TD ALIGN=center><STRONG>Description</STRONG></TD></TR>
+<TR><TD ALIGN=center>g0</TD>
+ <TD ALIGN=center>NA</TD>
+ <TD ALIGN=center>reads return 0 ; writes are ignored</TD></TR>
+<TR><TD ALIGN=center>o6</TD>
+ <TD ALIGN=center>sp</TD>
+ <TD ALIGN=center>stack pointer</TD></TR>
+<TR><TD ALIGN=center>i6</TD>
+ <TD ALIGN=center>fp</TD>
+ <TD ALIGN=center>frame pointer</TD></TR>
+<TR><TD ALIGN=center>i7</TD>
+ <TD ALIGN=center>NA</TD>
+ <TD ALIGN=center>return address</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+
+@subsection Floating Point Registers
+
+The SPARC V7 architecture includes thirty-two,
+thirty-two bit registers. These registers may be viewed as
+follows:
+
+@itemize @bullet
+@item 32 single precision floating point or integer registers
+(f0, f1, ... f31)
+
+@item 16 double precision floating point registers (f0, f2,
+f4, ... f30)
+
+@item 8 extended precision floating point registers (f0, f4,
+f8, ... f28)
+@end itemize
+
+The floating point status register (fpsr) specifies
+the behavior of the floating point unit for rounding, contains
+its condition codes, version specification, and trap information.
+
+A queue of the floating point instructions which have
+started execution but not yet completed is maintained. This
+queue is needed to support the multiple cycle nature of floating
+point operations and to aid floating point exception trap
+handlers. Once a floating point exception has been encountered,
+the queue is frozen until it is emptied by the trap handler.
+The floating point queue is loaded by launching instructions.
+It is emptied normally when the floating point completes all
+outstanding instructions and by floating point exception
+handlers with the store double floating point queue (stdfq)
+instruction.
+
+@subsection Special Registers
+
+The SPARC architecture includes two special registers
+which are critical to the programming model: the Processor State
+Register (psr) and the Window Invalid Mask (wim). The psr
+contains the condition codes, processor interrupt level, trap
+enable bit, supervisor mode and previous supervisor mode bits,
+version information, floating point unit and coprocessor enable
+bits, and the current window pointer (cwp). The cwp field of
+the psr and wim register are used to manage the register windows
+in the SPARC architecture. The register windows are discussed
+in more detail below.
+
+@section Register Windows
+
+The SPARC architecture includes the concept of
+register windows. An overly simplistic way to think of these
+windows is to imagine them as being an infinite supply of
+"fresh" register sets available for each subroutine to use. In
+reality, they are much more complicated.
+
+The save instruction is used to obtain a new register
+window. This instruction decrements the current window pointer,
+thus providing a new set of registers for use. This register
+set includes eight fresh local registers for use exclusively by
+this subroutine. When done with a register set, the restore
+instruction increments the current window pointer and the
+previous register set is once again available.
+
+The two primary issues complicating the use of
+register windows are that (1) the set of register windows is
+finite, and (2) some registers are shared between adjacent
+registers windows.
+
+Because the set of register windows is finite, it is
+possible to execute enough save instructions without
+corresponding restore's to consume all of the register windows.
+This is easily accomplished in a high level language because
+each subroutine typically performs a save instruction upon
+entry. Thus having a subroutine call depth greater than the
+number of register windows will result in a window overflow
+condition. The window overflow condition generates a trap which
+must be handled in software. The window overflow trap handler
+is responsible for saving the contents of the oldest register
+window on the program stack.
+
+Similarly, the subroutines will eventually complete
+and begin to perform restore's. If the restore results in the
+need for a register window which has previously been written to
+memory as part of an overflow, then a window underflow condition
+results. Just like the window overflow, the window underflow
+condition must be handled in software by a trap handler. The
+window underflow trap handler is responsible for reloading the
+contents of the register window requested by the restore
+instruction from the program stack.
+
+The Window Invalid Mask (wim) and the Current Window
+Pointer (cwp) field in the psr are used in conjunction to manage
+the finite set of register windows and detect the window
+overflow and underflow conditions. The cwp contains the index
+of the register window currently in use. The save instruction
+decrements the cwp modulo the number of register windows.
+Similarly, the restore instruction increments the cwp modulo the
+number of register windows. Each bit in the wim represents
+represents whether a register window contains valid information.
+The value of 0 indicates the register window is valid and 1
+indicates it is invalid. When a save instruction causes the cwp
+to point to a register window which is marked as invalid, a
+window overflow condition results. Conversely, the restore
+instruction may result in a window underflow condition.
+
+Other than the assumption that a register window is
+always available for trap (i.e. interrupt) handlers, the SPARC
+architecture places no limits on the number of register windows
+simultaneously marked as invalid (i.e. number of bits set in the
+wim). However, RTEMS assumes that only one register window is
+marked invalid at a time (i.e. only one bit set in the wim).
+This makes the maximum possible number of register windows
+available to the user while still meeting the requirement that
+window overflow and underflow conditions can be detected.
+
+The window overflow and window underflow trap
+handlers are a critical part of the run-time environment for a
+SPARC application. The SPARC architectural specification allows
+for the number of register windows to be any power of two less
+than or equal to 32. The most common choice for SPARC
+implementations appears to be 8 register windows. This results
+in the cwp ranging in value from 0 to 7 on most implementations.
+
+
+The second complicating factor is the sharing of
+registers between adjacent register windows. While each
+register window has its own set of local registers, the input
+and output registers are shared between adjacent windows. The
+output registers for register window N are the same as the input
+registers for register window ((N - 1) modulo RW) where RW is
+the number of register windows. An alternative way to think of
+this is to remember how parameters are passed to a subroutine on
+the SPARC. The caller loads values into what are its output
+registers. Then after the callee executes a save instruction,
+those parameters are available in its input registers. This is
+a very efficient way to pass parameters as no data is actually
+moved by the save or restore instructions.
+
+@section Call and Return Mechanism
+
+The SPARC architecture supports a simple yet
+effective call and return mechanism. A subroutine is invoked
+via the call (call) instruction. This instruction places the
+return address in the caller's output register 7 (o7). After
+the callee executes a save instruction, this value is available
+in input register 7 (i7) until the corresponding restore
+instruction is executed.
+
+The callee returns to the caller via a jmp to the
+return address. There is a delay slot following this
+instruction which is commonly used to execute a restore
+instruction -- if a register window was allocated by this
+subroutine.
+
+It is important to note that the SPARC subroutine
+call and return mechanism does not automatically save and
+restore any registers. This is accomplished via the save and
+restore instructions which manage the set of registers windows.
+
+@section Calling Mechanism
+
+All RTEMS directives are invoked using the regular
+SPARC calling convention via the call instruction.
+
+@section Register Usage
+
+As discussed above, the call instruction does not
+automatically save any registers. The save and restore
+instructions are used to allocate and deallocate register
+windows. When a register window is allocated, the new set of
+local registers are available for the exclusive use of the
+subroutine which allocated this register set.
+
+@section Parameter Passing
+
+RTEMS assumes that arguments are placed in the
+caller's output registers with the first argument in output
+register 0 (o0), the second argument in output register 1 (o1),
+and so forth. Until the callee executes a save instruction, the
+parameters are still visible in the output registers. After the
+callee executes a save instruction, the parameters are visible
+in the corresponding input registers. The following pseudo-code
+illustrates the typical sequence used to call a RTEMS directive
+with three (3) arguments:
+
+@example
+load third argument into o2
+load second argument into o1
+load first argument into o0
+invoke directive
+@end example
+
+@section User-Provided Routines
+
+All user-provided routines invoked by RTEMS, such as
+user extensions, device drivers, and MPCI routines, must also
+adhere to these calling conventions.
+
diff --git a/doc/supplements/sparc/cpumodel.t b/doc/supplements/sparc/cpumodel.t
new file mode 100644
index 0000000000..d676fcc480
--- /dev/null
+++ b/doc/supplements/sparc/cpumodel.t
@@ -0,0 +1,128 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter CPU Model Dependent Features
+
+@section Introduction
+
+Microprocessors are generally classified into
+families with a variety of CPU models or implementations within
+that family. Within a processor family, there is a high level
+of binary compatibility. This family may be based on either an
+architectural specification or on maintaining compatibility with
+a popular processor. Recent microprocessor families such as the
+SPARC or PowerPC are based on an architectural specification
+which is independent or any particular CPU model or
+implementation. Older families such as the M68xxx and the iX86
+evolved as the manufacturer strived to produce higher
+performance processor models which maintained binary
+compatibility with older models.
+
+RTEMS takes advantage of the similarity of the
+various models within a CPU family. Although the models do vary
+in significant ways, the high level of compatibility makes it
+possible to share the bulk of the CPU dependent executive code
+across the entire family.
+
+@section CPU Model Feature Flags
+
+Each processor family supported by RTEMS has a
+list of features which vary between CPU models
+within a family. For example, the most common model dependent
+feature regardless of CPU family is the presence or absence of a
+floating point unit or coprocessor. When defining the list of
+features present on a particular CPU model, one simply notes
+that floating point hardware is or is not present and defines a
+single constant appropriately. Conditional compilation is
+utilized to include the appropriate source code for this CPU
+model's feature set. It is important to note that this means
+that RTEMS is thus compiled using the appropriate feature set
+and compilation flags optimal for this CPU model used. The
+alternative would be to generate a binary which would execute on
+all family members using only the features which were always
+present.
+
+This section presents the set of features which vary
+across SPARC implementations and are of importance to RTEMS.
+The set of CPU model feature macros are defined in the file
+cpukit/score/cpu/sparc/sparc.h based upon the particular CPU
+model defined on the compilation command line.
+
+@subsection CPU Model Name
+
+The macro CPU_MODEL_NAME is a string which designates
+the name of this CPU model. For example, for the European Space
+Agency's ERC32 SPARC model, this macro is set to the string
+"erc32".
+
+@subsection Floating Point Unit
+
+The macro SPARC_HAS_FPU is set to 1 to indicate that
+this CPU model has a hardware floating point unit and 0
+otherwise.
+
+@subsection Bitscan Instruction
+
+The macro SPARC_HAS_BITSCAN is set to 1 to indicate
+that this CPU model has the bitscan instruction. For example,
+this instruction is supported by the Fujitsu SPARClite family.
+
+@subsection Number of Register Windows
+
+The macro SPARC_NUMBER_OF_REGISTER_WINDOWS is set to
+indicate the number of register window sets implemented by this
+CPU model. The SPARC architecture allows a for a maximum of
+thirty-two register window sets although most implementations
+only include eight.
+
+@subsection Low Power Mode
+
+The macro SPARC_HAS_LOW_POWER_MODE is set to one to
+indicate that this CPU model has a low power mode. If low power
+is enabled, then there must be CPU model specific implementation
+of the IDLE task in cpukit/score/cpu/sparc/cpu.c. The low
+power mode IDLE task should be of the form:
+
+@example
+while ( TRUE ) @{
+ enter low power mode
+@}
+@end example
+
+The code required to enter low power mode is CPU model specific.
+
+@section CPU Model Implementation Notes
+
+The ERC32 is a custom SPARC V7 implementation based on the Cypress 601/602
+chipset. This CPU has a number of on-board peripherals and was developed by
+the European Space Agency to target space applications. RTEMS currently
+provides support for the following peripherals:
+
+@itemize @bullet
+@item UART Channels A and B
+@item General Purpose Timer
+@item Real Time Clock
+@item Watchdog Timer (so it can be disabled)
+@item Control Register (so powerdown mode can be enabled)
+@item Memory Control Register
+@item Interrupt Control
+@end itemize
+
+The General Purpose Timer and Real Time Clock Timer provided with the ERC32
+share the Timer Control Register. Because the Timer Control Register is write
+only, we must mirror it in software and insure that writes to one timer do not
+alter the current settings and status of the other timer. Routines are
+provided in erc32.h which promote the view that the two timers are completely
+independent. By exclusively using these routines to access the Timer Control
+Register, the application can view the system as having a General Purpose
+Timer Control Register and a Real Time Clock Timer Control Register
+rather than the single shared value.
+
+The RTEMS Idle thread take advantage of the low power mode provided by the
+ERC32. Low power mode is entered during idle loops and is enabled at
+initialization time.
diff --git a/doc/supplements/sparc/cputable.t b/doc/supplements/sparc/cputable.t
new file mode 100644
index 0000000000..22873590c1
--- /dev/null
+++ b/doc/supplements/sparc/cputable.t
@@ -0,0 +1,102 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Processor Dependent Information Table
+
+@section Introduction
+
+Any highly processor dependent information required
+to describe a processor to RTEMS is provided in the CPU
+Dependent Information Table. This table is not required for all
+processors supported by RTEMS. This chapter describes the
+contents, if any, for a particular processor type.
+
+@section CPU Dependent Information Table
+
+The SPARC version of the RTEMS CPU Dependent
+Information Table is given by the C structure definition is
+shown below:
+
+@example
+@group
+typedef struct @{
+ void (*pretasking_hook)( void );
+ void (*predriver_hook)( void );
+ void (*postdriver_hook)( void );
+ void (*idle_task)( void );
+ boolean do_zero_of_workspace;
+ unsigned32 idle_task_stack_size;
+ unsigned32 interrupt_stack_size;
+ unsigned32 extra_mpci_receive_server_stack;
+ void * (*stack_allocate_hook)( unsigned32 );
+ void (*stack_free_hook)( void* );
+ /* end of fields required on all CPUs */
+
+@} rtems_cpu_table;
+@end group
+@end example
+
+@table @code
+@item pretasking_hook
+is the address of the user provided routine which is invoked
+once RTEMS APIs are initialized. This routine will be invoked
+before any system tasks are created. Interrupts are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item predriver_hook
+is the address of the user provided
+routine that is invoked immediately before the
+the device drivers and MPCI are initialized. RTEMS
+initialization is complete but interrupts and tasking are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item postdriver_hook
+is the address of the user provided
+routine that is invoked immediately after the
+the device drivers and MPCI are initialized. RTEMS
+initialization is complete but interrupts and tasking are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item idle_task
+is the address of the optional user
+provided routine which is used as the system's IDLE task. If
+this field is not NULL, then the RTEMS default IDLE task is not
+used. This field may be NULL to indicate that the default IDLE
+is to be used.
+
+@item do_zero_of_workspace
+indicates whether RTEMS should
+zero the Workspace as part of its initialization. If set to
+TRUE, the Workspace is zeroed. Otherwise, it is not.
+
+@item idle_task_stack_size
+is the size of the RTEMS idle task stack in bytes.
+If this number is less than MINIMUM_STACK_SIZE, then the
+idle task's stack will be MINIMUM_STACK_SIZE in byte.
+
+@item interrupt_stack_size
+is the size of the RTEMS allocated interrupt stack in bytes.
+This value must be at least as large as MINIMUM_STACK_SIZE.
+
+@item extra_mpci_receive_server_stack
+is the extra stack space allocated for the RTEMS MPCI receive server task
+in bytes. The MPCI receive server may invoke nearly all directives and
+may require extra stack space on some targets.
+
+@item stack_allocate_hook
+is the address of the optional user provided routine which allocates
+memory for task stacks. If this hook is not NULL, then a stack_free_hook
+must be provided as well.
+
+@item stack_free_hook
+is the address of the optional user provided routine which frees
+memory for task stacks. If this hook is not NULL, then a stack_allocate_hook
+must be provided as well.
+
+@end table
+
diff --git a/doc/supplements/sparc/fatalerr.t b/doc/supplements/sparc/fatalerr.t
new file mode 100644
index 0000000000..6de94ba8f4
--- /dev/null
+++ b/doc/supplements/sparc/fatalerr.t
@@ -0,0 +1,32 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Default Fatal Error Processing
+
+@section Introduction
+
+Upon detection of a fatal error by either the
+application or RTEMS the fatal error manager is invoked. The
+fatal error manager will invoke the user-supplied fatal error
+handlers. If no user-supplied handlers are configured, the
+RTEMS provided default fatal error handler is invoked. If the
+user-supplied fatal error handlers return to the executive the
+default fatal error handler is then invoked. This chapter
+describes the precise operations of the default fatal error
+handler.
+
+@section Default Fatal Error Handler Operations
+
+The default fatal error handler which is invoked by
+the fatal_error_occurred directive when there is no user handler
+configured or the user handler returns control to RTEMS. The
+default fatal error handler disables processor interrupts to
+level 15, places the error code in g1, and goes into an infinite
+loop to simulate a halt processor instruction.
+
+
diff --git a/doc/supplements/sparc/intr_NOTIMES.t b/doc/supplements/sparc/intr_NOTIMES.t
new file mode 100644
index 0000000000..a66ccc981d
--- /dev/null
+++ b/doc/supplements/sparc/intr_NOTIMES.t
@@ -0,0 +1,199 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Interrupt Processing
+
+@section Introduction
+
+Different types of processors respond to the
+occurrence of an interrupt in its own unique fashion. In
+addition, each processor type provides a control mechanism to
+allow for the proper handling of an interrupt. The processor
+dependent response to the interrupt modifies the current
+execution state and results in a change in the execution stream.
+Most processors require that an interrupt handler utilize some
+special control mechanisms to return to the normal processing
+stream. Although RTEMS hides many of the processor dependent
+details of interrupt processing, it is important to understand
+how the RTEMS interrupt manager is mapped onto the processor's
+unique architecture. Discussed in this chapter are the SPARC's
+interrupt response and control mechanisms as they pertain to
+RTEMS.
+
+RTEMS and associated documentation uses the terms
+interrupt and vector. In the SPARC architecture, these terms
+correspond to traps and trap type, respectively. The terms will
+be used interchangeably in this manual.
+
+@section Synchronous Versus Asynchronous Traps
+
+The SPARC architecture includes two classes of traps:
+synchronous and asynchronous. Asynchronous traps occur when an
+external event interrupts the processor. These traps are not
+associated with any instruction executed by the processor and
+logically occur between instructions. The instruction currently
+in the execute stage of the processor is allowed to complete
+although subsequent instructions are annulled. The return
+address reported by the processor for asynchronous traps is the
+pair of instructions following the current instruction.
+
+Synchronous traps are caused by the actions of an
+instruction. The trap stimulus in this case either occurs
+internally to the processor or is from an external signal that
+was provoked by the instruction. These traps are taken
+immediately and the instruction that caused the trap is aborted
+before any state changes occur in the processor itself. The
+return address reported by the processor for synchronous traps
+is the instruction which caused the trap and the following
+instruction.
+
+@section Vectoring of Interrupt Handler
+
+Upon receipt of an interrupt the SPARC automatically
+performs the following actions:
+
+@itemize @bullet
+@item disables traps (sets the ET bit of the psr to 0),
+
+@item the S bit of the psr is copied into the Previous
+Supervisor Mode (PS) bit of the psr,
+
+@item the cwp is decremented by one (modulo the number of
+register windows) to activate a trap window,
+
+@item the PC and nPC are loaded into local register 1 and 2
+(l0 and l1),
+
+@item the trap type (tt) field of the Trap Base Register (TBR)
+is set to the appropriate value, and
+
+@item if the trap is not a reset, then the PC is written with
+the contents of the TBR and the nPC is written with TBR + 4. If
+the trap is a reset, then the PC is set to zero and the nPC is
+set to 4.
+@end itemize
+
+Trap processing on the SPARC has two features which
+are noticeably different than interrupt processing on other
+architectures. First, the value of psr register in effect
+immediately before the trap occurred is not explicitly saved.
+Instead only reversible alterations are made to it. Second, the
+Processor Interrupt Level (pil) is not set to correspond to that
+of the interrupt being processed. When a trap occurs, ALL
+subsequent traps are disabled. In order to safely invoke a
+subroutine during trap handling, traps must be enabled to allow
+for the possibility of register window overflow and underflow
+traps.
+
+If the interrupt handler was installed as an RTEMS
+interrupt handler, then upon receipt of the interrupt, the
+processor passes control to the RTEMS interrupt handler which
+performs the following actions:
+
+@itemize @bullet
+@item saves the state of the interrupted task on it's stack,
+
+@item insures that a register window is available for
+subsequent traps,
+
+@item if this is the outermost (i.e. non-nested) interrupt,
+then the RTEMS interrupt handler switches from the current stack
+to the interrupt stack,
+
+@item enables traps,
+
+@item invokes the vectors to a user interrupt service routine (ISR).
+@end itemize
+
+Asynchronous interrupts are ignored while traps are
+disabled. Synchronous traps which occur while traps are
+disabled result in the CPU being forced into an error mode.
+
+A nested interrupt is processed similarly with the
+exception that the current stack need not be switched to the
+interrupt stack.
+
+@section Traps and Register Windows
+
+One of the register windows must be reserved at all
+times for trap processing. This is critical to the proper
+operation of the trap mechanism in the SPARC architecture. It
+is the responsibility of the trap handler to insure that there
+is a register window available for a subsequent trap before
+re-enabling traps. It is likely that any high level language
+routines invoked by the trap handler (such as a user-provided
+RTEMS interrupt handler) will allocate a new register window.
+The save operation could result in a window overflow trap. This
+trap cannot be correctly processed unless (1) traps are enabled
+and (2) a register window is reserved for traps. Thus, the
+RTEMS interrupt handler insures that a register window is
+available for subsequent traps before enabling traps and
+invoking the user's interrupt handler.
+
+@section Interrupt Levels
+
+Sixteen levels (0-15) of interrupt priorities are
+supported by the SPARC architecture with level fifteen (15)
+being the highest priority. Level zero (0) indicates that
+interrupts are fully enabled. Interrupt requests for interrupts
+with priorities less than or equal to the current interrupt mask
+level are ignored.
+
+Although RTEMS supports 256 interrupt levels, the
+SPARC only supports sixteen. RTEMS interrupt levels 0 through
+15 directly correspond to SPARC processor interrupt levels. All
+other RTEMS interrupt levels are undefined and their behavior is
+unpredictable.
+
+@section Disabling of Interrupts by RTEMS
+
+During the execution of directive calls, critical
+sections of code may be executed. When these sections are
+encountered, RTEMS disables interrupts to level seven (15)
+before the execution of this section and restores them to the
+previous level upon completion of the section. RTEMS has been
+optimized to insure that interrupts are disabled for less than
+RTEMS_MAXIMUM_DISABLE_PERIOD microseconds on a RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+Mhz ERC32 with zero wait states.
+These numbers will vary based the number of wait states and
+processor speed present on the target board.
+[NOTE: The maximum period with interrupts disabled is hand calculated. This
+calculation was last performed for Release
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD.]
+
+[NOTE: It is thought that the length of time at which
+the processor interrupt level is elevated to fifteen by RTEMS is
+not anywhere near as long as the length of time ALL traps are
+disabled as part of the "flush all register windows" operation.]
+
+Non-maskable interrupts (NMI) cannot be disabled, and
+ISRs which execute at this level MUST NEVER issue RTEMS system
+calls. If a directive is invoked, unpredictable results may
+occur due to the inability of RTEMS to protect its critical
+sections. However, ISRs that make no system calls may safely
+execute as non-maskable interrupts.
+
+@section Interrupt Stack
+
+The SPARC architecture does not provide for a
+dedicated interrupt stack. Thus by default, trap handlers would
+execute on the stack of the RTEMS task which they interrupted.
+This artificially inflates the stack requirements for each task
+since EVERY task stack would have to include enough space to
+account for the worst case interrupt stack requirements in
+addition to it's own worst case usage. RTEMS addresses this
+problem on the SPARC by providing a dedicated interrupt stack
+managed by software.
+
+During system initialization, RTEMS allocates the
+interrupt stack from the Workspace Area. The amount of memory
+allocated for the interrupt stack is determined by the
+interrupt_stack_size field in the CPU Configuration Table. As
+part of processing a non-nested interrupt, RTEMS will switch to
+the interrupt stack before invoking the installed handler.
+
diff --git a/doc/supplements/sparc/memmodel.t b/doc/supplements/sparc/memmodel.t
new file mode 100644
index 0000000000..7bf814ffa8
--- /dev/null
+++ b/doc/supplements/sparc/memmodel.t
@@ -0,0 +1,104 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Memory Model
+
+@section Introduction
+
+A processor may support any combination of memory
+models ranging from pure physical addressing to complex demand
+paged virtual memory systems. RTEMS supports a flat memory
+model which ranges contiguously over the processor's allowable
+address space. RTEMS does not support segmentation or virtual
+memory of any kind. The appropriate memory model for RTEMS
+provided by the targeted processor and related characteristics
+of that model are described in this chapter.
+
+@section Flat Memory Model
+
+The SPARC architecture supports a flat 32-bit address
+space with addresses ranging from 0x00000000 to 0xFFFFFFFF (4
+gigabytes). Each address is represented by a 32-bit value and
+is byte addressable. The address may be used to reference a
+single byte, half-word (2-bytes), word (4 bytes), or doubleword
+(8 bytes). Memory accesses within this address space are
+performed in big endian fashion by the SPARC. Memory accesses
+which are not properly aligned generate a "memory address not
+aligned" trap (type number 7). The following table lists the
+alignment requirements for a variety of data accesses:
+
+@ifset use-ascii
+@example
+@group
+ +--------------+-----------------------+
+ | Data Type | Alignment Requirement |
+ +--------------+-----------------------+
+ | byte | 1 |
+ | half-word | 2 |
+ | word | 4 |
+ | doubleword | 8 |
+ +--------------+-----------------------+
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@sp 1
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\vrule\strut#&
+\hbox to 1.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 1.75in{\enskip\hfil#\hfil}&
+\vrule#\cr
+\noalign{\hrule}
+&\bf Data Type &&\bf Alignment Requirement&\cr\noalign{\hrule}
+&byte&&1&\cr\noalign{\hrule}
+&half-word&&2&\cr\noalign{\hrule}
+&word&&4&\cr\noalign{\hrule}
+&doubleword&&8&\cr\noalign{\hrule}
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=2 WIDTH="60%" BORDER=2>
+<TR><TD ALIGN=center><STRONG>Data Type</STRONG></TD>
+ <TD ALIGN=center><STRONG>Alignment Requirement</STRONG></TD></TR>
+<TR><TD ALIGN=center>byte</TD>
+ <TD ALIGN=center>1</TD></TR>
+<TR><TD ALIGN=center>half-word</TD>
+ <TD ALIGN=center>2</TD></TR>
+<TR><TD ALIGN=center>word</TD>
+ <TD ALIGN=center>4</TD></TR>
+<TR><TD ALIGN=center>doubleword</TD>
+ <TD ALIGN=center>8</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+Doubleword load and store operations must use a pair
+of registers as their source or destination. This pair of
+registers must be an adjacent pair of registers with the first
+of the pair being even numbered. For example, a valid
+destination for a doubleword load might be input registers 0 and
+1 (i0 and i1). The pair i1 and i2 would be invalid. [NOTE:
+Some assemblers for the SPARC do not generate an error if an odd
+numbered register is specified as the beginning register of the
+pair. In this case, the assembler assumes that what the
+programmer meant was to use the even-odd pair which ends at the
+specified register. This may or may not have been a correct
+assumption.]
+
+RTEMS does not support any SPARC Memory Management
+Units, therefore, virtual memory or segmentation systems
+involving the SPARC are not supported.
+
diff --git a/doc/supplements/sparc/preface.texi b/doc/supplements/sparc/preface.texi
new file mode 100644
index 0000000000..c3415236cf
--- /dev/null
+++ b/doc/supplements/sparc/preface.texi
@@ -0,0 +1,91 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Preface, CPU Model Dependent Features, Top, Top
+@end ifinfo
+@unnumbered Preface
+
+The Real Time Executive for Multiprocessor Systems
+(RTEMS) is designed to be portable across multiple processor
+architectures. However, the nature of real-time systems makes
+it essential that the application designer understand certain
+processor dependent implementation details. These processor
+dependencies include calling convention, board support package
+issues, interrupt processing, exact RTEMS memory requirements,
+performance data, header files, and the assembly language
+interface to the executive.
+
+This document discusses the SPARC architecture
+dependencies in this port of RTEMS. Currently, only
+implementations of SPARC Version 7 are supported by RTEMS.
+
+It is highly recommended that the SPARC RTEMS
+application developer obtain and become familiar with the
+documentation for the processor being used as well as the
+specification for the revision of the SPARC architecture which
+corresponds to that processor.
+
+@subheading SPARC Architecture Documents
+
+For information on the SPARC architecture, refer to
+the following documents available from SPARC International, Inc.
+(http://www.sparc.com):
+
+@itemize @bullet
+@item SPARC Standard Version 7.
+
+@item SPARC Standard Version 8.
+
+@item SPARC Standard Version 9.
+@end itemize
+
+@subheading ERC32 Specific Information
+
+The European Space Agency's ERC32 is a three chip
+computing core implementing a SPARC V7 processor and associated
+support circuitry for embedded space applications. The integer
+and floating-point units (90C601E & 90C602E) are based on the
+Cypress 7C601 and 7C602, with additional error-detection and
+recovery functions. The memory controller (MEC) implements
+system support functions such as address decoding, memory
+interface, DMA interface, UARTs, timers, interrupt control,
+write-protection, memory reconfiguration and error-detection.
+The core is designed to work at 25MHz, but using space qualified
+memories limits the system frequency to around 15 MHz, resulting
+in a performance of 10 MIPS and 2 MFLOPS.
+
+Information on the ERC32 and a number of development
+support tools, such as the SPARC Instruction Simulator (SIS),
+are freely available on the Internet. The following documents
+and SIS are available via anonymous ftp or pointing your web
+browser at ftp://ftp.estec.esa.nl/pub/ws/wsd/erc32.
+
+@itemize @bullet
+@item ERC32 System Design Document
+
+@item MEC Device Specification
+@end itemize
+
+Additionally, the SPARC RISC User's Guide from Matra
+MHS documents the functionality of the integer and floating
+point units including the instruction set information. To
+obtain this document as well as ERC32 components and VHDL models
+contact:
+
+@example
+Matra MHS SA
+3 Avenue du Centre, BP 309,
+78054 St-Quentin-en-Yvelines,
+Cedex, France
+VOICE: +31-1-30607087
+FAX: +31-1-30640693
+@end example
+
+Amar Guennon (amar.guennon@@matramhs.fr) is familiar with the ERC32.
+
diff --git a/doc/supplements/sparc/sparc.texi b/doc/supplements/sparc/sparc.texi
new file mode 100644
index 0000000000..2ed4c3ab1c
--- /dev/null
+++ b/doc/supplements/sparc/sparc.texi
@@ -0,0 +1,113 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename sparc.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the SPARC Applications Supplement
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS Target Supplements
+@direntry
+* RTEMS SPARC Applications Supplement: (sparc).
+@end direntry
+@end ifset
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage RTEMS SPARC Applications Supplement
+
+@setchapternewpage odd
+@settitle RTEMS SPARC Applications Supplement
+@titlepage
+@finalout
+
+@title RTEMS SPARC Applications Supplement
+@subtitle Edition @value{EDITION}, for RTEMS @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include preface.texi
+@include cpumodel.texi
+@include callconv.texi
+@include memmodel.texi
+@include intr.texi
+@include fatalerr.texi
+@include bsp.texi
+@include cputable.texi
+@include wksheets.texi
+@include timing.texi
+@include timeERC32.texi
+@ifinfo
+@node Top, Preface, (dir), (dir)
+@top sparc
+
+This is the online version of the RTEMS SPARC Applications Supplement.
+
+@menu
+* Preface::
+* CPU Model Dependent Features::
+* Calling Conventions::
+* Memory Model::
+* Interrupt Processing::
+* Default Fatal Error Processing::
+* Board Support Packages::
+* Processor Dependent Information Table::
+* Memory Requirements::
+* Timing Specification::
+* ERC32 Timing Data::
+* Command and Variable Index::
+* Concept Index::
+@end menu
+
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@node Command and Variable Index, Concept Index, ERC32 Timing Data Rate Monotonic Manager, Top
+@unnumbered Command and Variable Index
+
+There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@node Concept Index, , Command and Variable Index, Top
+@unnumbered Concept Index
+
+There are currently no Concept Index entries.
+@c @printindex cp
+
+@contents
+@bye
+
diff --git a/doc/supplements/sparc/timeERC32.t b/doc/supplements/sparc/timeERC32.t
new file mode 100644
index 0000000000..acece2b675
--- /dev/null
+++ b/doc/supplements/sparc/timeERC32.t
@@ -0,0 +1,120 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@include common/timemac.texi
+@tex
+\global\advance \smallskipamount by -4pt
+@end tex
+
+@chapter ERC32 Timing Data
+
+@section Introduction
+
+The timing data for RTEMS on the ERC32 implementation
+of the SPARC architecture is provided along with the target
+dependent aspects concerning the gathering of the timing data.
+The hardware platform used to gather the times is described to
+give the reader a better understanding of each directive time
+provided. Also, provided is a description of the interrupt
+latency and the context switch times as they pertain to the
+SPARC version of RTEMS.
+
+@section Hardware Platform
+
+All times reported in this chapter were measured
+using the SPARC Instruction Simulator (SIS) developed by the
+European Space Agency. SIS simulates the ERC32 -- a custom low
+power implementation combining the Cypress 90C601 integer unit,
+the Cypress 90C602 floating point unit, and a number of
+peripherals such as counter timers, interrupt controller and a
+memory controller.
+
+For the RTEMS tests, SIS is configured with the
+following characteristics:
+
+@itemize @bullet
+@item 15 Mhz clock speed
+
+@item 0 wait states for PROM accesses
+
+@item 0 wait states for RAM accesses
+@end itemize
+
+The ERC32's General Purpose Timer was used to gather
+all timing information. This timer was programmed to operate
+with one microsecond accuracy. All sources of hardware
+interrupts were disabled, although traps were enabled and the
+interrupt level of the SPARC allows all interrupts.
+
+@section Interrupt Latency
+
+The maximum period with traps disabled or the
+processor interrupt level set to it's highest value inside RTEMS
+is less than RTEMS_MAXIMUM_DISABLE_PERIOD
+microseconds including the instructions which
+disable and re-enable interrupts. The time required for the
+ERC32 to vector an interrupt and for the RTEMS entry overhead
+before invoking the user's trap handler are a total of
+RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK
+microseconds. These combine to yield a worst case interrupt
+latency of less than RTEMS_MAXIMUM_DISABLE_PERIOD +
+RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK microseconds at
+RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ Mhz.
+[NOTE: The maximum period with interrupts disabled was last
+determined for Release RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD.]
+
+The maximum period with interrupts disabled within
+RTEMS is hand-timed with some assistance from SIS. The maximum
+period with interrupts disabled with RTEMS occurs during a
+context switch when traps are disabled to flush all the register
+windows to memory. The length of time spent flushing the
+register windows varies based on the number of windows which
+must be flushed. Based on the information reported by SIS, it
+takes from 4.0 to 18.0 microseconds (37 to 122 instructions) to
+flush the register windows. It takes approximately 41 CPU
+cycles (2.73 microseconds) to flush each register window set to
+memory. The register window flush operation is heavily memory
+bound.
+
+[NOTE: All traps are disabled during the register
+window flush thus disabling both software generate traps and
+external interrupts. During a normal RTEMS critical section,
+the processor interrupt level (pil) is raised to level 15 and
+traps are left enabled. The longest path for a normal critical
+section within RTEMS is less than 50 instructions.]
+
+The interrupt vector and entry overhead time was
+generated on the SIS benchmark platform using the ERC32's
+ability to forcibly generate an arbitrary interrupt as the
+source of the "benchmark" interrupt.
+
+@section Context Switch
+
+The RTEMS processor context switch time is 10
+microseconds on the SIS benchmark platform when no floating
+point context is saved or restored. Additional execution time
+is required when a TASK_SWITCH user extension is configured.
+The use of the TASK_SWITCH extension is application dependent.
+Thus, its execution time is not considered part of the raw
+context switch time.
+
+Since RTEMS was designed specifically for embedded
+missile applications which are floating point intensive, the
+executive is optimized to avoid unnecessarily saving and
+restoring the state of the numeric coprocessor. The state of
+the numeric coprocessor is only saved when an FLOATING_POINT
+task is dispatched and that task was not the last task to
+utilize the coprocessor. In a system with only one
+FLOATING_POINT task, the state of the numeric coprocessor will
+never be saved or restored. When the first FLOATING_POINT task
+is dispatched, RTEMS does not need to save the current state of
+the numeric coprocessor.
+
+The following table summarizes the context switch
+times for the ERC32 benchmark platform:
+
diff --git a/doc/supplements/supplement.am b/doc/supplements/supplement.am
new file mode 100644
index 0000000000..62542391d1
--- /dev/null
+++ b/doc/supplements/supplement.am
@@ -0,0 +1,16 @@
+## $Id$
+
+##
+## Makefile fragment common to all supplements/<cpu>/Makefile.ams
+##
+
+REPLACE2 = $(PERL) $(top_srcdir)/tools/word-replace2
+
+html_projectdir = $(htmldir)/supplements/$(PROJECT)
+
+TEXI2WWW_ARGS=\
+-I $(srcdir) -I $(top_srcdir) -I $(top_builddir) \
+-dirfile ../../index.html \
+-header rtems_header.html \
+-footer rtems_footer.html \
+-icons ../../images
diff --git a/doc/supplements/template/.cvsignore b/doc/supplements/template/.cvsignore
new file mode 100644
index 0000000000..550566bda9
--- /dev/null
+++ b/doc/supplements/template/.cvsignore
@@ -0,0 +1,38 @@
+bsp.texi
+callconv.texi
+cpumodel.texi
+cputable.texi
+fatalerr.texi
+index.html
+intr.t
+intr.texi
+Makefile
+Makefile.in
+mdate-sh
+memmodel.texi
+rtems_footer.html
+rtems_header.html
+stamp-vti
+template
+template-?
+template-??
+template.aux
+template.cp
+template.dvi
+template.fn
+template*.html
+template.ky
+template.log
+template.pdf
+template.pg
+template.ps
+template.toc
+template.tp
+template.vr
+timeBSP_.t
+timeBSP.texi
+timing.t
+timing.texi
+version.texi
+wksheets.t
+wksheets.texi
diff --git a/doc/supplements/template/BSP_TIMES b/doc/supplements/template/BSP_TIMES
new file mode 100644
index 0000000000..10a86f288f
--- /dev/null
+++ b/doc/supplements/template/BSP_TIMES
@@ -0,0 +1,247 @@
+#
+# CPU MODEL/BSP Timing and Size Information
+#
+# $Id$
+#
+
+#
+# CPU Model Information
+#
+RTEMS_BSP MYBSP
+RTEMS_CPU_MODEL MYCPU
+#
+# Interrupt Latency
+#
+# NOTE: In general, the text says it is hand-calculated to be
+# RTEMS_MAXIMUM_DISABLE_PERIOD at RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+# Mhz and this was last calculated for Release
+# RTEMS_VERSION_FOR_MAXIMUM_DISABLE_PERIOD.
+#
+RTEMS_MAXIMUM_DISABLE_PERIOD TBD
+RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ 20
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD 4.0.0
+#
+# Context Switch Times
+#
+RTEMS_NO_FP_CONTEXTS 35
+RTEMS_RESTORE_1ST_FP_TASK 39
+RTEMS_SAVE_INIT_RESTORE_INIT 66
+RTEMS_SAVE_IDLE_RESTORE_INIT 66
+RTEMS_SAVE_IDLE_RESTORE_IDLE 68
+#
+# Task Manager Times
+#
+RTEMS_TASK_CREATE_ONLY 148
+RTEMS_TASK_IDENT_ONLY 350
+RTEMS_TASK_START_ONLY 76
+RTEMS_TASK_RESTART_CALLING_TASK 95
+RTEMS_TASK_RESTART_SUSPENDED_RETURNS_TO_CALLER 89
+RTEMS_TASK_RESTART_BLOCKED_RETURNS_TO_CALLER 124
+RTEMS_TASK_RESTART_READY_RETURNS_TO_CALLER 92
+RTEMS_TASK_RESTART_SUSPENDED_PREEMPTS_CALLER 125
+RTEMS_TASK_RESTART_BLOCKED_PREEMPTS_CALLER 149
+RTEMS_TASK_RESTART_READY_PREEMPTS_CALLER 142
+RTEMS_TASK_DELETE_CALLING_TASK 170
+RTEMS_TASK_DELETE_SUSPENDED_TASK 138
+RTEMS_TASK_DELETE_BLOCKED_TASK 143
+RTEMS_TASK_DELETE_READY_TASK 144
+RTEMS_TASK_SUSPEND_CALLING_TASK 71
+RTEMS_TASK_SUSPEND_RETURNS_TO_CALLER 43
+RTEMS_TASK_RESUME_TASK_READIED_RETURNS_TO_CALLER 45
+RTEMS_TASK_RESUME_TASK_READIED_PREEMPTS_CALLER 67
+RTEMS_TASK_SET_PRIORITY_OBTAIN_CURRENT_PRIORITY 31
+RTEMS_TASK_SET_PRIORITY_RETURNS_TO_CALLER 64
+RTEMS_TASK_SET_PRIORITY_PREEMPTS_CALLER 106
+RTEMS_TASK_MODE_OBTAIN_CURRENT_MODE 14
+RTEMS_TASK_MODE_NO_RESCHEDULE 16
+RTEMS_TASK_MODE_RESCHEDULE_RETURNS_TO_CALLER 23
+RTEMS_TASK_MODE_RESCHEDULE_PREEMPTS_CALLER 60
+RTEMS_TASK_GET_NOTE_ONLY 33
+RTEMS_TASK_SET_NOTE_ONLY 33
+RTEMS_TASK_WAKE_AFTER_YIELD_RETURNS_TO_CALLER 16
+RTEMS_TASK_WAKE_AFTER_YIELD_PREEMPTS_CALLER 56
+RTEMS_TASK_WAKE_WHEN_ONLY 117
+#
+# Interrupt Manager
+#
+RTEMS_INTR_ENTRY_RETURNS_TO_NESTED 12
+RTEMS_INTR_ENTRY_RETURNS_TO_INTERRUPTED_TASK 9
+RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK 9
+RTEMS_INTR_EXIT_RETURNS_TO_NESTED <1
+RTEMS_INTR_EXIT_RETURNS_TO_INTERRUPTED_TASK 8
+RTEMS_INTR_EXIT_RETURNS_TO_PREEMPTING_TASK 54
+#
+# Clock Manager
+#
+RTEMS_CLOCK_SET_ONLY 86
+RTEMS_CLOCK_GET_ONLY 1
+RTEMS_CLOCK_TICK_ONLY 17
+#
+# Timer Manager
+#
+RTEMS_TIMER_CREATE_ONLY 28
+RTEMS_TIMER_IDENT_ONLY 343
+RTEMS_TIMER_DELETE_INACTIVE 43
+RTEMS_TIMER_DELETE_ACTIVE 47
+RTEMS_TIMER_FIRE_AFTER_INACTIVE 58
+RTEMS_TIMER_FIRE_AFTER_ACTIVE 61
+RTEMS_TIMER_FIRE_WHEN_INACTIVE 88
+RTEMS_TIMER_FIRE_WHEN_ACTIVE 88
+RTEMS_TIMER_RESET_INACTIVE 54
+RTEMS_TIMER_RESET_ACTIVE 58
+RTEMS_TIMER_CANCEL_INACTIVE 31
+RTEMS_TIMER_CANCEL_ACTIVE 34
+#
+# Semaphore Manager
+#
+RTEMS_SEMAPHORE_CREATE_ONLY 60
+RTEMS_SEMAPHORE_IDENT_ONLY 367
+RTEMS_SEMAPHORE_DELETE_ONLY 58
+RTEMS_SEMAPHORE_OBTAIN_AVAILABLE 38
+RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_NO_WAIT 38
+RTEMS_SEMAPHORE_OBTAIN_NOT_AVAILABLE_CALLER_BLOCKS 109
+RTEMS_SEMAPHORE_RELEASE_NO_WAITING_TASKS 44
+RTEMS_SEMAPHORE_RELEASE_TASK_READIED_RETURNS_TO_CALLER 66
+RTEMS_SEMAPHORE_RELEASE_TASK_READIED_PREEMPTS_CALLER 87
+#
+# Message Manager
+#
+RTEMS_MESSAGE_QUEUE_CREATE_ONLY 200
+RTEMS_MESSAGE_QUEUE_IDENT_ONLY 341
+RTEMS_MESSAGE_QUEUE_DELETE_ONLY 80
+RTEMS_MESSAGE_QUEUE_SEND_NO_WAITING_TASKS 97
+RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_RETURNS_TO_CALLER 101
+RTEMS_MESSAGE_QUEUE_SEND_TASK_READIED_PREEMPTS_CALLER 123
+RTEMS_MESSAGE_QUEUE_URGENT_NO_WAITING_TASKS 96
+RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_RETURNS_TO_CALLER 101
+RTEMS_MESSAGE_QUEUE_URGENT_TASK_READIED_PREEMPTS_CALLER 123
+RTEMS_MESSAGE_QUEUE_BROADCAST_NO_WAITING_TASKS 53
+RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_RETURNS_TO_CALLER 111
+RTEMS_MESSAGE_QUEUE_BROADCAST_TASK_READIED_PREEMPTS_CALLER 133
+RTEMS_MESSAGE_QUEUE_RECEIVE_AVAILABLE 79
+RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_NO_WAIT 43
+RTEMS_MESSAGE_QUEUE_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS 114
+RTEMS_MESSAGE_QUEUE_FLUSH_NO_MESSAGES_FLUSHED 29
+RTEMS_MESSAGE_QUEUE_FLUSH_MESSAGES_FLUSHED 39
+#
+# Event Manager
+#
+RTEMS_EVENT_SEND_NO_TASK_READIED 24
+RTEMS_EVENT_SEND_TASK_READIED_RETURNS_TO_CALLER 60
+RTEMS_EVENT_SEND_TASK_READIED_PREEMPTS_CALLER 84
+RTEMS_EVENT_RECEIVE_OBTAIN_CURRENT_EVENTS 1
+RTEMS_EVENT_RECEIVE_AVAILABLE 28
+RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_NO_WAIT 23
+RTEMS_EVENT_RECEIVE_NOT_AVAILABLE_CALLER_BLOCKS 84
+#
+# Signal Manager
+#
+RTEMS_SIGNAL_CATCH_ONLY 15
+RTEMS_SIGNAL_SEND_RETURNS_TO_CALLER 37
+RTEMS_SIGNAL_SEND_SIGNAL_TO_SELF 55
+RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_CALLING_TASK 37
+RTEMS_SIGNAL_EXIT_ASR_OVERHEAD_RETURNS_TO_PREEMPTING_TASK 54
+#
+# Partition Manager
+#
+RTEMS_PARTITION_CREATE_ONLY 70
+RTEMS_PARTITION_IDENT_ONLY 341
+RTEMS_PARTITION_DELETE_ONLY 42
+RTEMS_PARTITION_GET_BUFFER_AVAILABLE 35
+RTEMS_PARTITION_GET_BUFFER_NOT_AVAILABLE 33
+RTEMS_PARTITION_RETURN_BUFFER_ONLY 43
+#
+# Region Manager
+#
+RTEMS_REGION_CREATE_ONLY 63
+RTEMS_REGION_IDENT_ONLY 348
+RTEMS_REGION_DELETE_ONLY 39
+RTEMS_REGION_GET_SEGMENT_AVAILABLE 52
+RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_NO_WAIT 49
+RTEMS_REGION_GET_SEGMENT_NOT_AVAILABLE_CALLER_BLOCKS 123
+RTEMS_REGION_RETURN_SEGMENT_NO_WAITING_TASKS 54
+RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_RETURNS_TO_CALLER 114
+RTEMS_REGION_RETURN_SEGMENT_TASK_READIED_PREEMPTS_CALLER 136
+#
+# Dual-Ported Memory Manager
+#
+RTEMS_PORT_CREATE_ONLY 35
+RTEMS_PORT_IDENT_ONLY 340
+RTEMS_PORT_DELETE_ONLY 39
+RTEMS_PORT_INTERNAL_TO_EXTERNAL_ONLY 26
+RTEMS_PORT_EXTERNAL_TO_INTERNAL_ONLY 27
+#
+# IO Manager
+#
+RTEMS_IO_INITIALIZE_ONLY 4
+RTEMS_IO_OPEN_ONLY 2
+RTEMS_IO_CLOSE_ONLY 1
+RTEMS_IO_READ_ONLY 2
+RTEMS_IO_WRITE_ONLY 3
+RTEMS_IO_CONTROL_ONLY 2
+#
+# Rate Monotonic Manager
+#
+RTEMS_RATE_MONOTONIC_CREATE_ONLY 32
+RTEMS_RATE_MONOTONIC_IDENT_ONLY 341
+RTEMS_RATE_MONOTONIC_CANCEL_ONLY 39
+RTEMS_RATE_MONOTONIC_DELETE_ACTIVE 51
+RTEMS_RATE_MONOTONIC_DELETE_INACTIVE 48
+RTEMS_RATE_MONOTONIC_PERIOD_INITIATE_PERIOD_RETURNS_TO_CALLER 54
+RTEMS_RATE_MONOTONIC_PERIOD_CONCLUDE_PERIOD_CALLER_BLOCKS 74
+RTEMS_RATE_MONOTONIC_PERIOD_OBTAIN_STATUS 31
+#
+# Size Information
+#
+#
+# xxx alloted for numbers
+#
+RTEMS_DATA_SPACE 723
+RTEMS_MINIMUM_CONFIGURATION 18,980
+RTEMS_MAXIMUM_CONFIGURATION 36,438
+# x,xxx alloted for numbers
+RTEMS_CORE_CODE_SIZE 12,674
+RTEMS_INITIALIZATION_CODE_SIZE 970
+RTEMS_TASK_CODE_SIZE 3,562
+RTEMS_INTERRUPT_CODE_SIZE 54
+RTEMS_CLOCK_CODE_SIZE 334
+RTEMS_TIMER_CODE_SIZE 1,110
+RTEMS_SEMAPHORE_CODE_SIZE 1,632
+RTEMS_MESSAGE_CODE_SIZE 1,754
+RTEMS_EVENT_CODE_SIZE 1,000
+RTEMS_SIGNAL_CODE_SIZE 418
+RTEMS_PARTITION_CODE_SIZE 1,164
+RTEMS_REGION_CODE_SIZE 1,494
+RTEMS_DPMEM_CODE_SIZE 724
+RTEMS_IO_CODE_SIZE 686
+RTEMS_FATAL_ERROR_CODE_SIZE 24
+RTEMS_RATE_MONOTONIC_CODE_SIZE 1,212
+RTEMS_MULTIPROCESSING_CODE_SIZE 6.952
+# xxx alloted for numbers
+RTEMS_TIMER_CODE_OPTSIZE 184
+RTEMS_SEMAPHORE_CODE_OPTSIZE 172
+RTEMS_MESSAGE_CODE_OPTSIZE 288
+RTEMS_EVENT_CODE_OPTSIZE 56
+RTEMS_SIGNAL_CODE_OPTSIZE 56
+RTEMS_PARTITION_CODE_OPTSIZE 132
+RTEMS_REGION_CODE_OPTSIZE 160
+RTEMS_DPMEM_CODE_OPTSIZE 132
+RTEMS_IO_CODE_OPTSIZE 00
+RTEMS_RATE_MONOTONIC_CODE_OPTSIZE 184
+RTEMS_MULTIPROCESSING_CODE_OPTSIZE 332
+# xxx alloted for numbers
+RTEMS_BYTES_PER_TASK 400
+RTEMS_BYTES_PER_TIMER 68
+RTEMS_BYTES_PER_SEMAPHORE 124
+RTEMS_BYTES_PER_MESSAGE_QUEUE 148
+RTEMS_BYTES_PER_REGION 144
+RTEMS_BYTES_PER_PARTITION 56
+RTEMS_BYTES_PER_PORT 36
+RTEMS_BYTES_PER_PERIOD 36
+RTEMS_BYTES_PER_EXTENSION 64
+RTEMS_BYTES_PER_FP_TASK 332
+RTEMS_BYTES_PER_NODE 48
+RTEMS_BYTES_PER_GLOBAL_OBJECT 20
+RTEMS_BYTES_PER_PROXY 124
+# x,xxx alloted for numbers
+RTEMS_BYTES_OF_FIXED_SYSTEM_REQUIREMENTS 8,872
diff --git a/doc/supplements/template/ChangeLog b/doc/supplements/template/ChangeLog
new file mode 100644
index 0000000000..7df694a6cc
--- /dev/null
+++ b/doc/supplements/template/ChangeLog
@@ -0,0 +1,76 @@
+2003-12-12 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-12-11 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-11-26 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Add *.info to CLEANFILES to accomodate
+ automake-1.7f/1.8 breaking building infos.
+
+2003-09-26 Joel Sherrill <joel@OARcorp.com>
+
+ * cpumodel.t: Obsoleting HP PA-RISC port and removing all references.
+
+2003-09-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Merger from rtems-4-6-branch.
+
+2003-09-19 Joel Sherrill <joel@OARcorp.com>
+
+ * template.texi: Merge from branch.
+
+2003-05-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * cpumodel.t: Reflect c/src/exec having moved to cpukit.
+
+2003-01-25 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * template.texi: Set @setfilename template.info.
+
+2003-01-24 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Put GENERATED_FILES into $builddir.
+
+2003-01-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * version.texi: Remove from CVS.
+ * stamp-vti: Remove from CVS.
+ * .cvsignore: Add version.texi.
+ Add stamp-vti.
+ Re-sort.
+
+2003-01-21 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-11-13 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-10-24 Joel Sherrill <joel@OARcorp.com>
+
+ * stamp-vti, version.texi: Regenerated.
+
+2002-07-30 Joel Sherrill <joel@OARcorp.com>
+
+ * intr_NOTIMES.t, timeBSP.t: Replaced XXX's with real info.
+
+2002-03-27 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Remove AUTOMAKE_OPTIONS.
+
+2002-01-18 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Require automake-1.5.
+
+2001-01-17 Joel Sherrill <joel@OARcorp.com>
+
+ * .cvsignore: Added rtems_header.html and rtems_footer.html.
+
+2000-08-10 Joel Sherrill <joel@OARcorp.com>
+
+ * ChangeLog: New file.
diff --git a/doc/supplements/template/Makefile.am b/doc/supplements/template/Makefile.am
new file mode 100644
index 0000000000..27ecc24457
--- /dev/null
+++ b/doc/supplements/template/Makefile.am
@@ -0,0 +1,110 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = template
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/supplements/supplement.am
+
+GENERATED_FILES = cpumodel.texi callconv.texi memmodel.texi intr.texi \
+ fatalerr.texi bsp.texi cputable.texi wksheets.texi timing.texi \
+ timeBSP.texi
+COMMON_FILES += $(top_srcdir)/common/cpright.texi \
+ $(top_srcdir)/common/timemac.texi
+
+FILES = preface.texi
+
+info_TEXINFOS = template.texi
+template_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+#
+# Chapters which get automatic processing
+#
+
+cpumodel.texi: cpumodel.t
+ $(BMENU2) -p "Preface" \
+ -u "Top" \
+ -n "Calling Conventions" < $< > $@
+
+callconv.texi: callconv.t
+ $(BMENU2) -p "CPU Model Dependent Features Another Optional Feature" \
+ -u "Top" \
+ -n "Memory Model" < $< > $@
+
+memmodel.texi: memmodel.t
+ $(BMENU2) -p "Calling Conventions User-Provided Routines" \
+ -u "Top" \
+ -n "Interrupt Processing" < $< > $@
+
+# Interrupt Chapter:
+# 1. Replace Times and Sizes
+# 2. Build Node Structure
+intr.texi: intr_NOTIMES.t BSP_TIMES
+ ${REPLACE2} -p $(srcdir)/BSP_TIMES $(srcdir)/intr_NOTIMES.t | \
+ $(BMENU2) -p "Memory Model Flat Memory Model" \
+ -u "Top" \
+ -n "Default Fatal Error Processing" > $@
+
+fatalerr.texi: fatalerr.t
+ $(BMENU2) -p "Interrupt Processing Interrupt Stack" \
+ -u "Top" \
+ -n "Board Support Packages" < $< > $@
+
+bsp.texi: bsp.t
+ $(BMENU2) -p "Default Fatal Error Processing Default Fatal Error Handler Operations" \
+ -u "Top" \
+ -n "Processor Dependent Information Table" < $< > $@
+
+cputable.texi: cputable.t
+ $(BMENU2) -p "Board Support Packages Processor Initialization" \
+ -u "Top" \
+ -n "Memory Requirements" < $< > $@
+
+# Worksheets Chapter:
+# 1. Obtain the Shared File
+# 2. Replace Times and Sizes
+# 3. Build Node Structure
+
+wksheets.texi: $(top_srcdir)/common/wksheets.t BSP_TIMES
+ ${REPLACE2} -p $(srcdir)/BSP_TIMES \
+ $(top_srcdir)/common/wksheets.t | \
+ $(BMENU2) -p "Processor Dependent Information Table CPU Dependent Information Table" \
+ -u "Top" \
+ -n "Timing Specification" > $@
+
+# Timing Specification Chapter:
+# 1. Copy the Shared File
+# 3. Build Node Structure
+
+timing.texi: $(top_srcdir)/common/timing.t
+ $(BMENU2) -p "Memory Requirements RTEMS RAM Workspace Worksheet" \
+ -u "Top" \
+ -n "MYBSP Timing Data" < $< > $@
+
+# Timing Data for BSP BSP Chapter:
+# 1. Copy the Shared File
+# 2. Replace Times and Sizes
+# 3. Build Node Structure
+
+timeBSP.texi: $(top_srcdir)/common/timetbl.t timeBSP.t
+ cat $(srcdir)/timeBSP.t $(top_srcdir)/common/timetbl.t >timeBSP_.t
+ @echo >>timeBSP_.t
+ @echo "@tex" >>timeBSP_.t
+ @echo "\\global\\advance \\smallskipamount by 4pt" >>timeBSP_.t
+ @echo "@end tex" >>timeBSP_.t
+ ${REPLACE2} -p $(srcdir)/BSP_TIMES timeBSP_.t | \
+ $(BMENU2) -p "Timing Specification Terminology" \
+ -u "Top" \
+ -n "Command and Variable Index" > $@
+CLEANFILES += timeBSP_.t
+
+EXTRA_DIST = BSP_TIMES bsp.t callconv.t cpumodel.t cputable.t fatalerr.t \
+ intr_NOTIMES.t memmodel.t timeBSP.t
+
+CLEANFILES += template.info template.info-?
diff --git a/doc/supplements/template/bsp.t b/doc/supplements/template/bsp.t
new file mode 100644
index 0000000000..657c359a96
--- /dev/null
+++ b/doc/supplements/template/bsp.t
@@ -0,0 +1,93 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Board Support Packages
+
+@section Introduction
+
+An RTEMS Board Support Package (BSP) must be designed
+to support a particular processor and target board combination.
+This chapter presents a discussion of XXX specific BSP
+issues. For more information on developing a BSP, refer to the
+chapter titled Board Support Packages in the RTEMS
+Applications User's Guide.
+
+@section System Reset
+
+An RTEMS based application is initiated or
+re-initiated when the XXX processor is reset. When the
+XXX is reset, the processor performs the following actions:
+
+@itemize @bullet
+@item The tracing bits of the status register are cleared to
+disable tracing.
+
+@item The supervisor interrupt state is entered by setting the
+supervisor (S) bit and clearing the master/interrupt (M) bit of
+the status register.
+
+@item The interrupt mask of the status register is set to
+level 7 to effectively disable all maskable interrupts.
+
+@item The vector base register (VBR) is set to zero.
+
+@item The cache control register (CACR) is set to zero to
+disable and freeze the processor cache.
+
+@item The interrupt stack pointer (ISP) is set to the value
+stored at vector 0 (bytes 0-3) of the exception vector table
+(EVT).
+
+@item The program counter (PC) is set to the value stored at
+vector 1 (bytes 4-7) of the EVT.
+
+@item The processor begins execution at the address stored in
+the PC.
+@end itemize
+
+@section Processor Initialization
+
+The address of the application's initialization code
+should be stored in the first vector of the EVT which will allow
+the immediate vectoring to the application code. If the
+application requires that the VBR be some value besides zero,
+then it should be set to the required value at this point. All
+tasks share the same XXX's VBR value. Because interrupts
+are enabled automatically by RTEMS as part of the initialize
+executive directive, the VBR MUST be set before this directive
+is invoked to insure correct interrupt vectoring. If processor
+caching is to be utilized, then it should be enabled during the
+reset application initialization code.
+
+In addition to the requirements described in the
+Board Support Packages chapter of the Applications User's
+Manual for the reset code which is executed before the call to
+initialize executive, the XXX version has the following
+specific requirements:
+
+@itemize @bullet
+@item Must leave the S bit of the status register set so that
+the XXX remains in the supervisor state.
+
+@item Must set the M bit of the status register to remove the
+XXX from the interrupt state.
+
+@item Must set the master stack pointer (MSP) such that a
+minimum stack size of MINIMUM_STACK_SIZE bytes is provided for
+the initialize executive directive.
+
+@item Must initialize the XXX's vector table.
+@end itemize
+
+Note that the BSP is not responsible for allocating
+or installing the interrupt stack. RTEMS does this
+automatically as part of initialization. If the BSP does not
+install an interrupt stack and -- for whatever reason -- an
+interrupt occurs before initialize_executive is invoked, then
+the results are unpredictable.
+
diff --git a/doc/supplements/template/callconv.t b/doc/supplements/template/callconv.t
new file mode 100644
index 0000000000..5387032c60
--- /dev/null
+++ b/doc/supplements/template/callconv.t
@@ -0,0 +1,92 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Calling Conventions
+
+@section Introduction
+
+Each high-level language compiler generates
+subroutine entry and exit code based upon a set of rules known
+as the compiler's calling convention. These rules address the
+following issues:
+
+@itemize @bullet
+@item register preservation and usage
+@item parameter passing
+@item call and return mechanism
+@end itemize
+
+A compiler's calling convention is of importance when
+interfacing to subroutines written in another language either
+assembly or high-level. Even when the high-level language and
+target processor are the same, different compilers may use
+different calling conventions. As a result, calling conventions
+are both processor and compiler dependent.
+
+@section Processor Background
+
+The MC68xxx architecture supports a simple yet
+effective call and return mechanism. A subroutine is invoked
+via the branch to subroutine (@code{XXX}) or the jump to subroutine
+(@code{XXX}) instructions. These instructions push the return address
+on the current stack. The return from subroutine (@code{XXX})
+instruction pops the return address off the current stack and
+transfers control to that instruction. It is is important to
+note that the XXX call and return mechanism does not
+automatically save or restore any registers. It is the
+responsibility of the high-level language compiler to define the
+register preservation and usage convention.
+
+@section Calling Mechanism
+
+All RTEMS directives are invoked using either a @code{XXX}
+or @code{XXX} instruction and return to the user application via the
+@code{XXX} instruction.
+
+@section Register Usage
+
+As discussed above, the @code{XXX} and @code{XXX} instructions do
+not automatically save any registers. RTEMS uses the registers
+@b{D0}, @b{D1}, @b{A0}, and @b{A1} as scratch registers. These registers are
+not preserved by RTEMS directives therefore, the contents of
+these registers should not be assumed upon return from any RTEMS
+directive.
+
+@section Parameter Passing
+
+RTEMS assumes that arguments are placed on the
+current stack before the directive is invoked via the @code{XXX} or @code{XXX}
+instruction. The first argument is assumed to be closest to the
+return address on the stack. This means that the first argument
+of the C calling sequence is pushed last. The following
+pseudo-code illustrates the typical sequence used to call a
+RTEMS directive with three (3) arguments:
+
+@example
+@group
+push third argument
+push second argument
+push first argument
+invoke directive
+remove arguments from the stack
+@end group
+@end example
+
+The arguments to RTEMS are typically pushed onto the
+stack using a move instruction with a pre-decremented stack
+pointer as the destination. These arguments must be removed
+from the stack after control is returned to the caller. This
+removal is typically accomplished by adding the size of the
+argument list in bytes to the current stack pointer.
+
+@section User-Provided Routines
+
+All user-provided routines invoked by RTEMS, such as
+user extensions, device drivers, and MPCI routines, must also
+adhere to these calling conventions.
+
diff --git a/doc/supplements/template/cpumodel.t b/doc/supplements/template/cpumodel.t
new file mode 100644
index 0000000000..c366970ae1
--- /dev/null
+++ b/doc/supplements/template/cpumodel.t
@@ -0,0 +1,68 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter CPU Model Dependent Features
+
+@section Introduction
+
+Microprocessors are generally classified into
+families with a variety of CPU models or implementations within
+that family. Within a processor family, there is a high level
+of binary compatibility. This family may be based on either an
+architectural specification or on maintaining compatibility with
+a popular processor. Recent microprocessor families such as the
+SPARC or PowerPC are based on an architectural specification
+which is independent or any particular CPU model or
+implementation. Older families such as the M68xxx and the iX86
+evolved as the manufacturer strived to produce higher
+performance processor models which maintained binary
+compatibility with older models.
+
+RTEMS takes advantage of the similarity of the
+various models within a CPU family. Although the models do vary
+in significant ways, the high level of compatibility makes it
+possible to share the bulk of the CPU dependent executive code
+across the entire family. Each processor family supported by
+RTEMS has a list of features which vary between CPU models
+within a family. For example, the most common model dependent
+feature regardless of CPU family is the presence or absence of a
+floating point unit or coprocessor. When defining the list of
+features present on a particular CPU model, one simply notes
+that floating point hardware is or is not present and defines a
+single constant appropriately. Conditional compilation is
+utilized to include the appropriate source code for this CPU
+model's feature set. It is important to note that this means
+that RTEMS is thus compiled using the appropriate feature set
+and compilation flags optimal for this CPU model used. The
+alternative would be to generate a binary which would execute on
+all family members using only the features which were always
+present.
+
+This chapter presents the set of features which vary
+across SPARC implementations and are of importance to RTEMS.
+The set of CPU model feature macros are defined in the file
+cpukit/score/cpu/XXX/XXX.h based upon the particular CPU
+model defined on the compilation command line.
+
+@section CPU Model Name
+
+The macro CPU_MODEL_NAME is a string which designates
+the name of this CPU model. For example, for the MODEL
+processor, this macro is set to the string "XXX".
+
+@section Floating Point Unit
+
+The macro XXX_HAS_FPU is set to 1 to indicate that
+this CPU model has a hardware floating point unit and 0
+otherwise. It does not matter whether the hardware floating
+point support is incorporated on-chip or is an external
+coprocessor.
+
+@section Another Optional Feature
+
+The macro XXX
diff --git a/doc/supplements/template/cputable.t b/doc/supplements/template/cputable.t
new file mode 100644
index 0000000000..75d0fc15f6
--- /dev/null
+++ b/doc/supplements/template/cputable.t
@@ -0,0 +1,109 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Processor Dependent Information Table
+
+@section Introduction
+
+Any highly processor dependent information required
+to describe a processor to RTEMS is provided in the CPU
+Dependent Information Table. This table is not required for all
+processors supported by RTEMS. This chapter describes the
+contents, if any, for a particular processor type.
+
+@section CPU Dependent Information Table
+
+The XXX version of the RTEMS CPU Dependent
+Information Table contains the information required to interface
+a Board Support Package and RTEMS on the XXX. This
+information is provided to allow RTEMS to interoperate
+effectively with the BSP. The C structure definition is given
+here:
+
+@example
+@group
+typedef struct @{
+ void (*pretasking_hook)( void );
+ void (*predriver_hook)( void );
+ void (*postdriver_hook)( void );
+ void (*idle_task)( void );
+ boolean do_zero_of_workspace;
+ unsigned32 idle_task_stack_size;
+ unsigned32 interrupt_stack_size;
+ unsigned32 extra_mpci_receive_server_stack;
+ void * (*stack_allocate_hook)( unsigned32 );
+ void (*stack_free_hook)( void* );
+ /* end of fields required on all CPUs */
+
+ /* XXX CPU family dependent stuff */
+@} rtems_cpu_table;
+@end group
+@end example
+
+@table @code
+@item pretasking_hook
+is the address of the user provided routine which is invoked
+once RTEMS APIs are initialized. This routine will be invoked
+before any system tasks are created. Interrupts are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item predriver_hook
+is the address of the user provided
+routine that is invoked immediately before the
+the device drivers and MPCI are initialized. RTEMS
+initialization is complete but interrupts and tasking are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item postdriver_hook
+is the address of the user provided
+routine that is invoked immediately after the
+the device drivers and MPCI are initialized. RTEMS
+initialization is complete but interrupts and tasking are disabled.
+This field may be NULL to indicate that the hook is not utilized.
+
+@item idle_task
+is the address of the optional user
+provided routine which is used as the system's IDLE task. If
+this field is not NULL, then the RTEMS default IDLE task is not
+used. This field may be NULL to indicate that the default IDLE
+is to be used.
+
+@item do_zero_of_workspace
+indicates whether RTEMS should
+zero the Workspace as part of its initialization. If set to
+TRUE, the Workspace is zeroed. Otherwise, it is not.
+
+@item idle_task_stack_size
+is the size of the RTEMS idle task stack in bytes.
+If this number is less than MINIMUM_STACK_SIZE, then the
+idle task's stack will be MINIMUM_STACK_SIZE in byte.
+
+@item interrupt_stack_size
+is the size of the RTEMS
+allocated interrupt stack in bytes. This value must be at least
+as large as MINIMUM_STACK_SIZE.
+
+@item extra_mpci_receive_server_stack
+is the extra stack space allocated for the RTEMS MPCI receive server task
+in bytes. The MPCI receive server may invoke nearly all directives and
+may require extra stack space on some targets.
+
+@item stack_allocate_hook
+is the address of the optional user provided routine which allocates
+memory for task stacks. If this hook is not NULL, then a stack_free_hook
+must be provided as well.
+
+@item stack_free_hook
+is the address of the optional user provided routine which frees
+memory for task stacks. If this hook is not NULL, then a stack_allocate_hook
+must be provided as well.
+
+@item XXX
+is where the CPU family dependent stuff goes.
+
+@end table
diff --git a/doc/supplements/template/fatalerr.t b/doc/supplements/template/fatalerr.t
new file mode 100644
index 0000000000..53efad0435
--- /dev/null
+++ b/doc/supplements/template/fatalerr.t
@@ -0,0 +1,31 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Default Fatal Error Processing
+
+@section Introduction
+
+Upon detection of a fatal error by either the
+application or RTEMS the fatal error manager is invoked. The
+fatal error manager will invoke the user-supplied fatal error
+handlers. If no user-supplied handlers are configured, the
+RTEMS provided default fatal error handler is invoked. If the
+user-supplied fatal error handlers return to the executive the
+default fatal error handler is then invoked. This chapter
+describes the precise operations of the default fatal error
+handler.
+
+@section Default Fatal Error Handler Operations
+
+The default fatal error handler which is invoked by
+the @code{rtems_fatal_error_occurred} directive when there is
+no user handler configured or the user handler returns control to
+RTEMS. The default fatal error handler disables processor interrupts,
+places the error code in @b{XXX}, and executes a @code{XXX}
+instruction to simulate a halt processor instruction.
+
diff --git a/doc/supplements/template/intr_NOTIMES.t b/doc/supplements/template/intr_NOTIMES.t
new file mode 100644
index 0000000000..13e4921ea9
--- /dev/null
+++ b/doc/supplements/template/intr_NOTIMES.t
@@ -0,0 +1,196 @@
+@c
+@c Interrupt Stack Frame Picture
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Interrupt Processing
+
+@section Introduction
+
+Different types of processors respond to the
+occurrence of an interrupt in its own unique fashion. In
+addition, each processor type provides a control mechanism to
+allow for the proper handling of an interrupt. The processor
+dependent response to the interrupt modifies the current
+execution state and results in a change in the execution stream.
+Most processors require that an interrupt handler utilize some
+special control mechanisms to return to the normal processing
+stream. Although RTEMS hides many of the processor dependent
+details of interrupt processing, it is important to understand
+how the RTEMS interrupt manager is mapped onto the processor's
+unique architecture. Discussed in this chapter are the processor's
+interrupt response and control mechanisms as they pertain to
+RTEMS.
+
+@section Vectoring of an Interrupt Handler
+
+Depending on whether or not the particular CPU
+supports a separate interrupt stack, the XXX family has two
+different interrupt handling models.
+
+@subsection Models Without Separate Interrupt Stacks
+
+Upon receipt of an interrupt the XXX family
+members without separate interrupt stacks automatically perform
+the following actions:
+
+@itemize @bullet
+@item To Be Written
+@end itemize
+
+@subsection Models With Separate Interrupt Stacks
+
+Upon receipt of an interrupt the XXX family
+members with separate interrupt stacks automatically perform the
+following actions:
+
+@itemize @bullet
+@item saves the current status register (SR),
+
+@item clears the master/interrupt (M) bit of the SR to
+indicate the switch from master state to interrupt state,
+
+@item sets the privilege mode to supervisor,
+
+@item suppresses tracing,
+
+@item sets the interrupt mask level equal to the level of the
+interrupt being serviced,
+
+@item pushes an interrupt stack frame (ISF), which includes
+the program counter (PC), the status register (SR), and the
+format/exception vector offset (FVO) word, onto the supervisor
+and interrupt stacks,
+
+@item switches the current stack to the interrupt stack and
+vectors to an interrupt service routine (ISR). If the ISR was
+installed with the interrupt_catch directive, then the RTEMS
+interrupt handler will begin execution. The RTEMS interrupt
+handler saves all registers which are not preserved according to
+the calling conventions and invokes the application's ISR.
+@end itemize
+
+A nested interrupt is processed similarly by these
+CPU models with the exception that only a single ISF is placed
+on the interrupt stack and the current stack need not be
+switched.
+
+The FVO word in the Interrupt Stack Frame is examined
+by RTEMS to determine when an outer most interrupt is being
+exited. Since the FVO is used by RTEMS for this purpose, the
+user application code MUST NOT modify this field.
+
+The following shows the Interrupt Stack Frame for
+XXX CPU models with separate interrupt stacks:
+
+@ifset use-ascii
+@example
+@group
+ +----------------------+
+ | Status Register | 0x0
+ +----------------------+
+ | Program Counter High | 0x2
+ +----------------------+
+ | Program Counter Low | 0x4
+ +----------------------+
+ | Format/Vector Offset | 0x6
+ +----------------------+
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@sp 1
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\strut\vrule#&
+\hbox to 2.00in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 0.50in{\enskip\hfil#\hfil}
+\cr
+\multispan{3}\hrulefill\cr
+& Status Register && 0x0\cr
+\multispan{3}\hrulefill\cr
+& Program Counter High && 0x2\cr
+\multispan{3}\hrulefill\cr
+& Program Counter Low && 0x4\cr
+\multispan{3}\hrulefill\cr
+& Format/Vector Offset && 0x6\cr
+\multispan{3}\hrulefill\cr
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=2 WIDTH="40%" BORDER=2>
+<TR><TD ALIGN=center><STRONG>Status Register</STRONG></TD>
+ <TD ALIGN=center>0x0</TD></TR>
+<TR><TD ALIGN=center><STRONG>Program Counter High</STRONG></TD>
+ <TD ALIGN=center>0x2</TD></TR>
+<TR><TD ALIGN=center><STRONG>Program Counter Low</STRONG></TD>
+ <TD ALIGN=center>0x4</TD></TR>
+<TR><TD ALIGN=center><STRONG>Format/Vector Offset</STRONG></TD>
+ <TD ALIGN=center>0x6</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+@section Interrupt Levels
+
+Eight levels (0-7) of interrupt priorities are
+supported by XXX family members with level seven (7) being
+the highest priority. Level zero (0) indicates that interrupts
+are fully enabled. Interrupt requests for interrupts with
+priorities less than or equal to the current interrupt mask
+level are ignored.
+
+Although RTEMS supports 256 interrupt levels, the
+XXX family only supports eight. RTEMS interrupt levels 0
+through 7 directly correspond to XXX interrupt levels. All
+other RTEMS interrupt levels are undefined and their behavior is
+unpredictable.
+
+@section Disabling of Interrupts by RTEMS
+
+During the execution of directive calls, critical
+sections of code may be executed. When these sections are
+encountered, RTEMS disables interrupts to level seven (7) before
+the execution of this section and restores them to the previous
+level upon completion of the section. RTEMS has been optimized
+to insure that interrupts are disabled for less than
+RTEMS_MAXIMUM_DISABLE_PERIOD microseconds on a
+RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ Mhz XXX with
+zero wait states. These numbers will vary based the
+number of wait states and processor speed present on the target board.
+[NOTE: The maximum period with interrupts disabled is hand calculated. This
+calculation was last performed for Release
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD.]
+
+Non-maskable interrupts (NMI) cannot be disabled, and
+ISRs which execute at this level MUST NEVER issue RTEMS system
+calls. If a directive is invoked, unpredictable results may
+occur due to the inability of RTEMS to protect its critical
+sections. However, ISRs that make no system calls may safely
+execute as non-maskable interrupts.
+
+@section Interrupt Stack
+
+RTEMS allocates the interrupt stack from the
+Workspace Area. The amount of memory allocated for the
+interrupt stack is determined by the interrupt_stack_size field
+in the CPU Configuration Table. During the initialization
+process, RTEMS will install its interrupt stack.
+
+The XXX port of RTEMS supports a software managed
+dedicated interrupt stack on those CPU models which do not
+support a separate interrupt stack in hardware.
+
+
diff --git a/doc/supplements/template/memmodel.t b/doc/supplements/template/memmodel.t
new file mode 100644
index 0000000000..ef35072230
--- /dev/null
+++ b/doc/supplements/template/memmodel.t
@@ -0,0 +1,39 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Memory Model
+
+@section Introduction
+
+A processor may support any combination of memory
+models ranging from pure physical addressing to complex demand
+paged virtual memory systems. RTEMS supports a flat memory
+model which ranges contiguously over the processor's allowable
+address space. RTEMS does not support segmentation or virtual
+memory of any kind. The appropriate memory model for RTEMS
+provided by the targeted processor and related characteristics
+of that model are described in this chapter.
+
+@section Flat Memory Model
+
+The XXX family supports a flat 32-bit address
+space with addresses ranging from 0x00000000 to 0xFFFFFFFF (4
+gigabytes). Each address is represented by a 32-bit value and
+is byte addressable. The address may be used to reference a
+single byte, word (2-bytes), or long word (4 bytes). Memory
+accesses within this address space are performed in big endian
+fashion by the processors in this family.
+
+Some of the XXX family members such as the
+XXX, XXX, and XXX support virtual memory and
+segmentation. The XXX requires external hardware support
+such as the XXX Paged Memory Management Unit coprocessor
+which is typically used to perform address translations for
+these systems. RTEMS does not support virtual memory or
+segmentation on any of the XXX family members.
+
diff --git a/doc/supplements/template/preface.texi b/doc/supplements/template/preface.texi
new file mode 100644
index 0000000000..686a17b48d
--- /dev/null
+++ b/doc/supplements/template/preface.texi
@@ -0,0 +1,55 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Preface, CPU Model Dependent Features, Top, Top
+@end ifinfo
+@unnumbered Preface
+
+The Real Time Executive for Multiprocessor Systems (RTEMS)
+is designed to be portable across multiple processor
+architectures. However, the nature of real-time systems makes
+it essential that the application designer understand certain
+processor dependent implementation details. These processor
+dependencies include calling convention, board support package
+issues, interrupt processing, exact RTEMS memory requirements,
+performance data, header files, and the assembly language
+interface to the executive.
+
+This document discusses the VENDOR XXX
+architecture dependencies in this port of RTEMS. The XXX
+family has a wide variety of CPU models within it. The part
+numbers ...
+
+XXX fill in some things here
+
+It is highly recommended that the XXX
+RTEMS application developer obtain and become familiar with the
+documentation for the processor being used as well as the
+documentation for the family as a whole.
+
+@subheading Architecture Documents
+
+For information on the XXX architecture,
+refer to the following documents available from VENDOR
+(@file{http//www.XXX.com/}):
+
+@itemize @bullet
+@item @cite{XXX Family Reference, VENDOR, PART NUMBER}.
+@end itemize
+
+@subheading MODEL SPECIFIC DOCUMENTS
+
+For information on specific processor models and
+their associated coprocessors, refer to the following documents:
+
+@itemize @bullet
+@item @cite{XXX MODEL Manual, VENDOR, PART NUMBER}.
+@item @cite{XXX MODEL Manual, VENDOR, PART NUMBER}.
+@end itemize
+
diff --git a/doc/supplements/template/template.texi b/doc/supplements/template/template.texi
new file mode 100644
index 0000000000..a2b655fd63
--- /dev/null
+++ b/doc/supplements/template/template.texi
@@ -0,0 +1,115 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename template.info
+@setcontentsaftertitlepage
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the Template Applications Supplement
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS Target Supplements
+@direntry
+* RTEMS Template Applications Supplement: (template).
+@end direntry
+@end ifset
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage RTEMS Template Applications Supplement
+
+@setchapternewpage odd
+@settitle RTEMS Template Applications Supplement
+@titlepage
+@finalout
+
+@title RTEMS Template Applications Supplement
+@subtitle Edition @value{EDITION}, for RTEMS @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include preface.texi
+@include cpumodel.texi
+@include callconv.texi
+@include memmodel.texi
+@include intr.texi
+@include fatalerr.texi
+@include bsp.texi
+@include cputable.texi
+@include wksheets.texi
+@include timing.texi
+@include timeBSP.texi
+@ifinfo
+@node Top, Preface, (dir), (dir)
+@top template
+
+This is the online version of the RTEMS Template
+Applications Supplement.
+
+@menu
+* Preface::
+* CPU Model Dependent Features::
+* Calling Conventions::
+* Memory Model::
+* Interrupt Processing::
+* Default Fatal Error Processing::
+* Board Support Packages::
+* Processor Dependent Information Table::
+* Memory Requirements::
+* Timing Specification::
+* MYBSP Timing Data::
+* Command and Variable Index::
+* Concept Index::
+@end menu
+
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@node Command and Variable Index, Concept Index, MYBSP Timing Data Rate Monotonic Manager, Top
+@unnumbered Command and Variable Index
+
+There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@node Concept Index, , Command and Variable Index, Top
+@unnumbered Concept Index
+
+There are currently no Concept Index entries.
+@c @printindex cp
+
+@contents
+@bye
+
diff --git a/doc/supplements/template/timeBSP.t b/doc/supplements/template/timeBSP.t
new file mode 100644
index 0000000000..85e5ea44aa
--- /dev/null
+++ b/doc/supplements/template/timeBSP.t
@@ -0,0 +1,112 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@include common/timemac.texi
+@tex
+\global\advance \smallskipamount by -4pt
+@end tex
+
+@chapter MYBSP Timing Data
+
+@section Introduction
+
+The timing data for the XXX version of RTEMS is
+provided along with the target dependent aspects concerning the
+gathering of the timing data. The hardware platform used to
+gather the times is described to give the reader a better
+understanding of each directive time provided. Also, provided
+is a description of the interrupt latency and the context switch
+times as they pertain to the XXX version of RTEMS.
+
+@section Hardware Platform
+
+All times reported except for the maximum period
+interrupts are disabled by RTEMS were measured using a Motorola
+MYBSP CPU board. The MYBSP is a RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+Mhz board with one wait
+state dynamic memory and a XXX numeric coprocessor. The
+Zilog 8036 countdown timer on this board was used to measure
+elapsed time with a one-half microsecond resolution. All
+sources of hardware interrupts were disabled, although the
+interrupt level of the processor allows all interrupts.
+
+The maximum period interrupts are disabled was
+measured by summing the number of CPU cycles required by each
+assembly language instruction executed while interrupts were
+disabled. The worst case times of the XXX microprocessor
+were used for each instruction. Zero wait state memory was
+assumed. The total CPU cycles executed with interrupts
+disabled, including the instructions to disable and enable
+interrupts, was divided by 20 to simulate a RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+Mhz processor. It
+should be noted that the worst case instruction times for the
+processor assume that the internal cache is disabled and that no
+instructions overlap.
+
+@section Interrupt Latency
+
+The maximum period with interrupts disabled within
+RTEMS is less than RTEMS_MAXIMUM_DISABLE_PERIOD
+microseconds including the instructions
+which disable and re-enable interrupts. The time required for
+the processor to vector an interrupt and for the RTEMS entry
+overhead before invoking the user's interrupt handler are a
+total of RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK
+microseconds. These combine to yield a worst case
+interrupt latency of less than
+RTEMS_MAXIMUM_DISABLE_PERIOD + RTEMS_INTR_ENTRY_RETURNS_TO_PREEMPTING_TASK
+microseconds at RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+Mhz. [NOTE: The maximum period with interrupts
+disabled was last determined for Release
+RTEMS_RELEASE_FOR_MAXIMUM_DISABLE_PERIOD.]
+
+It should be noted again that the maximum period with
+interrupts disabled within RTEMS is hand-timed and based upon
+worst case (i.e. CPU cache disabled and no instruction overlap)
+times for a RTEMS_MAXIMUM_DISABLE_PERIOD_MHZ
+Mhz processor. The interrupt vector and entry
+overhead time was generated on an MYBSP benchmark platform
+using the Multiprocessing Communications registers to generate
+as the interrupt source.
+
+@section Context Switch
+
+The RTEMS processor context switch time is RTEMS_NO_FP_CONTEXTS
+microseconds on the MYBSP benchmark platform when no floating
+point context is saved or restored. Additional execution time
+is required when a TASK_SWITCH user extension is configured.
+The use of the TASK_SWITCH extension is application dependent.
+Thus, its execution time is not considered part of the raw
+context switch time.
+
+Since RTEMS was designed specifically for embedded
+missile applications which are floating point intensive, the
+executive is optimized to avoid unnecessarily saving and
+restoring the state of the numeric coprocessor. The state of
+the numeric coprocessor is only saved when an FLOATING_POINT
+task is dispatched and that task was not the last task to
+utilize the coprocessor. In a system with only one
+FLOATING_POINT task, the state of the numeric coprocessor will
+never be saved or restored. When the first FLOATING_POINT task
+is dispatched, RTEMS does not need to save the current state of
+the numeric coprocessor.
+
+The exact amount of time required to save and restore
+floating point context is dependent on whether an XXX or
+XXX is being used as well as the state of the numeric
+coprocessor. These numeric coprocessors define three operating
+states: initialized, idle, and busy. RTEMS places the
+coprocessor in the initialized state when a task is started or
+restarted. Once the task has utilized the coprocessor, it is in
+the idle state when floating point instructions are not
+executing and the busy state when floating point instructions
+are executing. The state of the coprocessor is task specific.
+
+The following table summarizes the context switch
+times for the MYBSP benchmark platform:
+
diff --git a/doc/tools/.cvsignore b/doc/tools/.cvsignore
new file mode 100644
index 0000000000..bfdfd995be
--- /dev/null
+++ b/doc/tools/.cvsignore
@@ -0,0 +1,14 @@
+aclocal.m4
+autom4te*.cache
+config.cache
+config.guess
+config.log
+config.status
+config.sub
+configure
+depcomp
+install-sh
+Makefile
+Makefile.in
+missing
+mkinstalldirs
diff --git a/doc/tools/ChangeLog b/doc/tools/ChangeLog
new file mode 100644
index 0000000000..91ba35e310
--- /dev/null
+++ b/doc/tools/ChangeLog
@@ -0,0 +1,90 @@
+2003-12-12 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * configure.ac: Require automake >= 1.8, autoconf >= 2.59.
+
+2003-09-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * configure.ac: Merger from rtems-4-6-branch.
+
+2003-08-11 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * configure.ac: Use rtems-bugs@rtems.com as bug report email address.
+
+2003-02-14 Joel Sherrill <joel@OARcorp.com>
+
+ * Makefile.am, configure.ac: Removed references to deleted directories.
+ * src2html/.cvsignore, src2html/ChangeLog, src2html/Makefile.am,
+ src2html1.4a/.cvsignore, src2html1.4a/ChangeLog,
+ src2html1.4a/Makefile.am, src2html1.4a/Readme, src2html1.4a/ctags-wr,
+ src2html1.4a/src2html, src2html1.4a/src2html.1,
+ src2html1.4a/src2html.cgi, src2html1.4a/Ctags/.cvsignore,
+ src2html1.4a/Ctags/C.c, src2html1.4a/Ctags/Makefile.am,
+ src2html1.4a/Ctags/ctags.1, src2html1.4a/Ctags/ctags.c,
+ src2html1.4a/Ctags/ctags.h, src2html1.4a/Ctags/fortran.c,
+ src2html1.4a/Ctags/lisp.c, src2html1.4a/Ctags/print.c,
+ src2html1.4a/Ctags/strerror.c, src2html1.4a/Ctags/tree.c,
+ src2html1.4a/Ctags/yacc.c, src2html1.4a/Ctags/z.c,
+ src2html1.4a/FreeBSD/.cvsignore, src2html1.4a/FreeBSD/FreeBSD.hdr,
+ src2html1.4a/FreeBSD/FreeBSD.s2h, src2html1.4a/FreeBSD/Makefile.am,
+ src2html1.4a/FreeBSD/conf.hdr, src2html1.4a/FreeBSD/ddb.hdr,
+ src2html1.4a/FreeBSD/i386.i386.hdr,
+ src2html1.4a/FreeBSD/i386.include.hdr,
+ src2html1.4a/FreeBSD/i386.isa.hdr,
+ src2html1.4a/FreeBSD/i386.stand.hdr, src2html1.4a/FreeBSD/kern.hdr,
+ src2html1.4a/FreeBSD/net.hdr, src2html1.4a/FreeBSD/netinet.hdr,
+ src2html1.4a/FreeBSD/nfs.hdr, src2html1.4a/FreeBSD/stand.hdr,
+ src2html1.4a/FreeBSD/sys.hdr, src2html1.4a/FreeBSD/ufs.hdr,
+ src2html1.4a/FreeBSD/vm.hdr, src2html1.4a/ctags-emacs/.cvsignore,
+ src2html1.4a/ctags-emacs/Makefile.am,
+ src2html1.4a/ctags-emacs/README, src2html1.4a/ctags-emacs/ctags,
+ src2html1.4a/ctags-emacs/etags.c-ada-patch: Removed.
+
+2003-02-11 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * src2html: Remove.
+ * src2html1.4a: Remove.
+ * configure.ac: Reflect changes above.
+ * Makefile.am: Reflect changes above.
+
+2003-02-11 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * configure.ac: AM_INIT_AUTOMAKE([1.7.2]).
+
+2003-02-11 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * configure.ac: AC_PREREQ(2.57).
+
+2002-10-21 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * .cvsignore: Reformat.
+ Add autom4te*cache.
+ Remove autom4te.cache.
+
+2002-10-09 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * .cvsignore: Add autom4te.cache.
+
+2002-03-27 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * configure.ac:
+ AC_INIT(package,_RTEMS_VERSION,_RTEMS_BUGS).
+ AM_INIT_AUTOMAKE([no-define foreign 1.6]).
+ * Makefile.am: Remove AUTOMAKE_OPTIONS.
+
+2002-01-21 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * configure.ac: Autoupdate to 2.52.
+ Remove pdl2texi.
+ * Makefile.am: Remove pdl2texi.
+
+2002-01-18 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Require automake-1.5.
+
+2000-09-22 Joel Sherrill <joel@OARcorp.com>
+
+ * Makefile.am: Removed definition of ACLOCAL_AMFLAGS.
+
+2000-08-10 Joel Sherrill <joel@OARcorp.com>
+
+ * ChangeLog: New file.
diff --git a/doc/tools/Makefile.am b/doc/tools/Makefile.am
new file mode 100644
index 0000000000..88d9e30265
--- /dev/null
+++ b/doc/tools/Makefile.am
@@ -0,0 +1,6 @@
+## $Id$
+ACLOCAL_AMFLAGS = -I ../../aclocal
+
+EXTRA_DIST = word-replace2
+
+SUBDIRS = bmenu texi2www
diff --git a/doc/tools/bmenu/.cvsignore b/doc/tools/bmenu/.cvsignore
new file mode 100644
index 0000000000..27f2171dc1
--- /dev/null
+++ b/doc/tools/bmenu/.cvsignore
@@ -0,0 +1,5 @@
+.deps
+Makefile
+Makefile.in
+bmenu
+bmenu2
diff --git a/doc/tools/bmenu/ChangeLog b/doc/tools/bmenu/ChangeLog
new file mode 100644
index 0000000000..9ef8bbc269
--- /dev/null
+++ b/doc/tools/bmenu/ChangeLog
@@ -0,0 +1,20 @@
+2003-12-12 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-11-23 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * system.h: Remove USE_INLINES.
+ * chain.c: Remove USE_INLINES.
+
+2002-03-27 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Remove AUTOMAKE_OPTIONS.
+
+2002-01-18 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Require automake-1.5.
+
+2000-08-10 Joel Sherrill <joel@OARcorp.com>
+
+ * ChangeLog: New file.
diff --git a/doc/tools/bmenu/Makefile.am b/doc/tools/bmenu/Makefile.am
new file mode 100644
index 0000000000..3f53ef1e57
--- /dev/null
+++ b/doc/tools/bmenu/Makefile.am
@@ -0,0 +1,12 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+noinst_PROGRAMS = bmenu2
+
+bmenu2_SOURCES = address.h chain.c isr.h address.inl chain.h bmenu2.c base.h \
+ chain.inl system.h
diff --git a/doc/tools/bmenu/address.h b/doc/tools/bmenu/address.h
new file mode 100644
index 0000000000..1b26544f87
--- /dev/null
+++ b/doc/tools/bmenu/address.h
@@ -0,0 +1,110 @@
+/* address.h
+ *
+ * This include file contains the information required to manipulate
+ * physical addresses.
+ *
+ * COPYRIGHT (c) 1988-2002.
+ * On-Line Applications Research Corporation (OAR).
+ * All rights reserved.
+ *
+ * $Id$
+ */
+
+#ifndef __ADDRESSES_h
+#define __ADDRESSES_h
+
+/*
+ * _Addresses_Add_offset
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to add an offset to a base address.
+ * It returns the resulting address. This address is typically
+ * converted to an access type before being used further.
+ */
+
+STATIC INLINE void *_Addresses_Add_offset (
+ void *base,
+ unsigned32 offset
+);
+
+/*
+ * _Addresses_Subtract_offset
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to subtract an offset from a base
+ * address. It returns the resulting address. This address is
+ * typically converted to an access type before being used further.
+ */
+
+STATIC INLINE void *_Addresses_Subtract_offset(
+ void *base,
+ unsigned32 offset
+);
+
+/*
+ * _Addresses_Add
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to add two addresses. It returns the
+ * resulting address. This address is typically converted to an
+ * access type before being used further.
+ */
+
+STATIC INLINE void *_Addresses_Add (
+ void *left,
+ void *right
+);
+
+/*
+ * _Addresses_Subtract
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to subtract two addresses. It returns the
+ * resulting offset.
+ */
+
+STATIC INLINE unsigned32 _Addresses_Subtract (
+ void *left,
+ void *right
+);
+
+/*
+ * _Addresses_Is_aligned
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the given address is correctly
+ * aligned for this processor and FALSE otherwise. Proper alignment
+ * is based on correctness and efficiency.
+ */
+
+STATIC INLINE boolean _Addresses_Is_aligned (
+ void *address
+);
+
+/*
+ * _Addresses_Is_in_range
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the given address is within the
+ * memory range specified and FALSE otherwise. base is the address
+ * of the first byte in the memory range and limit is the address
+ * of the last byte in the memory range. The base address is
+ * assumed to be lower than the limit address.
+ */
+
+STATIC INLINE boolean _Addresses_Is_in_range (
+ void *address,
+ void *base,
+ void *limit
+);
+
+#include "address.inl"
+
+#endif
+/* end of include file */
diff --git a/doc/tools/bmenu/address.inl b/doc/tools/bmenu/address.inl
new file mode 100644
index 0000000000..220e5fe2e0
--- /dev/null
+++ b/doc/tools/bmenu/address.inl
@@ -0,0 +1,105 @@
+/* inline/address.inl
+ *
+ * This include file contains the bodies of the routines
+ * about addresses which are inlined.
+ *
+ * COPYRIGHT (c) 1988-2002.
+ * On-Line Applications Research Corporation (OAR).
+ * All rights reserved.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_ADDRESSES_inl
+#define __INLINE_ADDRESSES_inl
+
+/*PAGE
+ *
+ * _Addresses_Add_offset
+ *
+ */
+
+STATIC INLINE void *_Addresses_Add_offset (
+ void *base,
+ unsigned32 offset
+)
+{
+ return (base + offset);
+}
+
+/*PAGE
+ *
+ * _Addresses_Subtract_offset
+ *
+ */
+
+STATIC INLINE void *_Addresses_Subtract_offset (
+ void *base,
+ unsigned32 offset
+)
+{
+ return (base - offset);
+}
+
+/*PAGE
+ *
+ * _Addresses_Add
+ *
+ * NOTE: The cast of an address to an unsigned32 makes this code
+ * dependent on an addresses being thirty two bits.
+ */
+
+STATIC INLINE void *_Addresses_Add (
+ void *left,
+ void *right
+)
+{
+ return (left + (unsigned32)right);
+}
+
+/*PAGE
+ *
+ * _Addresses_Subtract
+ *
+ * NOTE: The cast of an address to an unsigned32 makes this code
+ * dependent on an addresses being thirty two bits.
+ */
+
+STATIC INLINE unsigned32 _Addresses_Subtract (
+ void *left,
+ void *right
+)
+{
+ return (left - right);
+}
+
+/*PAGE
+ *
+ * _Addresses_Is_aligned
+ *
+ */
+
+STATIC INLINE boolean _Addresses_Is_aligned (
+ void *address
+)
+{
+ return ( ( (unsigned32)address % 4 ) == 0 );
+}
+
+/*PAGE
+ *
+ * _Addresses_Is_aligned
+ *
+ */
+
+STATIC INLINE boolean _Addresses_Is_in_range (
+ void *address,
+ void *base,
+ void *limit
+)
+{
+ return ( address >= base && address <= limit );
+}
+
+#endif
+/* end of include file */
diff --git a/doc/tools/bmenu/base.h b/doc/tools/bmenu/base.h
new file mode 100644
index 0000000000..09e491628f
--- /dev/null
+++ b/doc/tools/bmenu/base.h
@@ -0,0 +1,113 @@
+/*
+ * COPYRIGHT (c) 1988-2002.
+ * On-Line Applications Research Corporation (OAR).
+ * All rights reserved.
+ *
+ * $Id$
+ */
+
+#ifndef __PDL2AMI_h
+#define __PDL2AMI_h
+
+#include "system.h"
+#include "chain.h"
+
+#ifndef EXTERN
+#define EXTERN extern
+#endif
+
+/*
+ * Paragraph size should be kept down because it is allocated for each
+ * Line_Control. If this number is large, the memory requirements for
+ * the program increase significantly.
+ */
+
+#define BUFFER_SIZE (2 * 1024)
+#define PARAGRAPH_SIZE (2 * 1024)
+
+#define NUMBER_ELEMENTS( _x ) (sizeof(_x) / sizeof _x[0])
+
+void exit_application(
+ int status
+);
+
+void ProcessFile(
+ char *inname,
+ char *outname
+);
+
+void strtolower(
+ char *dest,
+ char *src
+);
+
+void strtoInitialCaps(
+ char *dest,
+ char *src
+);
+
+void StripBlanks( void );
+
+void MergeParagraphs( void );
+
+int CheckForIncomplete( void );
+
+int CheckOutline( void );
+
+int CheckSections( void );
+
+void GenerateLists( void );
+
+void GenerateAList(
+ char *section,
+ Chain_Control *the_list
+);
+
+void LookForInternalInconsistencies( void );
+
+int Match_Argument(
+ char **array,
+ int entries,
+ char *users
+);
+
+void usage( void );
+
+void ReadFileIntoChain(
+ char *inname
+);
+
+int MergeText( void );
+
+int CheckForBadWhiteSpace();
+
+void RemoveCopyright();
+
+void RemovePagebreaks();
+
+int RemoveExtraBlankLines();
+
+void FormatToTexinfo( void );
+
+void PrintFile(
+ char *out
+);
+
+void DumpList(
+ Chain_Control *the_list
+);
+
+void ReleaseFile();
+
+EXTERN boolean Verbose; /* status/debug msgs */
+EXTERN boolean BlankAsWarnings;
+EXTERN Chain_Control Lines;
+
+EXTERN int NumberOfAttributes;
+EXTERN int NumberOfAssociations;
+EXTERN int NumberOfAbstractTypes;
+EXTERN int NumberOfDataItems;
+EXTERN int NumberOfMethods;
+EXTERN int NumberOfTasks;
+
+#endif
diff --git a/doc/tools/bmenu/bmenu2.c b/doc/tools/bmenu/bmenu2.c
new file mode 100644
index 0000000000..8004de59c2
--- /dev/null
+++ b/doc/tools/bmenu/bmenu2.c
@@ -0,0 +1,1045 @@
+/*
+ * main.c
+ *
+ * This program takes a texinfo file without node and menu commands,
+ * build those commands and inserts them.
+ *
+ * It works by reading the input file into a linked list of lines
+ * and then performing sweeps on that list until all formatting is
+ * complete. After the program is run, there is still a little
+ * clean up to be performed by hand. The following have to be fixed
+ * by hand:
+ * + previous of the first node
+ * + next of the last node
+ *
+ * COPYRIGHT (c) 1988-2002.
+ * On-Line Applications Research Corporation (OAR).
+ * All rights reserved.
+ *
+ * $Id$
+ */
+
+#include <assert.h>
+#include <ctype.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* XXX -- just for testing -- these should be set by options */
+char TopString[] = "Top";
+char EmptyString[] = "";
+
+char *DocsNextNode;
+char *DocsPreviousNode;
+char *DocsUpNode;
+int NodeNameIncludesChapter = 1;
+
+extern int optind; /* Why is this not in <stdlib.h>? */
+extern char *optarg; /* Why is this not in <stdlib.h>? */
+
+#ifndef NAME_MAX
+#define NAME_MAX 14 /* Why is the one in limits.h not showing up? */
+#endif
+#define INIT_DATA
+#define EXTERN
+
+#include "base.h"
+
+FILE *OutFile;
+
+static void ProcessFile2(
+ FILE *infile,
+ FILE *outfile );
+static void PrintFile2(
+ FILE *outfile );
+static void ReadFileIntoChain2(
+ FILE *InFile );
+
+/*************************************************************************
+ *************************************************************************
+ ***** DATA TYPES AND CONSTANT TABLES *****
+ *************************************************************************
+ *************************************************************************/
+/*
+ * Usage Information
+ */
+
+char *Usage_Strings[] = {
+ "\n",
+ "usage: cmd [-cv] [-p prev] [-n next] [-u up] \n",
+ "\n",
+ "EOF"
+};
+
+/*
+ * The page separator is not really a keyword and will be purged before
+ * it is seen elsewhere.
+ */
+
+#define PAGE_SEPARATOR "#PAGE"
+
+/*
+ * Section Delimiter Keywords
+ */
+
+#define MAXIMUM_KEYWORD_LENGTH 32
+
+/*
+ * Level indicates where in the format the delimiter is allowed to occur.
+ * 1 indicates a major section divider (e.g. "ATTRIBUTE DESCRIPTIONS:").
+ * 2 indicates a subsection (e.g. "ATTRIBUTE:").
+ * 3 indicates a heading (e.g. "DESCRIPTION:").
+ */
+
+#define TEXT 0
+#define SECTION 1
+#define SUBSECTION 2
+#define SUBSUBSECTION 3
+#define HEADING 4
+
+typedef enum {
+ UNUSED, /* dummy 0 slot */
+ KEYWORD_CHAPTER,
+ KEYWORD_APPENDIX,
+ KEYWORD_PREFACE,
+ KEYWORD_CHAPHEADING,
+ KEYWORD_SECTION,
+ KEYWORD_SUBSECTION,
+ KEYWORD_SUBSUBSECTION,
+ KEYWORD_RAISE,
+ KEYWORD_LOWER,
+ KEYWORD_OTHER,
+ KEYWORD_END
+
+} Keyword_indices_t;
+
+#define KEYWORD_FIRST KEYOWRD_CHAPTER
+#define KEYWORD_LAST KEYWORD_END
+
+/*
+ * Line Management Structure
+ */
+
+typedef enum {
+ NO_EXTRA_FORMATTING_INFO,
+ RAW_OUTPUT,
+ PARAGRAPH_OUTPUT
+} ExtraFormat_info_t;
+
+typedef struct {
+ Chain_Node Node;
+ Keyword_indices_t keyword; /* unused is unknown/undecided */
+ ExtraFormat_info_t format;
+ int number;
+ int level;
+ char Contents[ PARAGRAPH_SIZE ];
+} Line_Control;
+
+typedef enum {
+ RT_FORBIDDEN, /* no text to right allowed */
+ RT_OPTIONAL, /* text to right optional -- none below */
+ RT_NONE, /* text to right is "none" or nothing -- none below */
+ RT_REQUIRED, /* text to right required -- none below */
+ RT_BELOW, /* text to right forbidden -- text below required */
+ RT_NONE_OR_BELOW, /* text to right is "none" OR there is text below */
+ RT_EITHER, /* text to right OR below */
+ RT_BOTH /* text to right AND below */
+} Keywords_text_mode_t;
+
+typedef enum {
+ BL_FORBIDDEN, /* text below forbidden */
+ BL_FORMATTED, /* text below is to be formatted as paragraphs */
+ BL_RAW, /* text below is to be unprocessed by this program */
+} Keywords_text_below_t;
+
+typedef (*Keyword_validater_t)( Line_Control * );
+
+typedef struct {
+ char Name[ MAXIMUM_KEYWORD_LENGTH ];
+ int level;
+ Keywords_text_mode_t text_mode;
+ Keywords_text_below_t text_below_mode;
+ Keyword_validater_t keyword_validation_routine;
+} Keyword_info_t;
+
+Keyword_info_t Keywords[] = {
+ { "unused", 0, 0, 0, NULL }, /* so 0 can be invalid */
+ { "@chapter", SECTION, RT_FORBIDDEN, BL_FORBIDDEN, NULL },
+ { "@appendix", SECTION, RT_FORBIDDEN, BL_FORBIDDEN, NULL },
+ { "@preface", SECTION, RT_FORBIDDEN, BL_FORBIDDEN, NULL },
+ { "@chapheading", SECTION, RT_FORBIDDEN, BL_FORBIDDEN, NULL },
+ { "@section", SECTION, RT_FORBIDDEN, BL_FORBIDDEN, NULL },
+ { "@subsection", SUBSECTION, RT_FORBIDDEN, BL_FORBIDDEN, NULL },
+ { "@subsubsection", SUBSUBSECTION, RT_FORBIDDEN, BL_FORBIDDEN, NULL },
+ { "@raise", SUBSECTION, RT_FORBIDDEN, BL_FORBIDDEN, NULL },
+ { "@lower", SUBSECTION, RT_FORBIDDEN, BL_FORBIDDEN, NULL },
+ { "", HEADING, RT_FORBIDDEN, BL_FORBIDDEN, NULL },
+ { "END OF FILE", SECTION, RT_FORBIDDEN, BL_FORBIDDEN, NULL }
+};
+
+#define NUMBER_OF_KEYWORDS \
+ ( sizeof( Keywords ) / sizeof( Keyword_info_t ) ) - 2
+
+/*
+ * exit_application
+ */
+
+void exit_application(
+ int status
+)
+{
+ fprintf( stderr, "*** Error encountered ***\n" );
+/*
+ fprintf( stderr, "*** Error encountered on line %d ***\n", CurrentLine );
+*/
+ fclose( OutFile );
+ exit( status );
+}
+
+/*************************************************************************
+ *************************************************************************
+ ***** LINE MANIPULATION ROUTINES *****
+ *************************************************************************
+ *************************************************************************/
+
+/*
+ * PrintLine
+ */
+
+void PrintLine(
+ Line_Control *line
+)
+{
+ assert( line );
+
+ if ( line->number == -1 )
+ fprintf( stderr, " " );
+ else
+ fprintf( stderr, "%5d", line->number );
+
+#if 0
+ fprintf( stderr, "%s\n", line->Contents );
+#else
+ /*
+ * Include some debugging information
+ */
+ fprintf(
+ stderr,
+ "<%d,%d,%d>:%s\n",
+ line->keyword,
+ line->format,
+ line->level,
+ line->Contents
+ );
+#endif
+}
+
+Chain_Control Line_Pool;
+
+/*
+ * FillLinePool
+ */
+
+void FillLinePool( void )
+{
+ void *pool;
+
+#define LINE_POOL_FILL_COUNT 100
+
+ pool = malloc( sizeof( Line_Control ) * LINE_POOL_FILL_COUNT );
+ assert( pool );
+
+ _Chain_Initialize(
+ &Line_Pool,
+ pool,
+ LINE_POOL_FILL_COUNT,
+ sizeof( Line_Control )
+ );
+}
+
+/*
+ * AllocateLine
+ */
+
+Line_Control *AllocateLine( void )
+{
+ Line_Control *new_line;
+
+ new_line = (Line_Control *) _Chain_Get( &Line_Pool );
+ if ( !new_line ) {
+ FillLinePool();
+ new_line = (Line_Control *) _Chain_Get( &Line_Pool );
+ assert( new_line );
+ }
+
+/*
+ * This is commented out because although it is helpful during debug,
+ * it consumes a significant percentage of the program's execution time.
+
+ memset( new_line->Contents, '\0', sizeof( new_line->Contents ) );
+*/
+ new_line->number = -1;
+ new_line->level = -1;
+
+ new_line->keyword = UNUSED;
+ new_line->format = NO_EXTRA_FORMATTING_INFO;
+
+ new_line->Node.next = NULL;
+ new_line->Node.previous = NULL;
+
+ return new_line;
+}
+
+/*
+ * FreeLine
+ */
+
+void FreeLine(
+ Line_Control *line
+)
+{
+ fflush( stdout );
+ _Chain_Append( &Line_Pool, &line->Node );
+}
+
+/*
+ * DeleteLine
+ */
+
+Line_Control *DeleteLine(
+ Line_Control *line
+)
+{
+ Line_Control *next;
+
+ next = (Line_Control *)line->Node.next;
+ _Chain_Extract( &line->Node );
+ FreeLine( line );
+ return next;
+}
+
+/*
+ * PrintSurroundingLines
+ */
+
+void PrintSurroundingLines(
+ Line_Control *line,
+ int backward,
+ int forward
+)
+{
+ int i;
+ int real_backward;
+ Line_Control *local;
+
+ for ( local=line, real_backward=0, i=1 ;
+ i<=backward ;
+ i++, real_backward++ ) {
+ if ( &local->Node == Lines.first )
+ break;
+ local = (Line_Control *) local->Node.previous;
+ }
+
+ for ( i=1 ; i<=real_backward ; i++ ) {
+ PrintLine( local );
+ local = (Line_Control *) local->Node.next;
+ }
+
+ PrintLine( local );
+
+ for ( i=1 ; i<=forward ; i++ ) {
+ local = (Line_Control *) local->Node.next;
+ if ( _Chain_Is_last( &local->Node ) )
+ break;
+ PrintLine( local );
+ }
+
+}
+
+/*
+ * SetLineFormat
+ */
+
+void SetLineFormat(
+ Line_Control *line,
+ ExtraFormat_info_t format
+)
+{
+ if ( line->format != NO_EXTRA_FORMATTING_INFO ) {
+ fprintf( stderr, "Line %d is already formatted\n", line->number );
+ PrintLine( line );
+ assert( FALSE );
+ }
+
+ line->format = format;
+}
+
+/*
+ * LineCopyFromRight
+ */
+
+void LineCopyFromRight(
+ Line_Control *line,
+ char *dest
+)
+{
+ char *p;
+
+ for ( p=line->Contents ; *p != ' ' ; p++ )
+ ;
+ p++; /* skip the ' ' */
+ for ( ; isspace( *p ) ; p++ )
+ ;
+
+ strcpy( dest, p );
+
+}
+
+/*
+ * LineCopySectionName
+ */
+
+void LineCopySectionName(
+ Line_Control *line,
+ char *dest
+)
+{
+ char *p;
+ char *d;
+
+ p = line->Contents;
+ d = dest;
+
+ if ( *p == '@' ) { /* skip texinfo command */
+ while ( !isspace( *p++ ) )
+ ;
+ }
+
+ for ( ; *p ; )
+ *d++ = *p++;
+
+ *d = '\0';
+}
+
+/*************************************************************************
+ *************************************************************************
+ ***** END OF LINE MANIPULATION ROUTINES *****
+ *************************************************************************
+ *************************************************************************/
+
+/*
+ * main
+ */
+
+int main(
+ int argc,
+ char **argv
+)
+{
+ int c;
+ int index;
+ boolean single_file_mode;
+
+ OutFile = stdout;
+ Verbose = FALSE;
+ DocsNextNode = EmptyString;
+ DocsPreviousNode = TopString;
+ DocsUpNode = TopString;
+
+ while ((c = getopt(argc, argv, "vcp:n:u:")) != EOF) {
+ switch (c) {
+ case 'v':
+ Verbose = TRUE;
+ break;
+ case 'c':
+ NodeNameIncludesChapter = 0;
+ break;
+ case 'p':
+ DocsPreviousNode = strdup(optarg);
+ break;
+ case 'n':
+ DocsNextNode = strdup(optarg);
+ break;
+ case 'u':
+ DocsUpNode = strdup(optarg);
+ break;
+
+ case '?':
+ usage();
+ return 0;
+ }
+ }
+
+ if ( optind != argc )
+ {
+ usage();
+ return 0 ;
+ }
+
+ if ( Verbose )
+ fprintf( stderr, "Arguments successfully parsed\n" );
+
+ FillLinePool();
+
+ ProcessFile2( stdin, stdout );
+
+ if ( Verbose )
+ fprintf( stderr, "Exitting\n" );
+
+ return 0;
+}
+
+/*
+ * ProcessFile
+ */
+
+void ProcessFile2(
+ FILE *infile,
+ FILE *outfile
+)
+{
+ int index;
+
+ /*
+ * Read the file into our internal data structure
+ */
+
+ if ( Verbose )
+ printf( "Processing (%s) -> (%s)\n", "stdin", "stdout" );
+
+ ReadFileIntoChain2( infile );
+
+ if ( Verbose )
+ fprintf( stderr, "-------->FILE READ IN\n" );
+
+ /*
+ * Remove any spaces before the keyword and mark each keyword line as
+ * such. Also remove extra white space at the end of lines.
+ */
+
+ StripBlanks();
+
+ if ( Verbose )
+ fprintf( stderr, "-------->BLANKS BEFORE KEYWORDS STRIPPED\n" );
+
+
+ FormatToTexinfo();
+
+ if ( Verbose )
+ fprintf( stderr, "-------->FILE FORMATTED TO TEXINFO\n" );
+
+ /*
+ * Print the file
+ */
+
+ PrintFile2( outfile );
+
+ if ( Verbose )
+ fprintf( stderr, "-------->FILE PRINTED\n" );
+
+ /*
+ * Clean Up
+ */
+
+ ReleaseFile();
+
+ if ( Verbose )
+ fprintf( stderr, "-------->FILE RELEASED\n" );
+}
+
+/*
+ * usage
+ */
+
+void usage( void )
+{
+ int index;
+
+ for ( index=0 ; strcmp( Usage_Strings[ index ], "EOF" ) ; index++ )
+ fprintf( stderr, Usage_Strings[ index ] );
+}
+
+/*
+ * ReadFileIntoChain
+ */
+
+void ReadFileIntoChain2(
+ FILE *InFile
+)
+{
+ int line_count;
+ int max_length;
+ char *line;
+ char Buffer[ BUFFER_SIZE ];
+ Line_Control *new_line;
+
+ if ( !InFile ) {
+ fprintf( stderr, "Unable to open (%s)\n", "stdin" );
+ exit( 1 );
+ }
+ assert( InFile );
+
+ max_length = 0;
+ line_count = 0;
+
+ _Chain_Initialize_empty( &Lines );
+
+ for ( ;; ) {
+ line = fgets( Buffer, BUFFER_SIZE, InFile );
+ if ( !line )
+ break;
+
+ Buffer[ strlen( Buffer ) - 1 ] = '\0';
+
+ new_line = AllocateLine();
+
+ strcpy( new_line->Contents, Buffer );
+
+ new_line->number = ++line_count;
+
+ _Chain_Append( &Lines, &new_line->Node );
+ }
+
+ fclose( InFile );
+}
+
+/*
+ * StripBlanks
+ */
+
+void StripBlanks( void )
+{
+ Line_Control *line;
+ Keyword_indices_t index;
+ int indentation;
+ int length;
+
+ for ( line = (Line_Control *) Lines.first ;
+ !_Chain_Is_last( &line->Node ) ;
+ line = (Line_Control *) line->Node.next
+ ) {
+
+ /*
+ * Strip white space from the end of each line
+ */
+
+ length = strlen( line->Contents );
+
+ while ( isspace( line->Contents[ --length ] ) )
+ line->Contents[ length ] = '\0';
+
+ if ( strstr( line->Contents, "@chapter" ) )
+ line->keyword = KEYWORD_CHAPTER;
+ else if ( strstr( line->Contents, "@appendix" ) )
+ line->keyword = KEYWORD_APPENDIX;
+ else if ( strstr( line->Contents, "@preface" ) )
+ line->keyword = KEYWORD_PREFACE;
+ else if ( strstr( line->Contents, "@chapheading" ) )
+ line->keyword = KEYWORD_CHAPHEADING;
+ else if ( strstr( line->Contents, "@section" ) )
+ line->keyword = KEYWORD_SECTION;
+ else if ( strstr( line->Contents, "@subsection" ) )
+ line->keyword = KEYWORD_SUBSECTION;
+ else if ( strstr( line->Contents, "@subsubsection" ) )
+ line->keyword = KEYWORD_SUBSUBSECTION;
+ else if ( strstr( line->Contents, "@raise" ) )
+ line->keyword = KEYWORD_RAISE;
+ else if ( strstr( line->Contents, "@lower" ) )
+ line->keyword = KEYWORD_LOWER;
+ else
+ line->keyword = KEYWORD_OTHER;
+
+ }
+ line = AllocateLine();
+ line->keyword = KEYWORD_END;
+ _Chain_Append( &Lines, &line->Node );
+}
+
+/*
+ * strIsAllSpace
+ */
+
+boolean strIsAllSpace(
+ char *s
+)
+{
+ char *p;
+
+ for ( p = s ; *p ; p++ )
+ if ( !isspace( *p ) )
+ return FALSE;
+
+ return TRUE;
+}
+
+/*
+ * BuildTexinfoNodes
+ */
+
+void BuildTexinfoNodes( void )
+{
+ char Buffer[ BUFFER_SIZE ];
+ Line_Control *line;
+ Line_Control *next_node;
+ Line_Control *up_node;
+ Line_Control *new_line;
+ Line_Control *menu_insert_point;
+ Line_Control *node_line;
+ int next_found;
+ int menu_items;
+ Keyword_indices_t index;
+ char ChapterName[ BUFFER_SIZE ];
+ char NodeName[ BUFFER_SIZE ];
+ char UpNodeName[ BUFFER_SIZE ];
+ char NextNodeName[ BUFFER_SIZE ];
+ char PreviousNodeName[ BUFFER_SIZE ];
+
+ /*
+ * Set Initial Previous Node Name
+ */
+
+ strcpy( PreviousNodeName, DocsPreviousNode );
+
+ for ( line = (Line_Control *) Lines.first ;
+ !_Chain_Is_last( &line->Node ) ;
+ line = (Line_Control *) line->Node.next
+ ) {
+
+ if ( line->level == -1 )
+ continue;
+
+ LineCopyFromRight( line, NodeName );
+
+ if ( line->keyword == KEYWORD_CHAPTER ||
+ line->keyword == KEYWORD_APPENDIX ||
+ line->keyword == KEYWORD_PREFACE ||
+ line->keyword == KEYWORD_CHAPHEADING ) {
+
+ strcpy( ChapterName, NodeName );
+
+ } else if ( NodeNameIncludesChapter ) {
+
+ sprintf( Buffer, "%s %s", ChapterName, NodeName );
+ strcpy( NodeName, Buffer );
+ }
+
+ /*
+ * Set Default Next Node Name
+ */
+
+ next_found = FALSE;
+ strcpy( NextNodeName, DocsNextNode );
+
+ /*
+ * Go ahead and put it on the chain in the right order (ahead of
+ * the menu) and we can fill it in later (after the menu is built).
+ */
+
+ new_line = AllocateLine();
+ strcpy( new_line->Contents, "" ); /*"@ifinfo" ); */
+ _Chain_Insert( line->Node.previous, &new_line->Node );
+
+ node_line = AllocateLine();
+ _Chain_Insert( line->Node.previous, &node_line->Node );
+
+ new_line = AllocateLine();
+ strcpy( new_line->Contents, "" ); /* "@end ifinfo" ); */
+ _Chain_Insert( line->Node.previous, &new_line->Node );
+
+ next_node = (Line_Control *) line->Node.next;
+ menu_insert_point = next_node;
+ menu_items = 0;
+
+ for ( ; ; ) {
+ if ( next_node->keyword == KEYWORD_END )
+ break;
+
+ if ( next_node->level == -1 )
+ goto continue_menu_loop;
+
+ LineCopySectionName( next_node, Buffer );
+ if ( !next_found ) {
+ next_found = TRUE;
+ if (NodeNameIncludesChapter)
+ sprintf( NextNodeName, "%s %s", ChapterName, Buffer );
+ else
+ sprintf( NextNodeName, "%s", Buffer );
+ }
+
+ if ( next_node->level <= line->level )
+ break;
+
+ if ( next_node->level != (line->level + 1) )
+ goto continue_menu_loop;
+
+ if ( menu_items == 0 ) {
+ new_line = AllocateLine();
+ strcpy( new_line->Contents, "@ifinfo" );
+ _Chain_Insert( menu_insert_point->Node.previous, &new_line->Node );
+
+ new_line = AllocateLine();
+ strcpy( new_line->Contents, "@menu" );
+ _Chain_Insert( menu_insert_point->Node.previous, &new_line->Node );
+ }
+
+ menu_items++;
+
+ new_line = AllocateLine();
+ if (NodeNameIncludesChapter)
+ sprintf( new_line->Contents, "* %s %s::", ChapterName, Buffer );
+ else
+ sprintf( new_line->Contents, "* %s::", Buffer );
+ _Chain_Insert( menu_insert_point->Node.previous, &new_line->Node );
+
+continue_menu_loop:
+ next_node = (Line_Control *) next_node->Node.next;
+ }
+
+ /*
+ * If menu items were generated, then insert the end of menu stuff.
+ */
+
+ if ( menu_items ) {
+ new_line = AllocateLine();
+ strcpy( new_line->Contents, "@end menu" );
+ _Chain_Insert( menu_insert_point->Node.previous, &new_line->Node );
+
+ new_line = AllocateLine();
+ strcpy( new_line->Contents, "@end ifinfo" );
+ _Chain_Insert( menu_insert_point->Node.previous, &new_line->Node );
+ }
+
+ /*
+ * Find the UpNodeName
+ */
+
+/* DumpList( &Lines ); */
+
+ if ( line->level == 0 ) {
+ strcpy( UpNodeName, DocsUpNode );
+ } else {
+ for ( up_node = line;
+ up_node && !_Chain_Is_first((Chain_Node *)up_node) ;
+ up_node = (Line_Control *) up_node->Node.previous
+ ) {
+
+ if ( (up_node->level == -1) )
+ continue;
+
+ if ( up_node->level == (line->level - 1) ) {
+ LineCopySectionName( up_node, Buffer );
+ if (NodeNameIncludesChapter) {
+ if (!strcmp(ChapterName, Buffer))
+ sprintf( UpNodeName, "%s", Buffer );
+ else
+ sprintf( UpNodeName, "%s %s", ChapterName, Buffer );
+ } else
+ sprintf( UpNodeName, "%s", Buffer );
+ break;
+ }
+ }
+ }
+
+ /*
+ * Update the node information
+ */
+
+#if 0
+ fprintf(
+ stderr,
+ "@node %s, %s, %s, %s\n",
+ NodeName,
+ NextNodeName,
+ PreviousNodeName,
+ UpNodeName
+ );
+#endif
+
+ /* node_line was previously inserted */
+ if (!NodeNameIncludesChapter) {
+ sprintf(
+ node_line->Contents,
+ "@node %s, %s, %s, %s",
+ NodeName,
+ NextNodeName,
+ PreviousNodeName,
+ UpNodeName
+ );
+ } else {
+ sprintf(
+ node_line->Contents,
+ "@node %s, %s, %s, %s",
+ NodeName,
+ NextNodeName,
+ PreviousNodeName,
+ UpNodeName
+ );
+ }
+
+ strcpy( PreviousNodeName, NodeName );
+
+ /* PrintLine( line ); */
+ }
+}
+
+/*
+ * FormatToTexinfo
+ */
+
+void FormatToTexinfo( void )
+{
+ Line_Control *line;
+ int baselevel = 0;
+ int currentlevel;
+
+ if ( Verbose )
+ fprintf( stderr, "-------->INSERTING TEXINFO MENUS\n" );
+
+ for ( line = (Line_Control *) Lines.first ;
+ !_Chain_Is_last( &line->Node ) ;
+ line = (Line_Control *) line->Node.next ) {
+
+ switch (line->keyword) {
+ case UNUSED:
+ case KEYWORD_OTHER:
+ case KEYWORD_END:
+ line->level = -1;
+ break;
+ case KEYWORD_CHAPTER:
+ case KEYWORD_APPENDIX:
+ case KEYWORD_PREFACE:
+ case KEYWORD_CHAPHEADING:
+ currentlevel = 0;
+ line->level = baselevel + currentlevel;
+ break;
+ case KEYWORD_SECTION:
+ currentlevel = 1;
+ line->level = baselevel + currentlevel;
+ break;
+ case KEYWORD_SUBSECTION:
+ currentlevel = 2;
+ line->level = baselevel + currentlevel;
+ break;
+ case KEYWORD_SUBSUBSECTION:
+ currentlevel = 3;
+ line->level = baselevel + currentlevel;
+ break;
+ case KEYWORD_RAISE:
+ assert( baselevel );
+ baselevel--;
+ line->level = -1;
+ break;
+ case KEYWORD_LOWER:
+ baselevel++;
+ line->level = -1;
+ break;
+ }
+ }
+
+ BuildTexinfoNodes();
+}
+
+/*
+ * PrintFile
+ */
+
+void PrintFile2(
+ FILE *OutFile
+)
+{
+ Line_Control *line;
+
+ if ( !OutFile ) {
+ fprintf( stderr, "Unable to open (%s) for output\n", "stdout" );
+ exit_application( 1 );
+ }
+ assert( OutFile );
+
+ for ( line = (Line_Control *) Lines.first ;
+ !_Chain_Is_last( &line->Node ) ;
+ line = (Line_Control *) line->Node.next ) {
+ fprintf( OutFile, "%s\n", line->Contents );
+/*
+ fprintf(
+ OutFile,
+ "(%d,%d)%s\n",
+ line->keyword,
+ line->format,
+ line->Contents
+ );
+*/
+ }
+}
+
+/*
+ * DumpList
+ */
+
+void DumpList(
+ Chain_Control *the_list
+)
+{
+ Line_Control *line;
+
+ fprintf( stderr, "---> Dumping list (%p)\n", the_list );
+
+ for ( line = (Line_Control *) the_list->first ;
+ !_Chain_Is_last( &line->Node ) ;
+ line = (Line_Control *) line->Node.next ) {
+ /* if (line->level != -1) */
+ PrintLine( line );
+ /* fprintf( stderr, "%s\n", line->Contents ); */
+ }
+}
+
+/*
+ * ReleaseFile
+ */
+
+void ReleaseFile()
+{
+ Line_Control *line;
+ Line_Control *next;
+
+ for ( line = (Line_Control *) Lines.first ;
+ !_Chain_Is_last( &line->Node ) ;
+ ) {
+ next = (Line_Control *) line->Node.next;
+ line = next;
+ }
+}
+
+/*
+ * strtoInitialCaps
+ */
+
+void strtoInitialCaps(
+ char *dest,
+ char *src
+)
+{
+ char *source = src;
+ char *destination = dest;
+
+ source = src;
+ destination = (dest) ? dest : src;
+
+ while ( *source ) {
+ while ( isspace( *source ) )
+ *destination++ = *source++;
+
+ if ( !*source )
+ break;
+
+ *destination++ = toupper( *source++ );
+
+ for ( ; *source && !isspace( *source ) ; source++ )
+ *destination++ = tolower( *source );
+
+ if ( !*source )
+ break;
+ }
+
+ *destination = '\0';
+}
diff --git a/doc/tools/bmenu/chain.c b/doc/tools/bmenu/chain.c
new file mode 100644
index 0000000000..7047b42d56
--- /dev/null
+++ b/doc/tools/bmenu/chain.c
@@ -0,0 +1,207 @@
+/*
+ * Chain Handler
+ *
+ * COPYRIGHT (c) 1988-2002.
+ * On-Line Applications Research Corporation (OAR).
+ * All rights reserved.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include "address.h"
+#include "chain.h"
+#include "isr.h"
+
+/*PAGE
+ *
+ * _Chain_Initialize
+ *
+ * This kernel routine initializes a doubly linked chain.
+ *
+ * Input parameters:
+ * the_chain - pointer to chain header
+ * starting_address - starting address of first node
+ * number_nodes - number of nodes in chain
+ * node_size - size of node in bytes
+ *
+ * Output parameters: NONE
+ */
+
+void _Chain_Initialize(
+ Chain_Control *the_chain,
+ void *starting_address,
+ unsigned32 number_nodes,
+ unsigned32 node_size
+)
+{
+ unsigned32 count;
+ Chain_Node *current;
+ Chain_Node *next;
+
+ count = number_nodes;
+ current = _Chain_Head( the_chain );
+ the_chain->permanent_null = NULL;
+ next = (Chain_Node *)starting_address;
+ while ( count-- ) {
+ current->next = next;
+ next->previous = current;
+ current = next;
+ next = (Chain_Node *)
+ _Addresses_Add_offset( (void *) next, node_size );
+ }
+ current->next = _Chain_Tail( the_chain );
+ the_chain->last = current;
+}
+
+/*PAGE
+ *
+ * _Chain_Get
+ *
+ * This kernel routine returns a pointer to a node taken from the
+ * given chain.
+ *
+ * Input parameters:
+ * the_chain - pointer to chain header
+ *
+ * Output parameters:
+ * return_node - pointer to node in chain allocated
+ * CHAIN_END - if no nodes available
+ *
+ * INTERRUPT LATENCY:
+ * only case
+ */
+
+Chain_Node *_Chain_Get(
+ Chain_Control *the_chain
+)
+{
+ ISR_Level level;
+ Chain_Node *return_node;
+
+ return_node = NULL;
+ _ISR_Disable( level );
+ if ( !_Chain_Is_empty( the_chain ) )
+ return_node = _Chain_Get_first_unprotected( the_chain );
+ _ISR_Enable( level );
+ return return_node;
+}
+
+/*PAGE
+ *
+ * _Chain_Append
+ *
+ * This kernel routine puts a node on the end of the specified chain.
+ *
+ * Input parameters:
+ * the_chain - pointer to chain header
+ * node - address of node to put at rear of chain
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * only case
+ */
+
+void _Chain_Append(
+ Chain_Control *the_chain,
+ Chain_Node *node
+)
+{
+ ISR_Level level;
+
+ _ISR_Disable( level );
+ _Chain_Append_unprotected( the_chain, node );
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Chain_Extract
+ *
+ * This kernel routine deletes the given node from a chain.
+ *
+ * Input parameters:
+ * node - pointer to node in chain to be deleted
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * only case
+ */
+
+void _Chain_Extract(
+ Chain_Node *node
+)
+{
+ ISR_Level level;
+
+ _ISR_Disable( level );
+ _Chain_Extract_unprotected( node );
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Chain_Insert
+ *
+ * This kernel routine inserts a given node after a specified node
+ * a requested chain.
+ *
+ * Input parameters:
+ * after_node - pointer to node in chain to be inserted after
+ * node - pointer to node to be inserted
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * only case
+ */
+
+void _Chain_Insert(
+ Chain_Node *after_node,
+ Chain_Node *node
+)
+{
+ ISR_Level level;
+
+ _ISR_Disable( level );
+ _Chain_Insert_unprotected( after_node, node );
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Chain_Insert_chain
+ *
+ * This routine inserts a chain after the specified node in another
+ * chain. It is assumed that the insert after node is not on the
+ * second chain.
+ *
+ * Input parameters:
+ * insert_after - insert the chain after this node
+ * to_insert - the chain to insert
+ */
+
+void _Chain_Insert_chain(
+ Chain_Node *insert_after,
+ Chain_Control *to_insert
+)
+{
+ Chain_Node *first;
+ Chain_Node *last;
+ Chain_Node *insert_after_next;
+
+ first = to_insert->first;
+ last = to_insert->last;
+
+ insert_after_next = insert_after->next;
+
+ insert_after->next = first;
+ first->previous = insert_after;
+
+ insert_after_next->previous = last;
+ last->next = insert_after_next;
+
+ _Chain_Initialize_empty( to_insert );
+}
diff --git a/doc/tools/bmenu/chain.h b/doc/tools/bmenu/chain.h
new file mode 100644
index 0000000000..8f8574e239
--- /dev/null
+++ b/doc/tools/bmenu/chain.h
@@ -0,0 +1,347 @@
+/* chain.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Doubly Linked Chain Handler.
+ *
+ * COPYRIGHT (c) 1988-2002.
+ * On-Line Applications Research Corporation (OAR).
+ * All rights reserved.
+ *
+ * $Id$
+ */
+
+#ifndef __CHAIN_h
+#define __CHAIN_h
+
+#include "address.h"
+
+/*
+ * This is used to manage each element (node) which is placed
+ * on a chain.
+ *
+ * NOTE: Typically, a more complicated structure will use the
+ * chain package. The more complicated structure will
+ * include a chain node as the first element in its
+ * control structure. It will then call the chain package
+ * with a pointer to that node element. The node pointer
+ * and the higher level structure start at the same address
+ * so the user can cast the pointers back and forth.
+ */
+
+typedef struct Chain_Node_struct Chain_Node;
+
+struct Chain_Node_struct {
+ Chain_Node *next;
+ Chain_Node *previous;
+};
+
+/*
+ * This is used to manage a chain. A chain consists of a doubly
+ * linked list of zero or more nodes.
+ *
+ * NOTE: This implementation does not require special checks for
+ * manipulating the first and last elements on the chain.
+ * To accomplish this the chain control structure is
+ * treated as two overlapping chain nodes. The permanent
+ * head of the chain overlays a node structure on the
+ * first and permanent_null fields. The permanent tail
+ * of the chain overlays a node structure on the
+ * permanent_null and last elements of the structure.
+ */
+
+typedef struct {
+ Chain_Node *first;
+ Chain_Node *permanent_null;
+ Chain_Node *last;
+} Chain_Control;
+
+/*
+ * _Chain_Initialize
+ *
+ * This routine initializes the_chain structure to manage the
+ * contiguous array of number_nodes nodes which starts at
+ * starting_address. Each node is of node_size bytes.
+ */
+
+void _Chain_Initialize(
+ Chain_Control *the_chain,
+ void *starting_address,
+ unsigned32 number_nodes,
+ unsigned32 node_size
+);
+
+/*
+ * _Chain_Initialize_empty
+ *
+ * This routine initializes the specified chain to contain zero nodes.
+ */
+
+STATIC INLINE void _Chain_Initialize_empty(
+ Chain_Control *the_chain
+);
+
+/*
+ * _Chain_Extract_unprotected
+ *
+ * This routine extracts the_node from the chain on which it resides.
+ * It does NOT disable interrupts to insure the atomicity of the
+ * extract operation.
+ */
+
+STATIC INLINE void _Chain_Extract_unprotected(
+ Chain_Node *the_node
+);
+
+/*
+ * _Chain_Extract
+ *
+ * This routine extracts the_node from the chain on which it resides.
+ * It disables interrupts to insure the atomicity of the
+ * extract operation.
+ */
+
+void _Chain_Extract(
+ Chain_Node *the_node
+);
+
+/*
+ * _Chain_Get_unprotected
+ *
+ * This function removes the first node from the_chain and returns
+ * a pointer to that node. If the_chain is empty, then NULL is returned.
+ * It does NOT disable interrupts to insure the atomicity of the
+ * get operation.
+ */
+
+STATIC INLINE Chain_Node *_Chain_Get_unprotected(
+ Chain_Control *the_chain
+);
+
+/*
+ * _Chain_Get
+ *
+ * This function removes the first node from the_chain and returns
+ * a pointer to that node. If the_chain is empty, then NULL is returned.
+ * It disables interrupts to insure the atomicity of the
+ * get operation.
+ */
+
+Chain_Node *_Chain_Get(
+ Chain_Control *the_chain
+);
+
+/*
+ * _Chain_Get_first_unprotected
+ *
+ * This function removes the first node from the_chain and returns
+ * a pointer to that node. It does NOT disable interrupts to insure
+ * the atomicity of the get operation.
+ */
+
+STATIC INLINE Chain_Node *_Chain_Get_first_unprotected(
+ Chain_Control *the_chain
+);
+
+/*
+ * _Chain_Insert_unprotected
+ *
+ * This routine inserts the_node on a chain immediately following
+ * after_node. It does NOT disable interrupts to insure the atomicity
+ * of the extract operation.
+ */
+
+STATIC INLINE void _Chain_Insert_unprotected(
+ Chain_Node *after_node,
+ Chain_Node *the_node
+);
+
+/*
+ * _Chain_Insert
+ *
+ * This routine inserts the_node on a chain immediately following
+ * after_node. It disables interrupts to insure the atomicity
+ * of the extract operation.
+ */
+
+void _Chain_Insert(
+ Chain_Node *after_node,
+ Chain_Node *the_node
+);
+
+/*
+ * _Chain_Append_unprotected
+ *
+ * This routine appends the_node onto the end of the_chain.
+ * It does NOT disable interrupts to insure the atomicity of the
+ * append operation.
+ */
+
+STATIC INLINE void _Chain_Append_unprotected(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+);
+
+/*
+ * _Chain_Append
+ *
+ * This routine appends the_node onto the end of the_chain.
+ * It disables interrupts to insure the atomicity of the
+ * append operation.
+ */
+
+void _Chain_Append(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+);
+
+/*
+ * _Chain_Prepend_unprotected
+ *
+ * This routine prepends the_node onto the front of the_chain.
+ * It does NOT disable interrupts to insure the atomicity of the
+ * prepend operation.
+ */
+
+STATIC INLINE void _Chain_Prepend_unprotected(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+);
+
+/*
+ * _Chain_Prepend
+ *
+ * This routine prepends the_node onto the front of the_chain.
+ * It disables interrupts to insure the atomicity of the
+ * prepend operation.
+ */
+
+STATIC INLINE void _Chain_Prepend(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+);
+
+/*
+ * _Chain_Insert_chain
+ *
+ * This routine inserts a chain after the specified node in another
+ * chain. It is assumed that the insert after node is not on the
+ * second chain.
+ */
+
+void _Chain_Insert_chain(
+ Chain_Node *insert_after,
+ Chain_Control *to_insert
+);
+
+/*
+ * _Chain_Head
+ *
+ * This function returns a pointer to the first node on the chain.
+ */
+
+STATIC INLINE Chain_Node *_Chain_Head(
+ Chain_Control *the_chain
+);
+
+/*
+ * _Chain_Tail
+ *
+ * This function returns a pointer to the last node on the chain.
+ */
+
+STATIC INLINE Chain_Node *_Chain_Tail(
+ Chain_Control *the_chain
+);
+
+/*
+ * _Chain_Is_head
+ *
+ * This function returns TRUE if the_node is the head of the_chain and
+ * FALSE otherwise.
+ */
+
+STATIC INLINE boolean _Chain_Is_head(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+);
+
+/*
+ * _Chain_Is_tail
+ *
+ * This function returns TRUE if the_node is the tail of the_chain and
+ * FALSE otherwise.
+ */
+
+STATIC INLINE boolean _Chain_Is_tail(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+);
+
+/*
+ * _Chain_Is_first
+ *
+ * This function returns TRUE if the_node is the first node on a chain and
+ * FALSE otherwise.
+ */
+
+STATIC INLINE boolean _Chain_Is_first(
+ Chain_Node *the_node
+);
+
+/*
+ * _Chain_Is_last
+ *
+ * This function returns TRUE if the_node is the last node on a chain and
+ * FALSE otherwise.
+ */
+
+STATIC INLINE boolean _Chain_Is_last(
+ Chain_Node *the_node
+);
+
+/*
+ * _Chain_Is_empty
+ *
+ * This function returns TRUE if there a no nodes on the_chain and
+ * FALSE otherwise.
+ */
+
+STATIC INLINE boolean _Chain_Is_empty(
+ Chain_Control *the_chain
+);
+
+/*
+ * _Chain_Has_only_one_node
+ *
+ * This function returns TRUE if there is only one node on the_chain and
+ * FALSE otherwise.
+ */
+
+STATIC INLINE boolean _Chain_Has_only_one_node(
+ Chain_Control *the_chain
+);
+
+/*
+ * _Chain_Is_null
+ *
+ * This function returns TRUE if the_chain is NULL and FALSE otherwise.
+ */
+
+STATIC INLINE boolean _Chain_Is_null(
+ Chain_Control *the_chain
+);
+
+/*
+ * _Chain_Is_null_node
+ *
+ * This function returns TRUE if the_node is NULL and FALSE otherwise.
+ */
+
+STATIC INLINE boolean _Chain_Is_null_node(
+ Chain_Node *the_node
+);
+
+#include "chain.inl"
+
+#endif
+/* end of include file */
diff --git a/doc/tools/bmenu/chain.inl b/doc/tools/bmenu/chain.inl
new file mode 100644
index 0000000000..db9bc57fed
--- /dev/null
+++ b/doc/tools/bmenu/chain.inl
@@ -0,0 +1,271 @@
+/* inline/chain.inl
+ *
+ * This include file contains the bodies of the routines which are
+ * associated with doubly linked chains and inlined.
+ *
+ * COPYRIGHT (c) 1988-2002.
+ * On-Line Applications Research Corporation (OAR).
+ * All rights reserved.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_CHAIN_inl
+#define __INLINE_CHAIN_inl
+
+/*PAGE
+ *
+ * _Chain_Is_null
+ */
+
+STATIC INLINE boolean _Chain_Is_null(
+ Chain_Control *the_chain
+)
+{
+ return ( the_chain == NULL );
+}
+
+/*PAGE
+ *
+ * _Chain_Is_null_node
+ */
+
+STATIC INLINE boolean _Chain_Is_null_node(
+ Chain_Node *the_node
+)
+{
+ return ( the_node == NULL );
+}
+
+/*PAGE
+ *
+ * _Chain_Head
+ */
+
+STATIC INLINE Chain_Node *_Chain_Head(
+ Chain_Control *the_chain
+)
+{
+ return (Chain_Node *) the_chain;
+}
+
+/*PAGE
+ *
+ * _Chain_Tail
+ */
+
+STATIC INLINE Chain_Node *_Chain_Tail(
+ Chain_Control *the_chain
+)
+{
+ return (Chain_Node *) &the_chain->permanent_null;
+}
+
+/*PAGE
+ *
+ * _Chain_Is_empty
+ */
+
+STATIC INLINE boolean _Chain_Is_empty(
+ Chain_Control *the_chain
+)
+{
+ return ( the_chain->first == _Chain_Tail( the_chain ) );
+}
+
+/*PAGE
+ *
+ * _Chain_Is_first
+ */
+
+STATIC INLINE boolean _Chain_Is_first(
+ Chain_Node *the_node
+)
+{
+ return ( the_node->previous == NULL );
+}
+
+/*PAGE
+ *
+ * _Chain_Is_last
+ */
+
+STATIC INLINE boolean _Chain_Is_last(
+ Chain_Node *the_node
+)
+{
+ return ( the_node->next == NULL );
+}
+
+/*PAGE
+ *
+ * _Chain_Has_only_one_node
+ */
+
+STATIC INLINE boolean _Chain_Has_only_one_node(
+ Chain_Control *the_chain
+)
+{
+ return ( the_chain->first == the_chain->last );
+}
+
+/*PAGE
+ *
+ * _Chain_Is_head
+ */
+
+STATIC INLINE boolean _Chain_Is_head(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+)
+{
+ return ( the_node == _Chain_Head( the_chain ) );
+}
+
+/*PAGE
+ *
+ * _Chain_Is_tail
+ */
+
+STATIC INLINE boolean _Chain_Is_tail(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+)
+{
+ return ( the_node == _Chain_Tail( the_chain ) );
+}
+
+/*PAGE
+ *
+ * Chain_Initialize_empty
+ */
+
+STATIC INLINE void _Chain_Initialize_empty(
+ Chain_Control *the_chain
+)
+{
+ the_chain->first = _Chain_Tail( the_chain );
+ the_chain->permanent_null = NULL;
+ the_chain->last = _Chain_Head( the_chain );
+}
+
+/*PAGE
+ *
+ * _Chain_Extract_unprotected
+ */
+
+STATIC INLINE void _Chain_Extract_unprotected(
+ Chain_Node *the_node
+)
+{
+ Chain_Node *next;
+ Chain_Node *previous;
+
+ next = the_node->next;
+ previous = the_node->previous;
+ next->previous = previous;
+ previous->next = next;
+}
+
+/*PAGE
+ *
+ * _Chain_Get_first_unprotected
+ */
+
+STATIC INLINE Chain_Node *_Chain_Get_first_unprotected(
+ Chain_Control *the_chain
+)
+{
+ Chain_Node *return_node;
+ Chain_Node *new_first;
+
+ return_node = the_chain->first;
+ new_first = return_node->next;
+ the_chain->first = new_first;
+ new_first->previous = _Chain_Head( the_chain );
+
+ return return_node;
+}
+
+/*PAGE
+ *
+ * Chain_Get_unprotected
+ */
+
+STATIC INLINE Chain_Node *_Chain_Get_unprotected(
+ Chain_Control *the_chain
+)
+{
+ if ( !_Chain_Is_empty( the_chain ) )
+ return _Chain_Get_first_unprotected( the_chain );
+ else
+ return NULL;
+}
+
+/*PAGE
+ *
+ * _Chain_Insert_unprotected
+ */
+
+STATIC INLINE void _Chain_Insert_unprotected(
+ Chain_Node *after_node,
+ Chain_Node *the_node
+)
+{
+ Chain_Node *before_node;
+
+ the_node->previous = after_node;
+ before_node = after_node->next;
+ after_node->next = the_node;
+ the_node->next = before_node;
+ before_node->previous = the_node;
+}
+
+/*PAGE
+ *
+ * _Chain_Append_unprotected
+ */
+
+STATIC INLINE void _Chain_Append_unprotected(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+)
+{
+ Chain_Node *old_last_node;
+
+ the_node->next = _Chain_Tail( the_chain );
+ old_last_node = the_chain->last;
+ the_chain->last = the_node;
+ old_last_node->next = the_node;
+ the_node->previous = old_last_node;
+}
+
+/*PAGE
+ *
+ * _Chain_Prepend_unprotected
+ */
+
+STATIC INLINE void _Chain_Prepend_unprotected(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+)
+{
+ _Chain_Insert_unprotected( _Chain_Head( the_chain ), the_node );
+
+}
+
+/*PAGE
+ *
+ * _Chain_Prepend
+ */
+
+STATIC INLINE void _Chain_Prepend(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+)
+{
+ _Chain_Insert( _Chain_Head( the_chain ), the_node );
+}
+
+#endif
+/* end of include file */
diff --git a/doc/tools/bmenu/isr.h b/doc/tools/bmenu/isr.h
new file mode 100644
index 0000000000..33eaefb127
--- /dev/null
+++ b/doc/tools/bmenu/isr.h
@@ -0,0 +1,18 @@
+/*
+ * COPYRIGHT (c) 1988-2002.
+ * On-Line Applications Research Corporation (OAR).
+ * All rights reserved.
+ *
+ * $Id$
+ */
+
+
+#ifndef __ISR_h
+#define __ISR_h
+
+typedef unsigned32 ISR_Level;
+
+#define _ISR_Disable
+#define _ISR_Enable
+
+#endif
diff --git a/doc/tools/bmenu/system.h b/doc/tools/bmenu/system.h
new file mode 100644
index 0000000000..a573045070
--- /dev/null
+++ b/doc/tools/bmenu/system.h
@@ -0,0 +1,35 @@
+/*
+ * COPYRIGHT (c) 1988-2002.
+ * On-Line Applications Research Corporation (OAR).
+ * All rights reserved.
+ *
+ * $Id$
+ */
+
+#ifndef __SYSTEM_h
+#define __SYSTEM_h
+
+typedef unsigned int unsigned32;
+typedef unsigned short unsigned16;
+typedef unsigned char unsigned8;
+
+#define STATIC static
+#define INLINE inline
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+typedef unsigned int boolean;
+
+#if !defined( TRUE ) || (TRUE != 1)
+#undef TRUE
+#define TRUE (1)
+#endif
+
+#if !defined( FALSE ) || (FALSE != 0)
+#undef FALSE
+#define FALSE 0
+#endif
+
+#endif
diff --git a/doc/tools/configure.ac b/doc/tools/configure.ac
new file mode 100644
index 0000000000..b8a233279e
--- /dev/null
+++ b/doc/tools/configure.ac
@@ -0,0 +1,28 @@
+dnl Process this file with autoconf to produce a configure script.
+dnl NOTE: This is a very coarse port to automake
+AC_PREREQ(2.59)
+
+AC_INIT([rtems-doc-tools],[_RTEMS_VERSION],[rtems-bugs@rtems.com])
+AC_CONFIG_SRCDIR([word-replace2])
+RTEMS_TOP([../..])
+
+AM_INIT_AUTOMAKE([no-define foreign 1.8])
+dnl Checks for programs.
+AC_PROG_CC
+
+dnl Checks for libraries.
+
+dnl Checks for header files.
+AC_HEADER_STDC
+AC_CHECK_HEADERS(limits.h)
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+
+dnl Checks for library functions.
+AC_CHECK_FUNCS(strdup strstr)
+
+AC_CONFIG_FILES([Makefile
+bmenu/Makefile
+texi2www/Makefile
+])
+AC_OUTPUT
diff --git a/doc/tools/texi2www/.cvsignore b/doc/tools/texi2www/.cvsignore
new file mode 100644
index 0000000000..282522db03
--- /dev/null
+++ b/doc/tools/texi2www/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/doc/tools/texi2www/ChangeLog b/doc/tools/texi2www/ChangeLog
new file mode 100644
index 0000000000..4542b8dc44
--- /dev/null
+++ b/doc/tools/texi2www/ChangeLog
@@ -0,0 +1,23 @@
+2003-12-12 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Cosmetics.
+
+2003-09-22 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Merger from rtems-4-6-branch.
+
+2003-05-21 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * texi2www: Add support for @ifnottex.
+
+2002-03-27 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: Remove AUTOMAKE_OPTIONS.
+
+2002-01-18 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
+
+ * Makefile.am: require automake-1.5.
+
+2000-08-10 Joel Sherrill <joel@OARcorp.com>
+
+ * ChangeLog: New file.
diff --git a/doc/tools/texi2www/Makefile.am b/doc/tools/texi2www/Makefile.am
new file mode 100644
index 0000000000..4ebdd53e46
--- /dev/null
+++ b/doc/tools/texi2www/Makefile.am
@@ -0,0 +1,17 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+noinst_SCRIPTS = texi2www texi2dvi
+
+EXTRA_DIST = $(noinst_SCRIPTS) dir-arrow.gif prev-arrow.gif \
+ missing-arrow.gif up-arrow.gif next-arrow.gif texi2www.texi
+
+PROJECT = texi2www
+
+# TEXINFO_TEX = $(top_srcdir)/../texinfo/texinfo.tex
+# info_TEXINFOS = texi2www.texi
diff --git a/doc/tools/texi2www/dir-arrow.gif b/doc/tools/texi2www/dir-arrow.gif
new file mode 100644
index 0000000000..5d661527cc
--- /dev/null
+++ b/doc/tools/texi2www/dir-arrow.gif
Binary files differ
diff --git a/doc/tools/texi2www/missing-arrow.gif b/doc/tools/texi2www/missing-arrow.gif
new file mode 100644
index 0000000000..c686c80b5f
--- /dev/null
+++ b/doc/tools/texi2www/missing-arrow.gif
Binary files differ
diff --git a/doc/tools/texi2www/next-arrow.gif b/doc/tools/texi2www/next-arrow.gif
new file mode 100644
index 0000000000..57f5cddb81
--- /dev/null
+++ b/doc/tools/texi2www/next-arrow.gif
Binary files differ
diff --git a/doc/tools/texi2www/prev-arrow.gif b/doc/tools/texi2www/prev-arrow.gif
new file mode 100644
index 0000000000..350785be10
--- /dev/null
+++ b/doc/tools/texi2www/prev-arrow.gif
Binary files differ
diff --git a/doc/tools/texi2www/texi2dvi b/doc/tools/texi2www/texi2dvi
new file mode 100644
index 0000000000..913904a921
--- /dev/null
+++ b/doc/tools/texi2www/texi2dvi
@@ -0,0 +1,218 @@
+#!/usr/bin/perl
+#
+# $Id$
+#
+
+$version = <<END_VERSION;
+Jan 2 1996
+END_VERSION
+
+$copyright = <<END_COPYRIGHT;
+texi2dvi - converts texinfo to dvi
+Copyright (C) 1996 Tim Singletary
+
+This program is freely distributable under the terms of the GNU
+GENERAL PUBLIC LICENSE. In particular, modified versions of this
+program must retain this copyright notice and must remain freely
+distributable.
+END_COPYRIGHT
+
+$usage = <<END_USAGE;
+Usage: texi2dvi [option ...] texinfo_file ...
+ -k (-nocleanup) -- don't ``rm -f'' the intermediate files.
+ -v (-verbose) -- print additional output.
+ -copyright -- print the copyright and die.
+ -version -- print the version and die.
+Generates a .dvi file from each texinfo (.texi or .texinfo) file.
+Understands texi2www extensions (\@gif, etc.).
+END_USAGE
+
+unless ($tex = $ENV{TEX}) {$tex = tex;}
+unless ($texindex = $ENV{TEXINDEX}) {$texindex = texindex;}
+$texinputs = $ENV{TEXINPUTS};
+
+$cleanup = 1;
+while ($ARGV[0] =~ /^-/) {
+ $_ = shift;
+ if (/-k$/ || /-nocleanup/) {$cleanup = 0; next;}
+ if (/-v$/ || /-verbose/) {$verbose = 1; next;}
+ if (/-d$/ || /-vv$/ || /-debug/) {$verbose = 2; next;}
+ if (/-copyright/) {die $copyright;}
+ if (/-version/) {die $version;}
+ die $usage;
+}
+
+$font_prefix = "xx";
+while (&prefix_in_use($font_prefix)) {
+ ++$font_prefix;
+ if (length($font_prefix) > 2) {
+ $font_prefix = "aa";
+ }
+}
+
+$unique_base = "_" . $$ . "a-";
+while (&prefix_in_use($unique_base)) {++$unique_base;}
+
+print "Generated files will begin with \`$unique_base\'\n" if $verbose;
+
+$arg_index = 'a';
+foreach $raw_texi (@ARGV) {
+ $base = $unique_base . $arg_index;
+ ++$arg_index;
+
+ # $tawtexifile is a texinfo file; suffix must be either `.texi' or
+ # `.texinfo'. If arg is in a different directory, adjust
+ # TEXINPUTS environment variable to include that (and the current)
+ # directory.
+ unless ($raw_texi =~ /(.*).texi(nfo)?$/) {
+ print "skipping $raw_texi -- has unknown extension!\n";
+ next;
+ }
+ $raw_texi_base = $1;
+ if ($raw_texi_base =~ m|^(.*)/([^/]*)$|) {
+ $raw_texi_base = $2;
+ $ENV{TEXINPUTS} = ".:$1:$texinputs";
+ } else {
+ $ENV{TEXINPUTS} = ".:$texinputs";
+ }
+
+ unless (-r $raw_texi) {
+ print "skipping $raw_texi -- not readable or doesn't exist!\n";
+ next;
+ }
+
+ # Preprocesses the $rawtexifile (because of @gif{} and other extensions)
+ $processed_texi = "$base.texi";
+ print "Preprocessing $raw_texi into $processed_texi:\n" if $verbose;
+ &preprocess_texinfo($raw_texi,$processed_texi,$base);
+
+ print "$tex $processed_texi\n" if $verbose;
+ if (system("$tex $processed_texi") == 0) {
+
+ # @possible_index_file = <$base.??>; only works for the
+ # first value of $base ... so,
+ opendir(DIR,".") || die "Couldn't read current directory -- $!\n";
+ @possible_index_files = ();
+ while ($_ = readdir(DIR)) {
+ if (/^$base\...$/) {
+ push(@possible_index_files,$_);
+ }
+ }
+ closedir(DIR);
+
+ @index_files = ();
+ foreach $possible_index_file (@possible_index_files) {
+ print "DEBUG: possible_index_file $possible_index_file\n"
+ if ($verbose > 1);
+ next unless (-s $possible_index_file);
+ push(@index_files,$possible_index_file);
+ }
+
+ if (@index_files > 0) {
+ $texindex_cmd = "$texindex " . join(' ',@index_files);
+ print "$texindex_cmd\n" if $verbose;
+ if (system($texindex_cmd) == 0) {
+ print "$tex $processed_texi\n" if $verbose;
+ system("$tex $processed_texi");
+ }
+ }
+ }
+
+ # At this point, $base.dvi should exist -- rename it
+ # to $raw_texi_base.dvi
+ if (-e "$base.dvi") {
+ rename("$base.dvi","$raw_texi_base.dvi")
+ || die "rename $base.dvi $raw_texi_base.dvi -- $!\n";
+ }
+}
+if ($cleanup) {unlink(<$base*>);}
+
+sub preprocess_texinfo
+{
+ local ($infile,$outfile,$b) = @_;
+
+ open(IN,"<$infile") || die "Couldn't open $infile -- $!\n";
+ open(OUT,">$outfile") || die "Couldn't open $outfile -- $!\n";
+
+ $gif_index = 'a';
+ while (<IN>) {
+
+ # @gif{gif} or @gif{html_gif, tex_gif}
+ if (/(.*)\@gif\{([^{]*)\}(.*)/) {
+ $prefix = $1;
+ $arg = $2;
+ $suffix = $3;
+ print OUT "$prefix\n" if $prefix;
+
+ while (1) {
+ $gif_base = $b . $gif_index;
+ last unless (-e $gif_base . ".gif");
+ ++$gif_index;
+ }
+
+ $gif_file = '';
+ if ($arg =~ /.*,(..*\.gif)/) {
+ $gif_file = $1;
+ $font_base = $gif_file;
+ } else {
+ $font_base = $arg;
+ $gif_file = $gif_base . ".gif";
+ print "Scaling $arg into $gif_file:\n" if $verbose;
+ $scale_cmd = "giftopnm $arg | pnmscale 2 | pnmnlfilt 2 1 "
+ . "| ppmquant 255 | ppmtogif > $gif_file";
+ print "$scale_cmd\n" if $verbose;
+ if (system($scale_cmd) != 0) {
+ print "$scale_cmd failed\n";
+ $gif_file = '';
+ }
+ }
+
+ if ($gif_file =~ /.*\.gif/) {
+
+
+ $font_base =~ s|.*/||;
+ $font_base =~ s|\..*||;
+
+ # $font_base, due to bm2font requirements, can't be more
+ # than six characters long and must consist entirely of
+ # lower case letters.
+ $font_base =~ s/[^a-z]//g;
+ $font_base = $font_prefix . substr($font_base,0,5);
+ while (&prefix_in_use($font_base)) {++$font_base;}
+
+ $bm2font_cmd = "bm2font -f$font_base $gif_file";
+ print "$bm2font_cmd\n" if $verbose;
+ if (system($bm2font_cmd) != 0) {
+ print "$bm2font_cmd failed\n";
+ } else {
+ print OUT "\@tex\n";
+ print OUT "\\input $font_base.tex\n";
+ print OUT "\\set$font_base\n";
+ print OUT "\@end tex\n";
+ }
+ }
+
+ print OUT "$suffix \n" if $suffix;
+ } else {
+ print OUT "$_";
+ }
+ }
+ close OUT;
+ close IN;
+}
+
+sub prefix_in_use
+{
+ local ($p) = @_;
+
+ # Returns true or false; returns true if any file in the current
+ # directory begins with $p. This function is here because
+ # `<$p*>' only works for the first value of $p!
+
+ opendir(DIR,".") || die "Couldn't read current directory -- $!\n";
+ while ($_ = readdir(DIR)) {
+ last if /^$p/;
+ }
+ closedir(DIR);
+ $rc = /^$p/;
+}
diff --git a/doc/tools/texi2www/texi2www b/doc/tools/texi2www/texi2www
new file mode 100755
index 0000000000..1a294d24bb
--- /dev/null
+++ b/doc/tools/texi2www/texi2www
@@ -0,0 +1,1304 @@
+#!/usr/bin/perl
+# (Works with both perl 4 and perl 5)
+#
+# $Id$
+#
+
+$version = 'Jan 2 1996';
+$copyright = <<EOT;
+texi2www - converts texinfo to HTML
+Copyright (C) 1994, 1995, 1996 Tim Singletary
+
+This program is freely distributable under the terms of the GNU
+GENERAL PUBLIC LICENSE. In particular, modified versions of this
+program must retain this copyright notice and must remain freely
+distributable.
+
+EOT
+$usage = <<EOT;
+Usage: texi2www [option ...] texinfo_file
+where options are:
+ -dir directory -- Specify output directory. Default is `.'.
+ -dirfile path -- Specifies a replacement for ../dir.html
+ -header path -- Specifies the path to a file containing HTML;
+ this files gets inserted near the top of each
+ generated HTML file.
+ -footer path -- Specifies the path to a file containing HTML;
+ this files gets inserted near the bottom of each
+ generated HTML file.
+ -I path -- Append path to the directories being searched for
+ texi files.
+ -icons path -- Specifies the path, relative to the output directory,
+ to the arrow files. Default is `..'.
+ -base -- Specify the base part fo the genrated short file names
+ -uselongnames -- Use long names for generated html files
+ -verbose -- Verbose output.
+
+The complete user\'s is available at
+http://sunland.gsfc.nasa.gov/info/texi2www/Top.html
+EOT
+
+########################################################################
+
+%lookup = (); # clear the name mapping hash
+$uselongnames=0; # default to using short names
+$base = "a"; # default short name base (BASEnnnnn.html)
+$outcount = 0; # count for the nnnnn part of short names
+$icons = ".."; # where are the icons
+$dir = "."; # where are the generated files to go
+$dirfile = "../dir.html"; # "up" node pointer
+@include_path = () ; # list of include directories
+
+while ($ARGV[0] =~ /^-/) {
+ $_ = shift;
+ if (/-base/) {$base = shift; next;}
+ if (/-dirfile/) {$dirfile = shift; next;}
+ if (/-dir/) {$_ = shift; s!/$!!; s!$!/!; $dir = $_; next;}
+ if (/-footer/) {$footer = shift; next;}
+ if (/-header/) {$header = shift; next;}
+ if (/-icons/) {$_ = shift; s!\/$!!; $icons = $_; next;}
+ if (/-uselongnames/) {$uselongnames = 1; next;}
+ if (/-verbose/) {$verbose = 1; next;}
+ if (/-I/) { push @include_path, shift; next;}
+ die $usage;
+}
+
+print STDERR "include-path:@include_path\n" if $verbose ;
+&initialize_tables();
+
+#
+# Read the texinfo input into @texinfo
+#
+&open_input_file($ARGV[0]);
+&read_input(1,'/^\@bye/',"$texinfo_file[0] line 1");
+$texinfo[$ntexinfo] = "\@bye\n";
+$origin[$ntexinfo] = "$texinfo_file[0] line $.";
+
+#
+# Parse @texinfo
+#
+$texinfo_index = 0;
+while ($texinfo_index < @texinfo) {
+ &get_more_stuff_to_parse();
+ if (/^\@bye/) {
+ &terminate_node();
+ print "Normal completion\n";
+ exit;
+ }
+ &parse();
+}
+
+print "Huh? didn't parse the \@bye directive!\n";
+
+########################################################################
+sub canonical # (node_name)
+{
+ local ($n) = @_;
+
+ $n =~ s/^\s+//; $n =~ s/\s+$//; # strip whitespace
+
+ return "$dirfile" if ($n =~ /\(dir\)/i); # handle (dir)
+
+ if ($n =~ /^\(([^\)]+)\)(.*)/) {
+ $p = $1; $p =~ s/^\s+//; $p =~ s/\s+$//; $p .= "/";
+ $n = $2; $n =~ s/^\s+//; $n =~ s/\s+$//;
+ } else {
+ $p = "";
+ }
+
+
+ $n =~ s/\$/\$\$/; # `$' -> `$$'
+ $n =~ s/_/\$_/g; # `_' -> `$_'
+ $n =~ s/\s+/_/g; # whitespace -> `_'
+
+ # anything else that's funky get
+ # translated to `$xx' where `xx'
+ # are hex digits.
+ while ($n =~ /(.*)([^-a-zA-Z0-9\$_.])(.*)/) {
+ $n = $1 . sprintf("\$%02x",ord($2)) . $3;
+ }
+
+ if ($uselongnames) {
+ return "$p$n.html" if ($n);
+ } else {
+ if ($n eq 'Top') {
+ $lookup{"$p$n"}= "index.html";
+ return $lookup{"$p$n"};
+ } elsif ($n) {
+ if (! $lookup{"$p$n"}) {
+ $outcount = $outcount + 1;
+ #$lookup{"$p$n"}= "$base$outcount.html";
+ $lookup{"$p$n"} = sprintf "%s%05d.html", $base, $outcount;
+ }
+ return $lookup{"$p$n"};
+ }
+ }
+ return "";
+} # canonical
+
+########################################################################
+sub deduce_node_links
+#
+# On entry, $_ is a node line and $start_index is the index (in @texinfo)
+# the node line.
+#
+# &deduce_node_links() sets $next, $prev, and $up.
+{
+ local ($level,$i,$node,$j);
+
+ # First, search down from this node to the next sectioning command.
+ $level = &determine_node_level($start_index+1);
+
+ # Next, look for the `next' node (i.e., the next node at the
+ # same or a higher level).
+ undef($next);
+ for ($i=$start_index+1; $i < $ntexinfo; ++$i) {
+ $_ = $texinfo[$i];
+ next unless /^\@node +([^,]+).*\n/;
+ $j = &determine_node_level($i+1);
+ if ($j <= $level) {
+ if ($j == $level) {$next = $1;}
+ last;
+ }
+ }
+
+ # Look for the `prev' and `up' nodes
+ undef($prev);
+ undef($up);
+ for ($i=$start_index-1; $i > 1; --$i) {
+ $_ = $texinfo[$i];
+ next unless /^\@node\s+([^,]+).*\n/;
+ $j = &determine_node_level($i+1);
+ if ($j == $level) {
+ unless ($prev) {$prev = $1;}
+ } elsif ($j < $level) {
+ $up = $1;
+ last;
+ }
+ }
+ unless (defined($up)) {$up = "(dir)";}
+
+ $xthis = $this;
+ $xthis =~ s/\n//;
+
+} # deduce_node_links
+
+########################################################################
+sub determine_node_level
+{
+ local ($i) = @_;
+ local ($level);
+
+ $level = 0;
+ while ($i < $ntexinfo) {
+ $_ = $texinfo[$i];
+ ++$i;
+ next if /^\s+$/;
+ last if (/\@node/);
+ last unless (/\@(\w+)/);
+ if ($directive_section{$1}) {
+ $level = $directive_section{$1};
+ last;
+ }
+ }
+
+ return $level;
+} # determine_node_level
+
+
+########################################################################
+sub expand_xref
+{
+ local ($cmd,$arg) = @_;
+ local ($node,$xrefname,$topic,$infofile,$manual,$url,$x);
+
+ if ($cmd eq 'inforef') {
+ ($node,$xrefname,$infofile) = split(/,/,$arg);
+ $topic = $manual = '';
+ } elsif ($cmd eq 'href') {
+ ($xrefname,$node,$infofile,$url) = split(/,/,$arg);
+ } elsif ($cmd eq 'email') {
+ ($xrefname,$node,$infofile,$url) = split(/,/,$arg);
+ $xrefname = "mailto:$xrefname";
+ $url = $xrefname
+ } elsif ($cmd eq 'uref') {
+ ($url,$xrefname,$node,$infofile) = split(/,/,$arg);
+ } else {
+ ($node,$xrefname,$topic,$infofile,$manual) = split(/,/,$arg);
+ }
+ $xrefname =~ s/^\s+//; $infofile =~ s/^\s+//;
+ $xrefname =~ s/\s+$//; $infofile =~ s/\s+$//;
+ $xrefname =~ s/\s+/ /; $infofile =~ s/\s+/ /;
+ $infofile =~ s/\.texi$//;
+ $infofile =~ s/\.texinfo$//;
+
+ if ($xrefname =~ /^$/) {$xrefname = $node;}
+
+ $node = &canonical($node);
+ unless ($url) {
+ unless ($infofile =~ /^$/) {$url = "../$infofile/";}
+ $url = $url . $node;
+ }
+ $x = "<A HREF=\"$url\">$xrefname</A>";
+} # expand_xref
+
+########################################################################
+sub get_more_stuff_to_parse
+{
+ $start_index = $texinfo_index;
+
+ $_ = '';
+ do {
+ if ($texinfo_index >= @texinfo) {
+ print "Unclosed \@x{y} in chunk beginning at "
+ . "$origin[$start_index]\n";
+ return;
+ }
+ s/\n$/ /;
+ $more = $texinfo[$texinfo_index++];
+ $more =~ s/\@\*/<BR>\n/g;
+ $more =~ s/\@\./\./g;
+ $more =~ s/\@\://g;
+ $more =~ s/\@refill//g;
+
+ $_ .= $more;
+
+ # Expand all @a{b} in line
+ while (/\@(\w+)\{([^{}]*)\}/) {
+ $atcmd = $1;
+ $atarg = $2;
+
+ if ($z = $atxy_2_zyz{$atcmd}) {
+ if ($z =~ /(.+),(.+),(.+)/) {
+ $left = $1; $z = $2; $right = $3;
+ } else {
+ $left = ''; $right = '';
+ }
+ if ($z =~ s/^\^//) {$atarg =~ tr/a-z/A-Z/;}
+ $x = "$left<$z>$atarg</$z>$right";
+ } elsif ($atxy_2_y{$atcmd}) {
+ $x = $atarg;
+ } elsif ($z = $atxy_2_z{$atcmd}) {
+ $x = $z;
+ } elsif ($z = $atxy_2_ref{$atcmd}) {
+ $x = $z . &expand_xref($atcmd,$atarg);
+ $x =~ s/^X//; # works because $z must start with 'X'!
+ } elsif ($atcmd eq 'value') {
+ $x = $texinfo_variable{$atarg};
+ } elsif ($atcmd eq 'today') {
+ $x = &today();
+ } elsif ($atcmd eq 'footnote') {
+ $footnote[$nfootnotes++] = $atarg;
+ $x = "\[$nfootnotes\]";
+ } elsif ($atcmd eq 'gif') {
+ $atarg =~ s/,.*//;
+ &copy_to_destdir($atarg);
+ $atarg =~ s|.*/||;
+ $x = "<IMG SRC=\"$atarg\">";
+ } else {
+ print "**WARNING** Don't know how to expand "
+ . "\@$atcmd\{$atarg\}\n";
+ $debug = 1;
+ $x = "?$atcmd\?$atarg\?";
+ }
+
+ print "$origin[$start_index]: \@$atcmd\{$atarg\} => $x\n"
+ if $debug{expansions};
+
+ s/\@\w+\{[^{}]*\}/$x/;
+ }
+ } while (/\@\w+\{[^}]*$/);
+ print "$origin[$start_index]: $_" if $debug{chunks};
+} # get_more_stuff_to_parse
+
+########################################################################
+sub parse
+# On entry:
+# $_ -- the line(s) to parse.
+# $start_index -- where, in $texinfo, $_ begins.
+{
+ local ($x);
+
+ if (/^\@(\w+)/) {
+ if ($x=$directive_block{$1}) { # @example, @quotation, etc.
+ &parse_block($1,$x);
+ } elsif ($directive_section{$1}) { # @chapter, @subsection, etc.
+ &process_section();
+ } elsif ($1 eq 'bye') {
+ if ($nfootnotes > 0) {
+ &printHTML("<P><HR>\n");
+ for ($n=0; $n < $nfootnotes; ++$n) {
+ &printHTML("<P>\[" . ($n+1) . "\] $footnote[$n]</P>\n");
+ }
+ }
+ &printHTML("<P><HR>\n");
+ &print_arrows;
+ &printHTML("</P>\n");
+ &print_footer if $footer;
+ &printHTML("</BODY></HTML>\n");
+ close (HTML);
+ return;
+ } elsif ($1 eq 'center') {
+ /^\@center\s+(.*)/;
+ &printHTML("$paragraph_end") if $in_paragraph;
+ &printHTML("<P ALIGN=CENTER>$1</P>\n");
+ $in_paragraph = 0;
+ } elsif ($1 eq 'clear') {
+ /^\@clear\s+(\S+)/;
+ undef($texinfo_variable{$1});
+ } elsif ($1 =~ /^def(code)?index/) {
+ /^\@(def|defcode)index\s+(\w+)/;
+ $index_name{$2} = $2 . "index";
+ $index_style{$2} = 'CODE' if ($1 eq "defcode");
+ } elsif ($1 =~ /^(def.*)/) { # @defn, @defun, ... @deftp
+ &parse_def($1);
+ } elsif ($1 eq 'enumerate') {
+ &parse_enumerate();
+ } elsif ($1 eq 'exdent') {
+ /^\@exdent\s+(.*)/;
+ &printHTML("$paragraph_end") if $in_paragraph;
+ # A bug -- doesn't exdent the line!
+ &printHTML("<P>$1</P>\n");
+ $in_paragraph = 0;
+ } elsif ($1 eq 'flushleft' || $1 eq 'flushright') {
+ &parse_flush();
+ } elsif ($1 eq 'html') {
+ while ($texinfo_index < @texinfo) {
+ &get_more_stuff_to_parse();
+ last if (/^\@end\s+html/);
+ s/\&quot;/\"/g; s/\&gt;/\>/g; s/\&lt;/\</g; s/\&amp;/\&/g;
+ &printHTML("$_");
+ }
+ } elsif ($1 eq 'itemize') {
+ &parse_itemize();
+ } elsif ($1 eq 'menu') {
+ &parse_menu();
+ } elsif ($1 eq 'node') {
+ $node=$_;
+ &process_node();
+ } elsif ($1 eq 'printindex') {
+ /^\@printindex\s+([a-z]+)/;
+ &print_index($1);
+ } elsif ($1 eq 'settitle') {
+ /^\@settitle\s+(.*)/;
+ unless ($title) {$title = $1;}
+ } elsif ($1 eq 'set') {
+ if (/^\@set\s+(\S+)\s+(.+)$/) {
+ $texinfo_variable{$1} = $2;
+ } else {
+ /^\@set\s+(\S+)/;
+ $texinfo_variable{$1} = 1;
+ }
+ } elsif ($1 eq 'syncodeindex') {
+ &process_synindex(1);
+ } elsif ($1 eq 'synindex') {
+ &process_synindex(0);
+ } elsif ($1 =~ /^.?table/) { # @table, @vtable, @ftable
+ unless (/^\@(.?table)\s*\@(\w*)/
+ && ($2 eq 'asis' || ($tbltype=$atxy_2_zyz{$2}))) {
+ print "**WARNING** $origin[$start_index]: assuming "
+ . "\@table \@asis\n";
+ $tbltype = '';
+ }
+ &parse_table($1,$tbltype);
+ } elsif ($1 =~ /..?index/) { # @cindex, @findex, .. @auindex, etc.
+ &process_index();
+ } else {
+ print "**WARNING** $origin[$start_index]: ignoring $_";
+ }
+ } else {
+ if (/^\s*$/) {
+ if ($in_paragraph) {
+ &printHTML("$paragraph_end");
+ } elsif ($in_preformatted) {
+ &printHTML("\n");
+ }
+ $in_paragraph = 0;
+ } else {
+ unless ($in_preformatted) {
+ unless ($in_paragraph) {
+ &printHTML("<P>\n");
+ $in_paragraph = 1;
+ $paragraph_end = "</P>\n";
+ }
+ }
+ &printHTML("$_");
+ }
+ }
+} # parse
+
+########################################################################
+sub parse_block
+#
+# Handles @example, @display, etc.
+#
+# > @example > <PRE>
+# > a + b = c ==> > a + b = c
+# > @end example > </PRE>
+{
+ local ($block,$pre) = @_;
+ local ($started_at);
+
+ $started_at = $start_index;
+
+ &printHTML("$paragraph_end") if $in_paragraph;
+ $in_paragraph = 0;
+
+ if ($pre eq '>PRE') {
+ &printHTML("<DL><DT><DD>\n<PRE>\n");
+ } else {
+ &printHTML("<$pre>\n") unless ($pre eq '-');
+ }
+ $in_preformatted = $block;
+ while ($texinfo_index < @texinfo) {
+ &get_more_stuff_to_parse();
+ if (/^\@end\s+$block/) {
+ if ($pre eq 'HR') {
+ &printHTML("</HR>\n");
+ } elsif ($pre eq '>PRE') {
+ &printHTML("</PRE>\n</DL>\n");
+ } else {
+ &printHTML("</$pre>\n") unless ($pre eq '-');
+ }
+ $in_preformatted = 0;
+ return;
+ }
+ &parse();
+ }
+ print "**ERROR** reached EOF while searching for end of the \@$block "
+ . "block that started on $origin[$started_at]\n";
+} # parse_block
+
+########################################################################
+sub parse_def
+# $_ contains a @def* command
+{
+ local ($def) = @_;
+ local ($started_at,$in_dd);
+
+ $started_at = $start_index;
+
+ &printHTML("$paragraph_end") if $in_paragraph;
+ $in_paragraph = 0;
+
+ &printHTML("<DL>\n");
+
+ &printdef();
+
+ while ($texinfo_index < @texinfo) {
+ &get_more_stuff_to_parse();
+ if (/^\@end\s+$def/) {
+ &printHTML("</DL>\n");
+ $in_paragraph = 0;
+ return;
+ }
+ if (s/^(\@def\w+)x\s/$1 /) {&printdef();}
+ else {
+ unless ($in_dd) {
+ &printHTML("<DD>\n");
+ ++$in_dd;
+ $in_paragraph = 1;
+ $paragraph_end = "\n";
+ }
+ &parse();
+ }
+ }
+ print "**ERROR** reached EOF while searching for end of the $def "
+ . "definition that started on $origin[$started_at]\n";
+
+} # parse_def
+sub printdef
+{
+
+ s/\@defun(x?)\s/\@deffn Function /
+ || s/\@defmac(x?)\s/\@deffn Macro /
+ || s/\@defspec(x?)\s/\@deffn \{Special Form\} /
+ || s/\@defvar(x?)\s/\@defvr Variable /
+ || s/\@defopt(x?)\s/\@defvr \{User Option\} /
+ || s/\@deftypefun(x?)\s/\@deftypefn Function /
+ || s/\@deftypevar(x?)\s/\@deftypefn Variable /
+ || s/\@defivar(x?)\s/\@defcv \{Instance Variable\} /
+ || s/\@defmethod(x?)\s/\@defop Method /;
+ s/(\@\w+)x\s/$1 /;
+
+ @words = split;
+
+ $i = 1;
+ $category = $words[$i++];
+ while ($i < @words && $category =~ /^\{[^}]*$/) {
+ $category .= ' ' . $words[$i++];
+ }
+ if ($i>=@words) {
+ print "def error at $origin{$started_at}\n";
+ }
+ $category =~ s/^\{//;
+ $category =~ s/\}$//;
+
+ &printHTML("<DT>$category: ");
+
+ if ($words[0] eq '@deftypefn' || $words[0] eq '@deftypevr'
+ || $words[0] eq '@defcv' || $words[0] eq '@defop') {
+ if ($words[$i] =~ s/^\{//) {
+ &printHTML("<VAR>");
+ until ($words[$i] =~ s/\}$//) {&printHTML("$words[$i++]");}
+ &printHTML("$words[$i++]</VAR> ");
+ } else {
+ &printHTML("<VAR>$words[$i++]</VAR> ");
+ }
+ $words[0] =~ /.*([a-z][a-z])/;
+ $_ = "\@" . $1 . "index " . $words[$i];
+ &process_index;
+ }
+ &printHTML("<STRONG>$words[$i++]</STRONG>\n<VAR>");
+
+ while ($i < @words) {&printHTML(" $words[$i++]");}
+ &printHTML("</VAR>\n");
+
+} # printdef
+
+########################################################################
+sub parse_enumerate
+# $_ is `@enumerate'. Note that @enumerate with an arg (`@enumerate 3',
+# for example) is kinda funky due to HTML limitations.
+{
+ local ($count,$started_at);
+
+ $started_at = $start_index;
+
+ &printHTML("$paragraph_end") if $in_paragraph;
+ $in_paragraph = 0;
+
+ if (/^\@enumerate\s*(\S+)/) {$count = $1;}
+
+ &printHTML("<" . ($count ? "UL" : "OL") . ">\n");
+
+ while ($texinfo_index < @texinfo) {
+ &get_more_stuff_to_parse();
+ if (/^\@end\s+enumerate/) {
+ &printHTML("</" . ($count ? "UL" : "OL") . ">\n");
+ return;
+ }
+ if (/^\@item\s+(.*)/ || /^\@item()$/) {
+ if ($count) {
+ &printHTML("<LI>$count: $1\n");
+ ++$count;
+ } else {
+ &printHTML("<LI>$1\n");
+ }
+ $in_paragraph = 1;
+ $paragraph_end = "\n";
+ } else {
+ &parse();
+ }
+ }
+ print "**ERROR** reached EOF while searching for end of the \@enumerate "
+ . "that started on $origin[$started_at]\n";
+} # parse_enumerate
+
+########################################################################
+sub parse_flush
+{
+ local ($started_at,$flush);
+
+ /^\@(\w+)\s/;
+ $flush = $1;
+ $started_at = $start_index;
+
+ &printHTML("$paragraph_end") if $in_paragraph;
+ $in_paragraph = 0;
+
+ while ($texinfo_index < @texinfo) {
+ &get_more_stuff_to_parse();
+ if (/^\@end\s+$flush/) {
+ return;
+ }
+ &parse();
+ }
+ print "**ERROR** reached EOF while searching for end of the $flush "
+ . "that started on $origin[$started_at]\n";
+
+
+} # parse_flush
+
+########################################################################
+sub parse_itemize
+# $_ is `@itemize'. Due to HTML limitation, `@itemize @bullet' comes
+# out the same as `@itemize @minus'.
+{
+ local ($started_at);
+
+ $started_at = $start_index;
+
+ &printHTML("$paragraph_end") if $in_paragraph;
+ $in_paragraph = 0;
+
+ &printHTML("<UL>\n");
+
+
+ while ($texinfo_index < @texinfo) {
+ &get_more_stuff_to_parse();
+ if (/^\@end\s+itemize/) {
+ &printHTML("</UL>\n");
+ return;
+ }
+ if (/^\@item\s+(.*)/ || /^\@item()$/) {
+ &printHTML("<LI>$1\n");
+ $in_paragraph = 1;
+ $paragraph_end = "\n";
+ } else {
+ &parse();
+ }
+ }
+ print "**ERROR** reached EOF while searching for end of the itemize "
+ . "that started on $origin[$started_at]\n";
+} # parse_itemize
+
+########################################################################
+sub parse_menu
+{
+ local ($started_at);
+
+ $started_at = $start_index;
+
+ &printHTML("$paragraph_end") if $in_paragraph;
+ $in_paragraph = 0;
+
+ &printHTML("<MENU>\n");
+
+ while ($texinfo_index < @texinfo) {
+ &get_more_stuff_to_parse();
+ if (/^\@end\s+menu/) {
+ &printHTML("</MENU>\n");
+ return;
+ }
+
+ # Like ` * menu-item:: description of item'
+ if (/^\s*\*\s*([^:]*)\s*::\s*(.*)$/) {
+ &printHTML("$paragraph_end") if $in_paragraph;
+ $in_paragraph = 0;
+ $node = &canonical($1);
+ &printHTML("<LI><A HREF=\"$node\">$1</A>\n");
+ &printHTML("$2\n") if $2;
+ # Like ` * menu-item: cross-reference. description of item'
+ } elsif (/^\s*\*\s*([^:]*)\s*:([^.]*)\.\s*(.*)$/) {
+ &printHTML("$paragraph_end") if $in_paragraph;
+ $in_paragraph = 0;
+ $node = &canonical($2);
+ &printHTML("<LI><A HREF=\"$node\">$1</A>\n");
+ &printHTML("$3\n");
+ } elsif (/^\@/) {
+ print "**WARNING** Don\'t know how to process \`$_\' inside "
+ . "a menu!\n";
+ } else {
+ if (/^\s*$/ && !$in_paragraph) {
+ &printHTML("<P>");
+ $in_paragraph = "1";
+ $paragraph_end = "</P>\n";
+ }
+ &printHTML("$_");
+ }
+ }
+ print "**ERROR** reached EOF while searching for end of the menu "
+ . "that started on $origin[$started_at]\n";
+} # parse_menu
+
+########################################################################
+sub parse_table
+# $_ is `@itemize'. Due to HTML limitation, `@itemize @bullet' comes
+# out the same as `@itemize @minus'.
+{
+ local ($table,$ttype,$after_DT,$started_at,$first_para);
+ ($table,$ttype) = @_;
+
+ $started_at = $start_index;
+
+ &printHTML("$paragraph_end") if $in_paragraph;
+ $in_paragraph = 0;
+
+ &printHTML("<DL>\n");
+
+ while ($texinfo_index < @texinfo) {
+ &get_more_stuff_to_parse();
+ if (/^\@end\s+$table/) {
+ &printHTML("</DL>\n");
+ return;
+ }
+ if (/^\@item(x?)\s+(.*)/ || /^\@item(x?)()$/) {
+ $atarg = $2;
+ if ($ttype) {
+ if ($ttype =~ /(.+),(.+),(.+)/) {
+ $left = $1; $z = $2; $right = $3;
+ } else {
+ $left = ''; $z = $ttype; $right = '';
+ }
+ if ($z =~ s/^\^//) {$atarg =~ tr/a-z/A-Z/;}
+ &printHTML("<DT>$left<$z>$atarg</$z>$right\n");
+ } else {
+ &printHTML("<DT>$2\n");
+ }
+ $item = $2;
+ if ($item && $table =~ /([fv])table/) {
+ $_ = "\@" . $1 . "index " . $item;
+ &process_index;
+ }
+ $after_DT = 1;
+ } else {
+ if ($after_DT) {
+ &printHTML("<DD>\n");
+ $in_paragraph = 1;
+ $paragraph_end = "\n";
+ $after_DT = 0;
+ $first_para = 1;
+ }
+ unless ($first_para && /^\s*$/) {
+ $first_para = 0;
+ &parse();
+ }
+ }
+ }
+ print "**ERROR** reached EOF while searching for end of the table "
+ . "that started on $origin[$started_at]\n";
+} # parse_table
+
+########################################################################
+sub print_index
+{
+ local ($index) = @_;
+ $index = $index_name{$index};
+
+ eval "\@keys = keys \%$index";
+
+ &printHTML("<MENU>\n");
+ foreach $item (sort texinfo_sort @keys) {
+ eval "\$val = \$$index\{\$item\}";
+ &printHTML("<LI>$val\n");
+ }
+ &printHTML("</MENU>\n");
+} # print_index
+
+sub texinfo_sort
+{
+ $x = $a; $x =~ s/<[^>]*>//g; $x =~ tr/A-Z/a-z/;
+ $y = $b; $y =~ s/<[^>]*>//g; $y =~ tr/A-Z/a-z/;
+ $x cmp $y;
+} # texinfo_sort
+
+########################################################################
+sub process_index
+#
+# For example, `@cindex whatever' generates an entry in %cpindex
+#
+{
+ s/\@cindex/\@cpindex/ || s/\@findex/\@fnindex/
+ || s/\@vindex/\@vrindex/ || s/\@kindex/\@kyindex/
+ || s/\@pindex/\@pgindex/ || s/\@tindex/\@tpindex/;
+
+ /\@(..)index\s+(.*)/;
+
+ if ($x=$index_style{$1}) {
+ $entry = "<A HREF=\"$cthis\"><$x>$2</$x></A>";
+ } else {
+ $entry = "<A HREF=\"$cthis\">$2</A>";
+ }
+
+ print "*** \$$index_name{$1}\{$2\} = $entry\n" if $debug{'index'};
+ eval "\$$index_name{$1}\{\$2\} = \$entry";
+} # process_index
+
+########################################################################
+sub print_arrows
+{
+ &printHTML("<LINK REL=\"Precedes\" HREF=\"$cnext\">\n") if $next;
+ &printHTML("<LINK REV=\"Precedes\" HREF=\"$cprev\">\n") if $prev;
+ &printHTML("<LINK REV=\"Subdocument\" HREF=\"$cup\">\n") if $up;
+ &printHTML("<LINK REV=\"Library\" HREF=\"$dirfile\">\n") if $dirfile;
+ &printHTML("</HEAD><BODY><P>\n");
+ if ($cprev) {
+ &printHTML("<A HREF=\"$cprev\"><IMG ALIGN=MIDDLE "
+ . "SRC=\"$icons/prev-arrow.gif\" ALT=\"PREV\"></A>\n");
+ } else {
+ &printHTML("<A><IMG ALIGN=MIDDLE "
+ . "SRC=\"$icons/missing-arrow.gif\" ALT=\"prev\"></A>\n");
+ }
+ if ($cup) {
+ &printHTML("<A HREF=\"$cup\"> <IMG ALIGN=MIDDLE "
+ . "SRC=\"$icons/up-arrow.gif\" ALT=\"UP\"></A>\n");
+ } else {
+ &printHTML("<A><IMG ALIGN=MIDDLE "
+ . "SRC=\"$icons/missing-arrow.gif\" ALT=\"up\"></A>\n");
+ }
+ if ($cnext) {
+ &printHTML("<A HREF=\"$cnext\"><IMG ALIGN=MIDDLE "
+ . "SRC=\"$icons/next-arrow.gif\" ALT=\"NEXT\"></A>\n");
+ } else {
+ &printHTML("<A><IMG ALIGN=MIDDLE "
+ . "SRC=\"$icons/missing-arrow.gif\" ALT=\"next\"></A>\n");
+ }
+ if ($dirfile) {
+# XXX need new graphic for this one
+ &printHTML("<A HREF=\"$dirfile\"> <IMG ALIGN=MIDDLE "
+ . "SRC=\"$icons/dir-arrow.gif\" ALT=\"Bookshelf\"></A>\n");
+ } else {
+ &printHTML("<A><IMG ALIGN=MIDDLE "
+ . "SRC=\"$icons/missing-arrow.gif\" ALT=\"Bookshelf\"></A>\n");
+ }
+ &printHTML("<CITE>$title</CITE>") if $title;
+}
+
+########################################################################
+sub process_node
+# On entry, $_ is an @node line.
+{
+ s/^\@node\s+//;
+ ($this,$next,$prev,$up) = split(/,/);
+
+ &deduce_node_links() unless ($next || $prev || $up);
+
+ &terminate_node();
+
+ $cthis = &canonical($this);
+ $cnext = &canonical($next);
+ $cprev = &canonical($prev);
+ $cup = &canonical($up);
+
+ print "... opening $dir$cthis ...\n" if $debug{nodes};
+ open(HTML,">$dir/$cthis") || die "Couldn't open $dir$cthis -- $!\n";
+
+ $nfootnotes = 0;
+
+ &printHTML("<HTML>\n");
+ &printHTML("<!-- created $today from " .
+ $origin[$start_index] . " via texi2www -->\n");
+ &print_header if $header;
+ &printHTML("<HEAD>\n<TITLE>$this</TITLE>\n");
+ &print_arrows;
+ &printHTML("</P>\n");
+
+} # process_node
+
+sub terminate_node
+{
+ if ($nfootnotes) {
+ &printHTML("<P><HR>\n");
+ for ($n=0; $n < $nfootnotes; ++$n) {
+ &printHTML("<P>\[" . ($n+1) . "\] $footnote[$n]</P>\n");
+ }
+ }
+
+
+ &printHTML("<P><HR>\n");
+ &print_arrows;
+ &printHTML("</P>\n");
+ &print_footer if $footer;
+ &printHTML("</BODY></HTML>\n");
+ close (HTML);
+}
+
+########################################################################
+sub process_section
+#
+# On entry:
+# $_ is the section command (I.e. `@chapter Overview')
+# $i is the index to $_ in @lines
+{
+ &printHTML("$paragraph_end") if $in_paragraph;
+ $in_paragraph = 0;
+
+ /^\@(\w+)\s+(.*)/;
+
+ $section_number = '';
+ if ($1 eq 'chapter') {
+ ++$chapter; $section=$subsection=$subsubsection=0;
+ $section_number = "Chapter $chapter: ";
+ } elsif ($1 eq 'section') {
+ ++$section; $subsection=$subsubsection=0;
+ $section_number = "$chapter.$section: ";
+ } elsif ($1 eq 'subsection') {
+ ++$subsection; $subsubsection=0;
+ $section_number = "$chapter.$section.$subsection: ";
+ } elsif ($1 eq 'subsubsection') {
+ ++$subsubsection;
+ $section_number = "$chapter.$section.$subsection.$subsubsection: ";
+ } elsif ($1 eq 'appendix') {
+ ++$appendix; $section=$subsection=$subsubsection=0;
+ $x = ('A'..'Z')[$appendix-1];
+ $section_number = "Appendix $x: ";
+ } elsif ($1 eq 'appendixsec') {
+ ++$section; $subsection=$subsubsection=0;
+ $x = ('A'..'Z')[$appendix-1];
+ $section_number = "$x.$section: ";
+ } elsif ($1 eq 'appendixsubsec') {
+ ++$subsection; $subsubsection=0;
+ $x = ('A'..'Z')[$appendix-1];
+ $section_number = "$x.$section.$subsection: ";
+ } elsif ($1 eq 'appendixsubsubsec') {
+ ++$subsubsection;
+ $x = ('A'..'Z')[$appendix-1];
+ $section_number = "$x.$section.$subsection.$subsubsection: ";
+ }
+
+ $x = $directive_section{$1};
+ &printHTML("<H$x>$section_number$2</H$x>\n");
+} # process_section
+
+########################################################################
+sub process_synindex
+#
+# There's perhaps a bug here -- this presumes the @synindex comes before
+# any @?index directives; anything already in <from> doesn't get merged
+# into <to>!
+#
+{
+ local ($code) = @_; # Either 0 or 1; 1 means @syncodeindex
+
+ /\@syn\w*index\s+(\w+)\s+(\w+)/;
+
+ print "*** synindex $1 $2\n" if $debug{'index'};
+
+ $index_name{$1} = $2 . "index";
+ $index_style{$1} = 'CODE' if $code;
+} # process_synindex
+
+########################################################################
+sub printHTML
+{
+ local ($line) = @_;
+ $line =~ s/\$R/\}/g;
+ $line =~ s/\$L/\{/g;
+ $line =~ s/\$A/\@/g;
+ $line =~ s/\$D/\$/g;
+ if ($debug{printHTML}) {
+ print $line;
+ } else {
+ print HTML $line;
+ }
+} # printHTML
+
+########################################################################
+sub print_header
+{
+ unless (open(HEADER,$header)) {
+ print "WARNING -- couldn't open header file \"$header\" -- $!\n";
+ $header = 0;
+ return;
+ }
+ while (<HEADER>) {
+ &printHTML($_);
+ }
+ close(HEADER);
+}
+
+########################################################################
+sub print_footer
+{
+ unless (open(FOOTER,$footer)) {
+ print "WARNING -- couldn't open footer file \"$footer\" -- $!\n";
+ $footer = 0;
+ return;
+ }
+ while (<FOOTER>) {
+ &printHTML($_);
+ }
+ close(FOOTER);
+}
+
+########################################################################
+sub read_input
+#
+# Read the texinfo source into @texinfo. Don't copy comments or the
+# `@ifxxx' and `@end ifxxx' surrounding [or the contents of] conditional
+# blocks. Read `@include' files.
+{
+ local ($echo,$terminator_re,$started_at) = @_;
+
+ while (&texinfo_read()) {
+
+ next if (/^\@c$/ || /^\@c\s/ || /^\@comment/);
+
+ if (/^\@ifinfo/) {
+ &read_input($echo,'/^\@end\s+ifinfo/',
+ "$texinfo_file[0] line $.");
+ next;
+ }
+ if (/^\@ifnottex/) {
+ &read_input($echo,'/^\@end\s+ifnottex/',
+ "$texinfo_file[0] line $.");
+ next;
+ }
+ if (/^\@ifhtml/) {
+ &read_input($echo,'/^\@end\s+ifhtml/',
+ "$texinfo_file[0] line $.");
+ next;
+ }
+ if (/^\@iftex/) {
+ &read_input(0,'/^\@end\s+iftex/',
+ "$texinfo_file[0] line $.");
+ next;
+ }
+ if (/^\@tex/) {
+ &read_input(0,'/^\@end\s+tex/',
+ "$texinfo_file[0] line $.");
+ next;
+ }
+ if (/^\@ignore/) {
+ # @ignore doesn't nest
+ $ignore_from = "$texinfo_file[0] line $.";
+ while (&texinfo_read()) {
+ last if (/^\@end\s+ignore/);
+ }
+ unless (/^\@end\s+ignore/) {
+ print "Unexpected EOF while searching from $ignore_from "
+ . "for \'\@end ignore\'\n";
+ }
+ next;
+ }
+ if (/^\@titlepage/) {
+ &read_input(0,'/^\@end\s+titlepage/',"$texinfo_file[0] line $.");
+ next;
+ }
+
+ if (/^\@ifclear\s+(\S+)/) {
+ &read_input($echo&&(!defined($set{$1})),'/^\@end\s+ifclear/',
+ "$texinfo_file[0] line $.");
+ next;
+ }
+ if (/^\@ifset\s+(\S+)/) {
+ &read_input($echo&&defined($set{$1}),'/^\@end\s+ifset/',
+ "$texinfo_file[0] line $.");
+ next;
+ }
+
+ return if eval "$terminator_re";
+
+ if (/^\@include\s+(\S+)/) {
+ &open_input_file($1);
+ next;
+ }
+
+ if (/^\@(set|clear)\s+(\S+)/) {
+ if ($1 eq "set") {
+ $set{$2} = 1;
+ } else {
+ undef($set{$2});
+ }
+ }
+
+ next unless $echo;
+
+ if (/^\@(\w+)/) {next if $ignore_these_directives{$1};}
+
+ # Hide @@, @{, and @} so later on it'll be easier to process
+ # stuff like `@code{@@TeX@{@}}'.
+ s/\$/\$D/g; s/\@\@/\$A/g; s/\@{/\$L/g; s/\@}/\$R/g;
+
+ # Convert the HTML special characters
+ s/\&/\&amp;/g; s/\</\&lt;/g; s/\>/\&gt;/g; s/\"/\&quot;/g;
+
+ $texinfo[$ntexinfo] = $_;
+ $origin[$ntexinfo] = "$texinfo_file[0] line $.";
+ ++$ntexinfo;
+ }
+
+ print "Unexpected EOF while searching from $started_at "
+ . "for $terminator_re\n";
+} # read_input
+
+########################################################################
+sub initialize_tables
+{
+ # Lists which `@x{y}' get expanded into `y'.
+ %atxy_2_y = (
+ 'asis', 1,
+ 'r', 1,
+ 'w', 1,
+ );
+
+ # Describes which `@x{y}' get expanded into `<z>y</z>' and what `z'
+ # is in those expansions! (If the expansion matches
+ # ``/(.*),(.*),(.*)/'' then y actually expands to ``$1<$2>y</$2>$3'';
+ # if z (or $2) begins with ^ then uppercase y before doing the
+ # expansion).
+ %atxy_2_zyz= (
+ 'b', 'STRONG',
+ 'cite', 'CITE',
+ 'code', "CODE",
+ 'dfn', 'EM',
+ 'dmn', 'EM',
+ 'emph', 'EM',
+ 'file', "`,CODE,'",
+ 'i', 'EM',
+ 'kbd', 'KBD',
+ 'key', '^CODE',
+ 'math', 'CODE',
+ 'samp', "`,CODE,'",
+ 'sc', '^EM',
+ 'strong', 'STRONG',
+ 't', 'CODE',
+ 'titlefont', 'CITE',
+ 'var', 'VAR',
+ );
+
+ # Describes which `@x{y}' can be expanded into `z' and what `z' is in
+ # those expansions!
+ %atxy_2_z = (
+ 'TeX', '<i>T</i>e<i>X</i>',
+ 'bullet', '*',
+ 'copyright', '(C)',
+ 'dots', '...',
+ 'equiv', '==',
+ 'error', 'error-->',
+ 'expansion', '==>',
+ 'minus', '-',
+ 'point', '-!-',
+ 'print', '-|',
+ 'result', '=>',
+ 'today', &today(),
+ );
+
+ # Lists the '@x{y}' cross reference commands, and describes how they get
+ # expanded. Note the 'X' beginning each expansion -- it's there so 'ref'
+ # doesn't get expanded to ''!
+ %atxy_2_ref = (
+ 'xref', 'XSee ',
+ 'ref', 'X',
+ 'pxref', 'Xsee ',
+ 'href', 'X',
+ 'uref', 'X',
+ 'email', 'X',
+ 'inforef', 'XSee ',
+ );
+
+ %ignore_these_directives = (
+ 'author', 1,
+ 'break', 1,
+ 'contents', 1,
+ 'evenfooting', 1,
+ 'everyfooting', 1,
+ 'everyheading', 1,
+ 'finalout', 1,
+ 'footnotestyle', 1,
+ 'headings', 1,
+ 'need', 1,
+ 'noindent', 1,
+ 'oddfooting', 1,
+ 'page', 1,
+ 'paragraphindent', 1,
+ 'setchapternewpage', 1,
+ 'setcontentsaftertitlepage', 1,
+ 'setfilename', 1,
+ 'shortcontents', 1,
+ 'shorttitlepage', 1,
+ 'smallbook', 1,
+ 'sp', 1,
+ 'subtitle', 1,
+ 'summarycontents', 1,
+ 'top', 1,
+ 'vskip', 1,
+ );
+
+ # List the section directives and indicate what heading level
+ # each one gets.
+ %directive_section = (
+ 'chapter', 1,
+ 'section', 2,
+ 'subsection', 3,
+ 'subsubsection',4,
+ 'appendix', 1,
+ 'appendixsec', 2,
+ 'appendixsubsec', 3,
+ 'appendixsubsubsec', 4,
+ 'chapheading', 1,
+ 'majorheading', 1,
+ 'heading', 2,
+ 'subheading', 3,
+ 'subsubheading', 4,
+ 'unnumbered', 1,
+ 'unnumberedsec', 2,
+ 'unnumberedsubsec', 3,
+ 'unnumberedsubsubsec', 4,
+ );
+
+ # These @ directives begin a block of preformatted text
+ # (">PRE" means indented inside <PRE>...</PRE>)
+ %directive_block = (
+ 'cartouche', 'HR',
+ 'display', '>PRE',
+ 'example', '>PRE',
+ 'format', 'PRE',
+ 'group', '-',
+ 'lisp', '>PRE',
+ 'quotation', 'BLOCKQUOTE',
+ 'smallexample','>PRE',
+ );
+
+ %index_name = (
+ 'cp', 'cpindex',
+ 'fn', 'fnindex',
+ 'ky', 'kyindex',
+ 'pg', 'pgindex',
+ 'tp', 'tpindex',
+ 'vr', 'vrindex',
+ );
+ %index_style = (
+ 'fn', 'CODE',
+ 'ky', 'CODE',
+ 'pg', 'CODE',
+ 'tp', 'CODE',
+ 'vr', 'CODE',
+ );
+} # initialize_tables
+
+########################################################################
+sub open_input_file
+{
+ my $file = "$_[0]" ;
+ if ( not -f "$file" )
+ {
+ foreach $i ( @include_path )
+ {
+ if ( -f "$i/$_[0]" ) { $file = "$i/$_[0]"; last ; }
+ }
+ }
+ unshift(@texinfo_file,$file);
+ print "opening $file ...\n" if $debug{open_input_file};
+ open($texinfo_file[0],$file) || die "Couldn't open $file: $!\n";
+} # open_input_file
+
+########################################################################
+sub texinfo_read
+# Reads the next line of texinfo input into $_.
+{
+ do {
+ $fd = $texinfo_file[0];
+ $_ = <$fd>;
+ } while ($_ eq '' && shift @texinfo_file);
+ return $_;
+} # texinfo_read
+
+########################################################################
+sub today
+{
+ $today = `date`;
+ $today =~ s/\w+ (\w+ +[0-9]+) [0-9]+:[0-9]+:[0-9]+ \w+ ([0-9]+)\n/$1 $2/;
+ $today =~ s/ +/ /g;
+ return $today;
+} # today
+
+########################################################################
+sub copy_to_destdir
+{
+ ($copy_from) = @_;
+
+ if ($copy_from =~ m|(.*)/([^/]*)|) {
+ $copy_from_dir = $1;
+ $copy_from_file = $2;
+ } else {
+ $copy_from_dir = ".";
+ $copy_from_file = $copy_from;
+ }
+
+ if ($copy_from_dir ne $dir && !-e "$dir/$copy_from_file") {
+ system("cp $copy_from $dir")
+ && die "Couldn\'t \`cp $copy_from $dir\'\n";
+ }
+}
diff --git a/doc/tools/texi2www/texi2www.texi b/doc/tools/texi2www/texi2www.texi
new file mode 100644
index 0000000000..3a0f54d5a0
--- /dev/null
+++ b/doc/tools/texi2www/texi2www.texi
@@ -0,0 +1,708 @@
+\input texinfo @c -*-texinfo-*-
+
+@comment %**start of header
+@setfilename texi2www
+@settitle texi2www user's guide
+@setcontentsaftertitlepage
+@comment %**end of header
+
+@finalout
+
+@titlepage
+@title texi2www
+@author Tim Singletary
+@end titlepage
+
+@iftex
+@everyfooting @| Jan 2 1996
+@end iftex
+
+@comment ******************************************************** TOP
+@node Top,,,(dir)
+@ifhtml
+This document describes @var{texi2www}, a utility for converting
+texinfo to HTML.
+
+This document provides a pretty good example of @var{texi2www}'s texinfo
+to HTML conversion. @href{Click here,,,texi2wwwdoc.texi.txt} to view
+the texinfo source to this document.
+@end ifhtml
+
+@menu
+* Overview:: What is texi2www? texinfo? HTML? mosaic? WWW?
+* Real life:: A real-life example using texi2www
+* Invocation:: Command line args, etc.
+* Extensions:: @@ commands not in GNU texinfo
+* Known Bugs:: Oops!
+* Demo:: What various things look like
+
+* texi2dvi::
+
+* Index::
+@end menu
+
+@ifhtml
+@today{}.
+@end ifhtml
+
+
+@comment **************************************************** CHAPTER
+@node Overview
+@unnumbered Overview
+@cindex What is HTML
+@cindex What is texinfo
+@cindex What is mosaic
+@cindex texi2html
+@cindex info2html
+@cindex Other texinfo to HTML converters
+
+@var{Texi2www} converts texinfo to HTML:
+
+@table @asis
+@item
+@table @asis
+@item texinfo
+A documentation system that uses a single source file to produce both
+on-line documentation and printed output. For details see
+@ref{Top,the Texinfo User's Guide,Overview,texinfo,The Texinfo User's Guide}.
+@item HTML
+@href{HyperText Markup Language,,,
+http://www.ncsa.uiuc.edu/General/Internet/WWW/HTMLPrimer.html}
+used in World Wide Web documents. Programs like mosaic
+understand HTML.
+@end table
+@end table
+
+Texinfo's on-line documentation viewers (emacs, info, xinfo, etc.) are
+quite limited when compared to mosaic. Mosaic supports multiple fonts,
+variable width fonts, embedded images, and hypertext links to anywhere
+(not just to other texinfo documents). In addition, mosaic keeps a
+history of nodes visited and can easily go back to previously visited
+nodes.
+
+@var{Texinfo} converts @var{texinfo} directly to @var{HTML} without
+going through an intermediate @var{info} conversion.
+
+Other @var{texinfo} to @var{HTML} converters include:
+
+@table @asis
+@item
+@href{@var{http://wwwcn.cern.ch/dci/texi2html/},,,
+ http://wwwcn.cern.ch/dci/texi2html/}; and
+@item
+@href{@var{http://www.ericsson.nl/info2www/info2www.html},,,
+ http://www.ericsson.nl/info2www/info2www.html}
+@end table
+
+Texi2html is very good, but is different from texi2www in several respects,
+including:
+
+@itemize
+@item Texi2www processes @@ifinfo blocks, whereas texi2html processes
+ @@iftex blocks.
+@item Texi2www always generates menus, whereas menu generation is
+ optional in texi2html.
+@item Texi2www generates a seperate document for each node, wherease
+ texi2html can combine several nodes into one document.
+@item Texi2www adds @href{@code{@@ifhtml} blocks,ifhtml blocks},
+ @href{@code{@@html} blocks,html blocks}, and @href{@code{@@href@{@}},
+ href}. Texi2html has @code{@@ifhtml} blocks, but they work like
+ texi2www's @code{@@html} blocks.
+@item Texi2www uses icons for the prev, up, and next links; texi2html
+ doesn't.
+@end itemize
+
+Texi2www is written in perl and may be used and distributed under the
+terms of the @href{GNU General Public License,Copying,emacs}.
+
+Texi2www was written by
+@href{Tim Singletary,,,
+http://sunland.gsfc.nasa.gov/personnel/aam/singletary.html}
+(@cite{tsingle@@sunland.gsfc.nasa.gov}) and is available at
+@href{@var{ftp://sunland.gsfc.nasa.gov/pub/tarfiles/texi2www.tgz},,,
+ftp://sunland.gsfc.nasa.gov/pub/tarfiles/texi2www.tgz}.
+
+@comment **************************************************** CHAPTER
+@node Real life
+@chapter A Real Life Example
+
+Here's how I used texi2www to set up a
+@href{directory of texinfo documents,,,
+ http://sunland.gsfc.nasa.gov/info/dir.html}.
+This discussion is the minimum I had to do to set up
+@href{texinfo,,,http://sunland.gsfc.nasa.gov/info/texinfo/Top.html} and
+texi2www.
+First, I created the directory ``@var{$HTDOCS/info}'' (@var{$HTDOCS} is
+the root directory of my web server).
+
+Then, I copied arrow icons ``@var{missing-arrow.gif}'',
+``@var{next-arrow.gif}'', ``@var{prev-arrow.gif}'', and
+``@var{up-arrow.gif}'' into ``@var{$HTDOCS/info}''.
+(I obtained my icons from
+@cite{Rutgers University Network Services} at
+@href{http://ns2.rutgers.edu/doc-images/buttons,,,
+ http://ns2.rutgers.edu/doc-images/buttons}.)
+
+Next, I created subdirectories ``@var{$HTDOCS/info/texinfo}'' and
+``@var{$HTDOCS/info/texi2wwwdoc}''.
+(I determined the names of these subdirectories by examining the
+``@var{@@setfilename}'' line in the texinfo files.
+files; @var{texi2wwwdoc.texi} contains the line
+``@var{@@setfilename texi2wwwdoc.info}'' and @var{texinfo.texi} contains
+``@var{@@setfilename texinfo.info}''.
+
+Next, I copied the texinfo files into the appropriate directories. This
+step isn't strictly required, but I think its a good idea since it makes
+it simple to keep track of which texinfo files generated which set of
+html documents.
+
+Then I generated the html documents. I used the commands:
+@example
+> cd $HTDOCS/info/texinfo
+> texi2www texinfo.texi
+Normal completion.
+> cd ../texi2wwwdoc
+> texi2www texi2wwwdoc.texi
+Normal completion.
+@end example
+Examing these directories shows that a bunch of @var{.html} files got
+generated, including, in each directory, ``@var{Top.html}''.
+
+Finally, I created a table of contents file
+``@var{$HTDOCS/info/dir.html}''. The first version of that file looked
+like:
+
+@example
+<HTML>
+<HEAD><TITLE>info directory table of contents</TITLE></HEAD>
+<BODY>
+<MENU>
+<LI><A HREF="texinfo/Top.html">texinfo</A>
+ GNU texinfo version 3.1
+<LI><A HREF="texi2wwwdoc/Top.html">texi2www</A>
+ Converts texinfo to html
+</MENU>
+</BODY></HTML>
+@end example
+
+@comment **************************************************** CHAPTER
+@node Invocation
+@chapter Invocation
+@cindex Command line options
+@cindex Obtaining gif files
+
+@unnumberedsec Synopsys
+
+@code{texi2www [options] texinfo-file}
+
+@unnumberedsec Options
+@table @asis
+
+@item @code{-dir} @var{path}
+ Specifies the path to the directory where the
+ generated files get placed. If not specified, the current
+ directory is assumed.
+
+@item @code{-footer} @var{file}
+ Specifies a file whose contents get
+ appended at the bottom of each generated HTML file. Typically
+ looks something like:
+
+@example
+<HR>
+<P>Back to our <A HREF="../../homepage.html">home page</A>.</P>
+@end example
+
+@item @code{-icons} @var{path}
+ Specifies the path (relative to the directory where the generated
+ files get placed) to the arrow files. If not specified, @file{..}
+ is assumed. The names of the arrow
+ files are @file{up_arrow.gif}, @file{left_arrow.gif},
+ @file{right_arrow.gif}, and @file{missing_arrow.gif}
+
+@end table
+
+@unnumberedsec Directory structure
+
+Texi2www will generate a set of HTML files from each texinfo document;
+each set of HTML files must go in a seperate directory (why? one reason
+is because each set includes a file named @code{Top.html}!).
+
+These directories should be subdirectories of the same base directory.
+Assume the base directory is @code{$TEXIBASE}. Then HTML files for
+emacs go in directory @code{$TEXIBASE/emacs}, HTML files for texinfo go
+in @code{$TEXIBASE/texinfo}, etc, where the name of the subdirectory is
+the same as the name of the info file (so cross references between
+documents will work).
+
+In addition to the subdirectories of HTML files, @code{$TEXIBASE}
+contains a file @code{dir.html} and the four arrow gif files
+@code{up_arrow.gif}, @code{left_arrow.gif}, @code{right_arrow.gif}, and
+@code{missing_arrow.gif}.
+
+@code{$TEXIBASE/dir.html} is typically just a menu of links to the
+subdirectories and can be as simple as
+
+@example
+<HTML><HEAD><TITLE>dir</TITLE></HEAD>
+<BODY>
+<MENU>
+<LI><A HREF="emacs/Top.html">emacs</A>
+<LI><A HREF="texinfo/Top.html">texinfo</A>
+</MENU>
+</BODY></HTML>
+@end example
+
+(@code{$TEXIBASE/dir.html} is not generated via texi2www and must be
+created by hand).
+
+
+
+@comment **************************************************** CHAPTER
+@node Extensions
+@chapter Extensions
+@ifhtml
+Texi2www understands the following extensions to pure texinfo:
+@end ifhtml
+@menu
+* ifhtml blocks:: @code{@@ifhtml} and @code{@@end ifhtml}
+* html blocks:: @code{@@html} and @code{@@end html}
+* href:: @code{@@href@{text,node,file,URL@}}
+* gif:: @code{@@gif@{gif-file@}}
+@end menu
+
+@comment ******************************************************* NODE
+@comment Top -> Extensions ->
+@node ifhtml blocks
+@section @code{@@ifhtml} and @code{@@end ifhtml}
+@cindex Conditional HTML blocks
+
+@var{@@ifhtml} blocks are similar to @var{@@ifinfo} and @var{@@iftex}
+blocks. Lines between @var{@@ifhtml} and @var{@@end ifhtml} get
+processed when generating the hypertext manual but get ignored when
+generating the printed manual.
+
+@var{texinfo.tex} (in @var{/usr/local/lib/tex/macros} on my machine)
+needs to be modified in order to use @@ifhtml. I inserted
+@example
+\def\ifhtml@{\doignore@{ifhtml@}@}
+@end example
+after the @code{\def\ifinfo@{\doignore@{ifinfo@}@}} line (line
+596 ???).
+
+In most cases, it is better to use @var{@@ifinfo} than @var{@@ifhtml}.
+
+@comment ******************************************************* NODE
+@node html blocks
+@section @code{@@html} and @code{@@end html}
+@cindex Pure HTML blocks
+
+@var{@@html} blocks are similar to @var{@@tex} blocks; @var{@@html}
+blocks only get processed when generating HTML and lines within
+@var{@@html} blocks may contain HTML commands.
+
+@ifhtml
+For example,
+
+@example
+@@html
+produces <EM>&lt;EM&gt;</EM> in HTML is like @@var@{@@@@var@} in texinfo.
+@@end html
+@end example
+
+@html
+produces <EM>&lt;EM&gt;</EM> in HTML is like @var{@@var} in texinfo.
+@end html
+@end ifhtml
+
+@var{texinfo.tex} (in @var{/usr/local/lib/tex/macros} on my machine)
+needs to be modified in order to use @@ifhtml. I inserted
+@example
+\def\html@{\doignore@{html@}@}
+@end example
+after the @code{\def\ifinfo@{\doignore@{ifinfo@}@}} line (line
+596 ???).
+
+@comment ******************************************************* NODE
+@node href
+@section @code{@@href@{text,node,file,URL@}}
+
+Use @code{@@href@{text,node,file,URL@}} when you want a hypertext link in an
+HTML document and plain text everywhere else.
+
+@var{Text} is the text you want displayed in the document.
+@var{Node},@var{file}, and @var{URL} indicate what @var{text} is linked to.
+@var{Node} and @var{file} are a normal texinfo style node reference;
+@var{URL} is a HTML URL.
+One of @var{node} or @var{URL} must be specified (if both are specified,
+@var{URL} is used).
+
+The @href{texinfo source used to create this
+document,,,texi2wwwdoc.texi.txt} contains numerous examples of how
+@@href might be used.
+
+@var{texinfo.tex} (in @var{/usr/local/lib/tex/macros} on my machine)
+needs to be modified in order to use @@href@{@}. All I did was insert
+@example
+\def\href#1{\hrefX[#1,,,]}
+\def\hrefX[#1,#2,#3,#4]{#1}
+@end example
+before the @code{\def\pxref} line (line 3497 ???).
+
+@comment ******************************************************* NODE
+@node gif
+@section @code{@@gif@{@var{pict.gif}@}}
+
+This extension provides a method for inserting a gif file in both the
+html and printed document. For example, here are my arrow icons:
+@*
+prev: @gif{prev-arrow.gif},
+up: @gif{up-arrow.gif},
+and next: @gif{next-arrow.gif}
+
+@subsection @code{@@gif@{@}} and @var{texi2www}
+
+@var{texi2www} copies @var{pict.gif} to the destination directory.
+
+@subsection @code{@@gif@{@}} and @var{texi2dvi}
+
+@href{@var{texi2dvi},texi2dvi} converts @var{pict.gif} to a font and
+uses this font to insert the picture in the document. This conversion
+to a font requires that the pbmplus and bm2font utilities be installed on
+your system:
+
+@table @asis
+@item pbmplus
+ A suite of utilities for manipulating images. @var{texi2dvi} uses
+ @var{giftopnm}, @var{pnmscale}, @var{pnmnlfilt}, @var{ppmquant},
+ and @var{ppmtogif}. These utilities can be obtained from
+ @href{@code{
+ <ftp://ftp.x.org/contrib/utilities/netpbm-1mar1994.tar.gz>},,,
+ ftp://ftp.x.org/contrib/utilities/netpbm-1mar1994.tar.gz}.
+
+
+@item bm2font
+ @var{bm2font} converts a bitmap images (including ``@code{.gif}''
+ images) to a font that can be used in a @TeX{} document.
+ @var{bm2font} can be obtained from
+ @href{@code{<ftp://ftp.shsu.edu/tex-archive/graphics/bm2font.tar.gz>},,,
+ ftp://ftp.shsu.edu/tex-archive/graphics/bm2font.tar.gz}.
+@end table
+
+@comment **************************************************** CHAPTER
+@node Known Bugs
+@chapter Known Bugs
+
+@enumerate
+
+@item The @href{@code{@@center},titlefont center sp,texinfo} command
+ doesn't work since HTML doesn't support centering yet.
+
+@item The @href{@code{@@noindent},noindent,texinfo} and
+ @href{@code{@@exdent},exdent,texinfo} commands don't work since
+ HTML doesn't include any facility to control indentation.
+
+@item Mark specifications in the @href{@code{@@itemize},itemize,texinfo}
+ command are ignored since HTML doesn't include any facility to
+ specify the tag in itemized lists.
+
+@item The @href{emacs texinfo files need to be tweaked,
+ problems with emacs} to work with @var{texi2www}.
+
+@item One @href{@code{@@gif},gif} command is allowed per line.
+
+@end enumerate
+
+@unnumberedsec Fixed Bugs
+
+@enumerate
+
+@item Previous versions didn't handle nested tables correctly. The
+ @@item following an inner @@table would be drawn in the wrong
+ font. @var{(tsingle, Jan 2 1996)}
+
+@item Previous versions didn't capitalize
+ @href{@code{@@sc@{@}},Smallcaps,texinfo} text. (There's still
+ the problem of HTML not supporting true smallcaps, however).
+ @var{(tsingle, Sep 6 1995)}
+
+@item Previous versions of @var{texi2www} didn't correctly index
+ @href{@code{@@ftable} and @code{@@vtable},ftable vtable,texinfo}
+ items; this bug has been fixed! @var{(tsingle, Aug 17 1995)}
+
+@end enumerate
+
+@node problems with emacs
+@section emacs.texi @result{} HTML problems
+
+The file @var{man/commands.texi} distributed with GNU Emacs version
+version 19.25 contains, near the top of the file:
+
+@example
+@@c See file emacs.texi for copying conditions.
+@@iftex
+@@chapter Characters, Keys and Commands
+
+ This chapter explains the character set used by Emacs for input commands
+and for the contents of files, and also explains the concepts of
+@@dfn@{keys@} and @@dfn@{commands@} which are necessary for understanding how
+your keyboard input is understood by Emacs.
+@@end iftex
+@@node User Input, Keys, Screen, Top
+@@section Keyboard Input
+@end example
+
+Texi2www doesn't see the @@chapter since it's inside an @@iftex block;
+this confuses texi2www's chapter numbering. My fix was to change this
+section to:
+
+@example
+@@c See file emacs.texi for copying conditions.
+@@node User Input, Keys, Screen, Top
+@@chapter Characters, Keys and Commands
+@@iftex
+
+ This chapter explains the character set used by Emacs for input commands
+and for the contents of files, and also explains the concepts of
+@@dfn@{keys@} and @@dfn@{commands@} which are necessary for understanding how
+your keyboard input is understood by Emacs.
+@@end iftex
+@@section Keyboard Input
+@end example
+
+@var{killing.texi}, @var{misc.texi}, and @var{trouble.texi} have similar
+problems.
+
+@comment **************************************************** CHAPTER
+@node Demo
+@appendix Sample output
+
+This document itself is a pretty good example of what texi2www supports
+and produces. Following are some examples to really make things clear;
+to fully appreciate these examples compare the source and printed output
+to your html viewer.
+
+@menu
+* Fonts:: @@var@{@}, etc.
+* Glyphs:: @@result@{@}, etc.
+* Blocks:: @@example ... @@end example, etc.
+* Tables and Lists:: @@table .. @@end table, etc.
+@end menu
+
+@comment **************************************************** SECTION
+@node Fonts
+@unnumberedsec Text markup
+
+Texi2www supports:
+
+@table @asis
+
+@item @@b@{@var{bold text}@} @result{} @b{bold text}
+Here is @b{some text} in the @@b font.
+
+@item @@cite@{@var{reference}@} @result{} @cite{reference}
+Indicate the name of a book.
+Here is @cite{some text} in the @@cite font.
+
+@item @@code@{@var{sample-code}@} @result{} @code{sample-code}
+Indicate text that is a literal example of a piece of a program.
+Here is @code{some text} in the @@code font.
+
+@item @@dfn@{@var{term}@} @result{} @dfn{term}
+Indicate the introductory or defining use of a term.
+Here is @dfn{some text} in the @@dfn font.
+
+@item @@dmn@{@var{text}@} @result{} @dmn{text}
+Here is @dmn{some text} in the @@dmn font.
+
+@item @@emph@{@var{text}@} @result{} @emph{text}
+Here is @emph{some text} in the @@emph font.
+
+@item @@file@{@var{file-name}@} @result{} @file{file-name}
+Indicate the name of a file.
+Here is @file{some text} in the @@file font.
+
+@item @@i@{@var{italic text}@} @result{} @i{italic text}
+Here is @i{some text} in the @@i font.
+
+@item @@kbd@{@var{keyboard-characters}@} @result{} @kbd{keyboard-characters}
+Indicate keyboard input.
+Here is @kbd{some text} in the @@kbd font.
+
+@item @@key@{@var{key-name}@} @result{} @key{key-name}
+Indicate the conventional name for a key on a keyboard.
+Here is @key{some text} in the @@key font.
+
+@item @@math@{@var{ax^2+b}@} @result{} @math{ax^2+b}
+Here is @r{some text} in the @@math font.
+
+@item @@r@{@var{roman font text}@} @result{} @r{roman font text}
+Here is @r{some text} in the @@r font.
+
+@item @@samp@{@var{text}@} @result{} @samp{text}
+Indicate text that is a literal example of a sequence of characters.
+Here is @samp{some text} in the @@samp font.
+
+@item @@sc@{@var{text}@} @result{} @sc{text}
+Here is @sc{some text} in the @@sc font.
+
+@item @@strong@{@var{text}@} @result{} @strong{text}
+Here is @strong{some text} in the @@strong font.
+
+@item @@t@{@var{fixed-width text}@} @result{} @t{fixed-width text}
+Here is @t{some text} in the @@t font.
+
+@item @@titlefont@{@var{text}@} @result{} @titlefont{text}
+Here is @titlefont{some text} in the @@titlefont font.
+
+@item @@var@{@var{metasyntactic-variable}@} @result{} @var{metasyntactic-variable}
+Indicate a metasyntactic variable.
+Here is @var{some text} in the @@var font.
+
+@end table
+
+
+@comment **************************************************** SECTION
+@node Glyphs
+@unnumberedsec Glyphs
+
+@table @asis
+
+@item @@TeX@{@} @result{} @TeX{}
+@item @@bullet@{@} @result{} @bullet{}
+@item @@copyright@{@} @result{} @copyright{}
+@item @@dots@{@} @result{} @dots{}
+@item @@equiv@{@} @result{} @equiv{}
+@item @@error@{@} @result{} @error{}
+@item @@expansion@{@} @result{} @expansion{}
+@item @@minus@{@} @result{} @minus{}
+@item @@point@{@} @result{} @point{}
+@item @@print@{@} @result{} @print{}
+@item @@result@{@} @result{} @result{}
+@item @@today@{@} @result{} @today{}
+
+@end table
+
+@comment **************************************************** SECTION
+@node Blocks
+@unnumberedsec Blocks
+
+@example
+@cartouche
+@@example
+@@cartouche
+Here's two lines
+of text
+@@end cartouche
+@@end example
+@end cartouche
+@end example
+
+@display
+@@display
+Here's two lines
+of text
+@@end display
+@end display
+
+@example
+@@example
+Here's two lines
+of text
+@@end example
+@end example
+
+@format
+@@format
+Here's two lines
+of text
+@@end format
+@end format
+
+@lisp
+@@lisp
+Here's two lines
+of text
+@@end lisp
+@end lisp
+
+@quotation
+@@quotation
+Here's two lines
+of text
+@@end quotation
+@end quotation
+
+@smallexample
+@@smallexample
+Here's two lines
+of text
+@@end smallexample
+@end smallexample
+
+@comment **************************************************** SECTION
+@node Tables and Lists
+@unnumberedsec Tables and Lists
+
+@example
+@@table @@code
+@@item code-one
+@@table @@var
+@@item var-one
+@@table @@samp
+@@item samp-one
+Hmmm.
+@@item samp-two
+Mmmmh.
+@@end table
+@@item var-two
+Huh?
+@@end table
+@@item code-two
+Duh?
+@@end table
+@end example
+
+@table @code
+@item code-one
+@table @var
+@item var-one
+@table @samp
+@item samp-one
+Hmmm.
+@item samp-two
+Mmmmh.
+@end table
+@item var-two
+Huh?
+@end table
+@item code-two
+Duh?
+@end table
+
+
+@comment **************************************************** CHAPTER
+@node texi2dvi
+@appendix texi2dvi & texinfo.tex
+
+Versions of ``@code{texi2dvi}'' and ``@code{texinfo.tex}'' are included
+with this package. These are compatible with the
+@href{texi2www extensions,Extensions}.
+
+@appendixsec texi2dvi
+
+@appendixsec texinfo.tex
+
+``@code{texinfo.tex}'' is a @TeX{} macro used during the @var{texinfo}
+@result{} @var{dvi} conversion.
+
+
+
+
+@comment **************************************************** CHAPTER
+@node Index
+@unnumbered Index
+@printindex cp
+
+@contents
+@bye
diff --git a/doc/tools/texi2www/up-arrow.gif b/doc/tools/texi2www/up-arrow.gif
new file mode 100644
index 0000000000..82aa8ccc68
--- /dev/null
+++ b/doc/tools/texi2www/up-arrow.gif
Binary files differ
diff --git a/doc/tools/word-replace2 b/doc/tools/word-replace2
new file mode 100644
index 0000000000..b9e8f6c664
--- /dev/null
+++ b/doc/tools/word-replace2
@@ -0,0 +1,101 @@
+#!/usr/bin/perl
+#
+# $Id$
+#
+
+eval "exec /usr/local/bin/perl -S $0 $*"
+ if $running_under_some_shell;
+
+require 'getopts.pl';
+&Getopts("p:vh"); # help, pattern file, verbose,
+
+if ($opt_h || ! $opt_p) {
+ print STDERR <<NO_MORE_HELP;
+word-replace2
+
+ Replace *words* with patterns. Pattern file specifies which patterns
+ to replace on each line. All patterns are wrapped with perl \\b regexp
+ specifiers.
+
+Usage: $0 [-v] -p pattern-file files to replace
+
+ -v -- possibly more verbose
+ -p file -- pattern file
+ -h -- help
+
+ anything else == this help message
+
+Pattern file looks like this:
+
+# Example:
+# ignores all lines with beginning with # or not exactly 2 fields
+_Dorky_Name rtems_dorky_name # comments, and blank lines are cool
+_Dorky_Name2 rtems_dorky_name2 # comments, and blank lines are cool
+NO_MORE_HELP
+ exit 0;
+}
+
+$verbose = $opt_v;
+$pattern_file = $opt_p;
+
+# make standard outputs unbuffered (so the '.'s come out ok)
+$oldfh = select(STDERR); $| = 1; select($oldfh);
+$oldfh = select(STDOUT); $| = 1; select($oldfh);
+
+# pull in the patterns
+open(PATTERNS, "<$pattern_file") ||
+ die "could not open $pattern_file: $!, crapped out at";
+
+
+
+foreach (<PATTERNS>)
+{
+ chop;
+ s/#.*//;
+ next if /^$/;
+ ($orig, $new, $junk, @rest) = split;
+ next if ( ! $orig || ! $new || $junk); # <2 or >2 patterns
+ die "pattern appears 2x: '$orig' in '$pattern_file'--" if defined($patterns{$orig});
+ $patterns{$orig} = $new;
+}
+close PATTERNS;
+# walk thru each line in each file
+
+$infile = '-' ;
+$outfile = '-' ;
+
+if ( $#ARGV > -1 )
+{
+ $infile = "@ARGV[0]" ;
+ shift @ARGV ;
+}
+
+if ( $#ARGV > -1 )
+{
+ $outfile = "@ARGV[0]" ;
+ shift @ARGV ;
+}
+
+open (INFILE, "<$infile") ||
+ die "could not open input file $infile: $!";
+$line = join('',<INFILE>) ;
+close INFILE;
+
+
+print STDERR "$outfile\t";
+
+open (OUTFILE, ">$outfile") ||
+ die "could not open output file $outfile: $!";
+
+foreach $key (keys %patterns)
+{
+ if ( $line =~ s/\b$key\b/$patterns{$key}/ge )
+ {
+ print STDERR "." ;
+ }
+}
+
+print OUTFILE $line ;
+
+print STDERR "\n";
+close OUTFILE;
diff --git a/doc/user/.cvsignore b/doc/user/.cvsignore
new file mode 100644
index 0000000000..5ebbd7c65d
--- /dev/null
+++ b/doc/user/.cvsignore
@@ -0,0 +1,51 @@
+bsp.texi
+clock.texi
+concepts.texi
+conf.texi
+c_user
+c_user-?
+c_user-??
+c_user.aux
+c_user.cp
+c_user.cps
+c_user.dvi
+c_user.fn
+c_user.fns
+c_user*.html
+c_user.ky
+c_user.log
+c_user.pdf
+c_user.pg
+c_user.ps
+c_user.toc
+c_user.tp
+c_user.vr
+datatypes.texi
+dpmem.texi
+event.texi
+fatal.texi
+index.html
+init.texi
+intr.texi
+io.texi
+Makefile
+Makefile.in
+mdate-sh
+mp.texi
+msg.texi
+overview.texi
+part.texi
+region.texi
+rtems_footer.html
+rtems_header.html
+rtemspie.pdf
+rtmon.texi
+schedule.texi
+sem.texi
+signal.texi
+stamp-vti
+states.pdf
+task.texi
+timer.texi
+userext.texi
+version.texi
diff --git a/doc/user/Makefile.am b/doc/user/Makefile.am
new file mode 100644
index 0000000000..1869ef34b1
--- /dev/null
+++ b/doc/user/Makefile.am
@@ -0,0 +1,166 @@
+#
+# COPYRIGHT (c) 1988-2002.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT = c_user
+EDITION = 1
+
+include $(top_srcdir)/project.am
+include $(top_srcdir)/main.am
+
+FILES = bsp.texi dirstat.texi example.texi glossary.texi preface.texi
+
+GENERATED_FILES = overview.texi concepts.texi datatypes.texi init.texi \
+ task.texi intr.texi clock.texi timer.texi sem.texi msg.texi event.texi \
+ signal.texi part.texi region.texi dpmem.texi io.texi fatal.texi \
+ schedule.texi rtmon.texi bsp.texi userext.texi conf.texi mp.texi
+
+COMMON_FILES += $(top_srcdir)/common/cpright.texi
+
+info_TEXINFOS = c_user.texi
+c_user_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+PNG_FILES = rtemsarc.png rtemspie.png states.png
+
+EPS_IMAGES = rtemspie.eps states.eps
+$(PROJECT).dvi: $(EPS_IMAGES)
+
+PDF_IMAGES = rtemspie.pdf states.pdf
+CLEANFILES += $(PDF_IMAGES)
+
+if USE_HTML
+html_project_DATA += $(PNG_FILES)
+endif
+
+overview.texi: overview.t
+ $(BMENU2) -p "Preface" \
+ -u "Top" \
+ -n "Key Concepts" < $< > $@
+
+concepts.texi: concepts.t
+ $(BMENU2) -p "Overview Manual Organization" \
+ -u "Top" \
+ -n "RTEMS Data Types" < $< > $@
+
+datatypes.texi: datatypes.t
+ $(BMENU2) -p "Key Concepts Memory Management" \
+ -u "Top" \
+ -n "Initialization Manager" < $< > $@
+
+init.texi: init.t
+ $(BMENU2) -p "RTEMS Data Types List of Data Types" \
+ -u "Top" \
+ -n "Task Manager" < $< > $@
+
+task.texi: task.t
+ $(BMENU2) -p "Initialization Manager SHUTDOWN_EXECUTIVE - Shutdown RTEMS" \
+ -u "Top" \
+ -n "Interrupt Manager" < $< > $@
+
+intr.texi: intr.t
+ $(BMENU2) -p "Task Manager TASK_VARIABLE_DELETE - Remove per task variable" \
+ -u "Top" \
+ -n "Clock Manager" < $< > $@
+
+clock.texi: clock.t
+ $(BMENU2) \
+ -p "Interrupt Manager INTERRUPT_IS_IN_PROGRESS - Is an ISR in Progress" \
+ -u "Top" \
+ -n "Timer Manager" < $< > $@
+
+timer.texi: timer.t
+ $(BMENU2) -p "Clock Manager CLOCK_TICK - Announce a clock tick" \
+ -u "Top" \
+ -n "Semaphore Manager" < $< > $@
+
+sem.texi: sem.t
+ $(BMENU2) -p "Timer Manager TIMER_RESET - Reset an interval timer" \
+ -u "Top" \
+ -n "Message Manager" < $< > $@
+
+msg.texi: msg.t
+ $(BMENU2) -p "Semaphore Manager SEMAPHORE_FLUSH - Unblock all tasks waiting on a semaphore" \
+ -u "Top" \
+ -n "Event Manager" < $< > $@
+
+event.texi: event.t
+ $(BMENU2) \
+ -p "Message Manager MESSAGE_QUEUE_FLUSH - Flush all messages on a queue" \
+ -u "Top" \
+ -n "Signal Manager" < $< > $@
+
+signal.texi: signal.t
+ $(BMENU2) -p "Event Manager EVENT_RECEIVE - Receive event condition" \
+ -u "Top" \
+ -n "Partition Manager" < $< > $@
+
+part.texi: part.t
+ $(BMENU2) -p "Signal Manager SIGNAL_SEND - Send signal set to a task" \
+ -u "Top" \
+ -n "Region Manager" < $< > $@
+
+region.texi: region.t
+ $(BMENU2) \
+-p "Partition Manager PARTITION_RETURN_BUFFER - Return buffer to a partition" \
+ -u "Top" \
+ -n "Dual-Ported Memory Manager" < $< > $@
+
+dpmem.texi: dpmem.t
+ $(BMENU2) \
+ -p "Region Manager REGION_GET_SEGMENT_SIZE - Obtain size of a segment" \
+ -u "Top" \
+ -n "I/O Manager" < $< > $@
+
+io.texi: io.t
+ $(BMENU2) -p "Dual-Ported Memory Manager PORT_INTERNAL_TO_EXTERNAL - Convert internal to external address" \
+ -u "Top" \
+ -n "Fatal Error Manager" < $< > $@
+
+fatal.texi: fatal.t
+ $(BMENU2) -p "I/O Manager IO_CONTROL - Special device services" \
+ -u "Top" \
+ -n "Scheduling Concepts" < $< > $@
+
+schedule.texi: schedule.t
+ $(BMENU2) \
+-p "Fatal Error Manager FATAL_ERROR_OCCURRED - Invoke the fatal error handler" \
+ -u "Top" \
+ -n "Rate Monotonic Manager" < $< > $@
+
+rtmon.texi: rtmon.t
+ $(BMENU2) -p "Scheduling Concepts Task State Transitions" \
+ -u "Top" \
+ -n "Board Support Packages" < $< > $@
+
+bsp.texi: bsp.t
+ $(BMENU2) -p "Rate Monotonic Manager RATE_MONOTONIC_GET_STATUS - Obtain status information on period" \
+ -u "Top" \
+ -n "User Extensions Manager" < $< > $@
+
+userext.texi: userext.t
+ $(BMENU2) -p "Board Support Packages Heterogeneous Systems" \
+ -u "Top" \
+ -n "Configuring a System" < $< > $@
+
+conf.texi: conf.t
+ $(BMENU2) -p "User Extensions Manager EXTENSION_DELETE - Delete a extension set" \
+ -u "Top" \
+ -n "Multiprocessing Manager" < $< > $@
+
+mp.texi: mp.t
+ $(BMENU2) -p "Configuring a System Sizing the RTEMS RAM Workspace" \
+ -u "Top" \
+ -n "Directive Status Codes" < $< > $@
+
+noinst_DATA = states.gif rtemspie.gif
+
+EXTRA_DIST = bsp.t concepts.t clock.t datatypes.t conf.t dpmem.t event.t \
+ fatal.t init.t intr.t io.t mp.t msg.t overview.t part.t region.t rtmon.t \
+ sem.t schedule.t signal.t task.t timer.t userext.t $(PNG_FILES) \
+ $(EPS_IMAGES) $(noinst_DATA)
+
+CLEANFILES += c_user.info c_user.info-? c_user.info-??
diff --git a/doc/user/bsp.t b/doc/user/bsp.t
new file mode 100644
index 0000000000..e0b0434d12
--- /dev/null
+++ b/doc/user/bsp.t
@@ -0,0 +1,318 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Board Support Packages
+
+@cindex Board Support Packages
+@cindex BSPs
+
+@section Introduction
+
+@cindex BSP, definition
+
+A board support package (BSP) is a collection of
+user-provided facilities which interface RTEMS and an
+application with a specific hardware platform. These facilities
+may include hardware initialization, device drivers, user
+extensions, and a Multiprocessor Communications Interface
+(MPCI). However, a minimal BSP need only support processor
+reset and initialization and, if needed, a clock tick.
+
+@section Reset and Initialization
+
+An RTEMS based application is initiated or
+re-initiated when the processor is reset. This initialization
+code is responsible for preparing the target platform for the
+RTEMS application. Although the exact actions performed by the
+initialization code are highly processor and target dependent,
+the logical functionality of these actions are similar across a
+variety of processors and target platforms.
+
+Normally, the application's initialization is
+performed at two separate times: before the call to
+@code{@value{DIRPREFIX}initialize_executive}
+(reset application initialization) and
+after @code{@value{DIRPREFIX}initialize_executive}
+in the user's initialization tasks
+(local and global application initialization). The order of the
+startup procedure is as follows:
+
+@enumerate
+@item Reset application initialization.
+@item Call to @code{@value{DIRPREFIX}initialize_executive}
+@item Local and global application initialization.
+@end enumerate
+
+The reset application initialization code is executed
+first when the processor is reset. All of the hardware must be
+initialized to a quiescent state by this software before
+initializing RTEMS. When in quiescent state, devices do not
+generate any interrupts or require any servicing by the
+application. Some of the hardware components may be initialized
+in this code as well as any application initialization that does
+not involve calls to RTEMS directives.
+
+The processor's Interrupt Vector Table which will be
+used by the application may need to be set to the required value
+by the reset application initialization code. Because
+interrupts are enabled automatically by RTEMS as part of the
+@code{@value{DIRPREFIX}initialize_executive} directive,
+the Interrupt Vector Table MUST
+be set before this directive is invoked to insure correct
+interrupt vectoring. The processor's Interrupt Vector Table
+must be accessible by RTEMS as it will be modified by the
+@code{@value{DIRPREFIX}interrupt_catch} directive.
+On some CPUs, RTEMS installs it's
+own Interrupt Vector Table as part of initialization and thus
+these requirements are met automatically. The reset code which
+is executed before the call to @code{@value{DIRPREFIX}initialize_executive}
+has the following requirements:
+
+@itemize @bullet
+@item Must not make any RTEMS directive calls.
+
+@item If the processor supports multiple privilege levels,
+must leave the processor in the most privileged, or supervisory,
+state.
+
+@item Must allocate a stack of at least @code{@value{RPREFIX}MINIMUM_STACK_SIZE}
+bytes and initialize the stack pointer for the
+@code{@value{DIRPREFIX}initialize_executive} directive.
+
+@item Must initialize the processor's Interrupt Vector Table.
+
+@item Must disable all maskable interrupts.
+
+@item If the processor supports a separate interrupt stack,
+must allocate the interrupt stack and initialize the interrupt
+stack pointer.
+@end itemize
+
+The @code{@value{DIRPREFIX}initialize_executive} directive does not return to
+the initialization code, but causes the highest priority
+initialization task to begin execution. Initialization tasks
+are used to perform both local and global application
+initialization which is dependent on RTEMS facilities. The user
+initialization task facility is typically used to create the
+application's set of tasks.
+
+@subsection Interrupt Stack Requirements
+
+The worst-case stack usage by interrupt service
+routines must be taken into account when designing an
+application. If the processor supports interrupt nesting, the
+stack usage must include the deepest nest level. The worst-case
+stack usage must account for the following requirements:
+
+@itemize @bullet
+@item Processor's interrupt stack frame
+
+@item Processor's subroutine call stack frame
+
+@item RTEMS system calls
+
+@item Registers saved on stack
+
+@item Application subroutine calls
+@end itemize
+
+The size of the interrupt stack must be greater than
+or equal to the constant @code{@value{RPREFIX}MINIMUM_STACK_SIZE}.
+
+@subsection Processors with a Separate Interrupt Stack
+
+Some processors support a separate stack for
+interrupts. When an interrupt is vectored and the interrupt is
+not nested, the processor will automatically switch from the
+current stack to the interrupt stack. The size of this stack is
+based solely on the worst-case stack usage by interrupt service
+routines.
+
+The dedicated interrupt stack for the entire
+application is supplied and initialized by the reset and
+initialization code of the user's board support package. Since
+all ISRs use this stack, the stack size must take into account
+the worst case stack usage by any combination of nested ISRs.
+
+@subsection Processors without a Separate Interrupt Stack
+
+Some processors do not support a separate stack for
+interrupts. In this case, without special assistance every
+task's stack must include enough space to handle the task's
+worst-case stack usage as well as the worst-case interrupt stack
+usage. This is necessary because the worst-case interrupt
+nesting could occur while any task is executing.
+
+On many processors without dedicated hardware managed
+interrupt stacks, RTEMS manages a dedicated interrupt stack in
+software. If this capability is supported on a CPU, then it is
+logically equivalent to the processor supporting a separate
+interrupt stack in hardware.
+
+@section Device Drivers
+
+Device drivers consist of control software for
+special peripheral devices and provide a logical interface for
+the application developer. The RTEMS I/O manager provides
+directives which allow applications to access these device
+drivers in a consistent fashion. A Board Support Package may
+include device drivers to access the hardware on the target
+platform. These devices typically include serial and parallel
+ports, counter/timer peripherals, real-time clocks, disk
+interfaces, and network controllers.
+
+For more information on device drivers, refer to the
+I/O Manager chapter.
+
+@subsection Clock Tick Device Driver
+
+Most RTEMS applications will include a clock tick
+device driver which invokes the @code{@value{DIRPREFIX}clock_tick}
+directive at regular intervals. The clock tick is necessary if
+the application is to utilize timeslicing, the clock manager, the
+timer manager, the rate monotonic manager, or the timeout option on blocking
+directives.
+
+The clock tick is usually provided as an interrupt
+from a counter/timer or a real-time clock device. When a
+counter/timer is used to provide the clock tick, the device is
+typically programmed to operate in continuous mode. This mode
+selection causes the device to automatically reload the initial
+count and continue the countdown without programmer
+intervention. This reduces the overhead required to manipulate
+the counter/timer in the clock tick ISR and increases the
+accuracy of tick occurrences. The initial count can be based on
+the microseconds_per_tick field in the RTEMS Configuration
+Table. An alternate approach is to set the initial count for a
+fixed time period (such as one millisecond) and have the ISR
+invoke @code{@value{DIRPREFIX}clock_tick}
+on the microseconds_per_tick boundaries.
+Obviously, this can induce some error if the configured
+microseconds_per_tick is not evenly divisible by the chosen
+clock interrupt quantum.
+
+It is important to note that the interval between
+clock ticks directly impacts the granularity of RTEMS timing
+operations. In addition, the frequency of clock ticks is an
+important factor in the overall level of system overhead. A
+high clock tick frequency results in less processor time being
+available for task execution due to the increased number of
+clock tick ISRs.
+
+@section User Extensions
+
+RTEMS allows the application developer to augment
+selected features by invoking user-supplied extension routines
+when the following system events occur:
+
+@itemize @bullet
+@item Task creation
+@item Task initiation
+@item Task reinitiation
+@item Task deletion
+@item Task context switch
+@item Post task context switch
+@item Task begin
+@item Task exits
+@item Fatal error detection
+@end itemize
+
+User extensions can be used to implement a wide variety of
+functions including execution profiling, non-standard
+coprocessor support, debug support, and error detection and
+recovery. For example, the context of a non-standard numeric
+coprocessor may be maintained via the user extensions. In this
+example, the task creation and deletion extensions are
+responsible for allocating and deallocating the context area,
+the task initiation and reinitiation extensions would be
+responsible for priming the context area, and the task context
+switch extension would save and restore the context of the
+device.
+
+For more information on user extensions, refer to the
+User Extensions chapter.
+
+@section Multiprocessor Communications Interface (MPCI)
+
+RTEMS requires that an MPCI layer be provided when a
+multiple node application is developed. This MPCI layer must
+provide an efficient and reliable communications mechanism
+between the multiple nodes. Tasks on different nodes
+communicate and synchronize with one another via the MPCI. Each
+MPCI layer must be tailored to support the architecture of the
+target platform.
+
+For more information on the MPCI, refer to the
+Multiprocessing Manager chapter.
+
+@subsection Tightly-Coupled Systems
+
+A tightly-coupled system is a multiprocessor
+configuration in which the processors communicate solely via
+shared global memory. The MPCI can simply place the RTEMS
+packets in the shared memory space. The two primary
+considerations when designing an MPCI for a tightly-coupled
+system are data consistency and informing another node of a
+packet.
+
+The data consistency problem may be solved using
+atomic "test and set" operations to provide a "lock" in the
+shared memory. It is important to minimize the length of time
+any particular processor locks a shared data structure.
+
+The problem of informing another node of a packet can
+be addressed using one of two techniques. The first technique
+is to use an interprocessor interrupt capability to cause an
+interrupt on the receiving node. This technique requires that
+special support hardware be provided by either the processor
+itself or the target platform. The second technique is to have
+a node poll for arrival of packets. The drawback to this
+technique is the overhead associated with polling.
+
+@subsection Loosely-Coupled Systems
+
+A loosely-coupled system is a multiprocessor
+configuration in which the processors communicate via some type
+of communications link which is not shared global memory. The
+MPCI sends the RTEMS packets across the communications link to
+the destination node. The characteristics of the communications
+link vary widely and have a significant impact on the MPCI
+layer. For example, the bandwidth of the communications link
+has an obvious impact on the maximum MPCI throughput.
+
+The characteristics of a shared network, such as
+Ethernet, lend themselves to supporting an MPCI layer. These
+networks provide both the point-to-point and broadcast
+capabilities which are expected by RTEMS.
+
+@subsection Systems with Mixed Coupling
+
+A mixed-coupling system is a multiprocessor
+configuration in which the processors communicate via both
+shared memory and communications links. A unique characteristic
+of mixed-coupling systems is that a node may not have access to
+all communication methods. There may be multiple shared memory
+areas and communication links. Therefore, one of the primary
+functions of the MPCI layer is to efficiently route RTEMS
+packets between nodes. This routing may be based on numerous
+algorithms. In addition, the router may provide alternate
+communications paths in the event of an overload or a partial
+failure.
+
+@subsection Heterogeneous Systems
+
+Designing an MPCI layer for a heterogeneous system
+requires special considerations by the developer. RTEMS is
+designed to eliminate many of the problems associated with
+sharing data in a heterogeneous environment. The MPCI layer
+need only address the representation of thirty-two (32) bit
+unsigned quantities.
+
+For more information on supporting a heterogeneous
+system, refer the Supporting Heterogeneous Environments in the
+Multiprocessing Manager chapter.
diff --git a/doc/user/c_user.texi b/doc/user/c_user.texi
new file mode 100644
index 0000000000..4ade92d03d
--- /dev/null
+++ b/doc/user/c_user.texi
@@ -0,0 +1,165 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename c_user.info
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the C User's Guide
+@c
+
+@c Joel's Questions
+@c
+@c 1. Why does paragraphindent only impact makeinfo?
+@c 2. Why does paragraphindent show up in HTML?
+@c
+
+@include version.texi
+@include common/setup.texi
+@include common/rtems.texi
+
+@ifset use-ascii
+@dircategory RTEMS On-Line Manual
+@direntry
+* RTEMS C User: (c_user). The C User's Guide.
+@end direntry
+@end ifset
+
+@c @syncodeindex fn cp
+@c variable substitution info:
+@c
+@set is-C
+@clear is-Ada
+@set LANGUAGE C
+@set STRUCTURE structure
+@set ROUTINE function
+@set OR |
+@set RPREFIX RTEMS_
+@set DIRPREFIX rtems_
+@c the language is @value{LANGUAGE}
+@c NOTE: don't use underscore in the name
+@c
+
+@c
+@c Title Page Stuff
+@c
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage RTEMS Applications C User's Guide
+
+@setchapternewpage odd
+@settitle RTEMS C User's Guide
+@titlepage
+@finalout
+
+@title RTEMS C User's Guide
+@subtitle Edition @value{EDITION}, for RTEMS @value{VERSION}
+@sp 1
+@subtitle @value{UPDATED}
+@author On-Line Applications Research Corporation
+@page
+@include common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include preface.texi
+@include overview.texi
+@include concepts.texi
+@include datatypes.texi
+@include init.texi
+@include task.texi
+@include intr.texi
+@include clock.texi
+@include timer.texi
+@include sem.texi
+@include msg.texi
+@include event.texi
+@include signal.texi
+@include part.texi
+@include region.texi
+@include dpmem.texi
+@include io.texi
+@include fatal.texi
+@include schedule.texi
+@include rtmon.texi
+@include bsp.texi
+@include userext.texi
+@include conf.texi
+@include mp.texi
+@include dirstat.texi
+@include example.texi
+@include glossary.texi
+@ifinfo
+@node Top, Preface, (dir), (dir)
+@top c_user
+
+This is the online version of the RTEMS C User's Guide.
+
+@menu
+* Preface::
+* Overview::
+* Key Concepts::
+* RTEMS Data Types::
+* Initialization Manager::
+* Task Manager::
+* Interrupt Manager::
+* Clock Manager::
+* Timer Manager::
+* Semaphore Manager::
+* Message Manager::
+* Event Manager::
+* Signal Manager::
+* Partition Manager::
+* Region Manager::
+* Dual-Ported Memory Manager::
+* I/O Manager::
+* Fatal Error Manager::
+* Scheduling Concepts::
+* Rate Monotonic Manager::
+* Board Support Packages::
+* User Extensions Manager::
+* Configuring a System::
+* Multiprocessing Manager::
+* Directive Status Codes::
+* Example Application::
+* Glossary::
+* Command and Variable Index::
+* Concept Index::
+@end menu
+
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@node Command and Variable Index, Concept Index, Glossary, Top
+@unnumbered Command and Variable Index
+
+@printindex fn
+
+@c There are currently no Command and Variable Index entries.
+
+@node Concept Index, , Command and Variable Index, Top
+@unnumbered Concept Index
+
+@c There are currently no Concept Index entries.
+@printindex cp
+
+@contents
+@bye
+
diff --git a/doc/user/clock.t b/doc/user/clock.t
new file mode 100644
index 0000000000..24721ebe8c
--- /dev/null
+++ b/doc/user/clock.t
@@ -0,0 +1,438 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Clock Manager
+
+@cindex clock
+
+@section Introduction
+
+The clock manager provides support for time of day
+and other time related capabilities. The directives provided by
+the clock manager are:
+
+@itemize @bullet
+@item @code{@value{DIRPREFIX}clock_set} - Set system date and time
+@item @code{@value{DIRPREFIX}clock_get} - Get system date and time information
+@item @code{@value{DIRPREFIX}clock_tick} - Announce a clock tick
+@end itemize
+
+@section Background
+
+@subsection Required Support
+
+For the features provided by the clock manager to be
+utilized, periodic timer interrupts are required. Therefore, a
+real-time clock or hardware timer is necessary to create the
+timer interrupts. The @code{@value{DIRPREFIX}clock_tick}
+directive is normally called
+by the timer ISR to announce to RTEMS that a system clock tick
+has occurred. Elapsed time is measured in ticks. A tick is
+defined to be an integral number of microseconds which is
+specified by the user in the Configuration Table.
+
+@subsection Time and Date Data Structures
+
+The clock facilities of the clock manager operate
+upon calendar time. These directives utilize the following date
+and time @value{STRUCTURE} for the native time and date format:
+
+
+@ifset is-C
+@findex rtems_time_of_day
+@example
+struct rtems_tod_control @{
+ rtems_unsigned32 year; /* greater than 1987 */
+ rtems_unsigned32 month; /* 1 - 12 */
+ rtems_unsigned32 day; /* 1 - 31 */
+ rtems_unsigned32 hour; /* 0 - 23 */
+ rtems_unsigned32 minute; /* 0 - 59 */
+ rtems_unsigned32 second; /* 0 - 59 */
+ rtems_unsigned32 ticks; /* elapsed between seconds */
+@};
+
+typedef struct rtems_tod_control rtems_time_of_day;
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+type Time_Of_Day is
+ record
+ Year : RTEMS.Unsigned32; -- year, A.D.
+ Month : RTEMS.Unsigned32; -- month, 1 .. 12
+ Day : RTEMS.Unsigned32; -- day, 1 .. 31
+ Hour : RTEMS.Unsigned32; -- hour, 0 .. 23
+ Minute : RTEMS.Unsigned32; -- minute, 0 .. 59
+ Second : RTEMS.Unsigned32; -- second, 0 .. 59
+ Ticks : RTEMS.Unsigned32; -- elapsed ticks between seconds
+ end record;
+@end example
+@end ifset
+
+
+The native date and time format is the only format
+supported when setting the system date and time using the
+@code{@value{DIRPREFIX}clock_get} directive. Some applications
+expect to operate on a "UNIX-style" date and time data structure. The
+@code{@value{DIRPREFIX}clock_get} directive can optionally return
+the current date and time in the
+following @value{STRUCTURE}:
+
+@ifset is-C
+@example
+@group
+typedef struct @{
+ rtems_unsigned32 seconds; /* seconds since RTEMS epoch*/
+ rtems_unsigned32 microseconds; /* since last second */
+@} rtems_clock_time_value;
+@end group
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+type Clock_Time_Value is
+ record
+ Seconds : Unsigned32;
+ Microseconds : Unsigned32;
+ end record;
+@end example
+@end ifset
+
+The seconds field in this @value{STRUCTURE} is the number of
+seconds since the RTEMS epoch of January 1, 1988.
+
+@subsection Clock Tick and Timeslicing
+
+@cindex timeslicing
+
+Timeslicing is a task scheduling discipline in which
+tasks of equal priority are executed for a specific period of
+time before control of the CPU is passed to another task. It is
+also sometimes referred to as the automatic round-robin
+scheduling algorithm. The length of time allocated to each task
+is known as the quantum or timeslice.
+
+The system's timeslice is defined as an integral
+number of ticks, and is specified in the Configuration Table.
+The timeslice is defined for the entire system of tasks, but
+timeslicing is enabled and disabled on a per task basis.
+
+The @code{@value{DIRPREFIX}clock_tick}
+directive implements timeslicing by
+decrementing the running task's time-remaining counter when both
+timeslicing and preemption are enabled. If the task's timeslice
+has expired, then that task will be preempted if there exists a
+ready task of equal priority.
+
+@subsection Delays
+
+@cindex delays
+
+A sleep timer allows a task to delay for a given
+interval or up until a given time, and then wake and continue
+execution. This type of timer is created automatically by the
+@code{@value{DIRPREFIX}task_wake_after}
+and @code{@value{DIRPREFIX}task_wake_when} directives and, as a result,
+does not have an RTEMS ID. Once activated, a sleep timer cannot
+be explicitly deleted. Each task may activate one and only one
+sleep timer at a time.
+
+@subsection Timeouts
+
+@cindex timeouts
+
+Timeouts are a special type of timer automatically
+created when the timeout option is used on the
+@code{@value{DIRPREFIX}message_queue_receive},
+@code{@value{DIRPREFIX}event_receive},
+@code{@value{DIRPREFIX}semaphore_obtain} and
+@code{@value{DIRPREFIX}region_get_segment} directives.
+Each task may have one and only one timeout active at a time.
+When a timeout expires, it unblocks the task with a timeout status code.
+
+@section Operations
+
+@subsection Announcing a Tick
+
+RTEMS provides the @code{@value{DIRPREFIX}clock_tick} directive which is
+called from the user's real-time clock ISR to inform RTEMS that
+a tick has elapsed. The tick frequency value, defined in
+microseconds, is a configuration parameter found in the
+Configuration Table. RTEMS divides one million microseconds
+(one second) by the number of microseconds per tick to determine
+the number of calls to the
+@code{@value{DIRPREFIX}clock_tick} directive per second. The
+frequency of @code{@value{DIRPREFIX}clock_tick}
+calls determines the resolution
+(granularity) for all time dependent RTEMS actions. For
+example, calling @code{@value{DIRPREFIX}clock_tick}
+ten times per second yields a higher
+resolution than calling @code{@value{DIRPREFIX}clock_tick}
+two times per second. The @code{@value{DIRPREFIX}clock_tick}
+directive is responsible for maintaining both
+calendar time and the dynamic set of timers.
+
+@subsection Setting the Time
+
+The @code{@value{DIRPREFIX}clock_set} directive allows a task or an ISR to
+set the date and time maintained by RTEMS. If setting the date
+and time causes any outstanding timers to pass their deadline,
+then the expired timers will be fired during the invocation of
+the @code{@value{DIRPREFIX}clock_set} directive.
+
+@subsection Obtaining the Time
+
+The @code{@value{DIRPREFIX}clock_get} directive allows a task or an ISR to
+obtain the current date and time or date and time related
+information. The current date and time can be returned in
+either native or UNIX-style format. Additionally, the
+application can obtain date and time related information such as
+the number of seconds since the RTEMS epoch, the number of ticks
+since the executive was initialized, and the number of ticks per
+second. The information returned by the
+@code{@value{DIRPREFIX}clock_get} directive is
+dependent on the option selected by the caller. This
+is specified using one of the following constants
+associated with the enumerated type
+@code{@value{DIRPREFIX}clock_get_options}:
+
+@findex rtems_clock_get_options
+
+@itemize @bullet
+@item @code{@value{RPREFIX}CLOCK_GET_TOD} - obtain native style date and time
+
+@item @code{@value{RPREFIX}CLOCK_GET_TIME_VALUE} - obtain UNIX-style
+date and time
+
+@item @code{@value{RPREFIX}CLOCK_GET_TICKS_SINCE_BOOT} - obtain number of ticks
+since RTEMS was initialized
+
+@item @code{@value{RPREFIX}CLOCK_GET_SECONDS_SINCE_EPOCH} - obtain number
+of seconds since RTEMS epoch
+
+@item @code{@value{RPREFIX}CLOCK_GET_TICKS_PER_SECOND} - obtain number of clock
+ticks per second
+
+@end itemize
+
+Calendar time operations will return an error code if
+invoked before the date and time have been set.
+
+@section Directives
+
+This section details the clock manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@c
+@c
+@c
+@page
+@subsection CLOCK_SET - Set system date and time
+
+@subheading CALLING SEQUENCE:
+
+@cindex set the time of day
+
+@ifset is-C
+@findex rtems_clock_set
+@example
+rtems_status_code rtems_clock_set(
+ rtems_time_of_day *time_buffer
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Clock_Set (
+ Time_Buffer : in RTEMS.Time_Of_Day;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - date and time set successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{time_buffer} is NULL@*
+@code{@value{RPREFIX}INVALID_TIME_OF_DAY} - invalid time of day
+
+@subheading DESCRIPTION:
+
+This directive sets the system date and time. The
+date, time, and ticks in the time_buffer @value{STRUCTURE} are all
+range-checked, and an error is returned if any one is out of its
+valid range.
+
+@subheading NOTES:
+
+Years before 1988 are invalid.
+
+The system date and time are based on the configured
+tick rate (number of microseconds in a tick).
+
+Setting the time forward may cause a higher priority
+task, blocked waiting on a specific time, to be made ready. In
+this case, the calling task will be preempted after the next
+clock tick.
+
+Re-initializing RTEMS causes the system date and time
+to be reset to an uninitialized state. Another call to
+@code{@value{DIRPREFIX}clock_set} is required to re-initialize
+the system date and time to application specific specifications.
+
+@c
+@c
+@c
+@page
+@subsection CLOCK_GET - Get system date and time information
+
+@cindex obtain the time of day
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_clock_get
+@example
+rtems_status_code rtems_clock_get(
+ rtems_clock_get_options option,
+ void *time_buffer
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Clock_Get (
+ Option : in RTEMS.Clock_Get_Options;
+ Time_Buffer : in RTEMS.Address;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - current time obtained successfully@*
+@code{@value{RPREFIX}NOT_DEFINED} - system date and time is not set@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{time_buffer} is NULL
+
+@subheading DESCRIPTION:
+
+This directive obtains the system date and time. If
+the caller is attempting to obtain the date and time (i.e.
+option is set to either @code{@value{RPREFIX}CLOCK_GET_SECONDS_SINCE_EPOCH},
+@code{@value{RPREFIX}CLOCK_GET_TOD}, or
+@code{@value{RPREFIX}CLOCK_GET_TIME_VALUE}) and the date and time
+has not been set with a previous call to
+@code{@value{DIRPREFIX}clock_set}, then the
+@code{@value{RPREFIX}NOT_DEFINED} status code is returned.
+The caller can always obtain the number of ticks per second (option is
+@code{@value{RPREFIX}CLOCK_GET_TICKS_PER_SECOND}) and the number of
+ticks since the executive was initialized option is
+@code{@value{RPREFIX}CLOCK_GET_TICKS_SINCE_BOOT}).
+
+The @code{option} argument may taken on any value of the enumerated
+type @code{rtems_clock_get_options}. The data type expected for
+@code{time_buffer} is based on the value of @code{option} as
+indicated below:
+
+@findex rtems_clock_get_options
+@ifset is-C
+@itemize @bullet
+@item @code{@value{RPREFIX}CLOCK_GET_TOD} - (rtems_time_of_day *)
+
+@item @code{@value{RPREFIX}CLOCK_GET_TIME_VALUE} - (rtems_clock_time_value *)
+
+@item @code{@value{RPREFIX}CLOCK_GET_TICKS_SINCE_BOOT} - (rtems_interval *)
+
+@item @code{@value{RPREFIX}CLOCK_GET_SECONDS_SINCE_EPOCH} - (rtems_interval *)
+
+@item @code{@value{RPREFIX}CLOCK_GET_TICKS_PER_SECOND} - (rtems_interval *)
+
+@end itemize
+@end ifset
+
+@ifset is-Ada
+@itemize @bullet
+@item @code{@value{RPREFIX}CLOCK_GET_TOD} - Address of an variable of
+type RTEMS.Time_Of_Day
+
+@item @code{@value{RPREFIX}CLOCK_GET_TIME_VALUE} - Address of an variable of
+type RTEMS.Clock_Time_Value
+
+@item @code{@value{RPREFIX}CLOCK_GET_TICKS_SINCE_BOOT} - Address of an
+variable of type RTEMS.Interval
+
+@item @code{@value{RPREFIX}CLOCK_GET_SECONDS_SINCE_EPOCH} - Address of an
+variable of type RTEMS.Interval
+
+@item @code{@value{RPREFIX}CLOCK_GET_TICKS_PER_SECOND} - Address of an
+variable of type RTEMS.Interval
+
+@end itemize
+@end ifset
+
+@subheading NOTES:
+
+This directive is callable from an ISR.
+
+This directive will not cause the running task to be
+preempted. Re-initializing RTEMS causes the system date and
+time to be reset to an uninitialized state. Another call to
+@code{@value{DIRPREFIX}clock_set} is required to re-initialize the
+system date and time to application specific specifications.
+
+@c
+@c
+@c
+@page
+@subsection CLOCK_TICK - Announce a clock tick
+
+@cindex clock tick
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_clock_tick
+@example
+rtems_status_code rtems_clock_tick( void );
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Clock_Tick (
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - clock tick processed successfully
+
+@subheading DESCRIPTION:
+
+This directive announces to RTEMS that a system clock
+tick has occurred. The directive is usually called from the
+timer interrupt ISR of the local processor. This directive
+maintains the system date and time, decrements timers for
+delayed tasks, timeouts, rate monotonic periods, and implements
+timeslicing.
+
+@subheading NOTES:
+
+This directive is typically called from an ISR.
+
+The microseconds_per_tick and ticks_per_timeslice
+parameters in the Configuration Table contain the number of
+microseconds per tick and number of ticks per timeslice,
+respectively.
+
diff --git a/doc/user/concepts.t b/doc/user/concepts.t
new file mode 100644
index 0000000000..adf8986e62
--- /dev/null
+++ b/doc/user/concepts.t
@@ -0,0 +1,361 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c The following figure was replaced with an ASCII equivalent.
+@c Figure 2-1 Object ID Composition
+@c
+
+@chapter Key Concepts
+
+@section Introduction
+
+The facilities provided by RTEMS are built upon a
+foundation of very powerful concepts. These concepts must be
+understood before the application developer can efficiently
+utilize RTEMS. The purpose of this chapter is to familiarize
+one with these concepts.
+
+@section Objects
+
+@cindex objects
+
+RTEMS provides directives which can be used to
+dynamically create, delete, and manipulate a set of predefined
+object types. These types include tasks, message queues,
+semaphores, memory regions, memory partitions, timers, ports,
+and rate monotonic periods. The object-oriented nature of RTEMS
+encourages the creation of modular applications built upon
+re-usable "building block" routines.
+
+All objects are created on the local node as required
+by the application and have an RTEMS assigned ID. All objects
+have a user-assigned name. Although a relationship exists
+between an object's name and its RTEMS assigned ID, the name and
+ID are not identical. Object names are completely arbitrary and
+selected by the user as a meaningful "tag" which may commonly
+reflect the object's use in the application. Conversely, object
+IDs are designed to facilitate efficient object manipulation by
+the executive.
+
+@subsection Object Names
+
+@cindex object name
+@findex rtems_object_name
+
+An object name is an unsigned thirty-two bit entity
+associated with the object by the user. The data type
+@code{@value{DIRPREFIX}name} is used to store object names.
+
+@findex rtems_build_name
+
+Although not required by RTEMS, object names are often
+composed of four ASCII characters which help identify that object.
+For example, a task which causes a light to blink might be
+called "LITE". The @code{@value{DIRPREFIX}build_name} routine
+is provided to build an object name from four ASCII characters.
+@ifset is-C
+The following example illustrates this:
+
+@example
+rtems_object_name my_name;
+
+my_name = rtems_build_name( 'L', 'I', 'T', 'E' );
+@end example
+@end ifset
+
+However, it is not required that the application use ASCII
+characters to build object names. For example, if an
+application requires one-hundred tasks, it would be difficult to
+assign meaningful ASCII names to each task. A more convenient
+approach would be to name them the binary values one through
+one-hundred, respectively.
+
+@subsection Object IDs
+
+@cindex object ID
+@cindex object ID composition
+@findex rtems_id
+
+@need 3000
+
+An object ID is a unique unsigned thirty-two bit
+entity composed of three parts: object class, node, and index.
+The data type @code{@value{DIRPREFIX}id} is used to store object IDs.
+
+
+@ifset use-ascii
+@example
+@group
+ 31 26 25 16 15 0
+ +-----------+------------------+-------------------------------+
+ | | | |
+ | Class | Node | Index |
+ | | | |
+ +-----------+------------------+-------------------------------+
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@sp 1
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\strut#&
+\hbox to 0.50in{\enskip#}&
+\hbox to 0.50in{\enskip#}&
+#&
+\hbox to 0.50in{\enskip#}&
+\hbox to 0.50in{\enskip#}&
+#&
+\hbox to 1.00in{\enskip#}&
+\hbox to 1.00in{\enskip#}&
+#\cr
+\multispan{9}\cr
+\multispan{2}31\hfil&\multispan{2}\hfil26\enskip&
+ \multispan{1}\enskip25\hfil&\multispan{2}\hfil16\enskip&
+ \multispan{1}\enskip15\hfil&\multispan{2}\hfil0\cr
+&&&&&&&&&\cr
+}}\hfil}
+\centerline{\vbox{\offinterlineskip\halign{
+\strut\vrule#&
+\hbox to 0.50in{\enskip#}&
+\hbox to 0.50in{\enskip#}&
+\vrule#&
+\hbox to 0.50in{\enskip#}&
+\hbox to 0.50in{\enskip#}&
+\vrule#&
+\hbox to 0.50in{\enskip#}&
+\hbox to 0.50in{\enskip#}&
+\vrule#\cr
+\multispan{9}\cr
+\noalign{\hrule}
+&&&&&&&&&\cr
+&\multispan{2}\hfil Class\hfil&&
+ \multispan{2}\hfil Node\hfil&&
+ \multispan{2}\hfil Index\hfil&\cr
+&&&&&&&&&\cr
+\noalign{\hrule}
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=6 WIDTH="60%" BORDER=0>
+<TR><TD ALIGN=left><STRONG>31</STRONG></TD>
+ <TD ALIGN=right><STRONG>26</STRONG></TD>
+ <TD ALIGN=left><STRONG>25</STRONG></TD>
+ <TD ALIGN=right><STRONG>16</STRONG></TD>
+ <TD ALIGN=left><STRONG>15</STRONG></TD>
+ <TD ALIGN=right><STRONG>0</STRONG></TD></TR>
+ </TABLE>
+</CENTER>
+<CENTER>
+ <TABLE COLS=6 WIDTH="60%" BORDER=2>
+<TR><TD ALIGN=center COLSPAN=2>Class</TD>
+ <TD ALIGN=center COLSPAN=2>Node</TD>
+ <TD ALIGN=center COLSPAN=2>Index</TD></TD>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+The most significant six bits are the object class. The next
+ten bits are the number of the node on which this object was
+created. The node number is always one (1) in a single
+processor system. The least significant sixteen bits form an
+identifier within a particular object type. This identifier,
+called the object index, ranges in value from 1 to the maximum
+number of objects configured for this object type.
+
+
+The three components of an object ID make it possible
+to quickly locate any object in even the most complicated
+multiprocessor system. Object ID's are associated with an
+object by RTEMS when the object is created and the corresponding
+ID is returned by the appropriate object create directive. The
+object ID is required as input to all directives involving
+objects, except those which create an object or obtain the ID of
+an object.
+
+The object identification directives can be used to
+dynamically obtain a particular object's ID given its name.
+This mapping is accomplished by searching the name table
+associated with this object type. If the name is non-unique,
+then the ID associated with the first occurrence of the name
+will be returned to the application. Since object IDs are
+returned when the object is created, the object identification
+directives are not necessary in a properly designed single
+processor application.
+
+In addition, services are provided to portably examine the
+three subcomponents of an RTEMS ID. These services are
+prototyped as follows:
+
+@cindex obtaining class from object ID
+@cindex obtaining node from object ID
+@cindex obtaining index from object ID
+@cindex get class from object ID
+@cindex get node from object ID
+@cindex get index from object ID
+@findex rtems_get_class
+@findex rtems_get_node
+@findex rtems_get_index
+
+@example
+rtems_unsigned32 rtems_get_class( rtems_id );
+rtems_unsigned32 rtems_get_node( rtems_id );
+rtems_unsigned32 rtems_get_index( rtems_id );
+@end example
+
+An object control block is a data structure defined
+by RTEMS which contains the information necessary to manage a
+particular object type. For efficiency reasons, the format of
+each object type's control block is different. However, many of
+the fields are similar in function. The number of each type of
+control block is application dependent and determined by the
+values specified in the user's Configuration Table. An object
+control block is allocated at object create time and freed when
+the object is deleted. With the exception of user extension
+routines, object control blocks are not directly manipulated by
+user applications.
+
+@section Communication and Synchronization
+
+@cindex communication and synchronization
+
+In real-time multitasking applications, the ability
+for cooperating execution threads to communicate and synchronize
+with each other is imperative. A real-time executive should
+provide an application with the following capabilities:
+
+@itemize @bullet
+@item Data transfer between cooperating tasks
+@item Data transfer between tasks and ISRs
+@item Synchronization of cooperating tasks
+@item Synchronization of tasks and ISRs
+@end itemize
+
+Most RTEMS managers can be used to provide some form
+of communication and/or synchronization. However, managers
+dedicated specifically to communication and synchronization
+provide well established mechanisms which directly map to the
+application's varying needs. This level of flexibility allows
+the application designer to match the features of a particular
+manager with the complexity of communication and synchronization
+required. The following managers were specifically designed for
+communication and synchronization:
+
+@itemize @bullet
+@item Semaphore
+@item Message Queue
+@item Event
+@item Signal
+@end itemize
+
+The semaphore manager supports mutual exclusion
+involving the synchronization of access to one or more shared
+user resources. Binary semaphores may utilize the optional
+priority inheritance algorithm to avoid the problem of priority
+inversion. The message manager supports both communication and
+synchronization, while the event manager primarily provides a
+high performance synchronization mechanism. The signal manager
+supports only asynchronous communication and is typically used
+for exception handling.
+
+@section Time
+
+@cindex time
+
+The development of responsive real-time applications
+requires an understanding of how RTEMS maintains and supports
+time-related operations. The basic unit of time in RTEMS is
+known as a tick. The frequency of clock ticks is completely
+application dependent and determines the granularity and
+accuracy of all interval and calendar time operations.
+
+@findex rtems_interval
+
+By tracking time in units of ticks, RTEMS is capable
+of supporting interval timing functions such as task delays,
+timeouts, timeslicing, the delayed execution of timer service
+routines, and the rate monotonic scheduling of tasks. An
+interval is defined as a number of ticks relative to the current
+time. For example, when a task delays for an interval of ten
+ticks, it is implied that the task will not execute until ten
+clock ticks have occurred.
+All intervals are specified using data type
+@code{@value{DIRPREFIX}interval}.
+
+A characteristic of interval timing is that the
+actual interval period may be a fraction of a tick less than the
+interval requested. This occurs because the time at which the
+delay timer is set up occurs at some time between two clock
+ticks. Therefore, the first countdown tick occurs in less than
+the complete time interval for a tick. This can be a problem if
+the clock granularity is large.
+
+The rate monotonic scheduling algorithm is a hard
+real-time scheduling methodology. This methodology provides
+rules which allows one to guarantee that a set of independent
+periodic tasks will always meet their deadlines -- even under
+transient overload conditions. The rate monotonic manager
+provides directives built upon the Clock Manager's interval
+timer support routines.
+
+Interval timing is not sufficient for the many
+applications which require that time be kept in wall time or
+true calendar form. Consequently, RTEMS maintains the current
+date and time. This allows selected time operations to be
+scheduled at an actual calendar date and time. For example, a
+task could request to delay until midnight on New Year's Eve
+before lowering the ball at Times Square.
+The data type @code{@value{DIRPREFIX}time_of_day} is used to specify
+calendar time in RTEMS services.
+@xref{Clock Manager Time and Date Data Structures, , Time and Date Data Structures}.
+@findex rtems_time_of_day
+
+Obviously, the directives which use intervals or wall
+time cannot operate without some external mechanism which
+provides a periodic clock tick. This clock tick is typically
+provided by a real time clock or counter/timer device.
+
+@section Memory Management
+
+@cindex memory management
+
+RTEMS memory management facilities can be grouped
+into two classes: dynamic memory allocation and address
+translation. Dynamic memory allocation is required by
+applications whose memory requirements vary through the
+application's course of execution. Address translation is
+needed by applications which share memory with another CPU or an
+intelligent Input/Output processor. The following RTEMS
+managers provide facilities to manage memory:
+
+@itemize @bullet
+@item Region
+
+@item Partition
+
+@item Dual Ported Memory
+@end itemize
+
+RTEMS memory management features allow an application
+to create simple memory pools of fixed size buffers and/or more
+complex memory pools of variable size segments. The partition
+manager provides directives to manage and maintain pools of
+fixed size entities such as resource control blocks.
+Alternatively, the region manager provides a more general
+purpose memory allocation scheme that supports variable size
+blocks of memory which are dynamically obtained and freed by the
+application. The dual-ported memory manager provides executive
+support for address translation between internal and external
+dual-ported RAM address space.
diff --git a/doc/user/conf.t b/doc/user/conf.t
new file mode 100644
index 0000000000..c931c4ea65
--- /dev/null
+++ b/doc/user/conf.t
@@ -0,0 +1,2028 @@
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c The following macros from confdefs.h have not been discussed in this
+@c chapter:
+@c
+@c CONFIGURE_NEWLIB_EXTENSION - probably not needed
+@c CONFIGURE_MALLOC_REGION - probably not needed
+@c CONFIGURE_LIBIO_SEMAPHORES - implicitly discussed.
+@c CONFIGURE_INTERRUPT_STACK_MEMORY
+@c CONFIGURE_GNAT_RTEMS
+@c CONFIGURE_GNAT_MUTEXES
+@c CONFIGURE_GNAT_KEYS
+@c CONFIGURE_MAXIMUM_ADA_TASKS
+@c CONFIGURE_MAXIMUM_FAKE_ADA_TASKS
+@c CONFIGURE_ADA_TASKS_STACK
+@c
+@c In addition, there should be examples of defining your own
+@c Device Driver Table, Init task table, etc.
+@c
+@c Regardless, this is a big step up. :)
+@c
+
+@chapter Configuring a System
+
+@section Introduction
+
+RTEMS must be configured for an application. This configuration
+information encompasses a variety of information including
+the length of each clock tick, the maximum number of each RTEMS
+object that can be created, the application initialization tasks,
+and the device drivers in the application. This information
+is placed in data structures that are given to RTEMS at
+system initialization time. This chapter details the
+format of these data structures as well as a simpler
+mechanism to automate the generation of these structures.
+
+
+@section Automatic Generation of System Configuration
+
+@cindex confdefs.h
+@findex confdefs.h
+
+RTEMS provides the @code{confdefs.h} C language header file that
+based on the setting of a variety of macros can automatically
+produce nearly all of the configuration tables required
+by an RTEMS application. Rather than building the individual
+tables by hand, the application simply specifies the values
+for the configuration parameters it wishes to set. In the following
+example, the configuration information for a simple system with
+a message queue and a time slice of 50 milliseconds is configured:
+
+@example
+@group
+#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MICROSECONDS_PER_TICK 1000 /* 1 millisecond */
+#define CONFIGURE_TICKS_PER_TIMESLICE 50 /* 50 milliseconds */
+
+#define CONFIGURE_MAXIMUM_TASKS 4
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+@end group
+@end example
+
+This system will begin execution with the single initialization task
+named @code{Init}. It will be configured to have both a console
+device driver (for standard I/O) and a clock tick device driver.
+
+For each configuration parameter in the configuration tables, the
+macro corresponding to that field is discussed. Most systems
+can be easily configured using the @code{confdefs.h} mechanism.
+
+The @code{CONFIGURE_INIT} constant must be defined in order to
+make @code{confdefs.h} instantiate the configuration data
+structures. This can only be defined in one source file per
+application that includes @code{confdefs.h} or the symbol
+table will be instantiated multiple times and linking errors
+produced.
+
+The user should be aware that the defaults are intentionally
+set as low as possible. By default, no application resources
+are configured. The @code{confdefs.h} file ensures that
+at least one application tasks or thread is configured
+and that at least one of the initialization task/thread
+tables is configured.
+
+The @code{confdefs.h} file estimates the amount of
+memory required for the RTEMS Executive Workspace. This
+estimate is only as accurate as the information given
+to @code{confdefs.h} and may be either too high or too
+low for a variety of reasons. Some of the reasons that
+@code{confdefs.h} may reserve too much memory for RTEMS
+are:
+
+@itemize @bullet
+@item All tasks/threads are assumed to be floating point.
+@end itemize
+
+Conversely, there are many more reasons, the resource
+estimate could be too low:
+
+@itemize @bullet
+@item Task/thread stacks greater than minimum size must be
+accounted for explicitly by developer.
+
+@item Memory for messages is not included.
+
+@item Device driver requirements are not included.
+
+
+@item Network stack requirements are not included.
+
+@item Requirements for add-on libraries are not included.
+@end itemize
+
+In general, @code{confdefs.h} is very accurate when given
+enough information. However, it is quite easy to use
+a library and not account for its resources.
+
+The following subsection list all of the constants which can be
+set by the user.
+
+@subsection Library Support Definitions
+
+This section defines the file system and IO library
+related configuration parameters supported by
+@code{confdefs.h}.
+
+@itemize @bullet
+@findex CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS
+@item @code{CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS} is set to the
+maximum number of files that can be concurrently open. Libio requires
+a Classic RTEMS semaphore for each file descriptor as well as one
+global one. The default value is 3 file descriptors which is
+enough to support standard input, output, and error output.
+
+@findex CONFIGURE_TERMIOS_DISABLED
+@item @code{CONFIGURE_TERMIOS_DISABLED} is defined if the
+software implementing POSIX termios functionality is
+not going to be used by this application. By default, this
+is not defined and resources are reserved for the
+termios functionality.
+
+@findex CONFIGURE_NUMBER_OF_TERMIOS_PORTS
+@item @code{CONFIGURE_NUMBER_OF_TERMIOS_PORTS} is set to the
+number of ports using the termios functionality. Each
+concurrently active termios port requires resources.
+By default, this is set to 1 so a console port can be
+used.
+
+@findex CONFIGURE_HAS_OWN_MOUNT_TABLE
+@item @code{CONFIGURE_HAS_OWN_MOUNT_TABLE} is defined when the
+application provides their own filesystem mount table. The
+mount table is an array of @code{rtems_filesystem_mount_table_t}
+entries pointed to by the global variable
+@code{rtems_filesystem_mount_table}. The number of
+entries in this table is in an integer variable named
+@code{rtems_filesystem_mount_table_t}.
+
+@findex CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM
+@item @code{CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM} is defined
+if the application wishes to use the full functionality
+IMFS. By default, the miniIMFS is used. The miniIMFS
+is a minimal functionality subset of the In-Memory
+FileSystem (IMFS). The miniIMFS is comparable
+in functionality to the pseudo-filesystem name space provided
+before RTEMS release 4.5.0. The miniIMFS supports
+only directories and device nodes and is smaller in executable
+code size than the full IMFS.
+
+@findex STACK_CHECKER_ON
+@item @code{STACK_CHECKER_ON} is defined when the application
+wishes to enable run-time stack bounds checking. This increases
+the time required to create tasks as well as adding overhead
+to each context switch. By default, this is not defined and
+thus stack checking is disabled.
+
+@end itemize
+
+@subsection Basic System Information
+
+This section defines the general system configuration parameters supported by
+@code{confdefs.h}.
+
+@itemize @bullet
+@findex CONFIGURE_HAS_OWN_CONFIGURATION_TABLE
+@item @code{CONFIGURE_HAS_OWN_CONFIGURATION_TABLE} should only be defined
+if the application is providing their own complete set of configuration
+tables.
+
+@findex CONFIGURE_INTERRUPT_STACK_MEMORY
+@item @code{CONFIGURE_INTERRUPT_STACK_MEMORY} is set to the
+size of the interrupt stack. The interrupt stack size is
+usually set by the BSP but since this memory is allocated
+from the RTEMS Ram Workspace, it must be accounted for. The
+default for this field is RTEMS_MINIMUM_STACK_SIZE. [NOTE:
+At this time, changing this constant does NOT change the
+size of the interrupt stack, only the amount of memory
+reserved for it.]
+
+@findex CONFIGURE_EXECUTIVE_RAM_WORK_AREA
+@item @code{CONFIGURE_EXECUTIVE_RAM_WORK_AREA} is the base
+address of the RTEMS RAM Workspace. By default, this value
+is NULL indicating that the BSP is to determine the location
+of the RTEMS RAM Workspace.
+
+@findex CONFIGURE_MICROSECONDS_PER_TICK
+@item @code{CONFIGURE_MICROSECONDS_PER_TICK} is the length
+of time between clock ticks. By default, this is set to
+10000 microseconds.
+
+@findex CONFIGURE_TICKS_PER_TIMESLICE
+@item @code{CONFIGURE_TICKS_PER_TIMESLICE} is the number
+of ticks per each task's timeslice. By default, this is
+50.
+
+@findex CONFIGURE_MEMORY_OVERHEAD
+@item @code{CONFIGURE_MEMORY_OVERHEAD} is set to the number of
+bytes the applications wishes to add to the requirements calculated
+by @code{confdefs.h}. The default value is 0.
+
+@findex CONFIGURE_EXTRA_TASK_STACKS
+@item @code{CONFIGURE_EXTRA_TASK_STACKS} is set to the number of
+bytes the applications wishes to add to the task stack requirements
+calculated by @code{confdefs.h}. This parameter is very important.
+If the application creates tasks with stacks larger then the
+minimum, then that memory is NOT accounted for by @code{confdefs.h}.
+The default value is 0.
+
+@end itemize
+
+NOTE: The required size of the Executive RAM Work Area is calculated
+automatically when using the @code{confdefs.h} mechanism.
+
+@subsection Device Driver Table
+
+This section defines the configuration parameters related
+to the automatic generation of a Device Driver Table. As
+@code{confdefs.h} only is aware of a small set of
+standard device drivers, the generated Device Driver
+Table is suitable for simple applications with no
+custom device drivers.
+
+@itemize @bullet
+@findex CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE
+@item @code{CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE} is defined if
+the application wishes to provide their own Device Driver Table.
+The table generated is an array of @code{rtems_driver_address_table}
+entries named @code{Device_drivers}. By default, this is not
+defined indicating the @code{confdefs.h} is providing the
+device driver table.
+
+@findex CONFIGURE_MAXIMUM_DRIVERS
+@item @code{CONFIGURE_MAXIMUM_DRIVERS} is defined
+as the number of device drivers per node. By default, this is
+set to 10.
+
+@findex CONFIGURE_MAXIMUM_DEVICES
+@item @code{CONFIGURE_MAXIMUM_DEVICES} is defined
+to the number of individual devices that may be registered
+in the system. By default, this is set to 20.
+
+@findex CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
+@item @code{CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER}
+is defined
+if the application wishes to include the Console Device Driver.
+This device driver is responsible for providing standard input
+and output using "/dev/console". By default, this is not
+defined.
+
+@findex CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
+@item @code{CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER}
+is defined
+if the application wishes to include the Console Device Driver.
+This device driver is responsible for providing standard input
+and output using "/dev/console". By default, this is not
+defined.
+
+@findex CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER
+@item @code{CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER}
+is defined if the application wishes to include the Timer Driver.
+This device driver is used to benchmark execution times
+by the RTEMS Timing Test Suites. By default, this is not
+defined.
+
+@c @item @code{CONFIGURE_APPLICATION_NEEDS_RTC_DRIVER}
+@c is defined
+@c if the application wishes to include the Real-Time Clock Driver.
+@c By default, this is not defined.
+
+@findex CONFIGURE_APPLICATION_NEEDS_STUB_DRIVER
+@item @code{CONFIGURE_APPLICATION_NEEDS_STUB_DRIVER}
+is defined if the application wishes to include the Stub Device Driver.
+This device driver simply provides entry points that return
+successful and is primarily a test fixture.
+By default, this is not defined.
+
+@end itemize
+
+@subsection Multiprocessing Configuration
+
+This section defines the multiprocessing related
+system configuration parameters supported by @code{confdefs.h}.
+This class of Configuration Constants are only applicable if
+@code{CONFIGURE_MP_APPLICATION} is defined.
+
+@itemize @bullet
+@findex CONFIGURE_HAS_OWN_MULTIPROCESING_TABLE
+@item @code{CONFIGURE_HAS_OWN_MULTIPROCESING_TABLE} is defined
+if the application wishes to provide their own Multiprocessing
+Configuration Table. The generated table is named
+@code{Multiprocessing_configuration}. By default, this
+is not defined.
+
+@findex CONFIGURE_MP_NODE_NUMBER
+@item @code{CONFIGURE_MP_NODE_NUMBER} is the node number of
+this node in a multiprocessor system. The default node number
+is @code{NODE_NUMBER} which is set directly in RTEMS test Makefiles.
+
+@findex CONFIGURE_MP_MAXIMUM_NODES
+@item @code{CONFIGURE_MP_MAXIMUM_NODES} is the maximum number
+of nodes in a multiprocessor system. The default is 2.
+
+@findex CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS
+@item @code{CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS}
+is the maximum number
+of concurrently active global objects in a multiprocessor
+system. The default is 32.
+
+@findex CONFIGURE_MP_MAXIMUM_PROXIES
+@item @code{CONFIGURE_MP_MAXIMUM_PROXIES} is the maximum number
+of concurrently active thread/task proxies in a multiprocessor
+system. The default is 32.
+
+@findex CONFIGURE_MP_MPCI_TABLE_POINTER
+@item @code{CONFIGURE_MP_MPCI_TABLE_POINTER} is the pointer
+to the MPCI Configuration Table. The default value of
+this field is @code{&MPCI_table}.
+@end itemize
+
+@subsection Classic API Configuration
+
+This section defines the Classic API related
+system configuration parameters supported by @code{confdefs.h}.
+
+@itemize @bullet
+@findex CONFIGURE_MAXIMUM_TASKS
+@item @code{CONFIGURE_MAXIMUM_TASKS} is the maximum number of
+Classic API tasks that can be concurrently active.
+The default for this field is 0.
+
+@findex CONFIGURE_MAXIMUM_TIMERS
+@item @code{CONFIGURE_MAXIMUM_TIMERS} is the maximum number of
+Classic API timers that can be concurrently active.
+The default for this field is 0.
+
+@findex CONFIGURE_MAXIMUM_SEMAPHORES
+@item @code{CONFIGURE_MAXIMUM_SEMAPHORES} is the maximum number of
+Classic API semaphores that can be concurrently active.
+The default for this field is 0.
+
+@findex CONFIGURE_MAXIMUM_MESSAGE_QUEUES
+@item @code{CONFIGURE_MAXIMUM_MESSAGE_QUEUES} is the maximum number of
+Classic API message queues that can be concurrently active.
+The default for this field is 0.
+
+@findex CONFIGURE_MAXIMUM_PARTITIONS
+@item @code{CONFIGURE_MAXIMUM_PARTITIONS} is the maximum number of
+Classic API partitions that can be concurrently active.
+The default for this field is 0.
+
+@findex CONFIGURE_MAXIMUM_REGIONS
+@item @code{CONFIGURE_MAXIMUM_REGIONS} is the maximum number of
+Classic API regions that can be concurrently active.
+The default for this field is 0.
+
+@findex CONFIGURE_MAXIMUM_PORTS
+@item @code{CONFIGURE_MAXIMUM_PORTS} is the maximum number of
+Classic API ports that can be concurrently active.
+The default for this field is 0.
+
+@findex CONFIGURE_MAXIMUM_PERIODS
+@item @code{CONFIGURE_MAXIMUM_PERIODS} is the maximum number of
+Classic API rate monotonic periods that can be concurrently active.
+The default for this field is 0.
+
+@findex CONFIGURE_MAXIMUM_USER_EXTENSIONS
+@item @code{CONFIGURE_MAXIMUM_USER_EXTENSIONS} is the maximum number of
+Classic API user extensions that can be concurrently active.
+The default for this field is 0.
+
+@end itemize
+
+@subsection Classic API Initialization Tasks Table Configuration
+
+The @code{confdefs.h} configuration system can automatically
+generate an Initialization Tasks Table named
+@code{Initialization_tasks} with a single entry. The following
+parameters control the generation of that table.
+
+@itemize @bullet
+@findex CONFIGURE_RTEMS_INIT_TASKS_TABLE
+@item @code{CONFIGURE_RTEMS_INIT_TASKS_TABLE} is defined
+if the user wishes to use a Classic RTEMS API Initialization
+Task Table. The application may choose to use the initialization
+tasks or threads table from another API. By default, this
+field is not defined as the user MUST select their own
+API for initialization tasks.
+
+@findex CONFIGURE_HAS_OWN_INIT_TASK_TABLE
+@item @code{CONFIGURE_HAS_OWN_INIT_TASK_TABLE} is defined
+if the user wishes to define their own Classic API Initialization
+Tasks Table. This table should be named @code{Initialization_tasks}.
+By default, this is not defined.
+
+@findex CONFIGURE_INIT_TASK_NAME
+@item @code{CONFIGURE_INIT_TASK_NAME} is the name
+of the single initialization task defined by the
+Classic API Initialization Tasks Table. By default
+the value is @code{rtems_build_name( 'U', 'I', '1', ' ' )}.
+
+@findex CONFIGURE_INIT_TASK_STACK_SIZE
+@item @code{CONFIGURE_INIT_TASK_STACK_SIZE}
+is the stack size
+of the single initialization task defined by the
+Classic API Initialization Tasks Table. By default
+the value is @code{RTEMS_MINIMUM_STACK_SIZE}.
+
+@findex CONFIGURE_INIT_TASK_PRIORITY
+@item @code{CONFIGURE_INIT_TASK_PRIORITY}
+is the initial priority
+of the single initialization task defined by the
+Classic API Initialization Tasks Table. By default
+the value is 1 which is the highest priority
+in the Classic API.
+
+@findex CONFIGURE_INIT_TASK_ATTRIBUTES
+@item @code{CONFIGURE_INIT_TASK_ATTRIBUTES}
+is the task attributes
+of the single initialization task defined by the
+Classic API Initialization Tasks Table. By default
+the value is @code{RTEMS_DEFAULT_ATTRIBUTES}.
+
+@findex CONFIGURE_INIT_TASK_ENTRY_POINT
+@item @code{CONFIGURE_INIT_TASK_ENTRY_POINT}
+is the entry point (a.k.a. function name)
+of the single initialization task defined by the
+Classic API Initialization Tasks Table. By default
+the value is @code{Init}.
+
+@findex CONFIGURE_INIT_TASK_INITIAL_MODES
+@item @code{CONFIGURE_INIT_TASK_INITIAL_MODES}
+is the initial execution mode
+of the single initialization task defined by the
+Classic API Initialization Tasks Table. By default
+the value is @code{RTEMS_NO_PREEMPT}.
+
+@findex CONFIGURE_INIT_TASK_ARGUMENTS
+@item @code{CONFIGURE_INIT_TASK_ARGUMENTS}
+is the task argument
+of the single initialization task defined by the
+Classic API Initialization Tasks Table. By default
+the value is 0.
+
+@end itemize
+
+
+@subsection POSIX API Configuration
+
+The parameters in this section are used to configure resources
+for the RTEMS POSIX API. They are only relevant if the POSIX API
+is enabled at configure time using the @code{--enable-posix} option.
+
+@itemize @bullet
+@findex CONFIGURE_MAXIMUM_POSIX_THREADS
+@item @code{CONFIGURE_MAXIMUM_POSIX_THREADS} is the maximum number of
+POSIX API threads that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_POSIX_MUTEXES
+@item @code{CONFIGURE_MAXIMUM_POSIX_MUTEXES} is the maximum number of
+POSIX API mutexes that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES
+@item @code{CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES} is the maximum number of
+POSIX API condition variables that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_POSIX_KEYS
+@item @code{CONFIGURE_MAXIMUM_POSIX_KEYS} is the maximum number of
+POSIX API keys that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_POSIX_TIMERS
+@item @code{CONFIGURE_MAXIMUM_POSIX_TIMERS} is the maximum number of
+POSIX API timers that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS
+@item @code{CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS} is the maximum number of
+POSIX API queued signals that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES
+@item @code{CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES} is the maximum number of
+POSIX API message queues that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_POSIX_SEMAPHORES
+@item @code{CONFIGURE_MAXIMUM_POSIX_SEMAPHORES} is the maximum number of
+POSIX API semaphores that can be concurrently active.
+The default is 0.
+
+@end itemize
+
+@subsection POSIX Initialization Threads Table Configuration
+
+The @code{confdefs.h} configuration system can automatically
+generate a POSIX Initialization Threads Table named
+@code{POSIX_Initialization_threads} with a single entry. The following
+parameters control the generation of that table.
+
+@itemize @bullet
+@findex CONFIGURE_POSIX_INIT_THREAD_TABLE
+@item @code{CONFIGURE_POSIX_INIT_THREAD_TABLE}
+is defined
+if the user wishes to use a POSIX API Initialization
+Threads Table. The application may choose to use the initialization
+tasks or threads table from another API. By default, this
+field is not defined as the user MUST select their own
+API for initialization tasks.
+
+@findex CONFIGURE_POSIX_HAS_OWN_INIT_THREAD_TABLE
+@item @code{CONFIGURE_POSIX_HAS_OWN_INIT_THREAD_TABLE}
+is defined if the user wishes to define their own POSIX API Initialization
+Threads Table. This table should be named @code{POSIX_Initialization_threads}.
+By default, this is not defined.
+
+@findex CONFIGURE_POSIX_INIT_THREAD_ENTRY_POINT
+@item @code{CONFIGURE_POSIX_INIT_THREAD_ENTRY_POINT}
+is the entry point (a.k.a. function name)
+of the single initialization thread defined by the
+POSIX API Initialization Threads Table. By default
+the value is @code{POSIX_Init}.
+
+@findex CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE
+@item @code{CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE}
+is the stack size of the single initialization thread defined by the
+POSIX API Initialization Threads Table. By default
+the value is @code{RTEMS_MINIMUM_STACK_SIZE * 2}.
+
+@end itemize
+
+@subsection ITRON API Configuration
+
+The parameters in this section are used to configure resources
+for the RTEMS ITRON API. They are only relevant if the POSIX API
+is enabled at configure time using the @code{--enable-itron} option.
+
+@itemize @bullet
+@findex CONFIGURE_MAXIMUM_ITRON_TASKS
+@item @code{CONFIGURE_MAXIMUM_ITRON_TASKS}
+is the maximum number of
+ITRON API tasks that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_ITRON_SEMAPHORES
+@item @code{CONFIGURE_MAXIMUM_ITRON_SEMAPHORES}
+is the maximum number of
+ITRON API semaphores that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_ITRON_EVENTFLAGS
+@item @code{CONFIGURE_MAXIMUM_ITRON_EVENTFLAGS}
+is the maximum number of
+ITRON API eventflags that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_ITRON_MAILBOXES
+@item @code{CONFIGURE_MAXIMUM_ITRON_MAILBOXES}
+is the maximum number of
+ITRON API mailboxes that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_ITRON_MESSAGE_BUFFERS
+@item @code{CONFIGURE_MAXIMUM_ITRON_MESSAGE_BUFFERS}
+is the maximum number of
+ITRON API message buffers that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_ITRON_PORTS
+@item @code{CONFIGURE_MAXIMUM_ITRON_PORTS}
+is the maximum number of
+ITRON API ports that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_ITRON_MEMORY_POOLS
+@item @code{CONFIGURE_MAXIMUM_ITRON_MEMORY_POOLS}
+is the maximum number of
+ITRON API memory pools that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_ITRON_FIXED_MEMORY_POOLS
+@item @code{CONFIGURE_MAXIMUM_ITRON_FIXED_MEMORY_POOLS}
+is the maximum number of
+ITRON API fixed memory pools that can be concurrently active.
+The default is 0.
+
+@end itemize
+
+@subsection ITRON Initialization Task Table Configuration
+
+The @code{confdefs.h} configuration system can automatically
+generate an ITRON Initialization Tasks Table named
+@code{ITRON_Initialization_tasks} with a single entry. The following
+parameters control the generation of that table.
+
+@itemize @bullet
+@findex CONFIGURE_ITRON_INIT_TASK_TABLE
+@item @code{CONFIGURE_ITRON_INIT_TASK_TABLE} is defined
+if the user wishes to use a ITRON API Initialization
+Tasks Table. The application may choose to use the initialization
+tasks or threads table from another API. By default, this
+field is not defined as the user MUST select their own
+API for initialization tasks.
+
+@findex CONFIGURE_ITRON_HAS_OWN_INIT_TASK_TABLE
+@item @code{CONFIGURE_ITRON_HAS_OWN_INIT_TASK_TABLE}
+is defined if the user wishes to define their own ITRON API Initialization
+Tasks Table. This table should be named @code{ITRON_Initialization_tasks}.
+By default, this is not defined.
+
+@findex CONFIGURE_ITRON_INIT_TASK_ENTRY_POINT
+@item @code{CONFIGURE_ITRON_INIT_TASK_ENTRY_POINT}
+is the entry point (a.k.a. function name)
+of the single initialization task defined by the
+ITRON API Initialization Tasks Table. By default
+the value is @code{ITRON_Init}.
+
+@findex CONFIGURE_ITRON_INIT_TASK_ATTRIBUTES
+@item @code{CONFIGURE_ITRON_INIT_TASK_ATTRIBUTES}
+is the attribute set
+of the single initialization task defined by the
+ITRON API Initialization Tasks Table. By default
+the value is @code{TA_HLNG}.
+
+@findex CONFIGURE_ITRON_INIT_TASK_PRIORITY
+@item @code{CONFIGURE_ITRON_INIT_TASK_PRIORITY}
+is the initial priority
+of the single initialization task defined by the
+ITRON API Initialization Tasks Table. By default
+the value is @code{1} which is the highest priority
+in the ITRON API.
+
+@findex CONFIGURE_ITRON_INIT_TASK_STACK_SIZE
+@item @code{CONFIGURE_ITRON_INIT_TASK_STACK_SIZE}
+is the stack size of the single initialization task defined by the
+ITRON API Initialization Tasks Table. By default
+the value is @code{RTEMS_MINIMUM_STACK_SIZE}.
+
+@end itemize
+
+@subsection Ada Tasks
+
+This section defines the system configuration parameters supported
+by @code{confdefs.h} related to configuring RTEMS to support
+a task using Ada tasking with GNAT.
+
+@itemize @bullet
+@findex CONFIGURE_GNAT_RTEMS
+@item @code{CONFIGURE_GNAT_RTEMS} is defined to inform
+RTEMS that the GNAT Ada run-time is to be used by the
+application. This configuration parameter is critical
+as it makes @code{confdefs.h} configure the resources
+(mutexes and keys) used implicitly by the GNAT run-time.
+By default, this parameter is not defined.
+
+@findex CONFIGURE_MAXIMUM_ADA_TASKS
+@item @code{CONFIGURE_MAXIMUM_ADA_TASKS} is the
+number of Ada tasks that can be concurrently active
+in the system. By default, when @code{CONFIGURE_GNAT_RTEMS}
+is defined, this is set to 20.
+
+@findex CONFIGURE_MAXIMUM_FAKE_ADA_TASKS
+@item @code{CONFIGURE_MAXIMUM_FAKE_ADA_TASKS} is
+the number of "fake" Ada tasks that can be concurrently
+active in the system. A "fake" Ada task is a non-Ada
+task that makes calls back into Ada code and thus
+implicitly uses the Ada run-time.
+
+@end itemize
+
+@section Configuration Table
+
+@cindex Configuration Table
+@cindex RTEMS Configuration Table
+
+The RTEMS Configuration Table is used to tailor an
+application for its specific needs. For example, the user can
+configure the number of device drivers or which APIs may be used.
+THe address of the user-defined Configuration Table is passed as an
+argument to the @code{@value{DIRPREFIX}initialize_executive}
+directive, which MUST be the first RTEMS directive called.
+The RTEMS Configuration Table
+is defined in the following @value{LANGUAGE} @value{STRUCTURE}:
+
+@ifset is-C
+@findex rtems_configuration_table
+@example
+@group
+typedef struct @{
+ void *work_space_start;
+ rtems_unsigned32 work_space_size;
+ rtems_unsigned32 maximum_extensions;
+ rtems_unsigned32 microseconds_per_tick;
+ rtems_unsigned32 ticks_per_timeslice;
+ rtems_unsigned32 maximum_devices;
+ rtems_unsigned32 maximum_drivers;
+ rtems_unsigned32 number_of_device_drivers;
+ rtems_driver_address_table *Device_driver_table;
+ rtems_unsigned32 number_of_initial_extensions;
+ rtems_extensions_table *User_extension_table;
+ rtems_multiprocessing_table *User_multiprocessing_table;
+ rtems_api_configuration_table *RTEMS_api_configuration;
+ posix_api_configuration_table *POSIX_api_configuration;
+@} rtems_configuration_table;
+@end group
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+type Configuration_Table is
+ record
+ Work_Space_Start : RTEMS.Address;
+ Work_Space_Size : RTEMS.Unsigned32;
+ Maximum_Extensions : RTEMS.Unsigned32;
+ Microseconds_Per_Tick : RTEMS.Unsigned32;
+ Ticks_Per_Timeslice : RTEMS.Unsigned32;
+ Maximum_Devices : RTEMS.Unsigned32;
+ Number_Of_Device_Drivers : RTEMS.Unsigned32;
+ Device_Driver_Table :
+ RTEMS.Driver_Address_Table_Pointer;
+ Number_Of_Initial_Extensions : RTEMS.Unsigned32;
+ User_Extension_Table : RTEMS.Extensions_Table_Pointer;
+ User_Multiprocessing_Table :
+ RTEMS.Multiprocessing_Table_Pointer;
+ RTEMS_API_Configuration :
+ RTEMS.API_Configuration_Table_Pointer;
+ POSIX_API_Configuration :
+ RTEMS.POSIX_API_Configuration_Table_Pointer;
+ end record;
+
+type Configuration_Table_Pointer is access all Configuration_Table;
+@end example
+@end ifset
+
+@table @b
+@item work_space_start
+is the address of the RTEMS RAM Workspace.
+This area contains items such as the
+various object control blocks (TCBs, QCBs, ...) and task stacks.
+If the address is not aligned on a four-word boundary, then
+RTEMS will invoke the fatal error handler during
+@code{@value{DIRPREFIX}initialize_executive}.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_EXECUTIVE_RAM_WORK_AREA}
+which defaults to @code{NULL}. Normally, this field should be
+configured as @code{NULL} as BSPs will assign memory for the
+RTEMS RAM Workspace as part of system initialization.
+
+@item work_space_size
+is the calculated size of the
+RTEMS RAM Workspace. The section Sizing the RTEMS RAM Workspace
+details how to arrive at this number.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_EXECUTIVE_RAM_SIZE}
+and is calculated based on the other system configuration settings.
+
+@item microseconds_per_tick
+is number of microseconds per clock tick.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MICROSECONDS_PER_TICK}.
+If not defined by the application, then the
+@code{CONFIGURE_MICROSECONDS_PER_TICK} macro defaults to 10000
+(10 milliseconds).
+
+@item ticks_per_timeslice
+is the number of clock ticks for a timeslice.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_TICKS_PER_TIMESLICE}.
+
+@item maximum_devices
+is the maximum number of devices that can be registered.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_DEVICES}.
+
+@item maximum_drivers
+is the maximum number of device drivers that can be registered.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_DRIVERS}.
+This value is set to @code{maximum_devices} if it is greater
+than @code{maximum_drivers}.
+
+@item number_of_device_drivers
+is the number of device drivers for the system. There should be
+the same number of entries in the Device Driver Table. If this field
+is zero, then the @code{User_driver_address_table} entry should be NULL.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field is calculated
+automatically based on the number of entries in the
+Device Driver Table. This calculation is based on the assumption
+that the Device Driver Table is named @code{Device_drivers}
+and defined in C. This table may be generated automatically
+for simple applications using only the device drivers that correspond
+to the following macros:
+
+@itemize @bullet
+
+@item @code{CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER}
+@item @code{CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER}
+@item @code{CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER}
+@item @code{CONFIGURE_APPLICATION_NEEDS_RTC_DRIVER}
+@item @code{CONFIGURE_APPLICATION_NEEDS_STUB_DRIVER}
+
+@end itemize
+
+Note that network device drivers are not configured in the
+Device Driver Table.
+
+@item Device_driver_table
+is the address of the Device Driver Table. This table contains the entry
+points for each device driver. If the number_of_device_drivers field is zero,
+then this entry should be NULL. The format of this table will be
+discussed below.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the Device Driver Table is assumed to be
+named @code{Device_drivers} and defined in C. If the application is providing
+its own Device Driver Table, then the macro
+@code{CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE} must be defined to indicate
+this and prevent @code{confdefs.h} from generating the table.
+
+@item number_of_initial_extensions
+is the number of initial user extensions. There should be
+the same number of entries as in the User_extension_table. If this field
+is zero, then the User_driver_address_table entry should be NULL.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_NUMBER_OF_INITIAL_EXTENSIONS}
+which is set automatically by @code{confdefs.h} based on the size
+of the User Extensions Table.
+
+@item User_extension_table
+is the address of the User
+Extension Table. This table contains the entry points for the
+static set of optional user extensions. If no user extensions
+are configured, then this entry should be NULL. The format of
+this table will be discussed below.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the User Extensions Table is named
+@code{Configuration_Initial_Extensions} and defined in
+confdefs.h. It is initialized based on the following
+macros:
+
+@itemize @bullet
+
+@item @code{CONFIGURE_INITIAL_EXTENSIONS}
+@item @code{STACK_CHECKER_EXTENSION}
+
+@end itemize
+
+The application may configure one or more initial user extension
+sets by setting the @code{CONFIGURE_INITIAL_EXTENSIONS} macro. By
+defining the @code{STACK_CHECKER_EXTENSION} macro, the task stack bounds
+checking user extension set is automatically included in the
+application.
+
+@item User_multiprocessing_table
+is the address of the Multiprocessor Configuration Table. This
+table contains information needed by RTEMS only when used in a multiprocessor
+configuration. This field must be NULL when RTEMS is used in a
+single processor configuration.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the Multiprocessor Configuration Table
+is automatically generated when the @code{CONFIGURE_MP_APPLICATION}
+is defined. If @code{CONFIGURE_MP_APPLICATION} is not defined, the this
+entry is set to NULL. The generated table has the name
+@code{Multiprocessing_configuration}.
+
+@item RTEMS_api_configuration
+is the address of the RTEMS API Configuration Table. This table
+contains information needed by the RTEMS API. This field should be
+NULL if the RTEMS API is not used. [NOTE: Currently the RTEMS API
+is required to support support components such as BSPs and libraries
+which use this API.] This table is built automatically and this
+entry filled in, if using the @code{confdefs.h} application
+configuration mechanism. The generated table has the name
+@code{Configuration_RTEMS_API}.
+
+@item POSIX_api_configuration
+is the address of the POSIX API Configuration Table. This table
+contains information needed by the POSIX API. This field should be
+NULL if the POSIX API is not used. This table is built automatically
+and this entry filled in, if using the @code{confdefs.h} application
+configuration mechanism. The @code{confdefs.h} application
+mechanism will fill this field in with the address of the
+@code{Configuration_POSIX_API} table of POSIX API is configured
+and NULL if the POSIX API is not configured.
+
+@end table
+
+@section RTEMS API Configuration Table
+
+@cindex RTEMS API Configuration Table
+
+The RTEMS API Configuration Table is used to configure the
+managers which constitute the RTEMS API for a particular application.
+For example, the user can configure the maximum number of tasks for
+this application. The RTEMS API Configuration Table is defined in
+the following @value{LANGUAGE} @value{STRUCTURE}:
+
+@ifset is-C
+@findex rtems_api_configuration_table
+@example
+@group
+typedef struct @{
+ rtems_unsigned32 maximum_tasks;
+ rtems_unsigned32 maximum_timers;
+ rtems_unsigned32 maximum_semaphores;
+ rtems_unsigned32 maximum_message_queues;
+ rtems_unsigned32 maximum_partitions;
+ rtems_unsigned32 maximum_regions;
+ rtems_unsigned32 maximum_ports;
+ rtems_unsigned32 maximum_periods;
+ rtems_unsigned32 number_of_initialization_tasks;
+ rtems_initialization_tasks_table *User_initialization_tasks_table;
+@} rtems_api_configuration_table;
+@end group
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+type API_Configuration_Table is
+ record
+ Maximum_Tasks : RTEMS.Unsigned32;
+ Maximum_Timers : RTEMS.Unsigned32;
+ Maximum_Semaphores : RTEMS.Unsigned32;
+ Maximum_Message_queues : RTEMS.Unsigned32;
+ Maximum_Partitions : RTEMS.Unsigned32;
+ Maximum_Regions : RTEMS.Unsigned32;
+ Maximum_Ports : RTEMS.Unsigned32;
+ Maximum_Periods : RTEMS.Unsigned32;
+ Number_Of_Initialization_Tasks : RTEMS.Unsigned32;
+ User_Initialization_Tasks_Table :
+ RTEMS.Initialization_Tasks_Table_Pointer;
+ end record;
+
+type API_Configuration_Table_Pointer is
+ access all API_Configuration_Table;
+@end example
+@end ifset
+
+@table @b
+@item maximum_tasks
+is the maximum number of tasks that
+can be concurrently active (created) in the system including
+initialization tasks.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_TASKS}.
+If not defined by the application, then the @code{CONFIGURE_MAXIMUM_TASKS}
+macro defaults to 10.
+
+@item maximum_timers
+is the maximum number of timers
+that can be concurrently active in the system.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_TIMERS}.
+If not defined by the application, then the @code{CONFIGURE_MAXIMUM_TIMERS}
+macro defaults to 0.
+
+@item maximum_semaphores
+is the maximum number of
+semaphores that can be concurrently active in the system.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_SEMAPHORES}.
+If not defined by the application, then the @code{CONFIGURE_MAXIMUM_SEMAPHORES}
+macro defaults to 0.
+
+@item maximum_message_queues
+is the maximum number of
+message queues that can be concurrently active in the system.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_MESSAGE_QUEUES}.
+If not defined by the application, then the
+@code{CONFIGURE_MAXIMUM_MESSAGE_QUEUES} macro defaults to 0.
+
+@item maximum_partitions
+is the maximum number of
+partitions that can be concurrently active in the system.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_PARTITIONS}.
+If not defined by the application, then the @code{CONFIGURE_MAXIMUM_PARTITIONS}
+macro defaults to 0.
+
+@item maximum_regions
+is the maximum number of regions
+that can be concurrently active in the system.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_REGIONS}.
+If not defined by the application, then the @code{CONFIGURE_MAXIMUM_REGIONS}
+macro defaults to 0.
+
+@item maximum_ports
+is the maximum number of ports into
+dual-port memory areas that can be concurrently active in the
+system.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_PORTS}.
+If not defined by the application, then the @code{CONFIGURE_MAXIMUM_PORTS}
+macro defaults to 0.
+
+@item number_of_initialization_tasks
+is the number of initialization tasks configured. At least one
+RTEMS initialization task or POSIX initializatin must be configured
+in order for the user's application to begin executing.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the user must define the
+@code{CONFIGURE_RTEMS_INIT_TASKS_TABLE} to indicate that there
+is one or more RTEMS initialization task. If the application
+only has one RTEMS initialization task, then the automatically
+generated Initialization Task Table will be sufficient. The following
+macros correspond to the single initialization task:
+
+@itemize @bullet
+
+@item @code{CONFIGURE_INIT_TASK_NAME} - is the name of the task.
+If this macro is not defined by the application, then this defaults
+to the task name of @code{"UI1 "} for User Initialization Task 1.
+
+@item @code{CONFIGURE_INIT_TASK_STACK_SIZE} - is the stack size
+of the single initialization task. If this macro is not defined
+by the application, then this defaults to @code{RTEMS_MINIMUM_STACK_SIZE}.
+
+@item @code{CONFIGURE_INIT_TASK_PRIORITY} - is the initial priority
+of the single initialization task. If this macro is not defined
+by the application, then this defaults to 1.
+
+@item @code{CONFIGURE_INIT_TASK_ATTRIBUTES} - is the attributes
+of the single initialization task. If this macro is not defined
+by the application, then this defaults to @code{RTEMS_DEFAULT_ATTRIBUTES}.
+
+@item @code{CONFIGURE_INIT_TASK_ENTRY_POINT} - is the entry point
+of the single initialization task. If this macro is not defined
+by the application, then this defaults to the C language routine
+@code{Init}.
+
+@item @code{CONFIGURE_INIT_TASK_INITIAL_MODES} - is the initial execution
+modes of the single initialization task. If this macro is not defined
+by the application, then this defaults to @code{RTEMS_NO_PREEMPT}.
+
+@item @code{CONFIGURE_INIT_TASK_ARGUMENTS} - is the argument passed to the
+of the single initialization task. If this macro is not defined
+by the application, then this defaults to 0.
+
+
+@end itemize
+
+
+has the option to have
+ value for this field corresponds
+to the setting of the macro @code{}.
+
+@item User_initialization_tasks_table
+is the address of the Initialization Task Table. This table contains the
+information needed to create and start each of the
+initialization tasks. The format of this table will be discussed below.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_EXECUTIVE_RAM_WORK_AREA}.
+
+@end table
+
+@section POSIX API Configuration Table
+
+@cindex POSIX API Configuration Table
+
+The POSIX API Configuration Table is used to configure the
+managers which constitute the POSIX API for a particular application.
+For example, the user can configure the maximum number of threads for
+this application. The POSIX API Configuration Table is defined in
+the following @value{LANGUAGE} @value{STRUCTURE}:
+
+@ifset is-C
+@findex posix_initialization_threads_table
+@findex posix_api_configuration_table
+@example
+@group
+typedef struct @{
+ void *(*thread_entry)(void *);
+@} posix_initialization_threads_table;
+
+typedef struct @{
+ int maximum_threads;
+ int maximum_mutexes;
+ int maximum_condition_variables;
+ int maximum_keys;
+ int maximum_timers;
+ int maximum_queued_signals;
+ int number_of_initialization_tasks;
+ posix_initialization_threads_table *User_initialization_tasks_table;
+@} posix_api_configuration_table;
+@end group
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+ type POSIX_Thread_Entry is access procedure (
+ Argument : in RTEMS.Address
+ );
+
+ type POSIX_Initialization_Threads_Table_Entry is
+ record
+ Thread_Entry : RTEMS.POSIX_Thread_Entry;
+ end record;
+
+ type POSIX_Initialization_Threads_Table is array
+ ( RTEMS.Unsigned32 range <> ) of
+ RTEMS.POSIX_Initialization_Threads_Table_Entry;
+
+ type POSIX_Initialization_Threads_Table_Pointer is access all
+ POSIX_Initialization_Threads_Table;
+
+ type POSIX_API_Configuration_Table_Entry is
+ record
+ Maximum_Threads : Interfaces.C.Int;
+ Maximum_Mutexes : Interfaces.C.Int;
+ Maximum_Condition_Variables : Interfaces.C.Int;
+ Maximum_Keys : Interfaces.C.Int;
+ Maximum_Timers : Interfaces.C.Int;
+ Maximum_Queued_Signals : Interfaces.C.Int;
+ Number_Of_Initialization_Tasks : Interfaces.C.Int;
+ User_Initialization_Tasks_Table :
+ RTEMS.POSIX_Initialization_Threads_Table_Pointer;
+ end record;
+
+ type POSIX_API_Configuration_Table is array
+ ( RTEMS.Unsigned32 range <> ) of
+ RTEMS.POSIX_API_Configuration_Table_Entry;
+
+ type POSIX_API_Configuration_Table_Pointer is access all
+ RTEMS.POSIX_API_Configuration_Table;
+@end example
+@end ifset
+
+@table @b
+@item maximum_threads
+is the maximum number of threads that
+can be concurrently active (created) in the system including
+initialization threads.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_POSIX_THREADS}.
+If not defined by the application, then the
+@code{CONFIGURE_MAXIMUM_POSIX_THREADS} macro defaults to 10.
+
+@item maximum_mutexes
+is the maximum number of mutexes that can be concurrently
+active in the system.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_POSIX_MUTEXES}.
+If not defined by the application, then the
+@code{CONFIGURE_MAXIMUM_POSIX_MUTEXES} macro defaults to 0.
+
+@item maximum_condition_variables
+is the maximum number of condition variables that can be
+concurrently active in the system.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES}.
+If not defined by the application, then the
+@code{CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES} macro defaults to 0.
+
+@item maximum_keys
+is the maximum number of keys that can be concurrently active in the system.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_POSIX_KEYS}.
+If not defined by the application, then the
+@code{CONFIGURE_MAXIMUM_POSIX_KEYS} macro defaults to 0.
+
+@item maximum_timers
+is the maximum number of POSIX timers that can be concurrently active
+in the system.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_POSIX_TIMERS}.
+If not defined by the application, then the
+@code{CONFIGURE_MAXIMUM_POSIX_TIMERS} macro defaults to 0.
+
+@item maximum_queued_signals
+is the maximum number of queued signals that can be concurrently
+pending in the system.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS}.
+If not defined by the application, then the
+@code{CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS} macro defaults to 0.
+
+@item number_of_initialization_threads
+is the number of initialization threads configured. At least one
+initialization threads must be configured.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the user must define the
+@code{CONFIGURE_POSIX_INIT_THREAD_TABLE} to indicate that there
+is one or more POSIX initialization thread. If the application
+only has one POSIX initialization thread, then the automatically
+generated POSIX Initialization Thread Table will be sufficient. The following
+macros correspond to the single initialization task:
+
+@itemize @bullet
+
+@item @code{CONFIGURE_POSIX_INIT_THREAD_ENTRY_POINT} - is the entry
+point of the thread. If this macro is not defined by the application,
+then this defaults to the C routine @code{POSIX_Init}.
+
+@item @code{CONFIGURE_POSIX_INIT_TASK_STACK_SIZE} - is the stack size
+of the single initialization thread. If this macro is not defined
+by the application, then this defaults to
+@code{(RTEMS_MINIMUM_STACK_SIZE * 2)}.
+
+@end itemize
+
+@item User_initialization_threads_table
+is the address of the Initialization Threads Table. This table contains the
+information needed to create and start each of the initialization threads.
+The format of each entry in this table is defined in the
+@code{posix_initialization_threads_table} @value{STRUCTURE}.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the address of the @code{POSIX_Initialization_threads} structure.
+
+@end table
+
+@section CPU Dependent Information Table
+
+@cindex CPU Dependent Information Table
+
+The CPU Dependent Information Table is used to
+describe processor dependent information required by RTEMS.
+This table is generally used to supply RTEMS with information
+only known by the Board Support Package. The contents of this
+table are discussed in the CPU Dependent Information Table
+chapter of the Applications Supplement document for a specific
+target processor.
+
+The @code{confdefs.h} mechanism does not support generating this
+table. It is normally filled in by the Board Support Package.
+
+@section Initialization Task Table
+
+@cindex Initialization Tasks Table
+
+The Initialization Task Table is used to describe
+each of the user initialization tasks to the Initialization
+Manager. The table contains one entry for each initialization
+task the user wishes to create and start. The fields of this
+data structure directly correspond to arguments to the
+@code{@value{DIRPREFIX}task_create} and
+@code{@value{DIRPREFIX}task_start} directives. The number of entries is
+found in the @code{number_of_initialization_tasks} entry in the
+Configuration Table.
+
+The format of each entry in the
+Initialization Task Table is defined in the following @value{LANGUAGE}
+@value{STRUCTURE}:
+
+@ifset is-C
+@findex rtems_initialization_tasks_table
+@example
+typedef struct @{
+ rtems_name name;
+ rtems_unsigned32 stack_size;
+ rtems_task_priority initial_priority;
+ rtems_attribute attribute_set;
+ rtems_task_entry entry_point;
+ rtems_mode mode_set;
+ rtems_task_argument argument;
+@} rtems_initialization_tasks_table;
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+type Initialization_Tasks_Table_Entry is
+ record
+ Name : RTEMS.Name; -- task name
+ Stack_Size : RTEMS.Unsigned32; -- task stack size
+ Initial_Priority : RTEMS.Task_priority; -- task priority
+ Attribute_Set : RTEMS.Attribute; -- task attributes
+ Entry_Point : RTEMS.Task_Entry; -- task entry point
+ Mode_Set : RTEMS.Mode; -- task initial mode
+ Argument : RTEMS.Unsigned32; -- task argument
+ end record;
+
+type Initialization_Tasks_Table is array
+ ( RTEMS.Unsigned32 range <> ) of
+ RTEMS.Initialization_Tasks_Table_Entry;
+
+type Initialization_Tasks_Table_Pointer is access all
+ Initialization_Tasks_Table;
+@end example
+@end ifset
+
+@table @b
+@item name
+is the name of this initialization task.
+
+@item stack_size
+is the size of the stack for this initialization task.
+
+@item initial_priority
+is the priority of this initialization task.
+
+@item attribute_set
+is the attribute set used during creation of this initialization task.
+
+@item entry_point
+is the address of the entry point of this initialization task.
+
+@item mode_set
+is the initial execution mode of this initialization task.
+
+@item argument
+is the initial argument for this initialization task.
+
+@end table
+
+A typical declaration for an Initialization Task Table might appear as follows:
+
+@ifset is-C
+@example
+rtems_initialization_tasks_table
+Initialization_tasks[2] = @{
+ @{ INIT_1_NAME,
+ 1024,
+ 1,
+ DEFAULT_ATTRIBUTES,
+ Init_1,
+ DEFAULT_MODES,
+ 1
+
+ @},
+ @{ INIT_2_NAME,
+ 1024,
+ 250,
+ FLOATING_POINT,
+ Init_2,
+ NO_PREEMPT,
+ 2
+
+ @}
+@};
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+Initialization_Tasks : aliased
+ RTEMS.Initialization_Tasks_Table( 1 .. 2 ) := (
+ (INIT_1_NAME,
+ 1024,
+ 1,
+ RTEMS.Default_Attributes,
+ Init_1'Access,
+ RTEMS.Default_Modes,
+ 1),
+ (INIT_2_NAME,
+ 1024,
+ 250,
+ RTEMS.Floating_Point,
+ Init_2'Access,
+ RTEMS.No_Preempt,
+ 2)
+);
+@end example
+@end ifset
+
+@section Driver Address Table
+
+@cindex Device Driver Table
+
+The Device Driver Table is used to inform the I/O Manager of the set of
+entry points for each device driver configured in the system. The table
+contains one entry for each device driver required by the application.
+The number of entries is defined in the number_of_device_drivers entry
+in the Configuration Table. This table is copied to the Device Drive
+Table during the IO Manager's initialization giving the entries in this
+table the lower major numbers. The format of each entry in the Device
+Driver Table is defined in the following @value{LANGUAGE}
+@value{STRUCTURE}:
+
+@ifset is-C
+@findex rtems_driver_address_table
+@example
+typedef struct @{
+ rtems_device_driver_entry initialization;
+ rtems_device_driver_entry open;
+ rtems_device_driver_entry close;
+ rtems_device_driver_entry read;
+ rtems_device_driver_entry write;
+ rtems_device_driver_entry control;
+@} rtems_driver_address_table;
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+type Driver_Address_Table_Entry is
+ record
+ Initialization : RTEMS.Device_Driver_Entry;
+ Open : RTEMS.Device_Driver_Entry;
+ Close : RTEMS.Device_Driver_Entry;
+ Read : RTEMS.Device_Driver_Entry;
+ Write : RTEMS.Device_Driver_Entry;
+ Control : RTEMS.Device_Driver_Entry;
+ end record;
+
+type Driver_Address_Table is array ( RTEMS.Unsigned32 range <> ) of
+ RTEMS.Driver_Address_Table_Entry;
+
+type Driver_Address_Table_Pointer is access all Driver_Address_Table;
+@end example
+@end ifset
+
+@table @b
+@item initialization
+is the address of the entry point called by
+@code{@value{DIRPREFIX}io_initialize}
+to initialize a device driver and its associated devices.
+
+@item open
+is the address of the entry point called by @code{@value{DIRPREFIX}io_open}.
+
+@item close
+is the address of the entry point called by @code{@value{DIRPREFIX}io_close}.
+
+@item read
+is the address of the entry point called by @code{@value{DIRPREFIX}io_read}.
+
+@item write
+is the address of the entry point called by @code{@value{DIRPREFIX}io_write}.
+
+@item control
+is the address of the entry point called by @code{@value{DIRPREFIX}io_control}.
+
+@end table
+
+Driver entry points configured as NULL will always
+return a status code of @code{@value{RPREFIX}SUCCESSFUL}. No user code will be
+executed in this situation.
+
+A typical declaration for a Device Driver Table might appear as follows:
+
+@ifset is-C
+@example
+rtems_driver_address_table Driver_table[2] = @{
+ @{ tty_initialize, tty_open, tty_close, /* major = 0 */
+ tty_read, tty_write, tty_control
+ @},
+ @{ lp_initialize, lp_open, lp_close, /* major = 1 */
+ NULL, lp_write, lp_control
+ @}
+@};
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+@end example
+@end ifset
+
+More information regarding the construction and
+operation of device drivers is provided in the I/O Manager
+chapter.
+
+@section User Extensions Table
+
+@cindex User Extensions Table
+
+The User Extensions Table is used to inform RTEMS of
+the optional user-supplied static extension set. This table
+contains one entry for each possible extension. The entries are
+called at critical times in the life of the system and
+individual tasks. The application may create dynamic extensions
+in addition to this single static set. The format of each entry
+in the User Extensions Table is defined in the following @value{LANGUAGE}
+@value{STRUCTURE}:
+
+@ifset is-C
+@example
+typedef User_extensions_routine rtems_extension;
+typedef User_extensions_thread_create_extension
+ rtems_task_create_extension;
+typedef User_extensions_thread_delete_extension
+ rtems_task_delete_extension;
+typedef User_extensions_thread_start_extension
+ rtems_task_start_extension;
+typedef User_extensions_thread_restart_extension
+ rtems_task_restart_extension;
+typedef User_extensions_thread_switch_extension
+ rtems_task_switch_extension;
+typedef User_extensions_thread_begin_extension
+ rtems_task_begin_extension;
+typedef User_extensions_thread_exitted_extension
+ rtems_task_exitted_extension;
+typedef User_extensions_fatal_extension rtems_fatal_extension;
+
+typedef User_extensions_Table rtems_extensions_table;
+
+typedef struct @{
+ rtems_task_create_extension thread_create;
+ rtems_task_start_extension thread_start;
+ rtems_task_restart_extension thread_restart;
+ rtems_task_delete_extension thread_delete;
+ rtems_task_switch_extension thread_switch;
+ rtems_task_begin_extension thread_begin;
+ rtems_task_exitted_extension thread_exitted;
+ rtems_fatal_extension fatal;
+@} User_extensions_Table;
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+type Extensions_Table_Entry is
+ record
+ Thread_Create : RTEMS.Thread_Create_Extension;
+ Thread_Start : RTEMS.Thread_Start_Extension;
+ Thread_Restart : RTEMS.Thread_Restart_Extension;
+ Thread_Delete : RTEMS.Thread_Delete_Extension;
+ Thread_Switch : RTEMS.Thread_Switch_Extension;
+ Thread_Post_Switch : RTEMS.Thread_Post_Switch_Extension;
+ Thread_Begin : RTEMS.Thread_Begin_Extension;
+ Thread_Exitted : RTEMS.Thread_Exitted_Extension;
+ Fatal : RTEMS.Fatal_Error_Extension;
+ end record;
+@end example
+@end ifset
+
+@table @b
+
+@item thread_create
+is the address of the
+user-supplied subroutine for the TASK_CREATE extension. If this
+extension for task creation is defined, it is called from the
+task_create directive. A value of NULL indicates that no
+extension is provided.
+
+@item thread_start
+is the address of the user-supplied
+subroutine for the TASK_START extension. If this extension for
+task initiation is defined, it is called from the task_start
+directive. A value of NULL indicates that no extension is
+provided.
+
+@item thread_restart
+is the address of the user-supplied
+subroutine for the TASK_RESTART extension. If this extension
+for task re-initiation is defined, it is called from the
+task_restart directive. A value of NULL indicates that no
+extension is provided.
+
+@item thread_delete
+is the address of the user-supplied
+subroutine for the TASK_DELETE extension. If this RTEMS
+extension for task deletion is defined, it is called from the
+task_delete directive. A value of NULL indicates that no
+extension is provided.
+
+@item thread_switch
+is the address of the user-supplied
+subroutine for the task context switch extension. This
+subroutine is called from RTEMS dispatcher after the current
+task has been swapped out but before the new task has been
+swapped in. A value of NULL indicates that no extension is
+provided. As this routine is invoked after saving the current
+task's context and before restoring the heir task's context, it
+is not necessary for this routine to save and restore any
+registers.
+
+@item thread_begin
+is the address of the user-supplied
+subroutine which is invoked immediately before a task begins
+execution. It is invoked in the context of the beginning task.
+A value of NULL indicates that no extension is provided.
+
+@item thread_exitted
+is the address of the user-supplied
+subroutine which is invoked when a task exits. This procedure
+is responsible for some action which will allow the system to
+continue execution (i.e. delete or restart the task) or to
+terminate with a fatal error. If this field is set to NULL, the
+default RTEMS TASK_EXITTED handler will be invoked.
+
+@item fatal
+is the address of the user-supplied
+subroutine for the FATAL extension. This RTEMS extension of
+fatal error handling is called from the
+@code{@value{DIRPREFIX}fatal_error_occurred}
+directive. If the user's fatal error handler returns or if this
+entry is NULL then the default RTEMS fatal error handler will be
+executed.
+
+@end table
+
+A typical declaration for a User Extension Table
+which defines the TASK_CREATE, TASK_DELETE, TASK_SWITCH, and
+FATAL extension might appear as follows:
+
+@ifset is-C
+@example
+rtems_extensions_table User_extensions = @{
+ task_create_extension,
+ NULL,
+ NULL,
+ task_delete_extension,
+ task_switch_extension,
+ NULL,
+ NULL,
+ fatal_extension
+@};
+@end example
+@end ifset
+
+@ifset is-Ada
+User_Extensions : RTEMS.Extensions_Table := (
+ Task_Create_Extension'Access,
+ null,
+ null,
+ Task_Delete_Extension'Access,
+ Task_Switch_Extension'Access,
+ null,
+ null,
+ Fatal_Extension'Access
+);
+@example
+
+@end example
+@end ifset
+
+More information regarding the user extensions is
+provided in the User Extensions chapter.
+
+@section Multiprocessor Configuration Table
+
+@cindex Multiprocessor Configuration Table
+
+The Multiprocessor Configuration Table contains
+information needed when using RTEMS in a multiprocessor
+configuration. Many of the details associated with configuring
+a multiprocessor system are dependent on the multiprocessor
+communications layer provided by the user. The address of the
+Multiprocessor Configuration Table should be placed in the
+@code{User_multiprocessing_table} entry in the primary Configuration
+Table. Further details regarding many of the entries in the
+Multiprocessor Configuration Table will be provided in the
+Multiprocessing chapter.
+
+
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the macro @code{CONFIGURE_MP_APPLICATION} must
+be defined to automatically generate the Multiprocessor Configuration Table.
+If @code{CONFIGURE_MP_APPLICATION}, is not defined, then a NULL pointer
+is configured as the address of this table.
+
+The format of the Multiprocessor Configuration Table is defined in
+the following @value{LANGUAGE} @value{STRUCTURE}:
+
+@ifset is-C
+@example
+typedef struct @{
+ rtems_unsigned32 node;
+ rtems_unsigned32 maximum_nodes;
+ rtems_unsigned32 maximum_global_objects;
+ rtems_unsigned32 maximum_proxies;
+ rtems_mpci_table *User_mpci_table;
+@} rtems_multiprocessing_table;
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+type Multiprocessing_Table is
+ record
+ Node : RTEMS.Unsigned32;
+ Maximum_Nodes : RTEMS.Unsigned32;
+ Maximum_Global_Objects : RTEMS.Unsigned32;
+ Maximum_Proxies : RTEMS.Unsigned32;
+ User_MPCI_Table : RTEMS.MPCI_Table_Pointer;
+ end record;
+
+type Multiprocessing_Table_Pointer is access all Multiprocessing_Table;
+@end example
+@end ifset
+
+@table @b
+@item node
+is a unique processor identifier
+and is used in routing messages between nodes in a
+multiprocessor configuration. Each processor must have a unique
+node number. RTEMS assumes that node numbers start at one and
+increase sequentially. This assumption can be used to advantage
+by the user-supplied MPCI layer. Typically, this requirement is
+made when the node numbers are used to calculate the address of
+inter-processor communication links. Zero should be avoided as
+a node number because some MPCI layers use node zero to
+represent broadcasted packets. Thus, it is recommended that
+node numbers start at one and increase sequentially.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MP_NODE_NUMBER}.
+If not defined by the application, then the @code{CONFIGURE_MP_NODE_NUMBER}
+macro defaults to the value of the @code{NODE_NUMBER} macro which is
+set on the compiler command line by the RTEMS Multiprocessing Test Suites.
+
+
+@item maximum_nodes
+is the number of processor nodes in the system.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MP_MAXIMUM_NODES}.
+If not defined by the application, then the @code{CONFIGURE_MP_MAXIMUM_NODES}
+macro defaults to the value 2.
+
+@item maximum_global_objects
+is the maximum number of global objects which can exist at any
+given moment in the entire system. If this parameter is not the
+same on all nodes in the system, then a fatal error is generated
+to inform the user that the system is inconsistent.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS}.
+If not defined by the application, then the
+@code{CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS} macro defaults to the value 32.
+
+
+@item maximum_proxies
+is the maximum number of proxies which can exist at any given moment
+on this particular node. A proxy is a substitute task control block
+which represent a task residing on a remote node when that task blocks
+on a remote object. Proxies are used in situations in which delayed
+interaction is required with a remote node.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MP_MAXIMUM_PROXIES}.
+If not defined by the application, then the @code{CONFIGURE_MP_MAXIMUM_PROXIES}
+macro defaults to the value 32.
+
+
+@item User_mpci_table
+is the address of the Multiprocessor Communications Interface
+Table. This table contains the entry points of user-provided functions
+which constitute the multiprocessor communications layer. This table
+must be provided in multiprocessor configurations with all
+entries configured. The format of this table and details
+regarding its entries can be found in the next section.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MP_MPCI_TABLE_POINTER}.
+If not defined by the application, then the
+@code{CONFIGURE_MP_MPCI_TABLE_POINTER} macro defaults to the
+address of the table named @code{MPCI_table}.
+
+
+@end table
+
+@section Multiprocessor Communications Interface Table
+
+@cindex Multiprocessor Communications Interface Table
+
+This table defines the set of callouts that must be provided by
+an Multiprocessor Communications Interface implementation.
+
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the name of this table is assumed
+to be @code{MPCI_table} unless the application sets
+the @code{CONFIGURE_MP_MPCI_TABLE_POINTER} when configuring a
+multiprocessing system.
+
+The format of this table is defined in
+the following @value{LANGUAGE} @value{STRUCTURE}:
+
+@ifset is-C
+@example
+typedef struct @{
+ rtems_unsigned32 default_timeout; /* in ticks */
+ rtems_unsigned32 maximum_packet_size;
+ rtems_mpci_initialization_entry initialization;
+ rtems_mpci_get_packet_entry get_packet;
+ rtems_mpci_return_packet_entry return_packet;
+ rtems_mpci_send_entry send;
+ rtems_mpci_receive_entry receive;
+@} rtems_mpci_table;
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+type MPCI_Table is
+ record
+ Default_Timeout : RTEMS.Unsigned32; -- in ticks
+ Maximum_Packet_Size : RTEMS.Unsigned32;
+ Initialization : RTEMS.MPCI_Initialization_Entry;
+ Get_Packet : RTEMS.MPCI_Get_Packet_Entry;
+ Return_Packet : RTEMS.MPCI_Return_Packet_Entry;
+ Send : RTEMS.MPCI_Send_Entry;
+ Receive : RTEMS.MPCI_Receive_Entry;
+ end record;
+
+type MPCI_Table_Pointer is access all MPCI_Table;
+@end example
+@end ifset
+
+@table @b
+@item default_timeout
+is the default maximum length of time a task should block waiting for
+a response to a directive which results in communication with a remote node.
+The maximum length of time is a function the user supplied
+multiprocessor communications layer and the media used. This
+timeout only applies to directives which would not block if the
+operation were performed locally.
+
+@item maximum_packet_size
+is the size in bytes of the longest packet which the MPCI layer is capable
+of sending. This value should represent the total number of bytes available
+for a RTEMS interprocessor messages.
+
+@item initialization
+is the address of the entry point for the initialization procedure of the
+user supplied multiprocessor communications layer.
+
+@item get_packet
+is the address of the entry point for the procedure called by RTEMS to
+obtain a packet from the user supplied multiprocessor communications layer.
+
+@item return_packet
+is the address of the entry point for the procedure called by RTEMS to
+return a packet to the user supplied multiprocessor communications layer.
+
+@item send
+is the address of the entry point for the procedure called by RTEMS to
+send an envelope to another node. This procedure is part of the user
+supplied multiprocessor communications layer.
+
+@item receive
+is the address of the entry point for the
+procedure called by RTEMS to retrieve an envelope containing a
+message from another node. This procedure is part of the user
+supplied multiprocessor communications layer.
+
+@end table
+
+More information regarding the required functionality of these
+entry points is provided in the Multiprocessor chapter.
+
+@section Determining Memory Requirements
+
+Since memory is a critical resource in many real-time
+embedded systems, the RTEMS Classic API was specifically designed to allow
+unused managers to be forcibly excluded from the run-time environment.
+This allows the application designer the flexibility to tailor
+RTEMS to most efficiently meet system requirements while still
+satisfying even the most stringent memory constraints. As
+result, the size of the RTEMS executive is application
+dependent. A Memory Requirements worksheet is provided in the
+Applications Supplement document for a specific target
+processor. This worksheet can be used to calculate the memory
+requirements of a custom RTEMS run-time environment. To insure
+that enough memory is allocated for future versions of RTEMS,
+the application designer should round these memory requirements
+up. The following Classic API managers may be optionally excluded:
+
+@itemize @bullet
+@item signal
+@item region
+@item dual ported memory
+@item event
+@item multiprocessing
+@item partition
+@item timer
+@item semaphore
+@item message
+@item rate monotonic
+@end itemize
+
+RTEMS is designed to be built and installed as a library
+that is linked into the application. As such, much of
+RTEMS is implemented in such a way that there is a single
+entry point per source file. This avoids having the
+linker being forced to pull large object files in their
+entirety into an application when the application references
+a single symbol.
+
+RTEMS based applications must somehow provide memory
+for RTEMS' code and data space. Although RTEMS' data space must
+be in RAM, its code space can be located in either ROM or RAM.
+In addition, the user must allocate RAM for the RTEMS RAM
+Workspace. The size of this area is application dependent and
+can be calculated using the formula provided in the Memory
+Requirements chapter of the Applications Supplement document
+for a specific target processor.
+
+All private RTEMS data variables and routine names used by
+RTEMS begin with the underscore ( _ ) character followed by an
+upper-case letter. If RTEMS is linked with an application, then
+the application code should NOT contain any symbols which begin
+with the underscore character and followed by an upper-case
+letter to avoid any naming conflicts. All RTEMS directive names
+should be treated as reserved words.
+
+@section Sizing the RTEMS RAM Workspace
+
+The RTEMS RAM Workspace is a user-specified block of
+memory reserved for use by RTEMS. The application should NOT
+modify this memory. This area consists primarily of the RTEMS
+data structures whose exact size depends upon the values
+specified in the Configuration Table. In addition, task stacks
+and floating point context areas are dynamically allocated from
+the RTEMS RAM Workspace.
+
+The @code{confdefs.h} mechanism calcalutes the size
+of the RTEMS RAM Workspace automatically. It assumes that
+all tasks are floating point and that all will be allocated
+the miminum stack space. This calculation also automatically
+includes the memory that will be allocated for internal use
+by RTEMS. The following macros may be set
+by the application to make the calculation
+of memory required more accurate:
+
+@itemize @bullet
+
+@item @code{CONFIGURE_MEMORY_OVERHEAD}
+@item @code{CONFIGURE_EXTRA_TASK_STACKS}
+
+@end itemize
+
+The starting address of the RTEMS RAM Workspace must
+be aligned on a four-byte boundary. Failure to properly align
+the workspace area will result in the
+@code{@value{DIRPREFIX}fatal_error_occurred}
+directive being invoked with the
+@code{@value{RPREFIX}INVALID_ADDRESS} error code.
+
+A worksheet is provided in the @b{Memory Requirements}
+chapter of the Applications Supplement document for a specific
+target processor to assist the user in calculating the minimum
+size of the RTEMS RAM Workspace for each application. The value
+calculated with this worksheet is the minimum value that should
+be specified as the @code{work_space_size} parameter of the
+Configuration Table.
+
+The allocation of objects can operate in two modes. The default mode
+has an object number ceiling. No more than the specified number of
+objects can be allocated from the RTEMS RAM Workspace. The number of objects
+specified in the particular API Configuration table fields are
+allocated at initialisation. The second mode allows the number of
+objects to grow to use the available free memory in the RTEMS RAM Workspace.
+
+The auto-extending mode can be enabled individually for each object
+type by using the macro @code{rtems_resource_unlimited}. This takes a value
+as a parameter, and is used to set the object maximum number field in
+an API Configuration table. The value is an allocation unit size. When
+RTEMS is required to grow the object table it is grown by this
+size. The kernel will return the object memory back to the RTEMS RAM Workspace
+when an object is destroyed. The kernel will only return an allocated
+block of objects to the RTEMS RAM Workspace if at least half the allocation
+size of free objects remain allocated. RTEMS always keeps one
+allocation block of objects allocated. Here is an example of using
+@code{rtems_resource_unlimited}:
+
+@example
+#define CONFIGURE_MAXIMUM_TASKS rtems_resource_unlimited(5)
+@end example
+
+The user is cautioned that future versions of RTEMS may not have the
+same memory requirements per object. Although the value calculated is
+suficient for a particular target processor and release of RTEMS,
+memory usage is subject to change across versions and target
+processors. The user is advised to allocate somewhat more memory than
+the worksheet recommends to insure compatibility with future releases
+for a specific target processor and other target processors. To avoid
+problems, the user should recalculate the memory requirements each
+time one of the following events occurs:
+
+@itemize @bullet
+@item a configuration parameter is modified,
+@item task or interrupt stack requirements change,
+@item task floating point attribute is altered,
+@item RTEMS is upgraded, or
+@item the target processor is changed.
+@end itemize
+
+Failure to provide enough space in the RTEMS RAM
+Workspace will result in the
+@code{@value{DIRPREFIX}fatal_error_occurred} directive
+being invoked with the appropriate error code.
diff --git a/doc/user/datatypes.t b/doc/user/datatypes.t
new file mode 100644
index 0000000000..d842786676
--- /dev/null
+++ b/doc/user/datatypes.t
@@ -0,0 +1,311 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter RTEMS Data Types
+
+@section Introduction
+
+This chapter contains a complete list of the RTEMS primitive
+data types in alphabetical order. This is intended to be
+an overview and the user is encouraged to look at the appropriate
+chapters in the manual for more information about the
+usage of the various data types.
+
+@section List of Data Types
+
+The following is a complete list of the RTEMS primitive
+data types in alphabetical order:
+
+@itemize @bullet
+
+@findex rtems_address
+@item @code{@value{DIRPREFIX}address} is the data type used to manage
+addresses. It is equivalent to
+@ifset is-C
+a "void *" pointer.
+@end ifset
+@ifset is-Ada
+the System.Address data type.
+@end ifset
+
+@findex rtems_asr
+@item @code{@value{DIRPREFIX}asr} is the return type for an
+RTEMS ASR.
+
+@findex rtems_asr_entry
+@item @code{@value{DIRPREFIX}asr_entry} is the address of
+the entry point to an RTEMS ASR.
+
+@findex rtems_attribute
+@item @code{@value{DIRPREFIX}attribute} is the data type used
+to manage the attributes for RTEMS objects. It is primarily
+used as an argument to object create routines to specify
+characteristics of the new object.
+
+@findex rtems_boolean
+@item @code{@value{DIRPREFIX}boolean} may only take on the
+values of @code{TRUE} and @code{FALSE}.
+
+@findex rtems_context
+@item @code{@value{DIRPREFIX}context} is the CPU dependent
+data structure used to manage the integer and system
+register portion of each task's context.
+
+@findex rtems_context_fp
+@item @code{@value{DIRPREFIX}context_fp} is the CPU dependent
+data structure used to manage the floating point portion of
+each task's context.
+
+@findex rtems_device_driver
+@item @code{@value{DIRPREFIX}device_driver} is the
+return type for a RTEMS device driver routine.
+
+@findex rtems_device_driver_entry
+@item @code{@value{DIRPREFIX}device_driver_entry} is the
+entry point to a RTEMS device driver routine.
+
+@findex rtems_device_major_number
+@item @code{@value{DIRPREFIX}device_major_number} is the
+data type used to manage device major numbers.
+
+@findex rtems_device_minor_number
+@item @code{@value{DIRPREFIX}device_minor_number} is the
+data type used to manage device minor numbers.
+
+@findex rtems_double
+@item @code{@value{DIRPREFIX}double} is the RTEMS data
+type that corresponds to double precision floating point
+on the target hardware.
+
+@findex rtems_event_set
+@item @code{@value{DIRPREFIX}event_set} is the data
+type used to manage and manipulate RTEMS event sets
+with the Event Manager.
+
+@findex rtems_extension
+@item @code{@value{DIRPREFIX}extension} is the return type
+for RTEMS user extension routines.
+
+@findex rtems_fatal_extension
+@item @code{@value{DIRPREFIX}fatal_extension} is the
+entry point for a fatal error user extension handler routine.
+
+@findex rtems_id
+@item @code{@value{DIRPREFIX}id} is the data type used
+to manage and manipulate RTEMS object IDs.
+
+@findex rtems_interrupt_frame
+@item @code{@value{DIRPREFIX}interrupt_frame} is the
+data structure that defines the format of the interrupt
+stack frame as it appears to a user ISR. This data
+structure may not be defined on all ports.
+
+@findex rtems_interrupt_level
+@item @code{@value{DIRPREFIX}interrupt_level} is the
+data structure used with the @code{@value{DIRPREFIX}interrupt_disable},
+@code{@value{DIRPREFIX}interrupt_enable}, and
+@code{@value{DIRPREFIX}interrupt_flash} routines. This
+data type is CPU dependent and usually corresponds to
+the contents of the processor register containing
+the interrupt mask level.
+
+@findex rtems_interval
+@item @code{@value{DIRPREFIX}interval} is the data
+type used to manage and manipulate time intervals.
+Intervals are non-negative integers used to measure
+the length of time in clock ticks.
+
+@findex rtems_isr
+@item @code{@value{DIRPREFIX}isr} is the return type
+of a function implementing an RTEMS ISR.
+
+@findex rtems_isr_entry
+@item @code{@value{DIRPREFIX}isr_entry} is the address of
+the entry point to an RTEMS ISR. It is equivalent to the
+entry point of the function implementing the ISR.
+
+@findex rtems_mp_packet_classes
+@item @code{@value{DIRPREFIX}mp_packet_classes} is the
+enumerated type which specifies the categories of
+multiprocessing messages. For example, one of the
+classes is for messages that must be processed by
+the Task Manager.
+
+@findex rtems_mode
+@item @code{@value{DIRPREFIX}mode} is the data type
+used to manage and dynamically manipulate the execution
+mode of an RTEMS task.
+
+@findex rtems_mpci_entry
+@item @code{@value{DIRPREFIX}mpci_entry} is the return type
+of an RTEMS MPCI routine.
+
+@findex rtems_mpci_get_packet_entry
+@item @code{@value{DIRPREFIX}mpci_get_packet_entry} is the address of
+the entry point to the get packet routine for an MPCI implementation.
+
+@findex rtems_mpci_initialization_entry
+@item @code{@value{DIRPREFIX}mpci_initialization_entry} is the address of
+the entry point to the initialization routine for an MPCI implementation.
+
+@findex rtems_mpci_receive_packet_entry
+@item @code{@value{DIRPREFIX}mpci_receive_packet_entry} is the address of
+the entry point to the receive packet routine for an MPCI implementation.
+
+@findex rtems_mpci_return_packet_entry
+@item @code{@value{DIRPREFIX}mpci_return_packet_entry} is the address of
+the entry point to the return packet routine for an MPCI implementation.
+
+@findex rtems_mpci_send_packet_entry
+@item @code{@value{DIRPREFIX}mpci_send_packet_entry} is the address of
+the entry point to the send packet routine for an MPCI implementation.
+
+@findex rtems_mpci_table
+@item @code{@value{DIRPREFIX}mpci_table} is the data structure
+containing the configuration information for an MPCI.
+
+@findex rtems_option
+@item @code{@value{DIRPREFIX}option} is the data type
+used to specify which behavioral options the caller desires.
+It is commonly used with potentially blocking directives to specify
+whether the caller is willing to block or return immediately with an error
+indicating that the resource was not available.
+
+@findex rtems_packet_prefix
+@item @code{@value{DIRPREFIX}packet_prefix} is the data structure
+that defines the first bytes in every packet sent between nodes
+in an RTEMS multiprocessor system. It contains routing information
+that is expected to be used by the MPCI layer.
+
+@findex rtems_signal_set
+@item @code{@value{DIRPREFIX}signal_set} is the data
+type used to manage and manipulate RTEMS signal sets
+with the Signal Manager.
+
+@findex rtems_signed8
+@item @code{@value{DIRPREFIX}signed8} is the data
+type that corresponds to signed eight bit integers.
+This data type is defined by RTEMS in a manner that
+ensures it is portable across different target processors.
+
+@findex rtems_signed16
+@item @code{@value{DIRPREFIX}signed16} is the data
+type that corresponds to signed sixteen bit integers.
+This data type is defined by RTEMS in a manner that
+ensures it is portable across different target processors.
+
+@findex rtems_signed32
+@item @code{@value{DIRPREFIX}signed32} is the data
+type that corresponds to signed thirty-two bit integers.
+This data type is defined by RTEMS in a manner that
+ensures it is portable across different target processors.
+
+@findex rtems_signed64
+@item @code{@value{DIRPREFIX}signed64} is the data
+type that corresponds to signed sixty-four bit integers.
+This data type is defined by RTEMS in a manner that
+ensures it is portable across different target processors.
+
+@findex rtems_single
+@item @code{@value{DIRPREFIX}single} is the RTEMS data
+type that corresponds to single precision floating point
+on the target hardware.
+
+@findex rtems_status_codes
+@item @code{@value{DIRPREFIX}status_codes} is the
+@findex rtems_task
+@item @code{@value{DIRPREFIX}task} is the return type for an
+RTEMS Task.
+
+@findex rtems_task_argument
+@item @code{@value{DIRPREFIX}task_argument} is the data
+type for the argument passed to each RTEMS task.
+
+@findex rtems_task_begin_extension
+@item @code{@value{DIRPREFIX}task_begin_extension} is the
+entry point for a task beginning execution user extension handler routine.
+
+@findex rtems_task_create_extension
+@item @code{@value{DIRPREFIX}task_create_extension} is the
+entry point for a task creation execution user extension handler routine.
+
+@findex rtems_task_delete_extension
+@item @code{@value{DIRPREFIX}task_delete_extension} is the
+entry point for a task deletion user extension handler routine.
+
+@findex rtems_task_entry
+@item @code{@value{DIRPREFIX}task_entry} is the address of
+the entry point to an RTEMS ASR. It is equivalent to the
+entry point of the function implementing the ASR.
+
+@findex rtems_task_exitted_extension
+@item @code{@value{DIRPREFIX}task_exitted_extension} is the
+entry point for a task exitted user extension handler routine.
+
+@findex rtems_task_priority
+@item @code{@value{DIRPREFIX}task_priority} is the data type
+used to manage and manipulate task priorities.
+
+@findex rtems_task_restart_extension
+@item @code{@value{DIRPREFIX}task_restart_extension} is the
+entry point for a task restart user extension handler routine.
+
+@findex rtems_task_start_extension
+@item @code{@value{DIRPREFIX}task_start_extension} is the
+entry point for a task start user extension handler routine.
+
+@findex rtems_task_switch_extension
+@item @code{@value{DIRPREFIX}task_switch_extension} is the
+entry point for a task context switch user extension handler routine.
+
+@findex rtems_tcb
+@item @code{@value{DIRPREFIX}tcb} is the data structure associated
+with each task in an RTEMS system.
+
+@findex rtems_time_of_day
+@item @code{@value{DIRPREFIX}time_of_day} is the data structure
+used to manage and manipulate calendar time in RTEMS.
+
+@findex rtems_timer_service_routine
+@item @code{@value{DIRPREFIX}timer_service_routine} is the
+return type for an RTEMS Timer Service Routine.
+
+@findex rtems_timer_service_routine_entry
+@item @code{@value{DIRPREFIX}timer_service_routine_entry} is the address of
+the entry point to an RTEMS TSR. It is equivalent to the
+entry point of the function implementing the TSR.
+
+@findex rtems_unsigned8
+@item @code{@value{DIRPREFIX}unsigned8} is the data
+type that corresponds to unsigned eight bit integers.
+This data type is defined by RTEMS in a manner that
+ensures it is portable across different target processors.
+
+@findex rtems_unsigned16
+@item @code{@value{DIRPREFIX}unsigned16} is the data
+type that corresponds to unsigned sixteen bit integers.
+This data type is defined by RTEMS in a manner that
+ensures it is portable across different target processors.
+
+@findex rtems_unsigned32
+@item @code{@value{DIRPREFIX}unsigned32} is the data
+type that corresponds to unsigned thirty-two bit integers.
+This data type is defined by RTEMS in a manner that
+ensures it is portable across different target processors.
+
+@findex rtems_unsigned64
+@item @code{@value{DIRPREFIX}unsigned64} is the data
+type that corresponds to unsigned sixty-four bit integers.
+This data type is defined by RTEMS in a manner that
+ensures it is portable across different target processors.
+
+@findex rtems_vector_number
+@item @code{@value{DIRPREFIX}vector_number} is the data
+type used to manage and manipulate interrupt vector numbers.
+
+@end itemize
diff --git a/doc/user/dirstat.texi b/doc/user/dirstat.texi
new file mode 100644
index 0000000000..094bcf2b13
--- /dev/null
+++ b/doc/user/dirstat.texi
@@ -0,0 +1,42 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Directive Status Codes, Example Application, Multiprocessing Manager MULTIPROCESSING_ANNOUNCE - Announce the arrival of a packet, Top
+@end ifinfo
+@chapter Directive Status Codes
+@table @b
+@item @code{@value{RPREFIX}SUCCESSFUL} - successful completion
+@item @code{@value{RPREFIX}TASK_EXITTED} - returned from a task
+@item @code{@value{RPREFIX}MP_NOT_CONFIGURED} - multiprocessing not configured
+@item @code{@value{RPREFIX}INVALID_NAME} - invalid object name
+@item @code{@value{RPREFIX}INVALID_ID} - invalid object id
+@item @code{@value{RPREFIX}TOO_MANY} - too many
+@item @code{@value{RPREFIX}TIMEOUT} - timed out waiting
+@item @code{@value{RPREFIX}OBJECT_WAS_DELETED} - object was deleted while waiting
+@item @code{@value{RPREFIX}INVALID_SIZE} - invalid specified size
+@item @code{@value{RPREFIX}INVALID_ADDRESS} - invalid address specified
+@item @code{@value{RPREFIX}INVALID_NUMBER} - number was invalid
+@item @code{@value{RPREFIX}NOT_DEFINED} - item not initialized
+@item @code{@value{RPREFIX}RESOURCE_IN_USE} - resources outstanding
+@item @code{@value{RPREFIX}UNSATISFIED} - request not satisfied
+@item @code{@value{RPREFIX}INCORRECT_STATE} - task is in wrong state
+@item @code{@value{RPREFIX}ALREADY_SUSPENDED} - task already in state
+@item @code{@value{RPREFIX}ILLEGAL_ON_SELF} - illegal for calling task
+@item @code{@value{RPREFIX}ILLEGAL_ON_REMOTE_OBJECT} - illegal for remote object
+@item @code{@value{RPREFIX}CALLED_FROM_ISR} - invalid environment
+@item @code{@value{RPREFIX}INVALID_PRIORITY} - invalid task priority
+@item @code{@value{RPREFIX}INVALID_CLOCK} - invalid time buffer
+@item @code{@value{RPREFIX}INVALID_NODE} - invalid node id
+@item @code{@value{RPREFIX}NOT_CONFIGURED} - directive not configured
+@item @code{@value{RPREFIX}NOT_OWNER_OF_RESOURCE} - not owner of resource
+@item @code{@value{RPREFIX}NOT_IMPLEMENTED} - directive not implemented
+@item @code{@value{RPREFIX}INTERNAL_ERROR} - RTEMS inconsistency detected
+@item @code{@value{RPREFIX}NO_MEMORY} - could not get enough memory
+@end table
+
diff --git a/doc/user/dpmem.t b/doc/user/dpmem.t
new file mode 100644
index 0000000000..b842b519b2
--- /dev/null
+++ b/doc/user/dpmem.t
@@ -0,0 +1,364 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Dual-Ported Memory Manager
+
+@cindex ports
+@cindex dual ported memory
+
+@section Introduction
+
+The dual-ported memory manager provides a mechanism
+for converting addresses between internal and external
+representations for multiple dual-ported memory areas (DPMA).
+The directives provided by the dual-ported memory manager are:
+
+@itemize @bullet
+@item @code{@value{DIRPREFIX}port_create} - Create a port
+@item @code{@value{DIRPREFIX}port_ident} - Get ID of a port
+@item @code{@value{DIRPREFIX}port_delete} - Delete a port
+@item @code{@value{DIRPREFIX}port_external_to_internal} - Convert external to internal address
+@item @code{@value{DIRPREFIX}port_internal_to_external} - Convert internal to external address
+@end itemize
+
+@section Background
+
+@cindex dual ported memory, definition
+@cindex external addresses, definition
+@cindex internal addresses, definition
+
+A dual-ported memory area (DPMA) is an contiguous
+block of RAM owned by a particular processor but which can be
+accessed by other processors in the system. The owner accesses
+the memory using internal addresses, while other processors must
+use external addresses. RTEMS defines a port as a particular
+mapping of internal and external addresses.
+
+There are two system configurations in which
+dual-ported memory is commonly found. The first is
+tightly-coupled multiprocessor computer systems where the
+dual-ported memory is shared between all nodes and is used for
+inter-node communication. The second configuration is computer
+systems with intelligent peripheral controllers. These
+controllers typically utilize the DPMA for high-performance data
+transfers.
+
+@section Operations
+
+@subsection Creating a Port
+
+The @code{@value{DIRPREFIX}port_create} directive creates a port into a DPMA
+with the user-defined name. The user specifies the association
+between internal and external representations for the port being
+created. RTEMS allocates a Dual-Ported Memory Control Block
+(DPCB) from the DPCB free list to maintain the newly created
+DPMA. RTEMS also generates a unique dual-ported memory port ID
+which is returned to the calling task. RTEMS does not
+initialize the dual-ported memory area or access any memory
+within it.
+
+@subsection Obtaining Port IDs
+
+When a port is created, RTEMS generates a unique port
+ID and assigns it to the created port until it is deleted. The
+port ID may be obtained by either of two methods. First, as the
+result of an invocation of the
+@code{@value{DIRPREFIX}port_create} directive, the task
+ID is stored in a user provided location. Second, the port ID
+may be obtained later using the
+@code{@value{DIRPREFIX}port_ident} directive. The port
+ID is used by other dual-ported memory manager directives to
+access this port.
+
+@subsection Converting an Address
+
+The @code{@value{DIRPREFIX}port_external_to_internal} directive is used to
+convert an address from external to internal representation for
+the specified port.
+The @code{@value{DIRPREFIX}port_internal_to_external} directive is
+used to convert an address from internal to external
+representation for the specified port. If an attempt is made to
+convert an address which lies outside the specified DPMA, then
+the address to be converted will be returned.
+
+@subsection Deleting a DPMA Port
+
+A port can be removed from the system and returned to
+RTEMS with the @code{@value{DIRPREFIX}port_delete} directive. When a port is deleted,
+its control block is returned to the DPCB free list.
+
+@section Directives
+
+This section details the dual-ported memory manager's
+directives. A subsection is dedicated to each of this manager's
+directives and describes the calling sequence, related
+constants, usage, and status codes.
+
+@c
+@c
+@c
+@page
+@subsection PORT_CREATE - Create a port
+
+@cindex create a port
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_port_create
+@example
+rtems_status_code rtems_port_create(
+ rtems_name name,
+ void *internal_start,
+ void *external_start,
+ rtems_unsigned32 length,
+ rtems_id *id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Port_Create (
+ Name : in RTEMS.Name;
+ Internal_Start : in RTEMS.Address;
+ External_Start : in RTEMS.Address;
+ Length : in RTEMS.Unsigned32;
+ ID : out RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - port created successfully@*
+@code{@value{RPREFIX}INVALID_NAME} - invalid task name@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - address not on four byte boundary@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{id} is NULL@*
+@code{@value{RPREFIX}TOO_MANY} - too many DP memory areas created
+
+@subheading DESCRIPTION:
+
+This directive creates a port which resides on the
+local node for the specified DPMA. The assigned port id is
+returned in id. This port id is used as an argument to other
+dual-ported memory manager directives to convert addresses
+within this DPMA.
+
+For control and maintenance of the port, RTEMS
+allocates and initializes an DPCB from the DPCB free pool. Thus
+memory from the dual-ported memory area is not used to store the
+DPCB.
+
+@subheading NOTES:
+
+The internal_address and external_address parameters
+must be on a four byte boundary.
+
+This directive will not cause the calling task to be
+preempted.
+
+@c
+@c
+@c
+@page
+@subsection PORT_IDENT - Get ID of a port
+
+@cindex get ID of a port
+@cindex obtain ID of a port
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_port_ident
+@example
+rtems_status_code rtems_port_ident(
+ rtems_name name,
+ rtems_id *id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Port_Ident (
+ Name : in RTEMS.Name;
+ ID : out RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - port identified successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{id} is NULL@*
+@code{@value{RPREFIX}INVALID_NAME} - port name not found
+
+@subheading DESCRIPTION:
+
+This directive obtains the port id associated with
+the specified name to be acquired. If the port name is not
+unique, then the port id will match one of the DPMAs with that
+name. However, this port id is not guaranteed to correspond to
+the desired DPMA. The port id is used to access this DPMA in
+other dual-ported memory area related directives.
+
+@subheading NOTES:
+
+This directive will not cause the running task to be
+preempted.
+
+@c
+@c
+@c
+@page
+@subsection PORT_DELETE - Delete a port
+
+@cindex delete a port
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_port_delete
+@example
+rtems_status_code rtems_port_delete(
+ rtems_id id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Port_Delete (
+ ID : in RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - port deleted successfully@*
+@code{@value{RPREFIX}INVALID_ID} - invalid port id
+
+@subheading DESCRIPTION:
+
+This directive deletes the dual-ported memory area
+specified by id. The DPCB for the deleted dual-ported memory
+area is reclaimed by RTEMS.
+
+@subheading NOTES:
+
+This directive will not cause the calling task to be
+preempted.
+
+The calling task does not have to be the task that
+created the port. Any local task that knows the port id can
+delete the port.
+
+@c
+@c
+@c
+@page
+@subsection PORT_EXTERNAL_TO_INTERNAL - Convert external to internal address
+
+@cindex convert external to internal address
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_port_external_to_internal
+@example
+rtems_status_code rtems_port_external_to_internal(
+ rtems_id id,
+ void *external,
+ void **internal
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Port_External_To_Internal (
+ ID : in RTEMS.ID;
+ External : in RTEMS.Address;
+ Internal : out RTEMS.Address;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{internal} is NULL@*
+@code{@value{RPREFIX}SUCCESSFUL} - successful conversion
+
+@subheading DESCRIPTION:
+
+This directive converts a dual-ported memory address
+from external to internal representation for the specified port.
+If the given external address is invalid for the specified
+port, then the internal address is set to the given external
+address.
+
+@subheading NOTES:
+
+This directive is callable from an ISR.
+
+This directive will not cause the calling task to be
+preempted.
+
+@c
+@c
+@c
+@page
+@subsection PORT_INTERNAL_TO_EXTERNAL - Convert internal to external address
+
+@cindex convert internal to external address
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_port_internal_to_external
+@example
+rtems_status_code rtems_port_internal_to_external(
+ rtems_id id,
+ void *internal,
+ void **external
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Port_Internal_To_External (
+ ID : in RTEMS.ID;
+ Internal : in RTEMS.Address;
+ External : out RTEMS.Address;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{external} is NULL@*
+@code{@value{RPREFIX}SUCCESSFUL} - successful conversion
+
+@subheading DESCRIPTION:
+
+This directive converts a dual-ported memory address
+from internal to external representation so that it can be
+passed to owner of the DPMA represented by the specified port.
+If the given internal address is an invalid dual-ported address,
+then the external address is set to the given internal address.
+
+@subheading NOTES:
+
+This directive is callable from an ISR.
+
+This directive will not cause the calling task to be
+preempted.
+
diff --git a/doc/user/event.t b/doc/user/event.t
new file mode 100644
index 0000000000..13d5af980f
--- /dev/null
+++ b/doc/user/event.t
@@ -0,0 +1,343 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Event Manager
+
+@cindex events
+
+@section Introduction
+
+The event manager provides a high performance method
+of intertask communication and synchronization. The directives
+provided by the event manager are:
+
+@itemize @bullet
+@item @code{@value{DIRPREFIX}event_send} - Send event set to a task
+@item @code{@value{DIRPREFIX}event_receive} - Receive event condition
+@end itemize
+
+@section Background
+
+@subsection Event Sets
+
+@cindex event flag, definition
+@cindex event set, definition
+@findex rtems_event_set
+
+An event flag is used by a task (or ISR) to inform
+another task of the occurrence of a significant situation.
+Thirty-two event flags are associated with each task. A
+collection of one or more event flags is referred to as an event
+set. The data type @code{@value{DIRPREFIX}event_set} is used to manage
+event sets.
+
+The application developer should remember the following
+key characteristics of event operations when utilizing the event
+manager:
+
+@itemize @bullet
+@item Events provide a simple synchronization facility.
+
+@item Events are aimed at tasks.
+
+@item Tasks can wait on more than one event simultaneously.
+
+@item Events are independent of one another.
+
+@item Events do not hold or transport data.
+
+@item Events are not queued. In other words, if an event is
+sent more than once to a task before being received, the second and
+subsequent send operations to that same task have no effect.
+@end itemize
+
+An event set is posted when it is directed (or sent) to a task. A
+pending event is an event that has been posted but not received. An event
+condition is used to specify the event set which the task desires to receive
+and the algorithm which will be used to determine when the request is
+satisfied. An event condition is satisfied based upon one of two
+algorithms which are selected by the user. The
+@code{@value{RPREFIX}EVENT_ANY} algorithm states that an event condition
+is satisfied when at least a single requested event is posted. The
+@code{@value{RPREFIX}EVENT_ALL} algorithm states that an event condition
+is satisfied when every requested event is posted.
+
+@subsection Building an Event Set or Condition
+
+@cindex event condition, building
+@cindex event set, building
+
+An event set or condition is built by a bitwise OR of
+the desired events. The set of valid events is @code{@value{RPREFIX}EVENT_0} through
+@code{@value{RPREFIX}EVENT_31}. If an event is not explicitly specified in the set or
+condition, then it is not present. Events are specifically
+designed to be mutually exclusive, therefore bitwise OR and
+addition operations are equivalent as long as each event appears
+exactly once in the event set list.
+
+For example, when sending the event set consisting of
+@code{@value{RPREFIX}EVENT_6}, @code{@value{RPREFIX}EVENT_15}, and @code{@value{RPREFIX}EVENT_31},
+the event parameter to the @code{@value{DIRPREFIX}event_send}
+directive should be @code{@value{RPREFIX}EVENT_6 @value{OR}
+@value{RPREFIX}EVENT_15 @value{OR} @value{RPREFIX}EVENT_31}.
+
+@subsection Building an EVENT_RECEIVE Option Set
+
+In general, an option is built by a bitwise OR of the
+desired option components. The set of valid options for the
+@code{@value{DIRPREFIX}event_receive} directive are listed
+in the following table:
+
+@itemize @bullet
+@item @code{@value{RPREFIX}WAIT} - task will wait for event (default)
+@item @code{@value{RPREFIX}NO_WAIT} - task should not wait
+@item @code{@value{RPREFIX}EVENT_ALL} - return after all events (default)
+@item @code{@value{RPREFIX}EVENT_ANY} - return after any events
+@end itemize
+
+Option values are specifically designed to be
+mutually exclusive, therefore bitwise OR and addition operations
+are equivalent as long as each option appears exactly once in
+the component list. An option listed as a default is not
+required to appear in the option list, although it is a good
+programming practice to specify default options. If all
+defaults are desired, the option @code{@value{RPREFIX}DEFAULT_OPTIONS} should be
+specified on this call.
+
+This example demonstrates the option parameter needed
+to poll for all events in a particular event condition to
+arrive. The option parameter passed to the
+@code{@value{DIRPREFIX}event_receive} directive should be either
+@code{@value{RPREFIX}EVENT_ALL @value{OR} @value{RPREFIX}NO_WAIT}
+or @code{@value{RPREFIX}NO_WAIT}. The option parameter can be set to
+@code{@value{RPREFIX}NO_WAIT} because @code{@value{RPREFIX}EVENT_ALL} is the
+default condition for @code{@value{DIRPREFIX}event_receive}.
+
+@section Operations
+
+@subsection Sending an Event Set
+
+The @code{@value{DIRPREFIX}event_send} directive allows a task (or an ISR) to
+direct an event set to a target task. Based upon the state of
+the target task, one of the following situations applies:
+
+@itemize @bullet
+@item Target Task is Blocked Waiting for Events
+
+@itemize -
+
+@item If the waiting task's input event condition is
+satisfied, then the task is made ready for execution.
+
+@item If the waiting task's input event condition is not
+satisfied, then the event set is posted but left pending and the
+task remains blocked.
+
+@end itemize
+
+@item Target Task is Not Waiting for Events
+
+@itemize -
+@item The event set is posted and left pending.
+@end itemize
+
+@end itemize
+
+@subsection Receiving an Event Set
+
+The @code{@value{DIRPREFIX}event_receive} directive is used by tasks to
+accept a specific input event condition. The task also
+specifies whether the request is satisfied when all requested
+events are available or any single requested event is available.
+If the requested event condition is satisfied by pending
+events, then a successful return code and the satisfying event
+set are returned immediately. If the condition is not
+satisfied, then one of the following situations applies:
+
+@itemize @bullet
+@item By default, the calling task will wait forever for the
+event condition to be satisfied.
+
+@item Specifying the @code{@value{RPREFIX}NO_WAIT} option forces an immediate return
+with an error status code.
+
+@item Specifying a timeout limits the period the task will
+wait before returning with an error status code.
+@end itemize
+
+@subsection Determining the Pending Event Set
+
+A task can determine the pending event set by calling
+the @code{@value{DIRPREFIX}event_receive} directive with a value of
+@code{@value{RPREFIX}PENDING_EVENTS} for the input event condition.
+The pending events are returned to the calling task but the event
+set is left unaltered.
+
+@subsection Receiving all Pending Events
+
+A task can receive all of the currently pending
+events by calling the @code{@value{DIRPREFIX}event_receive}
+directive with a value of @code{@value{RPREFIX}ALL_EVENTS}
+for the input event condition and
+@code{@value{RPREFIX}NO_WAIT @value{OR} @value{RPREFIX}EVENT_ANY}
+for the option set. The pending events are returned to the
+calling task and the event set is cleared. If no events are
+pending then the @code{@value{RPREFIX}UNSATISFIED} status code will be returned.
+
+@section Directives
+
+This section details the event manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@c
+@c
+@c
+@page
+@subsection EVENT_SEND - Send event set to a task
+
+@cindex send event set to a task
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_event_send
+@example
+rtems_status_code rtems_event_send (
+ rtems_id id,
+ rtems_event_set event_in
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Event_Send (
+ ID : in RTEMS.ID;
+ Event_In : in RTEMS.Event_Set;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - event set sent successfully@*
+@code{@value{RPREFIX}INVALID_ID} - invalid task id
+
+@subheading DESCRIPTION:
+
+This directive sends an event set, event_in, to the
+task specified by id. If a blocked task's input event condition
+is satisfied by this directive, then it will be made ready. If
+its input event condition is not satisfied, then the events
+satisfied are updated and the events not satisfied are left
+pending. If the task specified by id is not blocked waiting for
+events, then the events sent are left pending.
+
+@subheading NOTES:
+
+Specifying @code{@value{RPREFIX}SELF} for id results in the event set being
+sent to the calling task.
+
+Identical events sent to a task are not queued. In
+other words, the second, and subsequent, posting of an event to
+a task before it can perform an @code{@value{DIRPREFIX}event_receive}
+has no effect.
+
+The calling task will be preempted if it has
+preemption enabled and a higher priority task is unblocked as
+the result of this directive.
+
+Sending an event set to a global task which does not
+reside on the local node will generate a request telling the
+remote node to send the event set to the appropriate task.
+
+@c
+@c
+@c
+@page
+@subsection EVENT_RECEIVE - Receive event condition
+
+@cindex receive event condition
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_event_receive
+@example
+rtems_status_code rtems_event_receive (
+ rtems_event_set event_in,
+ rtems_option option_set,
+ rtems_interval ticks,
+ rtems_event_set *event_out
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Event_Receive (
+ Event_In : in RTEMS.Event_Set;
+ Option_Set : in RTEMS.Option;
+ Ticks : in RTEMS.Interval;
+ Event_Out : out RTEMS.Event_Set;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - event received successfully@*
+@code{@value{RPREFIX}UNSATISFIED} - input event not satisfied (@code{@value{RPREFIX}NO_WAIT})@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{event_out} is NULL@*
+@code{@value{RPREFIX}TIMEOUT} - timed out waiting for event
+
+@subheading DESCRIPTION:
+
+This directive attempts to receive the event
+condition specified in event_in. If event_in is set to
+@code{@value{RPREFIX}PENDING_EVENTS}, then the current pending events are returned in
+event_out and left pending. The @code{@value{RPREFIX}WAIT} and @code{@value{RPREFIX}NO_WAIT} options in the
+option_set parameter are used to specify whether or not the task
+is willing to wait for the event condition to be satisfied.
+@code{@value{RPREFIX}EVENT_ANY} and @code{@value{RPREFIX}EVENT_ALL} are used in the option_set parameter are
+used to specify whether a single event or the complete event set
+is necessary to satisfy the event condition. The event_out
+parameter is returned to the calling task with the value that
+corresponds to the events in event_in that were satisfied.
+
+If pending events satisfy the event condition, then
+event_out is set to the satisfied events and the pending events
+in the event condition are cleared. If the event condition is
+not satisfied and @code{@value{RPREFIX}NO_WAIT} is specified, then event_out is set to
+the currently satisfied events. If the calling task chooses to
+wait, then it will block waiting for the event condition.
+
+If the calling task must wait for the event condition
+to be satisfied, then the timeout parameter is used to specify
+the maximum interval to wait. If it is set to @code{@value{RPREFIX}NO_TIMEOUT}, then
+the calling task will wait forever.
+
+@subheading NOTES:
+
+This directive only affects the events specified in
+event_in. Any pending events that do not correspond to any of
+the events specified in event_in will be left pending.
+
+The following event receive option constants are defined by
+RTEMS:
+
+@itemize @bullet
+@item @code{@value{RPREFIX}WAIT} task will wait for event (default)
+@item @code{@value{RPREFIX}NO_WAIT} task should not wait
+@item @code{@value{RPREFIX}EVENT_ALL} return after all events (default)
+@item @code{@value{RPREFIX}EVENT_ANY} return after any events
+@end itemize
+
+A clock tick is required to support the functionality of this directive.
diff --git a/doc/user/example.texi b/doc/user/example.texi
new file mode 100644
index 0000000000..edbe5a2257
--- /dev/null
+++ b/doc/user/example.texi
@@ -0,0 +1,88 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Example Application, Glossary, Directive Status Codes, Top
+@end ifinfo
+@chapter Example Application
+
+@example
+/*
+ * This file contains an example of a simple RTEMS
+ * application. It instantiates the RTEMS Configuration
+ * Information using confdef.h and contains two tasks:
+ * a * user initialization task and a simple task.
+ *
+ * This example assumes that a board support package exists.
+ */
+
+#include <rtems.h>
+
+rtems_task user_application(rtems_task_argument argument);
+
+rtems_task init_task(
+ rtems_task_argument ignored
+)
+@{
+ rtems_id tid;
+ rtems_status_code status;
+ rtems_name name;
+
+ name = rtems_build_name( 'A', 'P', 'P', '1' )
+
+ status = rtems_task_create(
+ name, 1, RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_NO_PREEMPT, RTEMS_FLOATING_POINT, &tid
+ );
+ if ( status != RTEMS_STATUS_SUCCESSFUL ) @{
+ printf( "rtems_task_create failed with status of %d.\n", status );
+ exit( 1 );
+ @}
+
+ status = rtems_task_start( tid, user_application, 0 );
+ if ( status != RTEMS_STATUS_SUCCESSFUL ) @{
+ printf( "rtems_task_start failed with status of %d.\n", status );
+ exit( 1 );
+ @}
+
+ status = rtems_task_delete( SELF ); /* should not return */
+ printf( "rtems_task_delete returned with status of %d.\n", status );
+ exit( 1 );
+@}
+
+
+rtems_task user_application(rtems_task_argument argument)
+@{
+ /* application specific initialization goes here */
+
+ while ( 1 ) @{ /* infinite loop */
+
+ /* APPLICATION CODE GOES HERE
+ *
+ * This code will typically include at least one
+ * directive which causes the calling task to
+ * give up the processor.
+ */
+ @}
+@}
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER /* for stdio */
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER /* for time services */
+
+#define CONFIGURE_MAXIMUM_TASKS 2
+
+#define CONFIGURE_INIT_TASK_NAME rtems_build_name( 'E', 'X', 'A', 'M' )
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#define CONFIGURE_INIT
+
+#include <confdefs.h>
+@end example
+
+
+
diff --git a/doc/user/fatal.t b/doc/user/fatal.t
new file mode 100644
index 0000000000..9127f98b09
--- /dev/null
+++ b/doc/user/fatal.t
@@ -0,0 +1,172 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Fatal Error Manager
+
+@cindex fatal errors
+
+@section Introduction
+
+The fatal error manager processes all fatal or
+irrecoverable errors. The directive provided by the fatal error
+manager is:
+
+@itemize @bullet
+@item @code{@value{DIRPREFIX}fatal_error_occurred} - Invoke the fatal error handler
+@end itemize
+
+@section Background
+
+@cindex fatal error detection
+@cindex fatal error processing
+@cindex fatal error user extension
+
+The fatal error manager is called upon detection of
+an irrecoverable error condition by either RTEMS or the
+application software. Fatal errors can be detected from three
+sources:
+
+@itemize @bullet
+@item the executive (RTEMS)
+@item user system code
+@item user application code
+@end itemize
+
+RTEMS automatically invokes the fatal error manager
+upon detection of an error it considers to be fatal. Similarly,
+the user should invoke the fatal error manager upon detection of
+a fatal error.
+
+Each status or dynamic user extension set may include
+a fatal error handler. The fatal error handler in the static
+extension set can be used to provide access to debuggers and
+monitors which may be present on the target hardware. If any
+user-supplied fatal error handlers are installed, the fatal
+error manager will invoke them. If no user handlers are
+configured or if all the user handler return control to the
+fatal error manager, then the RTEMS default fatal error handler
+is invoked. If the default fatal error handler is invoked, then
+the system state is marked as failed.
+
+Although the precise behavior of the default fatal
+error handler is processor specific, in general, it will disable
+all maskable interrupts, place the error code in a known
+processor dependent place (generally either on the stack or in a
+register), and halt the processor. The precise actions of the
+RTEMS fatal error are discussed in the Default Fatal Error
+Processing chapter of the Applications Supplement document for
+a specific target processor.
+
+@section Operations
+
+@subsection Announcing a Fatal Error
+
+@findex _Internal_errors_What_happened
+
+The @code{@value{DIRPREFIX}fatal_error_occurred} directive is invoked when a
+fatal error is detected. Before invoking any user-supplied
+fatal error handlers or the RTEMS fatal error handler, the
+@code{@value{DIRPREFIX}fatal_error_occurred}
+directive stores useful information in the
+variable @code{_Internal_errors_What_happened}. This @value{STRUCTURE}
+contains three pieces of information:
+
+@itemize @bullet
+@item the source of the error (API or executive core),
+
+@item whether the error was generated internally by the
+executive, and a
+
+@item a numeric code to indicate the error type.
+@end itemize
+
+The error type indicator is dependent on the source
+of the error and whether or not the error was internally
+generated by the executive. If the error was generated
+from an API, then the error code will be of that API's
+error or status codes. The status codes for the RTEMS
+API are in cpukit/rtems/include/rtems/rtems/status.h. Those
+for the POSIX API can be found in <errno.h>.
+
+The @code{@value{DIRPREFIX}fatal_error_occurred} directive is responsible
+for invoking an optional user-supplied fatal error handler
+and/or the RTEMS fatal error handler. All fatal error handlers
+are passed an error code to describe the error detected.
+
+Occasionally, an application requires more
+sophisticated fatal error processing such as passing control to
+a debugger. For these cases, a user-supplied fatal error
+handler can be specified in the RTEMS configuration table. The
+User Extension Table field fatal contains the address of the
+fatal error handler to be executed when the
+@code{@value{DIRPREFIX}fatal_error_occurred}
+directive is called. If the field is set to NULL or if the
+configured fatal error handler returns to the executive, then
+the default handler provided by RTEMS is executed. This default
+handler will halt execution on the processor where the error
+occurred.
+
+@section Directives
+
+This section details the fatal error manager's
+directives. A subsection is dedicated to each of this manager's
+directives and describes the calling sequence, related
+constants, usage, and status codes.
+
+@c
+@c
+@c
+@page
+@subsection FATAL_ERROR_OCCURRED - Invoke the fatal error handler
+
+@cindex announce fatal error
+@cindex fatal error, announce
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_fatal_error_occurred
+@example
+void volatile rtems_fatal_error_occurred(
+ rtems_unsigned32 the_error
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Fatal_Error_Occurred (
+ The_Error : in RTEMS.Unsigned32
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES
+
+NONE
+
+@subheading DESCRIPTION:
+
+This directive processes fatal errors. If the FATAL
+error extension is defined in the configuration table, then the
+user-defined error extension is called. If configured and the
+provided FATAL error extension returns, then the RTEMS default
+error handler is invoked. This directive can be invoked by
+RTEMS or by the user's application code including initialization
+tasks, other tasks, and ISRs.
+
+@subheading NOTES:
+
+This directive supports local operations only.
+
+Unless the user-defined error extension takes special
+actions such as restarting the calling task, this directive WILL
+NOT RETURN to the caller.
+
+The user-defined extension for this directive may
+wish to initiate a global shutdown.
diff --git a/doc/user/glossary.texi b/doc/user/glossary.texi
new file mode 100644
index 0000000000..f9e8d6f7ea
--- /dev/null
+++ b/doc/user/glossary.texi
@@ -0,0 +1,771 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Glossary, Command and Variable Index, Example Application, Top
+@end ifinfo
+@chapter Glossary
+
+@table @b
+@item active
+A term used to describe an object
+which has been created by an application.
+
+@item aperiodic task
+A task which must execute only at
+irregular intervals and has only a soft deadline.
+
+@item application
+In this document, software which makes
+use of RTEMS.
+
+@item ASR
+see Asynchronous Signal Routine.
+
+@item asynchronous
+Not related in order or timing to
+other occurrences in the system.
+
+@item Asynchronous Signal Routine
+Similar to a hardware
+interrupt except that it is associated with a task and is run in
+the context of a task. The directives provided by the signal
+manager are used to service signals.
+
+@item awakened
+A term used to describe a task that has
+been unblocked and may be scheduled to the CPU.
+
+@item big endian
+A data representation scheme in which
+the bytes composing a numeric value are arranged such that the
+most significant byte is at the lowest address.
+
+@item bit-mapped
+A data encoding scheme in which each bit
+in a variable is used to represent something different. This
+makes for compact data representation.
+
+@item block
+A physically contiguous area of memory.
+
+@item blocked
+The task state entered by a task which has
+been previously started and cannot continue execution until the
+reason for waiting has been satisfied.
+
+@item broadcast
+To simultaneously send a message to a
+logical set of destinations.
+
+@item BSP
+see Board Support Package.
+
+@item Board Support Package
+A collection of device
+initialization and control routines specific to a particular
+type of board or collection of boards.
+
+@item buffer
+A fixed length block of memory allocated
+from a partition.
+
+@item calling convention
+The processor and compiler
+dependent rules which define the mechanism used to invoke
+subroutines in a high-level language. These rules define the
+passing of arguments, the call and return mechanism, and the
+register set which must be preserved.
+
+@item Central Processing Unit
+This term is equivalent to
+the terms processor and microprocessor.
+
+@item chain
+A data structure which allows for efficient
+dynamic addition and removal of elements. It differs from an
+array in that it is not limited to a predefined size.
+
+@item coalesce
+The process of merging adjacent holes into
+a single larger hole. Sometimes this process is referred to as
+garbage collection.
+
+@item Configuration Table
+A table which contains
+information used to tailor RTEMS for a particular application.
+
+@item context
+All of the processor registers and
+operating system data structures associated with a task.
+
+@item context switch
+Alternate term for task switch.
+Taking control of the processor from one task and transferring
+it to another task.
+
+@item control block
+A data structure used by the
+executive to define and control an object.
+
+@item core
+When used in this manual, this term refers to
+the internal executive utility functions. In the interest of
+application portability, the core of the executive should not be
+used directly by applications.
+
+@item CPU
+An acronym for Central Processing Unit.
+
+@item critical section
+A section of code which must be
+executed indivisibly.
+
+@item CRT
+An acronym for Cathode Ray Tube. Normally used
+in reference to the man-machine interface.
+
+@item deadline
+A fixed time limit by which a task must
+have completed a set of actions. Beyond this point, the results
+are of reduced value and may even be considered useless or
+harmful.
+
+@item device
+A peripheral used by the application that
+requires special operation software. See also device driver.
+
+@item device driver
+Control software for special
+peripheral devices used by the application.
+
+@item directives
+RTEMS' provided routines that provide
+support mechanisms for real-time applications.
+
+@item dispatch
+The act of loading a task's context onto
+the CPU and transferring control of the CPU to that task.
+
+@item dormant
+The state entered by a task after it is
+created and before it has been started.
+
+@item Device Driver Table
+A table which contains the
+entry points for each of the configured device drivers.
+
+@item dual-ported
+A term used to describe memory which
+can be accessed at two different addresses.
+
+@item embedded
+An application that is delivered as a
+hidden part of a larger system. For example, the software in a
+fuel-injection control system is an embedded application found
+in many late-model automobiles.
+
+@item envelope
+A buffer provided by the MPCI layer to
+RTEMS which is used to pass messages between nodes in a
+multiprocessor system. It typically contains routing
+information needed by the MPCI. The contents of an envelope are
+referred to as a packet.
+
+@item entry point
+The address at which a function or task
+begins to execute. In C, the entry point of a function is the
+function's name.
+
+@item events
+A method for task communication and
+synchronization. The directives provided by the event manager
+are used to service events.
+
+@item exception
+A synonym for interrupt.
+
+@item executing
+The task state entered by a task after it
+has been given control of the CPU.
+
+@item executive
+In this document, this term is used to
+referred to RTEMS. Commonly, an executive is a small real-time
+operating system used in embedded systems.
+
+@item exported
+An object known by all nodes in a
+multiprocessor system. An object created with the GLOBAL
+attribute will be exported.
+
+@item external address
+The address used to access
+dual-ported memory by all the nodes in a system which do not own
+the memory.
+
+@item FIFO
+An acronym for First In First Out.
+
+@item First In First Out
+A discipline for manipulating entries in a data structure.
+
+@item floating point coprocessor
+A component used in
+computer systems to enhance performance in mathematically
+intensive situations. It is typically viewed as a logical
+extension of the primary processor.
+
+@item freed
+A resource that has been released by the
+application to RTEMS.
+
+@item global
+An object that has been created with the
+GLOBAL attribute and exported to all nodes in a multiprocessor
+system.
+
+@item handler
+The equivalent of a manager, except that it
+is internal to RTEMS and forms part of the core. A handler is a
+collection of routines which provide a related set of functions.
+For example, there is a handler used by RTEMS to manage all
+objects.
+
+@item hard real-time system
+A real-time system in which a
+missed deadline causes the worked performed to have no value or
+to result in a catastrophic effect on the integrity of the
+system.
+
+@item heap
+A data structure used to dynamically allocate
+and deallocate variable sized blocks of memory.
+
+@item heterogeneous
+A multiprocessor computer system composed of dissimilar processors.
+
+@item homogeneous
+A multiprocessor computer system composed of a single type of processor.
+
+@item ID
+An RTEMS assigned identification tag used to
+access an active object.
+
+@item IDLE task
+A special low priority task which assumes
+control of the CPU when no other task is able to execute.
+
+@item interface
+A specification of the methodology used
+to connect multiple independent subsystems.
+
+@item internal address
+The address used to access
+dual-ported memory by the node which owns the memory.
+
+@item interrupt
+A hardware facility that causes the CPU
+to suspend execution, save its status, and transfer control to a
+specific location.
+
+@item interrupt level
+A mask used to by the CPU to
+determine which pending interrupts should be serviced. If a
+pending interrupt is below the current interrupt level, then the
+CPU does not recognize that interrupt.
+
+@item Interrupt Service Routine
+An ISR is invoked by the
+CPU to process a pending interrupt.
+
+@item I/O
+An acronym for Input/Output.
+
+@item ISR
+An acronym for Interrupt Service Routine.
+
+@item kernel
+In this document, this term is used as a
+synonym for executive.
+
+@item list
+A data structure which allows for dynamic
+addition and removal of entries. It is not statically limited
+to a particular size.
+
+@item little endian
+A data representation scheme in which
+the bytes composing a numeric value are arranged such that the
+least significant byte is at the lowest address.
+
+@item local
+An object which was created with the LOCAL
+attribute and is accessible only on the node it was created and
+resides upon. In a single processor configuration, all objects
+are local.
+
+@item local operation
+The manipulation of an object which
+resides on the same node as the calling task.
+
+@item logical address
+An address used by an application.
+In a system without memory management, logical addresses will
+equal physical addresses.
+
+@item loosely-coupled
+A multiprocessor configuration
+where shared memory is not used for communication.
+
+@item major number
+The index of a device driver in the
+Device Driver Table.
+
+@item manager
+A group of related RTEMS' directives which
+provide access and control over resources.
+
+@item memory pool
+Used interchangeably with heap.
+
+@item message
+A sixteen byte entity used to communicate
+between tasks. Messages are sent to message queues and stored
+in message buffers.
+
+@item message buffer
+A block of memory used to store
+messages.
+
+@item message queue
+An RTEMS object used to synchronize
+and communicate between tasks by transporting messages between
+sending and receiving tasks.
+
+@item Message Queue Control Block
+A data structure associated with each message queue used by RTEMS
+to manage that message queue.
+
+@item minor number
+A numeric value passed to a device
+driver, the exact usage of which is driver dependent.
+
+@item mode
+An entry in a task's control block that is
+used to determine if the task allows preemption, timeslicing,
+processing of signals, and the interrupt disable level used by
+the task.
+
+@item MPCI
+An acronym for Multiprocessor Communications
+Interface Layer.
+
+@item multiprocessing
+The simultaneous execution of two
+or more processes by a multiple processor computer system.
+
+@item multiprocessor
+A computer with multiple CPUs
+available for executing applications.
+
+@item Multiprocessor Communications Interface Layer
+A set
+of user-provided routines which enable the nodes in a
+multiprocessor system to communicate with one another.
+
+@item Multiprocessor Configuration Table
+The data structure defining the characteristics of the multiprocessor
+target system with which RTEMS will communicate.
+
+@item multitasking
+The alternation of execution amongst a
+group of processes on a single CPU. A scheduling algorithm is
+used to determine which process executes at which time.
+
+@item mutual exclusion
+A term used to describe the act of
+preventing other tasks from accessing a resource simultaneously.
+
+@item nested
+A term used to describe an ASR that occurs
+during another ASR or an ISR that occurs during another ISR.
+
+@item node
+A term used to reference a processor running
+RTEMS in a multiprocessor system.
+
+@item non-existent
+The state occupied by an uncreated or
+deleted task.
+
+@item numeric coprocessor
+A component used in computer
+systems to enhance performance in mathematically intensive
+situations. It is typically viewed as a logical extension of
+the primary processor.
+
+@item object
+In this document, this term is used to refer
+collectively to tasks, timers, message queues, partitions,
+regions, semaphores, ports, and rate monotonic periods. All
+RTEMS objects have IDs and user-assigned names.
+
+@item object-oriented
+A term used to describe systems
+with common mechanisms for utilizing a variety of entities.
+Object-oriented systems shield the application from
+implementation details.
+
+@item operating system
+The software which controls all
+the computer's resources and provides the base upon which
+application programs can be written.
+
+@item overhead
+The portion of the CPUs processing power
+consumed by the operating system.
+
+@item packet
+A buffer which contains the messages passed
+between nodes in a multiprocessor system. A packet is the
+contents of an envelope.
+
+@item partition
+An RTEMS object which is used to allocate
+and deallocate fixed size blocks of memory from an dynamically
+specified area of memory.
+
+@item Partition Control Block
+A data structure associated
+with each partition used by RTEMS to manage that partition.
+
+@item pending
+A term used to describe a task blocked
+waiting for an event, message, semaphore, or signal.
+
+@item periodic task
+A task which must execute at regular
+intervals and comply with a hard deadline.
+
+@item physical address
+The actual hardware address of a
+resource.
+
+@item poll
+A mechanism used to determine if an event has
+occurred by periodically checking for a particular status.
+Typical events include arrival of data, completion of an action,
+and errors.
+
+@item pool
+A collection from which resources are
+allocated.
+
+@item portability
+A term used to describe the ease with
+which software can be rehosted on another computer.
+
+@item posting
+The act of sending an event, message,
+semaphore, or signal to a task.
+
+@item preempt
+The act of forcing a task to relinquish the
+processor and dispatching to another task.
+
+@item priority
+A mechanism used to represent the relative
+importance of an element in a set of items. RTEMS uses priority
+to determine which task should execute.
+
+@item priority inheritance
+An algorithm that calls for
+the lower priority task holding a resource to have its priority
+increased to that of the highest priority task blocked waiting
+for that resource. This avoids the problem of priority
+inversion.
+
+@item priority inversion
+A form of indefinite
+postponement which occurs when a high priority tasks requests
+access to shared resource currently allocated to low priority
+task. The high priority task must block until the low priority
+task releases the resource.
+
+@item processor utilization
+The percentage of processor
+time used by a task or a set of tasks.
+
+@item proxy
+An RTEMS control structure used to represent,
+on a remote node, a task which must block as part of a remote
+operation.
+
+@item Proxy Control Block
+A data structure associated
+with each proxy used by RTEMS to manage that proxy.
+
+@item PTCB
+An acronym for Partition Control Block.
+
+@item PXCB
+An acronym for Proxy Control Block.
+
+@item quantum
+The application defined unit of time in
+which the processor is allocated.
+
+@item queue
+Alternate term for message queue.
+
+@item QCB
+An acronym for Message Queue Control Block.
+
+@item ready
+A task occupies this state when it is
+available to be given control of the CPU.
+
+@item real-time
+A term used to describe systems which are
+characterized by requiring deterministic response times to
+external stimuli. The external stimuli require that the
+response occur at a precise time or the response is incorrect.
+
+@item reentrant
+A term used to describe routines which do
+not modify themselves or global variables.
+
+@item region
+An RTEMS object which is used to allocate
+and deallocate variable size blocks of memory from a dynamically
+specified area of memory.
+
+@item Region Control Block
+A data structure associated
+with each region used by RTEMS to manage that region.
+
+@item registers
+Registers are locations physically
+located within a component, typically used for device control or
+general purpose storage.
+
+@item remote
+Any object that does not reside on the local
+node.
+
+@item remote operation
+The manipulation of an object
+which does not reside on the same node as the calling task.
+
+@item return code
+Also known as error code or return
+value.
+
+@item resource
+A hardware or software entity to which
+access must be controlled.
+
+@item resume
+Removing a task from the suspend state. If
+the task's state is ready following a call to the
+@code{@value{DIRPREFIX}task_resume}
+directive, then the task is available for scheduling.
+
+@item return code
+A value returned by RTEMS directives to
+indicate the completion status of the directive.
+
+@item RNCB
+An acronym for Region Control Block.
+
+@item round-robin
+A task scheduling discipline in which
+tasks of equal priority are executed in the order in which they
+are made ready.
+
+@item RS-232
+A standard for serial communications.
+
+@item running
+The state of a rate monotonic timer while
+it is being used to delineate a period. The timer exits this
+state by either expiring or being canceled.
+
+@item schedule
+The process of choosing which task should
+next enter the executing state.
+
+@item schedulable
+A set of tasks which can be guaranteed
+to meet their deadlines based upon a specific scheduling
+algorithm.
+
+@item segments
+Variable sized memory blocks allocated
+from a region.
+
+@item semaphore
+An RTEMS object which is used to
+synchronize tasks and provide mutually exclusive access to
+resources.
+
+@item Semaphore Control Block
+A data structure associated
+with each semaphore used by RTEMS to manage that semaphore.
+
+@item shared memory
+Memory which is accessible by
+multiple nodes in a multiprocessor system.
+
+@item signal
+An RTEMS provided mechanism to communicate
+asynchronously with a task. Upon reception of a signal, the ASR
+of the receiving task will be invoked.
+
+@item signal set
+A thirty-two bit entity which is used to
+represent a task's collection of pending signals and the signals
+sent to a task.
+
+@item SMCB
+An acronym for Semaphore Control Block.
+
+@item soft real-time system
+A real-time system in which a
+missed deadline does not compromise the integrity of the system.
+
+@item sporadic task
+A task which executes at irregular
+intervals and must comply with a hard deadline. A minimum
+period of time between successive iterations of the task can be
+guaranteed.
+
+@item stack
+A data structure that is managed using a Last
+In First Out (LIFO) discipline. Each task has a stack
+associated with it which is used to store return information
+and local variables.
+
+@item status code
+Also known as error code or return
+value.
+
+@item suspend
+A term used to describe a task that is not
+competing for the CPU because it has had a
+@code{@value{DIRPREFIX}task_suspend} directive.
+
+@item synchronous
+Related in order or timing to other
+occurrences in the system.
+
+@item system call
+In this document, this is used as an
+alternate term for directive.
+
+@item target
+The system on which the application will
+ultimately execute.
+
+@item task
+A logically complete thread of execution. The
+CPU is allocated among the ready tasks.
+
+@item Task Control Block
+A data structure associated with
+each task used by RTEMS to manage that task.
+
+@item task switch
+Alternate terminology for context
+switch. Taking control of the processor from one task and given
+to another.
+
+@item TCB
+An acronym for Task Control Block.
+
+@item tick
+The basic unit of time used by RTEMS. It is a
+user-configurable number of microseconds. The current tick
+expires when the @code{@value{DIRPREFIX}clock_tick}
+directive is invoked.
+
+@item tightly-coupled
+A multiprocessor configuration
+system which communicates via shared memory.
+
+@item timeout
+An argument provided to a number of
+directives which determines the maximum length of time an
+application task is willing to wait to acquire the resource if
+it is not immediately available.
+
+@item timer
+An RTEMS object used to invoke subprograms at
+a later time.
+
+@item Timer Control Block
+A data structure associated
+with each timer used by RTEMS to manage that timer.
+
+@item timeslicing
+A task scheduling discipline in which
+tasks of equal priority are executed for a specific period of
+time before being preempted by another task.
+
+@item timeslice
+The application defined unit of time in
+which the processor is allocated.
+
+@item TMCB
+An acronym for Timer Control Block.
+
+@item transient overload
+A temporary rise in system
+activity which may cause deadlines to be missed. Rate Monotonic
+Scheduling can be used to determine if all deadlines will be met
+under transient overload.
+
+@item user extensions
+Software routines provided by the
+application to enhance the functionality of RTEMS.
+
+@item User Extension Table
+A table which contains the
+entry points for each user extensions.
+
+@item User Initialization Tasks Table
+A table which
+contains the information needed to create and start each of the
+user initialization tasks.
+
+@item user-provided
+Alternate term for user-supplied.
+This term is used to designate any software routines which must
+be written by the application designer.
+
+@item user-supplied
+Alternate term for user-provided.
+This term is used to designate any software routines which must
+be written by the application designer.
+
+@item vector
+Memory pointers used by the processor to
+fetch the address of routines which will handle various
+exceptions and interrupts.
+
+@item wait queue
+The list of tasks blocked pending the
+release of a particular resource. Message queues, regions, and
+semaphores have a wait queue associated with them.
+
+@item yield
+When a task voluntarily releases control of the processor.
+
+@end table
+
diff --git a/doc/user/init.t b/doc/user/init.t
new file mode 100644
index 0000000000..24625e4b6b
--- /dev/null
+++ b/doc/user/init.t
@@ -0,0 +1,416 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Initialization Manager
+
+@section Introduction
+
+The initialization manager is responsible for
+initiating and shutting down RTEMS. Initiating RTEMS involves
+creating and starting all configured initialization tasks, and
+for invoking the initialization routine for each user-supplied
+device driver. In a multiprocessor configuration, this manager
+also initializes the interprocessor communications layer. The
+directives provided by the initialization manager are:
+
+@itemize @bullet
+@item @code{@value{DIRPREFIX}initialize_executive} - Initialize RTEMS
+@item @code{@value{DIRPREFIX}initialize_executive_early} - Initialize RTEMS and do NOT Start Multitasking
+@item @code{@value{DIRPREFIX}initialize_executive_late} - Complete Initialization and Start Multitasking
+@item @code{@value{DIRPREFIX}shutdown_executive} - Shutdown RTEMS
+@end itemize
+
+@section Background
+
+@subsection Initialization Tasks
+
+@cindex initialization tasks
+
+Initialization task(s) are the mechanism by which
+RTEMS transfers initial control to the user's application.
+Initialization tasks differ from other application tasks in that
+they are defined in the User Initialization Tasks Table and
+automatically created and started by RTEMS as part of its
+initialization sequence. Since the initialization tasks are
+scheduled using the same algorithm as all other RTEMS tasks,
+they must be configured at a priority and mode which will insure
+that they will complete execution before other application tasks
+execute. Although there is no upper limit on the number of
+initialization tasks, an application is required to define at
+least one.
+
+A typical initialization task will create and start
+the static set of application tasks. It may also create any
+other objects used by the application. Initialization tasks
+which only perform initialization should delete themselves upon
+completion to free resources for other tasks. Initialization
+tasks may transform themselves into a "normal" application task.
+This transformation typically involves changing priority and
+execution mode. RTEMS does not automatically delete the
+initialization tasks.
+
+@subsection The System Initialization Task
+
+The System Initialization Task is responsible for
+initializing all device drivers. As a result, this task has a
+higher priority than all other tasks to insure that no
+application tasks executes until all device drivers are
+initialized. After device initialization in a single processor
+system, this task will delete itself.
+
+The System Initialization Task must have enough stack
+space to successfully execute the initialization routines for
+all device drivers and, in multiprocessor configurations, the
+Multiprocessor Communications Interface Layer initialization
+routine. The CPU Configuration Table contains a field which
+allows the application or BSP to increase the default amount of
+stack space allocated for this task.
+
+In multiprocessor configurations, the System
+Initialization Task does not delete itself after initializing
+the device drivers. Instead it transforms itself into the
+Multiprocessing Server which initializes the Multiprocessor
+Communications Interface Layer, verifies multiprocessor system
+consistency, and processes all requests from remote nodes.
+
+@subsection The Idle Task
+
+The Idle Task is the lowest priority task in a system
+and executes only when no other task is ready to execute. This
+task consists of an infinite loop and will be preempted when any
+other task is made ready to execute.
+
+@subsection Initialization Manager Failure
+
+The @code{@value{DIRPREFIX}ifatal_error_occurred} directive will be called
+from @code{@value{DIRPREFIX}initialize_executive}
+for any of the following reasons:
+
+@itemize @bullet
+@item If either the Configuration Table or the CPU Dependent
+Information Table is not provided.
+
+@item If the starting address of the RTEMS RAM Workspace,
+supplied by the application in the Configuration Table, is NULL
+or is not aligned on a four-byte boundary.
+
+@item If the size of the RTEMS RAM Workspace is not large
+enough to initialize and configure the system.
+
+@item If the interrupt stack size specified is too small.
+
+@item If multiprocessing is configured and the node entry in
+the Multiprocessor Configuration Table is not between one and
+the maximum_nodes entry.
+
+@item If a multiprocessor system is being configured and no
+Multiprocessor Communications Interface is specified.
+
+@item If no user initialization tasks are configured. At
+least one initialization task must be configured to allow RTEMS
+to pass control to the application at the end of the executive
+initialization sequence.
+
+@item If any of the user initialization tasks cannot be
+created or started successfully.
+@end itemize
+
+@section Operations
+
+@subsection Initializing RTEMS
+
+The @code{@value{DIRPREFIX}initialize_executive}
+directive is called by the
+board support package at the completion of its initialization
+sequence. RTEMS assumes that the board support package
+successfully completed its initialization activities. The
+@code{@value{DIRPREFIX}initialize_executive}
+directive completes the initialization
+sequence by performing the following actions:
+
+@itemize @bullet
+@item Initializing internal RTEMS variables;
+@item Allocating system resources;
+@item Creating and starting the System Initialization Task;
+@item Creating and starting the Idle Task;
+@item Creating and starting the user initialization task(s); and
+@item Initiating multitasking.
+@end itemize
+
+This directive MUST be called before any other RTEMS
+directives. The effect of calling any RTEMS directives before
+@code{@value{DIRPREFIX}initialize_executive}
+is unpredictable. Many of RTEMS actions
+during initialization are based upon the contents of the
+Configuration Table and CPU Dependent Information Table. For
+more information regarding the format and contents of these
+tables, please refer to the chapter Configuring a System.
+
+The final step in the initialization sequence is the
+initiation of multitasking. When the scheduler and dispatcher
+are enabled, the highest priority, ready task will be dispatched
+to run. Control will not be returned to the board support
+package after multitasking is enabled until
+@code{@value{DIRPREFIX}shutdown_executive}
+the directive is called.
+
+The @code{@value{DIRPREFIX}initialize_executive}
+directive provides a
+conceptually simple way to initialize RTEMS. However, in
+certain cases, this mechanism cannot be used. The
+@code{@value{DIRPREFIX}initialize_executive_early}
+and @code{@value{DIRPREFIX}initialize_executive_late}
+directives are provided as an alternative mechanism for
+initializing RTEMS. The
+@code{@value{DIRPREFIX}initialize_executive_early} directive
+returns to the caller BEFORE initiating multitasking. The
+@code{@value{DIRPREFIX}initialize_executive_late}
+directive is invoked to start
+multitasking. It is critical that only one of the RTEMS
+initialization sequences be used in an application.
+
+@subsection Shutting Down RTEMS
+
+The @code{@value{DIRPREFIX}shutdown_executive} directive is invoked by the
+application to end multitasking and return control to the board
+support package. The board support package resumes execution at
+the code immediately following the invocation of the
+@code{@value{DIRPREFIX}initialize_executive} directive.
+
+@section Directives
+
+This section details the initialization manager's
+directives. A subsection is dedicated to each of this manager's
+directives and describes the calling sequence, related
+constants, usage, and status codes.
+
+@page
+@subsection INITIALIZE_EXECUTIVE - Initialize RTEMS
+
+@cindex initialize RTEMS
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_initialize_executive
+@example
+void rtems_initialize_executive(
+ rtems_configuration_table *configuration_table,
+ rtems_cpu_table *cpu_table
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Initialize_Executive (
+ Configuration_Table : in RTEMS.Configuration_Table_Pointer;
+ CPU_Table : in RTEMS.CPU_Table_Pointer
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+
+NONE
+
+@subheading DESCRIPTION:
+
+This directive is called when the board support
+package has completed its initialization to allow RTEMS to
+initialize the application environment based upon the
+information in the Configuration Table, CPU Dependent
+Information Table, User Initialization Tasks Table, Device
+Driver Table, User Extension Table, Multiprocessor Configuration
+Table, and the Multiprocessor Communications Interface (MPCI)
+Table. This directive starts multitasking and does not return
+to the caller until the @code{@value{DIRPREFIX}shutdown_executive}
+directive is invoked.
+
+@subheading NOTES:
+
+This directive MUST be the first RTEMS directive
+called and it DOES NOT RETURN to the caller until the
+@code{@value{DIRPREFIX}shutdown_executive}
+is invoked.
+
+This directive causes all nodes in the system to
+verify that certain configuration parameters are the same as
+those of the local node. If an inconsistency is detected, then
+a fatal error is generated.
+
+The application must use only one of the two
+initialization sequences:
+@code{@value{DIRPREFIX}initialize_executive} or
+@code{@value{DIRPREFIX}initialize_executive_early} and
+@code{@value{DIRPREFIX}initialize_executive_late}. The
+@code{@value{DIRPREFIX}initialize_executive}
+directive is logically equivalent to invoking
+@code{@value{DIRPREFIX}initialize_executive_early} and
+@code{@value{DIRPREFIX}initialize_executive_late}
+with no intervening actions.
+
+@page
+@subsection INITIALIZE_EXECUTIVE_EARLY - Initialize RTEMS and do NOT Start Multitasking
+
+@cindex initialize RTEMS
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_initialize_executive_early
+@example
+rtems_interrupt_level rtems_initialize_executive_early(
+ rtems_configuration_table *configuration_table,
+ rtems_cpu_table *cpu_table
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Initialize_Executive_Early(
+ Configuration_Table : in RTEMS.Configuration_Table_Pointer;
+ CPU_Table : in RTEMS.Cpu_Table;
+ Level : out RTEMS.ISR_Level
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+
+NONE
+
+@subheading DESCRIPTION:
+
+This directive is called when the board support
+package has completed its initialization to allow RTEMS to
+initialize the application environment based upon the
+information in the Configuration Table, CPU Dependent
+Information Table, User Initialization Tasks Table, Device
+Driver Table, User Extension Table, Multiprocessor Configuration
+Table, and the Multiprocessor Communications Interface (MPCI)
+Table. This directive returns to the caller after completing
+the basic RTEMS initialization but before multitasking is
+initiated. The interrupt level in place when the directive is
+invoked is returned to the caller. This interrupt level should
+be the same one passed to
+@code{@value{DIRPREFIX}initialize_executive_late}.
+
+@subheading NOTES:
+
+The application must use only one of the two
+initialization sequences:
+@code{@value{DIRPREFIX}initialize_executive} or
+@code{@value{DIRPREFIX}initialize_executive_early} and
+@code{@value{DIRPREFIX}initialize_executive_late}.
+
+@page
+@subsection INITIALIZE_EXECUTIVE_LATE - Complete Initialization and Start Multitasking
+
+@cindex initialize RTEMS
+@cindex start multitasking
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_initialize_executive_late
+@example
+void rtems_initialize_executive_late(
+ rtems_interrupt_level bsp_level
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Initialize_Executive_Late(
+ BSP_Level : in RTEMS.ISR_Level
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+
+NONE
+
+@subheading DESCRIPTION:
+
+This directive is called after the
+@code{@value{DIRPREFIX}initialize_executive_early}
+directive has been called to complete
+the RTEMS initialization sequence and initiate multitasking.
+The interrupt level returned by the
+@code{@value{DIRPREFIX}initialize_executive_early}
+directive should be in bsp_level and this value is restored as
+part of this directive returning to the caller after the
+@code{@value{DIRPREFIX}shutdown_executive}
+directive is invoked.
+
+@subheading NOTES:
+
+This directive MUST be the second RTEMS directive
+called and it DOES NOT RETURN to the caller until the
+@code{@value{DIRPREFIX}shutdown_executive} is invoked.
+
+This directive causes all nodes in the system to
+verify that certain configuration parameters are the same as
+those of the local node. If an inconsistency is detected, then
+a fatal error is generated.
+
+The application must use only one of the two
+initialization sequences:
+@code{@value{DIRPREFIX}initialize_executive} or
+@code{@value{DIRPREFIX}initialize_executive_early} and
+@code{@value{DIRPREFIX}initialize_executive_late}.
+
+
+
+@page
+@subsection SHUTDOWN_EXECUTIVE - Shutdown RTEMS
+
+@cindex shutdown RTEMS
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_shutdown_executive
+@example
+void rtems_shutdown_executive(
+ rtems_unsigned32 result
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Shutdown_Executive(
+ result : in RTEMS.Unsigned32
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+
+NONE
+
+@subheading DESCRIPTION:
+
+This directive is called when the application wishes
+to shutdown RTEMS and return control to the board support
+package. The board support package resumes execution at the
+code immediately following the invocation of the
+@code{@value{DIRPREFIX}initialize_executive} directive.
+
+@subheading NOTES:
+
+This directive MUST be the last RTEMS directive
+invoked by an application and it DOES NOT RETURN to the caller.
+
+This directive should not be invoked until the
+executive has successfully completed initialization.
diff --git a/doc/user/intr.t b/doc/user/intr.t
new file mode 100644
index 0000000000..e9efbbd0c8
--- /dev/null
+++ b/doc/user/intr.t
@@ -0,0 +1,469 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Interrupt Manager
+
+@section Introduction
+
+Any real-time executive must provide a mechanism for
+quick response to externally generated interrupts to satisfy the
+critical time constraints of the application. The interrupt
+manager provides this mechanism for RTEMS. This manager permits
+quick interrupt response times by providing the critical ability
+to alter task execution which allows a task to be preempted upon
+exit from an ISR. The interrupt manager includes the following
+directive:
+
+@itemize @bullet
+@item @code{@value{DIRPREFIX}interrupt_catch} - Establish an ISR
+@item @code{@value{DIRPREFIX}interrupt_disable} - Disable Interrupts
+@item @code{@value{DIRPREFIX}interrupt_enable} - Enable Interrupts
+@item @code{@value{DIRPREFIX}interrupt_flash} - Flash Interrupt
+@item @code{@value{DIRPREFIX}interrupt_is_in_progress} - Is an ISR in Progress
+@end itemize
+
+@section Background
+
+@subsection Processing an Interrupt
+
+@cindex interrupt processing
+
+The interrupt manager allows the application to
+connect a function to a hardware interrupt vector. When an
+interrupt occurs, the processor will automatically vector to
+RTEMS. RTEMS saves and restores all registers which are not
+preserved by the normal @value{LANGUAGE} calling convention
+for the target
+processor and invokes the user's ISR. The user's ISR is
+responsible for processing the interrupt, clearing the interrupt
+if necessary, and device specific manipulation.
+
+@findex rtems_vector_number
+
+The @code{@value{DIRPREFIX}interrupt_catch}
+directive connects a procedure to
+an interrupt vector. The vector number is managed using
+the @code{@value{DIRPREFIX}vector_number} data type.
+
+The interrupt service routine is assumed
+to abide by these conventions and have a prototype similar to
+the following:
+
+@ifset is-C
+@findex rtems_isr
+
+@example
+rtems_isr user_isr(
+ rtems_vector_number vector
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure User_ISR (
+ vector : in RTEMS.Vector_Number
+);
+@end example
+@end ifset
+
+The vector number argument is provided by RTEMS to
+allow the application to identify the interrupt source. This
+could be used to allow a single routine to service interrupts
+from multiple instances of the same device. For example, a
+single routine could service interrupts from multiple serial
+ports and use the vector number to identify which port requires
+servicing.
+
+To minimize the masking of lower or equal priority
+level interrupts, the ISR should perform the minimum actions
+required to service the interrupt. Other non-essential actions
+should be handled by application tasks. Once the user's ISR has
+completed, it returns control to the RTEMS interrupt manager
+which will perform task dispatching and restore the registers
+saved before the ISR was invoked.
+
+The RTEMS interrupt manager guarantees that proper
+task scheduling and dispatching are performed at the conclusion
+of an ISR. A system call made by the ISR may have readied a
+task of higher priority than the interrupted task. Therefore,
+when the ISR completes, the postponed dispatch processing must
+be performed. No dispatch processing is performed as part of
+directives which have been invoked by an ISR.
+
+Applications must adhere to the following rule if
+proper task scheduling and dispatching is to be performed:
+
+@itemize @b{ }
+
+@item @b{The interrupt manager must be used for all ISRs which
+may be interrupted by the highest priority ISR which invokes an
+RTEMS directive.}
+
+@end itemize
+
+Consider a processor which allows a numerically low
+interrupt level to interrupt a numerically greater interrupt
+level. In this example, if an RTEMS directive is used in a
+level 4 ISR, then all ISRs which execute at levels 0 through 4
+must use the interrupt manager.
+
+Interrupts are nested whenever an interrupt occurs
+during the execution of another ISR. RTEMS supports efficient
+interrupt nesting by allowing the nested ISRs to terminate
+without performing any dispatch processing. Only when the
+outermost ISR terminates will the postponed dispatching occur.
+
+@subsection RTEMS Interrupt Levels
+
+@cindex interrupt levels
+
+Many processors support multiple interrupt levels or
+priorities. The exact number of interrupt levels is processor
+dependent. RTEMS internally supports 256 interrupt levels which
+are mapped to the processor's interrupt levels. For specific
+information on the mapping between RTEMS and the target
+processor's interrupt levels, refer to the Interrupt Processing
+chapter of the Applications Supplement document for a specific
+target processor.
+
+@subsection Disabling of Interrupts by RTEMS
+
+@cindex disabling interrupts
+
+During the execution of directive calls, critical
+sections of code may be executed. When these sections are
+encountered, RTEMS disables all maskable interrupts before the
+execution of the section and restores them to the previous level
+upon completion of the section. RTEMS has been optimized to
+insure that interrupts are disabled for a minimum length of
+time. The maximum length of time interrupts are disabled by
+RTEMS is processor dependent and is detailed in the Timing
+Specification chapter of the Applications Supplement document
+for a specific target processor.
+
+Non-maskable interrupts (NMI) cannot be disabled, and
+ISRs which execute at this level MUST NEVER issue RTEMS system
+calls. If a directive is invoked, unpredictable results may
+occur due to the inability of RTEMS to protect its critical
+sections. However, ISRs that make no system calls may safely
+execute as non-maskable interrupts.
+
+@section Operations
+
+@subsection Establishing an ISR
+
+The @code{@value{DIRPREFIX}interrupt_catch}
+directive establishes an ISR for
+the system. The address of the ISR and its associated CPU
+vector number are specified to this directive. This directive
+installs the RTEMS interrupt wrapper in the processor's
+Interrupt Vector Table and the address of the user's ISR in the
+RTEMS' Vector Table. This directive returns the previous
+contents of the specified vector in the RTEMS' Vector Table.
+
+@subsection Directives Allowed from an ISR
+
+Using the interrupt manager insures that RTEMS knows
+when a directive is being called from an ISR. The ISR may then
+use system calls to synchronize itself with an application task.
+The synchronization may involve messages, events or signals
+being passed by the ISR to the desired task. Directives invoked
+by an ISR must operate only on objects which reside on the local
+node. The following is a list of RTEMS system calls that may be
+made from an ISR:
+
+@itemize @bullet
+@item Task Management
+
+@itemize -
+@item task_get_note, task_set_note, task_suspend, task_resume
+@end itemize
+
+@item Clock Management
+
+@itemize -
+@item clock_get, clock_tick
+@end itemize
+
+@item Message, Event, and Signal Management
+
+@itemize -
+@item message_queue_send, message_queue_urgent
+@item event_send
+@item signal_send
+@end itemize
+
+@item Semaphore Management
+
+@itemize -
+@item semaphore_release
+@end itemize
+
+@item Dual-Ported Memory Management
+
+@itemize -
+@item port_external_to_internal, port_internal_to_external
+@end itemize
+
+@item IO Management
+
+@itemize -
+@item io_initialize, io_open, io_close, io_read, io_write, io_control
+@end itemize
+
+@item Fatal Error Management
+
+@itemize -
+@item fatal_error_occurred
+@end itemize
+
+@item Multiprocessing
+
+@itemize -
+@item multiprocessing_announce
+@end itemize
+@end itemize
+
+@section Directives
+
+This section details the interrupt manager's
+directives. A subsection is dedicated to each of this manager's
+directives and describes the calling sequence, related
+constants, usage, and status codes.
+
+@c
+@c
+@c
+@page
+@subsection INTERRUPT_CATCH - Establish an ISR
+
+@cindex establish an ISR
+@cindex install an ISR
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_interrupt_catch
+@example
+rtems_status_code rtems_interrupt_catch(
+ rtems_isr_entry new_isr_handler,
+ rtems_vector_number vector,
+ rtems_isr_entry *old_isr_handler
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Interrupt_Catch (
+ New_ISR_handler : in RTEMS.Address;
+ Vector : in RTEMS.Vector_Number;
+ Old_ISR_Handler : out RTEMS.Address;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - ISR established successfully@*
+@code{@value{RPREFIX}INVALID_NUMBER} - illegal vector number@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - illegal ISR entry point or invalid @code{old_isr_handler}
+
+@subheading DESCRIPTION:
+
+This directive establishes an interrupt service
+routine (ISR) for the specified interrupt vector number. The
+@code{new_isr_handler} parameter specifies the entry point of the ISR.
+The entry point of the previous ISR for the specified vector is
+returned in @code{old_isr_handler}.
+
+To release an interrupt vector, pass the old handler's address obtained
+when the vector was first capture.
+
+@subheading NOTES:
+
+This directive will not cause the calling task to be preempted.
+
+@c
+@c
+@c
+@page
+@subsection INTERRUPT_DISABLE - Disable Interrupts
+
+@cindex disable interrupts
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_interrupt_disable
+@example
+void rtems_interrupt_disable(
+ rtems_interrupt_level level
+);
+
+/* this is implemented as a macro and sets level as a side-effect */
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+function Interrupt_Disable
+return RTEMS.ISR_Level;
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+
+NONE
+
+@subheading DESCRIPTION:
+
+This directive disables all maskable interrupts and returns
+the previous @code{level}. A later invocation of the
+@code{@value{DIRPREFIX}interrupt_enable} directive should be used to
+restore the interrupt level.
+
+@subheading NOTES:
+
+This directive will not cause the calling task to be preempted.
+
+@ifset is-C
+@b{This directive is implemented as a macro which modifies the @code{level}
+parameter.}
+@end ifset
+
+@c
+@c
+@c
+@page
+@subsection INTERRUPT_ENABLE - Enable Interrupts
+
+@cindex enable interrupts
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_interrupt_enable
+@example
+void rtems_interrupt_enable(
+ rtems_interrupt_level level
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Interrupt_Enable (
+ Level : in RTEMS.ISR_Level
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+
+NONE
+
+@subheading DESCRIPTION:
+
+This directive enables maskable interrupts to the @code{level}
+which was returned by a previous call to
+@code{@value{DIRPREFIX}interrupt_disable}.
+Immediately prior to invoking this directive, maskable interrupts should
+be disabled by a call to @code{@value{DIRPREFIX}interrupt_disable}
+and will be enabled when this directive returns to the caller.
+
+@subheading NOTES:
+
+This directive will not cause the calling task to be preempted.
+
+
+@c
+@c
+@c
+@page
+@subsection INTERRUPT_FLASH - Flash Interrupts
+
+@cindex flash interrupts
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_interrupt_flash
+@example
+void rtems_interrupt_flash(
+ rtems_interrupt_level level
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Interrupt_Flash (
+ Level : in RTEMS.ISR_Level
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+
+NONE
+
+@subheading DESCRIPTION:
+
+This directive temporarily enables maskable interrupts to the @code{level}
+which was returned by a previous call to
+@code{@value{DIRPREFIX}interrupt_disable}.
+Immediately prior to invoking this directive, maskable interrupts should
+be disabled by a call to @code{@value{DIRPREFIX}interrupt_disable}
+and will be redisabled when this directive returns to the caller.
+
+@subheading NOTES:
+
+This directive will not cause the calling task to be preempted.
+
+@c
+@c
+@c
+@page
+@subsection INTERRUPT_IS_IN_PROGRESS - Is an ISR in Progress
+
+@cindex is interrupt in progress
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_interrupt_is_in_progress
+@example
+rtems_boolean rtems_interrupt_is_in_progress( void );
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+function Interrupt_Is_In_Progress
+return RTEMS.Boolean;
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+
+NONE
+
+@subheading DESCRIPTION:
+
+This directive returns @code{TRUE} if the processor is currently
+servicing an interrupt and @code{FALSE} otherwise. A return value
+of @code{TRUE} indicates that the caller is an interrupt service
+routine, @b{NOT} a task. The directives available to an interrupt
+service routine are restricted.
+
+@subheading NOTES:
+
+This directive will not cause the calling task to be preempted.
+
diff --git a/doc/user/io.t b/doc/user/io.t
new file mode 100644
index 0000000000..a22ef09a8f
--- /dev/null
+++ b/doc/user/io.t
@@ -0,0 +1,741 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter I/O Manager
+
+@cindex device drivers
+@cindex IO Manager
+
+@section Introduction
+
+The input/output interface manager provides a
+well-defined mechanism for accessing device drivers and a
+structured methodology for organizing device drivers. The
+directives provided by the I/O manager are:
+
+@itemize @bullet
+@item @code{@value{DIRPREFIX}io_initialize} - Initialize a device driver
+@item @code{@value{DIRPREFIX}io_register_name} - Register a device name
+@item @code{@value{DIRPREFIX}io_lookup_name} - Look up a device name
+@item @code{@value{DIRPREFIX}io_open} - Open a device
+@item @code{@value{DIRPREFIX}io_close} - Close a device
+@item @code{@value{DIRPREFIX}io_read} - Read from a device
+@item @code{@value{DIRPREFIX}io_write} - Write to a device
+@item @code{@value{DIRPREFIX}io_control} - Special device services
+@end itemize
+
+@section Background
+
+@subsection Device Driver Table
+
+@cindex Device Driver Table
+
+Each application utilizing the RTEMS I/O manager must specify the
+address of a Device Driver Table in its Configuration Table. This table
+contains each device driver's entry points that is to be initialised by
+RTEMS during initialization. Each device driver may contain the
+following entry points:
+
+@itemize @bullet
+@item Initialization
+@item Open
+@item Close
+@item Read
+@item Write
+@item Control
+@end itemize
+
+If the device driver does not support a particular
+entry point, then that entry in the Configuration Table should
+be NULL. RTEMS will return
+@code{@value{RPREFIX}SUCCESSFUL} as the executive's and
+zero (0) as the device driver's return code for these device
+driver entry points.
+
+Applications can register and unregister drivers with the RTEMS I/O
+manager avoiding the need to have all drivers statically defined and
+linked into this table.
+
+The @file{confdefs.h} entry @code{CONFIGURE_MAXIMUM_DRIVERS} configures
+the number of driver slots available to the application.
+
+@subsection Major and Minor Device Numbers
+
+@cindex major device number
+@cindex minor device number
+
+Each call to the I/O manager must provide a device's
+major and minor numbers as arguments. The major number is the
+index of the requested driver's entry points in the Device
+Driver Table, and is used to select a specific device driver.
+The exact usage of the minor number is driver specific, but is
+commonly used to distinguish between a number of devices
+controlled by the same driver.
+
+@findex rtems_device_major_number
+@findex rtems_device_minor_number
+
+The data types @code{@value{DIRPREFIX}device_major_number} and
+@code{@value{DIRPREFIX}device_minor_number} are used to
+manipulate device major and minor numbers, respectively.
+
+@subsection Device Names
+
+@cindex device names
+
+The I/O Manager provides facilities to associate a
+name with a particular device. Directives are provided to
+register the name of a device and to look up the major/minor
+number pair associated with a device name.
+
+@subsection Device Driver Environment
+
+Application developers, as well as device driver
+developers, must be aware of the following regarding the RTEMS
+I/O Manager:
+
+@itemize @bullet
+@item A device driver routine executes in the context of the
+invoking task. Thus if the driver blocks, the invoking task
+blocks.
+
+@item The device driver is free to change the modes of the
+invoking task, although the driver should restore them to their
+original values.
+
+@item Device drivers may be invoked from ISRs.
+
+@item Only local device drivers are accessible through the I/O
+manager.
+
+@item A device driver routine may invoke all other RTEMS
+directives, including I/O directives, on both local and global
+objects.
+
+@end itemize
+
+Although the RTEMS I/O manager provides a framework
+for device drivers, it makes no assumptions regarding the
+construction or operation of a device driver.
+
+@subsection Runtime Driver Registration
+
+@cindex runtime driver registration
+
+Board support package and application developers can select wether a
+device driver is statically entered into the default device table or
+registered at runtime.
+
+Dynamic registration helps applications where:
+
+@enumerate
+@item The BSP and kernel libraries are common to a range of applications
+for a specific target platform. An application may be built upon a
+common library with all drivers. The application selects and registers
+the drivers. Uniform driver name lookup protects the application.
+@item The type and range of drivers may vary as the application probes a
+bus during initialization.
+@item Support for hot swap bus system such as Compact PCI.
+@item Support for runtime loadable driver modules.
+@end enumerate
+
+@subsection Device Driver Interface
+
+@cindex device driver interface
+
+When an application invokes an I/O manager directive,
+RTEMS determines which device driver entry point must be
+invoked. The information passed by the application to RTEMS is
+then passed to the correct device driver entry point. RTEMS
+will invoke each device driver entry point assuming it is
+compatible with the following prototype:
+
+@ifset is-C
+@example
+rtems_device_driver io_entry(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument_block
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+function IO_Entry (
+ Major : in RTEMS.Device_Major_Number;
+ Minor : in RTEMS.Device_Major_Number;
+ Argument_Block : in RTEMS.Address
+) return RTEMS.Status_Code;
+@end example
+@end ifset
+
+The format and contents of the parameter block are
+device driver and entry point dependent.
+
+It is recommended that a device driver avoid
+generating error codes which conflict with those used by
+application components. A common technique used to generate
+driver specific error codes is to make the most significant part
+of the status indicate a driver specific code.
+
+@subsection Device Driver Initialization
+
+RTEMS automatically initializes all device drivers
+when multitasking is initiated via the
+@code{@value{DIRPREFIX}initialize_executive}
+directive. RTEMS initializes the device drivers by invoking
+each device driver initialization entry point with the following
+parameters:
+
+@table @asis
+@item major
+the major device number for this device driver.
+
+@item minor
+zero.
+
+@item argument_block
+will point to the Configuration Table.
+
+@end table
+
+The returned status will be ignored by RTEMS. If the driver
+cannot successfully initialize the device, then it should invoke
+the fatal_error_occurred directive.
+
+@section Operations
+
+@subsection Register and Lookup Name
+
+The @code{@value{DIRPREFIX}io_register} directive associates a name with the
+specified device (i.e. major/minor number pair). Device names
+are typically registered as part of the device driver
+initialization sequence. The @code{@value{DIRPREFIX}io_lookup}
+directive is used to
+determine the major/minor number pair associated with the
+specified device name. The use of these directives frees the
+application from being dependent on the arbitrary assignment of
+major numbers in a particular application. No device naming
+conventions are dictated by RTEMS.
+
+@subsection Accessing an Device Driver
+
+The I/O manager provides directives which enable the
+application program to utilize device drivers in a standard
+manner. There is a direct correlation between the RTEMS I/O
+manager directives
+@code{@value{DIRPREFIX}io_initialize},
+@code{@value{DIRPREFIX}io_open},
+@code{@value{DIRPREFIX}io_close},
+@code{@value{DIRPREFIX}io_read},
+@code{@value{DIRPREFIX}io_write}, and
+@code{@value{DIRPREFIX}io_control}
+and the underlying device driver entry points.
+
+@section Directives
+
+This section details the I/O manager's directives. A
+subsection is dedicated to each of this manager's directives and
+describes the calling sequence, related constants, usage, and
+status codes.
+
+@c
+@c
+@c
+@page
+@subsection IO_REGISTER_DRIVER - Register a device driver
+
+@cindex register a device driver
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_io_register_driver
+@example
+rtems_status_code rtems_io_register_driver(
+ rtems_device_major_number major,
+ rtems_driver_address_table *driver_table,
+ rtems_device_major_number *registered_major
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+No Ada implementation.
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - successfully registered@*
+@code{@value{RPREFIX}INVALID_NUMBER} - invalid major device number@*
+@code{@value{RPREFIX}TOO_MANY} - no available major device table slot@*
+@code{@value{RPREFIX}RESOURCE_IN_USE} - major device number entry in use
+
+@subheading DESCRIPTION:
+
+This directive attempts to add a new device driver to the Device Driver
+Table. The user can specify a specific major device number via the
+directive's @code{major} parameter, or let the registration routine find
+the next available major device number by specifing a major number of
+@code{0}. The selected major device number is returned via the
+@code{registered_major} directive parameter. The directive automatically
+allocation major device numbers from the highest value down.
+
+This directive automatically invokes the IO_INITIALIZE directive if
+the driver address table has an initialization and open entry.
+
+The directive returns @value{RPREFIX}TOO_MANY if Device Driver Table is
+full, and @value{RPREFIX}RESOURCE_IN_USE if a specific major device
+number is requested and it is already in use.
+
+@subheading NOTES:
+
+The Device Driver Table size is specified in the Configuration Table
+condiguration. This needs to be set to maximum size the application
+requires.
+
+
+@c
+@c
+@c
+@page
+@subsection IO_UNREGISTER_DRIVER - Unregister a device driver
+
+@cindex unregister a device driver
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_io_unregister_driver
+@example
+rtems_status_code rtems_io_register_driver(
+ rtems_device_major_number major
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+No Ada implementation.
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - successfully registered@*
+@code{@value{RPREFIX}INVALID_NUMBER} - invalid major device number
+
+@subheading DESCRIPTION:
+
+This directive removes a device driver from the Device Driver Table.
+
+@subheading NOTES:
+
+Currently no specific checks are made and the driver is not closed.
+
+
+@c
+@c
+@c
+@page
+@subsection IO_INITIALIZE - Initialize a device driver
+
+@cindex initialize a device driver
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_io_initialize
+@example
+rtems_status_code rtems_io_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure IO_Initialize (
+ Major : in RTEMS.Device_Major_Number;
+ Minor : in RTEMS.Device_Minor_Number;
+ Argument : in RTEMS.Address;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - successfully initialized@*
+@code{@value{RPREFIX}INVALID_NUMBER} - invalid major device number
+
+@subheading DESCRIPTION:
+
+This directive calls the device driver initialization
+routine specified in the Device Driver Table for this major
+number. This directive is automatically invoked for each device
+driver when multitasking is initiated via the
+initialize_executive directive.
+
+A device driver initialization module is responsible
+for initializing all hardware and data structures associated
+with a device. If necessary, it can allocate memory to be used
+during other operations.
+
+@subheading NOTES:
+
+This directive may or may not cause the calling task
+to be preempted. This is dependent on the device driver being
+initialized.
+
+@c
+@c
+@c
+@page
+@subsection IO_REGISTER_NAME - Register a device
+
+@cindex register device
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_io_register_name
+@example
+rtems_status_code rtems_io_register_name(
+ char *name,
+ rtems_device_major_number major,
+ rtems_device_minor_number minor
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure IO_Register_Name (
+ Name : in String;
+ Major : in RTEMS.Device_Major_Number;
+ Minor : in RTEMS.Device_Minor_Number;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - successfully initialized@*
+@code{@value{RPREFIX}TOO_MANY} - too many devices registered
+
+@subheading DESCRIPTION:
+
+This directive associates name with the specified
+major/minor number pair.
+
+@subheading NOTES:
+
+This directive will not cause the calling task to be
+preempted.
+
+@c
+@c
+@c
+@page
+@subsection IO_LOOKUP_NAME - Lookup a device
+
+@cindex lookup device major and minor number
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_io_lookup_name
+@example
+rtems_status_code rtems_io_lookup_name(
+ const char *name,
+ rtems_driver_name_t *device_info
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure IO_Lookup_Name (
+ Name : in String;
+ Device_Info : out RTEMS.Driver_Name_t_Pointer;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - successfully initialized@*
+@code{@value{RPREFIX}UNSATISFIED} - name not registered
+
+@subheading DESCRIPTION:
+
+This directive returns the major/minor number pair
+associated with the given device name in @code{device_info}.
+
+@subheading NOTES:
+
+This directive will not cause the calling task to be
+preempted.
+
+@c
+@c
+@c
+@page
+@subsection IO_OPEN - Open a device
+
+@cindex open a devive
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_io_open
+@example
+rtems_status_code rtems_io_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure IO_Open (
+ Major : in RTEMS.Device_Major_Number;
+ Minor : in RTEMS.Device_Minor_Number;
+ Argument : in RTEMS.Address;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - successfully initialized@*
+@code{@value{RPREFIX}INVALID_NUMBER} - invalid major device number
+
+@subheading DESCRIPTION:
+
+This directive calls the device driver open routine
+specified in the Device Driver Table for this major number. The
+open entry point is commonly used by device drivers to provide
+exclusive access to a device.
+
+@subheading NOTES:
+
+This directive may or may not cause the calling task
+to be preempted. This is dependent on the device driver being
+invoked.
+
+@c
+@c
+@c
+@page
+@subsection IO_CLOSE - Close a device
+
+@cindex close a device
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_io_close
+@example
+rtems_status_code rtems_io_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure IO_Close (
+ Major : in RTEMS.Device_Major_Number;
+ Minor : in RTEMS.Device_Minor_Number;
+ Argument : in RTEMS.Address;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - successfully initialized@*
+@code{@value{RPREFIX}INVALID_NUMBER} - invalid major device number
+
+@subheading DESCRIPTION:
+
+This directive calls the device driver close routine
+specified in the Device Driver Table for this major number. The
+close entry point is commonly used by device drivers to
+relinquish exclusive access to a device.
+
+@subheading NOTES:
+
+This directive may or may not cause the calling task
+to be preempted. This is dependent on the device driver being
+invoked.
+
+@c
+@c
+@c
+@page
+@subsection IO_READ - Read from a device
+
+@cindex read from a device
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_io_read
+@example
+rtems_status_code rtems_io_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure IO_Read (
+ Major : in RTEMS.Device_Major_Number;
+ Minor : in RTEMS.Device_Minor_Number;
+ Argument : in RTEMS.Address;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - successfully initialized@*
+@code{@value{RPREFIX}INVALID_NUMBER} - invalid major device number
+
+@subheading DESCRIPTION:
+
+This directive calls the device driver read routine
+specified in the Device Driver Table for this major number.
+Read operations typically require a buffer address as part of
+the argument parameter block. The contents of this buffer will
+be replaced with data from the device.
+
+@subheading NOTES:
+
+This directive may or may not cause the calling task
+to be preempted. This is dependent on the device driver being
+invoked.
+
+@c
+@c
+@c
+@page
+@subsection IO_WRITE - Write to a device
+
+@cindex write to a device
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_io_write
+@example
+rtems_status_code rtems_io_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure IO_Write (
+ Major : in RTEMS.Device_Major_Number;
+ Minor : in RTEMS.Device_Minor_Number;
+ Argument : in RTEMS.Address;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - successfully initialized@*
+@code{@value{RPREFIX}INVALID_NUMBER} - invalid major device number
+
+@subheading DESCRIPTION:
+
+This directive calls the device driver write routine
+specified in the Device Driver Table for this major number.
+Write operations typically require a buffer address as part of
+the argument parameter block. The contents of this buffer will
+be sent to the device.
+
+@subheading NOTES:
+
+This directive may or may not cause the calling task
+to be preempted. This is dependent on the device driver being
+invoked.
+
+@c
+@c
+@c
+@page
+@subsection IO_CONTROL - Special device services
+
+@cindex special device services
+@cindex IO Control
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_io_control
+@example
+rtems_status_code rtems_io_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure IO_Control (
+ Major : in RTEMS.Device_Major_Number;
+ Minor : in RTEMS.Device_Minor_Number;
+ Argument : in RTEMS.Address;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - successfully initialized@*
+@code{@value{RPREFIX}INVALID_NUMBER} - invalid major device number
+
+@subheading DESCRIPTION:
+
+This directive calls the device driver I/O control
+routine specified in the Device Driver Table for this major
+number. The exact functionality of the driver entry called by
+this directive is driver dependent. It should not be assumed
+that the control entries of two device drivers are compatible.
+For example, an RS-232 driver I/O control operation may change
+the baud rate of a serial line, while an I/O control operation
+for a floppy disk driver may cause a seek operation.
+
+@subheading NOTES:
+
+This directive may or may not cause the calling task
+to be preempted. This is dependent on the device driver being
+invoked.
+
+
+
diff --git a/doc/user/mp.t b/doc/user/mp.t
new file mode 100644
index 0000000000..7114151593
--- /dev/null
+++ b/doc/user/mp.t
@@ -0,0 +1,621 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Multiprocessing Manager
+
+@cindex multiprocessing
+
+@section Introduction
+
+In multiprocessor real-time systems, new
+requirements, such as sharing data and global resources between
+processors, are introduced. This requires an efficient and
+reliable communications vehicle which allows all processors to
+communicate with each other as necessary. In addition, the
+ramifications of multiple processors affect each and every
+characteristic of a real-time system, almost always making them
+more complicated.
+
+RTEMS addresses these issues by providing simple and
+flexible real-time multiprocessing capabilities. The executive
+easily lends itself to both tightly-coupled and loosely-coupled
+configurations of the target system hardware. In addition,
+RTEMS supports systems composed of both homogeneous and
+heterogeneous mixtures of processors and target boards.
+
+A major design goal of the RTEMS executive was to
+transcend the physical boundaries of the target hardware
+configuration. This goal is achieved by presenting the
+application software with a logical view of the target system
+where the boundaries between processor nodes are transparent.
+As a result, the application developer may designate objects
+such as tasks, queues, events, signals, semaphores, and memory
+blocks as global objects. These global objects may then be
+accessed by any task regardless of the physical location of the
+object and the accessing task. RTEMS automatically determines
+that the object being accessed resides on another processor and
+performs the actions required to access the desired object.
+Simply stated, RTEMS allows the entire system, both hardware and
+software, to be viewed logically as a single system.
+
+@section Background
+
+@cindex multiprocessing topologies
+
+RTEMS makes no assumptions regarding the connection
+media or topology of a multiprocessor system. The tasks which
+compose a particular application can be spread among as many
+processors as needed to satisfy the application's timing
+requirements. The application tasks can interact using a subset
+of the RTEMS directives as if they were on the same processor.
+These directives allow application tasks to exchange data,
+communicate, and synchronize regardless of which processor they
+reside upon.
+
+The RTEMS multiprocessor execution model is multiple
+instruction streams with multiple data streams (MIMD). This
+execution model has each of the processors executing code
+independent of the other processors. Because of this
+parallelism, the application designer can more easily guarantee
+deterministic behavior.
+
+By supporting heterogeneous environments, RTEMS
+allows the systems designer to select the most efficient
+processor for each subsystem of the application. Configuring
+RTEMS for a heterogeneous environment is no more difficult than
+for a homogeneous one. In keeping with RTEMS philosophy of
+providing transparent physical node boundaries, the minimal
+heterogeneous processing required is isolated in the MPCI layer.
+
+@subsection Nodes
+
+@cindex nodes, definition
+
+A processor in a RTEMS system is referred to as a
+node. Each node is assigned a unique non-zero node number by
+the application designer. RTEMS assumes that node numbers are
+assigned consecutively from one to the @code{maximum_nodes}
+configuration parameter. The node
+number, node, and the maximum number of nodes, maximum_nodes, in
+a system are found in the Multiprocessor Configuration Table.
+The maximum_nodes field and the number of global objects,
+maximum_global_objects, is required to be the same on all nodes
+in a system.
+
+The node number is used by RTEMS to identify each
+node when performing remote operations. Thus, the
+Multiprocessor Communications Interface Layer (MPCI) must be
+able to route messages based on the node number.
+
+@subsection Global Objects
+
+@cindex global objects, definition
+
+All RTEMS objects which are created with the GLOBAL
+attribute will be known on all other nodes. Global objects can
+be referenced from any node in the system, although certain
+directive specific restrictions (e.g. one cannot delete a remote
+object) may apply. A task does not have to be global to perform
+operations involving remote objects. The maximum number of
+global objects is the system is user configurable and can be
+found in the maximum_global_objects field in the Multiprocessor
+Configuration Table. The distribution of tasks to processors is
+performed during the application design phase. Dynamic task
+relocation is not supported by RTEMS.
+
+@subsection Global Object Table
+
+@cindex global objects table
+
+RTEMS maintains two tables containing object
+information on every node in a multiprocessor system: a local
+object table and a global object table. The local object table
+on each node is unique and contains information for all objects
+created on this node whether those objects are local or global.
+The global object table contains information regarding all
+global objects in the system and, consequently, is the same on
+every node.
+
+Since each node must maintain an identical copy of
+the global object table, the maximum number of entries in each
+copy of the table must be the same. The maximum number of
+entries in each copy is determined by the
+maximum_global_objects parameter in the Multiprocessor
+Configuration Table. This parameter, as well as the
+maximum_nodes parameter, is required to be the same on all
+nodes. To maintain consistency among the table copies, every
+node in the system must be informed of the creation or deletion
+of a global object.
+
+@subsection Remote Operations
+
+@cindex MPCI and remote operations
+
+When an application performs an operation on a remote
+global object, RTEMS must generate a Remote Request (RQ) message
+and send it to the appropriate node. After completing the
+requested operation, the remote node will build a Remote
+Response (RR) message and send it to the originating node.
+Messages generated as a side-effect of a directive (such as
+deleting a global task) are known as Remote Processes (RP) and
+do not require the receiving node to respond.
+
+Other than taking slightly longer to execute
+directives on remote objects, the application is unaware of the
+location of the objects it acts upon. The exact amount of
+overhead required for a remote operation is dependent on the
+media connecting the nodes and, to a lesser degree, on the
+efficiency of the user-provided MPCI routines.
+
+The following shows the typical transaction sequence
+during a remote application:
+
+@enumerate
+
+@item The application issues a directive accessing a
+remote global object.
+
+@item RTEMS determines the node on which the object
+resides.
+
+@item RTEMS calls the user-provided MPCI routine
+GET_PACKET to obtain a packet in which to build a RQ message.
+
+@item After building a message packet, RTEMS calls the
+user-provided MPCI routine SEND_PACKET to transmit the packet to
+the node on which the object resides (referred to as the
+destination node).
+
+@item The calling task is blocked until the RR message
+arrives, and control of the processor is transferred to another
+task.
+
+@item The MPCI layer on the destination node senses the
+arrival of a packet (commonly in an ISR), and calls the
+@code{@value{DIRPREFIX}multiprocessing_announce}
+directive. This directive readies the Multiprocessing Server.
+
+@item The Multiprocessing Server calls the user-provided
+MPCI routine RECEIVE_PACKET, performs the requested operation,
+builds an RR message, and returns it to the originating node.
+
+@item The MPCI layer on the originating node senses the
+arrival of a packet (typically via an interrupt), and calls the RTEMS
+@code{@value{DIRPREFIX}multiprocessing_announce} directive. This directive
+readies the Multiprocessing Server.
+
+@item The Multiprocessing Server calls the user-provided
+MPCI routine RECEIVE_PACKET, readies the original requesting
+task, and blocks until another packet arrives. Control is
+transferred to the original task which then completes processing
+of the directive.
+
+@end enumerate
+
+If an uncorrectable error occurs in the user-provided
+MPCI layer, the fatal error handler should be invoked. RTEMS
+assumes the reliable transmission and reception of messages by
+the MPCI and makes no attempt to detect or correct errors.
+
+@subsection Proxies
+
+@cindex proxy, definition
+
+A proxy is an RTEMS data structure which resides on a
+remote node and is used to represent a task which must block as
+part of a remote operation. This action can occur as part of the
+@code{@value{DIRPREFIX}semaphore_obtain} and
+@code{@value{DIRPREFIX}message_queue_receive} directives. If the
+object were local, the task's control block would be available
+for modification to indicate it was blocking on a message queue
+or semaphore. However, the task's control block resides only on
+the same node as the task. As a result, the remote node must
+allocate a proxy to represent the task until it can be readied.
+
+The maximum number of proxies is defined in the
+Multiprocessor Configuration Table. Each node in a
+multiprocessor system may require a different number of proxies
+to be configured. The distribution of proxy control blocks is
+application dependent and is different from the distribution of
+tasks.
+
+@subsection Multiprocessor Configuration Table
+
+The Multiprocessor Configuration Table contains
+information needed by RTEMS when used in a multiprocessor
+system. This table is discussed in detail in the section
+Multiprocessor Configuration Table of the Configuring a System
+chapter.
+
+@section Multiprocessor Communications Interface Layer
+
+The Multiprocessor Communications Interface Layer
+(MPCI) is a set of user-provided procedures which enable the
+nodes in a multiprocessor system to communicate with one
+another. These routines are invoked by RTEMS at various times
+in the preparation and processing of remote requests.
+Interrupts are enabled when an MPCI procedure is invoked. It is
+assumed that if the execution mode and/or interrupt level are
+altered by the MPCI layer, that they will be restored prior to
+returning to RTEMS.
+
+@cindex MPCI, definition
+
+The MPCI layer is responsible for managing a pool of
+buffers called packets and for sending these packets between
+system nodes. Packet buffers contain the messages sent between
+the nodes. Typically, the MPCI layer will encapsulate the
+packet within an envelope which contains the information needed
+by the MPCI layer. The number of packets available is dependent
+on the MPCI layer implementation.
+
+@cindex MPCI entry points
+
+The entry points to the routines in the user's MPCI
+layer should be placed in the Multiprocessor Communications
+Interface Table. The user must provide entry points for each of
+the following table entries in a multiprocessor system:
+
+@itemize @bullet
+@item initialization initialize the MPCI
+@item get_packet obtain a packet buffer
+@item return_packet return a packet buffer
+@item send_packet send a packet to another node
+@item receive_packet called to get an arrived packet
+@end itemize
+
+A packet is sent by RTEMS in each of the following situations:
+
+@itemize @bullet
+@item an RQ is generated on an originating node;
+@item an RR is generated on a destination node;
+@item a global object is created;
+@item a global object is deleted;
+@item a local task blocked on a remote object is deleted;
+@item during system initialization to check for system consistency.
+@end itemize
+
+If the target hardware supports it, the arrival of a
+packet at a node may generate an interrupt. Otherwise, the
+real-time clock ISR can check for the arrival of a packet. In
+any case, the
+@code{@value{DIRPREFIX}multiprocessing_announce} directive must be called
+to announce the arrival of a packet. After exiting the ISR,
+control will be passed to the Multiprocessing Server to process
+the packet. The Multiprocessing Server will call the get_packet
+entry to obtain a packet buffer and the receive_entry entry to
+copy the message into the buffer obtained.
+
+@subsection INITIALIZATION
+
+The INITIALIZATION component of the user-provided
+MPCI layer is called as part of the @code{@value{DIRPREFIX}initialize_executive}
+directive to initialize the MPCI layer and associated hardware.
+It is invoked immediately after all of the device drivers have
+been initialized. This component should be adhere to the
+following prototype:
+
+@ifset is-C
+@findex rtems_mpci_entry
+@example
+@group
+rtems_mpci_entry user_mpci_initialization(
+ rtems_configuration_table *configuration
+);
+@end group
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure User_MPCI_Initialization (
+ Configuration : in RTEMS.Configuration_Table_Pointer
+);
+@end example
+@end ifset
+
+where configuration is the address of the user's
+Configuration Table. Operations on global objects cannot be
+performed until this component is invoked. The INITIALIZATION
+component is invoked only once in the life of any system. If
+the MPCI layer cannot be successfully initialized, the fatal
+error manager should be invoked by this routine.
+
+One of the primary functions of the MPCI layer is to
+provide the executive with packet buffers. The INITIALIZATION
+routine must create and initialize a pool of packet buffers.
+There must be enough packet buffers so RTEMS can obtain one
+whenever needed.
+
+@subsection GET_PACKET
+
+The GET_PACKET component of the user-provided MPCI
+layer is called when RTEMS must obtain a packet buffer to send
+or broadcast a message. This component should be adhere to the
+following prototype:
+
+@ifset is-C
+@example
+@group
+rtems_mpci_entry user_mpci_get_packet(
+ rtems_packet_prefix **packet
+);
+@end group
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure User_MPCI_Get_Packet (
+ Packet : access RTEMS.Packet_Prefix_Pointer
+);
+@end example
+@end ifset
+
+where packet is the address of a pointer to a packet.
+This routine always succeeds and, upon return, packet will
+contain the address of a packet. If for any reason, a packet
+cannot be successfully obtained, then the fatal error manager
+should be invoked.
+
+RTEMS has been optimized to avoid the need for
+obtaining a packet each time a message is sent or broadcast.
+For example, RTEMS sends response messages (RR) back to the
+originator in the same packet in which the request message (RQ)
+arrived.
+
+@subsection RETURN_PACKET
+
+The RETURN_PACKET component of the user-provided MPCI
+layer is called when RTEMS needs to release a packet to the free
+packet buffer pool. This component should be adhere to the
+following prototype:
+
+@ifset is-C
+@example
+@group
+rtems_mpci_entry user_mpci_return_packet(
+ rtems_packet_prefix *packet
+);
+@end group
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure User_MPCI_Return_Packet (
+ Packet : in RTEMS.Packet_Prefix_Pointer
+);
+@end example
+@end ifset
+
+where packet is the address of a packet. If the
+packet cannot be successfully returned, the fatal error manager
+should be invoked.
+
+@subsection RECEIVE_PACKET
+
+The RECEIVE_PACKET component of the user-provided
+MPCI layer is called when RTEMS needs to obtain a packet which
+has previously arrived. This component should be adhere to the
+following prototype:
+
+@ifset is-C
+@example
+@group
+rtems_mpci_entry user_mpci_receive_packet(
+ rtems_packet_prefix **packet
+);
+@end group
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure User_MPCI_Receive_Packet (
+ Packet : access RTEMS.Packet_Prefix_Pointer
+);
+@end example
+@end ifset
+
+where packet is a pointer to the address of a packet
+to place the message from another node. If a message is
+available, then packet will contain the address of the message
+from another node. If no messages are available, this entry
+packet should contain NULL.
+
+@subsection SEND_PACKET
+
+The SEND_PACKET component of the user-provided MPCI
+layer is called when RTEMS needs to send a packet containing a
+message to another node. This component should be adhere to the
+following prototype:
+
+@ifset is-C
+@example
+@group
+rtems_mpci_entry user_mpci_send_packet(
+ rtems_unsigned32 node,
+ rtems_packet_prefix **packet
+);
+@end group
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure User_MPCI_Send_Packet (
+ Node : in RTEMS.Unsigned32;
+ Packet : access RTEMS.Packet_Prefix_Pointer
+);
+@end example
+@end ifset
+
+where node is the node number of the destination and packet is the
+address of a packet which containing a message. If the packet cannot
+be successfully sent, the fatal error manager should be invoked.
+
+If node is set to zero, the packet is to be
+broadcasted to all other nodes in the system. Although some
+MPCI layers will be built upon hardware which support a
+broadcast mechanism, others may be required to generate a copy
+of the packet for each node in the system.
+
+@c XXX packet_prefix structure needs to be defined in this document
+Many MPCI layers use the @code{packet_length} field of the
+@code{@value{DIRPREFIX}packet_prefix} portion
+of the packet to avoid sending unnecessary data. This is especially
+useful if the media connecting the nodes is relatively slow.
+
+The to_convert field of the MP_packet_prefix portion of the packet indicates
+how much of the packet (in @code{@value{DIRPREFIX}unsigned32}'s) may require
+conversion in a heterogeneous system.
+
+@subsection Supporting Heterogeneous Environments
+
+@cindex heterogeneous multiprocessing
+
+Developing an MPCI layer for a heterogeneous system
+requires a thorough understanding of the differences between the
+processors which comprise the system. One difficult problem is
+the varying data representation schemes used by different
+processor types. The most pervasive data representation problem
+is the order of the bytes which compose a data entity.
+Processors which place the least significant byte at the
+smallest address are classified as little endian processors.
+Little endian byte-ordering is shown below:
+
+
+@example
+@group
++---------------+----------------+---------------+----------------+
+| | | | |
+| Byte 3 | Byte 2 | Byte 1 | Byte 0 |
+| | | | |
++---------------+----------------+---------------+----------------+
+@end group
+@end example
+
+Conversely, processors which place the most
+significant byte at the smallest address are classified as big
+endian processors. Big endian byte-ordering is shown below:
+
+@example
+@group
++---------------+----------------+---------------+----------------+
+| | | | |
+| Byte 0 | Byte 1 | Byte 2 | Byte 3 |
+| | | | |
++---------------+----------------+---------------+----------------+
+@end group
+@end example
+
+Unfortunately, sharing a data structure between big
+endian and little endian processors requires translation into a
+common endian format. An application designer typically chooses
+the common endian format to minimize conversion overhead.
+
+Another issue in the design of shared data structures
+is the alignment of data structure elements. Alignment is both
+processor and compiler implementation dependent. For example,
+some processors allow data elements to begin on any address
+boundary, while others impose restrictions. Common restrictions
+are that data elements must begin on either an even address or
+on a long word boundary. Violation of these restrictions may
+cause an exception or impose a performance penalty.
+
+Other issues which commonly impact the design of
+shared data structures include the representation of floating
+point numbers, bit fields, decimal data, and character strings.
+In addition, the representation method for negative integers
+could be one's or two's complement. These factors combine to
+increase the complexity of designing and manipulating data
+structures shared between processors.
+
+RTEMS addressed these issues in the design of the
+packets used to communicate between nodes. The RTEMS packet
+format is designed to allow the MPCI layer to perform all
+necessary conversion without burdening the developer with the
+details of the RTEMS packet format. As a result, the MPCI layer
+must be aware of the following:
+
+@itemize @bullet
+@item All packets must begin on a four byte boundary.
+
+@item Packets are composed of both RTEMS and application data.
+All RTEMS data is treated as thirty-two (32) bit unsigned
+quantities and is in the first @code{@value{RPREFIX}MINIMUM_UNSIGNED32S_TO_CONVERT}
+thirty-two (32) quantities of the packet.
+
+@item The RTEMS data component of the packet must be in native
+endian format. Endian conversion may be performed by either the
+sending or receiving MPCI layer.
+
+@item RTEMS makes no assumptions regarding the application
+data component of the packet.
+@end itemize
+
+@section Operations
+
+@subsection Announcing a Packet
+
+The @code{@value{DIRPREFIX}multiprocessing_announce} directive is called by
+the MPCI layer to inform RTEMS that a packet has arrived from
+another node. This directive can be called from an interrupt
+service routine or from within a polling routine.
+
+@section Directives
+
+This section details the additional directives
+required to support RTEMS in a multiprocessor configuration. A
+subsection is dedicated to each of this manager's directives and
+describes the calling sequence, related constants, usage, and
+status codes.
+
+@c
+@c
+@c
+@page
+@subsection MULTIPROCESSING_ANNOUNCE - Announce the arrival of a packet
+
+@cindex announce arrival of package
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_multiprocessing_announce
+@example
+void rtems_multiprocessing_announce( void );
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Multiprocessing_Announce;
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+
+NONE
+
+@subheading DESCRIPTION:
+
+This directive informs RTEMS that a multiprocessing
+communications packet has arrived from another node. This
+directive is called by the user-provided MPCI, and is only used
+in multiprocessor configurations.
+
+@subheading NOTES:
+
+This directive is typically called from an ISR.
+
+This directive will almost certainly cause the
+calling task to be preempted.
+
+This directive does not generate activity on remote nodes.
diff --git a/doc/user/msg.t b/doc/user/msg.t
new file mode 100644
index 0000000000..03d2150e3c
--- /dev/null
+++ b/doc/user/msg.t
@@ -0,0 +1,834 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Message Manager
+
+@cindex messages
+@cindex message queues
+
+@section Introduction
+
+The message manager provides communication and
+synchronization capabilities using RTEMS message queues. The
+directives provided by the message manager are:
+
+@itemize @bullet
+@item @code{@value{DIRPREFIX}message_queue_create} - Create a queue
+@item @code{@value{DIRPREFIX}message_queue_ident} - Get ID of a queue
+@item @code{@value{DIRPREFIX}message_queue_delete} - Delete a queue
+@item @code{@value{DIRPREFIX}message_queue_send} - Put message at rear of a queue
+@item @code{@value{DIRPREFIX}message_queue_urgent} - Put message at front of a queue
+@item @code{@value{DIRPREFIX}message_queue_broadcast} - Broadcast N messages to a queue
+@item @code{@value{DIRPREFIX}message_queue_receive} - Receive message from a queue
+@item @code{@value{DIRPREFIX}message_queue_get_number_pending} - Get number of messages pending on a queue
+@item @code{@value{DIRPREFIX}message_queue_flush} - Flush all messages on a queue
+@end itemize
+
+@section Background
+
+@subsection Messages
+
+A message is a variable length buffer where
+information can be stored to support communication. The length
+of the message and the information stored in that message are
+user-defined and can be actual data, pointer(s), or empty.
+
+@subsection Message Queues
+
+A message queue permits the passing of messages among
+tasks and ISRs. Message queues can contain a variable number of
+messages. Normally messages are sent to and received from the
+queue in FIFO order using the @code{@value{DIRPREFIX}message_queue_send}
+directive. However, the @code{@value{DIRPREFIX}message_queue_urgent}
+directive can be used to place
+messages at the head of a queue in LIFO order.
+
+Synchronization can be accomplished when a task can
+wait for a message to arrive at a queue. Also, a task may poll
+a queue for the arrival of a message.
+
+The maximum length message which can be sent is set
+on a per message queue basis.
+
+@subsection Building a Message Queue Attribute Set
+
+@cindex message queue attributes
+
+In general, an attribute set is built by a bitwise OR
+of the desired attribute components. The set of valid message
+queue attributes is provided in the following table:
+
+@itemize @bullet
+@item @code{@value{RPREFIX}FIFO} - tasks wait by FIFO (default)
+@item @code{@value{RPREFIX}PRIORITY} - tasks wait by priority
+@item @code{@value{RPREFIX}LOCAL} - local message queue (default)
+@item @code{@value{RPREFIX}GLOBAL} - global message queue
+@end itemize
+
+
+An attribute listed as a default is not required to
+appear in the attribute list, although it is a good programming
+practice to specify default attributes. If all defaults are
+desired, the attribute @code{@value{RPREFIX}DEFAULT_ATTRIBUTES}
+should be specified on this call.
+
+This example demonstrates the attribute_set parameter
+needed to create a local message queue with the task priority
+waiting queue discipline. The attribute_set parameter to the
+@code{@value{DIRPREFIX}message_queue_create} directive could be either
+@code{@value{RPREFIX}PRIORITY} or
+@code{@value{RPREFIX}LOCAL @value{OR} @value{RPREFIX}PRIORITY}.
+The attribute_set parameter can be set to @code{@value{RPREFIX}PRIORITY}
+because @code{@value{RPREFIX}LOCAL} is the default for all created
+message queues. If a similar message queue were to be known globally, then the
+attribute_set parameter would be
+@code{@value{RPREFIX}GLOBAL @value{OR} @value{RPREFIX}PRIORITY}.
+
+@subsection Building a MESSAGE_QUEUE_RECEIVE Option Set
+
+In general, an option is built by a bitwise OR of the
+desired option components. The set of valid options for the
+@code{@value{DIRPREFIX}message_queue_receive} directive are
+listed in the following table:
+
+@itemize @bullet
+@item @code{@value{RPREFIX}WAIT} - task will wait for a message (default)
+@item @code{@value{RPREFIX}NO_WAIT} - task should not wait
+@end itemize
+
+An option listed as a default is not required to
+appear in the option OR list, although it is a good programming
+practice to specify default options. If all defaults are
+desired, the option @code{@value{RPREFIX}DEFAULT_OPTIONS} should
+be specified on this call.
+
+This example demonstrates the option parameter needed
+to poll for a message to arrive. The option parameter passed to
+the @code{@value{DIRPREFIX}message_queue_receive} directive should
+be @code{@value{RPREFIX}NO_WAIT}.
+
+@section Operations
+
+@subsection Creating a Message Queue
+
+The @code{@value{DIRPREFIX}message_queue_create} directive creates a message
+queue with the user-defined name. The user specifies the
+maximum message size and maximum number of messages which can be
+placed in the message queue at one time. The user may select
+FIFO or task priority as the method for placing waiting tasks in
+the task wait queue. RTEMS allocates a Queue Control Block
+(QCB) from the QCB free list to maintain the newly created queue
+as well as memory for the message buffer pool associated with
+this message queue. RTEMS also generates a message queue ID
+which is returned to the calling task.
+
+For GLOBAL message queues, the maximum message size
+is effectively limited to the longest message which the MPCI is
+capable of transmitting.
+
+@subsection Obtaining Message Queue IDs
+
+When a message queue is created, RTEMS generates a
+unique message queue ID. The message queue ID may be obtained
+by either of two methods. First, as the result of an invocation
+of the @code{@value{DIRPREFIX}message_queue_create} directive, the
+queue ID is stored in a user provided location. Second, the queue
+ID may be obtained later using the @code{@value{DIRPREFIX}message_queue_ident}
+directive. The queue ID is used by other message manager
+directives to access this message queue.
+
+@subsection Receiving a Message
+
+The @code{@value{DIRPREFIX}message_queue_receive} directive attempts to
+retrieve a message from the specified message queue. If at
+least one message is in the queue, then the message is removed
+from the queue, copied to the caller's message buffer, and
+returned immediately along with the length of the message. When
+messages are unavailable, one of the following situations
+applies:
+
+@itemize @bullet
+@item By default, the calling task will wait forever for the
+message to arrive.
+
+@item Specifying the @code{@value{RPREFIX}NO_WAIT} option forces an immediate return
+with an error status code.
+
+@item Specifying a timeout limits the period the task will
+wait before returning with an error status.
+@end itemize
+
+If the task waits for a message, then it is placed in
+the message queue's task wait queue in either FIFO or task
+priority order. All tasks waiting on a message queue are
+returned an error code when the message queue is deleted.
+
+@subsection Sending a Message
+
+Messages can be sent to a queue with the
+@code{@value{DIRPREFIX}message_queue_send} and
+@code{@value{DIRPREFIX}message_queue_urgent} directives. These
+directives work identically when tasks are waiting to receive a
+message. A task is removed from the task waiting queue,
+unblocked, and the message is copied to a waiting task's
+message buffer.
+
+When no tasks are waiting at the queue,
+@code{@value{DIRPREFIX}message_queue_send} places the
+message at the rear of the message queue, while
+@code{@value{DIRPREFIX}message_queue_urgent} places the message at the
+front of the queue. The message is copied to a message buffer
+from this message queue's buffer pool and then placed in the
+message queue. Neither directive can successfully send a
+message to a message queue which has a full queue of pending
+messages.
+
+@subsection Broadcasting a Message
+
+The @code{@value{DIRPREFIX}message_queue_broadcast} directive sends the same
+message to every task waiting on the specified message queue as
+an atomic operation. The message is copied to each waiting
+task's message buffer and each task is unblocked. The number of
+tasks which were unblocked is returned to the caller.
+
+@subsection Deleting a Message Queue
+
+The @code{@value{DIRPREFIX}message_queue_delete} directive removes a message
+queue from the system and frees its control block as well as the
+memory associated with this message queue's message buffer pool.
+A message queue can be deleted by any local task that knows the
+message queue's ID. As a result of this directive, all tasks
+blocked waiting to receive a message from the message queue will
+be readied and returned a status code which indicates that the
+message queue was deleted. Any subsequent references to the
+message queue's name and ID are invalid. Any messages waiting
+at the message queue are also deleted and deallocated.
+
+@section Directives
+
+This section details the message manager's
+directives. A subsection is dedicated to each of this manager's
+directives and describes the calling sequence, related
+constants, usage, and status codes.
+
+@c
+@c
+@c
+@page
+@subsection MESSAGE_QUEUE_CREATE - Create a queue
+
+@cindex create a message queue
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_message_queue_create
+@example
+rtems_status_code rtems_message_queue_create(
+ rtems_name name,
+ rtems_unsigned32 count,
+ rtems_unsigned32 max_message_size,
+ rtems_attribute attribute_set,
+ rtems_id *id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Message_Queue_Create (
+ Name : in RTEMS.Name;
+ Count : in RTEMS.Unsigned32;
+ Max_Message_Size : in RTEMS.Unsigned32;
+ Attribute_Set : in RTEMS.Attribute;
+ ID : out RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - queue created successfully@*
+@code{@value{RPREFIX}INVALID_NAME} - invalid task name@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{id} is NULL@*
+@code{@value{RPREFIX}INVALID_NUMBER} - invalid message count@*
+@code{@value{RPREFIX}INVALID_SIZE} - invalid message size@*
+@code{@value{RPREFIX}TOO_MANY} - too many queues created@*
+@code{@value{RPREFIX}MP_NOT_CONFIGURED} - multiprocessing not configured@*
+@code{@value{RPREFIX}TOO_MANY} - too many global objects
+
+@subheading DESCRIPTION:
+
+This directive creates a message queue which resides
+on the local node with the user-defined name specified in name.
+For control and maintenance of the queue, RTEMS allocates and
+initializes a QCB. Memory is allocated from the RTEMS Workspace
+for the specified count of messages, each of max_message_size
+bytes in length. The RTEMS-assigned queue id, returned in id,
+is used to access the message queue.
+
+Specifying @code{@value{RPREFIX}PRIORITY} in attribute_set causes tasks
+waiting for a message to be serviced according to task priority.
+When @code{@value{RPREFIX}FIFO} is specified, waiting tasks are serviced in First
+In-First Out order.
+
+@subheading NOTES:
+
+This directive will not cause the calling task to be
+preempted.
+
+The following message queue attribute constants are
+defined by RTEMS:
+
+@itemize @bullet
+@item @code{@value{RPREFIX}FIFO} - tasks wait by FIFO (default)
+@item @code{@value{RPREFIX}PRIORITY} - tasks wait by priority
+@item @code{@value{RPREFIX}LOCAL} - local message queue (default)
+@item @code{@value{RPREFIX}GLOBAL} - global message queue
+@end itemize
+
+Message queues should not be made global unless
+remote tasks must interact with the created message queue. This
+is to avoid the system overhead incurred by the creation of a
+global message queue. When a global message queue is created,
+the message queue's name and id must be transmitted to every
+node in the system for insertion in the local copy of the global
+object table.
+
+For GLOBAL message queues, the maximum message size
+is effectively limited to the longest message which the MPCI is
+capable of transmitting.
+
+The total number of global objects, including message
+queues, is limited by the maximum_global_objects field in the
+configuration table.
+
+@c
+@c
+@c
+@page
+@subsection MESSAGE_QUEUE_IDENT - Get ID of a queue
+
+@cindex get ID of a message queue
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_message_queue_ident
+@example
+rtems_status_code rtems_message_queue_ident(
+ rtems_name name,
+ rtems_unsigned32 node,
+ rtems_id *id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Message_Queue_Ident (
+ Name : in RTEMS.Name;
+ Node : in RTEMS.Unsigned32;
+ ID : out RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - queue identified successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{id} is NULL@*
+@code{@value{RPREFIX}INVALID_NAME} - queue name not found@*
+@code{@value{RPREFIX}INVALID_NODE} - invalid node id
+
+@subheading DESCRIPTION:
+
+This directive obtains the queue id associated with
+the queue name specified in name. If the queue name is not
+unique, then the queue id will match one of the queues with that
+name. However, this queue id is not guaranteed to correspond to
+the desired queue. The queue id is used with other message
+related directives to access the message queue.
+
+@subheading NOTES:
+
+This directive will not cause the running task to be
+preempted.
+
+If node is @code{@value{RPREFIX}SEARCH_ALL_NODES}, all nodes are searched
+with the local node being searched first. All other nodes are
+searched with the lowest numbered node searched first.
+
+If node is a valid node number which does not
+represent the local node, then only the message queues exported
+by the designated node are searched.
+
+This directive does not generate activity on remote
+nodes. It accesses only the local copy of the global object
+table.
+
+@c
+@c
+@c
+@page
+@subsection MESSAGE_QUEUE_DELETE - Delete a queue
+
+@cindex delete a message queue
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_message_queue_delete
+@example
+rtems_status_code rtems_message_queue_delete(
+ rtems_id id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Message_Queue_Delete (
+ ID : in RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - queue deleted successfully@*
+@code{@value{RPREFIX}INVALID_ID} - invalid queue id@*
+@code{@value{RPREFIX}ILLEGAL_ON_REMOTE_OBJECT} - cannot delete remote queue
+
+@subheading DESCRIPTION:
+
+This directive deletes the message queue specified by
+id. As a result of this directive, all tasks blocked waiting to
+receive a message from this queue will be readied and returned a
+status code which indicates that the message queue was deleted.
+If no tasks are waiting, but the queue contains messages, then
+RTEMS returns these message buffers back to the system message
+buffer pool. The QCB for this queue as well as the memory for
+the message buffers is reclaimed by RTEMS.
+
+@subheading NOTES:
+
+The calling task will be preempted if its preemption
+mode is enabled and one or more local tasks with a higher
+priority than the calling task are waiting on the deleted queue.
+The calling task will NOT be preempted if the tasks that are
+waiting are remote tasks.
+
+The calling task does not have to be the task that
+created the queue, although the task and queue must reside on
+the same node.
+
+When the queue is deleted, any messages in the queue
+are returned to the free message buffer pool. Any information
+stored in those messages is lost.
+
+When a global message queue is deleted, the message
+queue id must be transmitted to every node in the system for
+deletion from the local copy of the global object table.
+
+Proxies, used to represent remote tasks, are
+reclaimed when the message queue is deleted.
+
+@c
+@c
+@c
+@page
+@subsection MESSAGE_QUEUE_SEND - Put message at rear of a queue
+
+@cindex send message to a queue
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_message_queue_send
+@example
+rtems_status_code rtems_message_queue_send(
+ rtems_id id,
+ void *buffer,
+ rtems_unsigned32 size
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Message_Queue_Send (
+ ID : in RTEMS.ID;
+ Buffer : in RTEMS.Address;
+ Size : in RTEMS.Unsigned32;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - message sent successfully@*
+@code{@value{RPREFIX}INVALID_ID} - invalid queue id@*
+@code{@value{RPREFIX}INVALID_SIZE} - invalid message size@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{buffer} is NULL@*
+@code{@value{RPREFIX}UNSATISFIED} - out of message buffers@*
+@code{@value{RPREFIX}TOO_MANY} - queue's limit has been reached
+
+@subheading DESCRIPTION:
+
+This directive sends the message buffer of size bytes
+in length to the queue specified by id. If a task is waiting at
+the queue, then the message is copied to the waiting task's
+buffer and the task is unblocked. If no tasks are waiting at the
+queue, then the message is copied to a message buffer which is
+obtained from this message queue's message buffer pool. The
+message buffer is then placed at the rear of the queue.
+
+@subheading NOTES:
+
+The calling task will be preempted if it has
+preemption enabled and a higher priority task is unblocked as
+the result of this directive.
+
+Sending a message to a global message queue which
+does not reside on the local node will generate a request to the
+remote node to post the message on the specified message queue.
+
+If the task to be unblocked resides on a different
+node from the message queue, then the message is forwarded to
+the appropriate node, the waiting task is unblocked, and the
+proxy used to represent the task is reclaimed.
+
+@c
+@c
+@c
+@page
+@subsection MESSAGE_QUEUE_URGENT - Put message at front of a queue
+
+@cindex put message at front of queue
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_message_queue_urgent
+@example
+rtems_status_code rtems_message_queue_urgent(
+ rtems_id id,
+ void *buffer,
+ rtems_unsigned32 size
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Message_Queue_Urgent (
+ ID : in RTEMS.ID;
+ Buffer : in RTEMS.Address;
+ Size : in RTEMS.Unsigned32;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - message sent successfully@*
+@code{@value{RPREFIX}INVALID_ID} - invalid queue id@*
+@code{@value{RPREFIX}INVALID_SIZE} - invalid message size@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{buffer} is NULL@*
+@code{@value{RPREFIX}UNSATISFIED} - out of message buffers@*
+@code{@value{RPREFIX}TOO_MANY} - queue's limit has been reached
+
+@subheading DESCRIPTION:
+
+This directive sends the message buffer of size bytes
+in length to the queue specified by id. If a task is waiting on
+the queue, then the message is copied to the task's buffer and
+the task is unblocked. If no tasks are waiting on the queue,
+then the message is copied to a message buffer which is obtained
+from this message queue's message buffer pool. The message
+buffer is then placed at the front of the queue.
+
+@subheading NOTES:
+
+The calling task will be preempted if it has
+preemption enabled and a higher priority task is unblocked as
+the result of this directive.
+
+Sending a message to a global message queue which
+does not reside on the local node will generate a request
+telling the remote node to post the message on the specified
+message queue.
+
+If the task to be unblocked resides on a different
+node from the message queue, then the message is forwarded to
+the appropriate node, the waiting task is unblocked, and the
+proxy used to represent the task is reclaimed.
+
+@c
+@c
+@c
+@page
+@subsection MESSAGE_QUEUE_BROADCAST - Broadcast N messages to a queue
+
+@cindex broadcast message to a queue
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_message_queue_broadcast
+@example
+rtems_status_code rtems_message_queue_broadcast(
+ rtems_id id,
+ void *buffer,
+ rtems_unsigned32 size,
+ rtems_unsigned32 *count
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Message_Queue_Broadcast (
+ ID : in RTEMS.ID;
+ Buffer : in RTEMS.Address;
+ Size : in RTEMS.Unsigned32;
+ Count : out RTEMS.Unsigned32;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - message broadcasted successfully@*
+@code{@value{RPREFIX}INVALID_ID} - invalid queue id@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{buffer} is NULL@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{count} is NULL@*
+@code{@value{RPREFIX}INVALID_SIZE} - invalid message size
+
+@subheading DESCRIPTION:
+
+This directive causes all tasks that are waiting at
+the queue specified by id to be unblocked and sent the message
+contained in buffer. Before a task is unblocked, the message
+buffer of size byes in length is copied to that task's message
+buffer. The number of tasks that were unblocked is returned in
+count.
+
+@subheading NOTES:
+
+The calling task will be preempted if it has
+preemption enabled and a higher priority task is unblocked as
+the result of this directive.
+
+The execution time of this directive is directly
+related to the number of tasks waiting on the message queue,
+although it is more efficient than the equivalent number of
+invocations of @code{@value{DIRPREFIX}message_queue_send}.
+
+Broadcasting a message to a global message queue
+which does not reside on the local node will generate a request
+telling the remote node to broadcast the message to the
+specified message queue.
+
+When a task is unblocked which resides on a different
+node from the message queue, a copy of the message is forwarded
+to the appropriate node, the waiting task is unblocked, and the
+proxy used to represent the task is reclaimed.
+
+@c
+@c
+@c
+@page
+@subsection MESSAGE_QUEUE_RECEIVE - Receive message from a queue
+
+@cindex receive message from a queue
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_message_queue_receive
+@example
+rtems_status_code rtems_message_queue_receive(
+ rtems_id id,
+ void *buffer,
+ rtems_unsigned32 *size,
+ rtems_unsigned32 option_set,
+ rtems_interval timeout
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Message_Queue_Receive (
+ ID : in RTEMS.ID;
+ Buffer : in RTEMS.Address;
+ Option_Set : in RTEMS.Option;
+ Timeout : in RTEMS.Interval;
+ Size : out RTEMS.Unsigned32;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - message received successfully@*
+@code{@value{RPREFIX}INVALID_ID} - invalid queue id@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{buffer} is NULL@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{count} is NULL@*
+@code{@value{RPREFIX}UNSATISFIED} - queue is empty@*
+@code{@value{RPREFIX}TIMEOUT} - timed out waiting for message@*
+@code{@value{RPREFIX}OBJECT_WAS_DELETED} - queue deleted while waiting
+
+@subheading DESCRIPTION:
+
+This directive receives a message from the message
+queue specified in id. The @code{@value{RPREFIX}WAIT} and @code{@value{RPREFIX}NO_WAIT} options of the
+options parameter allow the calling task to specify whether to
+wait for a message to become available or return immediately.
+For either option, if there is at least one message in the
+queue, then it is copied to buffer, size is set to return the
+length of the message in bytes, and this directive returns
+immediately with a successful return code.
+
+If the calling task chooses to return immediately and
+the queue is empty, then a status code indicating this condition
+is returned. If the calling task chooses to wait at the message
+queue and the queue is empty, then the calling task is placed on
+the message wait queue and blocked. If the queue was created
+with the @code{@value{RPREFIX}PRIORITY} option specified, then
+the calling task is inserted into the wait queue according to
+its priority. But, if the queue was created with the
+@code{@value{RPREFIX}FIFO} option specified, then the
+calling task is placed at the rear of the wait queue.
+
+A task choosing to wait at the queue can optionally
+specify a timeout value in the timeout parameter. The timeout
+parameter specifies the maximum interval to wait before the
+calling task desires to be unblocked. If it is set to
+@code{@value{RPREFIX}NO_TIMEOUT}, then the calling task will wait forever.
+
+@subheading NOTES:
+
+The following message receive option constants are
+defined by RTEMS:
+
+@itemize @bullet
+@item @code{@value{RPREFIX}WAIT} - task will wait for a message (default)
+@item @code{@value{RPREFIX}NO_WAIT} - task should not wait
+@end itemize
+
+Receiving a message from a global message queue which
+does not reside on the local node will generate a request to the
+remote node to obtain a message from the specified message
+queue. If no message is available and @code{@value{RPREFIX}WAIT} was specified, then
+the task must be blocked until a message is posted. A proxy is
+allocated on the remote node to represent the task until the
+message is posted.
+
+A clock tick is required to support the timeout functionality of
+this directive.
+
+@c
+@c
+@c
+@page
+@subsection MESSAGE_QUEUE_GET_NUMBER_PENDING - Get number of messages pending on a queue
+
+@cindex get number of pending messages
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_message_queue_get_number_pending
+@example
+rtems_status_code rtems_message_queue_get_number_pending(
+ rtems_id id,
+ rtems_unsigned32 *count
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Message_Queue_Get_Number_Pending (
+ ID : in RTEMS.ID;
+ Count : out RTEMS.Unsigned32;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - number of messages pending returned successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{count} is NULL@*
+@code{@value{RPREFIX}INVALID_ID} - invalid queue id
+
+@subheading DESCRIPTION:
+
+This directive returns the number of messages pending on this
+message queue in count. If no messages are present
+on the queue, count is set to zero.
+
+@subheading NOTES:
+
+Getting the number of pending messages on a global message queue which
+does not reside on the local node will generate a request to the
+remote node to actually obtain the pending message count for
+the specified message queue.
+
+
+@c
+@c
+@c
+@page
+@subsection MESSAGE_QUEUE_FLUSH - Flush all messages on a queue
+
+@cindex flush messages on a queue
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_message_queue_flush
+@example
+rtems_status_code rtems_message_queue_flush(
+ rtems_id id,
+ rtems_unsigned32 *count
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Message_Queue_Flush (
+ ID : in RTEMS.ID;
+ Count : out RTEMS.Unsigned32;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - message queue flushed successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{count} is NULL@*
+@code{@value{RPREFIX}INVALID_ID} - invalid queue id
+
+@subheading DESCRIPTION:
+
+This directive removes all pending messages from the
+specified queue id. The number of messages removed is returned
+in count. If no messages are present on the queue, count is set
+to zero.
+
+@subheading NOTES:
+
+Flushing all messages on a global message queue which
+does not reside on the local node will generate a request to the
+remote node to actually flush the specified message queue.
+
diff --git a/doc/user/overview.t b/doc/user/overview.t
new file mode 100644
index 0000000000..031fa86d31
--- /dev/null
+++ b/doc/user/overview.t
@@ -0,0 +1,532 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c This chapter is missing the following figures:
+@c
+@c Figure 1-1 RTEMS Application Architecture
+@c Figure 1-2 RTEMS Internal Architecture
+@c
+
+@chapter Overview
+
+@section Introduction
+
+RTEMS, Real-Time Executive for Multiprocessor Systems, is a
+real-time executive (kernel) which provides a high performance
+environment for embedded military applications including the
+following features:
+
+@itemize @bullet
+@item multitasking capabilities
+@item homogeneous and heterogeneous multiprocessor systems
+@item event-driven, priority-based, preemptive scheduling
+@item optional rate monotonic scheduling
+@item intertask communication and synchronization
+@item priority inheritance
+@item responsive interrupt management
+@item dynamic memory allocation
+@item high level of user configurability
+@end itemize
+
+This manual describes the usage of RTEMS for
+applications written in the @value{LANGUAGE} programming language. Those
+implementation details that are processor dependent are provided
+in the Applications Supplement documents. A supplement
+document which addresses specific architectural issues that
+affect RTEMS is provided for each processor type that is
+supported.
+
+@section Real-time Application Systems
+
+Real-time application systems are a special class of
+computer applications. They have a complex set of
+characteristics that distinguish them from other software
+problems. Generally, they must adhere to more rigorous
+requirements. The correctness of the system depends not only on
+the results of computations, but also on the time at which the
+results are produced. The most important and complex
+characteristic of real-time application systems is that they
+must receive and respond to a set of external stimuli within
+rigid and critical time constraints referred to as deadlines.
+Systems can be buried by an avalanche of interdependent,
+asynchronous or cyclical event streams.
+
+Deadlines can be further characterized as either hard
+or soft based upon the value of the results when produced after
+the deadline has passed. A deadline is hard if the results have
+no value or if their use will result in a catastrophic event.
+In contrast, results which are produced after a soft deadline
+may have some value.
+
+Another distinguishing requirement of real-time
+application systems is the ability to coordinate or manage a
+large number of concurrent activities. Since software is a
+synchronous entity, this presents special problems. One
+instruction follows another in a repeating synchronous cycle.
+Even though mechanisms have been developed to allow for the
+processing of external asynchronous events, the software design
+efforts required to process and manage these events and tasks
+are growing more complicated.
+
+The design process is complicated further by
+spreading this activity over a set of processors instead of a
+single processor. The challenges associated with designing and
+building real-time application systems become very complex when
+multiple processors are involved. New requirements such as
+interprocessor communication channels and global resources that
+must be shared between competing processors are introduced. The
+ramifications of multiple processors complicate each and every
+characteristic of a real-time system.
+
+@section Real-time Executive
+
+Fortunately, real-time operating systems or real-time
+executives serve as a cornerstone on which to build the
+application system. A real-time multitasking executive allows
+an application to be cast into a set of logical, autonomous
+processes or tasks which become quite manageable. Each task is
+internally synchronous, but different tasks execute
+independently, resulting in an asynchronous processing stream.
+Tasks can be dynamically paused for many reasons resulting in a
+different task being allowed to execute for a period of time.
+The executive also provides an interface to other system
+components such as interrupt handlers and device drivers.
+System components may request the executive to allocate and
+coordinate resources, and to wait for and trigger synchronizing
+conditions. The executive system calls effectively extend the
+CPU instruction set to support efficient multitasking. By
+causing tasks to travel through well-defined state transitions,
+system calls permit an application to demand-switch between
+tasks in response to real-time events.
+
+By proper grouping of responses to stimuli into
+separate tasks, a system can now asynchronously switch between
+independent streams of execution, directly responding to
+external stimuli as they occur. This allows the system design
+to meet critical performance specifications which are typically
+measured by guaranteed response time and transaction throughput.
+The multiprocessor extensions of RTEMS provide the features
+necessary to manage the extra requirements introduced by a
+system distributed across several processors. It removes the
+physical barriers of processor boundaries from the world of the
+system designer, enabling more critical aspects of the system to
+receive the required attention. Such a system, based on an
+efficient real-time, multiprocessor executive, is a more
+realistic model of the outside world or environment for which it
+is designed. As a result, the system will always be more
+logical, efficient, and reliable.
+
+By using the directives provided by RTEMS, the
+real-time applications developer is freed from the problem of
+controlling and synchronizing multiple tasks and processors. In
+addition, one need not develop, test, debug, and document
+routines to manage memory, pass messages, or provide mutual
+exclusion. The developer is then able to concentrate solely on
+the application. By using standard software components, the
+time and cost required to develop sophisticated real-time
+applications is significantly reduced.
+
+@section RTEMS Application Architecture
+
+One important design goal of RTEMS was to provide a
+bridge between two critical layers of typical real-time systems.
+As shown in the following figure, RTEMS serves as a buffer between the
+project dependent application code and the target hardware.
+Most hardware dependencies for real-time applications can be
+localized to the low level device drivers.
+
+@ifset use-ascii
+@example
+@group
+ +-----------------------------------------------------------+
+ | Application Dependent Software |
+ | +----------------------------------------+ |
+ | | Standard Application Components | |
+ | | +-------------+---+ |
+ | +---+-----------+ | | |
+ | | Board Support | | RTEMS | |
+ | | Package | | | |
+ +----+---------------+--------------+-----------------+-----|
+ | Target Hardware |
+ +-----------------------------------------------------------+
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@sp 1
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\vrule#&
+\hbox to 0.50in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 0.50in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 0.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 0.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 0.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 0.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 0.50in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 0.50in{\enskip\hfil#\hfil}&
+\vrule#\cr
+\multispan{17}\hrulefill\cr
+% to force all columns to desired width
+& \enskip && \enskip && \enskip && \enskip &&
+ \enskip && \enskip &&\enskip &&\enskip &\cr
+% For debugging columns
+%& \enskip 0&& \enskip 1&& \enskip 2&& \enskip 3&&
+% \enskip 4&& \enskip 5&&\enskip 6&&\enskip 7&\cr
+\strut&\multispan{15}&\cr
+&\multispan{15}\hfil Application Dependent Software\hfil&\cr
+\strut&\multispan{15}&\cr
+&\multispan{2}&&\multispan{8}\hrulefill &\multispan{2}&\cr
+\strut&\multispan{2}&&&\multispan{7}&&\multispan{2}&&\cr
+&\multispan{2}&&&\multispan{7}\hfil Standard Application Components\hfil&
+ &\multispan{2}&&\cr
+\strut&\multispan{2}&&&\multispan{7}&&\multispan{2}&&\cr
+&&\multispan{5}\hrulefill&&\multispan{7}\hrulefill&&\cr
+\strut&&&\multispan{3} &&&&\multispan{5}&&&\cr
+&&&\multispan{3}\hfil Device\hfil&&&&\multispan{5}\hfil RTEMS\hfil&&&\cr
+&&&\multispan{3}\hfil Drivers\hfil&&&&\multispan{5}&&&\cr
+\strut&&&\multispan{3} &&&&\multispan{5}&&&\cr
+\multispan{17}\hrulefill\cr
+\strut&\multispan{15}&\cr
+&\multispan{15}\hfil Target Hardware\hfil&\cr
+\strut&\multispan{15}&\cr
+\multispan{17}\hrulefill\cr
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-html
+@html
+<IMG SRC="rtemsarc.png" WIDTH=500 HEIGHT=300 ALT="RTEMS Application Architecture">
+@end html
+@end ifset
+
+The RTEMS I/O interface manager provides an efficient tool for incorporating
+these hardware dependencies into the system while simultaneously
+providing a general mechanism to the application code that
+accesses them. A well designed real-time system can benefit
+from this architecture by building a rich library of standard
+application components which can be used repeatedly in other
+real-time projects.
+
+@section RTEMS Internal Architecture
+
+RTEMS can be viewed as a set of layered components that work in
+harmony to provide a set of services to a real-time application
+system. The executive interface presented to the application is
+formed by grouping directives into logical sets called resource managers.
+Functions utilized by multiple managers such as scheduling,
+dispatching, and object management are provided in the executive
+core. The executive core depends on a small set of CPU dependent routines.
+Together these components provide a powerful run time
+environment that promotes the development of efficient real-time
+application systems. The following figure illustrates this organization:
+
+@ifset use-ascii
+@example
+@group
+ +-----------------------------------------------+
+ | RTEMS Executive Interface |
+ +-----------------------------------------------+
+ | RTEMS Core |
+ +-----------------------------------------------+
+ | CPU Dependent Code |
+ +-----------------------------------------------+
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@c for now use the ascii version
+@c @example
+@c @group
+@c +-----------------------------------------------+
+@c | RTEMS Executive Interface |
+@c +-----------------------------------------------+
+@c | RTEMS Core |
+@c +-----------------------------------------------+
+@c | CPU Dependent Code |
+@c +-----------------------------------------------+
+@c @end group
+@c @end example
+@image{rtemspie,4in,3in}
+@tex
+@end tex
+@end ifset
+
+@ifset use-html
+@html
+<IMG SRC="rtemspie.png" WIDTH=500 HEIGHT=300 ALT="RTEMS Architecture">
+@end html
+@end ifset
+Subsequent chapters present a detailed description of the capabilities
+provided by each of the following RTEMS managers:
+
+@itemize @bullet
+@item initialization
+@item task
+@item interrupt
+@item clock
+@item timer
+@item semaphore
+@item message
+@item event
+@item signal
+@item partition
+@item region
+@item dual ported memory
+@item I/O
+@item fatal error
+@item rate monotonic
+@item user extensions
+@item multiprocessing
+@end itemize
+
+@section User Customization and Extensibility
+
+As thirty-two bit microprocessors have decreased in
+cost, they have become increasingly common in a variety of
+embedded systems. A wide range of custom and general-purpose
+processor boards are based on various thirty-two bit processors.
+RTEMS was designed to make no assumptions concerning the
+characteristics of individual microprocessor families or of
+specific support hardware. In addition, RTEMS allows the system
+developer a high degree of freedom in customizing and extending
+its features.
+
+RTEMS assumes the existence of a supported
+microprocessor and sufficient memory for both RTEMS and the
+real-time application. Board dependent components such as
+clocks, interrupt controllers, or I/O devices can be easily
+integrated with RTEMS. The customization and extensibility
+features allow RTEMS to efficiently support as many environments
+as possible.
+
+@section Portability
+
+The issue of portability was the major factor in the
+creation of RTEMS. Since RTEMS is designed to isolate the
+hardware dependencies in the specific board support packages,
+the real-time application should be easily ported to any other
+processor. The use of RTEMS allows the development of real-time
+applications which can be completely independent of a particular
+microprocessor architecture.
+
+@section Memory Requirements
+
+Since memory is a critical resource in many real-time
+embedded systems, RTEMS was specifically designed to allow
+unused managers to be excluded from the run-time environment.
+This allows the application designer the flexibility to tailor
+RTEMS to most efficiently meet system requirements while still
+satisfying even the most stringent memory constraints. As a
+result, the size of the RTEMS executive is application
+dependent. A worksheet is provided in the Memory Requirements
+chapter of the Applications Supplement document for a specific
+target processor. The worksheet is used to calculate the memory
+requirements of a custom RTEMS run-time environment. The
+following managers may be optionally excluded:
+
+@itemize @bullet
+@item clock
+@item timer
+@item semaphore
+@item message
+@item event
+@item signal
+@item partition
+@item region
+@item dual ported memory
+@item I/O
+@item rate monotonic
+@item fatal error
+@item multiprocessing
+@end itemize
+
+RTEMS utilizes memory for both code and data space.
+Although RTEMS' data space must be in RAM, its code space can be
+located in either ROM or RAM.
+
+@section Audience
+
+This manual was written for experienced real-time
+software developers. Although some background is provided, it
+is assumed that the reader is familiar with the concepts of task
+management as well as intertask communication and
+synchronization. Since directives, user related data
+structures, and examples are presented in @value{LANGUAGE}, a basic
+understanding of the @value{LANGUAGE} programming language
+is required to fully
+understand the material presented. However, because of the
+similarity of the Ada and C RTEMS implementations, users will
+find that the use and behavior of the two implementations is
+very similar. A working knowledge of the target processor is
+helpful in understanding some of RTEMS' features. A thorough
+understanding of the executive cannot be obtained without
+studying the entire manual because many of RTEMS' concepts and
+features are interrelated. Experienced RTEMS users will find
+that the manual organization facilitates its use as a reference
+document.
+
+@section Conventions
+
+The following conventions are used in this manual:
+
+@itemize @bullet
+@item Significant words or phrases as well as all directive
+names are printed in bold type.
+
+@item Items in bold capital letters are constants defined by
+RTEMS. Each language interface provided by RTEMS includes a
+file containing the standard set of constants, data types, and
+@value{STRUCTURE} definitions which can be incorporated into the user
+application.
+
+@item A number of type definitions are provided by RTEMS and
+can be found in rtems.h.
+
+@item The characters "0x" preceding a number indicates that
+the number is in hexadecimal format. Any other numbers are
+assumed to be in decimal format.
+@end itemize
+
+@section Manual Organization
+
+This first chapter has presented the introductory and
+background material for the RTEMS executive. The remaining
+chapters of this manual present a detailed description of RTEMS
+and the environment, including run time behavior, it creates for
+the user.
+
+A chapter is dedicated to each manager and provides a
+detailed discussion of each RTEMS manager and the directives
+which it provides. The presentation format for each directive
+includes the following sections:
+
+@itemize @bullet
+@item Calling sequence
+@item Directive status codes
+@item Description
+@item Notes
+@end itemize
+
+The following provides an overview of the remainder
+of this manual:
+
+@table @asis
+@item Chapter 2
+Key Concepts: presents an
+introduction to the ideas which are common across multiple RTEMS
+managers.
+
+@item Chapter 3:
+Initialization Manager: describes the functionality and directives
+provided by the Initialization Manager.
+
+@item Chapter 4:
+Task Manager: describes the functionality and directives provided
+by the Task Manager.
+
+@item Chapter 5:
+Interrupt Manager: describes the functionality and directives
+provided by the Interrupt Manager.
+
+@item Chapter 6:
+Clock Manager: describes the functionality and directives
+provided by the Clock Manager.
+
+@item Chapter 7
+Timer Manager: describes the functionality and directives provided
+by the Timer Manager.
+
+@item Chapter 8:
+Semaphore Manager: describes the functionality and directives
+provided by the Semaphore Manager.
+
+@item Chapter 9:
+Message Manager: describes the functionality and directives
+provided by the Message Manager.
+
+@item Chapter 10:
+Event Manager: describes the
+functionality and directives provided by the Event Manager.
+
+@item Chapter 11:
+Signal Manager: describes the
+functionality and directives provided by the Signal Manager.
+
+@item Chapter 12:
+Partition Manager: describes the
+functionality and directives provided by the Partition Manager.
+
+@item Chapter 13:
+Region Manager: describes the
+functionality and directives provided by the Region Manager.
+
+@item Chapter 14:
+Dual-Ported Memory Manager: describes
+the functionality and directives provided by the Dual-Ported
+Memory Manager.
+
+@item Chapter 15:
+I/O Manager: describes the
+functionality and directives provided by the I/O Manager.
+
+@item Chapter 16:
+Fatal Error Manager: describes the functionality and directives
+provided by the Fatal Error Manager.
+
+@item Chapter 17:
+Scheduling Concepts: details the RTEMS scheduling algorithm and
+task state transitions.
+
+@item Chapter 18:
+Rate Monotonic Manager: describes the functionality and directives
+provided by the Rate Monotonic Manager.
+
+@item Chapter 19:
+Board Support Packages: defines the
+functionality required of user-supplied board support packages.
+
+@item Chapter 20:
+User Extensions: shows the user how to
+extend RTEMS to incorporate custom features.
+
+@item Chapter 21:
+Configuring a System: details the process by which one tailors RTEMS
+for a particular single-processor or multiprocessor application.
+
+@item Chapter 22:
+Multiprocessing Manager: presents a
+conceptual overview of the multiprocessing capabilities provided
+by RTEMS as well as describing the Multiprocessing
+Communications Interface Layer and Multiprocessing Manager
+directives.
+
+@item Chapter 23:
+Directive Status Codes: provides a definition of each of the
+directive status codes referenced in this manual.
+
+@item Chapter 24:
+Example Application: provides a template for simple RTEMS applications.
+
+@item Chapter 25:
+Glossary: defines terms used throughout this manual.
+
+@end table
+
+
diff --git a/doc/user/part.t b/doc/user/part.t
new file mode 100644
index 0000000000..eef41e6308
--- /dev/null
+++ b/doc/user/part.t
@@ -0,0 +1,453 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Partition Manager
+
+@cindex partitions
+
+@section Introduction
+
+The partition manager provides facilities to
+dynamically allocate memory in fixed-size units. The directives
+provided by the partition manager are:
+
+@itemize @bullet
+@item @code{@value{DIRPREFIX}partition_create} - Create a partition
+@item @code{@value{DIRPREFIX}partition_ident} - Get ID of a partition
+@item @code{@value{DIRPREFIX}partition_delete} - Delete a partition
+@item @code{@value{DIRPREFIX}partition_get_buffer} - Get buffer from a partition
+@item @code{@value{DIRPREFIX}partition_return_buffer} - Return buffer to a partition
+@end itemize
+
+@section Background
+
+@subsection Partition Manager Definitions
+
+@cindex partition, definition
+
+A partition is a physically contiguous memory area
+divided into fixed-size buffers that can be dynamically
+allocated and deallocated.
+
+@cindex buffers, definition
+
+Partitions are managed and maintained as a list of
+buffers. Buffers are obtained from the front of the partition's
+free buffer chain and returned to the rear of the same chain.
+When a buffer is on the free buffer chain, RTEMS uses eight
+bytes of each buffer as the free buffer chain. When a buffer is
+allocated, the entire buffer is available for application use.
+Therefore, modifying memory that is outside of an allocated
+buffer could destroy the free buffer chain or the contents of an
+adjacent allocated buffer.
+
+@subsection Building a Partition Attribute Set
+
+@cindex partition attribute set, building
+
+In general, an attribute set is built by a bitwise OR
+of the desired attribute components. The set of valid partition
+attributes is provided in the following table:
+
+@itemize @bullet
+@item @code{@value{RPREFIX}LOCAL} - local task (default)
+@item @code{@value{RPREFIX}GLOBAL} - global task
+@end itemize
+
+Attribute values are specifically designed to be
+mutually exclusive, therefore bitwise OR and addition operations
+are equivalent as long as each attribute appears exactly once in
+the component list. An attribute listed as a default is not
+required to appear in the attribute list, although it is a good
+programming practice to specify default attributes. If all
+defaults are desired, the attribute
+@code{@value{RPREFIX}DEFAULT_ATTRIBUTES} should be
+specified on this call. The attribute_set parameter should be
+@code{@value{RPREFIX}GLOBAL} to indicate that the partition
+is to be known globally.
+
+@section Operations
+
+@subsection Creating a Partition
+
+The @code{@value{DIRPREFIX}partition_create} directive creates a partition
+with a user-specified name. The partition's name, starting
+address, length and buffer size are all specified to the
+@code{@value{DIRPREFIX}partition_create} directive.
+RTEMS allocates a Partition Control
+Block (PTCB) from the PTCB free list. This data structure is
+used by RTEMS to manage the newly created partition. The number
+of buffers in the partition is calculated based upon the
+specified partition length and buffer size, and returned to the
+calling task along with a unique partition ID.
+
+@subsection Obtaining Partition IDs
+
+When a partition is created, RTEMS generates a unique
+partition ID and assigned it to the created partition until it
+is deleted. The partition ID may be obtained by either of two
+methods. First, as the result of an invocation of the
+@code{@value{DIRPREFIX}partition_create} directive, the partition
+ID is stored in a user provided location. Second, the partition
+ID may be obtained later using the @code{@value{DIRPREFIX}partition_ident}
+directive. The partition ID is used by other partition manager directives
+to access this partition.
+
+@subsection Acquiring a Buffer
+
+A buffer can be obtained by calling the
+@code{@value{DIRPREFIX}partition_get_buffer} directive.
+If a buffer is available, then
+it is returned immediately with a successful return code.
+Otherwise, an unsuccessful return code is returned immediately
+to the caller. Tasks cannot block to wait for a buffer to
+become available.
+
+@subsection Releasing a Buffer
+
+Buffers are returned to a partition's free buffer
+chain with the @code{@value{DIRPREFIX}partition_return_buffer} directive. This
+directive returns an error status code if the returned buffer
+was not previously allocated from this partition.
+
+@subsection Deleting a Partition
+
+The @code{@value{DIRPREFIX}partition_delete} directive allows a partition to
+be removed and returned to RTEMS. When a partition is deleted,
+the PTCB for that partition is returned to the PTCB free list.
+A partition with buffers still allocated cannot be deleted. Any
+task attempting to do so will be returned an error status code.
+
+@section Directives
+
+This section details the partition manager's
+directives. A subsection is dedicated to each of this manager's
+directives and describes the calling sequence, related
+constants, usage, and status codes.
+
+@c
+@c
+@c
+@page
+@subsection PARTITION_CREATE - Create a partition
+
+@cindex create a partition
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_partition_create
+@example
+rtems_status_code rtems_partition_create(
+ rtems_name name,
+ void *starting_address,
+ rtems_unsigned32 length,
+ rtems_unsigned32 buffer_size,
+ rtems_attribute attribute_set,
+ rtems_id *id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Partition_Create (
+ Name : in RTEMS.Name;
+ Starting_Address : in RTEMS.Address;
+ Length : in RTEMS.Unsigned32;
+ Buffer_Size : in RTEMS.Unsigned32;
+ Attribute_Set : in RTEMS.Attribute;
+ ID : out RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - partition created successfully@*
+@code{@value{RPREFIX}INVALID_NAME} - invalid task name@*
+@code{@value{RPREFIX}TOO_MANY} - too many partitions created@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - address not on four byte boundary@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{starting_address} is NULL@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{id} is NULL@*
+@code{@value{RPREFIX}INVALID_SIZE} - length or buffer size is 0@*
+@code{@value{RPREFIX}INVALID_SIZE} - length is less than the buffer size@*
+@code{@value{RPREFIX}INVALID_SIZE} - buffer size not a multiple of 4@*
+@code{@value{RPREFIX}MP_NOT_CONFIGURED} - multiprocessing not configured@*
+@code{@value{RPREFIX}TOO_MANY} - too many global objects
+
+@subheading DESCRIPTION:
+
+This directive creates a partition of fixed size
+buffers from a physically contiguous memory space which starts
+at starting_address and is length bytes in size. Each allocated
+buffer is to be of buffer_length in bytes. The assigned
+partition id is returned in id. This partition id is used to
+access the partition with other partition related directives.
+For control and maintenance of the partition, RTEMS allocates a
+PTCB from the local PTCB free pool and initializes it.
+
+@subheading NOTES:
+
+This directive will not cause the calling task to be
+preempted.
+
+The starting_address and buffer_size parameters must
+be multiples of four.
+
+Memory from the partition is not used by RTEMS to
+store the Partition Control Block.
+
+The following partition attribute constants are
+defined by RTEMS:
+
+@itemize @bullet
+@item @code{@value{RPREFIX}LOCAL} - local task (default)
+@item @code{@value{RPREFIX}GLOBAL} - global task
+@end itemize
+
+The PTCB for a global partition is allocated on the
+local node. The memory space used for the partition must reside
+in shared memory. Partitions should not be made global unless
+remote tasks must interact with the partition. This is to avoid
+the overhead incurred by the creation of a global partition.
+When a global partition is created, the partition's name and id
+must be transmitted to every node in the system for insertion in
+the local copy of the global object table.
+
+The total number of global objects, including
+partitions, is limited by the maximum_global_objects field in
+the Configuration Table.
+
+@c
+@c
+@c
+@page
+@subsection PARTITION_IDENT - Get ID of a partition
+
+@cindex get ID of a partition
+@cindex obtain ID of a partition
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_partition_ident
+@example
+rtems_status_code rtems_partition_ident(
+ rtems_name name,
+ rtems_unsigned32 node,
+ rtems_id *id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Partition_Ident (
+ Name : in RTEMS.Name;
+ Node : in RTEMS.Unsigned32;
+ ID : out RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - partition identified successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{id} is NULL@*
+@code{@value{RPREFIX}INVALID_NAME} - partition name not found@*
+@code{@value{RPREFIX}INVALID_NODE} - invalid node id
+
+@subheading DESCRIPTION:
+
+This directive obtains the partition id associated
+with the partition name. If the partition name is not unique,
+then the partition id will match one of the partitions with that
+name. However, this partition id is not guaranteed to
+correspond to the desired partition. The partition id is used
+with other partition related directives to access the partition.
+
+@subheading NOTES:
+
+This directive will not cause the running task to be
+preempted.
+
+If node is @code{@value{RPREFIX}SEARCH_ALL_NODES}, all nodes are searched
+with the local node being searched first. All other nodes are
+searched with the lowest numbered node searched first.
+
+If node is a valid node number which does not
+represent the local node, then only the partitions exported by
+the designated node are searched.
+
+This directive does not generate activity on remote
+nodes. It accesses only the local copy of the global object
+table.
+
+@c
+@c
+@c
+@page
+@subsection PARTITION_DELETE - Delete a partition
+
+@cindex delete a partition
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_partition_delete
+@example
+rtems_status_code rtems_partition_delete(
+ rtems_id id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Partition_Delete (
+ ID : in RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - partition deleted successfully@*
+@code{@value{RPREFIX}INVALID_ID} - invalid partition id@*
+@code{@value{RPREFIX}RESOURCE_IN_USE} - buffers still in use@*
+@code{@value{RPREFIX}ILLEGAL_ON_REMOTE_OBJECT} - cannot delete remote partition
+
+@subheading DESCRIPTION:
+
+This directive deletes the partition specified by id.
+The partition cannot be deleted if any of its buffers are still
+allocated. The PTCB for the deleted partition is reclaimed by
+RTEMS.
+
+@subheading NOTES:
+
+This directive will not cause the calling task to be
+preempted.
+
+The calling task does not have to be the task that
+created the partition. Any local task that knows the partition
+id can delete the partition.
+
+When a global partition is deleted, the partition id
+must be transmitted to every node in the system for deletion
+from the local copy of the global object table.
+
+The partition must reside on the local node, even if
+the partition was created with the @code{@value{RPREFIX}GLOBAL} option.
+
+@c
+@c
+@c
+@page
+@subsection PARTITION_GET_BUFFER - Get buffer from a partition
+
+@cindex get buffer from partition
+@cindex obtain buffer from partition
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_partition_get_buffer
+@example
+rtems_status_code rtems_partition_get_buffer(
+ rtems_id id,
+ void **buffer
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Partition_Get_Buffer (
+ ID : in RTEMS.ID;
+ Buffer : out RTEMS.Address;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - buffer obtained successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{buffer} is NULL@*
+@code{@value{RPREFIX}INVALID_ID} - invalid partition id@*
+@code{@value{RPREFIX}UNSATISFIED} - all buffers are allocated
+
+@subheading DESCRIPTION:
+
+This directive allows a buffer to be obtained from
+the partition specified in id. The address of the allocated
+buffer is returned in buffer.
+
+@subheading NOTES:
+
+This directive will not cause the running task to be
+preempted.
+
+All buffers begin on a four byte boundary.
+
+A task cannot wait on a buffer to become available.
+
+Getting a buffer from a global partition which does
+not reside on the local node will generate a request telling the
+remote node to allocate a buffer from the specified partition.
+
+@c
+@c
+@c
+@page
+@subsection PARTITION_RETURN_BUFFER - Return buffer to a partition
+
+@cindex return buffer to partitition
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_partition_return_buffer
+@example
+rtems_status_code rtems_partition_return_buffer(
+ rtems_id id,
+ void *buffer
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Partition_Return_Buffer (
+ ID : in RTEMS.ID;
+ Buffer : in RTEMS.Address;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - buffer returned successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{buffer} is NULL@*
+@code{@value{RPREFIX}INVALID_ID} - invalid partition id@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - buffer address not in partition
+
+@subheading DESCRIPTION:
+
+This directive returns the buffer specified by buffer
+to the partition specified by id.
+
+@subheading NOTES:
+
+This directive will not cause the running task to be
+preempted.
+
+Returning a buffer to a global partition which does
+not reside on the local node will generate a request telling the
+remote node to return the buffer to the specified partition.
diff --git a/doc/user/preface.texi b/doc/user/preface.texi
new file mode 100644
index 0000000000..3ffb90dedf
--- /dev/null
+++ b/doc/user/preface.texi
@@ -0,0 +1,192 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Preface, Overview, Top, Top
+@end ifinfo
+@unnumbered Preface
+
+In recent years, the cost required to develop a
+software product has increased significantly while the target
+hardware costs have decreased. Now a larger portion of money is
+expended in developing, using, and maintaining software. The
+trend in computing costs is the complete dominance of software
+over hardware costs. Because of this, it is necessary that
+formal disciplines be established to increase the probability
+that software is characterized by a high degree of correctness,
+maintainability, and portability. In addition, these
+disciplines must promote practices that aid in the consistent
+and orderly development of a software system within schedule and
+budgetary constraints. To be effective, these disciplines must
+adopt standards which channel individual software efforts toward
+a common goal.
+
+The push for standards in the software development
+field has been met with various degrees of success. The
+Microprocessor Operating Systems Interfaces (MOSI) effort has
+experienced only limited success. As popular as the UNIX
+operating system has grown, the attempt to develop a standard
+interface definition to allow portable application development
+has only recently begun to produce the results needed in this
+area. Unfortunately, very little effort has been expended to
+provide standards addressing the needs of the real-time
+community. Several organizations have addressed this need
+during recent years.
+
+The Real Time Executive Interface Definition (RTEID)
+was developed by Motorola with technical input from Software
+Components Group. RTEID was adopted by the VMEbus International
+Trade Association (VITA) as a baseline draft for their proposed
+standard multiprocessor, real-time executive interface, Open
+Real-Time Kernel Interface Definition (ORKID). These two groups
+are currently working together with the IEEE P1003.4 committee
+to insure that the functionality of their proposed standards is
+adopted as the real-time extensions to POSIX.
+
+This emerging standard defines an interface for the
+development of real-time software to ease the writing of
+real-time application programs that are directly portable across
+multiple real-time executive implementations. This interface
+includes both the source code interfaces and run-time behavior
+as seen by a real-time application. It does not include the
+details of how a kernel implements these functions. The
+standard's goal is to serve as a complete definition of external
+interfaces so that application code that conforms to these
+interfaces will execute properly in all real-time executive
+environments. With the use of a standards compliant executive,
+routines that acquire memory blocks, create and manage message
+queues, establish and use semaphores, and send and receive
+signals need not be redeveloped for a different real-time
+environment as long as the new environment is compliant with the
+standard. Software developers need only concentrate on the
+hardware dependencies of the real-time system. Furthermore,
+most hardware dependencies for real-time applications can be
+localized to the device drivers.
+
+A compliant executive provides simple and flexible
+real-time multiprocessing. It easily lends itself to both
+tightly-coupled and loosely-coupled configurations (depending on
+the system hardware configuration). Objects such as tasks,
+queues, events, signals, semaphores, and memory blocks can be
+designated as global objects and accessed by any task regardless
+of which processor the object and the accessing task reside.
+
+The acceptance of a standard for real-time executives
+will produce the same advantages enjoyed from the push for UNIX
+standardization by AT&T's System V Interface Definition and
+IEEE's POSIX efforts. A compliant multiprocessing executive
+will allow close coupling between UNIX systems and real-time
+executives to provide the many benefits of the UNIX development
+environment to be applied to real-time software development.
+Together they provide the necessary laboratory environment to
+implement real-time, distributed, embedded systems using a wide
+variety of computer architectures.
+
+A study was completed in 1988, within the Research,
+Development, and Engineering Center, U.S. Army Missile Command,
+which compared the various aspects of the Ada programming
+language as they related to the application of Ada code in
+distributed and/or multiple processing systems. Several
+critical conclusions were derived from the study. These
+conclusions have a major impact on the way the Army develops
+application software for embedded applications. These impacts
+apply to both in-house software development and contractor
+developed software.
+
+A conclusion of the analysis, which has been
+previously recognized by other agencies attempting to utilize
+Ada in a distributed or multiprocessing environment, is that the
+Ada programming language does not adequately support
+multiprocessing. Ada does provide a mechanism for
+multi-tasking, however, this capability exists only for a single
+processor system. The language also does not have inherent
+capabilities to access global named variables, flags or program
+code. These critical features are essential in order for data
+to be shared between processors. However, these drawbacks do
+have workarounds which are sometimes awkward and defeat the
+intent of software maintainability and portability goals.
+
+Another conclusion drawn from the analysis, was that
+the run time executives being delivered with the Ada compilers
+were too slow and inefficient to be used in modern missile
+systems. A run time executive is the core part of the run time
+system code, or operating system code, that controls task
+scheduling, input/output management and memory management.
+Traditionally, whenever efficient executive (also known as
+kernel) code was required by the application, the user developed
+in-house software. This software was usually written in
+assembly language for optimization.
+
+Because of this shortcoming in the Ada programming
+language, software developers in research and development and
+contractors for project managed systems, are mandated by
+technology to purchase and utilize off-the-shelf third party
+kernel code. The contractor, and eventually the Government,
+must pay a licensing fee for every copy of the kernel code used
+in an embedded system.
+
+The main drawback to this development environment is
+that the Government does not own, nor has the right to modify
+code contained within the kernel. V&V techniques in this
+situation are more difficult than if the complete source code
+were available. Responsibility for system failures due to faulty
+software is yet another area to be resolved under this
+environment.
+
+The Guidance and Control Directorate began a software
+development effort to address these problems. A project to
+develop an experimental run time kernel was begun that will
+eliminate the major drawbacks of the Ada programming language
+mentioned above. The Real Time Executive for Multiprocessor Systems
+(RTEMS) provides full capabilities for management of tasks,
+interrupts, time, and multiple processors in addition to those
+features typical of generic operating systems. The code is
+Government owned, so no licensing fees are necessary. RTEMS has
+been implemented in both the Ada and C programming languages.
+It has been ported to the following processor families:
+
+@itemize @bullet
+@item Intel i386 and above
+@item Intel i960
+@item Motorola MC68xxx
+@item Motorola MC683xx
+@item Motorola ColdFire
+@item ARM
+@item MIPS
+@item PowerPC
+@item SPARC
+@item Hitachi SH
+@item Hitachi H8/300
+@item Texas Instruments C3x/C4x
+@item OpenCores OR32
+@item UNIX
+@end itemize
+
+Support for other processor families, including RISC, CISC, and DSP, is
+planned. Since almost all of RTEMS is written in a high level language,
+ports to additional processor families require minimal effort.
+
+RTEMS multiprocessor support is capable of handling
+either homogeneous or heterogeneous systems. The kernel
+automatically compensates for architectural differences (byte
+swapping, etc.) between processors. This allows a much easier
+transition from one processor family to another without a major
+system redesign.
+
+Since the proposed standards are still in draft form,
+RTEMS cannot and does not claim compliance. However, the status
+of the standard is being carefully monitored to guarantee that
+RTEMS provides the functionality specified in the standard.
+Once approved, RTEMS will be made compliant.
+
+This document is a detailed users guide for a
+functionally compliant real-time multiprocessor executive. It
+describes the user interface and run-time behavior of Release
+@value{VERSION} of the @value{LANGUAGE} interface
+to RTEMS.
+
diff --git a/doc/user/region.t b/doc/user/region.t
new file mode 100644
index 0000000000..4b90443049
--- /dev/null
+++ b/doc/user/region.t
@@ -0,0 +1,665 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Region Manager
+
+@cindex regions
+
+@section Introduction
+
+The region manager provides facilities to dynamically
+allocate memory in variable sized units. The directives
+provided by the region manager are:
+
+@itemize @bullet
+@item @code{@value{DIRPREFIX}region_create} - Create a region
+@item @code{@value{DIRPREFIX}region_ident} - Get ID of a region
+@item @code{@value{DIRPREFIX}region_delete} - Delete a region
+@item @code{@value{DIRPREFIX}region_extend} - Add memory to a region
+@item @code{@value{DIRPREFIX}region_get_segment} - Get segment from a region
+@item @code{@value{DIRPREFIX}region_return_segment} - Return segment to a region
+@item @code{@value{DIRPREFIX}region_get_segment_size} - Obtain size of a segment
+@end itemize
+
+@section Background
+
+@subsection Region Manager Definitions
+
+@cindex region, definition
+@cindex segment, definition
+
+A region makes up a physically contiguous memory
+space with user-defined boundaries from which variable-sized
+segments are dynamically allocated and deallocated. A segment
+is a variable size section of memory which is allocated in
+multiples of a user-defined page size. This page size is
+required to be a multiple of four greater than or equal to four.
+For example, if a request for a 350-byte segment is made in a
+region with 256-byte pages, then a 512-byte segment is allocated.
+
+Regions are organized as doubly linked chains of
+variable sized memory blocks. Memory requests are allocated
+using a first-fit algorithm. If available, the requester
+receives the number of bytes requested (rounded up to the next
+page size). RTEMS requires some overhead from the region's
+memory for each segment that is allocated. Therefore, an
+application should only modify the memory of a segment that has
+been obtained from the region. The application should NOT
+modify the memory outside of any obtained segments and within
+the region's boundaries while the region is currently active in
+the system.
+
+Upon return to the region, the free block is
+coalesced with its neighbors (if free) on both sides to produce
+the largest possible unused block.
+
+@subsection Building an Attribute Set
+
+@cindex region attribute set, building
+
+In general, an attribute set is built by a bitwise OR
+of the desired attribute components. The set of valid region
+attributes is provided in the following table:
+
+@itemize @bullet
+@item @code{@value{RPREFIX}FIFO} - tasks wait by FIFO (default)
+@item @code{@value{RPREFIX}PRIORITY} - tasks wait by priority
+@end itemize
+
+Attribute values are specifically designed to be
+mutually exclusive, therefore bitwise OR and addition operations
+are equivalent as long as each attribute appears exactly once in
+the component list. An attribute listed as a default is not
+required to appear in the attribute list, although it is a good
+programming practice to specify default attributes. If all
+defaults are desired, the attribute
+@code{@value{RPREFIX}DEFAULT_ATTRIBUTES} should be
+specified on this call.
+
+This example demonstrates the attribute_set parameter
+needed to create a region with the task priority waiting queue
+discipline. The attribute_set parameter to the
+@code{@value{DIRPREFIX}region_create}
+directive should be @code{@value{RPREFIX}PRIORITY}.
+
+@subsection Building an Option Set
+
+In general, an option is built by a bitwise OR of the
+desired option components. The set of valid options for the
+@code{@value{DIRPREFIX}region_get_segment} directive are
+listed in the following table:
+
+@itemize @bullet
+@item @code{@value{RPREFIX}WAIT} - task will wait for semaphore (default)
+@item @code{@value{RPREFIX}NO_WAIT} - task should not wait
+@end itemize
+
+Option values are specifically designed to be
+mutually exclusive, therefore bitwise OR and addition operations
+are equivalent as long as each option appears exactly once in
+the component list. An option listed as a default is not
+required to appear in the option list, although it is a good
+programming practice to specify default options. If all
+defaults are desired, the option
+@code{@value{RPREFIX}DEFAULT_OPTIONS} should be
+specified on this call.
+
+This example demonstrates the option parameter needed
+to poll for a segment. The option parameter passed to the
+@code{@value{DIRPREFIX}region_get_segment} directive should
+be @code{@value{RPREFIX}NO_WAIT}.
+
+@section Operations
+
+@subsection Creating a Region
+
+The @code{@value{DIRPREFIX}region_create} directive creates a region with the
+user-defined name. The user may select FIFO or task priority as
+the method for placing waiting tasks in the task wait queue.
+RTEMS allocates a Region Control Block (RNCB) from the RNCB free
+list to maintain the newly created region. RTEMS also generates
+a unique region ID which is returned to the calling task.
+
+It is not possible to calculate the exact number of
+bytes available to the user since RTEMS requires overhead for
+each segment allocated. For example, a region with one segment
+that is the size of the entire region has more available bytes
+than a region with two segments that collectively are the size
+of the entire region. This is because the region with one
+segment requires only the overhead for one segment, while the
+other region requires the overhead for two segments.
+
+Due to automatic coalescing, the number of segments
+in the region dynamically changes. Therefore, the total
+overhead required by RTEMS dynamically changes.
+
+@subsection Obtaining Region IDs
+
+When a region is created, RTEMS generates a unique
+region ID and assigns it to the created region until it is
+deleted. The region ID may be obtained by either of two
+methods. First, as the result of an invocation of the
+@code{@value{DIRPREFIX}region_create} directive,
+the region ID is stored in a user
+provided location. Second, the region ID may be obtained later
+using the @code{@value{DIRPREFIX}region_ident} directive.
+The region ID is used by other region manager directives to
+access this region.
+
+@subsection Adding Memory to a Region
+
+The @code{@value{DIRPREFIX}region_extend} directive may be used to add memory
+to an existing region. The caller specifies the size in bytes
+and starting address of the memory being added.
+
+NOTE: Please see the release notes or RTEMS source
+code for information regarding restrictions on the location of
+the memory being added in relation to memory already in the
+region.
+
+@subsection Acquiring a Segment
+
+The @code{@value{DIRPREFIX}region_get_segment} directive attempts to acquire
+a segment from a specified region. If the region has enough
+available free memory, then a segment is returned successfully
+to the caller. When the segment cannot be allocated, one of the
+following situations applies:
+
+@itemize @bullet
+@item By default, the calling task will wait forever to acquire the segment.
+
+@item Specifying the @code{@value{RPREFIX}NO_WAIT} option forces
+an immediate return with an error status code.
+
+@item Specifying a timeout limits the interval the task will
+wait before returning with an error status code.
+@end itemize
+
+If the task waits for the segment, then it is placed
+in the region's task wait queue in either FIFO or task priority
+order. All tasks waiting on a region are returned an error when
+the message queue is deleted.
+
+@subsection Releasing a Segment
+
+When a segment is returned to a region by the
+@code{@value{DIRPREFIX}region_return_segment} directive, it is merged with its
+unallocated neighbors to form the largest possible segment. The
+first task on the wait queue is examined to determine if its
+segment request can now be satisfied. If so, it is given a
+segment and unblocked. This process is repeated until the first
+task's segment request cannot be satisfied.
+
+@subsection Obtaining the Size of a Segment
+
+The @code{@value{DIRPREFIX}region_get_segment_size} directive returns the
+size in bytes of the specified segment. The size returned
+includes any "extra" memory included in the segment because of
+rounding up to a page size boundary.
+
+@subsection Deleting a Region
+
+A region can be removed from the system and returned
+to RTEMS with the @code{@value{DIRPREFIX}region_delete}
+directive. When a region is
+deleted, its control block is returned to the RNCB free list. A
+region with segments still allocated is not allowed to be
+deleted. Any task attempting to do so will be returned an
+error. As a result of this directive, all tasks blocked waiting
+to obtain a segment from the region will be readied and returned
+a status code which indicates that the region was deleted.
+
+@section Directives
+
+This section details the region manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@c
+@c
+@c
+@page
+@subsection REGION_CREATE - Create a region
+
+@cindex create a region
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_region_create
+@example
+rtems_status_code rtems_region_create(
+ rtems_name name,
+ void *starting_address,
+ rtems_unsigned32 length,
+ rtems_unsigned32 page_size,
+ rtems_attribute attribute_set,
+ rtems_id *id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Region_Create (
+ Name : in RTEMS.Name;
+ Starting_Address : in RTEMS.Address;
+ Length : in RTEMS.Unsigned32;
+ Page_Size : in RTEMS.Unsigned32;
+ Attribute_Set : in RTEMS.Attribute;
+ ID : out RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+
+@code{@value{RPREFIX}SUCCESSFUL} - region created successfully@*
+@code{@value{RPREFIX}INVALID_NAME} - invalid task name@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{id} is NULL@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{starting_address} is NULL@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - address not on four byte boundary@*
+@code{@value{RPREFIX}TOO_MANY} - too many regions created@*
+@code{@value{RPREFIX}INVALID_SIZE} - invalid page size
+
+@subheading DESCRIPTION:
+
+This directive creates a region from a physically
+contiguous memory space which starts at starting_address and is
+length bytes long. Segments allocated from the region will be a
+multiple of page_size bytes in length. The assigned region id
+is returned in id. This region id is used as an argument to
+other region related directives to access the region.
+
+For control and maintenance of the region, RTEMS
+allocates and initializes an RNCB from the RNCB free pool. Thus
+memory from the region is not used to store the RNCB. However,
+some overhead within the region is required by RTEMS each time a
+segment is constructed in the region.
+
+Specifying @code{@value{RPREFIX}PRIORITY} in attribute_set causes tasks
+waiting for a segment to be serviced according to task priority.
+Specifying @code{@value{RPREFIX}FIFO} in attribute_set or selecting
+@code{@value{RPREFIX}DEFAULT_ATTRIBUTES} will cause waiting tasks to
+be serviced in First In-First Out order.
+
+The starting_address parameter must be aligned on a
+four byte boundary. The page_size parameter must be a multiple
+of four greater than or equal to four.
+
+@subheading NOTES:
+
+This directive will not cause the calling task to be
+preempted.
+
+The following region attribute constants are defined
+by RTEMS:
+
+@itemize @bullet
+@item @code{@value{RPREFIX}FIFO} - tasks wait by FIFO (default)
+@item @code{@value{RPREFIX}PRIORITY} - tasks wait by priority
+@end itemize
+
+@c
+@c
+@c
+@page
+@subsection REGION_IDENT - Get ID of a region
+
+@cindex get ID of a region
+@cindex obtain ID of a region
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_region_ident
+@example
+rtems_status_code rtems_region_ident(
+ rtems_name name,
+ rtems_id *id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Region_Ident (
+ Name : in RTEMS.Name;
+ ID : out RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+
+@code{@value{RPREFIX}SUCCESSFUL} - region identified successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{id} is NULL@*
+@code{@value{RPREFIX}INVALID_NAME} - region name not found
+
+@subheading DESCRIPTION:
+
+This directive obtains the region id associated with
+the region name to be acquired. If the region name is not
+unique, then the region id will match one of the regions with
+that name. However, this region id is not guaranteed to
+correspond to the desired region. The region id is used to
+access this region in other region manager directives.
+
+@subheading NOTES:
+
+This directive will not cause the running task to be preempted.
+
+@c
+@c
+@c
+@page
+@subsection REGION_DELETE - Delete a region
+
+@cindex delete a region
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_region_delete
+@example
+rtems_status_code rtems_region_delete(
+ rtems_id id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Region_Delete (
+ ID : in RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+
+@code{@value{RPREFIX}SUCCESSFUL} - region deleted successfully@*
+@code{@value{RPREFIX}INVALID_ID} - invalid region id@*
+@code{@value{RPREFIX}RESOURCE_IN_USE} - segments still in use
+
+@subheading DESCRIPTION:
+
+This directive deletes the region specified by id.
+The region cannot be deleted if any of its segments are still
+allocated. The RNCB for the deleted region is reclaimed by
+RTEMS.
+
+@subheading NOTES:
+
+This directive will not cause the calling task to be preempted.
+
+The calling task does not have to be the task that
+created the region. Any local task that knows the region id can
+delete the region.
+
+@c
+@c
+@c
+@page
+@subsection REGION_EXTEND - Add memory to a region
+
+@cindex add memory to a region
+@cindex region, add memory
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_region_extend
+@example
+rtems_status_code rtems_region_extend(
+ rtems_id id,
+ void *starting_address,
+ rtems_unsigned32 length
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Region_Extend (
+ ID : in RTEMS.ID;
+ Starting_Address : in RTEMS.Address;
+ Length : in RTEMS.Unsigned32;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+
+@code{@value{RPREFIX}SUCCESSFUL} - region extended successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{starting_address} is NULL@*
+@code{@value{RPREFIX}INVALID_ID} - invalid region id@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - invalid address of area to add
+
+@subheading DESCRIPTION:
+
+This directive adds the memory which starts at
+starting_address for length bytes to the region specified by id.
+
+@subheading NOTES:
+
+This directive will not cause the calling task to be preempted.
+
+The calling task does not have to be the task that
+created the region. Any local task that knows the region id can
+extend the region.
+
+@c
+@c
+@c
+@page
+@subsection REGION_GET_SEGMENT - Get segment from a region
+
+@cindex get segment from region
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_region_get_segment
+@example
+rtems_status_code rtems_region_get_segment(
+ rtems_id id,
+ rtems_unsigned32 size,
+ rtems_option option_set,
+ rtems_interval timeout,
+ void **segment
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Region_Get_Segment (
+ ID : in RTEMS.ID;
+ Size : in RTEMS.Unsigned32;
+ Option_Set : in RTEMS.Option;
+ Timeout : in RTEMS.Interval;
+ Segment : out RTEMS.Address;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+
+@code{@value{RPREFIX}SUCCESSFUL} - segment obtained successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{segment} is NULL@*
+@code{@value{RPREFIX}INVALID_ID} - invalid region id@*
+@code{@value{RPREFIX}INVALID_SIZE} - request is for zero bytes or exceeds
+the size of maximum segment which is possible for this region@*
+@code{@value{RPREFIX}UNSATISFIED} - segment of requested size not available@*
+@code{@value{RPREFIX}TIMEOUT} - timed out waiting for segment@*
+@code{@value{RPREFIX}OBJECT_WAS_DELETED} - semaphore deleted while waiting
+
+@subheading DESCRIPTION:
+
+This directive obtains a variable size segment from
+the region specified by id. The address of the allocated
+segment is returned in segment. The @code{@value{RPREFIX}WAIT}
+and @code{@value{RPREFIX}NO_WAIT} components
+of the options parameter are used to specify whether the calling
+tasks wish to wait for a segment to become available or return
+immediately if no segment is available. For either option, if a
+sufficiently sized segment is available, then the segment is
+successfully acquired by returning immediately with the
+@code{@value{RPREFIX}SUCCESSFUL} status code.
+
+If the calling task chooses to return immediately and
+a segment large enough is not available, then an error code
+indicating this fact is returned. If the calling task chooses
+to wait for the segment and a segment large enough is not
+available, then the calling task is placed on the region's
+segment wait queue and blocked. If the region was created with
+the @code{@value{RPREFIX}PRIORITY} option, then the calling
+task is inserted into the
+wait queue according to its priority. However, if the region
+was created with the @code{@value{RPREFIX}FIFO} option, then the calling
+task is placed at the rear of the wait queue.
+
+The timeout parameter specifies the maximum interval
+that a task is willing to wait to obtain a segment. If timeout
+is set to @code{@value{RPREFIX}NO_TIMEOUT}, then the
+calling task will wait forever.
+
+@subheading NOTES:
+
+The actual length of the allocated segment may be
+larger than the requested size because a segment size is always
+a multiple of the region's page size.
+
+The following segment acquisition option constants
+are defined by RTEMS:
+
+@itemize @bullet
+@item @code{@value{RPREFIX}WAIT} - task will wait for semaphore (default)
+@item @code{@value{RPREFIX}NO_WAIT} - task should not wait
+@end itemize
+
+A clock tick is required to support the timeout functionality of
+this directive.
+
+@c
+@c
+@c
+@page
+@subsection REGION_RETURN_SEGMENT - Return segment to a region
+
+@cindex return segment to region
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_region_return_segment
+@example
+rtems_status_code rtems_region_return_segment(
+ rtems_id id,
+ void *segment
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Region_Return_Segment (
+ ID : in RTEMS.ID;
+ Segment : in RTEMS.Address;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+
+@code{@value{RPREFIX}SUCCESSFUL} - segment returned successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{segment} is NULL@*
+@code{@value{RPREFIX}INVALID_ID} - invalid region id@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - segment address not in region
+
+@subheading DESCRIPTION:
+
+This directive returns the segment specified by
+segment to the region specified by id. The returned segment is
+merged with its neighbors to form the largest possible segment.
+The first task on the wait queue is examined to determine if its
+segment request can now be satisfied. If so, it is given a
+segment and unblocked. This process is repeated until the first
+task's segment request cannot be satisfied.
+
+@subheading NOTES:
+
+This directive will cause the calling task to be
+preempted if one or more local tasks are waiting for a segment
+and the following conditions exist:
+
+@itemize @bullet
+@item a waiting task has a higher priority than the calling task
+
+@item the size of the segment required by the waiting task
+is less than or equal to the size of the segment returned.
+@end itemize
+
+@c
+@c
+@c
+@page
+@subsection REGION_GET_SEGMENT_SIZE - Obtain size of a segment
+
+@cindex get size of segment
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_region_get_segment_size
+@example
+rtems_status_code rtems_region_get_segment_size(
+ rtems_id id,
+ void *segment,
+ rtems_unsigned32 *size
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Region_Get_Segment_Size (
+ ID : in RTEMS.ID;
+ Segment : in RTEMS.Address;
+ Size : out RTEMS.Unsigned32;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+
+@code{@value{RPREFIX}SUCCESSFUL} - segment obtained successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{segment} is NULL@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{size} is NULL@*
+@code{@value{RPREFIX}INVALID_ID} - invalid region id@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - segment address not in region
+
+@subheading DESCRIPTION:
+
+This directive obtains the size in bytes of the specified segment.
+
+@subheading NOTES:
+
+The actual length of the allocated segment may be
+larger than the requested size because a segment size is always
+a multiple of the region's page size.
+
diff --git a/doc/user/rtemsarc.gif b/doc/user/rtemsarc.gif
new file mode 100644
index 0000000000..fea62ecb42
--- /dev/null
+++ b/doc/user/rtemsarc.gif
Binary files differ
diff --git a/doc/user/rtemsarc.png b/doc/user/rtemsarc.png
new file mode 100644
index 0000000000..13c3b30789
--- /dev/null
+++ b/doc/user/rtemsarc.png
Binary files differ
diff --git a/doc/user/rtemspie.eps b/doc/user/rtemspie.eps
new file mode 100644
index 0000000000..ad0eebbb5f
--- /dev/null
+++ b/doc/user/rtemspie.eps
@@ -0,0 +1,2164 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: (ImageMagick)
+%%Title: (rtemspie.eps)
+%%CreationDate: (Wed Oct 6 10:47:26 1999)
+%%BoundingBox: 0 213 495 508
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 1
+%%Pages: 0
+%%EndComments
+
+%%BeginDefaults
+%%PageOrientation: Portrait
+%%EndDefaults
+
+%%BeginProlog
+%
+% Display a color image. The image is displayed in color on
+% Postscript viewers or printers that support color, otherwise
+% it is displayed as grayscale.
+%
+/buffer 512 string def
+/byte 1 string def
+/color_packet 3 string def
+/pixels 768 string def
+
+/DirectClassPacket
+{
+ %
+ % Get a DirectClass packet.
+ %
+ % Parameters:
+ % red.
+ % green.
+ % blue.
+ % length: number of pixels minus one of this color (optional).
+ %
+ currentfile color_packet readhexstring pop pop
+ compression 0 gt
+ {
+ /number_pixels 3 def
+ }
+ {
+ currentfile byte readhexstring pop 0 get
+ /number_pixels exch 1 add 3 mul def
+ } ifelse
+ 0 3 number_pixels 1 sub
+ {
+ pixels exch color_packet putinterval
+ } for
+ pixels 0 number_pixels getinterval
+} bind def
+
+/DirectClassImage
+{
+ %
+ % Display a DirectClass image.
+ %
+ systemdict /colorimage known
+ {
+ columns rows 8
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { DirectClassPacket } false 3 colorimage
+ }
+ {
+ %
+ % No colorimage operator; convert to grayscale.
+ %
+ columns rows 8
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { GrayDirectClassPacket } image
+ } ifelse
+} bind def
+
+/GrayDirectClassPacket
+{
+ %
+ % Get a DirectClass packet; convert to grayscale.
+ %
+ % Parameters:
+ % red
+ % green
+ % blue
+ % length: number of pixels minus one of this color (optional).
+ %
+ currentfile color_packet readhexstring pop pop
+ color_packet 0 get 0.299 mul
+ color_packet 1 get 0.587 mul add
+ color_packet 2 get 0.114 mul add
+ cvi
+ /gray_packet exch def
+ compression 0 gt
+ {
+ /number_pixels 1 def
+ }
+ {
+ currentfile byte readhexstring pop 0 get
+ /number_pixels exch 1 add def
+ } ifelse
+ 0 1 number_pixels 1 sub
+ {
+ pixels exch gray_packet put
+ } for
+ pixels 0 number_pixels getinterval
+} bind def
+
+/GrayPseudoClassPacket
+{
+ %
+ % Get a PseudoClass packet; convert to grayscale.
+ %
+ % Parameters:
+ % index: index into the colormap.
+ % length: number of pixels minus one of this color (optional).
+ %
+ currentfile byte readhexstring pop 0 get
+ /offset exch 3 mul def
+ /color_packet colormap offset 3 getinterval def
+ color_packet 0 get 0.299 mul
+ color_packet 1 get 0.587 mul add
+ color_packet 2 get 0.114 mul add
+ cvi
+ /gray_packet exch def
+ compression 0 gt
+ {
+ /number_pixels 1 def
+ }
+ {
+ currentfile byte readhexstring pop 0 get
+ /number_pixels exch 1 add def
+ } ifelse
+ 0 1 number_pixels 1 sub
+ {
+ pixels exch gray_packet put
+ } for
+ pixels 0 number_pixels getinterval
+} bind def
+
+/PseudoClassPacket
+{
+ %
+ % Get a PseudoClass packet.
+ %
+ % Parameters:
+ % index: index into the colormap.
+ % length: number of pixels minus one of this color (optional).
+ %
+ currentfile byte readhexstring pop 0 get
+ /offset exch 3 mul def
+ /color_packet colormap offset 3 getinterval def
+ compression 0 gt
+ {
+ /number_pixels 3 def
+ }
+ {
+ currentfile byte readhexstring pop 0 get
+ /number_pixels exch 1 add 3 mul def
+ } ifelse
+ 0 3 number_pixels 1 sub
+ {
+ pixels exch color_packet putinterval
+ } for
+ pixels 0 number_pixels getinterval
+} bind def
+
+/PseudoClassImage
+{
+ %
+ % Display a PseudoClass image.
+ %
+ % Parameters:
+ % class: 0-PseudoClass or 1-Grayscale.
+ %
+ currentfile buffer readline pop
+ token pop /class exch def pop
+ class 0 gt
+ {
+ currentfile buffer readline pop
+ token pop /depth exch def pop
+ /grays columns 8 add depth sub depth mul 8 idiv string def
+ columns rows depth
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { currentfile grays readhexstring pop } image
+ }
+ {
+ %
+ % Parameters:
+ % colors: number of colors in the colormap.
+ % colormap: red, green, blue color packets.
+ %
+ currentfile buffer readline pop
+ token pop /colors exch def pop
+ /colors colors 3 mul def
+ /colormap colors string def
+ currentfile colormap readhexstring pop pop
+ systemdict /colorimage known
+ {
+ columns rows 8
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { PseudoClassPacket } false 3 colorimage
+ }
+ {
+ %
+ % No colorimage operator; convert to grayscale.
+ %
+ columns rows 8
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { GrayPseudoClassPacket } image
+ } ifelse
+ } ifelse
+} bind def
+
+/DisplayImage
+{
+ %
+ % Display a DirectClass or PseudoClass image.
+ %
+ % Parameters:
+ % x & y translation.
+ % x & y scale.
+ % label pointsize.
+ % image label.
+ % image columns & rows.
+ % class: 0-DirectClass or 1-PseudoClass.
+ % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
+ % hex color packets.
+ %
+ gsave
+ currentfile buffer readline pop
+ token pop /x exch def
+ token pop /y exch def pop
+ x y translate
+ currentfile buffer readline pop
+ token pop /x exch def
+ token pop /y exch def pop
+ currentfile buffer readline pop
+ token pop /pointsize exch def pop
+ /Helvetica findfont pointsize scalefont setfont
+ x y scale
+ currentfile buffer readline pop
+ token pop /columns exch def
+ token pop /rows exch def pop
+ currentfile buffer readline pop
+ token pop /class exch def pop
+ currentfile buffer readline pop
+ token pop /compression exch def pop
+ class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
+ grestore
+} bind def
+%%EndProlog
+%%Page: 1 1
+%%PageBoundingBox: 0 213 495 508
+userdict begin
+%%BeginData:
+DisplayImage
+0 213
+495.101124 295.280899
+12
+1787 1066
+1
+0
+0
+256
+000000
+000033
+000066
+000099
+0000cc
+0000ff
+003300
+003333
+003366
+003399
+0033cc
+0033ff
+006600
+006633
+006666
+006699
+0066cc
+0066ff
+009900
+009933
+009966
+009999
+0099cc
+0099ff
+00cc00
+00cc33
+00cc66
+00cc99
+00cccc
+00ccff
+00ff00
+00ff33
+00ff66
+00ff99
+00ffcc
+00ffff
+330000
+330033
+330066
+330099
+3300cc
+3300ff
+333300
+333333
+333366
+333399
+3333cc
+3333ff
+336600
+336633
+336666
+336699
+3366cc
+3366ff
+339900
+339933
+339966
+339999
+3399cc
+3399ff
+33cc00
+33cc33
+33cc66
+33cc99
+33cccc
+33ccff
+33ff00
+33ff33
+33ff66
+33ff99
+33ffcc
+33ffff
+660000
+660033
+660066
+660099
+6600cc
+6600ff
+663300
+663333
+663366
+663399
+6633cc
+6633ff
+666600
+666633
+666666
+666699
+6666cc
+6666ff
+669900
+669933
+669966
+669999
+6699cc
+6699ff
+66cc00
+66cc33
+66cc66
+66cc99
+66cccc
+66ccff
+66ff00
+66ff33
+66ff66
+66ff99
+66ffcc
+66ffff
+990000
+990033
+990066
+990099
+9900cc
+9900ff
+993300
+993333
+993366
+993399
+9933cc
+9933ff
+996600
+996633
+996666
+996699
+9966cc
+9966ff
+999900
+999933
+999966
+999999
+9999cc
+9999ff
+99cc00
+99cc33
+99cc66
+99cc99
+99cccc
+99ccff
+99ff00
+99ff33
+99ff66
+99ff99
+99ffcc
+99ffff
+cc0000
+cc0033
+cc0066
+cc0099
+cc00cc
+cc00ff
+cc3300
+cc3333
+cc3366
+cc3399
+cc33cc
+cc33ff
+cc6600
+cc6633
+cc6666
+cc6699
+cc66cc
+cc66ff
+cc9900
+cc9933
+cc9966
+cc9999
+cc99cc
+cc99ff
+cccc00
+cccc33
+cccc66
+cccc99
+cccccc
+ccccff
+ccff00
+ccff33
+ccff66
+ccff99
+ccffcc
+ccffff
+ff0000
+ff0033
+ff0066
+ff0099
+ff00cc
+ff00ff
+ff3300
+ff3333
+ff3366
+ff3399
+ff33cc
+ff33ff
+ff6600
+ff6633
+ff6666
+ff6699
+ff66cc
+ff66ff
+ff9900
+ff9933
+ff9966
+ff9999
+ff99cc
+ff99ff
+ffcc00
+ffcc33
+ffcc66
+ffcc99
+ffcccc
+ffccff
+ffff00
+ffff33
+ffff66
+ffff99
+ffffcc
+ffffff
+000000
+0d0d0d
+1a1a1a
+282828
+353535
+434343
+505050
+5d5d5d
+6b6b6b
+787878
+868686
+939393
+a1a1a1
+aeaeae
+bbbbbb
+c9c9c9
+d6d6d6
+e4e4e4
+f1f1f1
+ffffff
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+000000
+d7ffd7ffd7ffd7ffd7ffd7ffd7ffd7ffd7ffd7ffd75b002dd7ffd7ffd7ffd7ffd7ffd7ff
+d7aa0071d7ffd7ffd7ffd7ffd7ffd7ffd772009dd7ffd7ffd7ffd7ffd7ffd7ffd74900c3
+d7ffd7ffd7ffd7ffd7ffd7ffd72700e1d7ffd7ffd7ffd7ffd7ffd7ffd70a00fdd7ffd7ff
+d7ffd7ffd7ffd7ef00ff0017d7ffd7ffd7ffd7ffd7ffd7d700ff002dd7ffd7ffd7ffd7ff
+d7ffd7c200ff0041d7ffd7ffd7ffd7ffd7ffd7ad0072d7710072d7ffd7ffd7ffd7ffd7ff
+d7990065d79d0065d7ffd7ffd7ffd7ffd7ffd789005bd7bf005bd7ffd7ffd7ffd7ffd7ff
+d77b0057d7d50057d7ffd7ffd7ffd7ffd7ffd76c0055d7e90055d7ffd7ffd7ffd7ffd7ff
+d75d0051d7780000d7850051d7ffd7ffd7ffd7ffd7ffd74f004dd7830000d790004dd7ff
+d7ffd7ffd7ffd7ffd7410049d78e0000d79b0049d7ffd7ffd7ffd7ffd7ffd7340044d799
+0000d7a60044d7ffd7ffd7ffd7ffd7ffd728003fd7ffd757003fd7ffd7ffd7ffd7ffd7ff
+d71c003cd7ffd769003cd7ffd7ffd7ffd7ffd7ffd710003bd7ffd777003bd7ffd7ffd7ff
+d7ffd7ffd704003ad7ffd785003ad7ffd7ffd7ffd7ffd7f80039d7ffd7930039d7ffd7ff
+d7ffd7ffd7ed0037d7c90000d7d60037d7ffd7ffd7ffd7ffd7e30035d7d00000d7dd0035
+d7ffd7ffd7ffd7ffd7d90033d7d70000d7e40033d7ffd7ffd7ffd7ffd7cf0031d7de0000
+d7eb0031d7ffd7ffd7ffd7ffd7c40030d7ffd7d90030d7ffd7ffd7ffd7ffd7b9002ed7ff
+d7e7002ed7ffd7ffd7ffd7ffd7af002cd7ffd7f5002cd7ffd7ffd7ffd7ffd7a5002ad7ff
+d7ffd703002ad7ffd7ffd7ffd7ffd79b0029d7ffd7ffd70f0029d7ffd7ffd7ffd7ffd792
+0029d7ffd7040000d7ffd7110029d7ffd7ffd7ffd7ffd7890029d7ffd7090000d7ffd716
+0029d7ffd7ffd7ffd7ffd7800029d7ffd70d0000d7ffd71a0029d7ffd7ffd7ffd7ffd777
+0029d7ffd7120000d7ffd71f0029d7ffd7ffd7ffd7ffd76e0028d7ffd7ffd73d0028d7ff
+d7ffd7ffd7ffd7660028d7ffd7ffd7450028d7ffd7ffd7ffd7ffd75d0028d7ffd7ffd74f
+0028d7ffd7ffd7ffd7ffd7540028d7ffd7ffd7570028d7ffd7ffd7ffd7ffd74b0028d7ff
+d7ffd7610027d7ffd7ffd7ffd7ffd7430028d7ffd72d0000d7ffd73a0027d7ffd7ffd7ff
+d7ffd73b0027d7ffd7320000d7ffd73e0027d7ffd7ffd7ffd7ffd7330027d7ffd7360000
+d7ffd7430026d7ffd7ffd7ffd7ffd72b0026d7ffd73b0000d7ffd7470026d7ffd7ffd7ff
+d7ffd7230026d7ffd7ffd78c0026d7ffd7ffd7ffd7ffd71b0026d7ffd7ffd7950025d7ff
+d7ffd7ffd7ffd7130025d7ffd7ffd79e0025d7ffd7ffd7ffd7ffd70b0025d7ffd7ffd79c
+0000d7080025d7ffd7ffd7ffd7ffd7030025d7ffd7ffd7a00000d70d0024d7ffd7ffd7ff
+d7fc0024d7ffd7540000d7ffd74d0000d7120023d7ffd7ffd7ffd7f50024d7010000d7ff
+d7550000d7ffd74c0000d7170023d7ffd7ffd7ffd7ee0023d7060000d7ffd7540000d7ff
+d7690022d7ffd7ffd7ffd7e70023d70a0000d7ffd7540000d7ffd76d0022d7ffd7ffd7ff
+d7e00022d70f0000d7ffd7ffd7c60021d7ffd7ffd7ffd7d90022d7ffd7ffd7b30000d72a
+0021d7ffd7ffd7ffd7d20021d7ffd7ffd7b60000d72f0021d7ffd7ffd7ffd7cb0020d7ff
+d7ffd7ba0000d7330020d7ffd7ffd7ffd7c40020d7230000d7ffd7ffd7980000d7380020
+d7ffd7ffd7ffd7bd0020d7260000d7ffd74f0000d7ffd7840020d7ffd7ffd7ffd7b60020
+d72b0000d7ffd74e0000d7ffd7880020d7ffd7ffd7ffd7af0020d72f0000d7ffd74d0000
+d7ffd78b0020d7ffd7ffd7ffd7a9001fd7ffd7820000d7ffd78e0020d7ffd7ffd7ffd7a3
+001fd7ffd7ffd7ca0000d74d001fd7ffd7ffd7ffd79d001ed7ffd7ffd7ce0000d750001f
+d7ffd7ffd7ffd797001ed7ffd7ffd7d00000d754001fd7ffd7ffd7ffd791001ed7430000
+d7ffd7ffd78d0000d759001ed7ffd7ffd7ffd78a001ed7470000d7ffd7ffd7eb001fd7ff
+d7ffd7ffd783001ed74b0000d7ffd7490000d7ffd7a2001fd7ffd7ffd7ffd77d001dd750
+0000d7ffd7480000d7ffd7a6001ed7ffd7ffd7ffd777001dd7ffd79d0000d7ffd7a9001e
+d7ffd7ffd7ffd771001dd7ffd7a00000d7ffd73e0000d76c001ed7ffd7ffd7ffd76b001d
+d7ffd7ffd7e30000d76f001ed7ffd7ffd7ffd765001dd7ffd7ffd7e50000d773001ed7ff
+d7ffd7ffd75f001dd7630000d7ffd7ffd7820000d777001ed7ffd7ffd7ffd75a001cd766
+0000d7ffd7ffd7fe001dd7ffd7ffd7ffd755001cd76a0000d7ffd7ffd7ffd701001cd7ff
+d7ffd7ffd74f001cd76e0000d7ffd7420000d7ffd7bf001cd7ffd7ffd7ffd749001cd7ff
+d7b50000d7ffd7c2001cd7ffd7ffd7ffd743001cd7e40001d7170001d71f0002d7080001
+d73f0002d7460000d7ffd7390000d78a001cd7ffd7ffd7ffd73e001bd7e60004d7130005
+d71b0004d7070004d73c0004d7450000d7ffd7380000d78e001bd7ffd7ffd7ffd739001b
+d77d0000d740000dd71a0005d7130005d7190006d7060005d73b0005d7ffd77f0000d791
+001bd7ffd7ffd7ffd733001bd7800000d7420008d71d0005d7130005d7180007d7060005
+d73b0005d7ffd77e0000d795001bd7ffd7ffd7ffd72d001bd7840000d7430006d71d0005
+d7090001d7070005d7180000d7010004d7060005d7320000d7080004d7ffd7ffd718001b
+d7ffd7ffd7ffd728001bd7870000d7430004d7200002d70a0001d7080003d71c0004d707
+0003d7330000d7090003d7ffd7ffd71a001bd7ffd7ffd7ffd723001bd7cf0004d72e0001
+d7290004d73f0000d7ffd7ffd72b001bd7ffd7ffd7ffd71d001bd7d20004d72d0002d729
+0004d73e0001d7530000d7ffd7d9001bd7ffd7ffd7ffd718001ad7d50004d72d0002d729
+0004d73d0002d7530000d7ffd7330000d7a7001ad7ffd7ffd7ffd7140019d7d80004d72c
+0003d7290004d73c0003d7530000d7ffd7320000d7ab0019d7ffd7ffd7ffd7100019d799
+0000d73f0004d72a0005d7290004d73b0004d7530000d7a40002d7890000d7ae0019d7ff
+d7ffd7ffd70b0019d79c0000d73f0004d7090002d7020004d70c0002d7050009d7060002
+d7080007d70a0004d7090002d7050011d7050006d708000ad7050002d70b0006d70c0002
+d7030004d7bd0004d7ffd73c0019d7ffd7ffd7ffd7060018d7a00000d73e0004d7060005
+d7010007d7070005d703000bd7030005d707000ad7080004d7060005d7050011d704000a
+d703000cd7020005d709000ad7070005d7010008d77a0019d7240006d7ffd73f0018d7ff
+d7ffd7ffd7020017d7e30004d7040007d7000009d7040007d703000bd7010007d7050005
+d7010005d7070004d7040007d7050010d7030004d7020005d702000cd7000007d7080004
+d7020004d7040007d7000009d77a0019d7230007d7ffd7420017d7ffd7ffd7fd0018d7e5
+0004d7040012d7040007d7060004d7050007d7050003d7040005d7060004d7040007d705
+0002d7070005d7030003d7040004d7060003d7060006d7070004d7030005d7040012d779
+0004d7040005d7050003d7240000d7000004d7ffd7440018d7ffd7ffd7f80017d7e80004
+d7070007d7020005d7060004d7060004d7080004d7040004d7050004d7060004d7070004
+d7050001d7070005d7030003d7060003d7060003d7080004d7060004d7050005d7050007
+d7030005d7780002d7060005d7060002d7260004d7860000d7bf0017d7ffd7ffd7f40016
+d7eb0004d7070005d7050004d7060004d7060004d7080004d7040004d7050004d7060004
+d7070004d7050000d7080004d7040004d7050003d7060003d7090003d7060003d7070004
+d7050005d7060004d7150000d7610001d7070005d7070001d7270003d7850000d7c30016
+d7ffd7ffd7f00016d7b10000d73a0004d7070004d7060004d7060004d7060004d7080004
+d7040004d7060003d7060004d7070004d7050000d7070004d7050004d7050004d7050003
+d7090003d7060003d7070004d7050004d7070004d7150000d7610001d7070005d7070001
+d7270003d7850000d7c50016d7ffd7ffd7eb0016d7b50000d7390004d7070004d7070003
+d7060004d7060004d7080004d7040004d7060003d7060004d7070004d70d0005d7050003
+d7060004d7050003d7090003d7050004d7080004d7040004d7070004d7150000d7610001
+d7070005d7080000d7270003d7840000d7c90016d7ffd7ffd7e60016d7b80000d7380004
+d7070004d7070003d7060004d7060004d7080004d70f0004d7060004d7070004d70c0005
+d7100005d7050003d7090003d7040005d7080004d7040004d7070004d7150000d76b0005
+d7310003d7ffd7510016d7ffd7ffd7e20016d7f40004d7070004d7070003d7060004d706
+0004d7080004d70c0007d7060004d7070004d70c0004d70f0007d7050003d7090003d704
+0005d7080005d7030004d7070004d7820005d7310003d7ffd7530016d7ffd7ffd7de0015
+d7f70004d7070004d7070003d7060004d7060004d7080004d7090005d7000003d7060004
+d7070004d70b0004d70c0005d7000004d7050003d7090003d7040005d7080005d7030004
+d7070004d7820005d70c0007d70b0006d7000001d7060003d7040009d7ffd7470015d7ff
+d7ffd7d90016d7f90004d7070004d7070003d7060004d7060004d7080004d7080003d703
+0003d7060004d7070004d70a0005d70b0004d7020004d7050003d7090003d7040005d708
+0005d7030004d7070004d7820005d70b000ad708000ad7060003d7040009d7ffd7490016
+d7ffd7ffd7d40015d7fc0004d7070004d7070003d7060004d7060004d7080004d7070003
+d7040003d7060004d7070004d7090005d70b0003d7040004d7050003d7090003d7040005
+d7090004d7030004d7070004d7820005d70a000cd706000bd7060003d7050004d7750000
+d7d90015d7ffd7ffd7d00015d7c70000d7350004d7070004d7070003d7060004d7060004
+d7080004d7050004d7050003d7060004d7070004d7080005d70b0003d7050004d7050003
+d7090003d7040005d7090004d7030004d7070004d7820005d7090004d7030005d7050002
+d7040003d7060003d7050002d7770000d7db0015d7ffd7ffd7cc0014d7ca0000d7350004
+d7070004d7070003d7060004d7060004d7080004d7040004d7060003d7060004d7070004
+d7080004d70b0003d7060004d7050003d7090003d7040005d7090004d7030004d7070004
+d7150000d76b0005d7080004d7050004d7040003d7050002d7060003d7040002d7770000
+d7df0014d7ffd7ffd7c70015d7cd0000d7340004d7070004d7070003d7060004d7060004
+d7080004d7040003d7070003d7060004d7070004d7070005d7070001d7000004d7060004
+d7050003d7090003d7050005d7080003d7040004d7070004d7150000d76b0005d7080004
+d7050004d7040003d7060001d7060003d7030002d7770000d7e20015d7ffd7ffd7c20015
+d7d00000d7330004d7070004d7070003d7060004d7060004d7080004d7040003d7070003
+d7060004d7070004d7060005d7080001d7000004d7060004d7050003d7090003d7050005
+d7070004d7040004d7070004d7150000d76b0005d7080004d7060003d7040003d7060001
+d7060003d7020001d7ffd75f0015d7ffd7ffd7be0014d7ffd7080004d7070004d7070003
+d7060004d7060004d7080004d7040004d7050004d7060004d7070004d7050005d7090001
+d7000004d7060004d7050003d7090003d7060004d7070003d7050004d7070004d7150000
+d76b0005d7080004d7060003d7040004d7050001d7060003d7010001d7ffd7630014d7ff
+d7ffd7b90015d7ffd70a0004d7070004d7070003d7060004d7060004d7010003d7020004
+d7040005d7020006d7010001d7020004d7070004d7050004d7090002d7000005d7020007
+d7000001d7020004d7010002d7030003d7070003d7070003d7050004d7070004d7820005
+d70a0001d7060004d7040006d70c0003d7000001d7ffd7660015d7ffd7ffd7b40014d7ff
+d70c0006d7060004d7060005d7050005d7050009d7020005d704000ad7000007d7020004
+d7070005d7030005d7070004d7000013d7020009d7020005d7060005d7040003d7060005
+d7060004d7820005d7100007d7040008d70a0007d7ffd7680014d7ffd7ffd7b00014d7dd
+0000d72b000dd700000ad7010009d700000ad7040007d701000ad7010009d7010006d700
+000ad701000ad7000013d7010008d7010006d7030007d701000ad705000bd705000ad701
+000ad77f0005d70e0004d7000003d7060008d7080008d7760000d7f10014d7ffd7ffd7ac
+0014d7e00000d72a000dd700000ad7010009d700000ad7040006d702000ad7030006d702
+0004d702000ad701000ad7000013d7020006d7030004d7050006d701000ad7070008d706
+000ad701000ad77f0005d70c0005d7010003d7080007d7070009d7750000d7f30014d7ff
+d7ffd7a70015d7e20000d7640001d7140002d7060001d7360002d7060000d70a0001d71b
+0001d7a10005d70b0003d7040003d7090007d7060009d7740000d7f60015d7ffd7ffd7a2
+0014d7e60000d7ffd7280000d76b0005d7090004d7050003d70b0005d7060003d7000005
+d7720000d7fa0014d7ffd7ffd79e0014d7ffd7ffd7120000d76b0005d7080004d7060003
+d70d0004d7050003d7010005d7ffd76f0014d7ffd7ffd79a0014d7ffd7ffd7140000d76b
+0005d7080003d7070003d7040000d7070004d7050003d7020005d7ffd7700014d7ffd7ff
+d7950014d7ffd7ffd7170000d76b0005d7080003d7070003d7040001d7070004d7040003
+d7020005d7ffd7730014d7ffd7ffd7900014d7f30000d7ffd7910005d7080003d7060004
+d7040001d7080003d7040003d7030005d7ffd7740014d7ffd7ffd78c0014d7f50000d7ff
+d7910005d7080005d7020006d7010001d7000002d7060003d7040004d7040005d76a0000
+d7ffd7090014d7ffd7ffd7880014d7f80000d7ffd7900005d7080013d7000003d7050002
+d7050004d7050005d7690000d7ffd70b0014d7ffd7ffd7840013d7fc0000d7ffd78b000d
+d704000ad7000006d701000bd703000ad7010009d7650000d7ffd70f0013d7ffd7ffd780
+0013d7ffd7ffd7220000d767000dd7060006d7020004d703000ad704000ad7010009d7ff
+d7780013d7ffd7ffd77c0013d7ffd7ffd7240000d77d0002d7060001d7050000d7040002
+d7ffd7980013d7ffd7ffd7780013d7ffd7ffd7260000d7ffd7ffd7330013d7ffd7ffd774
+0012d7ffd7080000d7ffd71f0000d7ffd7ffd7360012d7ffd7ffd7700012d7ffd70b0000
+d7ffd71e0000d7ffd7180000d77d0002d7340002d7650012d7ffd7ffd76c0012d7ffd70d
+0000d7ffd7ffd7380000d7660007d7030001d7060004d7320004d7670012d7ffd7ffd768
+0012d7ffd7100000d7ffd7ffd7360000d764000cd7010001d7040006d7300006d7690012
+d7ffd7ffd7640012d7ffd7ffd7ffd7490000d7630006d7020008d7030007d72f0007d76b
+0012d7ffd7ffd7600012d7ffd7ffd7ffd7af0004d7080005d7030000d7010004d72f0000
+d7000005d76d0012d7ffd7ffd75c0012d7ffd7ffd7350000d7ffd7790004d70b0003d706
+0004d7320004d76f0012d7ffd7ffd7580012d7ffd7ffd7370000d7ffd7780004d70d0002
+d7060004d7320004d7710012d7ffd7ffd7550011d7ffd71e0000d7ffd7190000d7ffd777
+0004d70f0002d7050004d7320004d7730011d7ffd7ffd7520011d7ffd7210000d7ffd718
+0000d7ffd7130000d7620004d70f0002d7050004d7320004d7750011d7ffd7ffd74e0011
+d7ffd7240000d7ffd7170000d7ffd7120000d7620005d7100001d7050004d7320004d777
+0011d7ffd7ffd74a0011d7ffd7ffd7ffd7530000d7620005d7100001d7050004d7320004
+d7790011d7ffd7ffd7460011d7ffd7ffd7ffd7540000d7620005d7110001d7050004d70b
+0006d70f0006d7080004d7030009d76d0011d7ffd7ffd7420011d7ffd7ffd7ffd7ba0005
+d7190004d709000ad70c0008d7070004d7030009d76f0011d7ffd7ffd73e0011d7ffd7ff
+d7ffd7bc0004d71a0004d708000cd709000cd7050004d7050004d7740011d7ffd7ffd73a
+0011d7ffd7310000d7ffd7140000d7ffd7750004d71a0004d7070004d7030004d7080002
+d7040005d7050004d7040003d7780011d7ffd7ffd7360012d7ffd7330000d7ffd7130000
+d7ffd7740005d71a0004d7060004d7050004d7070002d7050005d7040004d7040001d77b
+0012d7ffd7ffd7320012d7ffd7360000d7ffd7120000d7ffd70d0000d7650005d71a0004
+d7060003d7070004d7050003d7050005d7040004d7030001d77e0012d7ffd7ffd72e0012
+d7ffd7ffd74c0000d7ffd70d0000d7650005d71a0004d7060003d7070004d7050002d706
+0005d7040004d7020001d7810012d7ffd7ffd72a0012d7ffd7ffd74e0000d7ffd70c0000
+d7660005d71a0004d7050004d7080004d7030003d7080002d7050004d7010001d7840012
+d7ffd7ffd7260012d7ffd7ffd7ffd75d0000d7670005d71a0004d7040005d7080004d703
+0003d7110004d7000001d7870012d7ffd7ffd7220012d7ffd7ffd7ffd7c80005d71a0004
+d7040005d7080005d7010004d7110008d7880012d7ffd7ffd71e0012d7ffd7430000d7ff
+d7ffd7850005d71a0004d7040005d7080005d7010004d7110008d78a0012d7ffd7ffd71a
+0012d7ffd7460000d7ffd7ffd7850004d71a0004d7040005d7080005d7010004d7110009
+d78b0012d7ffd7ffd7170012d7ffd7470000d7ffd70e0000d7ffd7080000d76b0005d719
+0004d7040005d7090004d7010004d711000ad78b0012d7ffd7ffd7140012d7ffd74a0000
+d7ffd70d0000d7ffd7080000d76b0006d7110000d7050004d7040005d7090004d7010004
+d70b0000d7040004d7000005d78c0012d7ffd7ffd7100012d7ffd7ffd75b0000d7ffd707
+0000d76d0005d7110001d7040004d7040005d7090004d7010005d7090001d7040004d701
+0004d78e0012d7ffd7ffd70d0011d7ffd7ffd75d0000d7ffd7060000d76e0005d7100002
+d7040004d7050004d7090003d7030004d7090001d7040004d7020004d78f0011d7ffd7ff
+d70a0011d7ffd7ffd75f0000d7ffd7770005d70e0002d7050004d7050004d7080004d703
+0004d7080002d7040004d7020005d7900011d7ffd7ffd7060014d7ffd7530000d7ffd7ff
+d7820006d70c0001d7070004d7060004d7070003d7050005d7050002d7050004d7030005
+d7910010d7ffd7ffd7040016d7ffd7520000d7ffd7ffd7830007d7090002d7070004d706
+0004d7070003d705000ed7050004d7040005d78d0000d7030010d7ffd7ffd700001ad7ff
+d7510000d7ffd7ffd70d0000d7740009d7030004d7080005d7060005d7040003d707000c
+d7050005d7050005d78b0000d7060010d7ffd7fc001ed7ffd7500000d7ffd7ffd70b0000
+d778000ed706000ad705000bd70a000ad704000ad700000ad7910010d7ffd7fa0021d7b4
+0002d7ffd79f0000d7ffd7020000d77a000ad708000ad7070008d70c0008d705000ad700
+000ad7930010d7ffd7f60010d7000012d75e0017d7390005d70e0018d7ffd7770000d7ff
+d7010000d77e0004d7220001d7110003d7a30000d710000fd7ffd7f30011d7020013d75c
+0017d7370007d70e0018d7ffd7770000d7ffd7ffd7630001d7120010d7ffd7f00010d706
+0013d75d0014d7370007d7120014d7710000d7ffd7040000d7ffd7ffd7620000d7160010
+d7ffd7ec0011d7090013d75c0005d7090003d71b0000d71d0004d7130004d70a0003d772
+0000d7ffd7030000d7ffd7ffd77b0010d7ffd7e90011d70d0012d75b0005d70a0002d71b
+0000d71d0004d7130004d70b0002d7720000d7ffd7ffd7020000d7ffd77e0010d7ffd7e6
+0010d7100013d7590005d70a0002d71a0001d71d0004d7130004d70c0001d7730000d7ff
+d7ffd7010000d7ffd75e0000d720000fd7ffd7e30011d7130013d7570005d70b0001d719
+0002d71d0004d7130004d70c0001d7ffd7ffd7750000d7ffd75d0001d7220010d7ffd7df
+0011d7170013d7550005d70b0001d7190002d71d0004d7130004d70c0001d7ffd7ffd774
+0000d7ffd75d0000d7260010d7ffd7dc0011d71a0012d7540005d7260003d71d0004d713
+0004d7ffd7860000d7ffd7ffd7830010d7ffd7d90011d71d0013d7520005d7150004d709
+0005d70c0004d70b0004d7130004d7160002d7030001d7050002d7030001d70a0002d70f
+0001d7030001d7ffd7310000d7ffd7ffd7850010d7ffd7d60010d7210013d7500005d707
+0001d7090009d705000bd704000ad7080004d7130004d7090001d7080004d7010004d702
+0004d7020003d7070008d7090003d7020004d72f0000d7fe0000d7ffd7ffd7540001d730
+000fd7ffd7d30011d7240013d74e0005d7070001d708000cd702000cd703000cd7070004
+d7130004d7090001d7060006d700000dd7000006d704000ad7070005d7010005d7300000
+d7fd0000d7ffd7ffd7530000d7330010d7ffd7d00010d7280012d74d0005d7070001d707
+0004d7020005d7060003d7070004d7030004d7070004d7130004d7090001d705001ed702
+0004d7030005d7040006d7000007d7300000d7fc0000d7f80000d7ffd7580000d7360010
+d7ffd7cc0011d72a0013d74b0005d7060002d7070002d7060003d7060003d7070003d705
+0004d7060004d7130004d7080002d7050000d700000dd701000cd7020003d7060004d703
+0000d700000cd7ffd7ffd7280000d7ffd7920010d7ffd7ca0010d72e0013d749000fd706
+0003d7060003d7060003d7060004d7050004d7060004d7130010d7080005d7010003d702
+0006d7010003d7020003d7060004d7060005d7010003d7ffd7ffd7270000d7ffd7950010
+d7ffd7c60010d7320013d747000fd7060004d7050004d7050003d7060004d7050004d706
+0004d7130010d7080004d7040000d7030004d7040001d7020003d7080004d7050004d704
+0000d7ffd7ffd7ffd77f0001d73f000fd7ffd7c40010d7350012d7460005d7040004d706
+0003d7060004d7050003d7060004d7050004d7060004d7130004d7060004d7080004d709
+0004d7080004d7080005d7040003d7ffd7ffd7ffd7850000d7420010d7ffd7c00010d738
+0013d7440005d7060002d7070002d7050005d7050003d7070002d7050005d7060004d713
+0004d7080002d7080004d7090004d7080004d7080005d7040003d73c0000d7f90000d7ff
+d7ffd74b0000d745000fd7ffd7be0010d73b0013d7420005d7070001d70e0007d7050003
+d70e0007d7060004d7130004d7090001d7080004d7090004d7080004d7080005d7040003
+d73d0000d7f80000d7ffd7ffd7930010d7ffd7ba0010d73f0013d7400005d7070001d70c
+0009d7050003d70c0009d7060004d7130004d7090001d7080004d7090004d7070005d709
+0004d7040003d73e0000d7f70000d7f20000d7ffd7520000d74d000fd7ffd7b8000fd743
+0012d73f0005d7070001d70a0004d7010004d7050003d70b0003d7010004d7060004d713
+0004d7090001d7080004d7090004d7070005d7090004d7040003d7ffd7370000d7f10000
+d7ffd7510001d750000fd7ffd7b40010d7460012d73d0005d7120004d7030004d7050003
+d7080005d7020004d7060004d7130004d7140004d7090004d7070005d7090004d7040003
+d7ffd7370000d7f00000d7ffd7510000d7530010d7ffd7b1000fd7490013d73b0005d711
+0003d7050004d7050003d7080003d7040004d7060004d7130004d7140004d7090004d707
+0005d7090004d7040003d7ffd7ffd7ffd7d3000fd7ffd7ae0010d74c0013d7390005d710
+0004d7050004d7050003d7060004d7050004d7060004d7130004d70f0001d7020004d709
+0004d7080004d7090004d7040003d7ffd7ffd7ffd7d40010d7ffd7ab000fd7500012d738
+0005d7100003d7060004d7050003d7060003d7060004d7060004d7130004d70e0002d702
+0004d7090004d7080004d7090004d7040003d7420000d7ffd7ffd7ffd7330000d75d000f
+d7ffd7a80010d7530012d7360005d70f0004d7060004d7050003d7050004d7060004d706
+0004d7130004d70d0002d7030004d7090004d7080005d7080004d7040003d7420000d7ff
+d7ffd7ffd7310001d75f0010d7ffd7a5000fd7560013d7340005d70f0004d7060004d705
+0004d7040004d7060004d7060004d7130004d70c0003d7030004d7090004d7090004d708
+0003d7050003d7430000d7f20000d7ed0000d7ffd74c0000d763000fd7ffd7a20010d759
+0013d7320005d70f0005d7030006d7010000d7020004d7010008d7040005d7010001d702
+0004d7130004d70c0002d7040004d7090004d7090004d7070003d7060004d7ffd7360000
+d7ed0000d7ffd7b20010d7ffd79f000fd75d0012d7310005d70f0013d7020009d7000013
+d7020004d7120005d70b0003d7040004d7090004d70a0005d7050003d7060004d7ffd736
+0000d7ec0000d7ffd7b5000fd7ffd79d000ed7610012d72e0008d70e0011d7030008d701
+0011d7030006d7100015d7040006d7070006d70a0006d7010004d7050007d7ffd7350000
+d7eb0000d7ffd7490000d76d000ed7ffd79a000fd7630013d729000dd70d0007d7010005
+d7050006d7030008d7010004d702000ad70b0018d702000ad703000ad70a0009d706000a
+d7ffd7330000d7ffd7ffd7340001d76f000fd7ffd797000ed7670013d7440004d7040003
+d7070003d7060005d7030003d75d0005d7570000d7ffd7ffd7ffd7230000d773000ed7ff
+d795000ed76a0012d7ffd72e0000d7ffd7ffd7ffd799000ed7ffd792000ed76e0012d7ff
+d72d0000d7ffd7d70000d7ffd7c1000ed7ffd78f000ed7700013d7ffd72c0000d7ffd7d5
+0000d7ffd7450000d77c000ed7ffd78d000dd7740013d7ffd7ffd7180000d7e70000d7ff
+d7440000d77f000dd7ffd78a000ed7770012d7ffd7ffd7170000d7e60000d7ffd7440000
+d781000ed7ffd787000ed77a0012d7ffd7ffd7150000d7ffd7ffd7b0000ed7ffd785000d
+d77d0013d7ffd7280000d7e90000d7ffd7ffd7b2000dd7ffd782000ed7800013d7ffd726
+0000d7e90000d7ffd7ffd7260001d78a000ed7ffd77f000ed7830012d7ffd7260000d7ff
+d7cc0000d7ffd7410000d78d000ed7ffd77d000dd7870012d7ffd7250000d7ffd7cb0000
+d7ffd7400000d790000dd7ffd77a000ed7890013d7ffd7ffd7ef0000d7ffd7d4000ed7ff
+d777000dd78d0013d7ffd7ffd7ec0000d7ffd73d0000d798000dd7ffd775000dd7900012
+d7ffd7ffd7090000d7ffd7ffd71d0001d79a000dd7ffd772000ed7930012d7ffd7220000
+d7e30000d7ffd7ffd71c0000d79d000ed7ffd76f000dd7960013d7ffd7200000d7e30000
+d7ffd7ffd7bd000dd7ffd76d000dd7990013d7ffd71f0000d7e20000d7ffd7ffd7be000d
+d7ffd76a000ed79c0012d7ffd71f0000d7e10000d7dd0000d7ffd7380000d7a6000ed7ff
+d767000dd7a00012d7ffd7ffd7de0000d7ffd7370001d7a9000dd7ffd765000dd7a20013
+d7ffd7ffd7db0000d7ffd7370000d7ac000dd7ffd763000dd7a50013d7ffd7ffd7ffd7ff
+d7c1000dd7ffd760000dd7a90012d7ffd7ffd7ffd7ffd7c2000cd7ffd75e000dd7ac0012
+d7ffd7190000d7de0000d7ffd7ffd70e0001d7b5000dd7ffd75b000dd7af0012d7ffd718
+0000d7dd0000d7ffd7ffd70d0000d7b8000dd7ffd759000cd7b20013d7ffd7170000d7dc
+0000d7d70000d7ffd7330000d7bb000cd7ffd756000dd7b50012d7ffd7f40000d7d60000
+d7ffd7f2000cd7ffd754000dd7b80012d7ffd7f20000d7d50000d7ffd7f4000cd7ffd752
+000dd7bb0012d7ffd7ffd7ffd7f90000d7c3000dd7ffd74f000dd7bd0013d7ffd7ffd7ff
+d7f60000d7c5000dd7ffd74c000dd7c10012d7ffd7130000d7ffd7ffd7df0000d7c8000c
+d7ffd74a000dd7c40012d7ffd7110000d7ffd7ffd7ffd7aa000cd7ffd748000dd7c70012
+d7ffd7100000d7d70000d7d20000d7ffd72c0000d7cf000cd7ffd746000dd7c90013d7ff
+d7e70000d7d10000d7ffd72b0001d7d1000dd7ffd742000ed7cc0012d7ffd7e60000d7d0
+0000d7ffd72b0000d7d4000dd7ffd740000dd7d00012d7ffd7e40000d7ffd7ffd7d5000c
+d7ffd73e000dd7d30012d7ffd7e20000d7ffd7ffd7d6000cd7ffd73c000dd7d50013d7ff
+d70b0000d7ffd7ffd7cd0000d7dd000cd7ffd73a000dd7d80012d7ffd70a0000d7ffd7ff
+d7cb0001d7df000dd7ffd736000ed7db0012d7ffd7090000d7ffd7a10000d7ffd7260000
+d7e2000dd7ffd734000dd7df0012d7ffd7080000d7ffd79f0000d7ffd7ffd70d000cd7ff
+d732000dd7e10013d7ffd7d90000d7cc0000d7ffd7ffd70e000cd7ffd730000dd7e40012
+d7ffd7d80000d7cb0000d7ffd7230000d7eb000cd7ffd72e000dd7e70012d7ffd7d60000
+d7ffd7ee0001d7ed000dd7ffd72b000dd7ea0012d7ffd7040000d7ce0000d7ffd7ed0000
+d7f0000dd7ffd729000dd7ec0013d7ffd7020000d7ce0000d7ffd7ffd7e0000dd7ffd726
+000dd7f00012d7ffd7020000d7ffd7960000d7ffd7ffd719000cd7ffd724000dd7f30012
+d7ffd7010000d7ffd7950000d7ffd71e0001d7f9000cd7ffd722000dd7f60012d7ffd7ff
+d7950000d7ffd71e0000d7fc000dd7ffd71f000dd7f80013d7ffd7ffd7920000d7ffd71e
+0000d7fe000dd7ffd71d000dd7fb0012d7ffd7ca0000d7ffd7ffd7e6000dd7ffd71b000d
+d7fe0012d7fe0000d7c80000d7ffd7ffd7e7000dd7ffd719000dd7ffd7010012d7fc0000
+d7c80000d7ffd7e00001d7ffd705000dd7ffd716000dd7ffd7040013d7fb0000d7c70000
+d7c20000d7ffd71b0000d7ffd709000dd7ffd713000dd7ffd7070012d7fb0000d7c60000
+d7c20000d7ffd71a0000d7ffd70b000dd7ffd711000dd7ffd70a0012d7ffd7ffd7840000
+d7ffd7ffd729000dd7ffd70f000dd7ffd70d0012d7ffd7ffd7810000d7ffd7170000d7ff
+d712000dd7ffd70d000dd7ffd70f0013d7ffd7ffd7ffd7960001d7ffd714000dd7ffd70b
+000dd7ffd7120012d7f70000d7ffd7ffd79b0000d7ffd717000dd7ffd709000dd7ffd715
+0012d7f50000d7c30000d7ffd7ffd7f0000dd7ffd707000cd7ffd7190012d7f40000d7c2
+0000d7ffd7ffd7f2000cd7ffd705000cd7ffd71c0012d7f30000d7c10000d7bc0000d7ff
+d7130000d7ffd720000cd7ffd703000cd7ffd71e0012d7ffd7b50000d7bc0000d7ffd711
+0001d7ffd722000cd7ffd701000cd7ffd7210012d7ffd7b30000d7bb0000d7ffd7110000
+d7ffd725000cd7ff000cd7ffd7240012d7ffd7ffd7ffd7ffd7a9000cd7fd000cd7ffd727
+0012d7ffd7ffd7ffd7ffd7a8000cd7fb000cd7ffd7290012d7ef0000d7ffd7ffd7880000
+d7ffd72d000cd7fa000bd7ffd72c0012d7ed0000d7ffd7ffd7860001d7ffd72f000bd7f9
+000bd7ffd72f0012d7ec0000d7bc0000d7b70000d7ffd70d0000d7ffd732000bd7f7000b
+d7ffd7320012d7ffd7a80000d7b60000d7ffd7ffd743000bd7f5000bd7ffd7340012d7ff
+d7a70000d7b50000d7ffd7ffd745000bd7f3000bd7ffd7370012d7ffd7a50000d7ffd7c0
+0001d7ffd73a000bd7f1000bd7ffd73a0012d7ffd7a30000d7ffd7bf0000d7ffd73d000b
+d7ef000bd76c0017d7b80012d7e70000d7ffd7ffd7780000d7ffd73f000bd7ed000bd76d
+0017d7b90012d7e70000d7ffd7ffd7ffd7b9000bd7eb000bd7710014d7bb0012d7e60000
+d7ffd76a0000d7ffd7ffd74d000bd7e9000bd7730005d70a0002d74b0001d76f0012d7ff
+d7ffd74f0000d7ffd7060001d7ffd746000bd7e7000bd7740005d70a0003d74a0001d771
+0012d7ffd79a0000d7b10000d7ffd7050000d7ffd749000bd7e5000bd7750005d70b0002
+d7490002d7720012d7ffd7990000d7b00000d7ffd7050000d7ffd74b000bd7e3000bd776
+0005d70b0002d7490002d7740012d7ffd7970000d7ffd7ffd7ffd705000bd7e1000bd777
+0005d70b0002d7480003d7760012d7e00000d7b30000d7ffd7b20000d7ffd752000bd7df
+000bd7780005d7560004d7780012d7de0000d7b30000d7ffd7b00001d7ffd754000bd7dd
+000bd7790005d7550005d7790012d7de0000d7ffd7600000d7ffd7010000d7a20002d7b1
+000bd7db000bd77a0005d7090000d705000ad7040006d7060007d70a0001d7030006d704
+000bd7770012d7dd0000d7ffd75f0000d7ffd7870019d7020004d7b1000bd7da000ad77b
+0005d7080001d705000ad7040006d7050009d7060004d7020007d704000bd7790012d7ff
+d7ffd73b0000d7ffd7880019d7020005d7b1000ad7d9000ad77c0005d7080001d7080005
+d7080002d7060002d7030004d7030006d7010009d7060004d77f0012d7ffd7ffd7380000
+d7fe0000d7890019d7020005d7b2000ad7d7000ad77d0005d7070002d7080005d7080001
+d7060002d7050004d7020013d7050004d7800012d7ffd78b0000d7ffd7a80001d78a0003
+d7060004d7050003d7020004d7b4000ad7d5000ad77e0010d7090004d7080001d7050002
+d7070003d7050005d7050004d7050004d7820012d7d90000d7ae0000d7ffd7a70000d78c
+0002d7070004d7070002d7020002d7b6000ad7d3000ad77f0010d7090004d7080001d705
+0002d7070004d7040003d7070004d7050004d7840012d7d80000d7ad0000d7ffd7ffd735
+0001d7080004d7070002d7bd000ad7d1000bd77f0010d70a0004d7060001d7050003d707
+0004d7040003d7070004d7050004d7860012d7d60000d7ad0000d7a70000d7ffd78c0001
+d7080004d7070002d7bd000bd7cf000bd7800005d7070002d70a0004d7060001d7050010
+d7040003d7070004d7050004d7870012d7d60000d7ffd7550000d7f80001d7910001d708
+0004d7080001d7be000bd7cd000bd7810005d7080001d70b0004d7040001d7060011d703
+0003d7070004d7050004d7890012d7ffd7ffd72a0000d7f80000d79e0004d7ca000bd7cb
+000bd7820005d7080001d70b0004d7040001d7060003d7110003d7070004d7050004d78b
+0012d7ffd7ffd7270000d7f80000d79f0004d7cb000bd7c9000bd7830005d7090000d70b
+0005d7020002d7050004d7110003d7070004d7050004d78d0012d7ffd7ffd7ffd7c00004
+d70e0002d7090002d7020005d7050005d70b0008d7090002d7020003d76f000bd7c7000b
+d7840005d7170004d7020001d7060004d7110003d7070004d7050004d78e0012d7d30000
+d7ffd7ffd7ea0004d70b0005d7060005d7010007d7030007d709000ad7050005d7010005
+d76f000bd7c6000ad7850005d7170005d7000002d7060004d7110003d7070004d7050004
+d7900012d7d10000d7a80000d7ffd79a0000d7a40004d7090007d7040012d7010009d708
+0003d7000006d7020007d7010005d770000ad7c5000ad7860005d70e0001d7070004d700
+0001d7080003d70b0000d7040003d7070004d7050004d7920012d7d00000d7a70000d7a2
+0000d7f50000d7a50004d70a0006d7040012d700000ad7060003d7040005d7010007d700
+0006d771000ad7c3000ad7870005d70d0002d7070007d7080004d70a0001d7030003d707
+0004d7050004d7940012d7cf0000d7a60000d7a10000d7f50000d7a60004d70c0004d707
+0005d7040007d7040004d7040003d7060004d7040006d7010003d772000ad7c1000ad788
+0005d70d0001d7090005d7090005d7080001d7040003d7070004d7050004d7960011d7ff
+d7760000d7a10000d7ffd79d0004d70d0003d7070004d7060004d7060004d7040003d706
+0005d7030005d7030001d774000ad7bf000ad7890005d70c0002d7090005d7090006d706
+0002d7040003d7070004d7050004d7970012d7ffd7ffd7160000d7f10000d7ab0004d70d
+0003d7070004d7060004d7060004d7040002d7080004d7030005d77b000ad7bd000bd789
+0005d70b0003d7090005d70a0007d7030003d7040003d7070004d7050004d7020002d793
+0012d7ffd7ffd7ffd7050001d7ac0004d70d0003d7070004d7060004d7060004d7040010
+d7030004d77c000bd7bb000bd78a0005d70a0003d70b0003d70c000dd7050004d7060004
+d7050009d7960012d7ffd7ffd7ffd7020000d7ae0004d70d0003d7070004d7060004d706
+0004d7030011d7030004d77d000bd7b9000bd78a0015d70b0003d70d000bd7050005d706
+0005d7050007d7990011d7cb0000d7ffd7ffd7e40004d70d0003d7070004d7060004d706
+0004d7030003d7110004d77e000bd7b8000ad7880017d70d0001d70f0009d704000ad700
+000ad7030007d79a0012d7c90000d7ffd7ffd7e40004d70d0003d7070004d7060004d706
+0004d7030004d7100004d77f000ad7b7000ad7890017d70d0001d7100006d706000ad700
+000ad7040005d79d0012d7c80000d7a10000d79c0000d7ed0000d7b30004d70d0003d707
+0004d7060004d7060004d7030004d7100004d780000ad7b5000ad7ffd7930012d7ffd769
+0000d79b0000d7ec0001d7b40004d70d0003d7070004d7060004d7060004d7030004d710
+0004d781000ad7b3000ad7ffd7960011d7ffd7680000d79a0000d7ec0000d7b60004d70d
+0003d7070004d7060004d7060004d7030004d70b0000d7030004d782000ad7b1000ad7ff
+d7980012d7ffd7660000d7ffd7ffd7400004d70d0003d7070004d7060004d7060004d703
+0005d7090001d7030004d783000ad7af000bd7ffd79a0012d7ffd7ffd7ffd7a60004d70d
+0003d7070004d7060004d7060004d7040005d7080001d7030004d783000bd7ae000ad7ff
+d79d0012d7c30000d7ffd7ffd7220000d7bb0004d70d0003d7070004d7060004d7060004
+d7040005d7080001d7030004d784000ad7ad000ad7ffd7a00011d7c30000d7ffd7ffd71f
+0001d7bc0004d70d0003d7070004d7060004d7060004d7040007d7040002d7040004d785
+000ad7ab000ad7ffd7a20012d7c20000d7ffd7340000d7e70000d7bd0005d70d0003d707
+0004d7060004d7060004d705000ed7040004d786000ad7a9000bd7ffd7a40012d7ffd7f5
+0000d7ffd7a70006d70b0005d7050005d7050005d7050006d705000cd7050005d785000b
+d7a7000bd7ffd7a70012d7ffd75b0000d7950000d7ffd7a4000dd705000bd700000ad700
+000ad700000ad7040009d704000bd783000bd7a6000ad7ffd7aa0011d7ffd75a0000d7ff
+d77a0001d7be000dd705000bd700000ad700000ad700000ad7060006d705000bd784000a
+d7a5000ad7020000d7ffd7a80012d7ffd7580000d7ffd7790000d7ffd7aa000ad7a3000b
+d7030001d7ffd7a80012d7bc0000d7980000d7ffd7780000d7ffd7ab000bd7a1000bd706
+0000d7ffd7a90012d7bb0000d7ffd7ffd7ffd7bf000bd79f000bd70d0001d7ffd7a40011
+d7bb0000d7ffd7290000d7ffd7ffd794000bd79d000bd7100001d7ffd7a30012d7ffd7e4
+0000d7e00001d7ffd7b2000bd79c000ad7180001d7ffd79e0012d7ffd7e10000d7e00000
+d7ffd7b5000ad79b000bd71a0001d7ffd79e0012d7ffd7de0000d7e00000d7ffd7b6000b
+d799000bd7ffd7be0011d7ffd74c0000d7ffd7ffd7ffd72a000bd797000bd7230001d7ff
+d79a0012d7b50000d7930000d7ffd76c0000d7ffd7bd000bd796000ad7260001d7ffd79a
+0012d7b40000d7920000d7ffd76a0001d7ffd7bf000ad795000bd72d0001d7ffd7950012
+d7b20000d7920000d78c0000d7db0000d7ffd7c1000bd793000bd7300001d7ffd7950011
+d7b20000d7ffd71f0000d7ffd7ffd79f000bd792000ad7380000d7ffd7900012d7ffd7d0
+0000d7ffd7ffd79d0001d701000ad791000ad73a0001d7ffd7900012d7ffd7cd0000d7d8
+0000d7ffd7c20001d704000ad78f000bd73c0000d7ffd7910012d7ffd7ffd7a30001d7ff
+d7bc0001d70b000bd78d000bd7430001d7ffd78c0011d7af0000d7ffd7f00000d7ffd7bc
+0001d70e000bd78c000ad7460001d7ffd78c0011d7ad0000d78d0000d7ffd7ffd7ffd731
+000ad78b000bd74d0001d7ffd7860012d7ac0000d78c0000d7870000d7ffd7ffd78f0001
+d716000bd789000bd7500001d7ffd7860012d7ab0000d78b0000d7860000d7d40000d7ff
+d7b80001d719000bd788000ad7ffd7dc0011d7ffd7370000d7860000d7d20001d7ffd7b3
+0001d720000ad787000ad7590001d7ffd7830011d7ffd7bc0000d7d20000d7ffd7b20002
+d723000ad785000bd75b0001d7ffd7820012d7ffd7ffd7ffd7ffd73d0000d72a000bd784
+000ad7630001d7ffd77d0012d7a70000d7ffd7ffd7ffd7900001d72c000ad783000ad766
+0001d7ffd77d0011d7a70000d7ffd7dc0001d7ffd7ae0001d72f000ad781000bd76d0000
+d7ffd7790011d7a50000d7ffd7db0000d7ffd7aa0001d735000bd77f000bd76f0001d7ff
+d7780012d7a40000d7860000d7810000d7ce0000d7ffd7a80002d738000bd77e000ad772
+0000d7ffd7790011d7ffd72b0000d7800000d7ffd7ffd7730001d740000ad77d000bd778
+0001d7ffd7740011d7ffd7290000d77f0000d7cc0000d7ffd7a30002d742000bd77b000b
+d77b0001d7ffd7740011d7ffd7270000d7ffd74b0001d7ffd7eb000bd77a000ad7830001
+d7ffd76e0012d7ffd7ffd7710000d7ffd7a00001d74b000ad779000ad7860001d7ffd76e
+0011d7a00000d7ffd7ffd7ffd76d0002d74e000ad777000bd7ffd7f90011d79f0000d7ff
+d7ffd7ffd7660001d755000bd776000ad78e0001d7ffd76b0011d79e0000d7fe0000d7c7
+0000d7ffd7990002d758000ad775000ad7910001d7ffd76a0012d7ffd79b0000d7c60001
+d7ffd7950000d760000ad774000ad7980001d7ffd7650011d7ffd71d0000d77a0000d7c6
+0000d7ffd7950001d761000ad773000ad79b0001d7ffd7650011d7ffd71b0000d7ffd7ff
+d7d70001d764000ad7720009d7a30000d7ffd7610011d7ffd7190000d7ffd7ffd7d10001
+d76b0009d771000ad7a40001d7ffd7600012d7980000d77d0000d7ffd73d0000d7ffd78f
+0002d76d000ad76f000ad7a70000d7ffd7610011d7980000d7ffd7b90001d7ffd78a0001
+d775000ad76e000ad7ad0001d7ffd75c0011d7970000d7f30000d7c20000d7ffd7890002
+d777000ad76d000ad7b00001d7ffd75c0011d7ffd7890000d7ffd7ffd7ca000ad76c0009
+d7b80001d7ffd7560012d7ffd7860000d7ffd7ffd7490001d7800009d76b000ad7ba0001
+d7ffd7560011d7ffd7ffd7450001d7ffd7850002d782000ad769000ad7ffd7ffd7160011
+d7ffd70d0000d7ffd7330000d7ffd7810001d78a000ad768000ad7c20001d7ffd7530011
+d7910000d7780000d7ffd7320000d7ffd77f0002d78c000ad767000ad7c50001d7ffd752
+0012d7900000d7770000d7ffd7ffd7ae0000d794000ad7660009d7cd0001d7ffd74d0011
+d78f0000d7770000d7710000d7ffd7ffd7390001d7960009d765000ad7cf0001d7ffd74d
+0011d78e0000d7e90000d7ba0000d7ffd77b0001d798000ad7640009d7d70000d7ffd749
+0011d7ffd7760000d7ba0000d7ffd7760001d79f0009d7630009d7d90001d7ffd7480012
+d7ffd7730000d7ba0000d7ffd7740002d7a20009d761000ad7db0000d7ffd7490011d7ff
+d7ffd7ffd79e0001d7a9000ad7600009d7e20001d7ffd7440011d78b0000d7ffd79a0000
+d7ffd7700002d7ac0009d75f000ad7e40001d7ffd7440011d7890000d7720000d7ffd724
+0001d7ffd7ffd721000ad75e0009d7ec0001d7ffd73f0011d7880000d7710000d76c0000
+d7b50000d7ffd76d0001d7b40009d75d0009d7ef0001d7ffd73e0011d7880000d7700000
+d76b0000d7ffd7ffd7220002d7b70009d75c0009d7ffd7ffd7320011d7f80000d76b0000
+d7ffd7ffd71c0001d7be0009d75b0009d7f70001d7ffd73b0011d7ffd7620000d7b20000
+d7ffd7660002d7c10009d75a0009d7f90001d7ffd73b0011d7ffd7ffd7120001d7ffd761
+0001d7c80009d7590009d7ffd7010001d7ffd7350011d7840000d7ffd78a0000d7ffd760
+0002d7cb0009d7580008d7ffd7040001d7ffd7350011d7820000d7ffd7ffd7ffd7bc0008
+d7570009d7ffd70b0001d7ffd7300011d7810000d76d000dd7580000d7ffd7ffd70f0001
+d7d30009d7560008d7ffd70e0001d7ffd7300011d7800000d7520042d73d0000d7ae0000
+d7ffd75c0002d7d60008d7550009d7ffd7ffd7420011d7c6005cd72f0000d7ad0001d7ff
+d7570001d7dd0009d7540008d7ffd7160001d7ffd72c0011d7ba0070d7240000d7ad0000
+d7ffd7560002d7e00008d7530009d7ffd7180001d7ffd72c0011d7b2007cd7ffd7ffd720
+0000d7e70009d7520008d7ffd7200001d7ffd7270011d77d0000d72a008ad7ffd7ffd717
+0001d7e90008d7510009d7ffd7220001d7ffd7260011d77c0000d7240096d7ba0001d7ff
+d7520001d7eb0009d7500008d7ffd72a0000d7ffd7220011d77b0000d71c00a4d7b20000
+d7ffd74e0001d7f20008d74f0009d7ffd72b0001d7ffd7220011d77a0000d71500b0d701
+0000d7a80000d7ffd74c0002d7f40009d74e0008d7ffd72e0000d7ffd7230011d78a0048
+d7280048d7ffd7ee0001d7fc0008d74d0009d7ffd7330001d7ffd71e0011d785003fd742
+003fd7ffd7e70002d7fe0009d74c0008d7ffd7360002d7ffd71d0011d77f0036d75c0036
+d7990001d7ffd7ffd74a0008d74b0009d7ffd73d0001d7ffd7190011d7790030d7700030
+d7940000d7ffd7430001d7ffd7060009d74a0008d7ffd7400002d7ffd7180011d773002e
+d77c002ed78f0000d7ffd7410002d7ffd7090008d7490009d7ffd7ffd75d0011d76e002c
+d788002cd7ffd7c80001d7ffd7100009d7480008d7ffd7480001d7ffd7150011d7690029
+d7940029d7830000d7ffd73d0002d7ffd7130008d7470009d7ffd74a0002d7ffd7140011
+d7630026d7a20026d77d0001d7ffd7390000d7ffd71a0009d7460008d7ffd7520001d7ff
+d7100011d75d0024d7ae0024d7780000d7ffd7390001d7ffd71c0008d7450009d7ffd754
+0002d7ffd70e0011d7590021d7b90022d7ffd7ae0001d7ffd71e0009d7440008d7ffd75c
+0000d7ffd70b0011d754001ed7c5001fd7ffd7a50001d7ffd7250008d7430009d7ffd75d
+0001d7ffd70b0011d74f001dd7ce001cd76b0000d7ffd7330002d7ffd7270009d7420008
+d7ffd7600001d7ffd70b0011d74a001cd7d6001bd7660001d7ffd72e0001d7ffd72f0008
+d7410009d7ffd7660001d7ffd7060011d746001bd7de001ad7620000d7ffd72d0002d7ff
+d7310009d7400008d7ffd7690002d7ffd7050011d740001cd7e4001bd7ffd7ffd7c30008
+d7400008d7ffd7700001d7ffd7010011d73b001cd7ea001cd7ffd7830001d7ffd7390008
+d73f0009d7ffd7720002d7ffd7000011d736001dd7ee001dd7520000d7ffd7290002d7ff
+d73b0009d73e0008d7ffd7ffd7790010d733001cd7f4001cd74e0001d7ffd7240001d7ff
+d7430008d73d0009d7ffd77a0001d7fd0011d72f001bd7fa001bd74b0000d7ffd7230002
+d7ffd7450009d73c0008d7ffd77d0002d7fc0011d72b0019d7ffd7020019d7ffd7690000
+d7ffd74d0008d73c0008d7ffd7840001d7f80011d7270017d7ffd70a0017d7420000d7ff
+d7210001d7ffd74e0008d73b0009d7ffd7860002d7f70010d7230017d7ffd7100017d73d
+0001d7ffd7200001d7ffd7500009d73a0008d7ffd78e0000d7f30011d71f0016d7ffd716
+0016d73a0000d7ffd71c0001d7ffd7570008d7390009d7ffd78f0001d7f30011d71a0017
+d7ffd71a0017d7ffd7520002d7ffd7590009d7380009d7ffd7910001d7f30011d7160016
+d7ffd7200016d7310000d7ffd7170001d7ffd7600009d7380008d7ffd7980001d7ef0010
+d7120016d7ffd7260015d72d0001d7ffd7150002d7ffd7630008d7370009d7ffd79a0002
+d7ed0011d70e0016d7ffd72a0015d72a0000d7ffd7ffd77e0009d7360008d7ffd7a20001
+d7e90011d70a0015d7ffd7300014d7ffd73b0001d7ffd76b0008d7350009d7ffd7a40002
+d7e80011d7060015d7ffd7340014d7210000d7ffd7140001d7ffd76d0009d7340009d7ff
+d7ffd7920010d7030014d7ffd73a0013d71d0001d7ffd70e0001d7ffd7740009d7340008
+d7ffd7ac0001d7e50026d7ffd73e0013d71a0000d7ffd70e0001d7ffd7770008d7330009
+d7ffd7ae0002d7e40021d7ffd7440012d7ffd7220000d7ffd77e0009d7320009d7ffd7b5
+0001d7e0001dd7ffd7480013d7100000d7ffd70b0001d7ffd77f0009d7310009d7ffd7b8
+0002d7df0019d7ffd74c0013d70c0001d7ffd70b0000d7ffd7820009d7300009d7ffd7bf
+0000d7db0016d7ffd7500013d7090000d7ffd7060001d7ffd7880009d7300008d7ffd7c1
+0001d7da0013d7ffd7540013d7ffd70d0001d7ffd78b0008d72f0009d7ffd7c30001d7d7
+0012d7ffd7580012d7ffd7050001d7ffd7920009d72e0009d7ffd7c90001d7cf0012d7ff
+d75c0013d7ffd7000001d7ffd7940009d72e0008d7ffd7cc0002d7cb0012d7ffd75e0012
+d7ffd7ffd7980008d72d0009d7ffd7d30001d7c30012d7ffd7620012d7f70001d7ffd79c
+0009d72c0009d7ffd7d50002d7bf0011d7ffd7660011d7f40001d7ffd79e0009d72c0008
+d7ffd7ffd7970011d7ffd76a0011d7eb0001d7ffd7a60008d72b0009d7ffd7dd0001d7b5
+0011d7ffd76e0011d7e70001d7ffd7a80009d72a0009d7ffd7df0002d7b10010d7ffd772
+0010d7e00000d7ffd7af0009d72a0008d7ffd7e70001d7a90010d7ffd7760010d7dc0001
+d7ffd7b10008d7290009d7ffd7e90002d7a5000fd7ffd77a000fd7da0000d7d6000cd7cf
+0009d7280009d76d0009d7130009d7ffd75a0000d79e000fd7ffd77e000fd7d10001d7df
+0006d7d20009d7280008d76e0009d7130009d7ffd75b0001d79a000fd7ffd782000fd7cd
+0001d7e10006d7210000d76b0001d7420008d7280008d7700008d7110007d7ffd7600001
+d797000ed7ffd786000ed7c50001d7e90004d7210001d76b0001d7420008d7270009d771
+0007d7110006d7ffd7670001d78f000fd7ffd788000fd7c10001d7eb0004d7210001d76b
+0001d7420009d7260009d7720007d70f0007d7ffd7690001d78c000fd7ffd78a000fd7ba
+0000d7f20004d7200002d76a0002d7420009d7260008d7730007d70f0007d7ffd7700001
+d784000ed7ffd78e000ed7b70001d7f30004d71f0003d7690003d7430008d7250009d773
+0007d70e0008d7ffd7720001d781000ed7ffd790000ed7b50000d7f50004d71f0003d769
+0003d7430009d7240009d7730008d70d0008d7ffd7780000d77a000fd7ffd792000fd7ac
+0001d7fb0004d71e0004d7680004d7430009d7240008d7740008d70c0009d7ffd7790001
+d777000ed7ffd796000ed7a90001d7fd0004d7090002d7030004d706000bd7050008d709
+0002d7020003d7040002d7020003d7000007d7040006d7070002d7020005d706000bd73f
+0008d7230009d7740002d7000005d70b0002d7000005d7ffd77b0000d775000ed7ffd798
+000ed7a10001d7ffd7040004d7060005d7010008d703000cd704000ad7060004d7010005
+d7010004d701000dd7040006d7040005d7010008d703000cd73f0009d7220009d7740002
+d7000005d70a0003d7000005d7090008d709000ad706000ad7060009d70c0007d70d0007
+d7ffd70a0001d76e000ed7ffd79a000ed79e0001d7ffd7060004d7040007d7000009d703
+000cd7040003d7000006d7030006d701000cd7010006d7000005d7060004d7020007d700
+000ad702000cd73f0009d7220008d7750002d7010005d7090002d7010005d708000ad707
+000bd705000bd705000cd7080010d705000ad7ffd70a0002d769000ed7ffd79e000ed7ff
+d7a50004d7050012d7050004d7080002d7040005d7020006d700000dd7000007d7010004
+d7070003d7020013d7050004d7450008d7210009d7750002d7010005d7090002d7010005
+d7080002d7020005d7050003d7030004d7040003d7030004d7040004d7020005d7070003
+d7040008d7040002d7030005d7ffd7100001d762000ed7ffd7a0000ed7940001d7ffd70d
+0004d7070005d7050004d7050004d7070002d7060004d7050005d7010003d7020005d701
+0003d7020004d7070003d7050007d7030005d7040004d7450009d7200009d7750002d702
+0004d7080002d7020005d7060003d7040005d7030003d7050003d7030003d7050003d704
+0003d7050003d7070003d7050006d7040003d7040004d7ffd7120001d75f000dd7ffd7a4
+000dd7910001d7ffd70f0004d7070004d7060004d7050004d7070002d7060005d7040004
+d7030001d7030005d7020002d7020004d7070003d7050005d7050005d7040004d7450009
+d7200008d7760002d7020005d7070002d7020005d7050003d7060004d7030003d7060002
+d7030003d7060002d7030003d7060003d7060003d7060004d7050003d7060003d7ffd772
+000dd7ffd7a8000dd7880001d7ffd7160004d7070004d7060004d7050004d7060002d708
+0004d7040004d7090004d7090004d7070003d7050004d7070004d7040004d7460008d720
+0008d7760002d7030004d7060002d7030005d7050003d7060005d7020003d7060002d703
+0003d7060002d7030004d7050004d7050003d7060004d7050003d7060004d7ffd7170001
+d756000dd7ffd7aa000dd7850001d7ffd7180004d7070004d7070003d7050004d7060010
+d7040003d70a0003d70a0004d7070003d7050004d7070005d7030004d7460008d71f0009
+d7760002d7030005d7050002d7030005d7040003d7070005d7020004d7050002d7030004
+d7050002d7030003d7060004d7040004d7070003d7040003d7070005d7ffd7180001d753
+000cd7ffd7ae000cd77f0000d7ffd71e0004d7070004d7070003d7050004d7050011d704
+0003d70a0003d70a0004d7070003d7050004d7080004d7030004d7460009d71e0009d776
+0002d7040004d7040002d7040005d7040011d7020005d7050001d7030005d7050001d704
+0002d7050005d7040004d7070003d7040011d7ffd71e0001d74c000cd7ffd7b0000cd77c
+0001d7ffd71f0004d7070004d7070003d7050004d7050003d7120003d70a0003d70a0004
+d7070003d7050004d7080004d7030004d7460009d71e0008d7770002d7040004d7040002
+d7040005d7040011d7030006d70a0006d7110007d7040004d7070003d7040011d7ffd720
+0002d748000cd7ffd7b2000cd7790001d7ffd7210004d7070004d7070003d7050004d705
+0004d7110003d70a0003d70a0004d7070003d7050004d7080004d7030004d7470008d71e
+0008d7770002d7040005d7020003d7040005d7040003d7110009d7070009d70c0009d704
+0004d7070003d7040003d7ffd7350000d742000cd7ffd7b4000cd7720001d7ffd7270004
+d7070004d7070003d7050004d7050004d7110003d70a0003d70a0004d7070003d7050004
+d7080004d7030004d7470008d71d0009d7770002d7050004d7020002d7050005d7040003
+d7130009d7070009d7080004d7010004d7050003d7060004d7040003d7ffd7360001d73f
+000cd7ffd7b6000bd7700001d7ffd7290004d7070004d7070003d7050004d7050004d711
+0003d70a0003d70a0004d7070003d7050004d7080004d7030004d7470008d71d0009d777
+0002d7050005d7000003d7050005d7040003d7140008d7080008d7060004d7030004d705
+0004d7050003d7050003d7ffd7380000d73d000cd7ffd7b8000bd7680001d7ffd7300004
+d7070004d7070003d7050004d7050004d70b0000d7040003d70a0003d70a0004d7070003
+d7050004d7080004d7030004d7470009d71c0008d7780002d7060004d7000002d7060005
+d7040004d7160006d70a0006d7040004d7040004d7060004d7030003d7060004d7ffd73c
+0001d736000cd7ffd7ba000bd7650001d7ffd7320004d7070004d7070003d7050004d705
+0005d7090001d7040003d70a0003d70a0004d7070003d7050004d7080004d7030004d748
+0008d71c0008d7780002d7060008d7060005d7040004d70b0000d70a0006d70a0006d703
+0003d7050004d707000ad7070004d70a0000d7ffd7320001d733000cd7ffd7bc000bd7ff
+d7990004d7070004d7070003d7050004d7060005d7080001d7040003d70a0003d70a0004
+d7070003d7050004d7080003d7040004d7480008d71b0009d7780002d7070006d7070005
+d7040005d7090001d7020001d7070004d7020001d7070004d7020003d7060004d7070008
+d7090004d70a0001d7ffd7380001d72b000cd7ffd7be000bd75d0001d7ffd7380004d707
+0004d7070003d7050004d7060005d7080001d7040003d70a0003d70a0004d7070003d705
+0004d7080003d7040004d7480008d71b0009d7780002d7070006d7070005d7040006d707
+0002d7020001d7070004d7020001d7070004d7010004d7060004d7060002d7100006d707
+0002d7ffd73a0001d728000cd7ffd7c0000bd75a0001d7ffd73a0004d7070004d7070003
+d7050004d7030001d7010006d7040003d7040003d70a0003d70a0005d7040006d7040004
+d7080003d7040004d7030001d7420008d71b0008d7790002d7080004d7080005d7040007
+d7060002d7020001d7080003d7020001d7080003d7010004d7060004d7050002d7110007
+d7060002d7ffd765000ad7ffd7c3000bd7530001d7ffd7400004d7070004d7070004d705
+0004d7000002d702000ed7050003d70a0004d70a0005d7010008d7000000d7020005d706
+0003d7050005d7000002d7440007d71b0008d7790002d7080004d7080005d7050007d704
+0002d7030002d7070003d7020002d7070003d7010004d7040006d7010000d7010005d710
+0007d7030003d7ffd7410001d721000ad7ffd7c5000bd7500001d7ffd7410006d7060005
+d7050005d7050008d703000cd7050005d7080005d70a000ad7000007d7010006d7040003
+d7060009d7440008d71a0008d7790002d7090002d7090005d707000cd7040003d7050003
+d7030003d7050003d7020013d7010011d705000dd7ffd7440001d71e000ad7ffd7c7000b
+d7490000d7ffd745000cd700000ad701000ad7020007d705000ad704000ad703000ad708
+0008d7010005d703000ed7080007d7450008d7190009d7780004d7080002d7080007d706
+000cd7040004d7030004d7030004d7030004d7030012d7010012d705000bd7ffd74b0001
+d717000ad7ffd7c9000bd7460001d7ffd746000cd700000ad701000ad7030005d7080006
+d706000ad703000ad7080006d7030002d706000cd70b0005d7460008d7190008d776000a
+d7060000d706000dd7040009d706000cd704000cd7050007d7010006d7030012d7050009
+d7ffd74e0002d713000bd7ffd7ca000bd7440000d7ffd7c70004d7610007d7190008d776
+000ad7060000d706000dd7060006d7070009d7070009d7090005d7030004d7050012d705
+0007d7ffd7560000d70d000bd7ffd7cc000bd73d0001d7ffd7cc0004d7610007d7190008
+d7ee0001d70d0003d7ffd7650001d70a000bd7ffd7cd000cd73a0001d7ffd7ce0004d761
+0008d7170009d7ed0002d70e0001d7ffd7680000d709000ad7ffd7cf000bd7340001d7ff
+d7d40004d7610008d7170008d7ed0003d70d0002d7ffd76d0001d702000bd7ffd7d0000b
+d7300002d7ffd7d60004d7620007d7170008d7ed0003d70d0002d7ffd76f000dd7ffd7d2
+000bd7ffd7ffd7090004d7620007d7170008d7ed0006d7080003d7ffd771000bd7ffd7d4
+000bd7280001d7ffd7dd0004d7620007d7160009d7ed0012d7ffd771000bd7ffd7d6000b
+d7250001d7ffd7dc000ad75f0008d7150008d7ef000fd7ffd773000bd7ffd7d6000bd71f
+0001d7ffd7e2000ad7600007d7150008d7f1000cd7ffd773000bd7ffd7d8000bd71c0001
+d7ffd7ffd7500007d7150008d7f50005d7ffd776000ad7ffd7da000ad7160000d7ffd7ff
+d7570007d7150008d7ffd7ffd771000ad7ffd7dc000ad7130001d7ffd7ffd7580007d715
+0008d7ffd7ffd7710009d7ffd7de0009d7120000d7ffd7ffd75a0007d7150008d7ffd7ff
+d7700009d7ffd7e00009d70b0001d7ffd7ffd75f0008d7130009d7ffd7ffd76f000ad7ff
+d7e0000ad7080001d7ffd7ffd7610008d7130008d7ffd7ffd7700009d7ffd7e20009d702
+0001d7ffd7ffd7680007d7130008d7ffd7ffd76f0009d7ffd7e4000bd7ffd7ffd76a0007
+d7130008d7ffd7ffd76e0009d7ffd7480003d7090001d78d0009d7ffd7ffd76b0007d713
+0008d7ffd7ffd76d0009d79e0012d7100020d702001ed708000bd71a000ad704000bd704
+0002d78e0009d7ffd7ffd76a0007d7130008d7ffd7ffd76d0009d79d0015d70e0020d702
+001ed708000bd719000bd703000ed7010003d78e0009d7ffd7ffd76a0008d7120008d7ff
+d7ffd76c0009d7a00015d70b0020d705001bd70a000ad718000ad7040014d7900009d7ff
+d7ffd7690008d7120008d7ffd7ffd76c0009d7a20014d70a0020d7070019d70d0007d718
+0007d7060005d7050009d7900009d7ffd7ffd7690008d7110009d7ffd7ffd76b0009d7a3
+0007d7060006d7090006d7060005d7070004d7080006d70b0005d70e0006d7170007d706
+0005d7090006d7910009d7ffd7ffd7680008d7110008d7ffd7ffd76c0009d7a30006d707
+0006d7090004d7070005d7090003d7080005d70d0004d70e0007d7150008d7060004d70a
+0006d7910009d7ffd7ffd7690007d7110008d7ffd7ffd76b0009d7a40006d7080006d707
+0004d7080005d7090002d7080006d70e0002d70e0008d7140008d7060005d70b0005d792
+0009d7ffd7ffd7680008d7100008d7ffd7ffd76b0009d7a40006d7080006d7070002d70a
+0005d7090002d7080006d70e0002d70e0008d7140008d7060004d70d0003d7930009d7ff
+d7ffd7680008d7100008d7ffd7ffd76a0009d7a50006d7080006d7070002d7090006d709
+0002d7080006d70e0002d70e0008d7130009d7050005d70d0003d7940009d7ffd7ffd767
+0009d70f0008d7ffd7ffd76a0009d7a50005d70a0006d7060002d7090005d70a0002d708
+0005d70f0001d70f0008d7120009d7060005d70d0003d7940009d7ffd7ffd7670009d70f
+0008d7ffd7ffd7690009d7a60005d70a0006d7050002d7090006d70a0001d7090005d70f
+0001d70e0009d711000ad7060005d70e0002d7950009d7ffd7ffd7660009d70f0008d7ff
+d7ffd7690009d7a50006d7090006d7060002d7090006d70a0001d7080006d7200009d710
+000bd7060006d70d0001d7960009d7ffd7ffd766000ad70d0009d7ffd7ffd7680009d7a6
+0006d7090006d7130006d7150006d7200009d7100003d7000005d7070006d70c0002d797
+0009d7ffd7ffd765000ad70d0008d7ffd7ffd7690009d7a50006d70a0006d7120006d715
+0006d7090001d7140003d7000006d70e000bd7070007d70b0002d7970009d7ffd7ffd766
+0009d70d0008d7ffd7ffd7680009d7a60006d7090006d7130006d7150006d7080002d714
+0003d7000006d70d0004d7000006d7080007d7a60009d7ffd7ffd7650009d70d0008d7ff
+d7ffd7680009d7a60006d7090006d7130006d7150006d7070003d7130004d7000006d70d
+000cd7090006d7a60009d7ffd7ffd765000ad70c0008d7ffd7ffd7680008d7a70006d709
+0006d7130006d7150006d7070003d7130004d7000006d70c0004d7000007d7090007d7a6
+0008d7ffd7ffd765000ad70c0008d7ffd7ffd7670009d7a60006d7080007d7140005d715
+0006d7080002d7140003d7010006d70c0004d7000006d70b0007d7a50009d7ffd7ffd764
+000ad70c0008d7ffd7ffd7670008d7a70006d7060007d7150006d7150006d7050005d713
+0004d7010006d70b0004d7000007d70b0008d7a50008d7ffd7ffd764000ad70c0008d7ff
+d7ffd7660009d7a70007d701000ad7160006d7150012d7130004d7010006d70a0004d701
+0007d70c0008d7a40009d7ffd7ffd763000ad70c0008d7ffd7ffd7660009d7a70013d717
+0006d7140012d7140003d7020006d70a0003d7020007d70d0008d7a30009d7ffd7ffd763
+000ad70c0008d7ffd7ffd7660008d7a70010d71b0005d7150012d7140003d7030005d709
+0004d7020006d70f0008d7a30008d7ffd7ffd763000bd70b0008d7ffd7ffd7660008d7a7
+000fd71b0006d7150005d7060005d7130004d7030006d7070004d7020007d7100008d7a2
+0008d7ffd7ffd763000bd70b0008d7ffd7ffd7650009d7a70005d7030006d71a0006d714
+0005d7080004d7130003d7040006d7070003d7030007d7110008d7a10009d7ffd7ffd762
+000bd70b0008d7ffd7ffd7650009d7a70005d7040005d71a0005d7150005d7090002d714
+0003d7040006d7060003d7040006d7130008d7a00009d7ffd7ffd762000bd70b0008d7ff
+d7ffd7650008d7a70006d7040005d71a0005d7150005d7090002d7140003d7040006d705
+0004d7040006d7130008d7a10008d7ffd7ffd762000cd70a0008d7ffd7ffd7650008d7a7
+0006d7040006d7180006d7150005d7090002d7130004d7040006d7040004d7040007d714
+0008d7a00008d7ffd7ffd762000cd70a0008d7ffd7ffd7640009d7a70005d7050006d718
+0005d7150005d70a0001d7140003d7050006d7040003d7050006d7160008d79f0009d7ff
+d7ffd761000cd70a0008d7ffd7ffd7640008d7a80005d7060005d7180005d7150005d70a
+0001d7140003d7050006d7030003d7060006d7070001d70d0007d7a00008d7ffd7ffd761
+000cd70a0008d7ffd7ffd7640008d7a70006d7060006d7170005d7150005d7210003d705
+0006d7020004d7060006d7070000d70f0006d7a00008d7ffd7ffd761000dd7090008d7ff
+d7ffd7640008d7a70005d7070006d7160006d7140005d7140001d70a0003d7070006d701
+0003d7060007d7060001d70f0006d7a00008d7ffd7ffd761000dd7080008d7ffd7ffd764
+0009d7a70005d7080005d7160005d7150005d7130002d70a0003d7070006d7000003d707
+0006d7070001d70f0006d7a00009d7ffd7ffd761000cd7080008d7ffd7ffd7640008d7a8
+0005d7080006d7150005d7150005d7120002d70b0003d707000ad7080006d7070001d710
+0005d7a10008d7ffd7ffd761000cd7080008d7ffd7ffd7640008d7a70006d7080006d715
+0005d7140006d7120002d70b0002d708000ad7080006d7070002d70f0005d7a10008d7ff
+d7ffd761000dd7070008d7ffd7ffd7640008d7a70005d70a0005d7140005d7150005d712
+0003d70a0003d7080009d7090005d7070003d70f0005d7a10008d7ffd7ffd761000dd707
+0008d7ffd7ffd7640008d7a60006d70a0006d7130005d7150005d7110003d70b0003d708
+0008d70a0005d7070003d70f0004d7a20008d7ffd7ffd761000dd7070008d7ffd7ffd764
+0008d7a60006d70a0006d7120006d7150005d7100004d70b0003d7080007d70a0005d708
+0003d70e0005d7a20008d7ffd7ffd761000dd7070008d7ffd7ffd7630009d7a60006d70a
+0007d7110006d7150005d70f0005d70b0002d7090007d7090006d7080004d70d0005d7a2
+0009d7ffd7ffd760000ed7060008d7ffd7ffd7630008d7a60006d70c0007d7100005d715
+0006d70c0007d70b0003d70a0005d70a0006d7070006d70b0005d7a40008d7ffd7ffd760
+000ed7060008d7ffd7ffd7630008d7a50008d70b0007d70f0007d7130008d708000ad70a
+0004d70a0004d70a0007d7070008d7090004d7a50008d7ffd7ffd760000ed7060008d7ff
+d7ffd7630008d7a4000ad70a0009d70b000ad711001dd7090007d7080003d70a0009d706
+000ad7040005d7a70008d7ffd7ffd760000ed7060008d7ffd7ffd7630008d7a10010d708
+000bd7050011d70a001fd706000ed7050003d7060011d7020014d7a80008d7ffd7ffd760
+000ed7060008d7ffd7ffd7630008d7a1000fd709000bd7040012d70a001fd706000ed705
+0002d7070011d7010002d705000ad7aa0008d7ffd7ffd760000fd7050008d7ffd7ffd763
+0008d7ffd7450001d70a0003d7ad0008d7ffd7ffd760000fd7050009d7040003d7040003
+d7040003d7040003d7040003d7040003d7040003d7040003d7040003d7040003d7040003
+d7040003d7040003d7040003d7040003d7040003d7040003d7040003d7030004d7030004
+d7030004d7030004d7030004d7030004d7030004d7030004d7030004d7030004d7030004
+d7030004d7030004d7030004d7030004d7030004d7030004d7030004d7030004d7030004
+d7030004d7030004d7030004d7030004d7030004d7030004d7030004d7030004d7030004
+d7030004d7030004d7030004d7030003d7040003d7040003d7040003d7040003d7040003
+d7040003d7040003d7040003d7040003d7040003d7040003d7040003d7040003d7040003
+d7040003d7040003d704000cd7ffd7ffd7040008d7ffd7ffd760000fd7050008d7ffd7ff
+d7630008d7ffd7ffd7040008d7ffd7ffd760000fd7050008d7ffd7ffd7630008d7ffd7ff
+d7040008d7ffd7ffd760000fd7050008d7ffd7ffd7630008d7ffd7ffd7040008d7ffd7ff
+d7600010d7040008d7ffd7ffd7630008d7ffd7ffd7040008d7ffd7ffd7600010d7040008
+d7ffd7ffd7630008d7ffd7ffd70400ff00ff007ad7040008d7ffd7ffd7630008d7ffd7ff
+d70400ff00ff007ad7040008d7ffd7ffd7630008d7ffd7ffd70400ff00ff007ad7040008
+d7ffd7ffd7630008d7ffd7ffd70400ff00ff007ad7040008d7ffd7ffd7630008d7ffd7ff
+d70400ff00ff007bd7030008d7ffd7ffd7630008d7ffd7ffd70400ff00ff007bd7030008
+d7ffd7ffd7630008d7ffd7ffd70400ff00ff007bd7030008d7ffd7ffd7630008d7ffd7ff
+d70400ff00ff007bd7040008d7ffd7ffd7620008d7ffd7ffd70400ff00ff007bd7040008
+d7ffd7ffd7620008d7ffd7ffd70400ff00ff007bd7040008d7ffd7ffd7620009d7ffd7ff
+d702000cd7ffd7ffd75c0008d7000008d7040008d7ffd7ffd7630008d7ffd7ffd702000c
+d7ffd7ffd75c0008d7000008d7040008d7ffd7ffd7630008d7ffd7ffd702000cd7ffd7ff
+d75c0008d7000009d7030008d7ffd7ffd7630008d7de0009d7060001d7ffd710000cd7ff
+d7ffd75c0008d7010008d7030008d7ffd7ffd7630008d7da0011d7000003d7ffd710000d
+d7ffd7ffd75b0008d7010008d7030008d7ffd7ffd7630009d7d60019d7ffd70f000ed7ff
+d7ffd75b0008d7010008d7030008d7ffd7ffd7630009d7d50007d7080008d7ffd710000e
+d7ffd7ffd75b0008d7010008d7030008d7ffd7ffd7640008d7d30006d70d0006d7ffd710
+000ed7ffd7ffd75b0008d7010008d7030008d7ffd7ffd7640008d7d20006d70f0005d7ff
+d710000ed7ffd7ffd75b0008d7010008d7030008d7ffd7ffd7640009d7d10005d7110004
+d7ffd70f000fd7ffd7ffd75b0008d7010008d7030008d7ffd7ffd7640009d7cf0006d712
+0003d7ffd710000fd7ffd7ffd75b0008d7010008d7030008d7ffd7ffd7650008d7ce0006
+d7130003d7ffd710000fd7ffd7ffd75b0008d7010008d7030008d7ffd7ffd7650009d7cc
+0006d7150002d7ffd70f0011d7ffd7ffd75a0008d7010008d7030008d7ffd7ffd7650009
+d7cc0005d7160002d7ffd70f0011d7ffd7ffd75a0008d7010008d7030008d7ffd7ffd766
+0008d7cb0006d7160001d7ffd7100011d7ffd7ffd75a0008d7020007d7030009d7ffd7ff
+d7650008d7ca0006d7170001d7ffd7100011d7ffd7ffd7590008d7030007d7040008d7ff
+d7ffd7650009d7c90006d7170001d7ffd70f0012d7ffd7ffd7590008d7030007d7040008
+d7ffd7ffd7650009d7c80006d72d0002d7140002d7060001d7110002d7c30012d7ffd7ff
+d7590008d7030007d7040008d7ffd7ffd7650009d7c80006d7290009d70b0008d7050004
+d70a000ad7c00012d7ffd7ffd7590008d7030007d7040008d7ffd7ffd765000ad7c60006
+d727000dd707000ad7040006d708000dd7be0012d7ffd7ffd75a0008d7030007d7040008
+d7ffd7ffd765000ad7c60006d7260004d7050004d7070009d7030007d7070004d7040005
+d7bd0012d7ffd7ffd75a0008d7030007d7040008d7ffd7ffd765000bd7c40006d7260004
+d7070003d70b0005d7030007d7060003d7060005d7bc0009d7000008d7ffd7ffd75a0007
+d7040007d7040008d7ffd7ffd765000bd7c40006d7240005d7080004d70a0005d7020008
+d7040004d7070005d7bc0009d7000008d7ffd7ffd75a0007d7040007d7040009d7ffd7ff
+d764000cd7c20007d7230005d70a0004d7090004d7020002d7000005d7030004d7080005
+d7bb0009d7010008d7ffd7ffd7590008d7040007d7050008d7ffd7ffd764000cd7c20006
+d7240005d70a0004d7090004d7020001d7020003d7030004d7090004d7bc0009d7010008
+d7ffd7ffd7590008d7040008d7040008d7ffd7ffd765000bd7c20006d7230005d70b0004
+d7090004d7010001d7030002d7030005d7090004d7bc0008d7020008d7ffd7ffd7590008
+d7040008d7040008d7ffd7ffd765000cd7c10006d7220005d70c0004d7080005d7000001
+d70b0004d7080006d7bb0009d7010009d7ffd7ffd7590008d7040008d7040008d7ffd7ff
+d765000cd7c10006d7210006d70b0006d7070004d7000002d70a0005d7070006d7bc0008
+d7020008d7ffd7ffd75a0007d7050008d7040008d7ffd7ffd765000dd7c00006d7210005
+d70c0006d7060008d70b0004d7070005d7bd0009d7020008d7ffd7ffd75a0007d7050008
+d7040008d7ffd7ffd766000cd7c00006d7200006d70c0006d7060007d70c0004d7050006
+d7be0008d7030008d7ffd7ffd75a0007d7050008d7040008d7ffd7ffd766000dd7bf0006
+d7200006d70c0006d7060006d70c0005d7030007d7be0009d7030008d7ffd7ffd75a0007
+d7050008d7040009d7ffd7ffd765000dd7bf0006d71f0006d70d0005d7070006d70c0004
+d7010008d7c00008d7040008d7fc0002d7810002d7d40008d7050008d7050008d7ffd7ff
+d765000ed7be0006d71f0006d70d0005d7060006d70c000dd7c20009d7040008d7fa0004
+d77f0004d7d40008d7050008d7050008d7ffd7ffd765000ed7be0006d71f0006d70d0005
+d7060006d70c000ad7c50008d7040008d7ab0014d7380006d70f0010d75c0006d70d0009
+d7140009d79d0007d7060008d7050008d7ffd7ffd765000fd7bd0006d71f0005d70d0006
+d7060005d70c0005d7ca0009d7040008d7ae0015d7330007d712000fd7590007d70f0007
+d7140006d7a00007d7060008d7050008d7f20002d7ffd770000fd7bc0007d71e0005d70d
+0005d7070005d70c0005d7c90009d7050008d7af0005d7070007d7350004d7130005d703
+0006d7300000d7280004d7110006d7120006d7a10007d7060008d7050008d7790006d703
+0001d7690004d7ffd76c0002d700000fd7bd0006d7160002d7040005d70c0005d7070005
+d70d0005d7c90009d7050008d7af0005d7090006d7350003d7130005d7040006d72f0000
+d7280004d7120005d7120006d7a10007d7060008d7050008d776000fd7670006d7ffd763
+0002d7030001d7030010d7bc0006d7150003d7040005d70c0005d7070005d70d0005d7c8
+0009d7060007d7b00005d70a0006d7340003d7130005d7050006d72d0001d7280004d712
+0006d7100006d7a20007d7060008d7050009d7740004d7040006d7670006d7ffd7620000
+d70c0011d7bc0006d7140002d7050005d70b0005d7080005d70d0005d70e0001d7b60009
+d7060008d7b00005d70b0005d7340003d7130005d7060005d72c0002d7280004d7120006
+d7100006d7a10008d7060008d7060008d7740004d7060004d7690004d7ffd75b0002d711
+0012d7bb0006d7120003d7060005d70a0006d7080004d70e0006d70c0003d7b40009d707
+0008d7b00005d70c0005d7330003d7130005d7070004d72c0002d7280004d7120007d70e
+0007d7a10007d7070008d7060008d7740003d7080003d76a0003d7ffd75a0000d7140012
+d7bc0006d7100003d7070005d70a0005d7080005d70f0005d70a0003d7b60009d7060009
+d7b00005d70d0004d7330003d7130005d7070005d72a0003d7280004d7120007d70e0007
+d7a10007d7070008d7060008d7730003d70a0002d76a0003d7ffd7520002d71b0012d7bc
+0007d70e0002d7080005d7090005d7090004d7100006d7080003d7b60009d7070008d7b1
+0005d70d0005d7320003d7130005d7070005d7290004d7280004d7120002d7000004d70c
+0002d7000004d7a10007d7070008d7060009d7710004d70a0002d76a0003d7ffd7510000
+d71e0013d7bc0007d70b0003d70a0005d7070005d70a0004d7110008d7020005d7b60009
+d7070009d7b10005d70e0004d7020007d7040006d7080006d70b0003d7130005d7070005
+d7080006d70c0002d7010003d702000ad7070005d70e0005d7000004d7120002d7000004
+d70c0002d7000004d70b0005d70b0002d7030004d7070003d70e0006d70c0001d7020003
+d700000ad7030007d7260008d7070008d7070008d7710005d70a0001d76a0003d7ffd74a
+0002d7230014d7bc0014d70d0005d7040005d70c0004d711000fd7b7000ad7070009d7b1
+0005d70e0005d7010007d7040006d707000ad7080003d7130005d7070005d706000ad707
+0005d7000012d704000ad70a000dd7120002d7010004d70a0002d7010004d709000ad705
+0005d7010008d7020008d70a000ad7070004d7010010d7030007d7260008d7060008d708
+0008d7710005d70a0001d76a0003d7ffd7490000d7260009d700000ad7bd0011d710000c
+d70d0004d714000cd7b7000ad7080009d7b10005d70e0005d7030005d7060004d7050004
+d7010006d7070003d7130005d7070004d7060004d7010005d7040007d7000012d7040003
+d7000006d7080003d7010008d7120002d7010004d70a0002d7010004d7080003d7010006
+d7020007d700000ad7000009d7090004d7010005d7040006d7010006d7000005d7090002
+d7280007d7070008d7080008d7710005d70a0001d76a0003d7ffd7420002d72c0014d7be
+000ed7130009d70f0004d7150009d7b9000ad7070009d7b20005d70e0006d7030004d707
+0003d7040003d7050004d7070003d7130005d7060005d7050004d7030004d704000fd701
+0004d7080002d7040004d7070003d7040006d7120002d7020004d7080002d7020004d707
+0003d7040004d7030006d7000016d7070003d7040004d7040006d7000007d7010004d709
+0001d7290007d7070008d7080009d7700006d7090001d7090008d70a0002d7020005d705
+0005d70b0007d70a0002d7020006d7080003d7030005d70c0007d70b0002d7020003d706
+0008d7f40002d7030001d72f0009d700000ad7c20007d7170005d72e0004d7bb000ad708
+0009d7b20005d70e0006d7030004d7070003d7040003d7060003d7070003d7130005d705
+0005d7050004d7050004d7060006d7000004d7010004d7070002d7060004d7050003d706
+0005d7120002d7020004d7080002d7020004d7060003d7060004d7040007d7030007d703
+0004d7060003d7060004d706000cd7010005d7070002d7280008d7070008d7090008d771
+0007d712000ad7060005d7010007d7030007d709000ad7060004d7010008d7070003d701
+0008d709000ad7080004d7010005d704000ad7f20000d7390015d7ffd7d6000bd707000a
+d7b20005d70f0005d7030004d7070003d7040003d7060003d7070003d7130005d7030006
+d7050004d7070004d7050005d7020002d7020004d7070002d7060005d7030004d7070004
+d7120002d7030004d7060002d7030004d7060003d7060004d7040005d7050005d7060003
+d7050004d7070004d7050005d7020002d7030004d7070002d7280008d7070008d7090008
+d7720008d7100003d7000006d7030012d7010009d7060004d7020005d7030006d700000a
+d7060003d700000ad7070005d7010005d7040006d7010006d7030002d7010006d7ea0002
+d73e0009d700000bd7ffd7d4000bd7080009d7b30005d70f0005d7030004d7070003d704
+0003d7060003d7070003d713000fd7060004d7070004d7050004d7090004d7060002d708
+0004d7030004d7070004d7120002d7030004d7060002d7030004d7050003d7070004d705
+0003d7070003d7070004d7040004d7070004d7050004d70b0003d7060002d7290008d707
+0008d7090008d772000ad70d0002d7040005d7020012d700000ad7060003d7040004d703
+0012d706000fd7070003d7050004d7030006d7000007d7010003d7040005d7e80000d742
+0009d700000ad7ffd7d4000ad708000ad7020002d7ad0005d70f0005d7030004d7070003
+d7040003d7060003d7070003d713000ed7070003d7090004d7040004d7090004d7060010
+d7020005d7070004d7120002d7040004d7040002d7040004d7050011d7040003d7070003
+d7070004d7040003d7090004d7040003d70c0004d7050002d7290008d7070008d7090009
+d772000ad70b0002d7060004d7050005d7040007d7040004d7040003d7060003d7050007
+d7030005d7050006d7030004d7060003d7060004d7060005d7010003d7010003d7060004
+d7e10002d7470009d701000ad7ffd7d2000ad7090009d7060000d7ac0005d70e0005d704
+0004d7070003d70e0004d7070003d7130005d70f0004d7090004d7040004d7090004d705
+0011d7020004d7080004d7120002d7040004d7040002d7040004d7050011d7040003d707
+0003d7070004d7030004d7090004d7040003d70d0003d7050001d7290008d7080008d709
+0009d774000ad7090002d7060005d7040004d7060005d7050004d7040004d7050004d704
+0005d7060005d7040004d7060004d7040004d7070004d7050004d7030001d7020003d706
+0005d7de0001d74b0009d701000ad7ffd7d0000ad709000ad70c0001d7a50005d70e0005
+d7040004d7070003d7090009d7070003d7130005d70f0004d7090004d7040004d7090004
+d7050012d7010004d7080004d7120002d7040005d7020003d7040004d7050011d7040003
+d7070003d7070004d7030004d7090004d7040003d70d0004d7030002d7290008d7080008
+d70a0008d775000ad7070002d7080004d7040004d7060004d7060004d7040003d7060004
+d7040004d7080004d7040003d7070004d7040003d7080004d7050004d7070003d7070005
+d7d70002d7510009d701000bd7ffd7ce000bd7090009d70f0001d7a30005d70e0005d704
+0004d7070003d7080005d7000003d7070003d7130005d70f0004d7090005d7030004d709
+0004d7050003d7100004d7080004d7120002d7050004d7020002d7050004d7050003d712
+0003d7070003d7070004d7030004d7090004d7040003d70e0003d7030002d7290008d708
+0008d70a0008d776000ad7060010d7040004d7060004d7060004d7040003d7060004d704
+0004d7080004d7040003d7070004d7030004d7080005d7040003d7080011d7d50001d755
+0009d701000ad7ffd7cd000bd709000ad7b50005d70e0005d7040004d7070003d7070004
+d7020003d7070003d7130005d70f0004d70a0004d7030004d7090004d7050004d70f0004
+d7080004d7120002d7050005d7000003d7050004d7050003d7120003d7070003d7070004
+d7030004d7090004d7040003d70e0004d7010002d72a0008d7080008d70a0009d7770009
+d7040011d7040004d7060004d7060004d70c0007d7040004d7080004d7040003d7070004
+d7030004d7080005d7040003d7080011d7cc0004d75b0009d702000ad7ffd7cb000bd70a
+0009d7160002d79c0005d70e0004d7050004d7070003d7050004d7040003d7070003d713
+0005d70f0004d70a0004d7030004d7090004d7050004d70f0004d7080004d7120002d706
+0004d7000002d7060004d7050004d7110003d7070003d7070004d7030004d7090004d704
+0003d70e0004d7010002d7290009d7080008d70a0009d7790008d7030003d7120004d706
+0004d7060004d709000ad7040004d7080004d7040003d7070004d7030004d7090004d704
+0003d7080003d7d30002d7650009d702000ad7ffd7c9000bd70a000ad7190000d79b0005
+d70e0004d7050004d7070003d7040003d7060003d7070003d7130005d70f0005d7090003
+d7040004d7090004d7050004d70b0000d7020004d7080004d7120002d7060008d7060004
+d7050004d70a0000d7050003d7070003d7070004d7030005d7080004d7040003d70f0004
+d7000001d72a0008d7090008d70b0008d77b0006d7030004d7110004d7060004d7060004
+d7080005d7000004d7040004d7090003d7040003d7070004d7030004d7090004d7040003
+d7080003d7d10001d7680009d703000ad7ffd7c7000bd70b0009d71f0002d7940005d70d
+0004d7060004d7070003d7040003d7060003d7070003d7130005d70f0005d7090003d704
+0004d7090004d7050005d70a0001d7010005d7070004d7120002d7070006d7070004d705
+0005d7090001d7040003d7070003d7070004d7030005d7080004d7040003d70f0007d72a
+0008d7090008d70b0008d76e0001d70b0006d7020004d7110004d7060004d7060004d706
+0005d7020004d7040004d7090003d7040003d7070004d7030004d7090004d7040003d708
+0003d7ca0002d76f0009d703000ad7ffd7c5000bd70b000ad7220001d7920005d70c0005
+d7060004d7070003d7030003d7070003d7070003d7130005d7100004d7090003d7040004
+d7090004d7060005d7080001d7020005d7070004d7120002d7070006d7070004d7050005
+d7090001d7040003d7070003d7070004d7030005d7080004d7040003d7100006d72a0008
+d7090008d70b0009d76d0001d70c0005d7020004d7110004d7060004d7060004d7050004
+d7040004d7040004d7090003d7040003d7070004d7030004d7090004d7040003d7080004
+d7c70001d7720009d703000bd7ffd7c3000bd70c0009d7b80005d70b0005d7070004d707
+0003d7030003d7070003d7070003d7130005d7100004d7080004d7040004d7090004d706
+0005d7080001d7020006d7060004d7120002d7080004d7080004d7050006d7070002d704
+0003d7070003d7070004d7030005d7080003d7050003d7100005d72a0009d7090008d70b
+0009d76d0002d70b0005d7020004d70b0000d7040004d7060004d7060004d7050003d705
+0004d7040004d7090003d7040003d7070004d7030004d7090004d7040003d7080004d70b
+0000d7ffd7300009d703000cd7ffd7c0000bd70c000ad7290002d78b0005d70a0006d707
+0004d7050005d7030004d7050004d7070003d7130005d7100005d7070003d7050004d709
+0004d7070005d7060002d7030005d7060004d7120002d7080004d7080004d7060006d705
+0002d7050003d7070003d7070004d7040005d7060004d7050003d7110004d72a0009d708
+0008d70d0008d76d0002d70c0004d7020005d7090001d7040004d7060004d7060004d704
+0003d7060004d7040004d7090003d7040003d7070004d7030004d7090004d7040003d708
+0005d7090001d7b30002d7790009d704000cd7ffd7be000bd70d0009d72d0000d78a0005
+d7080007d7090005d7010008d7000000d7000006d701000ad7030003d7130005d7110005
+d7050003d7060004d70a0004d7010002d701000ed7040007d7020006d7010000d70f0002
+d7090002d7090005d705000ed7050004d7070004d7060004d7050005d7050003d7060004
+d7100003d72b0008d7090008d70d0008d76d0002d70c0004d7030005d7080001d7040004
+d7060004d7060004d7030004d7060004d7040004d7090003d7040003d7070004d7030005
+d7080004d7040003d7080006d7080001d7b20000d77d0009d704000cd7ffd7bc000bd70d
+0009d7330002d7830008d7010008d70c000ad7000006d700000ad7000007d7020005d712
+0005d7120005d7030003d7070005d7090008d703000cd7060013d70e0003d7090002d709
+0005d706000cd7060005d7050005d7060004d7060005d7030003d7070004d7110002d72b
+0008d7090008d70d0009d76c0003d70b0004d7030005d7080001d7040004d7060004d706
+0004d7030004d7060004d7040004d7090003d7040003d7070004d7030005d7080003d705
+0003d7080006d7070002d7aa0002d7830009d705000cd7ffd7ba000bd70e0009d7360000
+d77e0016d70e0008d7010004d7030008d7010006d700000ad70c000dd70f000bd705000a
+d7070007d705000ad7080009d7000005d70c000bd7060000d706000dd7040009d704000a
+d701000ad700000ad704000bd705000ad70e0002d72a0009d7090008d70d0009d76c0003
+d70b0004d7040006d7040003d7040004d7060004d7060004d7030004d7040006d7010000
+d7010005d7070003d7050003d7070004d7040005d7060003d7060003d7090007d7040002
+d7aa0000d7870009d705000cd7ffd7b8000bd70e0009d73d0001d7770012d7120007d702
+0002d7060006d7020005d701000ad70c000dd7110008d706000ad7080006d7070006d70c
+0007d7000002d70f000bd7060000d706000dd7050007d705000ad701000ad700000ad705
+0008d707000ad70d0002d72b0009d7090008d70e0008d76c0005d7080004d705000ed705
+0004d7060004d7060004d7030006d701000ad7010005d7060003d7060003d7070004d705
+0005d7050003d7060004d709000dd7a40001d78e0009d705000cd7ffd7b6000bd70e000a
+d73f0001d7ffd7ee0002d72b0008d70a0008d70e0009d76b0006d7050004d708000cd705
+0005d7060004d7060005d7020013d7010006d7040003d7060005d7060005d7040006d703
+0003d7060005d70a000cd7a20001d7910009d705000cd7ffd7b4000cd70d000ad7ffd7ff
+d7300002d72b0009d7090008d70f0009d76b0010d70a000ad704000ad700000ad700000a
+d7010008d7010006d702000ed7050009d701000ad703000bd706000ad7080009d7ffd738
+0009d706000cd7ffd7b2000cd70e000ad7460002d7ffd7e60002d72b0009d7090008d710
+0008d76b0002d7020008d70e0006d706000ad700000ad700000ad7030005d7030004d703
+0004d7000006d7070009d701000ad7070005d708000ad70a0006d79d0002d7990009d706
+000cd7ffd7b0000cd70e000ad74a0000d7ffd7df0001d7020002d72c0008d70a0008d710
+0009d7d00004d7f70000d79d0009d706000cd7ffd7ae000cd70e000ad7500002d7ffd7d6
+0009d72b0009d70a0008d7100009d7d00004d7ef0002d7a3000ad706000dd7ffd7aa000d
+d70e000bd7530000d7ffd7d50008d72c0009d70a0008d7110008d7d00004d7ee0000d7a7
+000ad707000dd7ffd7a6000dd70f000bd7ffd7ffd72b0007d72d0008d70b0008d7110009
+d7cf0004d7ffd797000bd707000dd7ffd7a4000dd70f000bd75b0002d7ffd7cd0006d72d
+0009d70a0009d7110009d7cf0004d7e60002d7ae000ad708000ed7ffd7a0000ed710000a
+d75f0000d7ffd7cd0004d72e0009d70a0008d7130008d7cf0004d7e50000d7b1000bd709
+000dd7ffd79e000dd711000bd7650002d7ffd7f90008d70b0008d7130008d7cf0004d7dd
+0002d7b8000bd709000dd7ffd79c000dd711000bd7690000d7ffd7f80008d70b0008d713
+0009d7cb000ad7d90000d7bc000bd709000dd7ffd79a000dd711000bd7700001d7ffd7f0
+0009d70b0008d7130009d7cb000ad7d20001d7c3000bd709000ed7ffd796000ed711000b
+d7730001d7ffd7ee0009d70b0008d7140008d7ffd7a70001d7c6000bd709000ed7ffd794
+000ed712000ad7ffd7ffd7650008d70b0009d7140009d7ffd7ffd76f000cd70a000dd7ff
+d792000dd713000bd77b0002d7ffd7e50009d70b0008d7150009d7ffd79e0002d7ce000b
+d70b000dd7ffd790000dd713000bd77f0000d7ffd7e40009d70b0008d7160008d7ffd79d
+0000d7d2000bd70b000ed7ffd78c000ed713000bd7860002d7ffd7dc0008d70c0008d716
+0009d7ffd7940002d7d9000bd70b000fd7ffd788000fd714000ad78a0000d7ffd7da0009
+d70c0008d7160009d7ffd7930000d7dd000bd70c000ed7ffd786000ed715000ad7ffd7ff
+d7670009d70c0008d7160009d7ffd78c0001d7e4000bd70d000ed7ffd782000ed716000a
+d7920002d7ffd7d20008d70c0009d7170009d7ffd7890001d7e7000bd70d000ed7ffd780
+000ed716000bd7950000d7ffd7d00009d70c0008d7180009d7ffd7ffd774000bd70e000e
+d7ffd77c000ed716000cd79c0002d7ffd7c80009d70c0008d7180009d7ffd7810002d7f0
+000bd70e000fd7ffd778000fd716000cd7a00000d7ffd7c70008d70d0008d718000ad7ff
+d77f0000d7f4000bd70f000fd7ffd774000fd717000cd7a70001d7ffd7bf0009d70d0008
+d718000ad7ffd7770002d7fb000bd70f0010d7ffd7700010d717000cd7aa0001d7ffd7bd
+0009d70c0009d7190009d7ffd7760000d7ff000cd70e0010d7ffd76e0010d717000cd7ff
+d7ffd76b0008d70d0008d71a000ad7ffd7ffd777000cd70f0010d7ffd76a0010d717000d
+d7b30002d7ffd7b40009d70d0008d71a000ad7ffd76d0002d7ffd707000cd70f0011d7ff
+d7660011d717000dd7b70000d7ffd7b30008d70e0008d71a000bd7ffd76b0000d7ffd70b
+000dd70e0012d7ffd7620012d717000dd7be0002d7ffd7aa0009d70e0008d71a000bd7ff
+d7630002d7ffd712000dd70f0012d7ffd75e0012d718000dd7c20000d7ffd7a90009d70d
+0009d71a000bd7ffd7620000d7ffd716000dd7100012d7ffd75a0012d719000dd7ffd7ff
+d76e0008d70e0009d71b000bd7ffd75a0001d7ffd71d000dd7110012d7ffd7560012d71a
+000dd7ca0002d7ffd7a00009d70e0008d71c000bd7ffd7580001d7ffd721000dd7110012
+d7ffd7520012d71a000dd7cf0000d7ffd79f0008d70f0008d71c000bd7ffd7ffd77d000d
+d7110013d7ffd74e0012d71b000dd7d50002d7ffd7980008d70f0008d71c000cd7ffd74f
+0002d7ffd72a000dd7120014d7ffd7480013d71c000dd7d90001d7ffd7950009d70e0009
+d71c000cd7ffd74e0000d7ffd72f000cd7130014d7ffd7440013d71d000cd7e10001d7ff
+d78f0008d70f0009d71d000cd7ffd7450002d7ffd734000fd7130014d7ffd7400013d71d
+000dd7e40001d7ffd78c0009d70f0008d71e000cd7ffd7440000d7ffd7350012d7140014
+d7ffd73c0013d71d000ed7e70000d7ffd78b0008d7100008d71e000cd7ffd7ffd7790015
+d7150014d7ffd7380014d71d000ed7ed0002d7ffd7840008d7100008d71e000dd7ffd73b
+0002d7ffd7380018d7150014d7ffd7340014d71d000ed7f20001d7ffd7810009d70f0009
+d71e000dd7ffd73a0000d7ffd739001bd7160014d7ffd7300014d71e000ed7f90002d7ff
+d77a0008d7100009d71f000cd7ffd7330002d7ffd73c001fd7160015d7ffd72a0015d71e
+000fd7fd0001d7ffd7780008d7100008d720000dd7ffd7300001d7ffd73d0011d700000f
+d7170015d7ffd7260015d71f000fd7ffd7ffd7780008d7110008d720000dd7ffd72a0001
+d7ffd7420010d7030010d7170016d7ffd7200016d720000fd7ffd7050002d7ffd7700008
+d7100009d720000ed7ffd7270001d7ffd7420010d707000fd7180018d7ffd7180018d720
+000fd7ffd70a0001d7ffd76d0009d7100009d721000dd7ffd7260000d7ffd7420011d70a
+000fd7190019d7ffd7100019d722000ed7ffd7120002d7ffd7660008d7110008d722000d
+d7ffd71f0002d7ffd7450011d70d000fd71a001ad7ffd70a001ad723000ed7ffd7160001
+d7ffd7640008d7100009d722000ed7ffd71c0001d7ffd7460011d711000fd71b001ad7ff
+d704001ad724000ed7ffd71e0002d7ffd75c0008d7110009d723000dd7ffd7150002d7ff
+d74b0010d7140010d71b001ad7ffd7000019d725000fd7060000d7ffd71a0001d7ffd75a
+0008d7110008d724000ed7ffd7120001d7ffd74c0010d718000fd71d001ad7fa001ad725
+000fd7090001d7ffd7ffd7740009d7100009d724000ed7ffd7ffd75f0011d71b000fd71d
+001bd7f4001ad726000fd7ffd72c0002d7ffd7520008d7110009d725000ed7ffd70a0002
+d7ffd74e0011d71e0010d71e001cd7ec001bd7270010d7ffd7300001d7ffd74f0009d711
+0008d726000ed7ffd7080001d7ffd74f0011d7220010d71f001dd7e4001cd7280010d714
+0001d7ffd7210002d7ffd7480008d7110009d726000fd7ffd7000002d7ffd7540010d725
+0011d71f001ed7dd001ed7280011d7170001d7ffd7220001d7ffd7450009d7110009d727
+000ed7fe0001d7ffd7550011d7280011d720001fd7d5001fd7290011d7ffd7440001d7ff
+d73f0008d7120008d728000fd7f70001d7ffd7590011d72b0012d7210020d7cd0020d72a
+0012d7ffd7470001d7ffd73c0009d7120008d728000fd7f50001d7ffd7590011d72f0012
+d7220021d7c60020d72b0012d7220001d7ffd7260000d7ffd73b0008d7120009d7280010
+d7f30000d7ffd75a0010d7320013d7230022d7be0022d72b0013d7250001d7ffd7290002
+d7ffd7330009d7120009d729000fd7ec0002d7ffd75d0010d7360013d7240023d7b60023
+d72c0013d7ffd7560001d7ffd7310008d7130008d72a0010d7e90001d7ffd75e0011d739
+0013d7250025d7ac0025d72d0014d7ffd75d0002d7ffd7290009d7120009d72a0010d7e2
+0002d7ffd7620011d73d0013d7270027d7a00027d72f0014d7300000d7ffd7300001d7ff
+d7270008d7130009d72b0010d7df0001d7ffd7630011d7410013d7290029d7940029d731
+0014d7330001d7ffd7ffd7570009d7130008d72c0010d7ffd7ffd7440010d7450014d72a
+002bd788002bd7320015d7370000d7ffd7330002d7ffd71f0008d7130009d72c0011d7d7
+0002d7ffd7660010d7490014d72c002ed77a002ed7340015d7ffd7710001d7ffd71c0009
+d7130009d72d0010d7d50001d7ffd7670011d74c0015d72d0030d76e0030d7350016d7ff
+d7790002d7ffd7150008d7140008d72e0011d7cd0002d7ffd76b0011d7500015d7300034
+d75c0034d7380016d7420001d7ffd7390001d7ffd7120009d7130009d72e0011d7cb0001
+d7ffd76c0011d7540016d733003bd742003bd73b0016d7470001d7ffd73d0001d7ffd70c
+0008d7140009d72f0011d7c40001d7ffd7710010d7580016d73600b0d73e0016d7ffd78b
+0001d7ffd7090009d7140008d7300011d7c20001d7ffd7710011d75c0016d73700a8d73f
+0016d7ffd7900000d7ffd7080008d7140009d7300012d7c00000d7ffd7710011d7600017
+d73800a0d7400017d7540000d7ffd7410002d7ffd7000009d7140009d7310012d7b80002
+d7ffd7740011d7640017d73b0096d7430017d7570001d7ffd7420001d7fd0009d7140009
+d7320012d7b60001d7ffd7760010d7680018d73e008ad7460018d7ffd7a40002d7f60009
+d7140009d7330012d7ae0002d7ffd77a0010d76c0019d7450076d74d0019d7ffd7a90001
+d7f30009d7150008d7340012d7ac0001d7ffd77b0011d76f001bd74b0062d753001bd763
+0001d7ffd7ffd73b0008d7150009d7340013d7ffd7ffd7270011d774001cd74d0056d755
+001cd7680001d7ffd7490002d7eb0009d7150009d7350008d7000009d7a30002d7ffd77d
+0011d778001dd7540042d75c001dd7ffd7b90001d7e80009d7150009d7360013d7a10001
+d7ffd77f0010d77d001dd76c000cd774001dd7ffd7c20002d7e10009d7150009d7370008
+d7000009d7990002d7ffd7830011d781001cd7ea001cd7760001d7ffd74f0001d7de0009
+d7150009d7380008d7000009d7970001d7ffd7840011d786001cd7e4001dd77a0001d7ff
+d7530001d7d80009d7150009d7380009d7000009d78f0002d7ffd7880011d78a001ed7dd
+001dd7ffd7d50001d7d50009d7160009d7390008d7010009d78c0001d7ffd7890011d78f
+001fd7d5001fd7ffd7d90000d7d30009d7160009d73a0009d7000009d7ffd7ffd7170010
+d7940020d7cd0020d7880001d7ffd7560002d7cc0009d7160009d73b0008d7010009d784
+0002d7ffd78c0011d7990020d7c40021d78e0001d7ffd7570001d7c90009d7160009d73c
+0008d701000ad7810001d7ffd78d0011d79e0023d7b80023d7ffd7f20002d7c1000ad716
+0009d73c0009d7010009d77a0002d7ffd7910011d79f002ad7ac0025d7ffd7f90001d7bf
+0009d7170009d73d0008d7020009d7770001d7ffd7930010d7a10030d7a00027d7ffd7ff
+d7be0009d7170009d73e0008d7020009d7710001d7ffd7970010d7a2000ad7020029d795
+002ad7a20001d7ffd7600002d7b70009d7170009d73f0008d7020009d76e0001d7ffd797
+0011d7a2000ad7070029d78d002fd7a30001d7ffd7610001d7b40009d7170009d7400008
+d702000ad76c0000d7ffd7970011d7a3000ad70c0029d7850033d7ffd7ffd70d0002d7ac
+000ad7170009d7400009d7020009d7650002d7ffd79a0011d7a5000ad710002dd774002d
+d703000bd7ffd7ffd70f0001d7aa0009d717000ad7410008d702000ad7620001d7ffd79c
+0010d7a6000ad7150035d75c0035d708000bd7a60001d7ffd76b0001d7a3000ad7170009
+d7420009d7020009d75b0002d7ffd7a00011d7a6000ad71a003ed742003ed70d000ad7a8
+0001d7ffd76b0001d7a10009d717000ad7430008d7030009d7580001d7ffd7a10011d7a8
+000ad71e0048d7270047d712000ad7ffd7ffd7170000d79f0009d7180009d7440009d702
+000ad7ffd7f90011d7a9000ad72400aed717000bd7ffd7ffd71b0002d797000ad717000a
+d7440009d7030009d7500002d7ffd7a30011d7aa000ad72b00a2d71e000bd7ab0001d7ff
+d76f0001d7950009d718000ad7450009d702000ad74d0001d7ffd7a50010d7ab000ad732
+0096d725000ad7ad0001d7ffd7730002d78d000ad717000ad7460009d703000ad7450002
+d7ffd7a90011d7ac000ad738008ad72b000bd7ffd7ffd7250001d78a000ad718000ad747
+0009d703000ad7420001d7ffd7aa0011d7ad000ad740007cd733000bd7ffd7ffd7b0000a
+d718000ad7480009d703000ad73c0001d7ffd7ae0011d7ae000ad7470070d73a000bd7b0
+0001d7ffd7760002d782000ad718000ad7490009d703000ad7390001d7ffd7ae0011d7b0
+000ad751005cd745000ad7b20001d7ffd7770001d77f000ad718000ad74a0009d704000a
+d7370000d7ffd7af0010d7b1000ad75f0042d752000bd7ffd7ffd7310002d777000ad719
+000ad74b0009d703000bd72f0002d7ffd7b20011d7b1000ad76e0027d760000bd7ffd7ff
+d7330001d774000bd718000ad74c0009d704000ad72d0001d7ffd7b30011d7b30009d778
+0009d776000bd7b50001d7ffd7800001d76e000ad719000ad74d0009d704000ad7250002
+d7ffd7b70011d7b4000ad7780009d777000ad7b70001d7ffd7800001d76b000ad719000a
+d74e0009d705000ad7220001d7ffd7b90010d7b5000ad7790009d777000bd7ffd7ffd73b
+0000d769000ad71a000ad74f0009d704000ad7ffd7dc0011d7b5000ad77a0009d778000b
+d7ffd7ffd73f0002d762000ad719000ad7500009d705000ad71a0002d7ffd7bb0011d7b7
+000ad77a0009d779000ad7ffd7ffd7420001d75f000ad71a000ad7510009d705000ad717
+0001d7ffd7bc0011d7b8000ad77b0009d77a000ad7ba0000d7ffd78b0002d757000ad71a
+000ad7520009d705000bd70f0002d7ffd7c00011d7b9000ad77c0009d77a000bd7ba0001
+d7ffd78c0000d755000bd71a000ad7530009d705000ad70d0001d7ffd7c20010d7bb0009
+d77d0009d77b000bd7ffd7ffd74e0001d74e000ad71a000ad7540009d706000ad7060001
+d7ffd7c60011d7bb000ad77d0009d77c000ad7ffd7ffd7500001d74b000ad71b000ad755
+0009d705000bd7030001d7ffd7c60011d7bc000ad77e0009d77c000bd7be0001d7ffd7db
+000bd71a000ad7560009d706000bd7010000d7ffd7c60011d7bd000ad77f0009d77d000b
+d7bf0001d7ffd7930002d741000bd71b000ad7570009d706000ad7ffd7c70011d7bf000a
+d77f0009d77e000bd7ffd7ffd7570000d740000ad71b000ad758000ad706000ad7ffd7c5
+0011d7bf000ad7800009d77f000ad7ffd7ffd75d0002d737000ad71b000bd7590009d706
+000bd7ffd7c20011d7c0000ad7810009d77f000bd7c30001d7ffd7990000d735000bd71b
+000ad75a000ad706000bd7ffd7bf0011d7c20009d7820009d780000bd7c40001d7ffd7cd
+000bd71b000bd75b0009d707000ad7ffd7bd0011d7c3000ad7820009d781000bd7ffd7ff
+d7630002d72c000ad71c000ad75d0009d706000bd7c10001d74d0002d7a60010d7c4000a
+d7830009d782000ad7ffd7ffd7660000d72a000bd71b000ad75e000ad706000bd7aa0005
+d7040001d7060005d7490004d7a40011d7c50009d7840009d782000bd7c80001d7ffd7a0
+0002d721000bd71c000ad75f0009d707000bd7a6000bd7000002d7060005d7470006d7a2
+0011d7c6000ad7840009d783000bd7c90001d7ffd7a10000d71f000bd71c000ad760000a
+d707000ad7a50005d7020007d7060005d7460007d7a00011d7c7000ad7850009d784000a
+d7ffd7ffd7730001d718000ad71c000bd7610009d707000bd7a40003d7070004d7060005
+d7490004d79e0011d7c8000ad7860009d785000ad7ffd7ffd7740001d715000bd71c000a
+d762000ad706000cd7a20003d7080004d7070003d74a0004d79d0010d7ca000ad7860009
+d785000bd7cd0001d7f90003d7150003d7a2000bd71c000ad764000ad7050000d700000b
+d7a00004d7090003d7560004d79b0011d7ca000ad7870009d786000bd7ce0001d7a90010
+d73b0005d7130005d7910002d70b000bd71d000ad7650009d7050000d701000ad7a00004
+d70a0002d7560004d7990011d7cb000ad7880009d787000ad7ffd77a0012d7390005d713
+0005d7940000d70a000ad71d000ad766000ad7040000d702000ad79f0004d70a0002d756
+0004d7970011d7cd0009d7890009d787000bd7ffd77d0010d7370005d7130005d79a0002
+d701000ad71e0009d768000ad7030000d703000ad79e0005d70a0001d7560004d7950011
+d7ce000ad7890009d788000bd7d20000d7a90004d7040006d72c0001d7080004d7090000
+d7080005d79d000bd71e000ad768000ad7030000d703000bd79d0005d70a0001d7560004
+d7940011d7ce000ad78a0009d789000bd7d20000d7a80004d7060005d72b0001d7090001
+d70b0000d70a0001d79f000bd71e0009d76a000ad7020000d704000bd79c0006d7090001
+d7090002d70b0005d70c0002d7030004d70c0006d70a0004d7920011d7cf000ad78b0009
+d78a000ad7d30000d7a70004d7060005d72b0001d7160001d7ab000bd71e000ad76b0009
+d7020000d705000ad79c0008d7100005d7080010d7020004d7010008d708000bd7070004
+d7900011d7d1000ad78b0009d78a000bd7ffd77b0004d7070005d7290002d7160001d7ab
+000ad71e000ad76c000ad7010000d706000ad79c0009d70c0007d7070003d7040008d700
+0006d700000ad7060004d7010005d7070004d78e0011d7d2000ad78c0009d78b000bd7ff
+d77a0004d7070005d7280003d7150002d7aa000ad71f0009d76e000ad7000000d707000a
+d79c000ad70a0007d7070003d7040008d7000012d7050003d7050004d7060004d78d0010
+d7d3000ad78d0009d78c000bd7d50001d7a10004d7070005d7270004d7140003d7a9000a
+d71f000ad76e000ad7000000d707000bd79b000bd70c0004d7060003d7060004d7050007
+d7030005d7040003d7050004d7060004d78b0011d7d40009d78e0009d78d000ad7d70001
+d79f0004d7070005d7070004d70d0001d7040000d7030005d70a0002d7050004d70b0002
+d70c0002d70f0001d7050001d76f000bd71f0009d770000bd708000ad79d000bd70a0004
+d7060003d7060004d7060004d7060004d7040003d7050004d7060004d7890011d7d5000a
+d78e0009d78d000bd7ffd7780004d7070005d705000ad7070003d7020011d7030004d703
+000bd7040004d70a0008d7090003d7030005d76d000ad71f0009d771000bd709000ad79e
+000ad7090004d7050004d7060004d7060003d7070004d7040003d7060003d7060004d787
+0011d7d6000ad78f0009d78e000bd7ffd7770004d7070005d704000cd7040005d7010012
+d7010006d703000bd7020006d708000ad7070005d7010008d76b000ad7200009d772000a
+d70a000ad79e000ad7080004d7050004d7070003d7060003d7070004d7040003d7060003
+d7060004d7850011d7d80009d7900009d78f000ad7db0001d7990004d7070004d7040004
+d7030004d7030006d7000007d7010004d7050007d7060003d7060007d7070003d7030005
+d7040006d700000ad769000ad7200009d774000ad70a000ad79f0009d7070004d7050004
+d7070003d7060003d7070004d70e0004d7060004d7840011d7d8000ad7900009d790000a
+d7dc0001d7970004d7060005d7040003d7050004d7020000d700000dd7010004d7050000
+d7010004d7060003d7060000d7000005d7070003d7050004d7030000d7000008d7010006
+d767000ad720000ad774000ad70b000ad79f0008d7070004d7050004d7070003d7060003
+d7070004d7090009d7060004d7820011d7d9000ad7910009d790000bd7ffd7750004d705
+0005d7040004d7050004d7050005d7010003d7020004d7080004d7060003d7090004d706
+0003d7060005d7050005d7050004d766000ad7210009d776000ad70a000bd7a10006d706
+0004d7060003d7070003d7060003d7070004d7080005d7000003d7060004d7800011d7da
+000ad7920009d791000bd7ffd774000fd7050004d7050004d7050004d7090004d7080004
+d7060003d7090004d7050003d7080004d7050003d7070004d765000bd7020000d71c0009
+d777000bd70a000bd7930001d70a0006d7060004d7060004d7050003d7070003d7070004
+d7070004d7020003d7060004d77e0011d7dc0009d7930009d792000ad7e00001d791000d
+d7070004d7050004d7050003d70a0004d7080004d7060003d7090004d7040004d7080005
+d7040003d7070004d764000bd7030000d71b000ad778000ad70b000bd7920001d70b0006
+d7050004d7070004d7030003d7080003d7070004d7050004d7040003d7060004d77c0011
+d7dd000ad7930009d792000bd7e10001d78f000bd70a0002d7050005d7050003d70a0004
+d7080004d7060003d7090004d7040004d7090004d7040003d7070004d763000bd7040000
+d71b0009d77a000ad70b000ad7920001d70c0005d7050004d708000ad7090003d7070004
+d7040003d7060003d7060004d77b0011d7dd000ad7940009d793000bd7ffd7720004d718
+0007d7050003d70a0004d7080004d7060003d7090004d7040004d7090004d7040003d707
+0004d763000ad7050000d71a0009d77b000bd70b000ad7910002d70b0005d7050004d709
+0007d70b0003d7070004d7040003d7060003d7060004d7790011d7df0009d7950009d794
+000bd7ffd7710004d7160009d7050003d70a0004d7080004d7060003d7090004d7040004
+d7090004d7040003d7070004d762000ad7060000d719000ad77c000bd70b000ad7900002
+d70c0004d7050004d7070003d7010002d70c0003d7070004d7030003d7070003d7060004
+d7770011d7e0000ad7950009d795000ad7e50001d7890004d7130005d7010004d7050003
+d70a0004d7080004d7060003d7090004d7040004d7090004d7040003d7070004d761000a
+d721000ad77e000ad70c000ad78f0002d70c0003d7060004d7060002d7130003d7070004
+d7030003d7070003d7060004d7750011d7e1000ad7960009d795000bd7e60001d7870004
+d7120004d7030004d7050003d70a0004d7080004d7060003d7090004d7040004d7090004
+d7040003d7070004d760000ad7220009d77f000bd70c000ad78e0003d70a0004d7060004
+d7060002d7130003d7070004d7030004d7050004d7060004d7740010d7e2000ad7970009
+d796000bd7ffd76f0004d7110003d7050004d7050003d70a0004d7080004d7060003d709
+0004d7040004d7090004d7040003d7070004d75f000ad722000ad780000bd70b000bd78d
+0005d7080003d7070004d7050010d7060004d7060004d7030006d701000ad7020004d772
+0011d7e30009d7980009d797000bd7ffd76e0004d7100004d7050004d7050003d70a0004
+d7080004d7060003d7090004d7040004d7090004d7040003d7070004d75e000bd721000a
+d782000ad70c000bd78c0005d7060004d7070006d7040011d7040005d7060005d702000a
+d7000007d7020005d76f0011d7e4000ad7980009d798000ad7e90001d7820004d7100003
+d7060004d7050003d70a0004d7080004d7060003d7090004d7040004d7090004d7040003
+d7070004d75d000bd70a0000d7160009d784000ad70c000bd78b0010d706000ad7030012
+d700000ad700000ad7010008d7010006d700000ad76b0011d7e5000ad7990009d798000b
+d7ea0001d7800004d70f0004d7060004d7050003d70a0004d7080004d7060003d7090004
+d7040005d7080004d7040003d7070004d75c000bd70b0000d715000ad784000bd70c000b
+d78a0001d7020009d708000ad704001dd700000ad7020006d7020004d702000ad7690011
+d7e70009d79a0009d799000bd7ffd76c0004d70f0004d7060004d7050003d70a0004d708
+0004d7060004d7080004d7050005d7070003d7050003d7070004d75b000bd70c0000d714
+000ad786000ad70d000bd7b00002d70c0003d79f0011d7e7000ad79a0009d79a000ad7ff
+d76c0004d70f0005d7040005d7010001d7010004d7090004d7020002d7020004d7060004
+d7020001d7030004d7050005d7060004d7050003d7070004d75a000bd70d0000d7140009
+d788000ad70d000bd7ae0002d70e0002d79d0011d7e8000ad79b0009d79b000ad7ffd76b
+0004d7100013d7010004d7090009d7030004d7060009d7030004d7060005d7050003d706
+0004d7060004d759000bd70e0000d713000ad788000bd70d000ad7ae0002d70e0001d79c
+0011d7ea0009d79c0009d79b000bd7ed0001d7780008d70e0011d7020006d7090008d702
+0006d7050008d7030006d7060006d7010004d7050006d7050006d758000ad723000ad78a
+000bd70d000ad7ac0003d70d0002d79a0011d7eb0009d79d0009d79c000bd7ee0001d773
+000dd70d0008d7010004d701000ad7070006d702000ad7040006d702000ad706000ad705
+000ad700000ad755000ad723000bd78b000ad70e000ad7ab0004d70b0002d7990011d7ec
+000ad79d0009d79d000ad7ffd7810005d7030003d7170003d7150003d7170005d774000a
+d724000ad78c000bd70e000ad7aa0012d7990011d7ec000ad79e0009d79d000bd7ffd7ff
+d756000ad724000ad78e000bd70e000ad7aa0010d7980011d7ee0009d79f0009d79e000b
+d7f20001d7ffd75f000ad7130000d70f000bd78f000ad70e000bd7ab000dd7970011d7ef
+000ad79f0009d79f000bd7f30001d7ffd75c000bd7130000d70f000ad791000ad70e000b
+d7ac0009d7970011d7f0000ad7a00009d7a0000ad7ffd7ffd751000bd7140000d70e000a
+d792000bd70e000bd7ffd74c0010d7f20009d7a10009d7a0000bd7ffd7ffd74f000bd715
+0000d70d000bd793000bd70e000bd7ffd7490011d7f2000ad7a10009d7a1000bd7f70001
+d7ffd753000bd7160000d70c000bd795000ad70f000bd7ffd7460011d7f3000ad7a20009
+d7a2000bd7f80001d7ffd750000bd725000ad796000bd70f000bd7ffd7430011d7f4000a
+d7a30009d7a3000ad7ffd7ffd74a000bd725000bd797000bd70f000bd7ffd7400011d7f6
+0009d7a40009d7a3000bd7ffd7ffd748000bd725000bd799000bd70f000bd7ffd73e0011
+d7f6000ad7a40009d7a4000bd7fc0000d7ffd748000bd725000bd79b000ad710000bd7ff
+d73b0011d7f7000ad7a50009d7a5000ad7fd0001d7ffd745000bd71b0000d709000ad79c
+000bd710000bd7ffd7380011d7f90009d7a60009d7a6000ad7ffd7ffd743000bd71c0000
+d708000bd79d000bd710000bd7ffd7350011d7fa000ad7a60009d7a6000bd7ffd7ffd741
+000bd71d0000d707000bd79f000bd710000bd7ffd7320011d7fb000ad7a70009d7a7000b
+d7ffd7000001d7ffd73c000bd71f0000d705000bd7a1000ad711000bd7ffd7300011d7fb
+000ad7a80009d7a8000ad7ffd7020001d7ffd739000bd7200000d705000ad7a3000ad711
+000bd7ffd72d0011d7fd0009d7a90009d7a8000bd7ffd7ffd73c000bd727000ad7a5000a
+d711000bd7ffd72a0011d7fe000ad7a90009d7a9000bd7ffd7ffd73a000bd727000ad7a6
+000bd711000bd7ffd7270011d7ff000ad7aa0009d7aa000bd7ffd7050000d7ffd731000b
+d727000bd7a7000bd710000cd7ffd7250011d7ffd7000009d7ab0009d7ab000ad7ffd706
+0001d7ffd72e000cd726000bd7a9000ad711000cd7ffd7220011d7ffd701000ad7ab0009
+d7ab000bd7ffd7070000d7ffd72c000cd7240000d701000ad7ab000ad711000cd7ffd71f
+0011d7ffd702000ad7ac0009d7ac000bd7ffd7ffd733000cd7250000d700000ad7ad000a
+d711000cd7ffd71c0011d7ffd7040009d7ad0009d7ad000bd7ffd7ffd731000cd726000b
+d7ae000bd711000cd7ffd7190011d7ffd7050009d7ae0009d7ae000ad7ffd70a0001d7ff
+d723000cd727000bd7af000ad712000cd7ffd7170011d7ffd705000ad7ae0009d7ae000b
+d7ffd70b0001d7ffd720000cd728000ad7b1000ad712000cd7ffd7140011d7ffd706000a
+d7af0009d7af000bd7ffd7ffd72c000cd728000ad7b3000ad712000cd7ffd7110011d7ff
+d7080009d7b00009d7b0000ad7ffd7ffd72b000cd728000ad7b5000ad712000dd7ffd70d
+0011d7ffd709000ad7b00009d7b1000ad7ffd70f0001d7ffd716000dd728000ad7b7000a
+d712000dd7ffd70a0011d7ffd70a000ad7b10009d7b1000bd7ffd7100001d7ffd713000d
+d728000ad7b8000bd712000dd7ffd7080011d7ffd70b0009d7b20009d7b2000bd7ffd7ff
+d724000dd728000bd7b9000bd712000dd7ffd7050011d7ffd70c0009d7b30009d7b3000a
+d7ffd7ffd723000dd728000bd7bb000bd712000dd7ffd7020011d7ffd70d000ad7b30009
+d7b3000bd7ffd7140000d7ffd70b000dd728000bd7bd000ad713000dd7ff0011d7ffd70e
+000ad7b40009d7b4000bd7ffd7140001d7ffd708000dd729000ad7bf000ad713000dd7fd
+0011d7ffd70f0009d7b50009d7b5000bd7ffd7ffd71d000cd72a000ad7c1000ad714000d
+d7f90011d7ffd710000ad7b50009d7b6000ad7ffd7ffd71b000dd72a000ad7c3000ad714
+000dd7f60011d7ffd711000ad7b60009d7b6000bd7ffd7180000d7ff000dd72a000ad7c5
+000ad714000dd7f30011d7ffd7130009d7b70009d7b7000bd7ffd7180001d7fc000dd72a
+000ad7c6000bd714000dd7f00011d7ffd7140009d7b80009d7b8000bd7ffd7190000d7fa
+000dd72a000bd7c7000bd714000dd7ee0011d7ffd714000ad7b80009d7b9000ad7ffd7ff
+d714000cd72b000bd7c9000bd714000dd7eb0011d7ffd7160009d7b90009d7b9000bd7ff
+d7ffd712000cd72b000bd7cb000bd714000dd7e80011d7ffd7170009d7ba0009d7ba000b
+d7ffd71c0001d7f1000cd72b000bd7cd000bd715000dd7e40011d7ffd718000ad7ba0009
+d7bb000ad7ffd71e0001d7ed000dd72b000bd7cf000bd715000dd7e10012d7ffd718000a
+d7bb0009d7bc000ad7ffd7ffd70c000dd72b000bd7d1000ad716000dd7df0011d7ffd71a
+0009d7bc0009d7bc000bd7ffd7ffd70a000cd72d000ad7d3000ad716000dd7dc0011d7ff
+d71b000ad7bc0009d7bd000bd7ffd7ffd708000cd72d000ad7d5000ad716000dd7d90011
+d7ffd71c000ad7bd0009d7be000ad7ffd7210001d7e3000cd72d000ad7d7000ad716000e
+d7d50011d7ffd71e0009d7be0009d7be000bd7ffd7220001d7df000dd72d000ad7d9000a
+d716000ed7d30011d7ffd71e0009d7bf0009d7bf000bd7ffd7ffd702000dd72d000ad7da
+000bd717000dd7d00011d7ffd71f000ad7bf0009d7c0000bd7ffd7ffd700000cd72e000b
+d7db000bd717000dd7cd0011d7ffd720000ad7c00009d7c1000ad7ffd7ff000cd72e000b
+d7dd000bd717000dd7ca0011d7ffd7220009d7c10009d7c1000bd7ffd7250001d7d5000c
+d72e000bd7df000bd717000ed7c60011d7ffd723000ad7c10009d7c2000bd7ffd7260001
+d7d1000dd72e000bd7e1000bd717000ed7c40011d7ffd723000ad7c20009d7c3000bd7ff
+d7f8000dd72e000bd7e3000bd717000ed7c10011d7ffd7250009d7c30009d7c4000ad7ff
+d7f7000dd72e000bd7e5000bd718000dd7be0011d7ffd7260009d7c40009d7c4000bd7ff
+d7290000d7ca000cd72f000bd7e7000bd718000dd7bb0011d7ffd727000ad7c40009d7c5
+000bd7ffd7290001d7c7000cd72f000bd7e9000bd718000ed7b70012d7ffd7280009d7c5
+0009d7c6000ad7ffd72b0000d7c4000dd72f000bd7eb000bd718000ed7b50011d7ffd729
+0009d7c60009d7c7000ad7ffd7ef000dd72f000bd7ed000bd718000ed7b20011d7ffd72a
+000ad7c60009d7c7000bd7ffd7ed000dd72f000bd7ef000bd719000dd7af0011d7ffd72b
+000ad7c70009d7c8000bd7ffd72d0000d7bc000dd72f000bd7f1000bd719000dd7ac0011
+d7ffd72d0009d7c80009d7c9000ad7ffd72e0001d7b9000dd72f000bd7f3000bd719000e
+d7a80012d7ffd72d0009d7c90009d7c9000bd7ffd72f0000d7b6000dd730000bd7f5000b
+d719000ed7a60011d7ffd72e000ad7c90009d7ca000bd7ffd7e5000dd730000bd7f7000b
+d719000ed7a30011d78b0002d7a10009d7ca0009d7cb000bd7ffd7e3000dd730000bd7f8
+000cd71a000dd7a00011d78d0002d70c0004d78e0009d7cb0009d7cc000ad7ffd7320001
+d7ad000dd730000bd7fa000cd71a000ed79c0011d775000dd70a0002d709000cd789000a
+d7cb0009d7cc000bd7ffd7330001d7a9000ed730000bd7fc000cd71a000ed79a0011d776
+000dd70a0002d707000fd787000ad7cc0009d7cd000bd7ffd7340000d7a7000ed730000b
+d7fe000cd71a000ed7970011d77c0006d70d0002d7060004d7080003d7860009d7cd0009
+d7ce000bd7ffd7db000ed730000bd7ffd700000cd71a000fd7930011d77e0005d70d0002
+d7060004d70a0003d7840009d7ce0009d7cf000ad7ffd7d9000ed731000bd7ffd702000c
+d71b000ed7900011d7810004d70d0002d7050004d70c0003d782000ad7ce0009d7cf000b
+d7ffd7370001d79d000ed731000bd7ffd704000cd71b000ed78d0012d7820004d70d0001
+d7060004d70c0004d7810009d7cf0009d7d0000bd7ffd7380001d79a000ed731000bd7ff
+d706000cd71b000fd78a0011d7840004d70c0002d7050004d70e0004d77f0009d7d00009
+d7d1000ad7ffd7d3000fd731000bd7ffd708000dd71a000fd7870011d7860004d70c0002
+d7050004d70e0004d77e000ad7d00009d7d2000ad7ffd7d1000fd730000cd7ffd70a000d
+d71b000fd7830011d7880004d70c0001d7050004d7100004d77d0009d7d10009d7d2000b
+d7ffd7ce000fd731000cd7ffd70c000dd71b000fd7800011d78a0004d70b0002d7050004
+d7100004d77c0009d7d20009d7d3000bd7ffd73b0001d78e000fd731000cd7ffd70e000d
+d71b000fd77d0012d78b0004d70b0002d7050004d7100004d77b000ad7d20009d7d4000a
+d7b30002d7860001d78b000fd731000cd7ffd710000dd71c000fd77a0011d78d0004d70b
+0001d7050004d7110005d779000ad7d30009d7d4000bd763000ed73d0005d7ffd711000f
+d732000cd7ffd712000dd71c000fd7770011d78f0004d70a0002d7050004d7110005d779
+0009d7d40009d7d5000bd7620013d7380005d7ffd710000fd732000cd7ffd714000dd71d
+000ed7740011d7910004d70a0001d7060004d7110005d7780009d7d50009d7d6000bd764
+0011d7370005d78b0000d782000ed733000cd7ffd717000dd71c000fd7700012d7920004
+d70a0001d7050005d7110006d776000ad7d50009d7d7000ad7650005d7050005d7360005
+d78c0001d77e000fd732000cd7ffd71a000dd71d000ed76e0011d7940004d7090002d705
+0005d7120005d7760009d7d60009d7d7000bd7650004d7060005d7370002d78f0001d77b
+000ed733000cd7ffd71c000dd71d000ed76b0011d7960004d7090001d7060005d7120005
+d7750009d7d70009d7d8000bd7640004d7070005d7ffd746000ed733000cd7ffd71e000d
+d71d000fd7670011d7980004d7080002d7070004d7120004d775000ad7d70009d7d9000b
+d7630004d7080005d7ffd743000fd733000cd7ffd720000dd71e000ed7640011d79a0004
+d7080002d7070004d7110005d774000ad7d80009d7da000ad7630004d7080005d7ce0001
+d771000ed734000cd7ffd722000dd71e000fd7600012d79b0004d7080001d7080004d711
+0005d7740009d7d90009d7da000bd7620004d7080005d7d00001d76d000fd734000cd7ff
+d724000dd71f000ed75e0011d79d0004d7070002d7080004d7110004d7740009d7da0009
+d7db000bd7610004d7080005d7ffd73f000ed735000cd7ffd727000dd71e000fd75a0011
+d79f0004d7070001d7090005d7100004d773000ad7da0009d7dc000ad7610004d7080005
+d70b0007d70c0007d70d0002d70a0007d70c0002d7020005d7d7000fd734000cd7ffd72a
+000dd71f000fd7560011d7a10004d7070001d7090005d7100004d7730009d7db0009d7dd
+000ad7600004d7070006d70a000ad709000fd7030005d709000ad7070005d7010007d7d4
+000fd735000cd7ffd72c000dd71f000fd7530011d7a30004d7060002d70a0004d7100003
+d7730009d7dc0009d7dd000bd75f0004d7070005d70a0003d7010006d7070003d7030009
+d7000007d7080004d7010005d7040007d7000009d76e0001d761000fd735000cd7ffd72e
+000dd71f0010d74f0012d7a40004d7060001d70c0004d70e0004d772000ad7dc0009d7de
+000bd75e0004d7060005d70a0003d7040004d7060003d7050006d7020007d7070003d705
+0004d7030013d76f0001d75d0010d735000cd7ffd730000dd720000fd74d0011d7a60004
+d7060001d70d0003d70e0003d7730009d7dd0009d7df000ad75e0004d7040006d70a0003
+d7060003d7050003d7060004d7070004d7060004d7050004d7060005d7050004d7ce000f
+d736000cd7ffd732000ed71f0010d7490011d7a80004d7050002d70d0004d70c0003d773
+0009d7de0009d7df000bd75d000fd70b0002d7070004d7040003d7070003d7070004d705
+0004d7070004d7050004d7060004d7cc0010d735000dd7ffd734000ed720000fd7460011
+d7a90005d7050001d70f0004d70a0004d7720009d7df0009d7e0000bd75c000dd70c0003
+d7070004d7040003d7070004d7060004d7050004d7070004d7050004d7060004d7cb000f
+d736000dd7ffd737000dd7200010d7420012d7aa0005d7050001d7100004d7080004d772
+000ad7df0009d7e1000bd75b000dd70c0011d7020004d7070004d7060004d7050003d709
+0004d7040004d7070003d7760001d7500010d736000cd7ffd73a000dd721000fd7400011
+d7ab0008d7020001d7120007d7000007d7730009d7e00009d7e2000ad75b0004d7020006
+d70b0011d7020004d7070004d7060004d7040004d7090004d7040004d7070003d7780001
+d74d000fd737000cd7ffd73c000dd7210010d73c0011d7aa000dd7000001d714000cd774
+0009d7e10009d7e2000bd75a0004d7030005d70b0003d7110004d7060004d7060004d704
+0004d7090004d7040004d7070003d7c6000fd738000cd7ffd73e000ed7210010d7380011
+d7ffd753000ad7e10009d7e3000bd7590004d7030006d70a0003d7110004d7060003d707
+0004d7040004d7090005d7030004d7070003d7c40010d737000dd7ffd740000ed7210010
+d7350011d7ffd7550009d7e20009d7e4000bd7580004d7040006d7090003d7120003d705
+0003d7080004d7040004d7090005d7030004d7070003d77e0000d743000fd738000dd7ff
+d743000dd7220010d7310012d7ffd7550009d7e30009d7e5000ad7580004d7050005d709
+0003d7120004d7040002d7090004d7040004d7090005d7030004d7070003d77f0001d73f
+0010d738000cd7ffd746000dd7220010d72f0011d7ffd7560009d7e40009d7e5000bd757
+0004d7060005d7080003d70b0000d706000ad70a0004d7040005d7080004d7040004d707
+0003d7810000d73d000fd739000cd7ffd748000dd7230010d72b0011d7ffd757000ad7e4
+0009d7e6000bd7560004d7060005d7080004d70a0001d7050009d70b0004d7040005d708
+0004d7040004d7070003d7be0010d739000cd7ffd74a000ed7220010d7280011d7ffd759
+0009d7e50009d7e7000ad7560004d7070005d7070005d7090001d7040002d7130004d704
+0005d7080004d7040004d7070003d7bd000fd739000dd7ffd74d000dd7230010d7240011
+d7ffd75a0009d7e60009d7e8000ad7550004d7080005d7060005d7080002d7040002d713
+0004d7040005d7080003d7050004d7070003d7860000d7330010d739000cd7ffd750000d
+d7230011d7200012d7ffd75a000ad7e60009d7e8000bd7540004d7090005d7060007d703
+0003d7040004d7120004d7050005d7070003d7050004d7070003d7870001d72f0010d73a
+000cd7ffd752000dd7240010d71e0011d7ffd75c0009d7e70009d7e9000bd7530004d70a
+0005d705000ed7040010d7070004d7060005d7050003d7060004d7070003d7890001d72c
+000fd73b000cd7ffd754000dd7240011d71a0011d7ffd75d0009d7e80009d7ea000ad752
+0006d7090007d704000cd7050012d7050005d7070004d7020004d7060005d7060005d7b5
+0010d73b000cd7ffd757000dd7240010d7170011d7ffd75e0009d7e90009d7ea000bd74d
+000dd7070009d7030009d7070012d701000ad7070009d705000ad7010009d7b2000fd73b
+000cd7ffd75a000dd7240011d7130012d7ffd75e000ad7e90009d7eb000bd74c000dd708
+0008d7040007d70a0011d700000ad7080005d708000ad7010009d78c0001d7210010d73b
+000cd7ffd75c000dd7250011d7100011d7ffd7600009d7ea0009d7ec000bd7810002d70c
+0003d7c90001d71d0010d73c000cd7ffd75e000dd7250011d70d0011d7ffd7610009d7eb
+0009d7ed000ad7800002d70e0002d7e80010d73c000cd7ffd761000dd7250011d7090011
+d7ffd762000ad7eb0009d7ed000bd77f0002d70e0002d7e60010d73c000cd7ffd764000d
+d7260010d7060011d7ffd7640009d7ec0009d7ee000bd77d0004d70c0002d7e6000fd73d
+000cd7ffd766000dd7260011d7020012d7ffd7640009d7ed0009d7ef000bd77c0005d70a
+0002d7d10001d7110010d73d000cd7ffd768000ed7260023d7ffd765000ad7ed0009d7f0
+000ad77c0012d7d40001d70d0010d73d000dd7ffd76b000dd727001fd7ffd7670009d7ee
+0009d7f0000bd77c0011d7e30010d73d000cd7ffd76e000dd727001cd7ffd7680009d7ef
+0009d7f1000bd77d000cd7e40010d73e000cd7ffd770000ed7270019d7ffd7680009d7f0
+0009d7f2000ad77f0008d7e5000fd73e000dd7ffd773000dd7280015d7ffd769000ad7f0
+0009d7f3000ad7ffd76b0010d73e000dd7ffd775000ed7270012d7ffd76b0009d7f10009
+d7f3000bd7ffd7680010d73e000dd7ffd778000ed7280010d7ffd76a0009d7f20009d7f4
+000bd7ffd7660010d73e000dd7ffd77b000dd7290010d7ffd767000ad7f20009d7f5000a
+d7ffd7640010d73f000dd7ffd77d000ed7260013d7ffd7650009d7f30009d7f5000bd7ff
+d7610010d73f000dd7ffd780000ed7250015d7ffd7620009d7f40009d7f6000bd7ffd75e
+0011d73f000dd7ffd783000dd7240017d7ffd75f0009d7f50009d7f7000bd7ffd75b0011
+d740000dd7ffd785000ed7220019d7ffd75c000ad7f50009d7f8000ad7ffd7590012d73f
+000dd7ffd788000ed721001bd7ffd75a0009d7f60009d7f8000bd7ffd7560012d740000d
+d7ffd78b000dd7200008d7010012d7ffd7570009d747000ed7a00009d7f9000bd7ffd753
+0012d741000dd7ffd78d000ed71e0008d7020012d7ffd755000ad7470012d79c0009d7fa
+000ad7ffd7520012d740000ed7ffd78f000ed71d0008d7040012d7ffd7530009d74b0011
+d79a0009d7fb000ad7ffd74f0012d741000dd7ffd793000ed71b0008d7060012d7ffd750
+0009d74c0005d7050006d7210001d7750009d7fb000bd7ffd74c0012d741000ed7ffd795
+000ed71a0008d7080012d7ffd74d0009d74e0004d7060005d7210001d7750009d7fc000b
+d7ffd7490012d7020000d73e000ed7ffd797000fd7180008d70a0012d7ffd74b0009d74e
+0004d7070005d7200001d7750009d7fd000ad7ffd7470012d7040000d73c000ed7ffd79b
+000fd7160008d70c0012d7ffd7480009d74f0004d7080005d71e0002d7750009d7fd000b
+d7ffd7440012d7060000d73a000fd7ffd79d000fd7150008d70d0013d7ffd7450009d750
+0004d7080005d71d0003d7750009d7fe000bd7ffd7410013d7070000d739000fd7ffd79f
+0010d7130008d70f0013d7ffd742000ad7500004d7080005d71d0003d7750009d7ff000b
+d7ffd73e0013d7090000d737000fd7ffd7a3000fd7120008d7110013d7ffd7400009d751
+0004d7080005d71c0004d7750009d7ffd700000ad7ffd73c0013d743000fd7ffd7a50010
+d7100008d7130013d7ffd73d0009d7520004d7080005d70b0007d706000bd7050008d761
+0009d7ffd700000bd7ffd7390013d7430010d7ffd7a8000fd70f0008d7150013d7ffd73a
+0009d7530004d7080005d708000cd703000cd704000ad7600009d7ffd701000bd7ffd736
+0013d744000fd7ffd7ab0010d70d0008d7160014d7ffd7380009d7530004d7070005d709
+0003d7030004d7060004d7090002d7020005d75f0009d7ffd702000bd7ffd7330014d743
+0010d7ffd7ae000fd70c0008d7180014d7ffd7350009d7540004d7060005d7090003d705
+0004d7050004d7070003d7040005d75e0009d7ffd703000ad7ffd7310014d7120000d730
+000fd7ffd7b2000fd70a0008d71a0014d7ffd7320009d7550004d7030008d7090003d705
+0004d7050004d7060003d7060004d75e0009d7ffd703000bd7ffd72e0014d7140000d72e
+000fd7ffd7b50010d7080008d71c0014d7ffd72f000ad755000ed70c0003d7060003d705
+0004d7060003d7070004d75d0009d7ffd704000bd7ffd72b0014d7160000d72c0010d7ff
+d7b8000fd7070009d71d0014d7ffd72d0009d756000dd70d0003d7060003d7050004d706
+0002d7080004d75d0009d7ffd705000ad7ffd7290014d7180000d72b000fd7ffd7bb0010
+d7050009d71f0014d7ffd72a0009d757000dd70d0003d7050004d7050004d7060010d75d
+0009d7ffd706000ad7ffd7260014d7450010d7ffd7be000fd7040009d7210014d7ffd727
+000ad7570004d7020006d7130007d7050004d7050011d75d0009d7ffd706000bd7ffd723
+0014d746000fd7ffd7c10010d7020009d7230014d7ffd7250009d7580004d7030005d711
+0009d7050004d7050003d76b0009d7ffd707000bd7ffd7200014d7460010d7ffd7c4000f
+d7010009d7250014d7ffd7220009d7590004d7030006d70f0005d7000003d7050004d705
+0004d76a0009d7ffd708000ad7ffd71e0014d747000fd7ffd7c7001ad7270014d7ffd71f
+0009d75a0004d7040006d70c0004d7030003d7050004d7050004d76a0009d7ffd708000b
+d7ffd71b0014d7470010d7ffd7ca0018d7290014d7ffd71d0009d75a0004d7050005d70b
+0003d7050003d7050004d7050004d76a0009d7ffd709000bd7ffd7180014d7240000d721
+0010d7ffd7ce0016d72b0014d7ffd71a0009d75b0004d7060005d7090003d7060003d705
+0004d7050004d70b0000d75d0009d7ffd70a000bd7ffd7150014d7260000d720000fd7ff
+d7d10015d72d0014d7ffd7170009d75c0004d7060005d7080004d7060003d7050004d705
+0005d7090001d75d0009d7ffd70b000ad7ffd7130014d7280000d71e0010d7ffd7d40013
+d7300013d7ffd714000ad75c0004d7070006d7060003d7070003d7050004d7060005d708
+0001d75d0009d7ffd70b000bd7ffd7100013d72b0000d71d000fd7ffd7d70012d7320013
+d7ffd7120009d75d0004d7080006d7050004d7050004d7050004d7060006d7060002d75d
+0009d7ffd70c000bd7ffd70d0013d74a0010d7ffd7da0010d7340013d7ffd70f0009d75e
+0004d7090005d7050004d7040005d7020000d7010004d7030001d7000007d7040002d75e
+0009d7ffd70d000bd7ffd70a0013d74a0010d7ffd7dd0010d7350013d7ffd70c0009d75f
+0004d70a0005d7040006d701000ad7010005d7000002d702000ed75e0009d7ffd70e000a
+d7ffd7080013d74b0010d7ffd7e00010d7350014d7ffd7090009d75e0006d7090007d702
+000ad7000007d7010009d703000cd75f0009d7ffd70e000bd7ffd7040014d74b0010d7ff
+d7e4000fd7360014d7ffd7060009d75c000cd7070009d7000008d7010006d7030007d705
+0009d7610009d7ffd70f000bd7ffd7010014d74c000fd7ffd7e70010d7360014d7ffd703
+0009d75d000cd7080008d7020005d7020004d7060005d7080006d7620009d7ffd710000a
+d7ff0014d7370000d7130010d7ffd7e90011d7360015d7ff000ad7ffd70d0009d7ffd711
+000ad7fb0015d7390000d7110010d7ffd7eb0012d7380014d7fd0009d7ffd70e0009d7ff
+d711000bd7f80014d73c0000d7100010d7ffd7ec0014d7380014d7fa0009d7ffd70f0009
+d7ffd712000bd7f50014d73e0000d70e0010d7ffd7ee0015d7390014d7f70009d7ffd710
+0009d7ffd713000ad7f30014d74f000fd7ffd7f70010d7390015d7f40009d7ffd7100009
+d7ffd713000bd7ef0015d74f0010d7ffd7fa0010d73a0014d7f10009d7ffd7110009d7ff
+d714000bd7ec0014d7500010d7ffd7fd0010d73b0014d7ee0009d7ffd7120009d7ffd715
+000bd7e90014d7510010d7ffd7ffd7000010d73b0014d7ec0009d7ffd7120009d7ffd716
+000ad7e70014d7510010d7ffd7ffd7040010d73c0014d7e80009d7ffd7130009d7ffd716
+000bd7e30014d74c0000d7040010d7ffd7ffd7070011d73c0014d7e50009d7ffd7140009
+d7ffd717000bd7e00014d74e0000d7020011d7ffd7ffd70a0011d73c0015d7e10009d7ff
+d7150009d7ffd718000bd7dc0015d7500000d7000011d7ffd7ffd70d0012d73c0015d7df
+0009d7ffd7150009d7ffd719000ad7da0015d7520012d7ffd7ffd7100012d73d0014d7dc
+0009d7ffd7160009d7ffd719000bd7d70014d7530012d7ffd7ffd7140012d73d0015d7d8
+0009d7d80003d73a0009d7ffd71a000bd7d30015d7530012d7ffd7ffd7170012d73e0015
+d7d60009d72c0009d7130009d7820005d7390009d7450002d7140003d7920003d722000a
+d7d10015d7530013d7ffd7ffd71a0012d73e0016d7d20009d72d0009d7130009d7820005
+d7390013d7140009d7190005d7130004d7910004d723000ad7cd0016d7530013d7ffd7ff
+d71e0012d73f0015d7cf0009d7310007d7110007d7850005d7390013d7140009d7170007
+d7130005d7900005d722000bd7ca0015d7540013d7ffd7ffd7220012d73f0016d7cb0009
+d7320007d7110006d74e0001d7360004d7390009d7020007d7120006d71b0007d7130005
+d7900005d723000bd7c60016d7540013d7ffd7ffd7260012d73f0016d7c90009d7330007
+d70f0007d74e0001d7380000d73b0009d7040005d7120006d71e0004d7090000d7090003
+d7920003d725000ad7c40016d7540013d7ffd7ffd72a0012d73f0016d7c60009d7340007
+d70f0007d74e0001d7750009d7040006d7100006d71f0004d7090000d70a0001d7940001
+d726000bd7c10016d7540013d7ffd7ffd72e0012d7400016d7c20009d7350007d70e0008
+d74d0002d7750009d7040006d7100006d71f0004d7080001d7cb000bd7bd0016d7550013
+d7ffd7ffd7320012d7400016d7c00009d7350008d70d0008d74c0003d7750009d7040007
+d70e0007d71f0004d7080001d7cc000bd7ba0016d7550013d7ffd7ffd7360012d7400017
+d7bc0009d7360008d70c0009d74b0004d7750009d7040007d70e0007d71f0004d7070002
+d7cd000ad7b70017d7560012d7ffd7ffd73a0012d7410017d7b80009d7370002d7000005
+d70b0002d7000005d70c0003d70e0002d7040002d7100002d70b0005d70d0003d70e0002
+d7040002d70c0002d70d0003d7270009d7040008d70c0008d71f0004d7060003d7cd000b
+d7b30017d7570012d7ffd7ffd73e0012d7410017d7b60009d7370002d7000005d70a0003
+d7000005d70a0008d7090004d7030005d70b0008d706000cd7060008d7090004d7030005
+d7080004d7090009d7250009d7040002d7000004d70c0002d7000004d71f0004d7050004
+d70b0001d7090001d7040001d70d0001d7030001d70a0003d7130002d7100001d70e0004
+d7010001d7080004d7010001d7080001d7090001d7050001d7110002d700000bd7b00017
+d7570012d7ffd7ffd7420012d7410018d7b20009d7380002d7010005d7090002d7010005
+d709000ad7060006d7010007d70a000ad705000cd705000ad7060006d7010007d7060006
+d708000bd7240009d7040002d7000005d70a0003d7000004d7040006d7040007d7060004
+d703000bd7040003d7070003d7020006d7080003d7020004d7060009d70b0009d7090008
+d709000ad706000ad7060003d7070003d7030005d70c0013d7ac0018d7570012d7ffd7ff
+d7460012d7410019d7ae0009d7390002d7010005d7090002d7010005d7070004d7020005
+d7040007d7000009d7070004d7020005d7070004d7080004d7020005d7040007d7000009
+d7040007d7070003d7030005d7230009d7040002d7010004d70a0002d7010004d7040006
+d7040007d7060004d703000bd7020005d7050005d7010008d7050005d7010006d703000c
+d709000bd707000ad707000bd705000bd7040005d7050005d7010008d7080016d7a90019
+d7570012d7ffd7ffd74a0012d7420019d7aa0009d73a0002d7020004d7080002d7020005
+d7070003d7050004d7030000d7000009d7010005d7060003d7050004d7060004d7080003
+d7050004d7030000d7010008d7010005d7030000d7010004d7060003d7050004d7230009
+d7040002d7010005d7080003d7010004d7070003d7070004d7060004d7060003d7060006
+d7040006d700000ad7030006d7000007d7020003d7040004d7080003d7030004d7060003
+d7030004d7050003d7040003d7040003d7040003d7030006d7040006d700000ad7070003
+d704000ed7a50019d7580012d7ffd7ffd74e0012d742001ad7a70009d73a0002d7020005
+d7070002d7020005d7060003d7060004d7060005d7050004d7050003d7060004d7060004
+d7070003d7060004d7060005d7050004d7060004d7050003d7060004d7230009d7040002
+d7020004d7080002d7020004d7070003d7070004d7060004d7060003d7060000d7000004
+d7040000d7000011d7020000d700000cd7030003d7050004d7060003d7050004d7050001
+d7060004d7040002d7060002d7040002d7060002d7030000d7000004d7040000d7000008
+d7010005d7060003d706000ed7a1001ad7580012d7ffd7ffd7520012d742001ad7a40009
+d73b0002d7030004d7060002d7030005d7050004d7070004d7050004d7060004d7050003
+d7070004d7050004d7060004d7070004d7050004d7060004d7060004d7050003d7060004
+d7230009d7040002d7020005d7060003d7020004d7070003d7070004d7060004d7060003
+d7090003d7070006d7030005d7050005d7010003d7020003d7060005d7040003d7060004
+d7040002d7070004d7020003d7060002d7030003d7060002d7060003d7070005d7040005
+d7050003d706000ed79f001ad7580012d7ffd7ffd7560012d742001bd7a00009d73c0002
+d7030005d7050002d7030005d7050003d7080005d7040004d7070003d7040004d7070005
+d7040004d7060003d7080005d7040004d7070003d7060004d7050003d7070003d7230009
+d7040002d7030004d7060002d7030004d7070003d7070004d7060004d7060003d7090003
+d7070004d7060005d7040004d7080004d7070004d7040003d7060004d7040002d7070004
+d7020003d7070001d7030003d7070001d7060003d7070003d7070004d7040004d706000f
+d79b001bd7580012d7ffd7ffd75a0012d743001bd79d0009d73c0002d7040004d7040002
+d7040005d7050003d7090004d7040004d7070003d7040004d7080004d7040004d7060003
+d7090004d7040004d7070003d7060004d7050003d72f0009d7040002d7030005d7040003
+d7030004d7070003d7070004d7060004d7060003d7090003d7070003d7080004d7040003
+d7090003d7080005d7020004d7070003d7030003d7070004d7020004d7060001d7030004
+d7060001d7060003d7070003d7070004d7040004d707000fd797001bd7590012d7ffd7ff
+d75e0012d744001bd7990009d73d0002d7040004d7040002d7040005d7040004d7090004
+d7040004d7070003d7030005d7080004d7040004d7050004d7090004d7040004d7070003
+d7060004d7040004d72f0009d7040002d7040004d7040002d7040004d7070003d7070004
+d7060004d7060003d7090003d7070003d7080004d7040003d7080004d7090004d7020003
+d7100010d7030006d7030001d7040006d7030001d7060003d7070003d7070004d7040004
+d7070003d700000bd793001bd75a0012d7ffd7ffd7620012d744001bd7960009d73e0002
+d7050004d7020002d7050005d7040004d7090004d7040004d7070003d7030005d7080004
+d7040004d7050004d7090004d7040004d7070003d7060004d7040004d72f0009d7040002
+d7040005d7020003d7040004d7070003d7070004d7060004d7060003d7090003d7070003
+d7080004d7040003d7080004d7090004d7020003d7100011d7020008d7080008d70a0003
+d7070003d7070004d7040004d7070003d701000ad791001bd75a0012d7ffd7ffd7660012
+d745001bd7920009d73f0002d7050004d7020002d7050005d7040004d7090005d7030004
+d7070003d7030005d7080005d7030004d7050004d7090005d7030004d7070003d7060004
+d7040004d72f0009d7040002d7050004d7020002d7050004d7070003d7070004d7060004
+d7060003d7090003d7070003d7090004d7030003d7080004d7090004d7020003d7100003
+d7110009d7070009d7080003d7070003d7070004d7040004d7070003d701000bd78d001b
+d75b0012d7ffd7ffd76a0012d746001bd78f0009d73f0002d7060004d7000002d7060005
+d7040004d7090005d7030004d7070003d7030005d7090004d7030004d7050004d70a0004
+d7030004d7070003d7060004d7040004d72f0009d7040002d7050005d7000003d7050004
+d7070003d7070004d7060004d7060003d7090003d7070003d7090004d7030003d7080004
+d7090005d7010003d70f0004d7120009d7070009d7070003d7070003d7070004d7050003
+d7060004d702000bd789001bd75c0012d7ffd7ffd76e0012d747001bd78b0009d7400002
+d7060004d7000002d7060005d7040004d7090005d7030004d7070003d7030005d7090004
+d7030004d7050004d70a0004d7030004d7070003d7060004d7040004d72f0009d7040002
+d7060004d7000002d7060004d7070003d7070004d7060004d7060003d7090003d7070003
+d7090004d7030003d7080004d7090005d7010003d70f0004d7150006d70a0006d7070003
+d7070003d7070004d7060003d7050003d704000bd785001bd75d0012d7ffd7ffd7720012
+d748001bd7870009d7410002d7070006d7070005d7040005d7080004d7040004d7070003
+d7030005d7090003d7040004d7050005d7090003d7040004d7070003d7060004d7040004
+d70b0000d7220009d7040002d7060008d7060004d7070003d7070004d7060004d7060003
+d7090003d7070003d7090003d7040003d7080004d7090005d7010004d70f0003d7160006
+d70a0006d7060003d7070003d7070004d7060004d7030003d706000ad782001bd75e0012
+d7ffd7ffd7760012d748001cd7840009d7410002d7070006d7070005d7050004d7080004
+d7040004d7070003d7040004d7090003d7040004d7060004d7090003d7040004d7070003
+d7060004d7040004d70a0001d7220009d7040002d7070006d7070004d7070003d7070004
+d7060004d7060003d7090003d7070003d7090003d7040003d7080005d7080004d7020004
+d70b0000d7020003d70b0001d70a0005d70b0005d7050003d7070003d7070004d707000a
+d707000bd77e001cd75e0012d7ffd7ffd77a0012d749001cd7800009d7420002d7080004
+d7080005d7050004d7080004d7040004d7070003d7040004d7090003d7040004d7060004
+d7090003d7040004d7070003d7060004d7050004d7090001d7220009d7040002d7070006
+d7070004d7070003d7070004d7060004d7060003d7090003d7070003d7090003d7040003
+d7080005d7080004d7020004d70a0001d7020004d7090002d7010001d7070004d7020001
+d7070004d7050003d7070003d7070004d7070007d70b000bd77a001cd75f0012d7ffd7ff
+d77e0012d74a001cd77c0009d7430002d7080004d7080005d7050005d7070003d7050004
+d7070003d7050004d7070004d7040004d7060005d7070004d7040004d7070003d7060004
+d7050005d7060002d7230009d7040002d7080004d7080004d7070003d7070004d7060004
+d7060003d7090003d7070003d7090003d7040003d7080005d7080003d7030005d7080002
+d7020005d7080001d7020001d7080003d7020001d7080003d7050003d7070003d7070004
+d7050003d712000bd776001cd7600012d7ffd7ffd7820012d74b001cd7780009d7440002
+d7090002d7090005d7050005d7070003d7050004d7070003d7050004d7070003d7050004
+d7020002d7000005d7070003d7050004d7070003d7060004d7050008d7020003d7230009
+d7040002d7080004d7080004d7070004d7060004d7060004d7060004d7080003d7070003
+d7090002d7050003d7090005d7070003d7030006d7060002d7030006d7060002d7020002
+d7070003d7020002d7070003d7050003d7070003d7070004d7050002d714000ad772001d
+d7610012d7ffd7ffd7860012d74b001dd7750009d7440002d7090002d7090005d7060005
+d7050003d7060004d7070004d7040005d7050003d7060009d7020005d7050003d7060004
+d7070004d7050004d707000cd7240009d7040002d7090002d7090005d7060005d7030006
+d7060004d7060004d7020001d7030003d7070004d7070003d7050004d7080005d7060004
+d7040008d7010004d7040008d7010004d7020003d7060003d7020003d7060003d7050003
+d7070003d7070004d704000cd70b000bd76e001ed7600013d7ffd7ffd78a0013d74b001d
+d7710009d7430006d7080000d7090007d7070006d7000004d7060006d7050005d7060006
+d7010003d7080008d7040006d7010003d7060006d7050005d7040006d707000ad7250009
+d7030003d7090002d7090005d7060013d7030004d7060009d7030004d7060005d7050003
+d7060004d7090005d7050003d707000cd706000dd7030003d7050003d7030003d7050003
+d7060004d7060003d7070004d7040011d707000bd76a001ed7610013d7ffd7ffd78e0013
+d74c001dd76d0009d742000ad7060000d706000dd7060009d705000ad701000ad7050009
+d7090006d7080009d705000ad7010015d7060008d7260009d7020006d7080000d7080008
+d7060009d7000007d7020006d7050008d7030006d7050006d7020003d7060007d70a0006
+d7000004d709000ad708000bd7040006d7010003d7040006d7010003d7060006d7030006
+d7050006d7030012d707000ad767001ed7620013d7ffd7ffd7920013d74d001dd76a0009
+d7720005d7280004d70e0003d70a0005d7340003d7290015d7060000d706000dd7040007
+d7010005d702000ad7040006d702000ad703000cd706000ad709000ad70b0008d70b0008
+d705000bd705000bd705000ad7000009d701000ad7020012d707000ad763001ed7620014
+d7ffd7ffd7960013d74e001dd7660009d7ffd72e0009d72e0005d7020003d7160003d712
+0003d7010004d71f0005d7100003d70f0004d7080001d7010006d7060001d7010006d72c
+0002d704000ad707000bd75f001ed7630014d7ffd7ffd79a0013d74f001dd7620009d7ff
+d72f0009d7690003d7a80002d70e0001d708000bd75b001ed7640014d7ffd7ffd79e0014
+d74f001ed75e0008d7ffd7300009d7690003d7a80002d70e0001d709000ad757001fd765
+0014d7ffd7ffd7a20014d750001ed75a0009d7ffd7300009d7690003d7a70002d70e0002
+d709000bd753001fd7650015d7ffd7ffd7a60014d752001ed7550009d7ffd7310009d769
+0003d7a70003d70d0001d70b000bd74f001ed7670014d7ffd7ffd7ac0013d753001ed751
+0009d7ffd7320009d7690003d7a70006d7070004d70c000bd74a001fd7680014d7ffd7ff
+d7b00013d754001fd74d0009d7ffd7320009d7690003d7a70012d70e000ad747001fd769
+0014d7ffd7ffd7b40014d754001fd7490009d7ffd7330009d7680005d7a7000fd710000b
+d743001fd7690014d7ffd7ffd7b90014d755001fd7450009d7ffd7340009d765000ad7a7
+000cd712000bd73e0020d76a0014d7ffd7ffd7bd0015d7550020d7410008d7ffd7350009
+d765000ad7ab0004d717000bd73a0020d76a0015d7ffd7ffd7c20014d7560020d73d0009
+d7ffd7350009d7ffd73a000ad7370020d76b0015d7ffd7ffd7c60015d7570020d7380009
+d7ffd7360009d7ffd73a000bd7320020d76d0014d7ffd7ffd7cb0015d7580020d7340009
+d7ffd7370009d7ffd73b000bd72e0020d76d0015d7ffd7ffd7cf0016d7590020d7300009
+d7ffd7370009d7ffd73c000ad72a0020d76f0015d7ffd7ffd7d30016d75a0020d72c0009
+d7ffd7380009d7ffd73d000ad7250021d76f0016d7ffd7ffd7d80016d75b0020d7270009
+d7ffd7390009d7ffd73d000bd7210020d7710015d7ffd7ffd7dd0016d75c0020d7240009
+d7ffd7390009d7ffd73e000bd71c0020d7720016d7ffd7ffd7e10017d75c0021d71f0009
+d7ffd73a0009d7ffd73f000ad7180021d7730016d7ffd7ffd7e60016d75e0021d71a0009
+d7ffd73b0009d7ffd73f000bd7140020d7750016d7ffd7ffd7ea0017d75e0021d7170008
+d7ffd73c0009d7ffd740000bd70f0021d7750016d7ffd7ffd7ef0017d7600021d7120009
+d7ffd73c0009d7ffd741000bd70b0020d7770016d7ffd7ffd7f40017d7610020d70e0009
+d7ffd73d0009d7ffd742000ad7070021d7770017d7ffd7ffd7f80018d7620020d7090009
+d7ffd73e0009d7ffd742000bd7020021d7780017d7ffd7ffd7fd0018d7640020d7050009
+d7ffd73e0009d7ffd743002bd77a0017d7ffd7ffd7ffd7020018d7650020d7000009d7ff
+d73f0009d7ffd7440026d77b0018d7ffd7ffd7ffd7060019d7660026d7ffd7400009d7ff
+d7450021d77c0019d7ffd7ffd7ffd70a0019d7680021d7ffd7410009d7ffd7400022d77d
+0019d7ffd7ffd7ffd7100019d7690022d7ffd73c0009d7ffd73c0022d77e001ad7ffd7ff
+d7ffd714001ad76a0022d7ffd7380009d7ffd7380022d780001ad7ffd7ffd7ffd718001a
+d76c0022d7ffd7340009d7ffd7330023d781001bd7ffd7ffd7ffd71d001ad76d0023d7ff
+d72f0009d7ffd72f0023d782001bd7ffd7ffd7ffd723001ad76e0023d7ffd72b0009d7ff
+d72b0026d780001bd7ffd7ffd7ffd728001ad7700024d7ffd7260009d7ffd726002bd77e
+001ad7ffd7ffd7ffd72e001ad76e0028d7ffd7210009d7ffd7210024d7010009d77b001b
+d7ffd7ffd7ffd733001ad76b002dd7ffd71c0009d7ffd71c0025d7050009d778001bd7ff
+d7ffd7ffd739001ad7680008d7030025d7ffd7170009d7ffd7170025d70a0009d775001b
+d7ffd7ffd7ffd73f001ad7650008d7070027d7ffd7110009d7ffd7110027d70e0009d772
+001bd7ffd7ffd7ffd744001cd7610008d70b0028d7ffd70c0009d7ffd70c0028d7120009
+d76f001bd7ffd7ffd7ffd74a001cd75e0008d7100028d7ffd7070009d7ffd7070028d717
+0009d76c001bd7ffd7ffd7ffd750001cd75b0008d7140029d7ffd7020009d7ffd7020029
+d71b0009d769001bd7ffd7ffd7ffd756001cd7580008d719002ad7fc0009d7fc002ad720
+0009d765001dd7ffd7ffd7ffd75a001dd7550008d71e002bd7f60009d7f6002bd7250009
+d762001dd7ffd7ffd7ffd760001dd7520008d723002cd7f00009d7f0002cd72a0009d75f
+001dd7ffd7ffd7ffd766001ed74e0008d728002dd7ea0009d7ea002dd72f0009d75c001d
+d7ffd7ffd7ffd76c001ed74b0008d72e002dd7e40009d7e4002dd7350009d759001dd7ff
+d7ffd7ffd772001ed7480008d733002ed7de0009d7de002ed73a0009d756001dd7ffd7ff
+d7ffd778001ed7450008d738002fd7d80009d7d8002fd73f0009d753001dd7ffd7ffd7ff
+d77e001fd7410008d73d0031d7d10009d7d10031d7440009d74f001ed7ffd7ffd7ffd784
+001fd73e0008d7430033d7c90009d7c90033d74a0009d74c001ed7ffd7ffd7ffd78b001e
+d73b0008d7490036d7c00009d7c00036d7500009d748001fd7ffd7ffd7ffd791001fd737
+0008d74f0038d7b80009d7b80038d7560009d745001fd7ffd7ffd7ffd797001fd7340008
+d755003ad7b00009d7b0003ad75c0009d7410020d7ffd7ffd7ffd79d001fd7310008d75b
+003ed7a60009d7a6003ed7620009d73e0020d7ffd7ffd7ffd7a30020d72d0008d7610043
+d79b0009d79b0043d7680009d73b0020d7ffd7ffd7ffd7a90020d72a0008d7670048d790
+0009d7900048d76e0009d7370021d7ffd7ffd7ffd7af0020d7270008d76d004dd7850009
+d785004dd7740009d7340021d7ffd7ffd7ffd7b60020d7230008d7740051d77a0009d77a
+0051d77b0009d7300021d7ffd7ffd7ffd7bd0020d7200008d77b0055d76f0009d76f0055
+d7820009d72d0021d7ffd7ffd7ffd7c40020d71c0008d7830057d7650009d7650057d78a
+0009d7290021d7ffd7ffd7ffd7cb0021d7180008d78a005bd75a0009d75a005bd7910009
+d7250022d7ffd7ffd7ffd7d20021d7140008d7910065d7490009d7490065d7980009d721
+0022d7ffd7ffd7ffd7da0021d7100008d79a0072d7330009d7330072d7a10009d71d0022
+d7ffd7ffd7ffd7e10022d70c0008d7a500ff0041d7ac0009d7190023d7ffd7ffd7ffd7e8
+0022d7080008d7af00ff002dd7b60009d7150023d7ffd7ffd7ffd7ef0023d7040008d7ba
+00ff0017d7c10009d7110024d7ffd7ffd7ffd7f60023d7000008d7c700fdd7ce0009d70d
+0024d7ffd7ffd7ffd7fd002ad7d600dfd7dd0009d7090025d7ffd7ffd7ffd7ffd7040026
+d7e400c3d7eb0009d7050025d7ffd7ffd7ffd7ffd70c0024d7f100a5d7fa0009d7010025
+d7ffd7ffd7ffd7ffd7140025d7fb0087d7ffd709002dd7ffd7ffd7ffd7ffd71c0025d7ff
+d7060069d7ffd7180029d7ffd7ffd7ffd7ffd7230027d7ffd7300009d7ffd7470027d7ff
+d7ffd7ffd7ffd72b0027d7ffd72c0009d7ffd7430027d7ffd7ffd7ffd7ffd7330027d7ff
+d7280009d7ffd73f0027d7ffd7ffd7ffd7ffd73b0028d7ffd7230009d7ffd73a0028d7ff
+d7ffd7ffd7ffd7430028d7ffd71f0009d7ffd7360028d7ffd7ffd7ffd7ffd74b0029d7ff
+d71a0009d7ffd7310029d7ffd7ffd7ffd7ffd7530029d7ffd7160009d7ffd72d0029d7ff
+d7ffd7ffd7ffd75c0029d7ffd7110009d7ffd7280029d7ffd7ffd7ffd7ffd7650029d7ff
+d70d0009d7ffd7240029d7ffd7ffd7ffd7ffd76e0029d7ffd7080009d7ffd71f0029d7ff
+d7ffd7ffd7ffd7780029d7ffd7030009d7ffd71b0029d7ffd7ffd7ffd7ffd7800029d7ff
+0009d7ffd7170029d7ffd7ffd7ffd7ffd7890029d7fa0009d7ffd7120029d7ffd7ffd7ff
+d7ffd7920029d7f60009d7ffd70e0029d7ffd7ffd7ffd7ffd79b002ad7f00009d7ffd708
+002ad7ffd7ffd7ffd7ffd7a5002cd7e90009d7ffd701002cd7ffd7ffd7ffd7ffd7af002e
+d7e20009d7fa002ed7ffd7ffd7ffd7ffd7b90030d7db0009d7f30030d7ffd7ffd7ffd7ff
+d7c40031d7d40009d7ec0031d7ffd7ffd7ffd7ffd7cf0033d7cd0009d7e50033d7ffd7ff
+d7ffd7ffd7d90035d7c60009d7de0035d7ffd7ffd7ffd7ffd7e30037d7bf0009d7d70037
+d7ffd7ffd7ffd7ffd7ee0038d7b80009d7d00038d7ffd7ffd7ffd7ffd7fa0039d7b10009
+d7c90039d7ffd7ffd7ffd7ffd7ffd706003ad7aa0009d7c2003ad7ffd7ffd7ffd7ffd7ff
+d712003bd7a30009d7bb003bd7ffd7ffd7ffd7ffd7ffd71e003ed79a0009d7b2003ed7ff
+d7ffd7ffd7ffd7ffd72a0043d78f0009d7a70043d7ffd7ffd7ffd7ffd7ffd7360047d785
+0009d79c0048d7ffd7ffd7ffd7ffd7ffd742004cd77a0009d791004dd7ffd7ffd7ffd7ff
+d7ffd74f0050d76f0009d7860051d7ffd7ffd7ffd7ffd7ffd75d0054d7640009d77b0055
+d7ffd7ffd7ffd7ffd7ffd76b0058d7590009d7700058d7ffd7ffd7ffd7ffd7ffd77a005c
+d74e0009d765005cd7ffd7ffd7ffd7ffd7ffd7880066d73d0009d7540066d7ffd7ffd7ff
+d7ffd7ffd7980073d7270009d73e0073d7ffd7ffd7ffd7ffd7ffd7ac00ff0042d7ffd7ff
+d7ffd7ffd7ffd7c200ff002dd7ffd7ffd7ffd7ffd7ffd7d700ff0017d7ffd7ffd7ffd7ff
+d7ffd7ef00fdd7ffd7ffd7ffd7ffd7ffd7ffd70b00dfd7ffd7ffd7ffd7ffd7ffd7ffd728
+00c2d7ffd7ffd7ffd7ffd7ffd7ffd74a009cd7ffd7ffd7ffd7ffd7ffd7ffd7730070d7ff
+d7ffd7ffd7ffd7ffd7ffd7ab002cd7ffd7ffd7ffd7ffd7ffd7ffd7ffd7ffd7ffd7ffd75c
+
+%%EndData
+end
+%%PageTrailer
+%%Trailer
+%%BoundingBox: 0 213 495 508
+%%EOF
diff --git a/doc/user/rtemspie.gif b/doc/user/rtemspie.gif
new file mode 100644
index 0000000000..8341861b0d
--- /dev/null
+++ b/doc/user/rtemspie.gif
Binary files differ
diff --git a/doc/user/rtemspie.png b/doc/user/rtemspie.png
new file mode 100644
index 0000000000..f6245ff45f
--- /dev/null
+++ b/doc/user/rtemspie.png
Binary files differ
diff --git a/doc/user/rtmon.t b/doc/user/rtmon.t
new file mode 100644
index 0000000000..8ce6901c19
--- /dev/null
+++ b/doc/user/rtmon.t
@@ -0,0 +1,1183 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Open Issues
+@c - nicen up the tables
+@c - use math mode to print formulas
+@c
+
+@chapter Rate Monotonic Manager
+
+@cindex rate mononitonic tasks
+@cindex periodic tasks
+
+@section Introduction
+
+The rate monotonic manager provides facilities to
+implement tasks which execute in a periodic fashion. The
+directives provided by the rate monotonic manager are:
+
+@itemize @bullet
+@item @code{@value{DIRPREFIX}rate_monotonic_create} - Create a rate monotonic period
+@item @code{@value{DIRPREFIX}rate_monotonic_ident} - Get ID of a period
+@item @code{@value{DIRPREFIX}rate_monotonic_cancel} - Cancel a period
+@item @code{@value{DIRPREFIX}rate_monotonic_delete} - Delete a rate monotonic period
+@item @code{@value{DIRPREFIX}rate_monotonic_period} - Conclude current/Start next period
+@item @code{@value{DIRPREFIX}rate_monotonic_get_status} - Obtain status information on period
+@end itemize
+
+@section Background
+
+The rate monotonic manager provides facilities to
+manage the execution of periodic tasks. This manager was
+designed to support application designers who utilize the Rate
+Monotonic Scheduling Algorithm (RMS) to ensure that their
+periodic tasks will meet their deadlines, even under transient
+overload conditions. Although designed for hard real-time
+systems, the services provided by the rate monotonic manager may
+be used by any application which requires periodic tasks.
+
+@subsection Rate Monotonic Manager Required Support
+
+A clock tick is required to support the functionality provided by this manager.
+
+@subsection Rate Monotonic Manager Definitions
+
+@cindex periodic task, definition
+
+A periodic task is one which must be executed at a
+regular interval. The interval between successive iterations of
+the task is referred to as its period. Periodic tasks can be
+characterized by the length of their period and execution time.
+The period and execution time of a task can be used to determine
+the processor utilization for that task. Processor utilization
+is the percentage of processor time used and can be calculated
+on a per-task or system-wide basis. Typically, the task's
+worst-case execution time will be less than its period. For
+example, a periodic task's requirements may state that it should
+execute for 10 milliseconds every 100 milliseconds. Although
+the execution time may be the average, worst, or best case, the
+worst-case execution time is more appropriate for use when
+analyzing system behavior under transient overload conditions.
+
+@cindex aperiodic task, definition
+
+In contrast, an aperiodic task executes at irregular
+intervals and has only a soft deadline. In other words, the
+deadlines for aperiodic tasks are not rigid, but adequate
+response times are desirable. For example, an aperiodic task
+may process user input from a terminal.
+
+@cindex sporadic task, definition
+
+Finally, a sporadic task is an aperiodic task with a
+hard deadline and minimum interarrival time. The minimum
+interarrival time is the minimum period of time which exists
+between successive iterations of the task. For example, a
+sporadic task could be used to process the pressing of a fire
+button on a joystick. The mechanical action of the fire button
+ensures a minimum time period between successive activations,
+but the missile must be launched by a hard deadline.
+
+@subsection Rate Monotonic Scheduling Algorithm
+
+@cindex Rate Monotonic Scheduling Algorithm, definition
+@cindex RMS Algorithm, definition
+
+The Rate Monotonic Scheduling Algorithm (RMS) is
+important to real-time systems designers because it allows one
+to guarantee that a set of tasks is schedulable. A set of tasks
+is said to be schedulable if all of the tasks can meet their
+deadlines. RMS provides a set of rules which can be used to
+perform a guaranteed schedulability analysis for a task set.
+This analysis determines whether a task set is schedulable under
+worst-case conditions and emphasizes the predictability of the
+system's behavior. It has been proven that:
+
+@itemize @code{ }
+@b{RMS is an optimal static priority algorithm for
+scheduling independent, preemptible, periodic tasks
+on a single processor.}
+@end itemize
+
+RMS is optimal in the sense that if a set of tasks
+can be scheduled by any static priority algorithm, then RMS will
+be able to schedule that task set. RMS bases it schedulability
+analysis on the processor utilization level below which all
+deadlines can be met.
+
+RMS calls for the static assignment of task
+priorities based upon their period. The shorter a task's
+period, the higher its priority. For example, a task with a 1
+millisecond period has higher priority than a task with a 100
+millisecond period. If two tasks have the same period, then RMS
+does not distinguish between the tasks. However, RTEMS
+specifies that when given tasks of equal priority, the task
+which has been ready longest will execute first. RMS's priority
+assignment scheme does not provide one with exact numeric values
+for task priorities. For example, consider the following task
+set and priority assignments:
+
+@ifset use-ascii
+@example
+@group
++--------------------+---------------------+---------------------+
+| Task | Period | Priority |
+| | (in milliseconds) | |
++--------------------+---------------------+---------------------+
+| 1 | 100 | Low |
++--------------------+---------------------+---------------------+
+| 2 | 50 | Medium |
++--------------------+---------------------+---------------------+
+| 3 | 50 | Medium |
++--------------------+---------------------+---------------------+
+| 4 | 25 | High |
++--------------------+---------------------+---------------------+
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@sp 1
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\vrule\strut#&
+\hbox to 0.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 1.25in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 1.25in{\enskip\hfil#\hfil}&
+\vrule#\cr\noalign{\hrule}
+&\bf Task&& \bf Period && \bf Priority &\cr
+& && \bf (in milliseconds) && &\cr\noalign{\hrule}
+& 1 && 100 && Low &\cr\noalign{\hrule}
+& 2 && 50 && Medium &\cr\noalign{\hrule}
+& 3 && 50 && Medium &\cr\noalign{\hrule}
+& 4 && 25 && High &\cr\noalign{\hrule}
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=3 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=center><STRONG>Task</STRONG></TD>
+ <TD ALIGN=center><STRONG>Period (in milliseconds)</STRONG></TD>
+ <TD ALIGN=center><STRONG>Priority</STRONG></TD></TR>
+<TR><TD ALIGN=center>1</TD>
+ <TD ALIGN=center>100 </TD>
+ <TD ALIGN=center>Low</TD></TR>
+<TR><TD ALIGN=center>2</TD>
+ <TD ALIGN=center>50 </TD>
+ <TD ALIGN=center>Medium</TD></TR>
+<TR><TD ALIGN=center>3</TD>
+ <TD ALIGN=center>50 </TD>
+ <TD ALIGN=center>Medium</TD></TR>
+<TR><TD ALIGN=center>4</TD>
+ <TD ALIGN=center>25 </TD>
+ <TD ALIGN=center>High</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+RMS only calls for task 1 to have the lowest
+priority, task 4 to have the highest priority, and tasks 2 and 3
+to have an equal priority between that of tasks 1 and 4. The
+actual RTEMS priorities assigned to the tasks must only adhere
+to those guidelines.
+
+Many applications have tasks with both hard and soft
+deadlines. The tasks with hard deadlines are typically referred
+to as the critical task set, with the soft deadline tasks being
+the non-critical task set. The critical task set can be
+scheduled using RMS, with the non-critical tasks not executing
+under transient overload, by simply assigning priorities such
+that the lowest priority critical task (i.e. longest period) has
+a higher priority than the highest priority non-critical task.
+Although RMS may be used to assign priorities to the
+non-critical tasks, it is not necessary. In this instance,
+schedulability is only guaranteed for the critical task set.
+
+@subsection Schedulability Analysis
+
+@cindex RMS schedulability analysis
+
+RMS allows application designers to ensure that tasks
+can meet all deadlines, even under transient overload, without
+knowing exactly when any given task will execute by applying
+proven schedulability analysis rules.
+
+@subsubsection Assumptions
+
+The schedulability analysis rules for RMS were
+developed based on the following assumptions:
+
+
+@itemize @bullet
+@item The requests for all tasks for which hard deadlines
+exist are periodic, with a constant interval between requests.
+
+@item Each task must complete before the next request for it
+occurs.
+
+@item The tasks are independent in that a task does not depend
+on the initiation or completion of requests for other tasks.
+
+@item The execution time for each task without preemption or
+interruption is constant and does not vary.
+
+@item Any non-periodic tasks in the system are special. These
+tasks displace periodic tasks while executing and do not have
+hard, critical deadlines.
+@end itemize
+
+Once the basic schedulability analysis is understood,
+some of the above assumptions can be relaxed and the
+side-effects accounted for.
+
+@subsubsection Processor Utilization Rule
+
+@cindex RMS Processor Utilization Rule
+
+The Processor Utilization Rule requires that
+processor utilization be calculated based upon the period and
+execution time of each task. The fraction of processor time
+spent executing task index is Time(index) / Period(index). The
+processor utilization can be calculated as follows:
+
+@example
+@group
+Utilization = 0
+
+for index = 1 to maximum_tasks
+ Utilization = Utilization + (Time(index)/Period(index))
+@end group
+@end example
+
+To ensure schedulability even under transient
+overload, the processor utilization must adhere to the following
+rule:
+
+@example
+Utilization = maximum_tasks * (2(1/maximum_tasks) - 1)
+@end example
+
+As the number of tasks increases, the above formula
+approaches ln(2) for a worst-case utilization factor of
+approximately 0.693. Many tasks sets can be scheduled with a
+greater utilization factor. In fact, the average processor
+utilization threshold for a randomly generated task set is
+approximately 0.88.
+
+@subsubsection Processor Utilization Rule Example
+
+This example illustrates the application of the
+Processor Utilization Rule to an application with three critical
+periodic tasks. The following table details the RMS priority,
+period, execution time, and processor utilization for each task:
+
+@ifset use-ascii
+@example
+@group
+ +------------+----------+--------+-----------+-------------+
+ | Task | RMS | Period | Execution | Processor |
+ | | Priority | | Time | Utilization |
+ +------------+----------+--------+-----------+-------------+
+ | 1 | High | 100 | 15 | 0.15 |
+ +------------+----------+--------+-----------+-------------+
+ | 2 | Medium | 200 | 50 | 0.25 |
+ +------------+----------+--------+-----------+-------------+
+ | 3 | Low | 300 | 100 | 0.33 |
+ +------------+----------+--------+-----------+-------------+
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@sp 1
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\vrule\strut#&
+\hbox to 0.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 0.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 0.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 1.00in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 1.00in{\enskip\hfil#\hfil}&
+\vrule#\cr\noalign{\hrule}
+&\bf Task&& \bf RMS && \bf Period && \bf Execution &&\bf Processor&\cr
+& && \bf Priority && &&\bf Time &&\bf Utilization &\cr\noalign{\hrule}
+& 1 && High && 100 && 15 && 0.15 &\cr\noalign{\hrule}
+& 2 && Medium && 200 && 50 && 0.25 &\cr\noalign{\hrule}
+& 3 && Low && 300 && 100 && 0.33 &\cr\noalign{\hrule}
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=5 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=center><STRONG>Task</STRONG></TD>
+ <TD ALIGN=center><STRONG>RMS Priority</STRONG></TD>
+ <TD ALIGN=center><STRONG>Period</STRONG></TD>
+ <TD ALIGN=center><STRONG>Execution Time</STRONG></TD>
+ <TD ALIGN=center><STRONG>Processor Utilization</STRONG></TD></TR>
+<TR><TD ALIGN=center>1</TD>
+ <TD ALIGN=center>High</TD>
+ <TD ALIGN=center>100</TD>
+ <TD ALIGN=center>15</TD>
+ <TD ALIGN=center>0.15</TD></TR>
+<TR><TD ALIGN=center>2</TD>
+ <TD ALIGN=center>Medium</TD>
+ <TD ALIGN=center>200</TD>
+ <TD ALIGN=center>50</TD>
+ <TD ALIGN=center>0.25</TD></TR>
+<TR><TD ALIGN=center>3</TD>
+ <TD ALIGN=center>Low</TD>
+ <TD ALIGN=center>300</TD>
+ <TD ALIGN=center>100</TD>
+ <TD ALIGN=center>0.33</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+The total processor utilization for this task set is
+0.73 which is below the upper bound of 3 * (2(1/3) - 1), or
+0.779, imposed by the Processor Utilization Rule. Therefore,
+this task set is guaranteed to be schedulable using RMS.
+
+@subsubsection First Deadline Rule
+
+@cindex RMS First Deadline Rule
+
+If a given set of tasks do exceed the processor
+utilization upper limit imposed by the Processor Utilization
+Rule, they can still be guaranteed to meet all their deadlines
+by application of the First Deadline Rule. This rule can be
+stated as follows:
+
+For a given set of independent periodic tasks, if
+each task meets its first deadline when all tasks are started at
+the same time, then the deadlines will always be met for any
+combination of start times.
+
+A key point with this rule is that ALL periodic tasks
+are assumed to start at the exact same instant in time.
+Although this assumption may seem to be invalid, RTEMS makes it
+quite easy to ensure. By having a non-preemptible user
+initialization task, all application tasks, regardless of
+priority, can be created and started before the initialization
+deletes itself. This technique ensures that all tasks begin to
+compete for execution time at the same instant -- when the user
+initialization task deletes itself.
+
+@subsubsection First Deadline Rule Example
+
+The First Deadline Rule can ensure schedulability
+even when the Processor Utilization Rule fails. The example
+below is a modification of the Processor Utilization Rule
+example where task execution time has been increased from 15 to
+25 units. The following table details the RMS priority, period,
+execution time, and processor utilization for each task:
+
+@ifset use-ascii
+@example
+@group
+ +------------+----------+--------+-----------+-------------+
+ | Task | RMS | Period | Execution | Processor |
+ | | Priority | | Time | Utilization |
+ +------------+----------+--------+-----------+-------------+
+ | 1 | High | 100 | 25 | 0.25 |
+ +------------+----------+--------+-----------+-------------+
+ | 2 | Medium | 200 | 50 | 0.25 |
+ +------------+----------+--------+-----------+-------------+
+ | 3 | Low | 300 | 100 | 0.33 |
+ +------------+----------+--------+-----------+-------------+
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@sp 1
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\vrule\strut#&
+\hbox to 0.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 0.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 0.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 1.00in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 1.00in{\enskip\hfil#\hfil}&
+\vrule#\cr\noalign{\hrule}
+&\bf Task&& \bf RMS && \bf Period && \bf Execution &&\bf Processor&\cr
+& && \bf Priority && &&\bf Time &&\bf Utilization &\cr\noalign{\hrule}
+& 1 && High && 100 && 25 && 0.25 &\cr\noalign{\hrule}
+& 2 && Medium && 200 && 50 && 0.25 &\cr\noalign{\hrule}
+& 3 && Low && 300 && 100 && 0.33 &\cr\noalign{\hrule}
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=5 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=center><STRONG>Task</STRONG></TD>
+ <TD ALIGN=center><STRONG>RMS Priority</STRONG></TD>
+ <TD ALIGN=center><STRONG>Period</STRONG></TD>
+ <TD ALIGN=center><STRONG>Execution Time</STRONG></TD>
+ <TD ALIGN=center><STRONG>Processor Utilization</STRONG></TD></TR>
+<TR><TD ALIGN=center>1</TD>
+ <TD ALIGN=center>High</TD>
+ <TD ALIGN=center>100</TD>
+ <TD ALIGN=center>25</TD>
+ <TD ALIGN=center>0.25</TD></TR>
+<TR><TD ALIGN=center>2</TD>
+ <TD ALIGN=center>Medium</TD>
+ <TD ALIGN=center>200</TD>
+ <TD ALIGN=center>50</TD>
+ <TD ALIGN=center>0.25</TD></TR>
+<TR><TD ALIGN=center>3</TD>
+ <TD ALIGN=center>Low</TD>
+ <TD ALIGN=center>300</TD>
+ <TD ALIGN=center>100</TD>
+ <TD ALIGN=center>0.33</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+The total processor utilization for the modified task
+set is 0.83 which is above the upper bound of 3 * (2(1/3) - 1),
+or 0.779, imposed by the Processor Utilization Rule. Therefore,
+this task set is not guaranteed to be schedulable using RMS.
+However, the First Deadline Rule can guarantee the
+schedulability of this task set. This rule calls for one to
+examine each occurrence of deadline until either all tasks have
+met their deadline or one task failed to meet its first
+deadline. The following table details the time of each deadline
+occurrence, the maximum number of times each task may have run,
+the total execution time, and whether all the deadlines have
+been met.
+
+@ifset use-ascii
+@example
+@group
++----------+------+------+------+----------------------+---------------+
+| Deadline | Task | Task | Task | Total | All Deadlines |
+| Time | 1 | 2 | 3 | Execution Time | Met? |
++----------+------+------+------+----------------------+---------------+
+| 100 | 1 | 1 | 1 | 25 + 50 + 100 = 175 | NO |
++----------+------+------+------+----------------------+---------------+
+| 200 | 2 | 1 | 1 | 50 + 50 + 100 = 200 | YES |
++----------+------+------+------+----------------------+---------------+
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@sp 1
+@tex
+\centerline{\vbox{\offinterlineskip\halign{
+\vrule\strut#&
+\hbox to 0.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 0.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 0.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 0.75in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 2.00in{\enskip\hfil#\hfil}&
+\vrule#&
+\hbox to 1.00in{\enskip\hfil#\hfil}&
+\vrule#\cr\noalign{\hrule}
+&\bf Deadline&& \bf Task &&\bf Task&&\bf Task&&\bf Total &&\bf All Deadlines &\cr
+&\bf Time && \bf 1 &&\bf 2 &&\bf 3 &&\bf Execution Time &&\bf Net?&\cr\noalign{\hrule}
+& 100&& 1 && 1 && 1 && 25 + 50 + 100 = 175 && NO &\cr\noalign{\hrule}
+& 200&& 2 && 1 && 1 && 50 + 50 + 100 = 200 && YES &\cr\noalign{\hrule}
+}}\hfil}
+@end tex
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=6 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=center><STRONG>Deadline Time</STRONG></TD>
+ <TD ALIGN=center><STRONG>Task 1</STRONG></TD>
+ <TD ALIGN=center><STRONG>Task 2</STRONG></TD>
+ <TD ALIGN=center><STRONG>Task 3</STRONG></TD>
+ <TD ALIGN=center><STRONG>Total Execution Time</STRONG></TD>
+ <TD ALIGN=center><STRONG>All Deadlines Met?</STRONG></TD></TR>
+<TR><TD ALIGN=center>100</TD>
+ <TD ALIGN=center>1</TD>
+ <TD ALIGN=center>1</TD>
+ <TD ALIGN=center>1</TD>
+ <TD ALIGN=center>25 + 50 + 100 = 175</TD>
+ <TD ALIGN=center>NO</TD></TR>
+<TR><TD ALIGN=center>200</TD>
+ <TD ALIGN=center>2</TD>
+ <TD ALIGN=center>1</TD>
+ <TD ALIGN=center>1</TD>
+ <TD ALIGN=center>50 + 50 + 100 = 175</TD>
+ <TD ALIGN=center>YES</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+The key to this analysis is to recognize when each
+task will execute. For example at time 100, task 1 must have
+met its first deadline, but tasks 2 and 3 may also have begun
+execution. In this example, at time 100 tasks 1 and 2 have
+completed execution and thus have met their first deadline.
+Tasks 1 and 2 have used (25 + 50) = 75 time units, leaving (100
+- 75) = 25 time units for task 3 to begin. Because task 3 takes
+100 ticks to execute, it will not have completed execution at
+time 100. Thus at time 100, all of the tasks except task 3 have
+met their first deadline.
+
+At time 200, task 1 must have met its second deadline
+and task 2 its first deadline. As a result, of the first 200
+time units, task 1 uses (2 * 25) = 50 and task 2 uses 50,
+leaving (200 - 100) time units for task 3. Task 3 requires 100
+time units to execute, thus it will have completed execution at
+time 200. Thus, all of the tasks have met their first deadlines
+at time 200, and the task set is schedulable using the First
+Deadline Rule.
+
+@subsubsection Relaxation of Assumptions
+
+The assumptions used to develop the RMS
+schedulability rules are uncommon in most real-time systems.
+For example, it was assumed that tasks have constant unvarying
+execution time. It is possible to relax this assumption, simply
+by using the worst-case execution time of each task.
+
+Another assumption is that the tasks are independent.
+This means that the tasks do not wait for one another or
+contend for resources. This assumption can be relaxed by
+accounting for the amount of time a task spends waiting to
+acquire resources. Similarly, each task's execution time must
+account for any I/O performed and any RTEMS directive calls.
+
+In addition, the assumptions did not account for the
+time spent executing interrupt service routines. This can be
+accounted for by including all the processor utilization by
+interrupt service routines in the utilization calculation.
+Similarly, one should also account for the impact of delays in
+accessing local memory caused by direct memory access and other
+processors accessing local dual-ported memory.
+
+The assumption that nonperiodic tasks are used only
+for initialization or failure-recovery can be relaxed by placing
+all periodic tasks in the critical task set. This task set can
+be scheduled and analyzed using RMS. All nonperiodic tasks are
+placed in the non-critical task set. Although the critical task
+set can be guaranteed to execute even under transient overload,
+the non-critical task set is not guaranteed to execute.
+
+In conclusion, the application designer must be fully
+cognizant of the system and its run-time behavior when
+performing schedulability analysis for a system using RMS.
+Every hardware and software factor which impacts the execution
+time of each task must be accounted for in the schedulability
+analysis.
+
+@subsubsection Further Reading
+
+For more information on Rate Monotonic Scheduling and
+its schedulability analysis, the reader is referred to the
+following:
+
+@itemize @code{ }
+@item @cite{C. L. Liu and J. W. Layland. "Scheduling Algorithms for
+Multiprogramming in a Hard Real Time Environment." @b{Journal of
+the Association of Computing Machinery}. January 1973. pp. 46-61.}
+
+@item @cite{John Lehoczky, Lui Sha, and Ye Ding. "The Rate Monotonic
+Scheduling Algorithm: Exact Characterization and Average Case
+Behavior." @b{IEEE Real-Time Systems Symposium}. 1989. pp. 166-171.}
+
+@item @cite{Lui Sha and John Goodenough. "Real-Time Scheduling
+Theory and Ada." @b{IEEE Computer}. April 1990. pp. 53-62.}
+
+@item @cite{Alan Burns. "Scheduling hard real-time systems: a
+review." @b{Software Engineering Journal}. May 1991. pp. 116-128.}
+@end itemize
+
+@section Operations
+
+@subsection Creating a Rate Monotonic Period
+
+The @code{@value{DIRPREFIX}rate_monotonic_create} directive creates a rate
+monotonic period which is to be used by the calling task to
+delineate a period. RTEMS allocates a Period Control Block
+(PCB) from the PCB free list. This data structure is used by
+RTEMS to manage the newly created rate monotonic period. RTEMS
+returns a unique period ID to the application which is used by
+other rate monotonic manager directives to access this rate
+monotonic period.
+
+@subsection Manipulating a Period
+
+The @code{@value{DIRPREFIX}rate_monotonic_period} directive is used to
+establish and maintain periodic execution utilizing a previously
+created rate monotonic period. Once initiated by the
+@code{@value{DIRPREFIX}rate_monotonic_period} directive, the period is
+said to run until it either expires or is reinitiated. The state of the rate
+monotonic period results in one of the following scenarios:
+
+@itemize @bullet
+@item If the rate monotonic period is running, the calling
+task will be blocked for the remainder of the outstanding period
+and, upon completion of that period, the period will be
+reinitiated with the specified period.
+
+@item If the rate monotonic period is not currently running
+and has not expired, it is initiated with a length of period
+ticks and the calling task returns immediately.
+
+@item If the rate monotonic period has expired before the task
+invokes the @code{@value{DIRPREFIX}rate_monotonic_period} directive,
+the period will be initiated with a length of period ticks and the calling task
+returns immediately with a timeout error status.
+
+@end itemize
+
+@subsection Obtaining the Status of a Period
+
+If the @code{@value{DIRPREFIX}rate_monotonic_period} directive is invoked
+with a period of @code{@value{RPREFIX}PERIOD_STATUS} ticks, the current
+state of the specified rate monotonic period will be returned. The following
+table details the relationship between the period's status and
+the directive status code returned by the
+@code{@value{DIRPREFIX}rate_monotonic_period}
+directive:
+
+@itemize @bullet
+@item @code{@value{RPREFIX}SUCCESSFUL} - period is running
+
+@item @code{@value{RPREFIX}TIMEOUT} - period has expired
+
+@item @code{@value{RPREFIX}NOT_DEFINED} - period has never been initiated
+@end itemize
+
+Obtaining the status of a rate monotonic period does
+not alter the state or length of that period.
+
+@subsection Canceling a Period
+
+The @code{@value{DIRPREFIX}rate_monotonic_cancel} directive is used to stop
+the period maintained by the specified rate monotonic period.
+The period is stopped and the rate monotonic period can be
+reinitiated using the @code{@value{DIRPREFIX}rate_monotonic_period} directive.
+
+@subsection Deleting a Rate Monotonic Period
+
+The @code{@value{DIRPREFIX}rate_monotonic_delete} directive is used to delete
+a rate monotonic period. If the period is running and has not
+expired, the period is automatically canceled. The rate
+monotonic period's control block is returned to the PCB free
+list when it is deleted. A rate monotonic period can be deleted
+by a task other than the task which created the period.
+
+@subsection Examples
+
+The following sections illustrate common uses of rate
+monotonic periods to construct periodic tasks.
+
+@subsection Simple Periodic Task
+
+This example consists of a single periodic task
+which, after initialization, executes every 100 clock ticks.
+
+@page
+@example
+rtems_task Periodic_task(rtems_task_argument arg)
+@{
+ rtems_name name;
+ rtems_id period;
+ rtems_status_code status;
+
+ name = rtems_build_name( 'P', 'E', 'R', 'D' );
+
+ status = rtems_rate_monotonic_create( name, &period );
+ if ( status != RTEMS_STATUS_SUCCESSFUL ) @{
+ printf( "rtems_monotonic_create failed with status of %d.\n", rc );
+ exit( 1 );
+ @}
+
+
+ while ( 1 ) @{
+ if ( rtems_rate_monotonic_period( period, 100 ) == RTEMS_TIMEOUT )
+ break;
+
+ /* Perform some periodic actions */
+ @}
+
+ /* missed period so delete period and SELF */
+
+ status = rtems_rate_monotonic_delete( period );
+ if ( status != RTEMS_STATUS_SUCCESSFUL ) @{
+ printf( "rtems_rate_monotonic_delete failed with status of %d.\n", status );
+ exit( 1 );
+ @}
+
+ status = rtems_task_delete( SELF ); /* should not return */
+ printf( "rtems_task_delete returned with status of %d.\n", status );
+ exit( 1 );
+@}
+@end example
+
+
+The above task creates a rate monotonic period as
+part of its initialization. The first time the loop is
+executed, the @code{@value{DIRPREFIX}rate_monotonic_period}
+directive will initiate the period for 100 ticks and return
+immediately. Subsequent invocations of the
+@code{@value{DIRPREFIX}rate_monotonic_period} directive will result
+in the task blocking for the remainder of the 100 tick period.
+If, for any reason, the body of the loop takes more than 100
+ticks to execute, the @code{@value{DIRPREFIX}rate_monotonic_period}
+directive will return the @code{@value{RPREFIX}TIMEOUT} status.
+If the above task misses its deadline, it will delete the rate
+monotonic period and itself.
+
+@subsection Task with Multiple Periods
+
+This example consists of a single periodic task
+which, after initialization, performs two sets of actions every
+100 clock ticks. The first set of actions is performed in the
+first forty clock ticks of every 100 clock ticks, while the
+second set of actions is performed between the fortieth and
+seventieth clock ticks. The last thirty clock ticks are not
+used by this task.
+
+@page
+@example
+rtems_task Periodic_task(rtems_task_argument arg)
+@{
+ rtems_name name_1, name_2;
+ rtems_id period_1, period_2;
+ rtems_status_code status;
+
+ name_1 = rtems_build_name( 'P', 'E', 'R', '1' );
+ name_2 = rtems_build_name( 'P', 'E', 'R', '2' );
+
+ (void ) rtems_rate_monotonic_create( name_1, &period_1 );
+ (void ) rtems_rate_monotonic_create( name_2, &period_2 );
+
+ while ( 1 ) @{
+ if ( rtems_rate_monotonic_period( period_1, 100 ) == TIMEOUT )
+ break;
+
+ if ( rtems_rate_monotonic_period( period_2, 40 ) == TIMEOUT )
+ break;
+
+ /*
+ * Perform first set of actions between clock
+ * ticks 0 and 39 of every 100 ticks.
+ */
+
+ if ( rtems_rate_monotonic_period( period_2, 30 ) == TIMEOUT )
+ break;
+
+ /*
+ * Perform second set of actions between clock 40 and 69
+ * of every 100 ticks. THEN ...
+ *
+ * Check to make sure we didn't miss the period_2 period.
+ */
+
+ if ( rtems_rate_monotonic_period( period_2, STATUS ) == TIMEOUT )
+ break;
+
+ (void) rtems_rate_monotonic_cancel( period_2 );
+ @}
+
+ /* missed period so delete period and SELF */
+
+ (void ) rtems_rate_monotonic_delete( period_1 );
+ (void ) rtems_rate_monotonic_delete( period_2 );
+ (void ) task_delete( SELF );
+@}
+@end example
+
+The above task creates two rate monotonic periods as
+part of its initialization. The first time the loop is
+executed, the @code{@value{DIRPREFIX}rate_monotonic_period}
+directive will initiate the period_1 period for 100 ticks
+and return immediately. Subsequent invocations of the
+@code{@value{DIRPREFIX}rate_monotonic_period} directive
+for period_1 will result in the task blocking for the remainder
+of the 100 tick period. The period_2 period is used to control
+the execution time of the two sets of actions within each 100
+tick period established by period_1. The
+@code{@value{DIRPREFIX}rate_monotonic_cancel( period_2 )}
+call is performed to ensure that the period_2 period
+does not expire while the task is blocked on the period_1
+period. If this cancel operation were not performed, every time
+the @code{@value{DIRPREFIX}rate_monotonic_period( period_2, 40 )}
+call is executed, except for the initial one, a directive status
+of @code{@value{RPREFIX}TIMEOUT} is returned. It is important to
+note that every time this call is made, the period_2 period will be
+initiated immediately and the task will not block.
+
+If, for any reason, the task misses any deadline, the
+@code{@value{DIRPREFIX}rate_monotonic_period} directive will
+return the @code{@value{RPREFIX}TIMEOUT}
+directive status. If the above task misses its deadline, it
+will delete the rate monotonic periods and itself.
+
+@section Directives
+
+This section details the rate monotonic manager's
+directives. A subsection is dedicated to each of this manager's
+directives and describes the calling sequence, related
+constants, usage, and status codes.
+
+@c
+@c
+@c
+@page
+@subsection RATE_MONOTONIC_CREATE - Create a rate monotonic period
+
+@cindex create a period
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_rate_monotonic_create
+@example
+rtems_status_code rtems_rate_monotonic_create(
+ rtems_name name,
+ rtems_id *id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Rate_Monotonic_Create (
+ Name : in RTEMS.Name;
+ ID : out RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - rate monotonic period created successfully@*
+@code{@value{RPREFIX}INVALID_NAME} - invalid task name@*
+@code{@value{RPREFIX}TOO_MANY} - too many periods created
+
+@subheading DESCRIPTION:
+
+This directive creates a rate monotonic period. The
+assigned rate monotonic id is returned in id. This id is used
+to access the period with other rate monotonic manager
+directives. For control and maintenance of the rate monotonic
+period, RTEMS allocates a PCB from the local PCB free pool and
+initializes it.
+
+@subheading NOTES:
+
+This directive will not cause the calling task to be
+preempted.
+
+@c
+@c
+@c
+@page
+@subsection RATE_MONOTONIC_IDENT - Get ID of a period
+
+@cindex get ID of a period
+@cindex obtain ID of a period
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_rate_monotonic_ident
+@example
+rtems_status_code rtems_rate_monotonic_ident(
+ rtems_name name,
+ rtems_id *id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Rate_Monotonic_Ident (
+ Name : in RTEMS.Name;
+ ID : out RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - period identified successfully@*
+@code{@value{RPREFIX}INVALID_NAME} - period name not found
+
+@subheading DESCRIPTION:
+
+This directive obtains the period id associated with
+the period name to be acquired. If the period name is not
+unique, then the period id will match one of the periods with
+that name. However, this period id is not guaranteed to
+correspond to the desired period. The period id is used to
+access this period in other rate monotonic manager directives.
+
+@subheading NOTES:
+
+This directive will not cause the running task to be
+preempted.
+
+@c
+@c
+@c
+@page
+@subsection RATE_MONOTONIC_CANCEL - Cancel a period
+
+@cindex cancel a period
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_rate_monotonic_cancel
+@example
+rtems_status_code rtems_rate_monotonic_cancel(
+ rtems_id id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Rate_Monotonic_Cancel (
+ ID : in RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - period canceled successfully@*
+@code{@value{RPREFIX}INVALID_ID} - invalid rate monotonic period id@*
+@code{@value{RPREFIX}NOT_OWNER_OF_RESOURCE} - rate monotonic period not created by calling task
+
+@subheading DESCRIPTION:
+
+This directive cancels the rate monotonic period id.
+This period will be reinitiated by the next invocation of
+@code{@value{DIRPREFIX}rate_monotonic_period} with id.
+
+@subheading NOTES:
+
+This directive will not cause the running task to be
+preempted.
+
+The rate monotonic period specified by id must have
+been created by the calling task.
+
+@c
+@c
+@c
+@page
+@subsection RATE_MONOTONIC_DELETE - Delete a rate monotonic period
+
+@cindex delete a period
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_rate_monotonic_delete
+@example
+rtems_status_code rtems_rate_monotonic_delete(
+ rtems_id id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Rate_Monotonic_Delete (
+ ID : in RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - period deleted successfully@*
+@code{@value{RPREFIX}INVALID_ID} - invalid rate monotonic period id
+
+@subheading DESCRIPTION:
+
+This directive deletes the rate monotonic period
+specified by id. If the period is running, it is automatically
+canceled. The PCB for the deleted period is reclaimed by RTEMS.
+
+@subheading NOTES:
+
+This directive will not cause the running task to be
+preempted.
+
+A rate monotonic period can be deleted by a task
+other than the task which created the period.
+
+@c
+@c
+@c
+@page
+@subsection RATE_MONOTONIC_PERIOD - Conclude current/Start next period
+
+@cindex conclude current period
+@cindex start current period
+@cindex period initiation
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_rate_monotonic_period
+@example
+rtems_status_code rtems_rate_monotonic_period(
+ rtems_id id,
+ rtems_interval length
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Rate_Monotonic_Period (
+ ID : in RTEMS.ID;
+ Length : in RTEMS.Interval;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - period initiated successfully@*
+@code{@value{RPREFIX}INVALID_ID} - invalid rate monotonic period id@*
+@code{@value{RPREFIX}NOT_OWNER_OF_RESOURCE} - period not created by calling task@*
+@code{@value{RPREFIX}NOT_DEFINED} - period has never been initiated (only
+possible when period is set to PERIOD_STATUS)@*
+@code{@value{RPREFIX}TIMEOUT} - period has expired
+
+@subheading DESCRIPTION:
+
+This directive initiates the rate monotonic period id
+with a length of period ticks. If id is running, then the
+calling task will block for the remainder of the period before
+reinitiating the period with the specified period. If id was
+not running (either expired or never initiated), the period is
+immediately initiated and the directive returns immediately.
+
+If invoked with a period of @code{@value{RPREFIX}PERIOD_STATUS} ticks, the
+current state of id will be returned. The directive status
+indicates the current state of the period. This does not alter
+the state or period of the period.
+
+@subheading NOTES:
+
+This directive will not cause the running task to be preempted.
+
+@c
+@c
+@c
+@page
+@subsection RATE_MONOTONIC_GET_STATUS - Obtain status information on period
+
+@cindex get status of period
+@cindex obtain status of period
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_rate_monotonic_get_status
+@example
+rtems_status_code rtems_rate_monotonic_get_status(
+ rtems_id id,
+ rtems_rate_monotonic_period_status *status
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Rate_Monotonic_Get_Status (
+ ID : in RTEMS.ID;
+ Status : out RTEMS.Rate_Monotonic_Period_Status;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - period initiated successfully@*
+@code{@value{RPREFIX}INVALID_ID} - invalid rate monotonic period id@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - invalid address of status@*
+
+@subheading DESCRIPTION:
+
+This directive returns status information associated with
+the rate monotonic period id in the following data @value{STRUCTURE}:
+
+@ifset is-C
+@findex rtems_rate_monotonic_period_status
+@example
+typedef struct @{
+ rtems_rate_monotonic_period_states state;
+ rtems_unsigned32 ticks_since_last_period;
+ rtems_unsigned32 ticks_executed_since_last_period;
+@} rtems_rate_monotonic_period_status;
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+type Rate_Monotonic_Period_Status is
+ begin
+ State : RTEMS.Rate_Monotonic_Period_States;
+ Ticks_Since_Last_Period : RTEMS.Unsigned32;
+ Ticks_Executed_Since_Last_Period : RTEMS.Unsigned32;
+ end record;
+@end example
+@end ifset
+
+@c RATE_MONOTONIC_INACTIVE does not have RTEMS_ in front of it.
+
+If the period's state is @code{RATE_MONOTONIC_INACTIVE}, both
+ticks_since_last_period and ticks_executed_since_last_period
+will be set to 0. Otherwise, ticks_since_last_period will
+contain the number of clock ticks which have occurred since
+the last invocation of the
+@code{@value{DIRPREFIX}rate_monotonic_period} directive.
+Also in this case, the ticks_executed_since_last_period will indicate
+how much processor time the owning task has consumed since the invocation
+of the @code{@value{DIRPREFIX}rate_monotonic_period} directive.
+
+@subheading NOTES:
+
+This directive will not cause the running task to be preempted.
diff --git a/doc/user/schedule.t b/doc/user/schedule.t
new file mode 100644
index 0000000000..1aa2b4d72c
--- /dev/null
+++ b/doc/user/schedule.t
@@ -0,0 +1,407 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c This figure is not included:
+@c Figure 17-1 RTEMS Task State Transitions
+@c
+
+@chapter Scheduling Concepts
+
+@cindex scheduling
+@cindex task scheduling
+
+@section Introduction
+
+The concept of scheduling in real-time systems
+dictates the ability to provide immediate response to specific
+external events, particularly the necessity of scheduling tasks
+to run within a specified time limit after the occurrence of an
+event. For example, software embedded in life-support systems
+used to monitor hospital patients must take instant action if a
+change in the patient's status is detected.
+
+The component of RTEMS responsible for providing this
+capability is appropriately called the scheduler. The
+scheduler's sole purpose is to allocate the all important
+resource of processor time to the various tasks competing for
+attention. The RTEMS scheduler allocates the processor using a
+priority-based, preemptive algorithm augmented to provide
+round-robin characteristics within individual priority groups.
+The goal of this algorithm is to guarantee that the task which
+is executing on the processor at any point in time is the one
+with the highest priority among all tasks in the ready state.
+
+There are two common methods of accomplishing the
+mechanics of this algorithm. Both ways involve a list or chain
+of tasks in the ready state. One method is to randomly place
+tasks in the ready chain forcing the scheduler to scan the
+entire chain to determine which task receives the processor.
+The other method is to schedule the task by placing it in the
+proper place on the ready chain based on the designated
+scheduling criteria at the time it enters the ready state.
+Thus, when the processor is free, the first task on the ready
+chain is allocated the processor. RTEMS schedules tasks using
+the second method to guarantee faster response times to external
+events.
+
+@section Scheduling Mechanisms
+
+@cindex scheduling mechanisms
+
+RTEMS provides four mechanisms which allow the user
+to impact the task scheduling process:
+
+@itemize @bullet
+@item user-selectable task priority level
+@item task preemption control
+@item task timeslicing control
+@item manual round-robin selection
+@end itemize
+
+Each of these methods provides a powerful capability
+to customize sets of tasks to satisfy the unique and particular
+requirements encountered in custom real-time applications.
+Although each mechanism operates independently, there is a
+precedence relationship which governs the effects of scheduling
+modifications. The evaluation order for scheduling
+characteristics is always priority, preemption mode, and
+timeslicing. When reading the descriptions of timeslicing and
+manual round-robin it is important to keep in mind that
+preemption (if enabled) of a task by higher priority tasks will
+occur as required, overriding the other factors presented in the
+description.
+
+@subsection Task Priority and Scheduling
+
+@cindex task priority
+
+The most significant of these mechanisms is the
+ability for the user to assign a priority level to each
+individual task when it is created and to alter a task's
+priority at run-time. RTEMS provides 255 priority levels.
+Level 255 is the lowest priority and level 1 is the highest.
+When a task is added to the ready chain, it is placed behind all
+other tasks of the same priority. This rule provides a
+round-robin within priority group scheduling characteristic.
+This means that in a group of equal priority tasks, tasks will
+execute in the order they become ready or FIFO order. Even
+though there are ways to manipulate and adjust task priorities,
+the most important rule to remember is:
+
+@itemize @code{ }
+@item @b{The RTEMS scheduler will always select the highest
+priority task that is ready to run when allocating the processor
+to a task.}
+@end itemize
+
+@subsection Preemption
+
+@cindex preemption
+
+Another way the user can alter the basic scheduling
+algorithm is by manipulating the preemption mode flag
+(@code{@value{RPREFIX}PREEMPT_MASK}) of individual tasks. If preemption is disabled
+for a task (@code{@value{RPREFIX}NO_PREEMPT}), then the task will not relinquish
+control of the processor until it terminates, blocks, or
+re-enables preemption. Even tasks which become ready to run and
+possess higher priority levels will not be allowed to execute.
+Note that the preemption setting has no effect on the manner in
+which a task is scheduled. It only applies once a task has
+control of the processor.
+
+@subsection Timeslicing
+
+@cindex timeslicing
+@cindex round robin scheduling
+
+Timeslicing or round-robin scheduling is an
+additional method which can be used to alter the basic
+scheduling algorithm. Like preemption, timeslicing is specified
+on a task by task basis using the timeslicing mode flag
+(@code{@value{RPREFIX}TIMESLICE_MASK}). If timeslicing is enabled for a task
+(@code{@value{RPREFIX}TIMESLICE}), then RTEMS will limit the amount of time the task
+can execute before the processor is allocated to another task.
+Each tick of the real-time clock reduces the currently running
+task's timeslice. When the execution time equals the timeslice,
+RTEMS will dispatch another task of the same priority to
+execute. If there are no other tasks of the same priority ready
+to execute, then the current task is allocated an additional
+timeslice and continues to run. Remember that a higher priority
+task will preempt the task (unless preemption is disabled) as
+soon as it is ready to run, even if the task has not used up its
+entire timeslice.
+
+@subsection Manual Round-Robin
+
+@cindex manual round robin
+
+The final mechanism for altering the RTEMS scheduling
+algorithm is called manual round-robin. Manual round-robin is
+invoked by using the @code{@value{DIRPREFIX}task_wake_after}
+directive with a time interval of @code{@value{RPREFIX}YIELD_PROCESSOR}.
+This allows a task to give up the
+processor and be immediately returned to the ready chain at the
+end of its priority group. If no other tasks of the same
+priority are ready to run, then the task does not lose control
+of the processor.
+
+@subsection Dispatching Tasks
+
+@cindex dispatching
+
+The dispatcher is the RTEMS component responsible for
+allocating the processor to a ready task. In order to allocate
+the processor to one task, it must be deallocated or retrieved
+from the task currently using it. This involves a concept
+called a context switch. To perform a context switch, the
+dispatcher saves the context of the current task and restores
+the context of the task which has been allocated to the
+processor. Saving and restoring a task's context is the
+storing/loading of all the essential information about a task to
+enable it to continue execution without any effects of the
+interruption. For example, the contents of a task's register
+set must be the same when it is given the processor as they were
+when it was taken away. All of the information that must be
+saved or restored for a context switch is located either in the
+TCB or on the task's stacks.
+
+Tasks that utilize a numeric coprocessor and are
+created with the @code{@value{RPREFIX}FLOATING_POINT} attribute
+require additional operations during a context switch. These
+additional operations
+are necessary to save and restore the floating point context of
+@code{@value{RPREFIX}FLOATING_POINT} tasks. To avoid unnecessary save and restore
+operations, the state of the numeric coprocessor is only saved
+when a @code{@value{RPREFIX}FLOATING_POINT} task is dispatched and that task was not
+the last task to utilize the coprocessor.
+
+@section Task State Transitions
+
+@cindex task state transitions
+
+Tasks in an RTEMS system must always be in one of the
+five allowable task states. These states are: executing, ready,
+blocked, dormant, and non-existent.
+
+A task occupies the non-existent state before a
+@code{@value{DIRPREFIX}task_create} has been
+issued on its behalf. A task enters the
+non-existent state from any other state in the system when it is
+deleted with the @code{@value{DIRPREFIX}task_delete}
+directive. While a task occupies
+this state it does not have a TCB or a task ID assigned to it;
+therefore, no other tasks in the system may reference this task.
+
+When a task is created via the @code{@value{DIRPREFIX}task_create} directive
+it enters the dormant state. This state is not entered through
+any other means. Although the task exists in the system, it
+cannot actively compete for system resources. It will remain in
+the dormant state until it is started via the @code{@value{DIRPREFIX}task_start}
+directive, at which time it enters the ready state. The task is
+now permitted to be scheduled for the processor and to compete
+for other system resources.
+
+@ifset use-ascii
+@example
+@group
+ +-------------------------------------------------------------+
+ | Non-existent |
+ | +-------------------------------------------------------+ |
+ | | | |
+ | | | |
+ | | Creating +---------+ Deleting | |
+ | | -------------------> | Dormant | -------------------> | |
+ | | +---------+ | |
+ | | | | |
+ | | Starting | | |
+ | | | | |
+ | | V Deleting | |
+ | | +-------> +-------+ -------------------> | |
+ | | Yielding / +----- | Ready | ------+ | |
+ | | / / +-------+ <--+ \ | |
+ | | / / \ \ Blocking | |
+ | | / / Dispatching Readying \ \ | |
+ | | / V \ V | |
+ | | +-----------+ Blocking +---------+ | |
+ | | | Executing | --------------> | Blocked | | |
+ | | +-----------+ +---------+ | |
+ | | | |
+ | | | |
+ | +-------------------------------------------------------+ |
+ | Non-existent |
+ +-------------------------------------------------------------+
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@c @page
+@example
+@image{states,,3in}
+@c @group
+@c +-------------------------------------------------------------+
+@c | Non-existent |
+@c | +-------------------------------------------------------+ |
+@c | | | |
+@c | | | |
+@c | | Creating +---------+ Deleting | |
+@c | | -------------------> | Dormant | -------------------> | |
+@c | | +---------+ | |
+@c | | | | |
+@c | | Starting | | |
+@c | | | | |
+@c | | V Deleting | |
+@c | | +-------> +-------+ -------------------> | |
+@c | | Yielding / +----- | Ready | ------+ | |
+@c | | / / +-------+ <--+ \ | |
+@c | | / / \ \ Blocking | |
+@c | | / / Dispatching Readying \ \ | |
+@c | | / V \ V | |
+@c | | +-----------+ Blocking +---------+ | |
+@c | | | Executing | --------------> | Blocked | | |
+@c | | +-----------+ +---------+ | |
+@c | | | |
+@c | | | |
+@c | +-------------------------------------------------------+ |
+@c | Non-existent |
+@c +-------------------------------------------------------------+
+@c @end group
+@end example
+@end ifset
+
+@ifset use-html
+@html
+<IMG SRC="states.png" WIDTH=550 HEIGHT=400 ALT="RTEMS Task States">
+@end html
+@end ifset
+
+A task occupies the blocked state whenever it is
+unable to be scheduled to run. A running task may block itself
+or be blocked by other tasks in the system. The running task
+blocks itself through voluntary operations that cause the task
+to wait. The only way a task can block a task other than itself
+is with the @code{@value{DIRPREFIX}task_suspend} directive.
+A task enters the blocked state due to any of the following conditions:
+
+@itemize @bullet
+@item A task issues a @code{@value{DIRPREFIX}task_suspend} directive
+which blocks either itself or another task in the system.
+
+@item The running task issues a @code{@value{DIRPREFIX}message_queue_receive}
+directive with the wait option and the message queue is empty.
+
+@item The running task issues an @code{@value{DIRPREFIX}event_receive}
+directive with the wait option and the currently pending events do not
+satisfy the request.
+
+@item The running task issues a @code{@value{DIRPREFIX}semaphore_obtain}
+directive with the wait option and the requested semaphore is unavailable.
+
+@item The running task issues a @code{@value{DIRPREFIX}task_wake_after}
+directive which blocks the task for the given time interval. If the time
+interval specified is zero, the task yields the processor and
+remains in the ready state.
+
+@item The running task issues a @code{@value{DIRPREFIX}task_wake_when}
+directive which blocks the task until the requested date and time arrives.
+
+@item The running task issues a @code{@value{DIRPREFIX}region_get_segment}
+directive with the wait option and there is not an available segment large
+enough to satisfy the task's request.
+
+@item The running task issues a @code{@value{DIRPREFIX}rate_monotonic_period}
+directive and must wait for the specified rate monotonic period
+to conclude.
+@end itemize
+
+A blocked task may also be suspended. Therefore,
+both the suspension and the blocking condition must be removed
+before the task becomes ready to run again.
+
+A task occupies the ready state when it is able to be
+scheduled to run, but currently does not have control of the
+processor. Tasks of the same or higher priority will yield the
+processor by either becoming blocked, completing their
+timeslice, or being deleted. All tasks with the same priority
+will execute in FIFO order. A task enters the ready state due
+to any of the following conditions:
+
+@itemize @bullet
+
+@item A running task issues a @code{@value{DIRPREFIX}task_resume}
+directive for a task that is suspended and the task is not blocked
+waiting on any resource.
+
+@item A running task issues a @code{@value{DIRPREFIX}message_queue_send},
+@code{@value{DIRPREFIX}message_queue_broadcast}, or a
+@code{@value{DIRPREFIX}message_queue_urgent} directive
+which posts a message to the queue on which the blocked task is
+waiting.
+
+@item A running task issues an @code{@value{DIRPREFIX}event_send}
+directive which sends an event condition to a task which is blocked
+waiting on that event condition.
+
+@item A running task issues a @code{@value{DIRPREFIX}semaphore_release}
+directive which releases the semaphore on which the blocked task is
+waiting.
+
+@item A timeout interval expires for a task which was blocked
+by a call to the @code{@value{DIRPREFIX}task_wake_after} directive.
+
+@item A timeout period expires for a task which blocked by a
+call to the @code{@value{DIRPREFIX}task_wake_when} directive.
+
+@item A running task issues a @code{@value{DIRPREFIX}region_return_segment}
+directive which releases a segment to the region on which the blocked task
+is waiting and a resulting segment is large enough to satisfy
+the task's request.
+
+@item A rate monotonic period expires for a task which blocked
+by a call to the @code{@value{DIRPREFIX}rate_monotonic_period} directive.
+
+@item A timeout interval expires for a task which was blocked
+waiting on a message, event, semaphore, or segment with a
+timeout specified.
+
+@item A running task issues a directive which deletes a
+message queue, a semaphore, or a region on which the blocked
+task is waiting.
+
+@item A running task issues a @code{@value{DIRPREFIX}task_restart}
+directive for the blocked task.
+
+@item The running task, with its preemption mode enabled, may
+be made ready by issuing any of the directives that may unblock
+a task with a higher priority. This directive may be issued
+from the running task itself or from an ISR.
+
+A ready task occupies the executing state when it has
+control of the CPU. A task enters the executing state due to
+any of the following conditions:
+
+@item The task is the highest priority ready task in the
+system.
+
+@item The running task blocks and the task is next in the
+scheduling queue. The task may be of equal priority as in
+round-robin scheduling or the task may possess the highest
+priority of the remaining ready tasks.
+
+@item The running task may reenable its preemption mode and a
+task exists in the ready queue that has a higher priority than
+the running task.
+
+@item The running task lowers its own priority and another
+task is of higher priority as a result.
+
+@item The running task raises the priority of a task above its
+own and the running task is in preemption mode.
+
+@end itemize
diff --git a/doc/user/sem.t b/doc/user/sem.t
new file mode 100644
index 0000000000..dd51266892
--- /dev/null
+++ b/doc/user/sem.t
@@ -0,0 +1,832 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Semaphore Manager
+
+@cindex semaphores
+@cindex binary semaphores
+@cindex counting semaphores
+@cindex mutual exclusion
+
+@section Introduction
+
+The semaphore manager utilizes standard Dijkstra
+counting semaphores to provide synchronization and mutual
+exclusion capabilities. The directives provided by the
+semaphore manager are:
+
+@itemize @bullet
+@item @code{@value{DIRPREFIX}semaphore_create} - Create a semaphore
+@item @code{@value{DIRPREFIX}semaphore_ident} - Get ID of a semaphore
+@item @code{@value{DIRPREFIX}semaphore_delete} - Delete a semaphore
+@item @code{@value{DIRPREFIX}semaphore_obtain} - Acquire a semaphore
+@item @code{@value{DIRPREFIX}semaphore_release} - Release a semaphore
+@item @code{@value{DIRPREFIX}semaphore_flush} - Unblock all tasks waiting on a semaphore
+@end itemize
+
+@section Background
+
+A semaphore can be viewed as a protected variable
+whose value can be modified only with the
+@code{@value{DIRPREFIX}semaphore_create},
+@code{@value{DIRPREFIX}semaphore_obtain}, and
+@code{@value{DIRPREFIX}semaphore_release} directives. RTEMS
+supports both binary and counting semaphores. A binary semaphore
+is restricted to values of zero or one, while a counting
+semaphore can assume any non-negative integer value.
+
+A binary semaphore can be used to control access to a
+single resource. In particular, it can be used to enforce
+mutual exclusion for a critical section in user code. In this
+instance, the semaphore would be created with an initial count
+of one to indicate that no task is executing the critical
+section of code. Upon entry to the critical section, a task
+must issue the @code{@value{DIRPREFIX}semaphore_obtain}
+directive to prevent other tasks from entering the critical section.
+Upon exit from the critical section, the task must issue the
+@code{@value{DIRPREFIX}semaphore_release} directive to
+allow another task to execute the critical section.
+
+A counting semaphore can be used to control access to
+a pool of two or more resources. For example, access to three
+printers could be administered by a semaphore created with an
+initial count of three. When a task requires access to one of
+the printers, it issues the @code{@value{DIRPREFIX}semaphore_obtain}
+directive to obtain access to a printer. If a printer is not currently
+available, the task can wait for a printer to become available or return
+immediately. When the task has completed printing, it should
+issue the @code{@value{DIRPREFIX}semaphore_release}
+directive to allow other tasks access to the printer.
+
+Task synchronization may be achieved by creating a
+semaphore with an initial count of zero. One task waits for the
+arrival of another task by issuing a @code{@value{DIRPREFIX}semaphore_obtain}
+directive when it reaches a synchronization point. The other task
+performs a corresponding @code{@value{DIRPREFIX}semaphore_release}
+operation when it reaches its synchronization point, thus unblocking
+the pending task.
+
+@subsection Nested Resource Access
+
+Deadlock occurs when a task owning a binary semaphore
+attempts to acquire that same semaphore and blocks as result.
+Since the semaphore is allocated to a task, it cannot be
+deleted. Therefore, the task that currently holds the semaphore
+and is also blocked waiting for that semaphore will never
+execute again.
+
+RTEMS addresses this problem by allowing the task
+holding the binary semaphore to obtain the same binary semaphore
+multiple times in a nested manner. Each
+@code{@value{DIRPREFIX}semaphore_obtain} must be accompanied with a
+@code{@value{DIRPREFIX}semaphore_release}. The semaphore will
+only be made available for acquisition by other tasks when the
+outermost @code{@value{DIRPREFIX}semaphore_obtain} is matched with
+a @code{@value{DIRPREFIX}semaphore_release}.
+
+Simple binary semaphores do not allow nested access and so can be used for task synchronization.
+
+
+@subsection Priority Inversion
+
+Priority inversion is a form of indefinite
+postponement which is common in multitasking, preemptive
+executives with shared resources. Priority inversion occurs
+when a high priority tasks requests access to shared resource
+which is currently allocated to low priority task. The high
+priority task must block until the low priority task releases
+the resource. This problem is exacerbated when the low priority
+task is prevented from executing by one or more medium priority
+tasks. Because the low priority task is not executing, it
+cannot complete its interaction with the resource and release
+that resource. The high priority task is effectively prevented
+from executing by lower priority tasks.
+
+@subsection Priority Inheritance
+
+Priority inheritance is an algorithm that calls for
+the lower priority task holding a resource to have its priority
+increased to that of the highest priority task blocked waiting
+for that resource. Each time a task blocks attempting to obtain
+the resource, the task holding the resource may have its
+priority increased.
+
+RTEMS supports priority inheritance for local, binary
+semaphores that use the priority task wait queue blocking
+discipline. When a task of higher priority than the task
+holding the semaphore blocks, the priority of the task holding
+the semaphore is increased to that of the blocking task. When
+the task holding the task completely releases the binary
+semaphore (i.e. not for a nested release), the holder's priority
+is restored to the value it had before any higher priority was
+inherited.
+
+The RTEMS implementation of the priority inheritance
+algorithm takes into account the scenario in which a task holds
+more than one binary semaphore. The holding task will execute
+at the priority of the higher of the highest ceiling priority or
+at the priority of the highest priority task blocked waiting for
+any of the semaphores the task holds. Only when the task
+releases ALL of the binary semaphores it holds will its priority
+be restored to the normal value.
+
+@subsection Priority Ceiling
+
+Priority ceiling is an algorithm that calls for the
+lower priority task holding a resource to have its priority
+increased to that of the highest priority task which will EVER
+block waiting for that resource. This algorithm addresses the
+problem of priority inversion although it avoids the possibility
+of changing the priority of the task holding the resource
+multiple times. The priority ceiling algorithm will only change
+the priority of the task holding the resource a maximum of one
+time. The ceiling priority is set at creation time and must be
+the priority of the highest priority task which will ever
+attempt to acquire that semaphore.
+
+RTEMS supports priority ceiling for local, binary
+semaphores that use the priority task wait queue blocking
+discipline. When a task of lower priority than the ceiling
+priority successfully obtains the semaphore, its priority is
+raised to the ceiling priority. When the task holding the task
+completely releases the binary semaphore (i.e. not for a nested
+release), the holder's priority is restored to the value it had
+before any higher priority was put into effect.
+
+The need to identify the highest priority task which
+will attempt to obtain a particular semaphore can be a difficult
+task in a large, complicated system. Although the priority
+ceiling algorithm is more efficient than the priority
+inheritance algorithm with respect to the maximum number of task
+priority changes which may occur while a task holds a particular
+semaphore, the priority inheritance algorithm is more forgiving
+in that it does not require this apriori information.
+
+The RTEMS implementation of the priority ceiling
+algorithm takes into account the scenario in which a task holds
+more than one binary semaphore. The holding task will execute
+at the priority of the higher of the highest ceiling priority or
+at the priority of the highest priority task blocked waiting for
+any of the semaphores the task holds. Only when the task
+releases ALL of the binary semaphores it holds will its priority
+be restored to the normal value.
+
+@subsection Building a Semaphore Attribute Set
+
+In general, an attribute set is built by a bitwise OR
+of the desired attribute components. The following table lists
+the set of valid semaphore attributes:
+
+@itemize @bullet
+@item @code{@value{RPREFIX}FIFO} - tasks wait by FIFO (default)
+
+@item @code{@value{RPREFIX}PRIORITY} - tasks wait by priority
+
+@item @code{@value{RPREFIX}BINARY_SEMAPHORE} - restrict values to
+0 and 1
+
+@item @code{@value{RPREFIX}COUNTING_SEMAPHORE} - no restriction on values
+(default)
+
+@item @code{@value{RPREFIX}SIMPLE_BINARY_SEMAPHORE} - restrict values to
+0 and 1, do not allow nested access, allow deletion of locked semaphore.
+
+@item @code{@value{RPREFIX}NO_INHERIT_PRIORITY} - do not use priority
+inheritance (default)
+
+@item @code{@value{RPREFIX}INHERIT_PRIORITY} - use priority inheritance
+
+@item @code{@value{RPREFIX}PRIORITY_CEILING} - use priority ceiling
+
+@item @code{@value{RPREFIX}NO_PRIORITY_CEILING} - do not use priority
+ceiling (default)
+
+@item @code{@value{RPREFIX}LOCAL} - local task (default)
+
+@item @code{@value{RPREFIX}GLOBAL} - global task
+@end itemize
+
+Attribute values are specifically designed to be
+mutually exclusive, therefore bitwise OR and addition operations
+are equivalent as long as each attribute appears exactly once in
+the component list. An attribute listed as a default is not
+required to appear in the attribute list, although it is a good
+programming practice to specify default attributes. If all
+defaults are desired, the attribute
+@code{@value{RPREFIX}DEFAULT_ATTRIBUTES} should be
+specified on this call.
+
+This example demonstrates the attribute_set parameter needed to create a
+local semaphore with the task priority waiting queue discipline. The
+attribute_set parameter passed to the
+@code{@value{DIRPREFIX}semaphore_create} directive could be either
+@code{@value{RPREFIX}PRIORITY} or @code{@value{RPREFIX}LOCAL @value{OR}
+@value{RPREFIX}PRIORITY}. The attribute_set parameter can be set to
+@code{@value{RPREFIX}PRIORITY} because @code{@value{RPREFIX}LOCAL} is the
+default for all created tasks. If a similar semaphore were to be known
+globally, then the attribute_set parameter would be
+@code{@value{RPREFIX}GLOBAL @value{OR} @value{RPREFIX}PRIORITY}.
+
+@subsection Building a SEMAPHORE_OBTAIN Option Set
+
+In general, an option is built by a bitwise OR of the
+desired option components. The set of valid options for the
+@code{@value{DIRPREFIX}semaphore_obtain} directive are listed
+in the following table:
+
+@itemize @bullet
+@item @code{@value{RPREFIX}WAIT} - task will wait for semaphore (default)
+@item @code{@value{RPREFIX}NO_WAIT} - task should not wait
+@end itemize
+
+Option values are specifically designed to be mutually exclusive,
+therefore bitwise OR and addition operations are equivalent as long as
+each attribute appears exactly once in the component list. An option
+listed as a default is not required to appear in the list, although it is
+a good programming practice to specify default options. If all defaults
+are desired, the option @code{@value{RPREFIX}DEFAULT_OPTIONS} should be
+specified on this call.
+
+This example demonstrates the option parameter needed
+to poll for a semaphore. The option parameter passed to the
+@code{@value{DIRPREFIX}semaphore_obtain}
+directive should be @code{@value{RPREFIX}NO_WAIT}.
+
+@section Operations
+
+@subsection Creating a Semaphore
+
+The @code{@value{DIRPREFIX}semaphore_create} directive creates a binary or
+counting semaphore with a user-specified name as well as an
+initial count. If a binary semaphore is created with a count of
+zero (0) to indicate that it has been allocated, then the task
+creating the semaphore is considered the current holder of the
+semaphore. At create time the method for ordering waiting tasks
+in the semaphore's task wait queue (by FIFO or task priority) is
+specified. Additionally, the priority inheritance or priority
+ceiling algorithm may be selected for local, binary semaphores
+that use the priority task wait queue blocking discipline. If
+the priority ceiling algorithm is selected, then the highest
+priority of any task which will attempt to obtain this semaphore
+must be specified. RTEMS allocates a Semaphore Control Block
+(SMCB) from the SMCB free list. This data structure is used by
+RTEMS to manage the newly created semaphore. Also, a unique
+semaphore ID is generated and returned to the calling task.
+
+@subsection Obtaining Semaphore IDs
+
+When a semaphore is created, RTEMS generates a unique
+semaphore ID and assigns it to the created semaphore until it is
+deleted. The semaphore ID may be obtained by either of two
+methods. First, as the result of an invocation of the
+@code{@value{DIRPREFIX}semaphore_create} directive, the
+semaphore ID is stored in a user provided location. Second,
+the semaphore ID may be obtained later using the
+@code{@value{DIRPREFIX}semaphore_ident} directive. The semaphore ID is
+used by other semaphore manager directives to access this
+semaphore.
+
+@subsection Acquiring a Semaphore
+
+The @code{@value{DIRPREFIX}semaphore_obtain} directive is used to acquire the
+specified semaphore. A simplified version of the
+@code{@value{DIRPREFIX}semaphore_obtain} directive can be described as follows:
+
+@example
+if semaphore's count is greater than zero
+ then decrement semaphore's count
+ else wait for release of semaphore
+
+return SUCCESSFUL
+@end example
+
+When the semaphore cannot be immediately acquired,
+one of the following situations applies:
+
+@itemize @bullet
+@item By default, the calling task will wait forever to
+acquire the semaphore.
+
+@item Specifying @code{@value{RPREFIX}NO_WAIT} forces an immediate return
+with an error status code.
+
+@item Specifying a timeout limits the interval the task will
+wait before returning with an error status code.
+@end itemize
+
+If the task waits to acquire the semaphore, then it
+is placed in the semaphore's task wait queue in either FIFO or
+task priority order. If the task blocked waiting for a binary
+semaphore using priority inheritance and the task's priority is
+greater than that of the task currently holding the semaphore,
+then the holding task will inherit the priority of the blocking
+task. All tasks waiting on a semaphore are returned an error
+code when the semaphore is deleted.
+
+When a task successfully obtains a semaphore using
+priority ceiling and the priority ceiling for this semaphore is
+greater than that of the holder, then the holder's priority will
+be elevated.
+
+@subsection Releasing a Semaphore
+
+The @code{@value{DIRPREFIX}semaphore_release} directive is used to release
+the specified semaphore. A simplified version of the
+@code{@value{DIRPREFIX}semaphore_release} directive can be described as
+follows:
+
+@example
+if no tasks are waiting on this semaphore
+ then increment semaphore's count
+ else assign semaphore to a waiting task
+
+return SUCCESSFUL
+@end example
+
+If this is the outermost release of a binary
+semaphore that uses priority inheritance or priority ceiling and
+the task does not currently hold any other binary semaphores,
+then the task performing the @code{@value{DIRPREFIX}semaphore_release}
+will have its priority restored to its normal value.
+
+@subsection Deleting a Semaphore
+
+The @code{@value{DIRPREFIX}semaphore_delete} directive removes a semaphore
+from the system and frees its control block. A semaphore can be
+deleted by any local task that knows the semaphore's ID. As a
+result of this directive, all tasks blocked waiting to acquire
+the semaphore will be readied and returned a status code which
+indicates that the semaphore was deleted. Any subsequent
+references to the semaphore's name and ID are invalid.
+
+@section Directives
+
+This section details the semaphore manager's
+directives. A subsection is dedicated to each of this manager's
+directives and describes the calling sequence, related
+constants, usage, and status codes.
+
+@c
+@c
+@c
+@page
+@subsection SEMAPHORE_CREATE - Create a semaphore
+
+@cindex create a semaphore
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_semaphore_create
+@example
+rtems_status_code rtems_semaphore_create(
+ rtems_name name,
+ rtems_unsigned32 count,
+ rtems_attribute attribute_set,
+ rtems_task_priority priority_ceiling,
+ rtems_id *id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Semaphore_Create (
+ Name : in RTEMS.Name;
+ Count : in RTEMS.Unsigned32;
+ Attribute_Set : in RTEMS.Attribute;
+ ID : out RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - semaphore created successfully@*
+@code{@value{RPREFIX}INVALID_NAME} - invalid task name@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{id} is NULL@*
+@code{@value{RPREFIX}TOO_MANY} - too many semaphores created@*
+@code{@value{RPREFIX}NOT_DEFINED} - invalid attribute set@*
+@code{@value{RPREFIX}INVALID_NUMBER} - invalid starting count for binary semaphore@*
+@code{@value{RPREFIX}MP_NOT_CONFIGURED} - multiprocessing not configured@*
+@code{@value{RPREFIX}TOO_MANY} - too many global objects
+
+@subheading DESCRIPTION:
+
+This directive creates a semaphore which resides on
+the local node. The created semaphore has the user-defined name
+specified in name and the initial count specified in count. For
+control and maintenance of the semaphore, RTEMS allocates and
+initializes a SMCB. The RTEMS-assigned semaphore id is returned
+in id. This semaphore id is used with other semaphore related
+directives to access the semaphore.
+
+Specifying PRIORITY in attribute_set causes tasks
+waiting for a semaphore to be serviced according to task
+priority. When FIFO is selected, tasks are serviced in First
+In-First Out order.
+
+@subheading NOTES:
+
+This directive will not cause the calling task to be
+preempted.
+
+The priority inheritance and priority ceiling
+algorithms are only supported for local, binary semaphores that
+use the priority task wait queue blocking discipline.
+
+The following semaphore attribute constants are
+defined by RTEMS:
+
+@itemize @bullet
+@item @code{@value{RPREFIX}FIFO} - tasks wait by FIFO (default)
+
+@item @code{@value{RPREFIX}PRIORITY} - tasks wait by priority
+
+@item @code{@value{RPREFIX}BINARY_SEMAPHORE} - restrict values to
+0 and 1
+
+@item @code{@value{RPREFIX}COUNTING_SEMAPHORE} - no restriction on values
+(default)
+
+@item @code{@value{RPREFIX}SIMPLE_BINARY_SEMAPHORE} - restrict values to
+0 and 1, block on nested access, allow deletion of locked semaphore.
+
+@item @code{@value{RPREFIX}NO_INHERIT_PRIORITY} - do not use priority
+inheritance (default)
+
+@item @code{@value{RPREFIX}INHERIT_PRIORITY} - use priority inheritance
+
+@item @code{@value{RPREFIX}PRIORITY_CEILING} - use priority ceiling
+
+@item @code{@value{RPREFIX}NO_PRIORITY_CEILING} - do not use priority
+ceiling (default)
+
+@item @code{@value{RPREFIX}LOCAL} - local task (default)
+
+@item @code{@value{RPREFIX}GLOBAL} - global task
+@end itemize
+
+Semaphores should not be made global unless remote
+tasks must interact with the created semaphore. This is to
+avoid the system overhead incurred by the creation of a global
+semaphore. When a global semaphore is created, the semaphore's
+name and id must be transmitted to every node in the system for
+insertion in the local copy of the global object table.
+
+The total number of global objects, including
+semaphores, is limited by the maximum_global_objects field in
+the Configuration Table.
+
+@c
+@c
+@c
+@page
+@subsection SEMAPHORE_IDENT - Get ID of a semaphore
+
+@cindex get ID of a semaphore
+@cindex obtain ID of a semaphore
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_semaphore_ident
+@example
+rtems_status_code rtems_semaphore_ident(
+ rtems_name name,
+ rtems_unsigned32 node,
+ rtems_id *id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Semaphore_Ident (
+ Name : in RTEMS.Name;
+ Node : in RTEMS.Unsigned32;
+ ID : out RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - semaphore identified successfully@*
+@code{@value{RPREFIX}INVALID_NAME} - semaphore name not found@*
+@code{@value{RPREFIX}INVALID_NODE} - invalid node id
+
+@subheading DESCRIPTION:
+
+This directive obtains the semaphore id associated
+with the semaphore name. If the semaphore name is not unique,
+then the semaphore id will match one of the semaphores with that
+name. However, this semaphore id is not guaranteed to
+correspond to the desired semaphore. The semaphore id is used
+by other semaphore related directives to access the semaphore.
+
+@subheading NOTES:
+
+This directive will not cause the running task to be
+preempted.
+
+If node is @code{@value{RPREFIX}SEARCH_ALL_NODES}, all nodes are searched
+with the local node being searched first. All other nodes are
+searched with the lowest numbered node searched first.
+
+If node is a valid node number which does not
+represent the local node, then only the semaphores exported by
+the designated node are searched.
+
+This directive does not generate activity on remote
+nodes. It accesses only the local copy of the global object
+table.
+
+@c
+@c
+@c
+@page
+@subsection SEMAPHORE_DELETE - Delete a semaphore
+
+@cindex delete a semaphore
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_semaphore_delete
+@example
+rtems_status_code rtems_semaphore_delete(
+ rtems_id id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Semaphore_Delete (
+ ID : in RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - semaphore deleted successfully@*
+@code{@value{RPREFIX}INVALID_ID} - invalid semaphore id@*
+@code{@value{RPREFIX}ILLEGAL_ON_REMOTE_OBJECT} - cannot delete remote semaphore@*
+@code{@value{RPREFIX}RESOURCE_IN_USE} - binary semaphore is in use
+
+@subheading DESCRIPTION:
+
+This directive deletes the semaphore specified by @code{id}.
+All tasks blocked waiting to acquire the semaphore will be
+readied and returned a status code which indicates that the
+semaphore was deleted. The SMCB for this semaphore is reclaimed
+by RTEMS.
+
+@subheading NOTES:
+
+The calling task will be preempted if it is enabled
+by the task's execution mode and a higher priority local task is
+waiting on the deleted semaphore. The calling task will NOT be
+preempted if all of the tasks that are waiting on the semaphore
+are remote tasks.
+
+The calling task does not have to be the task that
+created the semaphore. Any local task that knows the semaphore
+id can delete the semaphore.
+
+When a global semaphore is deleted, the semaphore id
+must be transmitted to every node in the system for deletion
+from the local copy of the global object table.
+
+The semaphore must reside on the local node, even if
+the semaphore was created with the @code{@value{RPREFIX}GLOBAL} option.
+
+Proxies, used to represent remote tasks, are
+reclaimed when the semaphore is deleted.
+
+@c
+@c
+@c
+@page
+@subsection SEMAPHORE_OBTAIN - Acquire a semaphore
+
+@cindex obtain a semaphore
+@cindex lock a semaphore
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_semaphore_obtain
+@example
+rtems_status_code rtems_semaphore_obtain(
+ rtems_id id,
+ rtems_unsigned32 option_set,
+ rtems_interval timeout
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Semaphore_Obtain (
+ ID : in RTEMS.ID;
+ Option_Set : in RTEMS.Option;
+ Timeout : in RTEMS.Interval;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - semaphore obtained successfully@*
+@code{@value{RPREFIX}UNSATISFIED} - semaphore not available@*
+@code{@value{RPREFIX}TIMEOUT} - timed out waiting for semaphore@*
+@code{@value{RPREFIX}OBJECT_WAS_DELETED} - semaphore deleted while waiting@*
+@code{@value{RPREFIX}INVALID_ID} - invalid semaphore id
+
+@subheading DESCRIPTION:
+
+This directive acquires the semaphore specified by
+id. The @code{@value{RPREFIX}WAIT} and @code{@value{RPREFIX}NO_WAIT} components of the options parameter
+indicate whether the calling task wants to wait for the
+semaphore to become available or return immediately if the
+semaphore is not currently available. With either @code{@value{RPREFIX}WAIT} or
+@code{@value{RPREFIX}NO_WAIT}, if the current semaphore count is positive, then it is
+decremented by one and the semaphore is successfully acquired by
+returning immediately with a successful return code.
+
+If the calling task chooses to return immediately and the current
+semaphore count is zero or negative, then a status code is returned
+indicating that the semaphore is not available. If the calling task
+chooses to wait for a semaphore and the current semaphore count is zero or
+negative, then it is decremented by one and the calling task is placed on
+the semaphore's wait queue and blocked. If the semaphore was created with
+the @code{@value{RPREFIX}PRIORITY} attribute, then the calling task is
+inserted into the queue according to its priority. However, if the
+semaphore was created with the @code{@value{RPREFIX}FIFO} attribute, then
+the calling task is placed at the rear of the wait queue. If the binary
+semaphore was created with the @code{@value{RPREFIX}INHERIT_PRIORITY}
+attribute, then the priority of the task currently holding the binary
+semaphore is guaranteed to be greater than or equal to that of the
+blocking task. If the binary semaphore was created with the
+@code{@value{RPREFIX}PRIORITY_CEILING} attribute, a task successfully
+obtains the semaphore, and the priority of that task is greater than the
+ceiling priority for this semaphore, then the priority of the task
+obtaining the semaphore is elevated to that of the ceiling.
+
+The timeout parameter specifies the maximum interval the calling task is
+willing to be blocked waiting for the semaphore. If it is set to
+@code{@value{RPREFIX}NO_TIMEOUT}, then the calling task will wait forever.
+If the semaphore is available or the @code{@value{RPREFIX}NO_WAIT} option
+component is set, then timeout is ignored.
+
+@subheading NOTES:
+The following semaphore acquisition option constants
+are defined by RTEMS:
+
+@itemize @bullet
+@item @code{@value{RPREFIX}WAIT} - task will wait for semaphore (default)
+@item @code{@value{RPREFIX}NO_WAIT} - task should not wait
+@end itemize
+
+Attempting to obtain a global semaphore which does not reside on the local
+node will generate a request to the remote node to access the semaphore.
+If the semaphore is not available and @code{@value{RPREFIX}NO_WAIT} was
+not specified, then the task must be blocked until the semaphore is
+released. A proxy is allocated on the remote node to represent the task
+until the semaphore is released.
+
+A clock tick is required to support the timeout functionality of
+this directive.
+
+@c
+@c
+@c
+@page
+@subsection SEMAPHORE_RELEASE - Release a semaphore
+
+@cindex release a semaphore
+@cindex unlock a semaphore
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_semaphore_release
+@example
+rtems_status_code rtems_semaphore_release(
+ rtems_id id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Semaphore_Release (
+ ID : in RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - semaphore released successfully@*
+@code{@value{RPREFIX}INVALID_ID} - invalid semaphore id@*
+@code{@value{RPREFIX}NOT_OWNER_OF_RESOURCE} - calling task does not own semaphore
+
+@subheading DESCRIPTION:
+
+This directive releases the semaphore specified by
+id. The semaphore count is incremented by one. If the count is
+zero or negative, then the first task on this semaphore's wait
+queue is removed and unblocked. The unblocked task may preempt
+the running task if the running task's preemption mode is
+enabled and the unblocked task has a higher priority than the
+running task.
+
+@subheading NOTES:
+
+The calling task may be preempted if it causes a
+higher priority task to be made ready for execution.
+
+Releasing a global semaphore which does not reside on
+the local node will generate a request telling the remote node
+to release the semaphore.
+
+If the task to be unblocked resides on a different
+node from the semaphore, then the semaphore allocation is
+forwarded to the appropriate node, the waiting task is
+unblocked, and the proxy used to represent the task is reclaimed.
+
+The outermost release of a local, binary, priority
+inheritance or priority ceiling semaphore may result in the
+calling task having its priority lowered. This will occur if
+the calling task holds no other binary semaphores and it has
+inherited a higher priority.
+
+@c
+@c
+@c
+@page
+@subsection SEMAPHORE_FLUSH - Unblock all tasks waiting on a semaphore
+
+@cindex flush a semaphore
+@cindex unblock all tasks waiting on a semaphore
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_semaphore_flush
+@example
+rtems_status_code rtems_semaphore_flush(
+ rtems_id id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Semaphore_Flush (
+ ID : in RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - semaphore released successfully@*
+@code{@value{RPREFIX}INVALID_ID} - invalid semaphore id@*
+@code{@value{RPREFIX}ILLEGAL_ON_REMOTE_OBJECT} - not supported for remote semaphores
+
+@subheading DESCRIPTION:
+
+This directive unblocks all tasks waiting on the semaphore specified by
+id. Since there are tasks blocked on the semaphore, the semaphore's
+count is not changed by this directive and thus is zero before and
+after this directive is executed. Tasks which are unblocked as the
+result of this directive will return from the
+@code{@value{DIRPREFIX}semaphore_release} directive with a
+status code of @code{@value{RPREFIX}UNSATISFIED} to indicate
+that the semaphore was not obtained.
+
+This directive may unblock any number of tasks. Any of the unblocked
+tasks may preempt the running task if the running task's preemption mode is
+enabled and an unblocked task has a higher priority than the
+running task.
+
+@subheading NOTES:
+
+The calling task may be preempted if it causes a
+higher priority task to be made ready for execution.
+
+If the task to be unblocked resides on a different
+node from the semaphore, then the waiting task is
+unblocked, and the proxy used to represent the task is reclaimed.
+
+
diff --git a/doc/user/signal.t b/doc/user/signal.t
new file mode 100644
index 0000000000..c441338d2a
--- /dev/null
+++ b/doc/user/signal.t
@@ -0,0 +1,389 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Signal Manager
+
+@cindex signals
+
+@section Introduction
+
+The signal manager provides the capabilities required
+for asynchronous communication. The directives provided by the
+signal manager are:
+
+@itemize @bullet
+@item @code{@value{DIRPREFIX}signal_catch} - Establish an ASR
+@item @code{@value{DIRPREFIX}signal_send} - Send signal set to a task
+@end itemize
+
+@section Background
+
+@subsection Signal Manager Definitions
+
+@cindex asynchronous signal routine
+@cindex ASR
+
+The signal manager allows a task to optionally define
+an asynchronous signal routine (ASR). An ASR is to a task what
+an ISR is to an application's set of tasks. When the processor
+is interrupted, the execution of an application is also
+interrupted and an ISR is given control. Similarly, when a
+signal is sent to a task, that task's execution path will be
+"interrupted" by the ASR. Sending a signal to a task has no
+effect on the receiving task's current execution state.
+
+@findex rtems_signal_set
+
+A signal flag is used by a task (or ISR) to inform
+another task of the occurrence of a significant situation.
+Thirty-two signal flags are associated with each task. A
+collection of one or more signals is referred to as a signal
+set. The data type @code{@value{DIRPREFIX}signal_set}
+is used to manipulate signal sets.
+
+A signal set is posted when it is directed (or sent) to a
+task. A pending signal is a signal that has been sent to a task
+with a valid ASR, but has not been processed by that task's ASR.
+
+
+@subsection A Comparison of ASRs and ISRs
+
+@cindex ASR vs. ISR
+@cindex ISR vs. ASR
+
+The format of an ASR is similar to that of an ISR
+with the following exceptions:
+
+@itemize @bullet
+@item ISRs are scheduled by the processor hardware. ASRs are
+scheduled by RTEMS.
+
+@item ISRs do not execute in the context of a task and may
+invoke only a subset of directives. ASRs execute in the context
+of a task and may execute any directive.
+
+@item When an ISR is invoked, it is passed the vector number
+as its argument. When an ASR is invoked, it is passed the
+signal set as its argument.
+
+@item An ASR has a task mode which can be different from that
+of the task. An ISR does not execute as a task and, as a
+result, does not have a task mode.
+@end itemize
+
+@subsection Building a Signal Set
+
+@cindex signal set, building
+
+A signal set is built by a bitwise OR of the desired
+signals. The set of valid signals is @code{@value{RPREFIX}SIGNAL_0} through
+@code{@value{RPREFIX}SIGNAL_31}. If a signal is not explicitly specified in the
+signal set, then it is not present. Signal values are
+specifically designed to be mutually exclusive, therefore
+bitwise OR and addition operations are equivalent as long as
+each signal appears exactly once in the component list.
+
+This example demonstrates the signal parameter used
+when sending the signal set consisting of
+@code{@value{RPREFIX}SIGNAL_6},
+@code{@value{RPREFIX}SIGNAL_15}, and
+@code{@value{RPREFIX}SIGNAL_31}. The signal parameter provided
+to the @code{@value{DIRPREFIX}signal_send} directive should be
+@code{@value{RPREFIX}SIGNAL_6 @value{OR}
+@value{RPREFIX}SIGNAL_15 @value{OR} @value{RPREFIX}SIGNAL_31}.
+
+@subsection Building an ASR Mode
+
+@cindex ASR mode, building
+
+In general, an ASR's mode is built by a bitwise OR of
+the desired mode components. The set of valid mode components
+is the same as those allowed with the task_create and task_mode
+directives. A complete list of mode options is provided in the
+following table:
+
+@itemize @bullet
+@item @code{@value{RPREFIX}PREEMPT} is masked by
+@code{@value{RPREFIX}PREEMPT_MASK} and enables preemption
+
+@item @code{@value{RPREFIX}NO_PREEMPT} is masked by
+@code{@value{RPREFIX}PREEMPT_MASK} and disables preemption
+
+@item @code{@value{RPREFIX}NO_TIMESLICE} is masked by
+@code{@value{RPREFIX}TIMESLICE_MASK} and disables timeslicing
+
+@item @code{@value{RPREFIX}TIMESLICE} is masked by
+@code{@value{RPREFIX}TIMESLICE_MASK} and enables timeslicing
+
+@item @code{@value{RPREFIX}ASR} is masked by
+@code{@value{RPREFIX}ASR_MASK} and enables ASR processing
+
+@item @code{@value{RPREFIX}NO_ASR} is masked by
+@code{@value{RPREFIX}ASR_MASK} and disables ASR processing
+
+@item @code{@value{RPREFIX}INTERRUPT_LEVEL(0)} is masked by
+@code{@value{RPREFIX}INTERRUPT_MASK} and enables all interrupts
+
+@item @code{@value{RPREFIX}INTERRUPT_LEVEL(n)} is masked by
+@code{@value{RPREFIX}INTERRUPT_MASK} and sets interrupts level n
+@end itemize
+
+Mode values are specifically designed to be mutually
+exclusive, therefore bitwise OR and addition operations are
+equivalent as long as each mode appears exactly once in the
+component list. A mode component listed as a default is not
+required to appear in the mode list, although it is a good
+programming practice to specify default components. If all
+defaults are desired, the mode DEFAULT_MODES should be specified
+on this call.
+
+This example demonstrates the mode parameter used
+with the @code{@value{DIRPREFIX}signal_catch}
+to establish an ASR which executes at
+interrupt level three and is non-preemptible. The mode should
+be set to
+@code{@value{RPREFIX}INTERRUPT_LEVEL(3) @value{OR} @value{RPREFIX}NO_PREEMPT}
+to indicate the
+desired processor mode and interrupt level.
+
+@section Operations
+
+@subsection Establishing an ASR
+
+The @code{@value{DIRPREFIX}signal_catch} directive establishes an ASR for the
+calling task. The address of the ASR and its execution mode are
+specified to this directive. The ASR's mode is distinct from
+the task's mode. For example, the task may allow preemption,
+while that task's ASR may have preemption disabled. Until a
+task calls @code{@value{DIRPREFIX}signal_catch} the first time,
+its ASR is invalid, and no signal sets can be sent to the task.
+
+A task may invalidate its ASR and discard all pending
+signals by calling @code{@value{DIRPREFIX}signal_catch}
+with a value of NULL for the ASR's address. When a task's
+ASR is invalid, new signal sets sent to this task are discarded.
+
+A task may disable ASR processing (@code{@value{RPREFIX}NO_ASR}) via the
+task_mode directive. When a task's ASR is disabled, the signals
+sent to it are left pending to be processed later when the ASR
+is enabled.
+
+Any directive that can be called from a task can also
+be called from an ASR. A task is only allowed one active ASR.
+Thus, each call to @code{@value{DIRPREFIX}signal_catch}
+replaces the previous one.
+
+Normally, signal processing is disabled for the ASR's
+execution mode, but if signal processing is enabled for the ASR,
+the ASR must be reentrant.
+
+@subsection Sending a Signal Set
+
+The @code{@value{DIRPREFIX}signal_send} directive allows both
+tasks and ISRs to send signals to a target task. The target task and
+a set of signals are specified to the
+@code{@value{DIRPREFIX}signal_send} directive. The sending
+of a signal to a task has no effect on the execution state of
+that task. If the task is not the currently running task, then
+the signals are left pending and processed by the task's ASR the
+next time the task is dispatched to run. The ASR is executed
+immediately before the task is dispatched. If the currently
+running task sends a signal to itself or is sent a signal from
+an ISR, its ASR is immediately dispatched to run provided signal
+processing is enabled.
+
+If an ASR with signals enabled is preempted by
+another task or an ISR and a new signal set is sent, then a new
+copy of the ASR will be invoked, nesting the preempted ASR.
+Upon completion of processing the new signal set, control will
+return to the preempted ASR. In this situation, the ASR must be
+reentrant.
+
+Like events, identical signals sent to a task are not
+queued. In other words, sending the same signal multiple times
+to a task (without any intermediate signal processing occurring
+for the task), has the same result as sending that signal to
+that task once.
+
+@subsection Processing an ASR
+
+Asynchronous signals were designed to provide the
+capability to generate software interrupts. The processing of
+software interrupts parallels that of hardware interrupts. As a
+result, the differences between the formats of ASRs and ISRs is
+limited to the meaning of the single argument passed to an ASR.
+The ASR should have the following calling sequence and adhere to
+@value{LANGUAGE} calling conventions:
+
+@ifset is-C
+@findex rtems_asr
+@example
+rtems_asr user_routine(
+ rtems_signal_set signals
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure User_Routine (
+ Signals : in RTEMS.Signal_Set
+);
+@end example
+@end ifset
+
+When the ASR returns to RTEMS the mode and execution
+path of the interrupted task (or ASR) is restored to the context
+prior to entering the ASR.
+
+@section Directives
+
+This section details the signal manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@c
+@c
+@c
+@page
+@subsection SIGNAL_CATCH - Establish an ASR
+
+@cindex establish an ASR
+@cindex install an ASR
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_signal_catch
+@example
+rtems_status_code rtems_signal_catch(
+ rtems_asr_entry asr_handler,
+ rtems_mode mode
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Signal_Catch (
+ ASR_Handler : in RTEMS.ASR_Handler;
+ Mode_Set : in RTEMS.Mode;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - always successful
+
+@subheading DESCRIPTION:
+
+This directive establishes an asynchronous signal
+routine (ASR) for the calling task. The asr_handler parameter
+specifies the entry point of the ASR. If asr_handler is NULL,
+the ASR for the calling task is invalidated and all pending
+signals are cleared. Any signals sent to a task with an invalid
+ASR are discarded. The mode parameter specifies the execution
+mode for the ASR. This execution mode supersedes the task's
+execution mode while the ASR is executing.
+
+@subheading NOTES:
+
+This directive will not cause the calling task to be
+preempted.
+
+The following task mode constants are defined by RTEMS:
+
+@itemize @bullet
+@item @code{@value{RPREFIX}PREEMPT} is masked by
+@code{@value{RPREFIX}PREEMPT_MASK} and enables preemption
+
+@item @code{@value{RPREFIX}NO_PREEMPT} is masked by
+@code{@value{RPREFIX}PREEMPT_MASK} and disables preemption
+
+@item @code{@value{RPREFIX}NO_TIMESLICE} is masked by
+@code{@value{RPREFIX}TIMESLICE_MASK} and disables timeslicing
+
+@item @code{@value{RPREFIX}TIMESLICE} is masked by
+@code{@value{RPREFIX}TIMESLICE_MASK} and enables timeslicing
+
+@item @code{@value{RPREFIX}ASR} is masked by
+@code{@value{RPREFIX}ASR_MASK} and enables ASR processing
+
+@item @code{@value{RPREFIX}NO_ASR} is masked by
+@code{@value{RPREFIX}ASR_MASK} and disables ASR processing
+
+@item @code{@value{RPREFIX}INTERRUPT_LEVEL(0)} is masked by
+@code{@value{RPREFIX}INTERRUPT_MASK} and enables all interrupts
+
+@item @code{@value{RPREFIX}INTERRUPT_LEVEL(n)} is masked by
+@code{@value{RPREFIX}INTERRUPT_MASK} and sets interrupts level n
+@end itemize
+
+@c
+@c
+@c
+@page
+@subsection SIGNAL_SEND - Send signal set to a task
+
+@cindex send signal set
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_signal_send
+@example
+rtems_status_code rtems_signal_send(
+ rtems_id id,
+ rtems_signal_set signal_set
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Signal_Send (
+ ID : in RTEMS.ID;
+ Signal_Set : in RTEMS.Signal_Set;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - signal sent successfully@*
+@code{@value{RPREFIX}INVALID_ID} - task id invalid@*
+@code{@value{RPREFIX}NOT_DEFINED} - ASR invalid
+
+@subheading DESCRIPTION:
+
+This directive sends a signal set to the task
+specified in id. The signal_set parameter contains the signal
+set to be sent to the task.
+
+If a caller sends a signal set to a task with an
+invalid ASR, then an error code is returned to the caller. If a
+caller sends a signal set to a task whose ASR is valid but
+disabled, then the signal set will be caught and left pending
+for the ASR to process when it is enabled. If a caller sends a
+signal set to a task with an ASR that is both valid and enabled,
+then the signal set is caught and the ASR will execute the next
+time the task is dispatched to run.
+
+@subheading NOTES:
+
+Sending a signal set to a task has no effect on that
+task's state. If a signal set is sent to a blocked task, then
+the task will remain blocked and the signals will be processed
+when the task becomes the running task.
+
+Sending a signal set to a global task which does not
+reside on the local node will generate a request telling the
+remote node to send the signal set to the specified task.
+
diff --git a/doc/user/states.eps b/doc/user/states.eps
new file mode 100644
index 0000000000..cea4e7f344
--- /dev/null
+++ b/doc/user/states.eps
@@ -0,0 +1,13822 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: (ImageMagick)
+%%Title: (states.eps)
+%%CreationDate: (Wed Oct 6 11:08:51 1999)
+%%BoundingBox: 0 109 495 573
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 1
+%%Pages: 0
+%%EndComments
+
+%%BeginDefaults
+%%PageOrientation: Portrait
+%%EndDefaults
+
+%%BeginProlog
+%
+% Display a color image. The image is displayed in color on
+% Postscript viewers or printers that support color, otherwise
+% it is displayed as grayscale.
+%
+/buffer 512 string def
+/byte 1 string def
+/color_packet 3 string def
+/pixels 768 string def
+
+/DirectClassPacket
+{
+ %
+ % Get a DirectClass packet.
+ %
+ % Parameters:
+ % red.
+ % green.
+ % blue.
+ % length: number of pixels minus one of this color (optional).
+ %
+ currentfile color_packet readhexstring pop pop
+ compression 0 gt
+ {
+ /number_pixels 3 def
+ }
+ {
+ currentfile byte readhexstring pop 0 get
+ /number_pixels exch 1 add 3 mul def
+ } ifelse
+ 0 3 number_pixels 1 sub
+ {
+ pixels exch color_packet putinterval
+ } for
+ pixels 0 number_pixels getinterval
+} bind def
+
+/DirectClassImage
+{
+ %
+ % Display a DirectClass image.
+ %
+ systemdict /colorimage known
+ {
+ columns rows 8
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { DirectClassPacket } false 3 colorimage
+ }
+ {
+ %
+ % No colorimage operator; convert to grayscale.
+ %
+ columns rows 8
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { GrayDirectClassPacket } image
+ } ifelse
+} bind def
+
+/GrayDirectClassPacket
+{
+ %
+ % Get a DirectClass packet; convert to grayscale.
+ %
+ % Parameters:
+ % red
+ % green
+ % blue
+ % length: number of pixels minus one of this color (optional).
+ %
+ currentfile color_packet readhexstring pop pop
+ color_packet 0 get 0.299 mul
+ color_packet 1 get 0.587 mul add
+ color_packet 2 get 0.114 mul add
+ cvi
+ /gray_packet exch def
+ compression 0 gt
+ {
+ /number_pixels 1 def
+ }
+ {
+ currentfile byte readhexstring pop 0 get
+ /number_pixels exch 1 add def
+ } ifelse
+ 0 1 number_pixels 1 sub
+ {
+ pixels exch gray_packet put
+ } for
+ pixels 0 number_pixels getinterval
+} bind def
+
+/GrayPseudoClassPacket
+{
+ %
+ % Get a PseudoClass packet; convert to grayscale.
+ %
+ % Parameters:
+ % index: index into the colormap.
+ % length: number of pixels minus one of this color (optional).
+ %
+ currentfile byte readhexstring pop 0 get
+ /offset exch 3 mul def
+ /color_packet colormap offset 3 getinterval def
+ color_packet 0 get 0.299 mul
+ color_packet 1 get 0.587 mul add
+ color_packet 2 get 0.114 mul add
+ cvi
+ /gray_packet exch def
+ compression 0 gt
+ {
+ /number_pixels 1 def
+ }
+ {
+ currentfile byte readhexstring pop 0 get
+ /number_pixels exch 1 add def
+ } ifelse
+ 0 1 number_pixels 1 sub
+ {
+ pixels exch gray_packet put
+ } for
+ pixels 0 number_pixels getinterval
+} bind def
+
+/PseudoClassPacket
+{
+ %
+ % Get a PseudoClass packet.
+ %
+ % Parameters:
+ % index: index into the colormap.
+ % length: number of pixels minus one of this color (optional).
+ %
+ currentfile byte readhexstring pop 0 get
+ /offset exch 3 mul def
+ /color_packet colormap offset 3 getinterval def
+ compression 0 gt
+ {
+ /number_pixels 3 def
+ }
+ {
+ currentfile byte readhexstring pop 0 get
+ /number_pixels exch 1 add 3 mul def
+ } ifelse
+ 0 3 number_pixels 1 sub
+ {
+ pixels exch color_packet putinterval
+ } for
+ pixels 0 number_pixels getinterval
+} bind def
+
+/PseudoClassImage
+{
+ %
+ % Display a PseudoClass image.
+ %
+ % Parameters:
+ % class: 0-PseudoClass or 1-Grayscale.
+ %
+ currentfile buffer readline pop
+ token pop /class exch def pop
+ class 0 gt
+ {
+ currentfile buffer readline pop
+ token pop /depth exch def pop
+ /grays columns 8 add depth sub depth mul 8 idiv string def
+ columns rows depth
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { currentfile grays readhexstring pop } image
+ }
+ {
+ %
+ % Parameters:
+ % colors: number of colors in the colormap.
+ % colormap: red, green, blue color packets.
+ %
+ currentfile buffer readline pop
+ token pop /colors exch def pop
+ /colors colors 3 mul def
+ /colormap colors string def
+ currentfile colormap readhexstring pop pop
+ systemdict /colorimage known
+ {
+ columns rows 8
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { PseudoClassPacket } false 3 colorimage
+ }
+ {
+ %
+ % No colorimage operator; convert to grayscale.
+ %
+ columns rows 8
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { GrayPseudoClassPacket } image
+ } ifelse
+ } ifelse
+} bind def
+
+/DisplayImage
+{
+ %
+ % Display a DirectClass or PseudoClass image.
+ %
+ % Parameters:
+ % x & y translation.
+ % x & y scale.
+ % label pointsize.
+ % image label.
+ % image columns & rows.
+ % class: 0-DirectClass or 1-PseudoClass.
+ % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
+ % hex color packets.
+ %
+ gsave
+ currentfile buffer readline pop
+ token pop /x exch def
+ token pop /y exch def pop
+ x y translate
+ currentfile buffer readline pop
+ token pop /x exch def
+ token pop /y exch def pop
+ currentfile buffer readline pop
+ token pop /pointsize exch def pop
+ /Helvetica findfont pointsize scalefont setfont
+ x y scale
+ currentfile buffer readline pop
+ token pop /columns exch def
+ token pop /rows exch def pop
+ currentfile buffer readline pop
+ token pop /class exch def pop
+ currentfile buffer readline pop
+ token pop /compression exch def pop
+ class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
+ grestore
+} bind def
+%%EndProlog
+%%Page: 1 1
+%%PageBoundingBox: 0 109 495 573
+userdict begin
+%%BeginData:
+DisplayImage
+0 109
+495.101124 464.359551
+12
+721 676
+1
+1
+1
+8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff87ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff8787ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff8787ffffffff6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6effff8787ffffffff876e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6effffff8787ffffffff8787a07762636363636363636363636363636363636363636363
+636363636363636363636363636363636363636363636363636363636363636363636363
+636363636363636363636363636363636363636363636363636363636363636363636363
+636363636363636363636363636363636363636363636363636363636363636363636363
+636363636363636363636363636363636363636363636363636363636363636363636363
+636363636363636363636363636363636363636363636363636363636363636363636363
+636363636363636363636363636363636363636363636363636363636363636363636363
+636363636363636363636363636363636363636363636363636363636363636363636363
+636363636363636363636363636363636363636363636363636363636363636363636363
+636363636363636363636363636363636363636363636363636363636363636363636363
+636363636363636363636363636363636363636363636363636363636363636363636363
+636363636363636363636363636363636363636363636363636363636363636363636363
+636363636363636363636363636363636363636363636363636363636363636363636363
+636363636363636363636363636363636363636363636363636363636363636363636363
+636363636363636363636363636363636363636363636363636363636363636363636363
+636363636363636363636363636363636363636363636363636363636363636363636363
+636363636363636363636363636363636363636363636363636363636363636363636363
+636363636363636363636363636363636363636363636363636363636363636363636363
+636363636363636363636363636363636363636363636363636363636363636363636363
+636363636363636363636363636363636363636363636363636363636363636363636362
+75ffffffff8787ffffffff87877731111a19191919191919191919191919191919191919
+191919191919191919191919191919191919191919191919191919191919191919191919
+191919191919191919191919191919191919191919191919191919191919191919191919
+191919191919191919191919191919191919191919191919191919191919191919191919
+191919191919191919191919191919191919191919191919191919191919191919191919
+191919191919191919191919191919191919191919191919191919191919191919191919
+191919191919191919191919191919191919191919191919191919191919191919191919
+191919191919191919191919191919191919191919191919191919191919191919191919
+191919191919191919191919191919191919191919191919191919191919191919191919
+191919191919191919191919191919191919191919191919191919191919191919191919
+191919191919191919191919191919191919191919191919191919191919191919191919
+191919191919191919191919191919191919191919191919191919191919191919191919
+191919191919191919191919191919191919191919191919191919191919191919191919
+191919191919191919191919191919191919191919191919191919191919191919191919
+191919191919191919191919191919191919191919191919191919191919191919191919
+191919191919191919191919191919191919191919191919191919191919191919191919
+191919191919191919191919191919191919191919191919191919191919191919191919
+191919191919191919191919191919191919191919191919191919191919191919191919
+191919191919191919191919191919191919191919191919191919191919191919191919
+19191919191919191919191919191919191919191919191919191919191919191919191a
+123affffffff8787ffffffff878763140000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00001effffffff8787ffffffff8787631900000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000001effffffff8787ffffffff87876319000000050000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000003
+000000001effffffff8787ffffffff87876319000005ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff820000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff810000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff7a747effffffffffffffffffbe687affffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7a68beff
+fffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffd000000b3ffffffffffffffff730000fdffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb000070
+ffffffffffffffffffffffffffffffffffffff5e82ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff5e82ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff00000000f8ffffffffffffff7f0000ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0400
+7effffffffffffffffffffffffffffffffffff3c0077ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff3c0077ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff0000000080ffffffffffffff7f0000ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd
+fdffffffffffffffffffffffffffffffffffffff00007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff00007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff0000080000c3ffffffffffff7f0000ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000081ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000081ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff00007a230037ffffffffffff7f0000ffff
+fffffffffffff5827872bcfffffffffffffffff8f9ffffb9727881f6ffffffffffffffff
+ffffffffffffffffffffffbd727b72baffffffffffffeefbfcfffffffffffffffffbf3f8
+fff7f8fffffffffffff481787882f4fffffffffffefa050080fff7ffffffffffffbd727b
+72bafffffffffffffff8f8fffff4827872bafffffffffffefa050080fff7ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763190000
+00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff00009b9d00007affffffffff7f0000ff
+ffffffffffc23100000000000176ffffffffff7c000cff44000000000077ffffffffffff
+ffffffffffffffffffffb100000000000034c2ffffffff460000b1ffffffffffff3b0000
+c2ff00007cffffffffb20000000000003efffffffa00000000000000faffffffb1000000
+00000034c2fffffffffa000096cb000000000030cafffffa00000000000000faffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787631900
+0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000089ff3c0003feffffffff7f0000
+ffffffffffb30000000003000000003effffffff7d00043b00000003000000bfffffffff
+ffffffffffffffffffff41000000020001000000b3ffffffff380000c1ffffffff410000
+b8ffff00007dffffffc0000000030200000041fffffb00000000000000fbffff41000000
+020001000000b3ffffffff0000380000000300000035fffffb00000000000000fbffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319
+000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff00007fffc8000045ffffffff7f00
+00fffffffff70000003fcdffff850b000079ffffff7f0000004bffffff4e000035ffffff
+ffffffffffffffffffffb200003dceffffff88000000f7ffffffc8000037ffffffb60000
+49ffffff00007fffffff350000c6ffffcf400000afffff85830000419182ffffb200003d
+ceffffff88000000f7ffffff00000000c2ffffc3000000bcffff85830000419182ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763
+19000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff00007fffff850000b3ffffff7f
+0000ffffffff8a000087fffffffffffd0c0004ffffff7f00003fffffffffff450000ffff
+ffffffffffffffffffffff000055ffffffffffffca00008affffffff8100007fffc40000
+3effffffff00007fffffff00007affffffffff002ac3ffffffff02008bffffffff000055
+ffffffffffffca00008affffff000000bfffffffffc300007affffffff02008bffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787
+6319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff00007ffffffb000000f8ffff
+7f0000ffffffff3a0006feffffffffffff830000bfffff7f0000caffffffffff850000ff
+ffffffffffffffffffffffbf0005ffffffffffffffff7f003affffffffff4b0000c24800
+00c6ffffffff00007fffffff030000beffffffffffffffffffffff00007fffffffbf0005
+ffffffffffffffff7f003affffff000043ffffffffffff00007fffffffff00007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87
+876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff00007fffffffba00007fff
+ff7f0000ffffffff00007bffffffffffffffff00007affff7f0000ffffffffffff7f0000
+fffffff6fffffffffffff5ff7c00000300000000000000000000ffffffffffff03000000
+00bdffffffffff00007fffffff7e000000003689f6ffffffffffffff00007fffffff7a00
+000300000000000000000000ffffff000084ffffffffffff00007fffffffff00007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff
+87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff00007fffffffff4d0000
+c3ff800000ffffffff000080ffffffffffffffff00007fffff7f0000ffffffffffff7f00
+00fffffa0000000000000000ff8500000000000000000000000000fdffffffffffca0000
+0058ffffffffffff00007fffffffff4700000000000031c0ffffffffff00007fffffff7f
+00000000000000000000000000fdffff00007fffffffffffff00007fffffffff00007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffff
+ff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff00007fffffffffff07
+0036ff8a0000ffffffff000080ffffffffffffffff00007fffff7f0000ffffffffffff7f
+0000fffffb0000000000000000ff850000898a868686868686868282ffffffffffffc100
+0000bdffffffffffff00007fffffffffffca3c0000000000003fffffffff00007fffffff
+7f0000898a868686868686868282ffffff00007fffffffffffff00007fffffffff00007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffff
+ffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00007fffffffffff
+800000989b0000ffffffff000077fffffffffffffffc000079ffff7f0000ffffffffffff
+7f0000ffffff8483878787878383ff7c0003fffffffffffffffffffffffffffffffffc00
+00000000c0ffffffffff00007ffffffffffffffffc907d0c000000baffffff00007fffff
+ff790003ffffffffffffffffffffffffffff00007fffffffffffff00007fffffffff0000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ff
+ffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00007fffffffff
+ffff3e001f780000ffffffff400004faffffffffffff7d0000c5ffff7f0000ffffffffff
+ff7f0000ffffffffffffffffffffffffc5000080ffffffffffffffaeb0f6ffffffffff41
+000684020038ffffffffff00007fffffffb073ffffffffffffcb000078ffffff00007fff
+ffffc5000080ffffffffffffffaeb0f6ffffff00007fffffffffffff00007fffffffff00
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787
+ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00007fffffff
+ffffffc80000050000ffffffff8e000080fffffffffff5080007ffffff7f0000ffffffff
+ffff7f0000ffffffffffffffffffffffffff070000b8ffffffffffb600003fffffffff7c
+000085ffc2000040ffffffff00007fffff870000b6ffffffffffff030089ffffff000086
+ffffffff070000b8ffffffffffb600003fffffff00007fffffffffffff00007fffffffff
+000086ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff87
+87ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00007fffff
+ffffffffff8600000000fffffffff901000036c4fffb7a0500007fffffff7f0000ffffff
+ffffff7f0000ffffffffffffffffffffffffff7f0000007dfbfffb7d000000c2ffffffb3
+00004cffffff4d0000b2ffffff00007ffffffa0100007dfbffffc6390005fbffffff0000
+43fff9ffff7f0000007dfbfffb7d000000c2ffffff00007fffffffffffff00007fffffff
+ff000043fff9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff
+8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00007fff
+fffffffffffffa02000000ffffffffffbb00000000000000000047ffffffff7f0000ffff
+ffffffff7f0000ffffffffffffffffffffffffffff4700000000000000000047fffffffd
+000002fffffffffe020000fdffff00007fffffff800000000000000000007dffffffff00
+00000000f2ffff4700000000000000000047ffffffff00007fffffffffffff00007fffff
+ffff0000000000f2ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffff
+ff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc000072
+ffffffffffffffffb9000000fcffffffffffcb3a00000000000982ffffffffff720000fc
+ffffffffff720000fcffffffffffffffffffffffffffff820900000000000981fffffff2
+240000bcffffffffffbc000024f9ff000072ffffffffb90300000000000880ffffffffff
+b80000000074ffffff820900000000000981fffffffffc000072fffffffffffc000072ff
+ffffffb80000000074ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effff
+ffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8575
+c3ffffffffffffffffff8a8185fffffffffffffffffe908680c7ffffffffffffffc37585
+ffffffffffffc37585ffffffffffffffffffffffffffffffffffc7808980c7ffffffffff
+c46d7cc3ffffffffffffffc37c6dc8ff8575c3ffffffffffffc7808980c7ffffffffffff
+fffffc8e8678c3ffffffffffc7808980c7ffffffffffffff8575c3ffffffffffff8575c3
+fffffffffffc8e8678c3ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001eff
+ffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001e
+ffffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f000000
+1effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000
+001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f00
+00001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
+0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff726f74747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+74747463baffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffd0000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000074ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000
+0a0101010101010101010101010101010101010101010101010101010101010101010101
+010101010101010101010101010101010101010101010101010101010101010101010101
+010101010101010101010101010101010101010101010101010101010101010101010101
+010101010101010101010101010101010101010101010101010101010101010101010101
+010101010101010101010101010101010101010101010101010101010101010101010101
+010101010101010101010101010101010101010101010101010101010101010101010101
+010101010101010101010101010101010101010101010101010101010101010101010101
+010101010101010101010101010101010101010101010101010101010101010101010101
+0101010101010101010101010101020a1a22222011040101010101010101010101010101
+010101010101010101010101010101010101010101010101010101010101010101010101
+010101010101010101010101010101010101010101010101010101010101010101010101
+010101010101010101010101010101010101010101010101010101010101010101010101
+010101010101010101010101010101010101010101010101010101010101010101010101
+010101010101010101010101010101010101010101010101010101010101010101010101
+010101010101010101010101010101010101010101010101010101010101010101010101
+010101010101010101010101010101010101010101010101010101010101010101010101
+010101010101010101010101010101010101010101010101010101010101010101010101
+0101030a000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+84ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff7c797e6cc4ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff040000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+0081ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff0000000078ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763190000
+00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787631900
+0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319
+000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763
+19000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787
+6319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+fffffffffffffffffffffffff8fdfbffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffafffffffdecffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87
+876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+fffffffffffffffffffffb751c0000006af0ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff8f77ffffff6300f3ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff
+87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffff2a003d9091420000a7ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff006effffffc179ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffff
+ff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffff2c00c4ffffffffc60000efffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff0087ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffff
+ffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffb900c3ffffffffffffbc0086ffffb36cfc7051aeffffffac60
+60acffffffffffffed6f656572efffffb75d003066b3ffb35dffffb36affb06060aeffff
+ffffffffae615fb6ff67b3ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ff
+ffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffff2500ffffffffffffffffc6ffffff7200200000b2ffff2900
+00000029ffffffffa6000000000000a6ff770000000073ff6f00feff7200230000000033
+ffffffff2c000000005f0072ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787
+ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffff0072ffffffffffffffffffffffff7e0042ffffffff2900
+c6ffffc6002cffffa40044ffffffcd0000ffffff0080ffffff7900ffff7e0000c7ffff52
+00b6ffff2c0090ffff8e00007effffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff87
+87ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffff007affffffffffffffffffffffff7b00d0fffffff100
+daffffffffdc00b3ffbd7effffffffff8600ffffff007bffffff7900ffff7b00cbffffff
+ff0075fff30084ffffffff8e007effffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff
+8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffff007affffffffffffffffffffffff7a00ffffffff80
+00736c66666c720076fffffffffff7ffc22400ffffff0079ffffff7900ffff7a00ffffff
+ffff0079ff7d00ffffffffffff007affffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffff
+ff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffff0067fffffffffffffffffcffffff7900ffffffff
+7d000000000000000081fffffb731a0000000000ffffff0079ffffff7900ffff7900ffff
+ffffff0079ff7800ffffffffffff0079ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effff
+ffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffff6a00ffffffffffffffff6e4cfeff7900ffffff
+ff7500fffffffffffffffffffe29003e9384e68900ffffff0079ffffff7900ffff7900ff
+ffffffff0079ff7400ffffffffffff007affffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001eff
+ffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffc100abfffffffffffffb0026ffff7900ffff
+ffffc500c1ffffffffffeef6ff7c00d0ffffffff7600ffffff007affffff7900ffff7900
+ffffffffff0079ffc500bdffffffffc2007dffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001e
+ffffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffff4400a8fffffffffa2f00caffff7900ff
+ffffffff0026fdffffffa200bbff7300fdffffffa80000ffffff0074ffffff7900ffff79
+00ffffffffff0079ffff0026fdfffffb34007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f000000
+1effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffff45001e6a66590000c2ffffff7600
+ffffffffffbf00005c6f240041ffffc400005d6d18002a00ffffff000053b4ff7600ffff
+7600ffffffffff0076ffffbf00005f5d0000007effffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000
+001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffff983a00000078caffffffff7d
+00fbffffffffffd13900000088ffffffffd139000033ded300baffffbc000075ff7d00fb
+ff7d00fbfffffffb007dffffffd83a000050ff0079ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f00
+00001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+fffdfffffffffffffffffffffffffffffffffffffffffffffffcfefffffffffffffffffd
+fffffffdfffffffffffdffffaf61ffffffffffff0085ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
+0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff7a00aaffffffff2d00feffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffa0600226b6a1c0081ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff8b00000035d0ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff030000008cffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffad566b6b6b6b707000000000357a6b6b6b6b6a57c0ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffb900000000000000000000000000000000000000f2ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff45000000000000000000000000000000000089ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffcb000000000000000000000000000000000affffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff440000000000000000000000000000008affffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffcb00000000000000000000000000000affffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff44000000000000000000000000008affffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffcb0000000000000000000000000affffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff4400000000000000000000008affffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffcc0000000000000000000005ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763190000
+00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff44000000000000000000c5ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787631900
+0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffcc000000000000000045ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319
+000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff4400000000000000ccffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763
+19000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffcc00000000000044ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787
+6319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff440000000000ccffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87
+876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffcc0000000044ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff
+87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff44000000ccffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffff
+ff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc000044ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffff
+ffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3c00cbff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ff
+ffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc656ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787
+ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4f6fafffb
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff87
+87ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffff1f9ed6f6366696000000000
+002a6e6666636fedf9f1ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff
+8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffcac662a0000000000000000000000
+00000000000000000000002a66acfcffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffff
+ff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffff8b0570000000000000000000000000000
+0000000000000000000000000000000057b0f8ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effff
+ffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffeb752900000000000000000000000000000000
+00000000000000000000000000000000000000002975ebffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001eff
+ffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffed67000000000000000000000c0b0a0a0151a39a
+9a9a9a9a9a9a9d9113070a0a0f000000000000000000000067edffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001e
+ffffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffeb680000000000000000000351a9ffffffffffffff
+ffffffffffffffffffffffffffffd78b170000000000000000000068ebffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f000000
+1effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffa300000000000000000351a9ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffd49b54030000000000000000a3ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000
+001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffaf250000000000000056a9ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffa9560000000000000025afffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f00
+00001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffb2220000000000000050daffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffda500000000000000022
+b2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
+0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffa30000000000000052dbffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdb520000000000
+0000a3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff2f00000000000052dbffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcb0d0000
+000000002fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffff137000000000052dbffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99
+16000000000037f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffa3000000000000d0ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff5a000000000000a3ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffa400000000000ec8ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff9b040000000000a4ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff2f00000000005dffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffce0000000000002fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffc2f000000000059ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffdb5000000000002ffcffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff7300000000005bffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff58000000000073ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffa70000000000d1ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff9d0500000000a7ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffb70000000000cfffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffd00000000000b7ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff605757
+57575750a2ffffffffffffffffffffffffffffffffff50acffffffffffffffffffffffff
+ffe5b3ffffffa748fdffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff2f00000000cdffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffcd000000002fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000
+00000000000014adffffffffffffffffffffffffffffff006fffffffffffffffffffffff
+ffff1065ffffff7300f5ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff310000000057ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff570000000031ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+82ffffffffff9d0000b4ffffffffffffffffffffffffffff0079ffffffffffffffffffff
+ffffff007bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff32000000005bffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff5b0000000032ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+007affffffffffffd20020ffffffffffffeeeeffffffffffff0079ffffffffffeeeeffff
+ffffffe70074fff9fff9e5fffff8e6ffffeeeeffffffffffffffffeeedffffe4f8ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffa6000000005fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff5f00000000a6ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff0079ffffffffffffff8a00efffffffa909000009a9ffffffff0079ffffffa909000009
+a9ffff680000000066ff7100fbff72009f0f000011a8ffffffffab0d000025e10072ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffb50000000008ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff0800000000b5ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff0079ffffffffffffffff007affff990045a2a245009affffff0079ffff990045a2a2
+45009affd48f0049a0cdff7800ffff7c000048a5960000eeffff9a000594930700007dff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff3000000000ccffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffcc0000000030ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff0079ffffffffffffffff0078ffff005affffffff5d00eeffff0079ffff005affff
+ffff5d00f1ffff0084ffffff7900ffff7e0061ffffffd4007dffff003fffffffff4c007e
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763190000
+00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffa300000000ceffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffce00000000a3ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff0079ffffffffffffffff0079ffaf00f3fff2f2fff4007bffff0079ffaf00f3ff
+f2f2fff4007bffff0079ffffff7900ffff7a00ffffffffff0079ffaf00d1ffffffffd500
+7bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787631900
+0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffef0000000047ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4900000000ef
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff0079ffffffffffffffff0078ff7900000000000000006fffff0079ff790000
+0000000000006fffff0079ffffff7900ffff7900ffffffffff0079ff7500ffffffffffff
+007affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319
+000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff7100000001d3ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd000000000
+71ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff0079ffffffffffffffb5008eff7900a2a19c9c9c9d91d0ffff0079ff7900
+a2a19c9c9c9d91d0ffff0079ffffff7900ffff7900ffffffffff0079ff7700ffffffffff
+ff0079ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763
+19000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffff6000000008dffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff470000
+0000f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff0079ffffffffffffff6700feff8b00ffffffffffffffffffff0079ff8b
+00ffffffffffffffffffff0079ffffff7900ffff7900ffffffffff0079ff8b00f5ffffff
+fff6007bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787
+6319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff3300000049ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd301
+00000033ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff007dffffffffffffa50053fffffd006dfffffffff94dbbffff0079ff
+fd006dfffffffff94dbbffff0082ffffff7900ffff7900ffffffffff0079fffd006effff
+ffff78007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87
+876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffb600000000d0ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+9100000000b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff0071fff2f2f5eb5e0000ffffffff4f005eebfdae0900f2ffff0079
+ffff4f005eebfdae0900f2ffff002deefbff7900ffff7900ffffffffff0079ffff4e005d
+eeed5d00007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff
+87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff2f0000005effffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff0e0000002fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffc00000000000000004bd8ffffffffff570000000000c7fffffc00
+6bffffff570000000000c7ffffff51000067ff6b00fcff6b00fcfffffffc006bffffff59
+0000000096007bffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffff
+ff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffb20000000fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff8e00000000b0ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff9c9d9e9e9e9e96d7ffffffffffffffffd6969ca4ffffffffff
+8fceffffffffd6969ca4ffffffffffffa28ecfffce8fffffce8fffffffffff8fcefff7ea
+ffd99696e0ff0074ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffff
+ffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff6a00000091ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff1000000081ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff69
+00faffffffffa400c9ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ff
+ffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff7a00000030ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+c60013adf9fb9d0038ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787
+ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffb50000000cffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffd000000000f1ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff97050000000048deffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff87
+87ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff6b0000007effffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff0e00000086ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffa49d97d6ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff
+8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffff00000000091ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff790000002effffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffff
+ff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff8500000000ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffd000000000ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effff
+ffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff2f0000004effffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff0e000000b4ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001eff
+ffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffff1000000007cffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff790000006affffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001e
+ffffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff7f00000000d1ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffd100000000ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f000000
+1effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff7e00000000ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000
+001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff8500000000ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff00000000b2ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffa58effffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f00
+00001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff2d0000000bffffffffff
+ffffffffffffffe6edefefeff0eaffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffff3ffffffffffffffffffffffff0b0000007bffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff73001fa7ffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
+0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000080ffffffff
+fffffffffffffffb000000000000000ca4ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff7d71ffffffffffffffffffffffff8000000080ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7f0000001ea7ffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffff0048b3a0a1a3980c0021f7ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff0070ffffffffffffffffffffffff7f0000006effffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff7f0000000000246ae5ffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffff0083ffffffffffff600066ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff0089ffffffffffffffffffffffff7f00000000ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff7f00000000000000005ee8ffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007dff
+ffffffffffffffffffffff0079ffffffffffffff4100ffffffffff9c47479cffffffffff
+4ec0ac3d4cffac4fffa0444ba0ffff99474b9fffffffffffe1584b4c5de2ffffffff4ebb
+f257495de1ffffab4400244ba7ffffffffffffffffffff7d00000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff7f000000000000000000005ee8ffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb20000000091
+ffffffffffffffffffffffff0079ffffffffffffffd400acfffffb1a000000001afbffff
+ff000d000042ff74008800000000b42800000000b0ffffff9600000000000095ffffff00
+110000000000adff7f000000007cffffffffffffffffffff9100000000ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff8d0000000000000000000000004da0ffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b00000000
+ffffffffffffffffffffffffff0079ffffffffffffffff0075ffff2200a7ffffa70022ff
+ffff0000d5ffffff7e0000d1ffdd000846e5ffdd001dffff9a0055ffffffdd0000feffff
+000060ffffdd001dffffff0084ffffffffffffffffffffffffff00000000b2ffac475a5a
+5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
+5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
+5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
+5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
+5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
+5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a
+5a5a5a5a5a5a5a5a5a5a59682d00000000000000000000000000001da5ffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f000000
+00ffffffffffffffffffffffffff0079ffffffffffffffff0079ffac0091ffffffff9100
+acffff004bffffffff7b00d6ffffff7e00d8ffffff7a00ffffc994ffffffffff8900ffff
+ff004dffffffff7a00ffffff007affffffffffffffffffffffffff000000007bff750000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000001da5ffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000
+0000ffffffffffffffffffffffffff0079ffffffffffffffff0079ff7600ffffffffffff
+0076ffff007dffffffff7a00ffffffff7a00ffffffff7a00ffffffffffffe8f6ad1700ff
+ffff007effffffff7a00ffffff0079ffffffffffffffffffffffffff000000007dff7f00
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000000000000000000000000001beff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7d00
+000000ffffffffffffffffffffffffff0079fffffffffffffff20074ff7900ffffffffff
+ff0079ffff0079ffffffff7900ffffffff7900ffffffff7900fffffff55c0a0000000000
+ffffff0079ffffffff7900ffffff0079ffffffffffffffffffffffffff0000000091ff7b
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000001692fc
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff91
+00000000b2ffffffffffffffffffffffff0079ffffffffffffff8100d1ff7300ffffffff
+ffff0078ffff0079ffffffff7900ffffffff7900ffffffff7900fffff6190053aa9bf98e
+00ffffff0079ffffffff7900ffffff0079ffffffffffffffffffffffffb200000000ffff
+880012111111111111111111111111111111111111111111111111111111111111111111
+111111111111111111111111111111111111111111111111111111111111111111111111
+111111111111111111111111111111111111111111111111111111111111111111111111
+111111111111111111111111111111111111111111111111111111111111111111111111
+111111111111111111111111111111111111111111111111111111111111111111111111
+111111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111a0800000000000000000000000000000019a3ffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007bffffffffffffffffffffffff0079ffffffffffffff1c00ffffcf00b5ffff
+ffffb8008effff0079ffffffff7900ffffffff7900ffffffff7900ffff7700dfffffffff
+7000ffffff0079ffffffff7900ffffff007bffffffffffffffffffffffff7b00000000ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff8a0000000000000000000000000019a4ffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffff0088ffffffffffeb2400cbffffff001bee
+ffffee1c00ffffff0079ffffffff7900ffffffff7900ffffffff7900ffff7300f0ffffff
+950000ffffff0079ffffffff7900ffffff006dffffffffffffffffffffffff7f00000000
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff8000000000000000000000001aa4ffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffff001a5a4c4c4f4600005effffffffcd00
+0047470000ceffffff0075ffffffff7500ffffffff7500ffffffff7500ffffce00004653
+06003600ffffff0075ffffffff7500ffffff00003ba8ffffffffffffffffffff7f000000
+4fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff7f0000000000000000001aa4ffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff0000000085fffffffffffffffffffffffb160000000000004fe2ffffffffffff
+df4c00004cdffffffffb0183ffffffff8301fbffffff8301fbffffff8301fbffffde4c00
+0046eddc04b8fffb0183ffffffff8301fbffffcc0c007cffffffffffffffffffff850000
+0083ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff7f000000000000001aa4ffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff0d0000002bffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2b00
+00007dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff7f00000000001aa4ffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff8000000000ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+00000092ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff7f0000001aa4ffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763190000
+00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7f00000000ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff74001ba6ffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787631900
+0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff7800000000b0ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+b200000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff908dffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319
+000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffd20000000081ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff690000004dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763
+19000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff100000002bffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff0000000096ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787
+6319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff9300000000ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffb200000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87
+876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff00000000b2ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff690000004fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff
+87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff4f00000069ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007cffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffff
+ff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff9500000000ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffb000000000d2ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffff
+ffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff12000000f2ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff6a00000011ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ff
+ffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff7b0000006cffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffef000000007bffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787
+ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffcf00000000efffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff6c00000000cfffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff87
+87ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff4c0000006fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffef000000004cffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff
+8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffd400000000b2ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff6c00000000d4ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffff
+ff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff4c0000002affffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffef000000004cffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effff
+ffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffd400000000b4ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff6c00000000d4ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001eff
+ffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6500000026f9ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffef0000000065ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001e
+ffffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1200000069ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff6c00000012ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f000000
+1effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9300000000
+f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffff50000000093ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000
+001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff120000
+0029fbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffb2900000012ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f00
+00001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9100
+0000002affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff2a0000000091ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
+0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+64000000009dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff9d0000000064ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff4f000000009bffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff9b000000004fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffd7000000000096ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff960000000000d7ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffd90300000000f2ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffff20000000003d9ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffda0400000028fdffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffe2800000004daffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffd50000000026ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffe52b00000000d5ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff64000000001aa1ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff97000000000064ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff66000000000099ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff95000000000066ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff6400000000009bffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffb24000000000064ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffae0b0000000051f4ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffe42b000000000baeffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffdb040000000025ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff97000000000004dbffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffd903000000001b9effffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffdf57000000000003d9ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffd41b0000000000179dffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffde540000000000001bd4ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff6a000000000000179dff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff91000000000000006affffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6b00000000000000
+179dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff9d17000000000000006bffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe96300000000
+00000015a2e8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffe8a2150000000000000063e9ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763190000
+00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb5d00
+000000000000001b4d98efffffffffffffffffffffffffffffffffffffffffffffffffff
+ffe9994d1b00000000000000005debffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787631900
+0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+aa2100000000000000000000475adde9e0ffffffffffffffffffffffffffffffe7e5ef99
+4d1b0000000000000000000021aaffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319
+000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffac21000000000000000000000000001b574e4f4699efe6e9dd574c4e514a000000
+000000000000000000000021acffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763
+19000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffab2217000000000000000000000000000000000000000000000000000000
+0000000000000000001722abffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787
+6319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffbe64100000000000000000000000000000000000000000000000
+000000000000001064beffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87
+876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffb9a62900000000000000000000000000000000000000
+000000000029a6b9ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff
+87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffe3aab5a924181b1b1a000000000000201a1b
+1824a9b5aae3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffff
+ff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6afb2b2aae4ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffff
+ffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ff
+ffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdde3e5db
+f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787
+ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa000000
+0073ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff87
+87ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff
+8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffff
+ff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effff
+ffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001eff
+ffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001e
+ffffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f000000
+1effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000
+001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f00
+00001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
+0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763190000
+00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787631900
+0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319
+000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763
+19000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787
+6319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87
+876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff
+87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffbcb43333445d4ffffffffffdb
+a5ffffffffffffffffffffffffffffffffffffffffffdba5ffffff9628fbffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffff
+ff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffed0600050b10000044ffffffff
+0067ffffffffffffffffffffffffffffffffffffffffff0067ffffff8000f7ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffff
+ffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff5500bcfffffff6630087ffff
+ff007dffffffffffffffffffffffffffffffffffffffffff007dffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ff
+ffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff0081ffffffffffff4000fe
+fad1006aebeffffffffcd8ded8fcffffffffedd4ffdfdadfdb006aebefffeeccffffffce
+f9ffdedbdefffffffffffffdd9d8fbffcfedffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787
+ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff0065ffffffffffffdea9
+ff670000000062ffff91000000000095ffffff6e00730000000000000062ff6b00fbfffa
+00524e0000003be9ffffff930000000fcc006effffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff87
+87ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff47004bd5e2ffffffff
+ffffe2ad0059c1deff78005fc3bbb50400a0ffff7d000bb0c6ebb40059c1dbff7800ffff
+ff000001b0c56c0059ffff83001eb2b11e00007dffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff
+8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd91a000000364ecd
+f9ffffffff0081fffff90f63ffffffffef0078ffff7e00a1ffffffff0081ffffff7900ff
+ffff000ae7ffffff5300ffff004cffffffff59007effffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffff
+ff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc76b1a0000
+000df4ffffff0079ffffffffffffffffffe2007bffff7a00ffffffffff0079ffffff7900
+ffffff007fffffffff7d00ffaa00deffffffffe0007bffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effff
+ffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea
+bd73000cedffff0079fffffffffac941332c00007dffff7900ffffffffff0079ffffff79
+00ffffff0079ffffffff7900ff7c00ffffffffffff007affffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001eff
+ffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9a35ffffffff
+ffffffe50075ffff0079fffffff20800070a1fad007bffff7900ffffffffff0079ffffff
+7900ffffff0079ffffffff7900ff7d00ffffffffffff0079ffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001e
+ffffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a00aaffff
+ffffffffff0073ffff0079ffffff0f00bdffffffff007affff7900ffffffffff0079ffff
+ff7900ffffff0079ffffffff7900ff9b00ecffffffffee007bffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f000000
+1effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0711fe
+ffffffffff8e00d4ffff0083ffffff008cffffffff92007effff7900ffffffffff0083ff
+ffff7900ffffff0079ffffffff7900ffff005fffffffff6b007effffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000
+001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9300
+0094e5e0d4400064fffffe001fd6f6ff000099e8d23500007fffff7900fffffffffe001f
+d6f0ff7900ffffff0079ffffffff7900ffff630041d7d63f00007effffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f00
+00001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+b21c000000000070ffffffff66000063ffd91600000012d80244ffff6900fbffffffff66
+000063ff6900fbfffb0069ffffffff6900fdffff7500000000b4007bffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
+0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffbfb9bcb6e8ffffffffffffbdafddffffffbfb9bfffffdeaaffffdcaaffffffffff
+ffbdafddffdcaaffffffaadcffffffffdcaaffefd3ffebb6b4f3ff0073ffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff6600f2ffffffff8e00d5ffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffd3000093e4e6830044ffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffb11b0000000064ebffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffc0bbb7eaffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763190000
+00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787631900
+0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319
+000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763
+19000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787
+6319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87
+876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff
+87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffff
+ff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffff
+ffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ff
+ffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787
+ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff87
+87ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff
+8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffff
+ff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+0500000090ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effff
+ffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb726393b3b3b3f
+43000000001e473b3b3b3b3926b7ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001eff
+ffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0900000000
+0000000000000000000000000009ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001e
+ffffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0000000
+0000000000000000000000000000a0ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f000000
+1effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1900
+000000000000000000000000000019ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000
+001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0
+0000000000000000000000000000009cffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f00
+00001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff1b0000000000000000000000000059ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
+0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff9f00000000000000000000000000deffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff1b000000000000000000000057ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff9f0000000000000000000000ddffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff1c0000000000000000007bffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffc3000000000000000000ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffdc000000000000000055ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff5700000000000000dfffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffdf00000000000057ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff570000000000dfffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffdf0000000057ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff57000000dfffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffdf000059ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff4f00ddffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffe285ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffd4d1d5dedbffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffff8ccd5c94035373a3400000000000c3e37373540c9d5ccf8ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763190000
+00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffdd83350c000000000000000000000000000000000000000000000c
+3583ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787631900
+0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffff7d5872a0000000000000000000000000000000000000000000000000000
+000000002a87d5f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319
+000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffc9440900000000000000000000000000000000000000000000000000000000
+00000000000000000944c9ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763
+19000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffca3b000000000000000000002c2f2e2e257bd2c9c9c9c9c9c9c9ccc0372b2e2e
+3408000000000000000000003bcaffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787
+6319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffc83c000000000000000000247bd5ffffffffffffffffffffffffffffffffffffff
+fffff6b83f040000000000000000003cc8ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87
+876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff7b0000000000000000247bd5ffffffffffffffffffffffffffffffffffffffffff
+fffffffffffff2cb7d2400000000000000007bffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff
+87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffe84060000000000000180d5ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffd580010000000000000684feffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffff
+ff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff8802000000000000017cfaffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffa7c010000000000000288ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffff
+ffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fc7b000000000000017cfaffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffa7d050000000000007bfcffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ff
+ffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ef100000000000017cfaffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffea3100000000000010efffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787
+ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+cc1900000000067dfaffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffc539000000000019ccffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff87
+87ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+7f000000000010f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff7e0000000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff
+8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa
+7c000000000033e6ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc81700000000007c
+faffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffff
+ff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee
+10000000000080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb0c00000000
+0010eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effff
+ffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8
+1000000000007dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8760000
+00000010e8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001eff
+ffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+5e000000000585ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7d
+00000000005effffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001e
+ffffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+800000000013efffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffc8180000000080ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f000000
+1effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+a20000000014ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffee1400000000a2ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000
+001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+f01900000000e5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffe50000000019f0ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f00
+00001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+eb13000000007affffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7a0000000013ebffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
+0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffd3324212020201a75fcffffffff
+fffffffffffffffffffffffd2194ffffffffffffffffffffffffffcf9bffffff8c13faff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff19000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff7f0000000019ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff0001291e1e1f1a000084ffff
+ffffffffffffffffffffffffff0073ffffffffffffffffffffffffff0068ffffff8a12f8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff840000000084ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff840000000084ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff0088ffffffffffcc0c009d
+ffffffffffffffffffffffffffff0079ffffffffffffffffffffffffff007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff9f0000000019ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff19000000009fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff0079fffffffffffff007
+0bfffffffffff3c7c7f3ffffffffff0079fffffffff3c7c7f3ffffffecc00062d6e5ffe4
+baffffffbcf1ffcec9cefffffffffffff3c7c6f3ffbee4ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff1d00000015eaffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffea150000001dffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff0079ffffffffffffff
+a300e0ffffff7e000000007effffffff0079ffffff7e000000007effff620000000060ff
+6a00fcfffc00463a00000028e2ffffff8200000003ba006dffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffa400000000e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffe700000000a4ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0079ffffffffffff
+ffff0074ffff700073d6d6730073ffffff0079ffff700073d6d6730072ffefc00062d6e5
+ff7900ffffff00000ac6da7d0050ffff72002fc6c53000007effffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff1f00000059ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff5b0000001fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0079ffffffffff
+ffffff0079ffff008bffffffff8c00dbffff0079ffff008bffffffff8c00ddffff0080ff
+ffff7900ffffff0014f2ffffff5a00ffff0057ffffffff63007effffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff7f00000015eaffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffe2000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0079ffffffff
+ffffffff0079ff9c00d3d8cdcdd8d40075ffff0079ff9c00d3d8cdcdd8d40075ffff0079
+ffffff7900ffffff0080ffffffff7c00ffa100e5ffffffffe8007bffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffe100000000a6ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff5b00000000e1ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0079ffffff
+ffffffffff0077ff7a000000000000000070ffff0079ff7a000000000000000070ffff00
+79ffffff7900ffffff0079ffffffff7900ff7c00ffffffffffff0079ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff5b0000001dffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffe2000000005bffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0079ffff
+ffffffffffa0009eff7800d1d4cecececec4e7ffff0079ff7800d1d4cecececec4e7ffff
+0079ffffff7900ffffff0079ffffffff7900ff7c00ffffffffffff0079ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffe000000000a2ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff5b00000000e0ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0079ff
+ffffffffffff5600ffff9c00f0ffffffffffffffffff0079ff9c00f0ffffffffffffffff
+ff0079ffffff7900ffffff0079ffffffff7900ffa300e5ffffffffe7007bffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff5a0000005fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffe2000000005affffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0080
+ffffffffffff7e0079ffffff0055ffffffffe61eb3ffff0079ffff0055ffffffffe61eb3
+ffff0081ffffff7900ffffff0079ffffffff7900ffff0055ffffffff61007effffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffde00000000e2ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff5b00000000deffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+5edfcbcbcec22f000dffffffff74002ec2d6800000ffffff0079ffff74002ec2d6800000
+fffffe0014c3e8ff7900ffffff0079ffffffff7900ffff74002dc5c42d00007effffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff7f0000005bffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb
+00000000000000007cf5ffffffffff830000000026e5fffffc0069ffffff830000000026
+e5ffffff76000061ff6900fcfffc0069ffffffff6900fdffff8700000006c5007bffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff20000000e7ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f0000001cff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffc9ccd0cfcfd0c9f4fffffffffffffffff4cacfd1ffffffffffbde5fffffffff4cacfd1
+ffffffffffffcfc3e7ffe5bdffffffbde5ffffffffe5bdffe6c3fff9cac9ffff0074ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff9f00000000ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa400000000
+e1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff6500e7ffffffff7d00ddff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff5b00000061ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763190000
+00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffdc00007fd2d471004dff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007dffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5e00
+00005effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787631900
+0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc22d0000000079f4
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffa400000000e2ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa4
+00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319
+000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd1cfc9f4ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff1a0000001effffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff00000000a1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763
+19000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffe10000000083ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff5e0000005bffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787
+6319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff7900000000a1ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffa400000000feffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87
+876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffc6ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff7f00000001ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff01000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff
+87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffc42d00f9ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff8500000000ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000009effffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffff
+ff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffc435000000ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff190000001dffffffffffffffffffffffffffffffffff
+ffffffffc2c5c9c8c8c8c9c2f0ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffe1b7ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff1d0000007cffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffff
+ffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffc4350000000000ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff0000000086ffffffffffffffffffffffffffffffff
+fffffffffa0000000000000000007effffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff6a00fbffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff8600000082ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ff
+ffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffc43500000000000000
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffff0061e6d0d1d1d3ce10009cffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff7900ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff7f0000005effffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787
+ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffc4350000000000000000
+00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffff007ffffffffffffff40b09ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff7d00ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff7f00000000feffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff87
+87ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffc433000000000000000000
+0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007cffffffffffffffffffffffffff
+ffffffffffffffff0079ffffffffffffff8500fffffffff46a13136af4ffffffffffbb25
+18192cbdffffffffffbb25162bdc8700ffbe1bd8ffffffff931af8ffffffffffffffffff
+ffffffffffffffffffffff7c00000000ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff
+8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffc23300000000000000000000
+000004ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff9e00000000a3ffffffffffffffffffffffff
+ffffffffffffffffff0079ffffffffffffff5900ffffffe4000029290000e5ffffff6e00
+1f252b000071ffffff6e001e2c00000600ffff0072ffffffff0045ffffffffffffffffff
+ffffffffffffffffffffffffa300000000ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffff
+ff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffc2330000000000000000000000
+00000000352e2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d
+2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d
+2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d
+2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d
+2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d
+2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d
+2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d282ffdff7c00000001ffffffffffffffffffffffff
+ffffffffffffffffffff0088fffffffffffc710053ffffff0000f7fffff70003ffff8600
+7cfffffffc1200fdff960084ffffff810000ffff5003ffffffdd00a0ffffffffffffffff
+ffffffffffffffffffffffffffff010000009effffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effff
+ffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff0000000083ffb532000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000ffff7f00000000ffffffffffffffffffffff
+ffffffffffffffffffffff000424181d283000002fe4ffffdc00ffffffffffff0097ffe1
+c4ffffffffff8d00ffff4a0cffffffffff1d00ffffa000ddffff7500ffffffffffffffff
+ffffffffffffffffffffffffffffff000000007cffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001eff
+ffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff0000000089d700000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000ffff7f00000000ffffffffffffffffffff
+ffffffffffffffffffffffff000c322823000022daffffffff7800291b18181b260074ff
+fffffff2c1ce7c0000ffff007cffffffffff7f00ffffff0075ffff0250ffffffffffffff
+ffffffffffffffffffffffffffffffff000000007cffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001e
+ffffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff0000000083fffa8606000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000ffff7c00000000ffffffffffffffffff
+ffffffffffffffffffffffffff0089ffffffcc001fffffffffff7d00312a26262629209b
+ffffe127000000010f00ffff0079ffffffffff7900ffffff5002ffe400a0ffffffffffff
+ffffffffffffffffffffffffffffffffff00000000a3ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f000000
+1effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffff8606000000000000
+00000000000000003e3b3737373737373737373737373737373737373737373737373737
+373737373737373737373737373737373737373737373737373737373737373737373737
+373737373737373737373737373737373737373737373737373737373737373737373737
+373737373737373737373737373737373737373737373737373737373737373737373737
+373737373737373737373737373737373737373737373737373737373737373737373737
+373737373737373737373737373737373737373737373737373737373737373737373737
+37373737373737373737373737373737373737323afcffa3000000009effffffffffffff
+ffffffffffffffffffffffffffff0079ffffffff7f0077ffffffff7400ffffffffffffff
+ffffe0000084d9cbff9300ffff007affffffffff7e00ffffffa000ff8400ffffffffffff
+ffffffffffffffffffffffffffffffffff9e00000001ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000
+001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff8707000000
+000000000000000005ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff010000007cffffffffffff
+ffffffffffffffffffffffffffffff0079ffffffffff5a009dffffffe3009fffffffffff
+b6dbff7100feffffffff5c00ffff5006ffffffffff1700ffffffff007c2150ffffffffff
+ffffffffffffffffffffffffffffffffffff7c00000000ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f00
+00001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff8707
+00000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffff0079ffffffffffed0a03e7ffffff0903c8fffffd
+6400cfff7400cbfffffb690000ffff9b006ffefffd750000ffffffff570000a2ffffffff
+ffffffffffffffffffffffffffffffffffffff7f00000000ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
+0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ff87070000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffff0072ffffffffffffa30043ffffffed01001420
+000077ffffe60400141e000f5100ffffff7b00002300000500ffffffffa50000ffffffff
+ffffffffffffffffffffffffffffffffffffffff7f00000063ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffff8707000000000000ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000085ffffff
+fffffffffffffffffffffffffffffffffffd2797ffffffffffffff7e18b4fffffffc7c22
+2638c8fffffffffb7c222075fff029b7ffffffc8382438daa72efdffffffff0059ffffff
+ffffffffffffffffffffffffffffffffffffffffff8500000081ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffff870700000000ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f00000019ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1009fffff
+ffffffffffffffffffffffffffffffffffffffffffff190000007cffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffff87070000ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8600000000ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4e07ffff
+ffffffffffffffffffffffffffffffffffffffffffffff00000000a3ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffff8009f3ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f00000000
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c02009eff
+ffffffffffffffffffffffffffffffffffffffffffffffff00000001ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+fffffffffffffffffffffffffffffff0ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7a000000
+009dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff940e82ff
+ffffffffffffffffffffffffffffffffffffffffffffffffa000000000ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe50000
+000083ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff580000005fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1e
+00000017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff00000000a7ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+aa00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffa000000000ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff00000000a0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff5800000062ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff5f00000058ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007cffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffa400000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffa000000000e5ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff24000000e3ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b00000021ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff8100000056ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffde0000000081ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffe300000000deffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5600000000e3
+ffffafecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff5f00000059ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffde000000005f
+fffffe00002c32bbc4c7ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763190000
+00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffe6000000009cffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5600000000
+e6ffffffa8000000000000272176cbc7ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787631900
+0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff5f00000019ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc00000000
+5fffffffffff2300000000000000000000272176cbbcf0ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319
+000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffe400000000a1ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff56000000
+00e4ffffffffffa9000000000000000000000000000000042b2ea2dcffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763
+19000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff890000000fe4ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc000000
+0089ffffffffffffff23000000000000000000000000000000000003ddffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787
+6319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffefabdbffffffffffff2400000054ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff560000
+0024ffffffffffffffffa90000000000000000000000000000000000a8ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87
+876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffefbcc5b930242e0000d4ffffffffffffa900000000e1ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10000
+0000a9ffffffffffffffffff2300000000000000000000000000000089ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff
+87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c0cb
+741f272e04000000000000005fffffffffffffffff230000000ee3ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe30e00
+000023ffffffffffffffffffffa9000000000000000000000000000063ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffff
+ff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffdbba731f29260000
+00000000000000000000000000e5ffffffffffffffffa60000000014ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1400
+000000a6ffffffffffffffffffffff260000000000000000000000001aedffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffff
+ffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd2000000000000
+000000000000000000000000005effffffffffffffffffff8c000000007affffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7a00
+0000008cffffffffffffffffffffffff81000000000000000000000002fdffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ff
+ffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a00000000
+000000000000000000000000001bf0ffffffffffffffffffffff1f0000000075ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7500
+0000001fffffffffffffffffffffffffffe500000000000000000000000079f3ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787
+ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff220000
+0000000000000000000000000000adfffffffffffffffffffffffff21b0000000070ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7000
+0000001bf2ffffffffffffffffffffffffffff6200000000000000000000000008e8ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff87
+87ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb00
+000000000000000000000000000023ffffffffffffffffffffffffffffed0000000000e0
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe000
+00000000edffffffffffffffffffffffffffffffe700000000000000000000000000007b
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff
+8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+860000000000000000000000000000abffffffffffffffffffffffffffffff8500000000
+0de6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe70d
+0000000085ffffffffffffffffffffffffffffffffff620000000000002b880000000000
+0078ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffff
+ff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff7200000000000000000000000022ffffffffffffffffffffffffffffffffff8b0000
+00000ce9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf12
+000000008bffffffffffffffffffffffffffffffffffffe700000000001dfcffd71e0000
+00000029e1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effff
+ffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffa9000000000000000000000000a8ffffffffffffffffffffffffffffffffffff64
+00000000007affffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7200
+0000000064ffffffffffffffffffffffffffffffffffffffff6200000000a9ffffffee42
+000000000011bdffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001eff
+ffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffff36c00000000000000000000000066ffffffffffffffffffffffffffffffffffffff
+ed18000000000074ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16d00
+0000000027f9ffffffffffffffffffffffffffffffffffffffffe70000008bffffffffff
+ff8d00000000000072ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001e
+ffffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffbd0c00000000000000000000000000e7ffffffffffffffffffffffffffffffffffff
+fffff418000000000076ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe50500
+000000002969edffffffffffffffffffffffffffffffffffffffffff600063ffffffffff
+ffffff940d00000000006bf2ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f000000
+1effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff74000000000000190000000000000062ffffffffffffffffffffffffffffffffffff
+ffffffffff85000000000028deffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbd1000
+00000000a79c00007affffffffffffffffffffffffffffffffffffffffd915e8ffffffff
+fffffffffff918000000000006e7ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000
+001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffe32800000000001bebb200000000000000e6ffffffffffffffffffffffffffffffffff
+ffffffffffffff8900000000000ae8ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff740000
+0000000098fe1c0000006bf2fffffffffffffffffffffffffffffffffffffff0ffffffff
+ffffffffffffffff850000000000007affffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f00
+00001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff7c00000000000083ffffff6300000000008affffffffffffffffffffffffffffffffff
+ffffffffffffffffffd721000000000072f4ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffba2e0000
+00000021daff31000000000006e7ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff8900000000000076ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
+0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+e22800000000001fd8ffffffffef1b00000025ffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffff51700000000000071f3ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb62c000000
+00000017f5ffffe74200000000000078ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffd81f000000000027e0ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+7b00000000000043f0ffffffffffffec000000acffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff880000000000000071f3ffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff46a00000000
+00000087ffffffffffff8b0000000000006bf0ffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffff04300000000000fbcffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0
+2700000000000e96ffffffffffffffffff8c001fffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffff3ff940b0000000000000071f3ffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3710000000000
+00000b93ffffffffffffffffd81f000000000006e5ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff8d00000000000072ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc
+0f000000000043f3ffffffffffffffffffffff0e98ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffe21a09ffffff8f0c0000000000000075caffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffca75000000000000
+000c8ffffffffffffffffffffffff043000000000010bcffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff950f00000000006af0ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffdfb1bebdbdbdbdbbc0ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffacdbff
+ffffffffffffffffffffdbabffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffabb1ffffffffff
+ffffffe19dd9ffabdbffffffffffffffffffffffffffacdbffffffffffffffffdbacffff
+ffabdbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff267
+00000000000d98fffffffffffffffffffffffffff3ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff7b00000073ffffffff8500000000000000001970caffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffecc0731900000000000000
+0085ffffffffffffffffffffffffffffff8c00000000000073ffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffff918000000000006e7ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff6e0000000000000000
+1cdcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0069
+ffffffffffffffffffffff5c00f2ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6f00d7ffffff
+ffffffff3e00e5fa005cfffffffffffffffffffffffffb0069ffffffffffffffff6900fb
+fff2005cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc0c
+000000000044f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffe2260000000000ceffffffffd34600000000000000000019
+70cafffffffffffffffffffffffffffffffffffffffffff0ad3300000000000000000000
+46d3ffffffffffffffffffffffffffffffffffd921000000000026e0ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff8700000000000078ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b00dae1dbdcdbe7
+8a0007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+79ffffffffffffffffffffffecc9ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1300deff
+ffffffff6900a6ffffc9ecffffffffffffffffffffffffff0079ffffffffffffffff7900
+ffffffc9ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff06700
+00000000008cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff790000000000003cdeffffffffffffd54800000000000000
+00000021242324212db4c0bdbdbdbdbdbdc6701b2423232a020000000000000000000048
+d5fffffffffffffffffffffffffffffffffffffffff51900000000000fbaffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff8a00000000000075ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7900ffffffffff
+ffff910095ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+0079ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb0049
+ffffffffd9005cffffffffffffffffffffffffffffffffffff0079ffffffffffffffff7e
+00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffba0c00
+000000001fd8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffe02700000000000f97ffffffffffffffffffffd24b3c000000
+0000000000000000000000000000000000000000000000000000000000000000003c4bd2
+ffffffffffffffffffffffffffffffffffffffffffffffff8800000000000071ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd921000000000026
+deffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7900ffffffff
+ffffffff0078ffffffffae190919aeffffffffffec5d070e0964edffffffffec5d07096b
+f0007aff425dffffffffff1188ff8c12fdff8d22e761070964ebffffffffed64090873ff
+1d8dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87
+0097ffffff030af0fffffd128cffffffec5d07075decffffffff0079ffffffae190a1fd0
+8500fffffd128cfffd1898c2190a20b1ffffffffffb2200b1af0a417fdffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffef680000
+0000000086ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff7900000000000045f3ffffffffffffffffffffffffffffe68f
+37000000000000000000000000000000000000000000000000000000000000378fe6ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff951000000000006aefff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffef4500000000
+0010baffffffffffffffffffffffffffffffffffffffffffffffffffffffff7900ffffff
+ffffffffe40077ffffff65002b352b0065ffffffdd00003735300000daffffdd0000392d
+0000007eff6d00ffffffff9400dfff7400ffff7800000039300003ffffffdd00002e2d00
+180078ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff1400e4ff6a00a6ffffffff0074ffffdd000037370000deffffff0079ffff65002b3a00
+000100ffffff0074ffff0000002a3b030093ffffff6800004000000400ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6070000
+0000001fd8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffe02700000000000f97ffffffffffffffffffffffffffffffffff
+ffffdfd05310000000000000000000000000000000000000000000001053d0dfffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffff819000000000007
+e6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e0000
+0000000073ffffffffffffffffffffffffffffffffffffffffffffffffffffff7a00ffff
+ffffffffbc0300e4ffff90008cffffff8c0092fffb0000faffffff970075ffff000afeff
+ffde23007fffe60097ffffff450cffff7900ffff7e001cfcffff940095ffff000fddffff
+db1f007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffff60354ec0087ffffffffff0079ffff0007fefffffe0800ffffff0079ff92008dffff
+ff8b0000ffffff0079ffff000090ffffff1303ffff920087ffffff870000ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff79000000
+00000086ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff7900000000000045f4ffffffffffffffffffffffffffffffffff
+fffffffffffffdd7e0d44b3f42453f0000000000134942423f4bd4e0d7fdffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8800000000
+000077ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95
+10000000000025ddffffffffffffffffffffffffffffffffffffffffffffffffff7e001b
+100f18231a00008effffff4463ffffffffff6901ffffcaf5ffffffffff007bffd800abff
+ffffffb2007effff0c45ffffff0079ffff7900ffff7b00f5ffffffff0077ffd800acffff
+ffffb2007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffa5000017ffffffffffff0079ffd600ffffffffffff0093ffff007aff4511ffff
+ffffff2100ffffff0079ffff0066ffffffff8100ffff4511ffffffffff2100ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe025000000
+00001fdaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffdf2400000000000f97ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffdddcddddd7feffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c0000
+000000006aefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffa19000000000009e6ffffffffffffffffffffffffffffffffffffffffffffffff7d00
+3c363807000092ffffffffff00001b0c0c0c190000feffffffffbebab027007eff7300ff
+ffffffffff007affff7900ffff9600e7ffff7900ffff7900ffffffffff0079ff7300ffff
+ffffffff007affffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff6500f2ffffffffffff0079ff76001e0f0c0c0e1a0074ffff007eff007dff
+ffffffff8000ffffff0079ffff007bffffffff7900ffff007dffffffffff8000ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7800000000
+000089ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffb90e000000000046f4ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffda
+22000000000005e4ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff8900000000000076ffffffffffffffffffffffffffffffffffffffffffffff7a
+00ffffffff6000abffffffffff001242333434353744fdffff6b0000000034007dff7900
+ffffffffffff0079ffffe70099ff450effffff7900ffff7900ffffffffff0079ff7900ff
+ffffffffff0079ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7c00ffffffffffffff0079ff7d003d38343434362da2ffff007fff0079
+ffffffffff7900ffffff0079ffff0079ffffffff7900ffff0079ffffffffff7900ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe02500000000
+000f97ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffff06600000000000f99ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fff14600000000000075ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff9710000000000068efffffffffffffffffffffffffffffffffffffffffff
+7900fffffffff21000e1ffffffff0089ffffffffffffffffff64003dd2dde6ff007aff75
+00ffffffffffff007affffff0d50ff0079ffffff7900ffff7900ffffffffff0079ff7500
+ffffffffffff007affffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff7900ffffffffffffff0079ff7600ffffffffffffffffffff007eff00
+79ffffffffff7d00ffffff0079ffff0079ffffffff7900ffff0079ffffffffff7d00ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff760000000000
+0046f4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffb90b000000000047f4ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff8e00000000000073ffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffb1d000000000004e2ffffffffffffffffffffffffffffffffffffff
+ff7900ffffffffffec0005ffffffff5501ffffffffffdfa8ffff006cffffffffe8007bff
+e7009affffffffa2007effffff78009600e7ffffff7900ffff7900ffffffffff0079ffe7
+009affffffffa2007effffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff7900ffffffffffffff0079ffe7009affffffffffacd7ffff007aff
+5401ffffffffff1300ffffff0079ffff0079ffffffff7900ffff5401ffffffffff1400ff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0680000000000
+0f99ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffff0660000000000008effffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffda22000000000025ddffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffff04600000000000fb9ffffffffffffffffffffffffffffffffff
+ffff7900ffffffffffff8b006dffffffa10064f6ffffba003fffff004dffffffb607007e
+ffff0f00bcffffbd12007fffffffe600001cffffffff7900ffff7900ffffffffff0079ff
+ff0f00bcffffbb0c007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763190000
+00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff7900ffffffffffffff0079ffff0f00bcfffff65a00d4ffff0079
+ffa10064f6fff66b0000ffffff0079ffff0079ffffffff7900ffffa10064f6fff5650000
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb90b0000000000
+46f4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffb90b00000000001edaffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffff14600000000000eb9ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff8d00000000000072ffffffffffffffffffffffffffffff
+ffffff7100ffffffffffffff1700c8ffffff85000012090008edffff8100001204007400
+6dfffff20a000a0a000a0076ffffffff230082ffffffff7100ffff7100ffffffffff0071
+fffff30a000a09003b007dffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787631900
+0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff7100ffffffffffffff0071fffff20a000912000082ffffff00
+71ffff8500001600000900ffffff0071ffff0071ffffffff7100ffffff86000016000b1c
+00fffffffffffffffffffffffffffffffffffffffffffffffffffffff066000000000010
+99ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffff06600000000000087ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff9100000000000072ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffdc23000000000023dcffffffffffffffffffffffff
+ffffffff9c32feffffffffffffed3455fdffffffd244322e87ffffffffffd2442f3ed2ff
+8353ffffffff872e2e8bff409dffffffff8400eaffffffff9c32feff9c32fefffffffe32
+9cffffffff882e2d97ff0077ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319
+000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff9e33fefffffffffffe339effffffff872f3445d2fffffffe
+339effffffd2453245e4af39fdfffe339efffe339effffffff9e33ffffffffd7453240ff
+9400ffffffffffffffffffffffffffffffffffffffffffffffffffffb70b00000000001b
+faffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffb70b000000000020dbffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff9812000000000023ddffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffff61a000000000009e5ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff460dffffffffffffffffffffffffffffffff
+ffffff8513ffffffffffe500a1ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763
+19000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0d95ffffffff
+ff4b0bffffffffffffffffffffffffffffffffffffffffffffffffef6500000000000087
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffef6500000000000087ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffa1b00000000000eb8ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff8b00000000000074ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffdf00a4ffffffffffffffffffffffffffffff
+ffffffff9b0065f6ffffe70011ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787
+6319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0900bbffff
+ff6e00a6ffffffffffffffffffffffffffffffffffffffffffffffb70b000000000020db
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffb70b000000000020dbffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff8b0000000000006effffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff9812000000000067edffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffff7190012ffffffffffffffffffffffffffffff
+ffffffffffff430000100e0000b0ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87
+876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0000007
+0d050040ffffffffffffffffffffffffffffffffffffffffffffff7000000000000087ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffef6500000000000087ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff9812000000000067edffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffa1d000000000005e2ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffb383becffffffffffffffffffffffffffff
+ffffffffffffffffd445342e84ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff
+87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88
+2f3340d2ffffffffffffffffffffffffffffffffffffffffffffdf24000000000020dbff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffb70b000000000020dbffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffa1b000000000005e4ffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffff04800000000000fb7ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffff
+ff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff7700000000000088ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffef6500000000000088ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff8b00000000000074ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f000000000000
+70ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffff
+ffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffde24000000000023ddffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffb609000000000021dbffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff8e00000000000065ec
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd25000000
+000022daffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ff
+ffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff7700000000000048f2ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffee6300000000000088ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd230000000000
+03e1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81b00
+0000000007e4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787
+ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffdc220000000000119cffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffb60a000000000021dbffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff249000000
+00000eb6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+8c00000000000073ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff87
+87ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffb70d000000000049f5ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffee6300000000000088ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9000
+00000000006fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff9a13000000000065ecffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff
+8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffee630000000000119cffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffb60a000000000021dbffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+dd25000000000022dcffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffc1e000000000003e1ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffff
+ff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffb60a000000000049f5ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ec6300000000000088ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffff81b00000000000db6ffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffff14900000000000eb6ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effff
+ffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffee6300000000000090ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+e304000000000021dbffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff8c0000000000006fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff900000000000006fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001eff
+ffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffb50a000000000021dcffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+750000000000008affffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff9b13000000000022daffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffdd25000000000022daffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001e
+ffffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffec620000000000008affffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffde
+23000000000021dcffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffb1d000000000008e2ffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffff71d000000000008e2ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f000000
+1effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffe204000000000021dcffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff75
+0000000000008cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff8c00000000000073ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff8c00000000000073ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000
+001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff750000000000008affffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffde23
+0000000000119bffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff9b13000000000064ecffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff9b13000000000064ecffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f00
+00001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffde23000000000021dcffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7500
+00000000004af5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffc20000000000004e2ffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffc20000000000003dfffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
+0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff750000000000008cffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffde2300
+00000000119dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffff14a00000000000073ffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffff14a00000000000eb5ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffdd210000000000139bffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff740000
+000000004af5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff9200000000000064ebffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff920000000000006dffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff740000000000004cf7ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd210000
+000000139fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffde24000000000002e0ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffde26000000000021d9
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffdb200000000000139effffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff74000000
+0000004cf7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffff34c00000000000db3ffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff91e0000000000
+06e1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffb40c00000000004cf7ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd21000000
+0000139effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff920000000000006d
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f000000
+00000070ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffec610000000000139effffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7400000000
+00004cf7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffde2600000000
+0021dbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c14
+000000000063ebffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffb30800000000004cf7ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd2100000000
+00139effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff91e0000
+0000000cb3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fd21000000000002deffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffec6100000000000093ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff720000000000
+004cf7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f
+0000000000006affffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffff24c00000000000db3ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffb308000000000024ddffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdb210000000000
+139effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff9c14000000000063ebffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff930000000000006cffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff6c0000000000008cffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73000000000000
+4cf7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffc1f000000000003e0ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffde27000000000021d8ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffdb20000000000024dfffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffdb20000000000013
+9effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff8f00000000000070ffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffff91e000000000006e1ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff730000000000008cffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff730000000000004d
+f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff9100000000000063ebffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff8f00000000000070ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffdb20000000000026e0ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffdb20000000000014a0
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffe026000000000003dfffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff9e15000000000061eaffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff710000000000004cf5ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff6f0000000000004df8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffff44d0000000000006effffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffe22000000000001ddffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffdb20000000000014a0ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffeb61000000000014a0ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff940000000000006cffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffff34d00000000000cb2ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff6f0000000000004df8ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffb20700000000004df8ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffe02600000000001fd9ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff940000000000006bffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763190000
+00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffeb61000000000014a0ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffeb5f000000000015a0ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffff44d00000000000bb2ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffe02700000000001fd9ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787631900
+0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffb00700000000004ff8ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffb007000000000020fdffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff970000000000006bffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffa1f00000000000bb1ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319
+000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffea5e000000000017a1ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffea5e0000000000008fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff9f1700000000001ed6ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff9200000000000067
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763
+19000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffb007000000000021fdffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffb007000000000025e0ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffd21000000000005deff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f1700000000
+0060e8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787
+6319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffe85e0000000000008fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffea5e0000000000008fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92000000000000
+6dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd210000
+00000002deffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87
+876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffde02000000000025e0ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffb007000000000025e0ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f17000000
+000060e8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92
+0000000000006dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff
+87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff700000000000008fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffea5e0000000000008fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2200
+0000000002deffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff940000000000006bffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffff
+ff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffda1f000000000025e0ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffb007000000000025e0ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3
+4e0000000000006effffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffe12700000000001ed8ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffff
+ffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff6e00000000000093ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffea5c00000000000091ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff960000000000005ee8ffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffff650000000000009afffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ff
+ffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffd91d000000000015a1ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffaf06000000000026e2ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffe228000000000000dcffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff9800000000000067ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787
+ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff6e00000000000050f9ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffea5c00000000000091ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffff65000000000000aafffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffa01700000000005fe8ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff87
+87ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffd71c000000000015a3ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffaf06000000000026e2ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff9600000000000069ffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffd21000000000002deffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff
+8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffb009000000000050f9ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffea5c00000000000091ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffe22a00000000001dd7ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff930000000000006cffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffff
+ff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffe4a8aeb5ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffea5c000000000015a3ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffaf06000000000026e2ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffa21000000000009afffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff940000000000006bffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffe4a8aeb5ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effff
+ffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffe3a7b2a622161f00000000181a1064b8acb4ffffffffffffffffffffffffff
+ffffffffffffad06000000000052f9ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffe85c00000000000091ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff9300000000000068ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffe22800000000001dd7ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffb4acb86411191f00000000181a1064b8
+acb4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001eff
+ffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffe3b164101f000000000000000000000000000000000000181922a3b6ffffffffffffff
+ffffffffffe85c00000000000097ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffad06000000000026e2ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffa11800000000001dd5ffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffff55100000000000aaeffffffffffff
+ffffffffffffffffffffffffffffffffb6a3221918000000000000000000000000000000
+000000181922a3b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001e
+ffffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe3b1
+6315000000000000000000000000000000000000000000000000000000001622a3b6ffff
+ffffffffffad06000000000028e3ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff6800000000000092ffffffffffffffffffff
+ffffffffffffffffff8c00060000000012a8fffffffffff6007bffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff66f1ffffffffffffffffffff
+fffffc0586ffffffffffffffff7b00f6ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffc1a06020000000055e4fffffffc0586ffffffffffffffffffffffffffffff
+fffffffffffffffc0586fffffffffffffff6007bffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffe23000000000004ddffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff9900000000000066ffffffff
+ffffffffffffffffffffffffffb6a3221600000000000000000000000000000000000000
+0000000000000000001622a3b6ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f000000
+1effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe95c1500
+000000000000000000000000000000000000000000000000000000000000000000000016
+21aaffffff6800000000000092ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffd71c000000000028e3ffffffffffffffffffff
+ffffffffffffffffffff790047454141490a0011d1fffffffc349dffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff8800feffffffffffffffffff
+ffffffff0074ffffffffffffffff9d34fcffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff00154f4141443b0000d5ffffff0074ffffffffffffffffffffffffffff
+ffffffffffffffffff0074fffffffffffffffc349dffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff940000000000006bffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffa21800000000005de7ff
+ffffffffffffffffffffffaa211600000000000000000000000000000000000000000000
+00000000000000000000000000001621aaffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000
+001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe962000000
+000000000000000000001c585050479bf0e7e7eade594d50534b00000000000000000000
+00000023a125000000000028e3ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff6d00000000000092ffffffffffffffffffffff
+ffffffffffffffffffffff7a00ffffffffffff910002ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff8000ffffffffffffffffff
+ffffffffff007affffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff0089ffffffffffea133bffffff0079ffffffffffffffffffffffffff
+ffffffffffffffffffff0079ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffa21800000000005de7ffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffe23000000000001
+dcffffffffffffffffffab1f000000000000000000000000001c585050479bf0e7e7eade
+594d50534b000000000000000000000000001fabffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f00
+00001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe66100000000
+00000000000000439df0e1ffffffffffffffffffffffffffffffffe8e7de611a00000000
+000000000000000000000092ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffa1d9ffffffffffffffffffffffd71c00000000002ae4ffffffffffffffffffffff
+ffffffffffffffffffffffff7900ffffffffffffff9a0093ffffff9cd5ffffffb1aaa4e0
+ffffffffff9ddfffaea9b1ffffffffffffffb1aaaab1ffffffba4f00aaacffffffffdfa6
+a6dfffffffff0088ffb0a9b1ffffffffd59cffffff9fe3ffb0a9b1ffffffffffffffb1a9
+aeffe39effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff0079ffffffffffff8000ffffff0079ffffffffffb1a9b1ffffffff
+ffffffdfa6a6dfffffffff0079ffffffffa49dffff9cd5ffffd5a6ffe1a4a6dfffffffff
+ffffb1a9aeffe39effffffffffffffffffffffffffffffffffffffff25000000000001dc
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9500000000
+00006affffffffffffa9200000000000000000000000439df0e1ffffffffffffffffffff
+ffffffffffffe8e7de611a0000000000000000000020a9ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
+0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffae0600000000
+0000000000449cf1ffffffffffffffffffffffffffffffffffffffffffffffffffd8631b
+0000000000000000000038faffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffd10043ffffffffffffffffffff6d00000000000052f5ffffffffffffffffffffff
+ffffffffffffffffffffffffff7900ffffffffffffffff193ffffffc006affd107000000
+0012d1fffffc00796e00000008d2ffffffd207000000000fd7ff0000000000f1ffff6300
+00000061ffffff0045210000000dd2ffff6a00fcfffb00361e0000000dd2ffffffd20800
+0000624800fbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff007affffffffffff7700ffffff0079ffffffd20800000008d2ff
+ffffff630000000061ffffff0079ffffff590079fffe006affff6c00560000000063ffff
+ffd208000000624800fbfffffffffffffffffffffffffffffffffffffff4530000000000
+006affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff970000
+0000000068ffffffea5c0000000000000000001f4f9bf1ffffffffffffffffffffffffff
+ffffffffffffffffffffffffd8631b0000000000000000005ceaffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa200000000000
+000000449cf1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffd8631b000000000000000f72ebffffffffffffffffffffffffffffffffffffffffffff
+ffffffff4e000094ffffffffffffffd71c000000000018a4ffffffffffffffffffffffff
+ffffffffffffffffffffffffffff7900ffffffffffffffff7d00ffffff007aff3c00a6ef
+f2930033ffffff0000129ef8a20400d4ffc70011e3eaf29a0001fffb6c00e1e5ffff5900
+50e3e452008affff00001fe3f59a0042ffff7900ffffff00001fe3f59a0042ffffd40004
+a2f89f0d0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff0084ffffffffffad088effffff0079ffffd70004a2f8a20400
+d7ffff590050e3e452008affff0079ffff5c0092ffffff0079ffff7e000092f4e72300cf
+ffd40004a2f89f0d0000ffffffffffffffffffffffffffffffffffffffffffff99000000
+00000068ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4
+2a000000000023ae6b00000000000000001b63d8ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffd8631b000000000000000060e7ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd519000000000000
+0018a2f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffdc5d00000000000000006affffffffffffffffffffffffffffffffffffffff
+ffffffffd500000008dbffffffffff6d00000000000053f9ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff7900ffffffffffffffff7900ffffff007dff008aff
+ffffff9540f9ffff0000f6fffffff80071ff9d38f4ffffffff7300ffff7e00ffffffff00
+66ffffffff1500ffff0023ffffffff6700ffff7900ffffff0023ffffffff6700ffff7100
+f8fffffff90000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff00000b00000003003bffffffff0079ffff4000f8fffffff8
+003fffff0066ffffffff1500ffff0082ff5d0092ffffffff0079ffff7e00a0fffffff900
+75ff7000f8fffffff90000ffffffffffffffffffffffffffffffffffffffffffffffe42a
+00000000001bd5ffffffffffffffffff5554ffffffffffffffffffffffffffffffffffff
+fff5530000000000000000000000000057dbffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffdb5700000000000000006affffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffac08000000000000
+189effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff2c3d000000000000005ce6ffffffffffffffffffffffffffffffffff
+ffffffffff4f000000004dffffffd81a000000000018a5ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff7900ffffffffffffffff7a00ffffff007dff1b00
+68aee2ffffffffffff0066ffffffffff5e00fffffffffffffff74a00ffff7900ffffff8f
+00f0fffffffff8d5ffff0081ffffffff7b00ffff7900ffffff0081ffffffff7b00ffff00
+5effffffffff6600ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff001b534444444f1b005fffffff0079ffff0063ffffffff
+ff6300ff9400f0fffffffff8d5ffff00877a00a2ffffffffff0079ffff7a00ffffffffff
+007eff005effffffffff6600ffffffffffffffffffffffffffffffffffffffffffffffff
+f753000000000008acffffffffffffffd50000d3ffffffffffffffffffffffffffffffff
+ffffffff9d0000000000000000000055e1ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffe1550000000000000068ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6400000000000018
+9effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffcffe35500000000000000daffffffffffffffffffffffffffffff
+ffffffffff910000000000009cff6c00000000000053faffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff7900ffffffffffffffff7800ffffff0079fff9
+160000000d59e4ffffff007bffffffffff7a00ffffffb5530001000000ffff7900ffffff
+7700ffffffffffffffffff0079ffffffff7900ffff7900ffffff0079ffffffff7900ffff
+007affffffffff7b00ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff0088ffffffffffff6400cfffff0079ffff007bffffff
+ffff7b00ff7d00ffffffffffffffffff000018006cffffffffff0079ffff7900ffffffff
+ff007fff007affffffffff7b00ffffffffffffffffffffffffffffffffffffffffffffff
+ffffff9b00000000000066ffffffffffd90100004effffffffffffffffffffffffffffff
+ffffffffffff770000000000000055e1ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffe1550000000000001ad4
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffe65c0000000000189e
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffe155000000000009acffffffffffffffffffffffffff
+ffffffffffff120000000000000a22000000000018a5ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff7900ffffffffffffffff001bffffff0079ff
+ffffdc5c44000000d3ffff007dffffffffff7b00ffff5a00084a3cad7500ffff7900ffff
+ff7900ffffffffffffffffff0079ffffffff7900ffff7900ffffff0079ffffffff7900ff
+ff007bffffffffff7d00ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff0079fffffffffffff50074ffff0079ffff007bffff
+ffffff7d00ff7f00ffffffffffffffffff0021ff6f00d0ffffffff0079ffff7900ffffff
+ffff007eff007bffffffffff7d00ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffa31900000000001ad5ffffff4e00000000d4ffffffffffffffffffffffffff
+ffffffffffffde10000000000058e1ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1550000000000
+02daffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffd700000000000094ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffe729000000000062ffffffffffffffffffffff
+ffffffffffff950000000000000000000000000054faffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff7900ffffffffffffffd7007dffffff007a
+ff98dbfffffff6a80075ffff004cffffffffff3f11ff900097ffffffff8600ffff7900ff
+ffff7a00d9ffffffff8707ffff0079ffffffff7900ffff7900ffffff0079ffffffff7900
+ffff1442ffffffffff4c00ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff0079ffffffffffffff0076ffff0079ffff1542ff
+ffffffff4700ff7f00d9ffffffff8707ffff0081fffa1300ffffffff0079ffff7900ffff
+ffffff007dff1442ffffffffff4c00ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff24000000000008aeff6b00000000004cffffffffffffffffffffffff
+ffffffffffffda03000000000098ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7290000
+000003daffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffdc04000000002be5ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffff754000000000069ffffffffffffffffff
+ffffffffffffff12000000000000000000000018a5ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff7a00ffffffffffffdc0015f6ffffff00
+7cff0400ffffffffe90078ffff0000d9ffffffd500aaff7500ffffffffdb0000ffff7a00
+ffffffea0044ffffffdb0054ffff0079ffffffff7900ffff7900ffffff0079ffffffff79
+00ffff7b00d6ffffffd80000ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff0082ffffffffffff9800a9ffff0079ffff7b00
+d6ffffffd6005fffeb0044ffffffdb0054ffff0079ffffae005fffffff0079ffff7900ff
+ffffffff0079ff7b00d6ffffffd80000ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff960000000000005b02000000000000d4ffffffffffffffffffff
+ffffffffffffab09000000002be5ffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff754
+0000000009abffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff69000000000023fcff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff9d00000000001ad4ffffffffffff
+ffffffffffffff97000000000000000000000064ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff7a00acafababb3600000acffffffff
+0079ffac0014a2b0a20012f4ffff00000060bb60001affffa60015a2b555000a00ffff78
+0062b2ffff900054b5a60000e8ffff0078ffffffff7800ffff7800ffffff0078ffffffff
+7800fffff3150060bb5d000000ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff004cbdaaababb25b001dffffff0078fffff3
+150060bb600016f5ffff900054b5a60000e8ffff0078ffffff96008bffff0078ffff7800
+ffffffffff0078fff3150060bb5d000000ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffa3190000000000000000000000004cffffffffffffffffff
+ffffffffffff62000000000023fcffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff9d000000000062ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff64000000000096ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff9a000000000002d8ffffffff
+ffffffffffffffd906000000000000000000000079ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff74000000000000004dddffffffff
+fa006dffff9f0300000044f5ffffff00646400000047f4ffffff9f03000000adb700c8ff
+f3180000f1ffff9e00000018dffffffa006dffffffff6d00faff6d00fafffa006dffffff
+ff6d00fbfffffe49000000a67800ffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffff9000000000000000654f1fffffa006dffff
+fff54700000047f5ffffffff9e00000018dffffffa006dffffffff1600d1ff006dffff6d
+00fafffffffa006efffffe49000000a67800ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff24000000000000000000000000d4ffffffffffffff
+ffffffffffff64000000000096ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff9a000000000064ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff62000000000096ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffa31b0000000000d7ffff
+ffffffffffffffff4b00000000000000000000000000d1ffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffff4dfe9e9e9e9e8e8ffffffffff
+ffffd6f2ffffffffe3e8e8ffffffffff0084ffe7e6e8ffffffffffffffe3e3ffffffd6eb
+fffffce1e0ffffffffffe3e3fdffffffffd6f2fffffffff2d6fffff2d6ffffffd6f2ffff
+fffff2d6ffff9ce3ffe8e6eaff8300ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffdfe7e9e9e9e9e3ffffffffffffd6f2ff
+ffffffffe8e6e8ffffffffffffffffe3e3fdffffffffd6f2fffffffff9d0ecffd6f2ffff
+f2d6ffffffffffd6f5ff9ce3ffe8e6eaff8300ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffa000000000000000000000004cffffffffffff
+ffffffffffff62000000000096ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffa31b0000000062ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffd4000000002ce6ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff28000000004fff
+ffffffffffffffffd400000000000000000000000000000dffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff0079ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffff6003fffffffffdf005effffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffff7003fffffffffdf005effffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffa7000000000000000000000000d4ffffffff
+ffffffffffffd4000000002ce6ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff2800000000d4ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffd7050000002bfdffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc2800000000
+65ffffffffffffffff4c00000000000000000000000000000065ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff0078ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff5f0012a0afa00000e9ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff5f0012a0afa00000e9ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffd6090000000000000000000000004cffffff
+ffffffffffffd7050000002bfdffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffc2b00000005d7ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffd60300000000f4ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc290000
+000065ffffffffffffd20000000000000000000000000000000000d1ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffc006fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff9b040000004adbffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff9b040000004adbffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff0b0000000000000000000000000000d4ff
+ffffffffffffd60300000000f4ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffff40000000003d6ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffd7000000000096ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff28
+0000000061ffffffffff0b000000000000000000000000000000000000f6ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffd7f2ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffe5eae9ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffe5eae9ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff670000000000000000000000000000004c
+ffffffffffffd7000000000096ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff960000000000d7ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff4d000000009affff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+b20000000000d3ffffff9300000000000000000000000000000000001c47bbffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff9100000000000000000000000000000000
+00d4ffffffffff4d000000009affffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff9a000000004dffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763190000
+00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff64000000009effff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff9a0000000002d7ffff10000000000000000000001f5c515de1ede4ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffcb00000000000000000000000000000000
+00004cffffffff64000000009effffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff9e0000000064ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787631900
+0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f000000002bffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff9a000000004bff84000000001f5c515de1ede4ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffedcf5c5a1f0000000000000000000000
+00000000d4ffff8f000000002bffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff2b000000008fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319
+000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff100000002bfcff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff9d00000000d27651e2eee5ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffe5f4a04f510000000000
+00000000004cffff100000002bfcffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffc2b00000010ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763
+19000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9300000000f5ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff7000000053ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeaf3a04f
+51000000000000eca600000000f5ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffff50000000093ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787
+6319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff120000006cff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffef00000000d3ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffeaebe25e5b143f1c0000006cffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff6c00000012ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87
+876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6300000000ef
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff6c0000004dffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff3b00000000efffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffef0000000063ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff
+87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd2000000006b
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffef00000000d3ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffda000000006bffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff6b00000000d2ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffff
+ff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4b00000000
+efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff6d0000004bffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff4b00000000efffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffef000000004bffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffff
+ffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd300000000
+6dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffee00000000d3ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffd3000000006dffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6d00000000d3
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ff
+ffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4b000000
+00eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff6d0000004bffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff4b00000000eeffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee00000000
+4bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787
+ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf000000
+006dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffff000000000d0ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffcf000000006dffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6d0000
+0000cfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff87
+87ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c0000
+0000f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff6d00000079ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff7c00000000f0ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000
+0000007cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff
+8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4f00
+00006affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffff400000010ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff4f0000006affffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+6a0000004fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffff
+ff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+000000b2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff00000000d3ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff00000000b2ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffb200000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effff
+ffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff96
+00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff6c0000007affffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff9600000000ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff0000000096ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001eff
+ffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+4d00000069ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff8100000011ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff4d00000069ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff690000004dffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001e
+ffffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff00000000b2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffef0000000095ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff00000000b2ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffb200000000ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f000000
+1effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffd400000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff2d0000004dffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffd400000000ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff00000000d4ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000
+001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff790000006affffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8100000000ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff790000006affffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff6a00000079ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f00
+00001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff0d000000b4ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb20000000091
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff0d000000b4ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffb40000000dffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
+0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+0083ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f3ee2ffffffff
+ffffffffffffffffffffffffffffffffffffffd200000000ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff00000000d2ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffd20000002dffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2d00
+00004dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7800005ae2ff
+ffffffffffffffffffffffffffffffffffffffff780000002dffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff2d00000078ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff7800000085fffffffffffffb14000000000000000001f6ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff5ef1fffff70076ffffffffffffffffffffffffffffffffffffffffffffffffffffff85
+00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f00000000
+5ae2ffffffffffffffffffffffffffffffffffffff7f00000085ffffffffffffffffffff
+fffffffb140000000000004bdefffffffb0083ffffffffffffffffffffffffffffffffff
+fffffffffffb0083ffffffffffffffffffffffffffffffffffffffffffffffffff8300fb
+ffffffffffffffffffffffffffff850000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7f0000007fffffffffffffff001b5c4d4e4e4e4e4950fdffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff8500fefffffd3fa3ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+7f00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f000000
+0000005ae2ffffffffffffffffffffffffffffffffff800000007fffffffffffffffffff
+ffffffffff001b5c4d4d50470000d1ffffff0075ffffffffffffffffffffffffffffffff
+ffffffffffffff0075ffffffffffffffffffffffffffffffffffffffffffffffffff7500
+ffffffffffffffffffffffffffffff7f00000080ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff7f0000007fffffffffffffff0088ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff8000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff7f00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000
+00000000000058e1ffffffffffffffffffffffffffffff0b0000007fffffffffffffffff
+ffffffffffff0088fffffffffff31935ffffff0079ffffffffffffffffffffffffffffff
+ffffffffffffffff0079ffffffffffffffffffffffffffffffffffffffffffffffffff7a
+00ffffffffffffffffffffffffffffff7f0000000bffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff830000007bffffffffffffff0079ffffffffffffffffffcd82d0ff
+ffffffff93cfffffffffa79fa7ffffffffffffffffa79fa7ffffffffcf92ffffffffff92
+d1ffb049009fa2ffff92cfffff95dfffa69fa7ffffffffffffffa79fa4ffde94ffffffff
+ffff7b00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f00
+00000000000000000058e1ffffffffffffffffffffffffff000000007bffffffffffffff
+ffffffffffffff0079ffffffffffff7f00ffffff0079ffffffffd79b9bd7ffffffffffff
+ffd79b9bd7ffffffff0079ffffffff9a96ffffffffd79b9bd7ffffffffffffffa79fa6ff
+8800ffffffffffffffffffffffffffffff7b00000000ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff4d000000b2ffffffffffffff007affffffffffffffffffea0400
+ffffffff4d00dcffffca0000000000caffffffffcd0100000001caffff6b00fcfffffffc
+006fff0000000000f8ff006bfffc00321600000005ceffffffcd01000000584300fcffff
+ffffffb200000000d2ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88
+00000000000000000000000058e1ffffffffffffffffffffff00000000b2ffffffffffff
+ffffffffffffffff007affffffffffff7500ffffff0079ffffff5a000000005affffffff
+ff5a0000000059ffffff0079ffffff510080ffffff580000000058ffffffffca00000000
+1c4100ffffffffffffffffffffffffffffffb200000000ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff00000000ffffffffffffffff0083ffffffffffffffffffffb2
+0059ffff8a0099ffffcc001cedf4ed1c00d0ffffce000dabffae0900ffff7900ffffffff
+ff007afffd7000eaebffff0079ffff000028ecfda3003dffffce000dabffa9140000ffff
+ffffffffff0000000078ffd196a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4
+a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4
+a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4
+a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4
+a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4
+a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4
+a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4
+a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4b6
+52000000000000000000000000000058e1ffffffffffffffff9100000000ffffffffffff
+ffffffffffffffffff0083ffffffffffa30797ffffff0079ffff54005bebeb5b0054ffff
+ff52005bebec5b0083ffff0079ffff540099ffffff4f0099fafa990051ffffce001fedfa
+ab190000ffffffffffffffffffffffffffffffff0000000091ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff00000000ffffffffffffffff0000020000000000007bffff
+ff6700dde90023ffffff6a1cffffffffff2237ffff6e00faffffffb20083ff7900ffffff
+ffff0079ffff7d00ffffffff0079ffff0029ffffffff6a00ffff6e00fafffffffb0000ff
+ffffffffffff000000007fff700000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000058e0ffffffffffff7d00000000ffffffffff
+ffffffffffffffffffff00000200000000003affffffff0079ffcc006dffffffff6d00cc
+ffff006cffffffff1c00ffff0084ff540099fffffffc00b1ffffffffb200cbff6e00f7ff
+fffffb0000ffffffffffffffffffffffffffffffff000000007dffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff00000000ffffffffffffffff00205e4f4f4f4f503ea7ff
+fffffa1e043317ffffffff004cbba2a1a2ba4e00ffff0061ffffffffffe1f2ff7900ffff
+ffffff0079ffff7900ffffffff0079ffff0081ffffffff7b00ffff0061ffffffffff6800
+ffffffffffffff000000007fff7f00000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000055ffffffffff7b00000000ffffffff
+ffffffffffffffffffffff00205e4f4f4f59230058ffffff0079ff7400f6fffffffff600
+74ff8c00f3fffffffffbdcffff00847300a8ffffffff8d00aba9a1a1a9ad007aff0061ff
+ffffffff6800ffffffffffffffffffffffffffffffff000000007bffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff00000000ffffffffffffffff0088ffffffffffffffff
+ffffffffff0000bfffffffff000000000000000000ffff007affffffffffffffff7900ff
+ffffffff0079ffff7900ffffffff0079ffff0079ffffffff7900ffff007affffffffff7b
+00ffffffffffffff000000007bff7e000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000056d2ffffffffffb200000000ffffff
+ffffffffffffffffffffffff0088ffffffffffff6900cbffff0079ff7900ffffffffffff
+0079ff7700ffffffffffffffffff00001d0065ffffffff7c00000000000000007bff007a
+ffffffffff7b00ffffffffffffffffffffffffffffffff00000000b2ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff2e000000d1ffffffffffffff0079ffffffffffffff
+ffffffffffd30000daffffffff0075ffefefeff0efe9ffff007dffffffffffffffff7900
+ffffffffff0079ffff7900ffffffff0079ffff0079ffffffff7900ffff007bffffffffff
+7d00ffffffffffffd100000000b2ff750000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000005fe7ffffffffffffffff00000000d1ff
+ffffffffffffffffffffffffff0079fffffffffffff80074ffff0079ff7500ffffffffff
+ff0079ff7900ffffffffffffffffff0027ff7300caffffff7700f2f6efefeff0e9ffff00
+7bffffffffff7d00ffffffffffffffffffffffffffffffd100000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff8500000078ffffffffffffff0079ffffffffffff
+ffffffffffff00242700d2ffffff1a44ffffffffffffffffff0044ffffffffff0083ff79
+00ffffffffff007affff7900ffffffff0079ffff0079ffffffff7900ffff193fffffffff
+ff4900ffffffffffff7800000000fffff8e7f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0
+f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0
+f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0
+f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0
+f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0
+f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0
+f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0
+f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0
+f0f0f0f0ff77000000000000000000000000005fe9ffffffffffffffffffff0000000078
+ffffffffffffffffffffffffffff0079ffffffffffffff0076ffff0079ffae00d4ffffff
+ffd5007bff7b00d5ffffffff8001ffff0081fffe1900ffffffae00dbffffffffffffffff
+193fffffffffff4900ffffffffffffffffffffffffffffff7800000000ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff7f0000007fffffffffffffff0083ffffffffff
+ffffffffffff5300ffff003cffffff7c00cfffffffff4835ffff6500ceffffff5600e7ff
+7b00d5ffffff5d007effff7a00ffffffff0079ffff0079ffffffff7900ffff7c00cfffff
+ffd10000ffffffffffff7f00000000ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff8300000000000000000000005fe9ffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffff0083ffffffffffff9100aeffff0079ffff0040ffff
+ffff4200eeffee003fffffffd4005bffff0079ffffb20056ffffff0040ffffffffca00b4
+ff7c00cfffffffd30000ffffffffffffffffffffffffffffff7f00000000ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff7f0000007fffffffffffffff0046b19f9f9f
+9f9f9f92d2ff86009affff9c0087fffff71c0056aa950800a6fffff91a0096ab520064ff
+ffed00009ba94510007cffff7b0059a7ffff0078ffff0078ffffffff7800fffff71c0056
+af53000000ffffffffffff7f00000000ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7f0000000000000000005fe9ffffffffffffffffffffffffffff6e0000
+007fffffffffffffffffffffffffffff0046b19f9f9fa6510024ffffff0078ffff970008
+9898080099ffffff990049aa9a0000ecffff0078ffffff9e0087ffff97000995aa560018
+fffff71c0056af55000000ffffffffffffffffffffffffffffff7f0000006effffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763190000
+00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff7b00000083fffffffffffffa0000000000
+00000000006fdd001effffffff1e00c7fffff9510000000ca8fffffffff84e00000094ff
+ffffffa70f00001af40070fffff7210000f7ff006ffffb006fffffffff6f00fbffffff54
+000000b07c00ffffffffffff8300000000ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff7f0000000000000060e9ffffffffffffffffffffffffffffffff8000
+000083fffffffffffffffffffffffffffa000000000000000d60f4fffffb006fffffffa8
+0c00000ca8ffffffffffa607000020e7fffffb006fffffffff1e00c7ffffa80c00000051
+f8fffffff951000000696000fbffffffffffffffffffffffffffff8300000080ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787631900
+0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffb40000004bffffffffffffffe8eff1f1
+f1f1f1f1f1e7fef6d9fdfffffffffdd9edfffffffff0f0ebfffffffffffffffff0edeeff
+ffffffffffffebebffffe0f6ffffffffe9e8ffffdef6ffffdff6fffffffff6deffff92dd
+fff1edf0ff8000ffffffffffff4b0000002effffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff7f000000000060e9ffffffffffffffffffffffffffffffffffff7b
+0000004bffffffffffffffffffffffffffffe8eff1f1f1f1ebffffffffffffdff6ffffff
+ffffebebffffffffffffffffffebebffffffffffdff6fffffffffdd9edffffffffebf0f0
+fffffffffffffff0edefffffe0ffffffffffffffffffffffffffffff4b0000007bffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319
+000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff800
+3affffffffd60065ffffffffffff0000000085ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff7e00000060e9ffffffffffffffffffffffffffffffffffffffff
+b400000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000b4ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763
+19000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+65000a95a3940000ecffffffffffff000000007effffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff6f0061e9ffffffffffffffffffffffffffffffffffffffffff
+ffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787
+6319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff00000000d1ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffa50d00000053e2ffffffffffffd1000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffb5d5ffffffffffffffffffffffffffffffffffffffffffff
+ffffff00000000d1ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd100000000ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87
+876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff6f00000079ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffedf1f1ffffffffffffffff7d00000000f0ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff6f00000079ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff790000006f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff
+87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff810000000fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff4b0000002fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff810000000fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f000000
+81ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffff
+ff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000d0ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff0000000086ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff9b9b9d9c9c9d95d5ffffffffff8dccffff
+ffffffffffffffffffffffffffffffffffffffffff8dccffffffffffffffff8acbffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffff000000000d0ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0000000
+00f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffff
+ffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2f00000079ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffd100000000f0ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffc000000000000000054fffffffc006bff
+fffffffffffffffffffffffffffffffffffffffffffc006bfffffffffffffff30060ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff2f00000079ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff790000
+002fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ff
+ffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff870000000fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff780000002bffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff0071fff2f2f5eb5e0081ffffff0079
+ffffffffffffffffffffffffffffffffffffffffffffff0079ffffffffffffffffe3f9ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff870000000fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f00
+000087ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787
+ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff300000000
+d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff0c000000b9ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff007dffffffffffff6700ffffff00
+79ffffffffffffffffffffffffffffffffffffffffffffff0079ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffff300000000d0ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd000
+000000f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff87
+87ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+0078ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff0079ffffffffffff7d00ffffff
+0079ffffffff9506000695ffffffffffdb47000047daffffff0079ffffffc7003ffffe00
+80ffff830dd246000047d8ffffffff95060000de9401fcffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff0000000078ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff78
+00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff
+8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6b00
+000010ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff8f0000006bffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff0083ffffffffffff3b1bffff
+ff0079ffffff4f00186318004fffffffc8000050510000d0ffff0079ffffcb0017f7ffff
+0075ffff7a0000135d520000ffffff4f00186314000000ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff6b00000010ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+100000006bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffff
+ff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3
+000000008effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff0c000000b6ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff0046ad9b9b9e950c25ffff
+ffff0079ffff8400a0ffffffa00084ffff0020f5ffffe6002affff007cffcb001effffff
+ff0079ffff7e0032ffffffab008bff8900a0ffffffa20000ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffb3000000008effffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+8e00000000b3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effff
+ffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff300000000cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff8e00000000ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000001d5
+ffffff0079ffff0025ffffffffff2500ffd100b7ffffffff9d4effff0090ee0029ffffff
+ffff0079ffff7b00fdffffffff0079ff371fffffffffff2e00ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff300000000cffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff0c00000030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001eff
+ffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffb8000000008effffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff0c00000070ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff0073fff3f3f3fcb50f
+00ffffff0079ffff007fffffffffff7f00ff7900ffffffffffffffffff003b0b00c6ffff
+ffffff0079ffff7900ffffffffff007eff007dffffffffff7f00ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffb8000000008effffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff8e00000000b8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001e
+ffffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff300000000effffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff9100000000f3ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff007dffffffffffff
+be008bffff0079ffff0079ffffffffff7a00ff7f00ffffffffffffffffff0000a52e00ff
+ffffffff0079ffff7900ffffffffff007fff0079ffffffffff7a00ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff300000000effffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff0e00000030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f000000
+1effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffb8000000005bffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffd20100000071ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0079ffffffffff
+ffff0078ffff0079ffff0073ffffffffff7600ff7d00ffffffffffce86ffff006effba00
+55ffffffff0079ffff7900ffffffffff007eff0073ffffffffff7700ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffb8000000005bffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff5b00000000b8ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000
+001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff3400000000ceffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff4600000000f3ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007affffffff
+ffffd7007dffff0079ffff5f00ffffffffff001effb4008dffffffff2e05ffff007bffff
+6a00c8ffffff0079ffff7900ffffffffff007aff5f00ffffffffff0900ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff3400000000ceffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffce0000000034ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f00
+00001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffff70000000047ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffd00000000071ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082ffffff
+ffffe43100efffff0079ffffaf0047e1ffe14700b3ffff2600d4ffff5700b3ffff0079ff
+fffb2300d0ffff0079ffff7900ffffffffff0079ffaf0047e1ffdf4a0000ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffff70000000047ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff4700000000f7ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
+0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff7100000000ceffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff4a00000000f2ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000
+000000000099ffffff006fffffff9c00000000009cfffffffd1d000000005effffff006f
+fffffff5002affff006fffff6f00ffffffffff006fffff9e00000000222e00ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff7100000000ceffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffce0000000071ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffff20000000000caffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff5a0000000073ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff605758
+5757574fa4f9ffffffff50acffffffffe8645364e8ffffffffffffa04f4fa7ffffffff50
+acffffffff9f3ec0ff4facffffac50ffffffffff50afffffffee64535fff9000ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffff20000000000caffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffca0000000000f2ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff6f0000000008ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff590000000000f1ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffb0085ffffffffff3c19ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6f0000000008ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff08000000006fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffc30000000005effffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff570000000000a2ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff18009dffffff5300b2ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc30000000005e
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff5e0000000030fcffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff2f0000000059ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffcc0000000000a8ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffbf1200000000005dffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2f000000
+0059ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff59000000002fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffb8000000000057ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffcd000000000033ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa4525662e7ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb80000
+00000057ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff570000000000b8ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffa70000000000ccffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffcd000000000032ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa5
+0000000000ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffcc0000000000a5ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffb50000000000cfffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffcd000000000032ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffa60000000000cfffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffce0000000000a6ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff59d9be00000000049bffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffd000000000002effffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffa800000000049bffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffd00000000000a8ffffffca95ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff58000bff44000000000057ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff5a000000000000b8ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff35000000000057ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff5a000000000035ffffffff000056ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff5800000064ff3700000000004dda
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff58000000000000a6ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff3300000000004ddaffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff58000000000033ffffffff5500000058ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff590000000000caff650000000000
+00cdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff5b000000000025b2ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff31000000000000cdffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff5b000000000031ffffffffb9000000000058ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffda4d0000000000a5ffffffa6000000
+0000049affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffc80d000000000032ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffa50000000000049affffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffc80d0000000000a5ffffffffffffa5000000000058ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffcb000000000000a7fffffffffff235
+000000000059ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffcf000000000000a5ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffa400000000000059ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffcf000000000000a4ffffffffffffffffa7000000000058ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffcc000000000000a8ffffffffffffff
+fc6700000000001598ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffd94f000000000027b2ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffff23800000000001598ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffd94f000000000038f2ffffffffffffffffffffa8000000000057ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffcc000000000000a5ffffffffffffff
+ffffffa70000000000001398ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffd94f00000000000033ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff320000000000001394ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffd94f00000000000032ffffffffffffffffffffffffffa8000000000057ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763190000
+00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffcc000000000038f2ffffffffffffff
+fffffffffff2370000000000001398ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffd94f00000000000000a6ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffa6000000000000004cdaffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+d94f00000000000000a6ffffffffffffffffffffffffffffffa8000000000057ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787631900
+0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffcc000000000033ffffffffffffffff
+fffffffffffffffd63000000000000001196ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffd94f0000000000000025b1ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffb125000000000000004fd9ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9
+4f0000000000000025b1ffffffffffffffffffffffffffffffffffa8000000000057ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319
+000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffcc000000000033ffffffffffffffff
+ffffffffffffffffffffee6900000000000000128ad5ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffa8540000000000000027b0ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffb0270000000000000054a8
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa854
+0000000000000027b0ffffffffffffffffffffffffffffffffffffffffa8000000000057
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763
+19000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffcc000000000033ffffffffffffffff
+fffffffffffffffffffffffffff33500000000000000001689d5ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffa850020000000000000000a4ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffa400000000000000
+00025399d2ffffffffffffffffffffffffffffffffffffffffffffffffffffffa8500200
+00000000000000a4ffffffffffffffffffffffffffffffffffffffffffffffa800000000
+0057ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787
+6319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffcd000000000035ffffffffffffffff
+ffffffffffffffffffffffffffffffffb1260000000000000000001688d6ffffffffffff
+ffffffffffffffffffffffffffffffa6500200000000000000000069ecffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec6900000000
+0000000000001688d6ffffffffffffffffffffffffffffffffffffffffffa65002000000
+00000000000069ecffffffffffffffffffffffffffffffffffffffffffffffffffaa0000
+00000055ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87
+876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff57000000000035ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffb226000000000000000000000e06128f9a
+98959effffffffd38f9897a050000a0a0000000000000000000069eeffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee6900
+000000000000000000000e06128f9a98959effffffffd38f9897a050000a0a0000000000
+000000000069eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa
+000000000055ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff
+87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff55000000000035ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffa9672c0000000000000000000000
+000000000b09080e000000000000000000000000000000005f71edffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ed715f000000000000000000000000000000000b09080e00000000000000000000000000
+0000005f71edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffaa000000000055ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffff
+ff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff55000000000033ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffe9772900000000000000
+0000000000000000000000000000000000000000000059affdffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffdaf590000000000000000000000000000000000000000000000000000000000
+0059affdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffaa000000000055ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffff
+ffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff55000000000068fdffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9b259000000
+000000000000000000000000000000000000002a77ecf7ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffff7ec772a000000000000000000000000000000000000000000002a77
+ecf7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffaa000000000055ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ff
+ffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff550000000000acffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4f5
+ffaf5f6867702b0000000000616a676570edf9f1ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffff1f9ed70656767702b0000000000616a676570edf9f1ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffaa000000000055ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787
+ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff560000000000a9ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffff2f8f8f7f6ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffff2f8f8f7f6ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffa9000000000056ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff87
+87ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff560000000000a9ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffa9000000000056ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff
+8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff560000000000a9ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffa9000000000056ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffff
+ff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff590000000000a9ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffa9000000000056ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effff
+ffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffc50c0000000000a9ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffa9000000000056ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001eff
+ffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffc9000000000000abffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffab000000000054ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001e
+ffffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffc9000000000000aaffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffab000000000054ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f000000
+1effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffc9000000000029b6ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffab000000000054ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000
+001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffc9000000000036ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffab000000000054ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f00
+00001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffc8000000000037ffffffffffffffffff
+ffffffffffffff91909190909189cdffffffffffffffffffffffffffffffffff83c6ffff
+fffffffffffffffffffffff7cdffffffc57fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff91909190909189cdffffffffffffffffffffffffffffffff
+ff83c6fffffffffffffffffffffffffff7cdffffffc57fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffab000000000054ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
+0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffc8000000000037ffffffffffffffffff
+fffffffffffffffc000000000000000042d2fffffffffffffffffffffffffffffd006cff
+ffffffffffffffffffffffff2f65ffffff6300f3ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffc000000000000000042d2ffffffffffffffffffffffffff
+fffd006cffffffffffffffffffffffffff2f65ffffff6300f3ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffab000000000054
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffc8000000000037ffffffffffffffffff
+ffffffffffffffffff0075fff9f9fcf26a0000cbffffffffffffffffffffffffffff0079
+ffffffffffffffffffffffffff0077fffffffdebffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff0075fff9f9fcf26a0000cbffffffffffffffffffffff
+ffffff0079ffffffffffffffffffffffffff0077fffffffdebffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffac00000000
+0053ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffc9000000000037ffffffffffffffffff
+ffffffffffffffffffff007cffffffffffffb00037ffffffffffffffffffffffffffff00
+79ffffffffffffffffffffffffff0081fffffffffffffffffeffffffffffffffffffffff
+fffffffffffffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff007cffffffffffffb00037ffffffffffffffffffff
+ffffffff0079ffffffffffffffffffffffffff0081ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffac0000
+00000053ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffff54000000000037ffffffffffffffffff
+ffffffffffffffffffffff0079ffffffffffffff7200fcffffffd135000035d1ffffffff
+0079ffffffd135000035d1ffff780000000074ff7c00fbfffb007f9c00000088ffffffff
+ff89000000d48e00fbffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff0079ffffffffffffff7200fcffffffd135000035
+d1ffffffff0079ffffffd135000035d1ffff780000000074ff7c00fbff7f05c93a00003d
+cfffffffffd23b00004fff007fffffffffffffffffffffffffffffffffffffffffffffac
+000000000053ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffff53000000000037ffffffffffffffffff
+ffffffffffffffffffffffff0079fffffffffffffff70086ffffc0001969691900c0ffff
+ff0079ffffc0001969691900c0ffb758002f62b1ff7600ffffff000000596d25007fffff
+ff460022721f000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff0079fffffffffffffff70086ffffc000196969
+1900c0ffffff0079ffffc0001969691900c0ffb758002f62b1ff7600ffff7a00001d6c5e
+0000fcffffc000005e5b0000007affffffffffffffffffffffffffffffffffffffffffff
+ffac000000000053ffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffff53000000000036ffffffffffffffffff
+ffffffffffffffffffffffffff0079ffffffffffffffff0078ffff002bffffffff2e00fc
+ffff0079ffff002bffffffff2e00ffffff0087ffffff7900ffffff0000afffffff2a00ff
+ff8600a8ffffffab0000ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff0079ffffffffffffffff0078ffff002bffff
+ffff2e00fcffff0079ffff002bffffffff2e00ffffff0087ffffff7900ffff7e0039ffff
+ffb20088ffff0024fbfffff934007fffffffffffffffffffffffffffffffffffffffffff
+ffffffac000000000053ffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffffff
+ffffffffffffffffffffffffffffffffffffffff5300000000006efdffffffffffffffff
+ffffffffffffffffffffffffffff0079ffffffffffffffff0079ffc400ffffffffffff00
+88ffff0079ffc400ffffffffffff0088ffff0079ffffff7900ffffff0070ffffffff7f00
+ffff3226ffffffffff3200ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff0079ffffffffffffffff0079ffc400ffff
+ffffffff0088ffff0079ffc400ffffffffffff0088ffff0079ffffff7900ffff7b00ffff
+ffffff0078ffc600bdffffffffc2007dffffffffffffffffffffffffffffffffffffffff
+ffffffffffac000000000053ffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fffff
+ffffffffffffffffffffffffffffffffffffffff510000000000b0ffffffffffffffffff
+ffffffffffffffffffffffffffffff0079ffffffffffffffff0079ff7800000000000000
+0072ffff0079ff78000000000000000072ffff0079ffffff7900ffffff007affffffff79
+00ffff007cffffffffff7f00ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff0079ffffffffffffffff0079ff780000
+00000000000072ffff0079ff78000000000000000072ffff0079ffffff7900ffff7900ff
+ffffffff0079ff7400ffffffffffff007affffffffffffffffffffffffffffffffffffff
+ffffffffffffffae000000000051ffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007fff
+ffffffffffffffffffffffffffffffffffffffff510000000000aeffffffffffffffffff
+ffffffffffffffffffffffffffffffff0079ffffffffffffffca007fff7c006b67636363
+645ab7ffff0079ff7c006b67636363645ab7ffff0079ffffff7900ffffff0079ffffffff
+7900ffff0079ffffffffff7a00ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff0079ffffffffffffffca007fff7c00
+6b67636363645ab7ffff0079ff7c006b67636363645ab7ffff0079ffffff7900ffff7900
+ffffffffff0079ff7800ffffffffffff0079ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffae000000000051ffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000007f
+ffffffffffffffffffffffffffffffffffffffff510000000000aeffffffffffffffffff
+ffffffffffffffffffffffffffffffffff0079ffffffffffffff7200f4ff7e00ffffffff
+ffffffffffff0079ff7e00ffffffffffffffffffff0079ffffff7900ffffff0079ffffff
+ff7900ffff0072ffffffffff7600ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff0079ffffffffffffff7200f4ff7e
+00ffffffffffffffffffff0079ff7e00ffffffffffffffffffff0079ffffff7900ffff79
+00ffffffffff0079ff7d00ffffffffffff007affffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffae000000000051ffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+7fffffffffffffffffffffffffffffffffffffff520000000000aeffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff007bffffffffffffca002ffffff30086ffff
+ffffff82c9ffff0079fff30086ffffffffff82c9ffff007fffffff7900ffffff0079ffff
+ffff7900ffff6100ffffffffff0500ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff007bffffffffffffca002fffff
+f30086ffffffffff82c9ffff0079fff30086ffffffffff82c9ffff007fffffff7900ffff
+7900ffffffffff0079fff30086ffffffff8e007effffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffae000000000051ffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+007fffffffffffffff3e41ffffffffffffffffd3470000000000aeffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff007effffffffff900000f7ffffff2a0092
+ffffd93400e1ffff0079ffff2a0092ffffd93400e1ffff0046ffffff7900ffffff0079ff
+ffffff7900ffffb4003ed9ffd73f0000ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff007effffffffff900000f7ff
+ffff2a0092ffffd93400e1ffff0079ffff2a0092ffffd93400e1ffff0046ffffff7900ff
+ff7900ffffffffff0079ffff2a0092ffff9000007effffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffae000000000051ffffffffffffffff413effffffff
+ffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+00007ffffffffffffffc000051ffffffffffffc6000000000000aeffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffe00000000000000001eb3ffffffffff2b
+0000000000a3fffffe006fffffff2b0000000000a3ffffff2f000075ff6f00fefffe006f
+ffffffff6f00feffffa8000000002b3400ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffe00000000000000001eb3ff
+ffffffff2b0000000000a3fffffe006fffffff2b0000000000a3ffffff2f000075ff6f00
+feff6f00fefffffffe006fffffff2c0000000064007dffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffae000000000051ffffffffffff510000fcffff
+ffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+0000007fffffffffffff9100000051ffffffffc6000000000000aeffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff6c64656464655daeffffffffffffff
+ffad5d6271eeffffffff5db3ffffffffad5d6271eefffffffffb6f54b1ffb35dffffff5d
+b3ffffffffb35dfffffffff571606dff9000ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff6c64656464655daeffff
+ffffffffffffad5d6271eeffffffff5db3ffffffffad5d6271eefffffffffb6f54b1ffb3
+5dffffb35dffffffffff5db3ffffffffaf5e5cbaff0075ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffae000000000051ffffffff5100000091ff
+ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+000000007fffffffffffff450000000051ffffc7000000000000abffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffff7007fffffffffff361effffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff7600ffffffffffc900b2ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffae000000000051ffff510000000045
+ffffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff000000007ffffffffffffd0000000000005fcf00000000003ef7ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff1f0092ffffff4a00b6ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffaf003ed8ffffc90023ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffae000000000058580000000000
+00fdffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763190000
+00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff000000007fffffffffff8800000000000000000000000039ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffc41a000000000067ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff68000000000018c4ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffae00000000000000000000
+000088ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787631900
+0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff000000007fffffffffff08000000000000000000000038ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffaf5f646eefffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffff071645eacffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffae0000000000000000
+00000008ffffffffffffffff000000007fffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319
+000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff000000007fffffffffc9000000000000000000000047ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb9000000000000
+0000000000c9ffffffffffffff000000007fffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763
+19000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff000000007fffffffff760000000000000000000000c8ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600000000000
+00000000000076ffffffffffffff000000007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787
+6319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff000000007fffffffff09000000000000000000000000c6ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff500000000000
+0000000000000009ffffffffffffff000000007fffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87
+876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff000000007fffffffc90000000000000000000000000000c5ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff500000000000
+000000000000000000c9ffffffffffff000000007fffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff
+87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff000000007fffffff76000000000000000000000000000000c5ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff500000000000
+0000000000000000000076ffffffffffff000000007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffff
+ff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff000000007fffffff0900000000000000000000000000000000c1ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3e0000000000
+000000000000000000000009ffffffffffff000000007fffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffff
+ffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff000000007fffffc7000000000000000000000000000000000000
+c2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc71600000000
+00000000000000000000000000c7ffffffffff000000007fffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ff
+ffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff000000007fffff760000000000000000000000000000003470
+a7fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff08131
+000000000000000000000000000076ffffffffff000000007fffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787
+ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff000000007fffff080000000000000000000000003181f0ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffba62000000000000000000000008ffffffffff000000007fffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff87
+87ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff000000007fff8e0000000000000000000062baffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffb7620000000000000000008fffffffff000000007fffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff
+8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff0000000082ff420000000000003181f3fcffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffb76200000000000043ffffffff000000007fffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffff
+ff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff000000008bff0000000064b9ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffb67234000000f7ffffff000000007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effff
+ffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff0000000094a11e76bcffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffff6861e82ffffff000000007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001eff
+ffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000000008cffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff040000007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001e
+ffffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff00000000020f060302020303030303030303
+030303030303030303030303030303030303030303030303030303030303030303030303
+030303030303030303030303030303030303030303030303030303030303030303030303
+030303030303030303030303030303030303030303030303030303030303030303030303
+030303030303030303030303030303030303030303030303030303030303030303030303
+030303030303030303030303030303030303030303030303030303030303030303030303
+030303030303030303030303030303030303030303030303030303030303030303030303
+030303030303030303030303030303030303030303030303030303030303030303030303
+030303030303030303030303030303030303030303030303030303030303030303030303
+030303030303030303030303030303030303030303030303030303030303030303030303
+030303030303030303030303030303030303030303030303030303030303030303030303
+030303030303030303030303030303030303030303030303030303030303030303030303
+030303030303030303030303030303030303030303030303030303030303030303030303
+030303030303030303030303030303030303030303030303030303030303030303030303
+030303030303030303030303030303030303030303030303030303030303030303030303
+030303030303030303030303030303030303030303030303030303030303030303030303
+030303030303030303030303030303030303030303030303030303030303030303030303
+03030303030303030303030303030303030303030203060703040b000000007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f000000
+1effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffd0000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000000000000000000000007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000
+001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff77720000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f00
+00001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000074ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
+0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff726f74747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+747474747474747474747474747474747474747474747474747474747474747474747474
+7474747474747474747474747474747474747474747474747474747474747474747463ba
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff87828bffffffffffffffffffc57787ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff8777c5ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffc000000bbffffffffffffffff720000fcffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffb000070ffffffff
+ffffffffffffffffffffffffffffff6c86ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff6c86ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff00000002fcffffffffffffff7f0000ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00007bffffff
+ffffffffffffffffffffffffffffff450076ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff450076ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff0000000087ffffffffffffff7f0000ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5ffffff
+ffffffffffffffffffffffffffffffff00007fffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff00007fffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff0000030000c9ffffffffffff7f0000ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff000081ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff000081ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff0000781f003effffffffffff7f0000ffffffffffff
+fffffe908680c7ffffffffffffffffffffffffc480868efeffffffffffffffffffffffff
+ffffffffffffffc7808980c4fffffffffffbfbfffffffffffffffffffffff5ffffffffff
+ffffffffffc4808980c7ffffffffffffffff050083fffffffffffffffd9086868efeffff
+fffffffffffffffffffc8e8680c4ffffffffffffff050083ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319000000
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff00009b98000080ffffffffff7f0000ffffffffff
+ffcb3a00000000000982ffffffffff800011ff4e000000000681ffffffffffffffffffff
+ffffffffffffbb0300000000003fcbffffffba000045ffffffffffffbb000043fffc0300
+80ffffffff4a000000000002bbfffffffb06020000000003fbffffff4a00000000000682
+fffffffffffb030098d200000000003ad1fffffb06020000000003fbffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763190000
+00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff00008aff360007ffffffffff7f0000ffffffff
+ffbb00000000000000000047ffffffff7c00044300000000000000c5ffffffffffffffff
+ffffffffffff49000000000000000000bbffffffaf000049ffffffffc6000030ffffff00
+007cffffff490000000000000000c5fffffb00000000000000fcffc20000000000000000
+0047ffffffffff00003d040000000000003afffffb00000000000000fbffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787631900
+0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff000080ffc100004dffffffff7f0000ffffff
+fff901000036c4fffb7a0500007fffffff7f00000042ffffff4500003bffffffffffffff
+ffffffffffffbb000034c5fffffb7d000000f9ffffff430000bcffffff3f0000c0ffffff
+00007fffffc100004afffffb7f00002cffffff797700003c8375ffff3c00007dfbffffc5
+3500007fffffffff00000000b9ffffba000000c2ffff797700003c8375ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87876319
+000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff00007fffff7f0000bcffffff7f0000ffff
+ffff8e000080fffffffffff5080007ffffff7f00003affffffffff3f0000ffffffffffff
+ffffffffffffff01004affffffffffffc000008efffffffb000003ffff4a0000b5ffffff
+ff00007fffff780005ffffffffff770067ffffffffff03008bffffff8b0000c0ffffffff
+ffff4a0006ffffffff000000b6ffffffffba000079ffffffff03008bffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff878763
+19000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff00007ffffff7000001faffff7f0000ff
+ffffff400004faffffffffffff7d0000c5ffff7f0000c5ffffffffff850000ffffffffff
+ffffffffffffffc50004ffffffffffffffff7f0040ffffffffb300005ec8000040ffffff
+ffff00007fffff84000056fffffffffff8ffffffffffff00007fffffff40007fffffffff
+ffffffff0400c5ffffff00003effffffffffff00007fffffffff00007fffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff8787
+6319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff00007fffffffb2000086ffff7f0000
+ffffffff000077fffffffffffffffc000079ffff7f0000ffffffffffff7f0000ffffffff
+ffffffffffffffff7900000a01000000000008010000ffffffffff7c0000000038ffffff
+ffffff00007ffffff6000000020777c9ffffffffffffffff00007fffffff000001080000
+000000010a000079ffffff000084ffffffffffff00007fffffffff00007fffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff87
+876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff00007fffffffff450000c8ff7f00
+00ffffffff000080ffffffffffffffff00007fffff7f0000ffffffffffff7f0000ffff7f
+000000000000007fff7f00000000000000000000000000fdffffffffff45000000c9ffff
+ffffffff00007fffffffae0000000000000983fdffffffffff00007fffffff0000000000
+000000000000000073ffffff00007fffffffffffff00007fffffffff00007fffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffffff
+87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff00007ffffffffffd03003cff89
+0000ffffffff000080ffffffffffffffff00007fffff7f0000ffffffffffff7f0000ffff
+700000000000000070ff7f00007e7e797979797979797577ffffffffffff4c000041ffff
+ffffffffff00007ffffffffff67900000000000000c2ffffffff00007fffffff00003e89
+797979797979797a68bcffffff00007fffffffffffff00007fffffffff00007fffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffffff
+ff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff00007fffffffffff7900009f
+9b0000ffffffff00007bffffffffffffffff00007affff7f0000ffffffffffff7f0000ff
+ffbc687a7979797a68bcff7a0005ffffffffffffffffffffffffffffffff83000000004b
+ffffffffffff00007fffffffffffffffbb793900000038ffffffff00007fffffff000089
+ffffffffffffffffffffffffffff00007fffffffffffff00007fffffffff00007fffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ffff
+ffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff00007fffffffffffff3700
+237c0000ffffffff3a0006feffffffffffff830000bfffff7f0000ffffffffffff7f0000
+ffffffffffffffffffffffffbf000086ffffffffffffffb9baffffffffffbd00004a4800
+00bdffffffffff00007ffffff47dc7ffffffffffff450000ffffffff00007fffffff3a00
+08ffffffffffffffff8ff2fdffffff00007fffffffffffff00007fffffffff00007fffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787ff
+ffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff00007fffffffffffffc3
+0000080000ffffffff8a000087fffffffffffd0c0004ffffff7f0000ffffffffffff7f00
+00ffffffffffffffffffffffffff040000c2ffffffffffc0000040ffffffff010000ffff
+390000c6ffffffff00007ffff90a0038ffffffffffff890000ffffffff000085ffffff8a
+00004dffffffffffff470000bcffffff00007fffffffffffff00007fffffffff000085ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff8787
+ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff00007fffffffffffff
+ff8100000000fffffffff70000003fcdffff850b000079ffffff7f0000ffffffffffff7f
+0000ffffffffffffffffffffffffff7900000088ffffff88000000bcffffff490000b6ff
+ffc300003cffffffff00007fffff7700003eceffffff8b02007dffffffff000049ffffff
+f90000003dceffffce3d000034ffffffff00007fffffffffffff00007fffffffff000049
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff87
+87ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00007fffffffffff
+fffff800000000ffffffffffb30000000003000000003effffffff7f0000ffffffffffff
+7f0000ffffffffffffffffffffffffffff3e0000000100010000003fffffff8200007eff
+ffffff7d000082ffffff00007ffffff505000000030000000000f8ffffffff0000000005
+f7ffb300000000030300000000bfffffffff00007fffffffffffff00007fffffffff0000
+000004faffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffffff
+8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffd000073ffffffff
+ffffffffb1000000fdffffffffffc23100000000000176ffffffffff730000fdffffffff
+ff730000fdffffffffffffffffffffffffffff760100000000000176ffffffa400003eff
+ffffffffff3e0000a4fffd000073fffffff94100000000000031beffffffffffae000000
+0077ffffc23100000000000031c1fffffffffd000073fffffffffffd000073ffffffffae
+00000000fbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effffff
+ff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7867bcffffff
+ffffffffffff7d7378fffffffffffffffff5827872bcffffffffffffffbc6778ffffffff
+ffffbc6778ffffffffffffffffffffffffffffffffffbc727b72bcfffffffffe78697cff
+ffffffffffffff7c6978ffff7867bcfffffffffff482787882f5fffffffffffffffff481
+7869bbfffffffff582787882f5ffffffffffffff7867bcffffffffffff7867bcffffffff
+fff4827478ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001effff
+ffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001eff
+ffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000001e
+ffffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f000000
+1effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000
+001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f00
+00001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
+0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff7f0000001effffffff8787ffffffff87876319000000ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff810000001effffffff8787ffffffff87876319000005ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff820000001effffffff8787ffffffff8787631500000005000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000003000000001effffffff8787ffffffff8787741a000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000001effffffff8787ffffffff8787eefffb01000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000001effffffff8787ffffffff8787ffffe6371c1e1e1e1e
+1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e
+1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e
+1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e
+1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e
+1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e
+1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e
+1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e
+1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e
+1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e
+1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e
+1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e
+1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e
+1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e
+1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e
+1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e
+1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e
+1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e
+1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e
+1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e
+1e1e1e1e1e1e1e1e1e1e1e1e1e1e1c38ffffffff8787ffffffff87ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff8787ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff8787ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff8787ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff8787ff6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e876e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e
+%%EndData
+end
+%%PageTrailer
+%%Trailer
+%%BoundingBox: 0 109 495 573
+%%EOF
diff --git a/doc/user/states.gif b/doc/user/states.gif
new file mode 100644
index 0000000000..cd0799ea2e
--- /dev/null
+++ b/doc/user/states.gif
Binary files differ
diff --git a/doc/user/states.png b/doc/user/states.png
new file mode 100644
index 0000000000..26d8b7784a
--- /dev/null
+++ b/doc/user/states.png
Binary files differ
diff --git a/doc/user/task.t b/doc/user/task.t
new file mode 100644
index 0000000000..bd3e296828
--- /dev/null
+++ b/doc/user/task.t
@@ -0,0 +1,1770 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Task Manager
+
+@cindex tasks
+
+@section Introduction
+
+The task manager provides a comprehensive set of directives to
+create, delete, and administer tasks. The directives provided
+by the task manager are:
+
+@itemize @bullet
+@item @code{@value{DIRPREFIX}task_create} - Create a task
+@item @code{@value{DIRPREFIX}task_ident} - Get ID of a task
+@item @code{@value{DIRPREFIX}task_start} - Start a task
+@item @code{@value{DIRPREFIX}task_restart} - Restart a task
+@item @code{@value{DIRPREFIX}task_delete} - Delete a task
+@item @code{@value{DIRPREFIX}task_suspend} - Suspend a task
+@item @code{@value{DIRPREFIX}task_resume} - Resume a task
+@item @code{@value{DIRPREFIX}task_is_suspended} - Determine if a task is suspended
+@item @code{@value{DIRPREFIX}task_set_priority} - Set task priority
+@item @code{@value{DIRPREFIX}task_mode} - Change current task's mode
+@item @code{@value{DIRPREFIX}task_get_note} - Get task notepad entry
+@item @code{@value{DIRPREFIX}task_set_note} - Set task notepad entry
+@item @code{@value{DIRPREFIX}task_wake_after} - Wake up after interval
+@item @code{@value{DIRPREFIX}task_wake_when} - Wake up when specified
+@item @code{@value{DIRPREFIX}task_variable_add} - Associate per task variable
+@item @code{@value{DIRPREFIX}task_variable_get} - Obtain value of a a per task variable
+@item @code{@value{DIRPREFIX}task_variable_delete} - Remove per task variable
+@end itemize
+
+@section Background
+
+@subsection Task Definition
+
+@cindex task, definition
+
+Many definitions of a task have been proposed in computer literature.
+Unfortunately, none of these definitions encompasses all facets of the
+concept in a manner which is operating system independent. Several of the
+more common definitions are provided to enable each user to select a
+definition which best matches their own experience and understanding of the
+task concept:
+
+@itemize @bullet
+@item a "dispatchable" unit.
+
+@item an entity to which the processor is allocated.
+
+@item an atomic unit of a real-time, multiprocessor system.
+
+@item single threads of execution which concurrently compete for resources.
+
+@item a sequence of closely related computations which can execute
+concurrently with other computational sequences.
+
+@end itemize
+
+From RTEMS' perspective, a task is the smallest thread of
+execution which can compete on its own for system resources. A
+task is manifested by the existence of a task control block
+(TCB).
+
+@subsection Task Control Block
+
+The Task Control Block (TCB) is an RTEMS defined data structure
+which contains all the information that is pertinent to the
+execution of a task. During system initialization, RTEMS
+reserves a TCB for each task configured. A TCB is allocated
+upon creation of the task and is returned to the TCB free list
+upon deletion of the task.
+
+The TCB's elements are modified as a result of system calls made
+by the application in response to external and internal stimuli.
+TCBs are the only RTEMS internal data structure that can be
+accessed by an application via user extension routines. The TCB
+contains a task's name, ID, current priority, current and
+starting states, execution mode, set of notepad locations, TCB
+user extension pointer, scheduling control structures, as well
+as data required by a blocked task.
+
+A task's context is stored in the TCB when a task switch occurs.
+When the task regains control of the processor, its context is
+restored from the TCB. When a task is restarted, the initial
+state of the task is restored from the starting context area in
+the task's TCB.
+
+@subsection Task States
+
+@cindex task states
+
+A task may exist in one of the following five states:
+
+@itemize @bullet
+@item @b{executing} - Currently scheduled to the CPU
+@item @b{ready} - May be scheduled to the CPU
+@item @b{blocked} - Unable to be scheduled to the CPU
+@item @b{dormant} - Created task that is not started
+@item @b{non-existent} - Uncreated or deleted task
+@end itemize
+
+An active task may occupy the executing, ready, blocked or
+dormant state, otherwise the task is considered non-existent.
+One or more tasks may be active in the system simultaneously.
+Multiple tasks communicate, synchronize, and compete for system
+resources with each other via system calls. The multiple tasks
+appear to execute in parallel, but actually each is dispatched
+to the CPU for periods of time determined by the RTEMS
+scheduling algorithm. The scheduling of a task is based on its
+current state and priority.
+
+@subsection Task Priority
+
+@cindex task priority
+@cindex priority, task
+@findex rtems_task_priority
+
+A task's priority determines its importance in relation to the
+other tasks executing on the same processor. RTEMS supports 255
+levels of priority ranging from 1 to 255. The data type
+@code{@value{DIRPREFIX}task_priority} is used to store task
+priorities.
+
+Tasks of numerically
+smaller priority values are more important tasks than tasks of
+numerically larger priority values. For example, a task at
+priority level 5 is of higher privilege than a task at priority
+level 10. There is no limit to the number of tasks assigned to
+the same priority.
+
+Each task has a priority associated with it at all times. The
+initial value of this priority is assigned at task creation
+time. The priority of a task may be changed at any subsequent
+time.
+
+Priorities are used by the scheduler to determine which ready
+task will be allowed to execute. In general, the higher the
+logical priority of a task, the more likely it is to receive
+processor execution time.
+
+@subsection Task Mode
+
+@cindex task mode
+@findex rtems_task_mode
+
+A task's execution mode is a combination of the following
+four components:
+
+@itemize @bullet
+@item preemption
+@item ASR processing
+@item timeslicing
+@item interrupt level
+@end itemize
+
+It is used to modify RTEMS' scheduling process and to alter the
+execution environment of the task. The data type
+@code{@value{DIRPREFIX}task_mode} is used to manage the task
+execution mode.
+
+@cindex preemption
+
+The preemption component allows a task to determine when control of the
+processor is relinquished. If preemption is disabled
+(@code{@value{RPREFIX}NO_PREEMPT}), the task will retain control of the
+processor as long as it is in the executing state -- even if a higher
+priority task is made ready. If preemption is enabled
+(@code{@value{RPREFIX}PREEMPT}) and a higher priority task is made ready,
+then the processor will be taken away from the current task immediately and
+given to the higher priority task.
+
+@cindex timeslicing
+
+The timeslicing component is used by the RTEMS scheduler to determine how
+the processor is allocated to tasks of equal priority. If timeslicing is
+enabled (@code{@value{RPREFIX}TIMESLICE}), then RTEMS will limit the amount
+of time the task can execute before the processor is allocated to another
+ready task of equal priority. The length of the timeslice is application
+dependent and specified in the Configuration Table. If timeslicing is
+disabled (@code{@value{RPREFIX}NO_TIMESLICE}), then the task will be
+allowed to execute until a task of higher priority is made ready. If
+@code{@value{RPREFIX}NO_PREEMPT} is selected, then the timeslicing
+component is ignored by the scheduler.
+
+The asynchronous signal processing component is used to determine when
+received signals are to be processed by the task.
+If signal processing is enabled (@code{@value{RPREFIX}ASR}), then signals
+sent to the task will be processed the next time the task executes. If
+signal processing is disabled (@code{@value{RPREFIX}NO_ASR}), then all
+signals received by the task will remain posted until signal processing is
+enabled. This component affects only tasks which have established a
+routine to process asynchronous signals.
+
+@cindex interrupt level, task
+
+The interrupt level component is used to determine which
+interrupts will be enabled when the task is executing.
+@code{@value{RPREFIX}INTERRUPT_LEVEL(n)}
+specifies that the task will execute at interrupt level n.
+
+@itemize @bullet
+@item @code{@value{RPREFIX}PREEMPT} - enable preemption (default)
+@item @code{@value{RPREFIX}NO_PREEMPT} - disable preemption
+@item @code{@value{RPREFIX}NO_TIMESLICE} - disable timeslicing (default)
+@item @code{@value{RPREFIX}TIMESLICE} - enable timeslicing
+@item @code{@value{RPREFIX}ASR} - enable ASR processing (default)
+@item @code{@value{RPREFIX}NO_ASR} - disable ASR processing
+@item @code{@value{RPREFIX}INTERRUPT_LEVEL(0)} - enable all interrupts (default)
+@item @code{@value{RPREFIX}INTERRUPT_LEVEL(n)} - execute at interrupt level n
+@end itemize
+
+The set of default modes may be selected by specifying the
+@code{@value{RPREFIX}DEFAULT_MODES} constant.
+
+@subsection Accessing Task Arguments
+
+@cindex task arguments
+@cindex task prototype
+
+All RTEMS tasks are invoked with a single argument which is
+specified when they are started or restarted. The argument is
+commonly used to communicate startup information to the task.
+The simplest manner in which to define a task which accesses it
+argument is:
+
+@ifset is-C
+@findex rtems_task
+
+@example
+rtems_task user_task(
+ rtems_task_argument argument
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure User_Task (
+ Argument : in RTEMS.Task_Argument_Ptr
+);
+@end example
+@end ifset
+
+Application tasks requiring more information may view this
+single argument as an index into an array of parameter blocks.
+
+@subsection Floating Point Considerations
+
+@cindex floating point
+
+Creating a task with the @code{@value{RPREFIX}FLOATING_POINT} attribute
+flag results
+in additional memory being allocated for the TCB to store the state of the
+numeric coprocessor during task switches. This additional memory is
+@b{NOT} allocated for @code{@value{RPREFIX}NO_FLOATING_POINT} tasks. Saving
+and restoring the context of a @code{@value{RPREFIX}FLOATING_POINT} task
+takes longer than that of a @code{@value{RPREFIX}NO_FLOATING_POINT} task
+because of the relatively large amount of time required for the numeric
+coprocessor to save or restore its computational state.
+
+Since RTEMS was designed specifically for embedded military applications
+which are floating point intensive, the executive is optimized to avoid
+unnecessarily saving and restoring the state of the numeric coprocessor.
+The state of the numeric coprocessor is only saved when a
+@code{@value{RPREFIX}FLOATING_POINT} task is dispatched and that task was
+not the last task to utilize the coprocessor. In a system with only one
+@code{@value{RPREFIX}FLOATING_POINT} task, the state of the numeric
+coprocessor will never be saved or restored.
+
+Although the overhead imposed by @code{@value{RPREFIX}FLOATING_POINT} tasks
+is minimal, some applications may wish to completely avoid the overhead
+associated with @code{@value{RPREFIX}FLOATING_POINT} tasks and still
+utilize a numeric coprocessor. By preventing a task from being preempted
+while performing a sequence of floating point operations, a
+@code{@value{RPREFIX}NO_FLOATING_POINT} task can utilize the numeric
+coprocessor without incurring the overhead of a
+@code{@value{RPREFIX}FLOATING_POINT} context switch. This approach also
+avoids the allocation of a floating point context area. However, if this
+approach is taken by the application designer, NO tasks should be created
+as @code{@value{RPREFIX}FLOATING_POINT} tasks. Otherwise, the floating
+point context will not be correctly maintained because RTEMS assumes that
+the state of the numeric coprocessor will not be altered by
+@code{@value{RPREFIX}NO_FLOATING_POINT} tasks.
+
+If the supported processor type does not have hardware floating
+capabilities or a standard numeric coprocessor, RTEMS will not provide
+built-in support for hardware floating point on that processor. In this
+case, all tasks are considered @code{@value{RPREFIX}NO_FLOATING_POINT}
+whether created as @code{@value{RPREFIX}FLOATING_POINT} or
+@code{@value{RPREFIX}NO_FLOATING_POINT} tasks. A floating point emulation
+software library must be utilized for floating point operations.
+
+On some processors, it is possible to disable the floating point unit
+dynamically. If this capability is supported by the target processor, then
+RTEMS will utilize this capability to enable the floating point unit only
+for tasks which are created with the @code{@value{RPREFIX}FLOATING_POINT}
+attribute. The consequence of a @code{@value{RPREFIX}NO_FLOATING_POINT}
+task attempting to access the floating point unit is CPU dependent but will
+generally result in an exception condition.
+
+@subsection Per Task Variables
+
+@cindex per task variables
+
+Per task variables are used to support global variables whose value
+may be unique to a task. After indicating that a variable should be
+treated as private (i.e. per-task) the task can access and modify the
+variable, but the modifications will not appear to other tasks, and
+other tasks' modifications to that variable will not affect the value
+seen by the task. This is accomplished by saving and restoring the
+variable's value each time a task switch occurs to or from the calling task.
+
+The value seen by other tasks, including those which have not added the
+variable to their set and are thus accessing the variable as a common
+location shared among tasks, can not be affected by a task once it has
+added a variable to its local set. Changes made to the variable by
+other tasks will not affect the value seen by a task which has added the
+variable to its private set.
+
+This feature can be used when a routine is to be spawned repeatedly as
+several independent tasks. Although each task will have its own stack,
+and thus separate stack variables, they will all share the same static and
+global variables. To make a variable not shareable (i.e. a "global" variable
+that is specific to a single task), the tasks can call
+@code{rtems_task_variable_add} to make a separate copy of the variable
+for each task, but all at the same physical address.
+
+Task variables increase the context switch time to and from the
+tasks that own them so it is desirable to minimize the number of
+task variables. One efficient method is to have a single task
+variable that is a pointer to a dynamically allocated structure
+containing the task's private "global" data.
+
+A critical point with per-task variables is that each task must separately
+request that the same global variable is per-task private.
+
+@subsection Building a Task Attribute Set
+
+@cindex task attributes, building
+
+In general, an attribute set is built by a bitwise OR of the
+desired components. The set of valid task attribute components
+is listed below:
+
+@itemize @bullet
+@item @code{@value{RPREFIX}NO_FLOATING_POINT} - does not use coprocessor (default)
+@item @code{@value{RPREFIX}FLOATING_POINT} - uses numeric coprocessor
+@item @code{@value{RPREFIX}LOCAL} - local task (default)
+@item @code{@value{RPREFIX}GLOBAL} - global task
+@end itemize
+
+Attribute values are specifically designed to be mutually
+exclusive, therefore bitwise OR and addition operations are
+equivalent as long as each attribute appears exactly once in the
+component list. A component listed as a default is not required
+to appear in the component list, although it is a good
+programming practice to specify default components. If all
+defaults are desired, then @code{@value{RPREFIX}DEFAULT_ATTRIBUTES} should be used.
+
+This example demonstrates the attribute_set parameter needed to
+create a local task which utilizes the numeric coprocessor. The
+attribute_set parameter could be @code{@value{RPREFIX}FLOATING_POINT} or
+@code{@value{RPREFIX}LOCAL @value{OR} @value{RPREFIX}FLOATING_POINT}.
+The attribute_set parameter can be set to
+@code{@value{RPREFIX}FLOATING_POINT} because @code{@value{RPREFIX}LOCAL} is the default for all created
+tasks. If the task were global and used the numeric
+coprocessor, then the attribute_set parameter would be
+@code{@value{RPREFIX}GLOBAL @value{OR} @value{RPREFIX}FLOATING_POINT}.
+
+@subsection Building a Mode and Mask
+
+@cindex task mode, building
+
+In general, a mode and its corresponding mask is built by a
+bitwise OR of the desired components. The set of valid mode
+constants and each mode's corresponding mask constant is
+listed below:
+
+@ifset use-ascii
+@itemize @bullet
+@item @code{@value{RPREFIX}PREEMPT} is masked by
+@code{@value{RPREFIX}PREEMPT_MASK} and enables preemption
+
+@item @code{@value{RPREFIX}NO_PREEMPT} is masked by
+@code{@value{RPREFIX}PREEMPT_MASK} and disables preemption
+
+@item @code{@value{RPREFIX}NO_TIMESLICE} is masked by
+@code{@value{RPREFIX}TIMESLICE_MASK} and disables timeslicing
+
+@item @code{@value{RPREFIX}TIMESLICE} is masked by
+@code{@value{RPREFIX}TIMESLICE_MASK} and enables timeslicing
+
+@item @code{@value{RPREFIX}ASR} is masked by
+@code{@value{RPREFIX}ASR_MASK} and enables ASR processing
+
+@item @code{@value{RPREFIX}NO_ASR} is masked by
+@code{@value{RPREFIX}ASR_MASK} and disables ASR processing
+
+@item @code{@value{RPREFIX}INTERRUPT_LEVEL(0)} is masked by
+@code{@value{RPREFIX}INTERRUPT_MASK} and enables all interrupts
+
+@item @code{@value{RPREFIX}INTERRUPT_LEVEL(n)} is masked by
+@code{@value{RPREFIX}INTERRUPT_MASK} and sets interrupts level n
+@end itemize
+@end ifset
+
+@ifset use-tex
+@sp 1
+@c this is temporary
+@itemize @bullet
+@item @code{@value{RPREFIX}PREEMPT} is masked by
+@code{@value{RPREFIX}PREEMPT_MASK} and enables preemption
+
+@item @code{@value{RPREFIX}NO_PREEMPT} is masked by
+@code{@value{RPREFIX}PREEMPT_MASK} and disables preemption
+
+@item @code{@value{RPREFIX}NO_TIMESLICE} is masked by
+@code{@value{RPREFIX}TIMESLICE_MASK} and disables timeslicing
+
+@item @code{@value{RPREFIX}TIMESLICE} is masked by
+@code{@value{RPREFIX}TIMESLICE_MASK} and enables timeslicing
+
+@item @code{@value{RPREFIX}ASR} is masked by
+@code{@value{RPREFIX}ASR_MASK} and enables ASR processing
+
+@item @code{@value{RPREFIX}NO_ASR} is masked by
+@code{@value{RPREFIX}ASR_MASK} and disables ASR processing
+
+@item @code{@value{RPREFIX}INTERRUPT_LEVEL(0)} is masked by
+@code{@value{RPREFIX}INTERRUPT_MASK} and enables all interrupts
+
+@item @code{@value{RPREFIX}INTERRUPT_LEVEL(n)} is masked by
+@code{@value{RPREFIX}INTERRUPT_MASK} and sets interrupts level n
+
+@end itemize
+
+@tex
+@end tex
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=3 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=center><STRONG>Mode Constant</STRONG></TD>
+ <TD ALIGN=center><STRONG>Mask Constant</STRONG></TD>
+ <TD ALIGN=center><STRONG>Description</STRONG></TD></TR>
+<TR><TD ALIGN=center>@value{RPREFIX}PREEMPT</TD>
+ <TD ALIGN=center>@value{RPREFIX}PREEMPT_MASK</TD>
+ <TD ALIGN=center>enables preemption</TD></TR>
+<TR><TD ALIGN=center>@value{RPREFIX}NO_PREEMPT</TD>
+ <TD ALIGN=center>@value{RPREFIX}PREEMPT_MASK</TD>
+ <TD ALIGN=center>disables preemption</TD></TR>
+<TR><TD ALIGN=center>@value{RPREFIX}NO_TIMESLICE</TD>
+ <TD ALIGN=center>@value{RPREFIX}TIMESLICE_MASK</TD>
+ <TD ALIGN=center>disables timeslicing</TD></TR>
+<TR><TD ALIGN=center>@value{RPREFIX}TIMESLICE</TD>
+ <TD ALIGN=center>@value{RPREFIX}TIMESLICE_MASK</TD>
+ <TD ALIGN=center>enables timeslicing</TD></TR>
+<TR><TD ALIGN=center>@value{RPREFIX}ASR</TD>
+ <TD ALIGN=center>@value{RPREFIX}ASR_MASK</TD>
+ <TD ALIGN=center>enables ASR processing</TD></TR>
+<TR><TD ALIGN=center>@value{RPREFIX}NO_ASR</TD>
+ <TD ALIGN=center>@value{RPREFIX}ASR_MASK</TD>
+ <TD ALIGN=center>disables ASR processing</TD></TR>
+<TR><TD ALIGN=center>@value{RPREFIX}INTERRUPT_LEVEL(0)</TD>
+ <TD ALIGN=center>@value{RPREFIX}INTERRUPT_MASK</TD>
+ <TD ALIGN=center>enables all interrupts</TD></TR>
+<TR><TD ALIGN=center>@value{RPREFIX}INTERRUPT_LEVEL(n)</TD>
+ <TD ALIGN=center>@value{RPREFIX}INTERRUPT_MASK</TD>
+ <TD ALIGN=center>sets interrupts level n</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+Mode values are specifically designed to be mutually exclusive, therefore
+bitwise OR and addition operations are equivalent as long as each mode
+appears exactly once in the component list. A mode component listed as a
+default is not required to appear in the mode component list, although it
+is a good programming practice to specify default components. If all
+defaults are desired, the mode @code{@value{RPREFIX}DEFAULT_MODES} and the
+mask @code{@value{RPREFIX}ALL_MODE_MASKS} should be used.
+
+The following example demonstrates the mode and mask parameters used with
+the @code{@value{DIRPREFIX}task_mode}
+directive to place a task at interrupt level 3 and make it
+non-preemptible. The mode should be set to
+@code{@value{RPREFIX}INTERRUPT_LEVEL(3) @value{OR}
+@value{RPREFIX}NO_PREEMPT} to indicate the desired preemption mode and
+interrupt level, while the mask parameter should be set to
+@code{@value{RPREFIX}INTERRUPT_MASK @value{OR}
+@value{RPREFIX}NO_PREEMPT_MASK} to indicate that the calling task's
+interrupt level and preemption mode are being altered.
+
+@section Operations
+
+@subsection Creating Tasks
+
+The @code{@value{DIRPREFIX}task_create}
+directive creates a task by allocating a task
+control block, assigning the task a user-specified name,
+allocating it a stack and floating point context area, setting a
+user-specified initial priority, setting a user-specified
+initial mode, and assigning it a task ID. Newly created tasks
+are initially placed in the dormant state. All RTEMS tasks
+execute in the most privileged mode of the processor.
+
+@subsection Obtaining Task IDs
+
+When a task is created, RTEMS generates a unique task ID and
+assigns it to the created task until it is deleted. The task ID
+may be obtained by either of two methods. First, as the result
+of an invocation of the @code{@value{DIRPREFIX}task_create}
+directive, the task ID is
+stored in a user provided location. Second, the task ID may be
+obtained later using the @code{@value{DIRPREFIX}task_ident}
+directive. The task ID is
+used by other directives to manipulate this task.
+
+@subsection Starting and Restarting Tasks
+
+The @code{@value{DIRPREFIX}task_start}
+directive is used to place a dormant task in the
+ready state. This enables the task to compete, based on its
+current priority, for the processor and other system resources.
+Any actions, such as suspension or change of priority, performed
+on a task prior to starting it are nullified when the task is
+started.
+
+With the @code{@value{DIRPREFIX}task_start}
+directive the user specifies the task's
+starting address and argument. The argument is used to
+communicate some startup information to the task. As part of
+this directive, RTEMS initializes the task's stack based upon
+the task's initial execution mode and start address. The
+starting argument is passed to the task in accordance with the
+target processor's calling convention.
+
+The @code{@value{DIRPREFIX}task_restart}
+directive restarts a task at its initial
+starting address with its original priority and execution mode,
+but with a possibly different argument. The new argument may be
+used to distinguish between the original invocation of the task
+and subsequent invocations. The task's stack and control block
+are modified to reflect their original creation values.
+Although references to resources that have been requested are
+cleared, resources allocated by the task are NOT automatically
+returned to RTEMS. A task cannot be restarted unless it has
+previously been started (i.e. dormant tasks cannot be
+restarted). All restarted tasks are placed in the ready state.
+
+@subsection Suspending and Resuming Tasks
+
+The @code{@value{DIRPREFIX}task_suspend}
+directive is used to place either the caller or
+another task into a suspended state. The task remains suspended
+until a @code{@value{DIRPREFIX}task_resume}
+directive is issued. This implies that a
+task may be suspended as well as blocked waiting either to
+acquire a resource or for the expiration of a timer.
+
+The @code{@value{DIRPREFIX}task_resume}
+directive is used to remove another task from
+the suspended state. If the task is not also blocked, resuming
+it will place it in the ready state, allowing it to once again
+compete for the processor and resources. If the task was
+blocked as well as suspended, this directive clears the
+suspension and leaves the task in the blocked state.
+
+Suspending a task which is already suspended or resuming a
+task which is not suspended is considered an error.
+The @code{@value{DIRPREFIX}task_is_suspended} can be used to
+determine if a task is currently suspended.
+
+@subsection Delaying the Currently Executing Task
+
+The @code{@value{DIRPREFIX}task_wake_after} directive creates a sleep timer
+which allows a task to go to sleep for a specified interval. The task is
+blocked until the delay interval has elapsed, at which time the task is
+unblocked. A task calling the @code{@value{DIRPREFIX}task_wake_after}
+directive with a delay
+interval of @code{@value{RPREFIX}YIELD_PROCESSOR} ticks will yield the
+processor to any other ready task of equal or greater priority and remain
+ready to execute.
+
+The @code{@value{DIRPREFIX}task_wake_when}
+directive creates a sleep timer which allows
+a task to go to sleep until a specified date and time. The
+calling task is blocked until the specified date and time has
+occurred, at which time the task is unblocked.
+
+@subsection Changing Task Priority
+
+The @code{@value{DIRPREFIX}task_set_priority}
+directive is used to obtain or change the
+current priority of either the calling task or another task. If
+the new priority requested is
+@code{@value{RPREFIX}CURRENT_PRIORITY} or the task's
+actual priority, then the current priority will be returned and
+the task's priority will remain unchanged. If the task's
+priority is altered, then the task will be scheduled according
+to its new priority.
+
+The @code{@value{DIRPREFIX}task_restart}
+directive resets the priority of a task to its
+original value.
+
+@subsection Changing Task Mode
+
+The @code{@value{DIRPREFIX}task_mode}
+directive is used to obtain or change the current
+execution mode of the calling task. A task's execution mode is
+used to enable preemption, timeslicing, ASR processing, and to
+set the task's interrupt level.
+
+The @code{@value{DIRPREFIX}task_restart}
+directive resets the mode of a task to its
+original value.
+
+@subsection Notepad Locations
+
+RTEMS provides sixteen notepad locations for each task. Each
+notepad location may contain a note consisting of four bytes of
+information. RTEMS provides two directives,
+@code{@value{DIRPREFIX}task_set_note} and
+@code{@value{DIRPREFIX}task_get_note}, that enable a user
+to access and change the
+notepad locations. The @code{@value{DIRPREFIX}task_set_note}
+directive enables the user
+to set a task's notepad entry to a specified note. The
+@code{@value{DIRPREFIX}task_get_note}
+directive allows the user to obtain the note
+contained in any one of the sixteen notepads of a specified task.
+
+@subsection Task Deletion
+
+RTEMS provides the @code{@value{DIRPREFIX}task_delete}
+directive to allow a task to
+delete itself or any other task. This directive removes all
+RTEMS references to the task, frees the task's control block,
+removes it from resource wait queues, and deallocates its stack
+as well as the optional floating point context. The task's name
+and ID become inactive at this time, and any subsequent
+references to either of them is invalid. In fact, RTEMS may
+reuse the task ID for another task which is created later in the
+application.
+
+Unexpired delay timers (i.e. those used by
+@code{@value{DIRPREFIX}task_wake_after} and
+@code{@value{DIRPREFIX}task_wake_when}) and
+timeout timers associated with the task are
+automatically deleted, however, other resources dynamically
+allocated by the task are NOT automatically returned to RTEMS.
+Therefore, before a task is deleted, all of its dynamically
+allocated resources should be deallocated by the user. This may
+be accomplished by instructing the task to delete itself rather
+than directly deleting the task. Other tasks may instruct a
+task to delete itself by sending a "delete self" message, event,
+or signal, or by restarting the task with special arguments
+which instruct the task to delete itself.
+
+@section Directives
+
+This section details the task manager's directives. A
+subsection is dedicated to each of this manager's directives and
+describes the calling sequence, related constants, usage, and
+status codes.
+
+@page
+
+@subsection TASK_CREATE - Create a task
+
+@cindex create a task
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_task_create
+@example
+rtems_status_code rtems_task_create(
+ rtems_name name,
+ rtems_task_priority initial_priority,
+ rtems_unsigned32 stack_size,
+ rtems_mode initial_modes,
+ rtems_attribute attribute_set,
+ rtems_id *id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Task_Create (
+ Name : in RTEMS.Name;
+ Initial_Priority : in RTEMS.Task_Priority;
+ Stack_Size : in RTEMS.Unsigned32;
+ Initial_Modes : in RTEMS.Mode;
+ Attribute_Set : in RTEMS.Attribute;
+ ID : out RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - task created successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{id} is NULL@*
+@code{@value{RPREFIX}INVALID_NAME} - invalid task name@*
+@code{@value{RPREFIX}INVALID_PRIORITY} - invalid task priority@*
+@code{@value{RPREFIX}MP_NOT_CONFIGURED} - multiprocessing not configured@*
+@code{@value{RPREFIX}TOO_MANY} - too many tasks created@*
+@code{@value{RPREFIX}UNSATISFIED} - not enough memory for stack/FP context@*
+@code{@value{RPREFIX}TOO_MANY} - too many global objects
+
+@subheading DESCRIPTION:
+This directive creates a task which resides on the local node.
+It allocates and initializes a TCB, a stack, and an optional
+floating point context area. The mode parameter contains values
+which sets the task's initial execution mode. The
+@code{@value{RPREFIX}FLOATING_POINT} attribute should be
+specified if the created task
+is to use a numeric coprocessor. For performance reasons, it is
+recommended that tasks not using the numeric coprocessor should
+specify the @code{@value{RPREFIX}NO_FLOATING_POINT} attribute.
+If the @code{@value{RPREFIX}GLOBAL}
+attribute is specified, the task can be accessed from remote
+nodes. The task id, returned in id, is used in other task
+related directives to access the task. When created, a task is
+placed in the dormant state and can only be made ready to
+execute using the directive @code{@value{DIRPREFIX}task_start}.
+
+@subheading NOTES:
+This directive will not cause the calling task to be preempted.
+
+Valid task priorities range from a high of 1 to a low of 255.
+
+If the requested stack size is less than
+@code{@value{RPREFIX}MINIMUM_STACK_SIZE} bytes, then RTEMS
+will use @code{@value{RPREFIX}MINIMUM_STACK_SIZE} as the
+stack size. The value of @code{@value{RPREFIX}MINIMUM_STACK_SIZE}
+is processor dependent.
+Application developers should consider the stack usage of the
+device drivers when calculating the stack size required for
+tasks which utilize the driver.
+
+The following task attribute constants are defined by RTEMS:
+
+@itemize @bullet
+@item @code{@value{RPREFIX}NO_FLOATING_POINT} - does not use coprocessor (default)
+@item @code{@value{RPREFIX}FLOATING_POINT} - uses numeric coprocessor
+@item @code{@value{RPREFIX}LOCAL} - local task (default)
+@item @code{@value{RPREFIX}GLOBAL} - global task
+@end itemize
+
+The following task mode constants are defined by RTEMS:
+
+@itemize @bullet
+@item @code{@value{RPREFIX}PREEMPT} - enable preemption (default)
+@item @code{@value{RPREFIX}NO_PREEMPT} - disable preemption
+@item @code{@value{RPREFIX}NO_TIMESLICE} - disable timeslicing (default)
+@item @code{@value{RPREFIX}TIMESLICE} - enable timeslicing
+@item @code{@value{RPREFIX}ASR} - enable ASR processing (default)
+@item @code{@value{RPREFIX}NO_ASR} - disable ASR processing
+@item @code{@value{RPREFIX}INTERRUPT_LEVEL(0)} - enable all interrupts (default)
+@item @code{@value{RPREFIX}INTERRUPT_LEVEL(n)} - execute at interrupt level n
+@end itemize
+
+The interrupt level portion of the task execution mode
+supports a maximum of 256 interrupt levels. These levels are
+mapped onto the interrupt levels actually supported by the
+target processor in a processor dependent fashion.
+
+Tasks should not be made global unless remote tasks must
+interact with them. This avoids the system overhead incurred by
+the creation of a global task. When a global task is created,
+the task's name and id must be transmitted to every node in the
+system for insertion in the local copy of the global object
+table.
+
+The total number of global objects, including tasks, is limited
+by the maximum_global_objects field in the Configuration Table.
+
+@page
+
+@subsection TASK_IDENT - Get ID of a task
+
+@cindex get ID of a task
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_task_ident
+@example
+rtems_status_code rtems_task_ident(
+ rtems_name name,
+ rtems_unsigned32 node,
+ rtems_id *id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Task_Ident (
+ Name : in RTEMS.Name;
+ Node : in RTEMS.Node;
+ ID : out RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - task identified successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{id} is NULL@*
+@code{@value{RPREFIX}INVALID_NAME} - invalid task name@*
+@code{@value{RPREFIX}INVALID_NODE} - invalid node id
+
+@subheading DESCRIPTION:
+This directive obtains the task id associated with the task name
+specified in name. A task may obtain its own id by specifying
+@code{@value{RPREFIX}SELF} or its own task name in name. If the task name is not
+unique, then the task id returned will match one of the tasks
+with that name. However, this task id is not guaranteed to
+correspond to the desired task. The task id, returned in id, is
+used in other task related directives to access the task.
+
+@subheading NOTES:
+This directive will not cause the running task to be preempted.
+
+If node is @code{@value{RPREFIX}SEARCH_ALL_NODES}, all nodes are searched with the
+local node being searched first. All other nodes are searched
+with the lowest numbered node searched first.
+
+If node is a valid node number which does not represent the
+local node, then only the tasks exported by the designated node
+are searched.
+
+This directive does not generate activity on remote nodes. It
+accesses only the local copy of the global object table.
+
+@page
+
+@subsection TASK_START - Start a task
+
+@cindex starting a task
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_task_start
+@example
+rtems_status_code rtems_task_start(
+ rtems_id id,
+ rtems_task_entry entry_point,
+ rtems_task_argument argument
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Task_Start (
+ ID : in RTEMS.ID;
+ Entry_Point : in System.Address;
+ Argument : in RTEMS.Task_Argument_PTR;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - ask started successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - invalid task entry point@*
+@code{@value{RPREFIX}INVALID_ID} - invalid task id@*
+@code{@value{RPREFIX}INCORRECT_STATE} - task not in the dormant state@*
+@code{@value{RPREFIX}ILLEGAL_ON_REMOTE_OBJECT} - cannot start remote task
+
+@subheading DESCRIPTION:
+This directive readies the task, specified by tid, for execution
+based on the priority and execution mode specified when the task
+was created. The starting address of the task is given in
+entry_point. The task's starting argument is contained in
+argument. This argument can be a single value or used as an
+index into an array of parameter blocks.
+
+@subheading NOTES:
+The calling task will be preempted if its preemption mode is
+enabled and the task being started has a higher priority.
+
+Any actions performed on a dormant task such as suspension or
+change of priority are nullified when the task is initiated via
+the @code{@value{DIRPREFIX}task_start} directive.
+
+@page
+
+@subsection TASK_RESTART - Restart a task
+
+@cindex restarting a task
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_task_restart
+@example
+rtems_status_code rtems_task_restart(
+ rtems_id id,
+ rtems_task_argument argument
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Task_Restart (
+ ID : in RTEMS.ID;
+ Argument : in RTEMS.Task_Argument_PTR;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - task restarted successfully@*
+@code{@value{RPREFIX}INVALID_ID} - task id invalid@*
+@code{@value{RPREFIX}INCORRECT_STATE} - task never started@*
+@code{@value{RPREFIX}ILLEGAL_ON_REMOTE_OBJECT} - cannot restart remote task
+
+@subheading DESCRIPTION:
+This directive resets the task specified by id to begin
+execution at its original starting address. The task's priority
+and execution mode are set to the original creation values. If
+the task is currently blocked, RTEMS automatically makes the
+task ready. A task can be restarted from any state, except the
+dormant state.
+
+The task's starting argument is contained in argument. This
+argument can be a single value or an index into an array of
+parameter blocks. This new argument may be used to distinguish
+between the initial @code{@value{DIRPREFIX}task_start}
+of the task and any ensuing calls
+to @code{@value{DIRPREFIX}task_restart}
+of the task. This can be beneficial in deleting
+a task. Instead of deleting a task using
+the @code{@value{DIRPREFIX}task_delete}
+directive, a task can delete another task by restarting that
+task, and allowing that task to release resources back to RTEMS
+and then delete itself.
+
+@subheading NOTES:
+If id is @code{@value{RPREFIX}SELF}, the calling task will be restarted and will not
+return from this directive.
+
+The calling task will be preempted if its preemption mode is
+enabled and the task being restarted has a higher priority.
+
+The task must reside on the local node, even if the task was
+created with the @code{@value{RPREFIX}GLOBAL} option.
+
+@page
+
+@subsection TASK_DELETE - Delete a task
+
+@cindex deleting a task
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_task_delete
+@example
+rtems_status_code rtems_task_delete(
+ rtems_id id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Task_Delete (
+ ID : in RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - task restarted successfully@*
+@code{@value{RPREFIX}INVALID_ID} - task id invalid@*
+@code{@value{RPREFIX}ILLEGAL_ON_REMOTE_OBJECT} - cannot restart remote task
+
+@subheading DESCRIPTION:
+This directive deletes a task, either the calling task or
+another task, as specified by id. RTEMS stops the execution of
+the task and reclaims the stack memory, any allocated delay or
+timeout timers, the TCB, and, if the task is @code{@value{RPREFIX}FLOATING_POINT}, its
+floating point context area. RTEMS does not reclaim the
+following resources: region segments, partition buffers,
+semaphores, timers, or rate monotonic periods.
+
+@subheading NOTES:
+A task is responsible for releasing its resources back to RTEMS
+before deletion. To insure proper deallocation of resources, a
+task should not be deleted unless it is unable to execute or
+does not hold any RTEMS resources. If a task holds RTEMS
+resources, the task should be allowed to deallocate its
+resources before deletion. A task can be directed to release
+its resources and delete itself by restarting it with a special
+argument or by sending it a message, an event, or a signal.
+
+Deletion of the current task (@code{@value{RPREFIX}SELF}) will force RTEMS to select
+another task to execute.
+
+When a global task is deleted, the task id must be transmitted
+to every node in the system for deletion from the local copy of
+the global object table.
+
+The task must reside on the local node, even if the task was
+created with the @code{@value{RPREFIX}GLOBAL} option.
+
+@page
+
+@subsection TASK_SUSPEND - Suspend a task
+
+@cindex suspending a task
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_task_suspend
+@example
+rtems_status_code rtems_task_suspend(
+ rtems_id id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Task_Suspend (
+ ID : in RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - task restarted successfully@*
+@code{@value{RPREFIX}INVALID_ID} - task id invalid@*
+@code{@value{RPREFIX}ALREADY_SUSPENDED} - task already suspended
+
+@subheading DESCRIPTION:
+This directive suspends the task specified by id from further
+execution by placing it in the suspended state. This state is
+additive to any other blocked state that the task may already be
+in. The task will not execute again until another task issues
+the @code{@value{DIRPREFIX}task_resume}
+directive for this task and any blocked state
+has been removed.
+
+@subheading NOTES:
+The requesting task can suspend itself by specifying @code{@value{RPREFIX}SELF} as id.
+In this case, the task will be suspended and a successful
+return code will be returned when the task is resumed.
+
+Suspending a global task which does not reside on the local node
+will generate a request to the remote node to suspend the
+specified task.
+
+If the task specified by id is already suspended, then the
+@code{@value{RPREFIX}ALREADY_SUSPENDED} status code is returned.
+
+@page
+
+@subsection TASK_RESUME - Resume a task
+
+@cindex resuming a task
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_task_resume
+@example
+rtems_status_code rtems_task_resume(
+ rtems_id id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Task_Resume (
+ ID : in RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - task restarted successfully@*
+@code{@value{RPREFIX}INVALID_ID} - task id invalid@*
+@code{@value{RPREFIX}INCORRECT_STATE} - task not suspended
+
+@subheading DESCRIPTION:
+This directive removes the task specified by id from the
+suspended state. If the task is in the ready state after the
+suspension is removed, then it will be scheduled to run. If the
+task is still in a blocked state after the suspension is
+removed, then it will remain in that blocked state.
+
+@subheading NOTES:
+The running task may be preempted if its preemption mode is
+enabled and the local task being resumed has a higher priority.
+
+Resuming a global task which does not reside on the local node
+will generate a request to the remote node to resume the
+specified task.
+
+If the task specified by id is not suspended, then the
+@code{@value{RPREFIX}INCORRECT_STATE} status code is returned.
+
+@page
+
+@subsection TASK_IS_SUSPENDED - Determine if a task is Suspended
+
+@cindex is task suspended
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_task_is_suspended
+@example
+rtems_status_code rtems_task_is_suspended(
+ rtems_id id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Task_Is_Suspended (
+ ID : in RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - task is not suspended@*
+@code{@value{RPREFIX}ALREADY_SUSPENDED} - task is not suspended@*
+@code{@value{RPREFIX}INVALID_ID} - task id invalid@*
+@code{@value{RPREFIX}ILLEGAL_ON_REMOTE_OBJECT} - not supported on remote tasks
+
+@subheading DESCRIPTION:
+
+This directive returns a status code indicating whether or
+not the specified task is currently suspended.
+
+@subheading NOTES:
+
+This operation is not currently supported on remote tasks.
+
+@page
+
+@subsection TASK_SET_PRIORITY - Set task priority
+
+@findex rtems_task_set_priority
+@cindex current task priority
+@cindex set task priority
+@cindex get task priority
+@cindex obtain task priority
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@example
+rtems_status_code rtems_task_set_priority(
+ rtems_id id,
+ rtems_task_priority new_priority,
+ rtems_task_priority *old_priority
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Task_Set_Priority (
+ ID : in RTEMS.ID;
+ New_Priority : in RTEMS.Task_Priority;
+ Old_Priority : out RTEMS.Task_Priority;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - task priority set successfully@*
+@code{@value{RPREFIX}INVALID_ID} - invalid task id@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - invalid return argument pointer@*
+@code{@value{RPREFIX}INVALID_PRIORITY} - invalid task priority
+
+@subheading DESCRIPTION:
+This directive manipulates the priority of the task specified by
+id. An id of @code{@value{RPREFIX}SELF} is used to indicate
+the calling task. When new_priority is not equal to
+@code{@value{RPREFIX}CURRENT_PRIORITY}, the specified
+task's previous priority is returned in old_priority. When
+new_priority is @code{@value{RPREFIX}CURRENT_PRIORITY},
+the specified task's current
+priority is returned in old_priority. Valid priorities range
+from a high of 1 to a low of 255.
+
+@subheading NOTES:
+The calling task may be preempted if its preemption mode is
+enabled and it lowers its own priority or raises another task's
+priority.
+
+Setting the priority of a global task which does not reside on
+the local node will generate a request to the remote node to
+change the priority of the specified task.
+
+If the task specified by id is currently holding any binary
+semaphores which use the priority inheritance algorithm, then
+the task's priority cannot be lowered immediately. If the
+task's priority were lowered immediately, then priority
+inversion results. The requested lowering of the task's
+priority will occur when the task has released all priority
+inheritance binary semaphores. The task's priority can be
+increased regardless of the task's use of priority inheritance
+binary semaphores.
+
+@page
+
+@subsection TASK_MODE - Change the current task mode
+
+@cindex current task mode
+@cindex set task mode
+@cindex get task mode
+@cindex set task preemption mode
+@cindex get task preemption mode
+@cindex obtain task mode
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_task_mode
+@example
+rtems_status_code rtems_task_mode(
+ rtems_mode mode_set,
+ rtems_mode mask,
+ rtems_mode *previous_mode_set
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Task_Mode (
+ Mode_Set : in RTEMS.Mode;
+ Mask : in RTEMS.Mode;
+ Previous_Mode_Set : in RTEMS.Mode;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - task mode set successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{previous_mode_set} is NULL
+
+@subheading DESCRIPTION:
+This directive manipulates the execution mode of the calling
+task. A task's execution mode enables and disables preemption,
+timeslicing, asynchronous signal processing, as well as
+specifying the current interrupt level. To modify an execution
+mode, the mode class(es) to be changed must be specified in the
+mask parameter and the desired mode(s) must be specified in the
+mode parameter.
+
+@subheading NOTES:
+The calling task will be preempted if it enables preemption and
+a higher priority task is ready to run.
+
+Enabling timeslicing has no effect if preemption is disabled. For
+a task to be timesliced, that task must have both preemption and
+timeslicing enabled.
+
+A task can obtain its current execution mode, without modifying
+it, by calling this directive with a mask value of
+@code{@value{RPREFIX}CURRENT_MODE}.
+
+To temporarily disable the processing of a valid ASR, a task
+should call this directive with the @code{@value{RPREFIX}NO_ASR}
+indicator specified in mode.
+
+The set of task mode constants and each mode's corresponding
+mask constant is provided in the following table:
+
+@ifset use-ascii
+@itemize @bullet
+@item @code{@value{RPREFIX}PREEMPT} is masked by
+@code{@value{RPREFIX}PREEMPT_MASK} and enables preemption
+
+@item @code{@value{RPREFIX}NO_PREEMPT} is masked by
+@code{@value{RPREFIX}PREEMPT_MASK} and disables preemption
+
+@item @code{@value{RPREFIX}NO_TIMESLICE} is masked by
+@code{@value{RPREFIX}TIMESLICE_MASK} and disables timeslicing
+
+@item @code{@value{RPREFIX}TIMESLICE} is masked by
+@code{@value{RPREFIX}TIMESLICE_MASK} and enables timeslicing
+
+@item @code{@value{RPREFIX}ASR} is masked by
+@code{@value{RPREFIX}ASR_MASK} and enables ASR processing
+
+@item @code{@value{RPREFIX}NO_ASR} is masked by
+@code{@value{RPREFIX}ASR_MASK} and disables ASR processing
+
+@item @code{@value{RPREFIX}INTERRUPT_LEVEL(0)} is masked by
+@code{@value{RPREFIX}INTERRUPT_MASK} and enables all interrupts
+
+@item @code{@value{RPREFIX}INTERRUPT_LEVEL(n)} is masked by
+@code{@value{RPREFIX}INTERRUPT_MASK} and sets interrupts level n
+
+@end itemize
+@end ifset
+
+@ifset use-tex
+@sp 1
+@c this is temporary
+@itemize @bullet
+@item @code{@value{RPREFIX}PREEMPT} is masked by
+@code{@value{RPREFIX}PREEMPT_MASK} and enables preemption
+
+@item @code{@value{RPREFIX}NO_PREEMPT} is masked by
+@code{@value{RPREFIX}PREEMPT_MASK} and disables preemption
+
+@item @code{@value{RPREFIX}NO_TIMESLICE} is masked by
+@code{@value{RPREFIX}TIMESLICE_MASK} and disables timeslicing
+
+@item @code{@value{RPREFIX}TIMESLICE} is masked by
+@code{@value{RPREFIX}TIMESLICE_MASK} and enables timeslicing
+
+@item @code{@value{RPREFIX}ASR} is masked by
+@code{@value{RPREFIX}ASR_MASK} and enables ASR processing
+
+@item @code{@value{RPREFIX}NO_ASR} is masked by
+@code{@value{RPREFIX}ASR_MASK} and disables ASR processing
+
+@item @code{@value{RPREFIX}INTERRUPT_LEVEL(0)} is masked by
+@code{@value{RPREFIX}INTERRUPT_MASK} and enables all interrupts
+
+@item @code{@value{RPREFIX}INTERRUPT_LEVEL(n)} is masked by
+@code{@value{RPREFIX}INTERRUPT_MASK} and sets interrupts level n
+
+@end itemize
+
+@tex
+@end tex
+@end ifset
+
+@ifset use-html
+@html
+<CENTER>
+ <TABLE COLS=3 WIDTH="80%" BORDER=2>
+<TR><TD ALIGN=center><STRONG>Mode Constant</STRONG></TD>
+ <TD ALIGN=center><STRONG>Mask Constant</STRONG></TD>
+ <TD ALIGN=center><STRONG>Description</STRONG></TD></TR>
+<TR><TD ALIGN=center>@value{RPREFIX}PREEMPT</TD>
+ <TD ALIGN=center>@value{RPREFIX}PREEMPT_MASK</TD>
+ <TD ALIGN=center>enables preemption</TD></TR>
+<TR><TD ALIGN=center>@value{RPREFIX}NO_PREEMPT</TD>
+ <TD ALIGN=center>@value{RPREFIX}PREEMPT_MASK</TD>
+ <TD ALIGN=center>disables preemption</TD></TR>
+<TR><TD ALIGN=center>@value{RPREFIX}NO_TIMESLICE</TD>
+ <TD ALIGN=center>@value{RPREFIX}TIMESLICE_MASK</TD>
+ <TD ALIGN=center>disables timeslicing</TD></TR>
+<TR><TD ALIGN=center>@value{RPREFIX}TIMESLICE</TD>
+ <TD ALIGN=center>@value{RPREFIX}TIMESLICE_MASK</TD>
+ <TD ALIGN=center>enables timeslicing</TD></TR>
+<TR><TD ALIGN=center>@value{RPREFIX}ASR</TD>
+ <TD ALIGN=center>@value{RPREFIX}ASR_MASK</TD>
+ <TD ALIGN=center>enables ASR processing</TD></TR>
+<TR><TD ALIGN=center>@value{RPREFIX}NO_ASR</TD>
+ <TD ALIGN=center>@value{RPREFIX}ASR_MASK</TD>
+ <TD ALIGN=center>disables ASR processing</TD></TR>
+<TR><TD ALIGN=center>@value{RPREFIX}INTERRUPT_LEVEL(0)</TD>
+ <TD ALIGN=center>@value{RPREFIX}INTERRUPT_MASK</TD>
+ <TD ALIGN=center>enables all interrupts</TD></TR>
+<TR><TD ALIGN=center>@value{RPREFIX}INTERRUPT_LEVEL(n)</TD>
+ <TD ALIGN=center>@value{RPREFIX}INTERRUPT_MASK</TD>
+ <TD ALIGN=center>sets interrupts level n</TD></TR>
+ </TABLE>
+</CENTER>
+@end html
+@end ifset
+
+@page
+
+@subsection TASK_GET_NOTE - Get task notepad entry
+
+@cindex get task notepad entry
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_task_get_note
+@example
+rtems_status_code rtems_task_get_note(
+ rtems_id id,
+ rtems_unsigned32 notepad,
+ rtems_unsigned32 *note
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Task_Get_Note (
+ ID : in RTEMS.ID;
+ Notepad : in RTEMS.Notepad_Index;
+ Note : out RTEMS.Unsigned32;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - note obtained successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{note} is NULL@*
+@code{@value{RPREFIX}INVALID_ID} - invalid task id@*
+@code{@value{RPREFIX}INVALID_NUMBER} - invalid notepad location
+
+@subheading DESCRIPTION:
+This directive returns the note contained in the notepad
+location of the task specified by id.
+
+@subheading NOTES:
+This directive will not cause the running task to be preempted.
+
+If id is set to @code{@value{RPREFIX}SELF},
+the calling task accesses its own notepad.
+
+@c This version of the paragraph avoids the overfull hbox error.
+@c The constants NOTEPAD_0 through NOTEPAD_15 can be used to access the
+@c sixteen notepad locations.
+
+The sixteen notepad locations can be accessed using the constants
+@code{@value{RPREFIX}NOTEPAD_0} through @code{@value{RPREFIX}NOTEPAD_15}.
+
+Getting a note of a global task which does not reside on the
+local node will generate a request to the remote node to obtain
+the notepad entry of the specified task.
+
+@page
+
+@subsection TASK_SET_NOTE - Set task notepad entry
+
+@cindex set task notepad entry
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_task_set_note
+@example
+rtems_status_code rtems_task_set_note(
+ rtems_id id,
+ rtems_unsigned32 notepad,
+ rtems_unsigned32 note
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Task_Set_Note (
+ ID : in RTEMS.ID;
+ Notepad : in RTEMS.Notepad_Index;
+ Note : in RTEMS.Unsigned32;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - task's note set successfully@*
+@code{@value{RPREFIX}INVALID_ID} - invalid task id@*
+@code{@value{RPREFIX}INVALID_NUMBER} - invalid notepad location
+
+@subheading DESCRIPTION:
+This directive sets the notepad entry for the task specified by
+id to the value note.
+
+@subheading NOTES:
+If id is set to @code{@value{RPREFIX}SELF}, the calling
+task accesses its own notepad locations.
+
+This directive will not cause the running task to be preempted.
+
+@c This version of the paragraph avoids the overfull hbox error.
+@c The constants NOTEPAD_0 through NOTEPAD_15 can be used to access the
+@c sixteen notepad locations.
+
+The sixteen notepad locations can be accessed using the constants
+@code{@value{RPREFIX}NOTEPAD_0} through @code{@value{RPREFIX}NOTEPAD_15}.
+
+Setting a notepad location of a global task which does not
+reside on the local node will generate a request to the remote
+node to set the specified notepad entry.
+
+@page
+
+@subsection TASK_WAKE_AFTER - Wake up after interval
+
+@cindex delay a task for an interval
+@cindex wake up after an interval
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_task_wake_after
+@example
+rtems_status_code rtems_task_wake_after(
+ rtems_interval ticks
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Task_Wake_After (
+ Ticks : in RTEMS.Interval;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - always successful
+
+@subheading DESCRIPTION:
+This directive blocks the calling task for the specified number
+of system clock ticks. When the requested interval has elapsed,
+the task is made ready. The @code{@value{DIRPREFIX}clock_tick}
+directive automatically updates the delay period.
+
+@subheading NOTES:
+Setting the system date and time with the
+@code{@value{DIRPREFIX}clock_set} directive
+has no effect on a @code{@value{DIRPREFIX}task_wake_after} blocked task.
+
+A task may give up the processor and remain in the ready state
+by specifying a value of @code{@value{RPREFIX}YIELD_PROCESSOR} in ticks.
+
+The maximum timer interval that can be specified is the maximum
+value which can be represented by the rtems_unsigned32 type.
+
+A clock tick is required to support the functionality of this directive.
+
+@page
+
+@subsection TASK_WAKE_WHEN - Wake up when specified
+
+@cindex delay a task until a wall time
+@cindex wake up at a wall time
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_task_wake_when
+@example
+rtems_status_code rtems_task_wake_when(
+ rtems_time_of_day *time_buffer
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Task_Wake_When (
+ Time_Buffer : in RTEMS.Time_Of_Day;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - awakened at date/time successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{time_buffer} is NULL@*
+@code{@value{RPREFIX}INVALID_TIME_OF_DAY} - invalid time buffer@*
+@code{@value{RPREFIX}NOT_DEFINED} - system date and time is not set
+
+@subheading DESCRIPTION:
+This directive blocks a task until the date and time specified
+in time_buffer. At the requested date and time, the calling
+task will be unblocked and made ready to execute.
+
+@subheading NOTES:
+The ticks portion of time_buffer @value{STRUCTURE} is ignored. The
+timing granularity of this directive is a second.
+
+A clock tick is required to support the functionality of this directive.
+
+@page
+
+@subsection TASK_VARIABLE_ADD - Associate per task variable
+
+@cindex per-task variable
+@cindex task private variable
+@cindex task private data
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_task_variable_add
+@example
+rtems_status_code rtems_task_variable_add(
+ rtems_id tid,
+ void **task_variable,
+ void (*dtor)(void *)
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+type Task_Variable_Dtor is access procedure (
+ Argument : in RTEMS.Address;
+);
+
+procedure Task_Variable_Add (
+ ID : in RTEMS.ID;
+ Task_Variable : in RTEMS.Address;
+ Dtor : in RTEMS.Task_Variable_Dtor;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - per task variable added successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{task_variable} is NULL@*
+@code{@value{RPREFIX}INVALID_ID} - invalid task id@*
+@code{@value{RPREFIX}NO_MEMORY} - invalid task id@*
+@code{@value{RPREFIX}ILLEGAL_ON_REMOTE_OBJECT} - not supported on remote tasks@*
+
+@subheading DESCRIPTION:
+This directive adds the memory location specified by the
+ptr argument to the context of the given task. The variable will
+then be private to the task. The task can access and modify the
+variable, but the modifications will not appear to other tasks, and
+other tasks' modifications to that variable will not affect the value
+seen by the task. This is accomplished by saving and restoring the
+variable's value each time a task switch occurs to or from the calling task.
+If the dtor argument is non-NULL it specifies the address of a `destructor'
+function which will be called when the task is deleted. The argument
+passed to the destructor function is the task's value of the variable.
+
+@subheading NOTES:
+
+Task variables increase the context switch time to and from the
+tasks that own them so it is desirable to minimize the number of
+task variables. One efficient method
+is to have a single task variable that is a pointer to a dynamically
+allocated structure containing the task's private `global' data.
+In this case the destructor function could be `free'.
+
+@page
+
+@subsection TASK_VARIABLE_GET - Obtain value of a per task variable
+
+@cindex get per-task variable
+@cindex obtain per-task variable
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_task_variable_get
+@example
+rtems_status_code rtems_task_variable_get(
+ rtems_id tid,
+ void **task_variable,
+ void **task_variable_value
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Task_Variable_Get (
+ ID : in RTEMS.ID;
+ Task_Variable : out RTEMS.Address;
+ Task_Variable_Value : out RTEMS.Address;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - per task variable added successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{task_variable} is NULL@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{task_variable_value} is NULL@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{task_variable} is not found@*
+@code{@value{RPREFIX}NO_MEMORY} - invalid task id@*
+@code{@value{RPREFIX}ILLEGAL_ON_REMOTE_OBJECT} - not supported on remote tasks@*
+
+@subheading DESCRIPTION:
+This directive looks up the private value of a task variable for a
+specified task and stores that value in the location pointed to by
+the result argument. The specified task is usually not the calling
+task, which can get its private value by directly accessing the variable.
+
+@subheading NOTES:
+
+If you change memory which @code{task_variable_value} points to,
+remember to declare that memory as volatile, so that the compiler
+will optimize it correctly. In this case both the pointer
+@code{task_variable_value} and data referenced by @code{task_variable_value}
+should be considered volatile.
+
+@page
+
+@subsection TASK_VARIABLE_DELETE - Remove per task variable
+
+@cindex per-task variable
+@cindex task private variable
+@cindex task private data
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_task_variable_delete
+@example
+rtems_status_code rtems_task_variable_delete(
+ rtems_id tid,
+ void **task_variable
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Task_Variable_Delete (
+ ID : in RTEMS.ID;
+ Task_Variable : out RTEMS.Address;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - per task variable added successfully@*
+@code{@value{RPREFIX}INVALID_ID} - invalid task id@*
+@code{@value{RPREFIX}NO_MEMORY} - invalid task id@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{task_variable} is NULL@*
+@code{@value{RPREFIX}ILLEGAL_ON_REMOTE_OBJECT} - not supported on remote tasks@*
+
+@subheading DESCRIPTION:
+This directive removes the given location from a task's context.
+
+@subheading NOTES:
+
+NONE
diff --git a/doc/user/timer.t b/doc/user/timer.t
new file mode 100644
index 0000000000..421fc4f032
--- /dev/null
+++ b/doc/user/timer.t
@@ -0,0 +1,729 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Timer Manager
+
+@cindex timers
+
+@section Introduction
+
+The timer manager provides support for timer
+facilities. The directives provided by the timer manager are:
+
+@itemize @bullet
+@item @code{@value{DIRPREFIX}timer_create} - Create a timer
+@item @code{@value{DIRPREFIX}timer_ident} - Get ID of a timer
+@item @code{@value{DIRPREFIX}timer_cancel} - Cancel a timer
+@item @code{@value{DIRPREFIX}timer_delete} - Delete a timer
+@item @code{@value{DIRPREFIX}timer_fire_after} - Fire timer after interval
+@item @code{@value{DIRPREFIX}timer_fire_when} - Fire timer when specified
+@item @code{@value{DIRPREFIX}timer_initiate_server} - Initiate server for task-based timers
+@item @code{@value{DIRPREFIX}timer_server_fire_after} - Fire task-based timer after interval
+@item @code{@value{DIRPREFIX}timer_server_fire_when} - Fire task-based timer when specified
+@item @code{@value{DIRPREFIX}timer_reset} - Reset an interval timer
+@end itemize
+
+
+@section Background
+
+@subsection Required Support
+
+A clock tick is required to support the functionality provided by this manager.
+
+@subsection Timers
+
+A timer is an RTEMS object which allows the
+application to schedule operations to occur at specific times in
+the future. User supplied timer service routines are invoked by
+either the @code{@value{DIRPREFIX}clock_tick} directive or
+a special Timer Server task when the timer fires. Timer service
+routines may perform any operations or directives which normally
+would be performed by the application code which invoked the
+@code{@value{DIRPREFIX}clock_tick} directive.
+
+The timer can be used to implement watchdog routines
+which only fire to denote that an application error has
+occurred. The timer is reset at specific points in the
+application to insure that the watchdog does not fire. Thus, if
+the application does not reset the watchdog timer, then the
+timer service routine will fire to indicate that the application
+has failed to reach a reset point. This use of a timer is
+sometimes referred to as a "keep alive" or a "deadman" timer.
+
+@subsection Timer Server
+
+The Timer Server task is responsible for executing the timer
+service routines associated with all task-based timers.
+This task executes at a priority higher than any RTEMS application
+task and thus can be viewed logically as the lowest priority interrupt.
+
+By providing a mechanism where timer service routines execute
+in task rather than interrupt space, the application is
+allowed a bit more flexibility in what operations a timer
+service routine can perform. For example, the Timer Server
+can be configured to have a floating point context in which case
+it would be save to perform floating point operations
+from a task-based timer. Most of the time, executing floating
+point instructions from an interrupt service routine
+is not considered safe.
+
+The Timer Server is designed to remain blocked until a
+task-based timer fires. This reduces the execution overhead
+of the Timer Server.
+
+@subsection Timer Service Routines
+
+The timer service routine should adhere to @value{LANGUAGE} calling
+conventions and have a prototype similar to the following:
+
+@ifset is-C
+@findex rtems_timer_service_routine
+@example
+rtems_timer_service_routine user_routine(
+ rtems_id timer_id,
+ void *user_data
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure User_Routine(
+ Timer_ID : in RTEMS.ID;
+ User_Data : in System.Address
+);
+@end example
+@end ifset
+
+Where the timer_id parameter is the RTEMS object ID
+of the timer which is being fired and user_data is a pointer to
+user-defined information which may be utilized by the timer
+service routine. The argument user_data may be NULL.
+
+@section Operations
+
+@subsection Creating a Timer
+
+The @code{@value{DIRPREFIX}timer_create} directive creates a timer by
+allocating a Timer Control Block (TMCB), assigning the timer a
+user-specified name, and assigning it a timer ID. Newly created
+timers do not have a timer service routine associated with them
+and are not active.
+
+@subsection Obtaining Timer IDs
+
+When a timer is created, RTEMS generates a unique
+timer ID and assigns it to the created timer until it is
+deleted. The timer ID may be obtained by either of two methods.
+First, as the result of an invocation of the
+@code{@value{DIRPREFIX}timer_create}
+directive, the timer ID is stored in a user provided location.
+Second, the timer ID may be obtained later using the
+@code{@value{DIRPREFIX}timer_ident} directive. The timer ID
+is used by other directives to manipulate this timer.
+
+@subsection Initiating an Interval Timer
+
+The @code{@value{DIRPREFIX}timer_fire_after}
+and @code{@value{DIRPREFIX}timer_server_fire_after}
+directives initiate a timer to fire a user provided
+timer service routine after the specified
+number of clock ticks have elapsed. When the interval has
+elapsed, the timer service routine will be invoked from the
+@code{@value{DIRPREFIX}clock_tick} directive if it was initiated
+by the @code{@value{DIRPREFIX}timer_fire_after} directive
+and from the Timer Server task if initiated by the
+@code{@value{DIRPREFIX}timer_server_fire_after} directive.
+
+@subsection Initiating a Time of Day Timer
+
+The @code{@value{DIRPREFIX}timer_fire_when}
+and @code{@value{DIRPREFIX}timer_server_fire_when}
+directive initiate a timer to
+fire a user provided timer service routine when the specified
+time of day has been reached. When the interval has elapsed,
+the timer service routine will be invoked from the
+@code{@value{DIRPREFIX}clock_tick} directive
+by the @code{@value{DIRPREFIX}timer_fire_when} directive
+and from the Timer Server task if initiated by the
+@code{@value{DIRPREFIX}timer_server_fire_when} directive.
+
+@subsection Canceling a Timer
+
+The @code{@value{DIRPREFIX}timer_cancel} directive is used to halt the
+specified timer. Once canceled, the timer service routine will
+not fire unless the timer is reinitiated. The timer can be
+reinitiated using the @code{@value{DIRPREFIX}timer_reset},
+@code{@value{DIRPREFIX}timer_fire_after}, and
+@code{@value{DIRPREFIX}timer_fire_when} directives.
+
+@subsection Resetting a Timer
+
+The @code{@value{DIRPREFIX}timer_reset} directive is used to restore an
+interval timer initiated by a previous invocation of
+@code{@value{DIRPREFIX}timer_fire_after} or
+@code{@value{DIRPREFIX}timer_server_fire_after} to
+its original interval length. If the
+timer has not been used or the last usage of this timer
+was by the @code{@value{DIRPREFIX}timer_fire_when}
+or @code{@value{DIRPREFIX}timer_server_fire_when}
+directive, then an error is returned. The timer service routine
+is not changed or fired by this directive.
+
+@subsection Initiating the Timer Server
+
+The @code{@value{DIRPREFIX}timer_initiate_server} directive is used to
+allocate and start the execution of the Timer Server task. The
+application can specify both the stack size and attributes of the
+Timer Server. The Timer Server executes at a priority higher than
+any application task and thus the user can expect to be preempted
+as the result of executing the @code{@value{DIRPREFIX}timer_initiate_server}
+directive.
+
+@subsection Deleting a Timer
+
+The @code{@value{DIRPREFIX}timer_delete} directive is used to delete a timer.
+If the timer is running and has not expired, the timer is
+automatically canceled. The timer's control block is returned
+to the TMCB free list when it is deleted. A timer can be
+deleted by a task other than the task which created the timer.
+Any subsequent references to the timer's name and ID are invalid.
+
+@section Directives
+
+This section details the timer manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@c
+@c
+@c
+@page
+@subsection TIMER_CREATE - Create a timer
+
+@cindex create a timer
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_timer_create
+@example
+rtems_status_code rtems_timer_create(
+ rtems_name name,
+ rtems_id *id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Timer_Create (
+ Name : in RTEMS.Name;
+ ID : out RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - timer created successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{id} is NULL@*
+@code{@value{RPREFIX}INVALID_NAME} - invalid timer name@*
+@code{@value{RPREFIX}TOO_MANY} - too many timers created
+
+@subheading DESCRIPTION:
+
+This directive creates a timer. The assigned timer
+id is returned in id. This id is used to access the timer with
+other timer manager directives. For control and maintenance of
+the timer, RTEMS allocates a TMCB from the local TMCB free pool
+and initializes it.
+
+@subheading NOTES:
+
+This directive will not cause the calling task to be
+preempted.
+
+@c
+@c
+@c
+@page
+@subsection TIMER_IDENT - Get ID of a timer
+
+@cindex obtain the ID of a timer
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_timer_ident
+@example
+rtems_status_code rtems_timer_ident(
+ rtems_name name,
+ rtems_id *id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Timer_Ident (
+ Name : in RTEMS.Name;
+ ID : out RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - timer identified successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{id} is NULL@*
+@code{@value{RPREFIX}INVALID_NAME} - timer name not found
+
+@subheading DESCRIPTION:
+
+This directive obtains the timer id associated with
+the timer name to be acquired. If the timer name is not unique,
+then the timer id will match one of the timers with that name.
+However, this timer id is not guaranteed to correspond to the
+desired timer. The timer id is used to access this timer in
+other timer related directives.
+
+@subheading NOTES:
+
+This directive will not cause the running task to be
+preempted.
+
+@c
+@c
+@c
+@page
+@subsection TIMER_CANCEL - Cancel a timer
+
+@cindex cancel a timer
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_timer_cancel
+@example
+rtems_status_code rtems_timer_cancel(
+ rtems_id id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Timer_Cancel (
+ ID : in RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - timer canceled successfully@*
+@code{@value{RPREFIX}INVALID_ID} - invalid timer id
+
+@subheading DESCRIPTION:
+
+This directive cancels the timer id. This timer will
+be reinitiated by the next invocation of @code{@value{DIRPREFIX}timer_reset},
+@code{@value{DIRPREFIX}timer_fire_after}, or
+@code{@value{DIRPREFIX}timer_fire_when} with this id.
+
+@subheading NOTES:
+
+This directive will not cause the running task to be preempted.
+
+@c
+@c
+@c
+@page
+@subsection TIMER_DELETE - Delete a timer
+
+@cindex delete a timer
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_timer_delete
+@example
+rtems_status_code rtems_timer_delete(
+ rtems_id id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Timer_Delete (
+ ID : in RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - timer deleted successfully@*
+@code{@value{RPREFIX}INVALID_ID} - invalid timer id
+
+@subheading DESCRIPTION:
+
+This directive deletes the timer specified by id. If
+the timer is running, it is automatically canceled. The TMCB
+for the deleted timer is reclaimed by RTEMS.
+
+@subheading NOTES:
+
+This directive will not cause the running task to be
+preempted.
+
+A timer can be deleted by a task other than the task
+which created the timer.
+
+@c
+@c
+@c
+@page
+@subsection TIMER_FIRE_AFTER - Fire timer after interval
+
+@cindex fire a timer after an interval
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_timer_fire_after
+@example
+rtems_status_code rtems_timer_fire_after(
+ rtems_id id,
+ rtems_interval ticks,
+ rtems_timer_service_routine_entry routine,
+ void *user_data
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Timer_Fire_After (
+ ID : in RTEMS.ID;
+ Ticks : in RTEMS.Interval;
+ Routine : in RTEMS.Timer_Service_Routine;
+ User_Data : in RTEMS.Address;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - timer initiated successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{routine} is NULL@*
+@code{@value{RPREFIX}INVALID_ID} - invalid timer id@*
+@code{@value{RPREFIX}INVALID_NUMBER} - invalid interval
+
+@subheading DESCRIPTION:
+
+This directive initiates the timer specified by id.
+If the timer is running, it is automatically canceled before
+being initiated. The timer is scheduled to fire after an
+interval ticks clock ticks has passed. When the timer fires,
+the timer service routine routine will be invoked with the
+argument user_data.
+
+@subheading NOTES:
+
+This directive will not cause the running task to be
+preempted.
+
+@c
+@c
+@c
+@page
+@subsection TIMER_FIRE_WHEN - Fire timer when specified
+
+@cindex fire a timer at wall time
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_timer_fire_when
+@example
+rtems_status_code rtems_timer_fire_when(
+ rtems_id id,
+ rtems_time_of_day *wall_time,
+ rtems_timer_service_routine_entry routine,
+ void *user_data
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Timer_Fire_When (
+ ID : in RTEMS.ID;
+ Wall_Time : in RTEMS.Time_Of_Day;
+ Routine : in RTEMS.Timer_Service_Routine;
+ User_Data : in RTEMS.Address;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - timer initiated successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{routine} is NULL@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{wall_time} is NULL@*
+@code{@value{RPREFIX}INVALID_ID} - invalid timer id@*
+@code{@value{RPREFIX}NOT_DEFINED} - system date and time is not set@*
+@code{@value{RPREFIX}INVALID_CLOCK} - invalid time of day
+
+@subheading DESCRIPTION:
+
+This directive initiates the timer specified by id.
+If the timer is running, it is automatically canceled before
+being initiated. The timer is scheduled to fire at the time of
+day specified by wall_time. When the timer fires, the timer
+service routine routine will be invoked with the argument
+user_data.
+
+@subheading NOTES:
+
+This directive will not cause the running task to be
+preempted.
+
+@c
+@c
+@c
+@page
+@subsection TIMER_INITIATE_SERVER - Initiate server for task-based timers
+
+@cindex initiate the Timer Server
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_timer_initiate_server
+@example
+rtems_status_code rtems_timer_initiate_server(
+ unsigned32 stack_size,
+ rtems_attribute attribute_set
+)
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Timer_Initiate_Server (
+ Stack_Size : in RTEMS.Unsigned32;
+ Attribute_Set : in RTEMS.Attribute;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - Timer Server initiated successfully@*
+@code{@value{RPREFIX}TOO_MANY} - too many tasks created
+
+@subheading DESCRIPTION:
+
+This directive initiates the Timer Server task. This task
+is responsible for executing all timers initiated via the
+@code{@value{DIRPREFIX}timer_server_fire_after} or
+@code{@value{DIRPREFIX}timer_server_fire_when} directives.
+
+@subheading NOTES:
+
+This directive could cause the calling task to be preempted.
+
+The Timer Server task is created using the
+@code{@value{DIRPREFIX}task_create} service and must be accounted
+for when configuring the system.
+
+Even through this directive invokes the @code{@value{DIRPREFIX}task_create}
+and @code{@value{DIRPREFIX}task_start} directives, it should only fail
+due to resource allocation problems.
+
+@c
+@c
+@c
+@page
+@subsection TIMER_SERVER_FIRE_AFTER - Fire task-based timer after interval
+
+@cindex fire task-based a timer after an interval
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_timer_server_fire_after
+@example
+rtems_status_code rtems_timer_server_fire_after(
+ rtems_id id,
+ rtems_interval ticks,
+ rtems_timer_service_routine_entry routine,
+ void *user_data
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Timer_Fire_Server_After (
+ ID : in RTEMS.ID;
+ Ticks : in RTEMS.Interval;
+ Routine : in RTEMS.Timer_Service_Routine;
+ User_Data : in RTEMS.Address;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - timer initiated successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{routine} is NULL@*
+@code{@value{RPREFIX}INVALID_ID} - invalid timer id@*
+@code{@value{RPREFIX}INVALID_NUMBER} - invalid interval@*
+@code{@value{RPREFIX}INCORRECT_STATE} - Timer Server not initiated
+
+@subheading DESCRIPTION:
+
+This directive initiates the timer specified by id and specifies
+that when it fires it will be executed by the Timer Server.
+
+If the timer is running, it is automatically canceled before
+being initiated. The timer is scheduled to fire after an
+interval ticks clock ticks has passed. When the timer fires,
+the timer service routine routine will be invoked with the
+argument user_data.
+
+@subheading NOTES:
+
+This directive will not cause the running task to be
+preempted.
+
+@c
+@c
+@c
+@page
+@subsection TIMER_SERVER_FIRE_WHEN - Fire task-based timer when specified
+
+@cindex fire a task-based timer at wall time
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_timer_server_fire_when
+@example
+rtems_status_code rtems_timer_server_fire_when(
+ rtems_id id,
+ rtems_time_of_day *wall_time,
+ rtems_timer_service_routine_entry routine,
+ void *user_data
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Timer_Fire_Server_When (
+ ID : in RTEMS.ID;
+ Wall_Time : in RTEMS.Time_Of_Day;
+ Routine : in RTEMS.Timer_Service_Routine;
+ User_Data : in RTEMS.Address;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - timer initiated successfully@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{routine} is NULL@*
+@code{@value{RPREFIX}INVALID_ADDRESS} - @code{wall_time} is NULL@*
+@code{@value{RPREFIX}INVALID_ID} - invalid timer id@*
+@code{@value{RPREFIX}NOT_DEFINED} - system date and time is not set@*
+@code{@value{RPREFIX}INVALID_CLOCK} - invalid time of day@*
+@code{@value{RPREFIX}INCORRECT_STATE} - Timer Server not initiated
+
+@subheading DESCRIPTION:
+
+This directive initiates the timer specified by id and specifies
+that when it fires it will be executed by the Timer Server.
+
+If the timer is running, it is automatically canceled before
+being initiated. The timer is scheduled to fire at the time of
+day specified by wall_time. When the timer fires, the timer
+service routine routine will be invoked with the argument
+user_data.
+
+@subheading NOTES:
+
+This directive will not cause the running task to be
+preempted.
+
+@c
+@c
+@c
+@page
+@subsection TIMER_RESET - Reset an interval timer
+
+@cindex reset a timer
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_timer_reset
+@example
+rtems_status_code rtems_timer_reset(
+ rtems_id id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Timer_Reset (
+ ID : in RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - timer reset successfully@*
+@code{@value{RPREFIX}INVALID_ID} - invalid timer id@*
+@code{@value{RPREFIX}NOT_DEFINED} - attempted to reset a when or newly created timer
+
+@subheading DESCRIPTION:
+
+This directive resets the timer associated with id.
+This timer must have been previously initiated with either the
+@code{@value{DIRPREFIX}timer_fire_after} or
+@code{@value{DIRPREFIX}timer_server_fire_after}
+directive. If active the timer is canceled,
+after which the timer is reinitiated using the same interval and
+timer service routine which the original
+@code{@value{DIRPREFIX}timer_fire_after}
+@code{@value{DIRPREFIX}timer_server_fire_after}
+directive used.
+
+@subheading NOTES:
+
+If the timer has not been used or the last usage of this timer
+was by a @code{@value{DIRPREFIX}timer_fire_when} or
+@code{@value{DIRPREFIX}timer_server_fire_when}
+directive, then the @code{@value{RPREFIX}NOT_DEFINED} error is
+returned.
+
+Restarting a cancelled after timer results in the timer being
+reinitiated with its previous timer service routine and interval.
+
+This directive will not cause the running task to be preempted.
+
diff --git a/doc/user/userext.t b/doc/user/userext.t
new file mode 100644
index 0000000000..1d6308d1b1
--- /dev/null
+++ b/doc/user/userext.t
@@ -0,0 +1,727 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter User Extensions Manager
+
+@cindex user extensions
+
+@section Introduction
+
+The RTEMS User Extensions Manager allows the
+application developer to augment the executive by allowing them
+to supply extension routines which are invoked at critical
+system events. The directives provided by the user extensions
+manager are:
+
+@itemize @bullet
+@item @code{@value{DIRPREFIX}extension_create} - Create an extension set
+@item @code{@value{DIRPREFIX}extension_ident} - Get ID of an extension set
+@item @code{@value{DIRPREFIX}extension_delete} - Delete an extension set
+@end itemize
+
+@section Background
+
+User extension routines are invoked when the
+following system events occur:
+
+@itemize @bullet
+@item Task creation
+@item Task initiation
+@item Task reinitiation
+@item Task deletion
+@item Task context switch
+@item Post task context switch
+@item Task begin
+@item Task exits
+@item Fatal error detection
+@end itemize
+
+These extensions are invoked as a function with
+arguments that are appropriate to the system event.
+
+@subsection Extension Sets
+
+@cindex extension set
+
+An extension set is defined as a set of routines
+which are invoked at each of the critical system events at which
+user extension routines are invoked. Together a set of these
+routines typically perform a specific functionality such as
+performance monitoring or debugger support. RTEMS is informed of
+the entry points which constitute an extension set via the
+following @value{STRUCTURE}:
+
+@findex rtems_extensions_table
+@ifset is-C
+@example
+@group
+typedef struct @{
+ rtems_task_create_extension thread_create;
+ rtems_task_start_extension thread_start;
+ rtems_task_restart_extension thread_restart;
+ rtems_task_delete_extension thread_delete;
+ rtems_task_switch_extension thread_switch;
+ rtems_task_begin_extension thread_begin;
+ rtems_task_exitted_extension thread_exitted;
+ rtems_fatal_extension fatal;
+@} rtems_extensions_table;
+@end group
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+type Extensions_Table is
+ record
+ Task_Create : RTEMS.Task_Create_Extension;
+ Task_Start : RTEMS.Task_Start_Extension;
+ Task_Restart : RTEMS.Task_Restart_Extension;
+ Task_Delete : RTEMS.Task_Delete_Extension;
+ Task_Switch : RTEMS.Task_Switch_Extension;
+ Task_Post_Switch : RTEMS.Task_Post_Switch_Extension;
+ Task_Begin : RTEMS.Task_Begin_Extension;
+ Task_Exitted : RTEMS.Task_Exitted_Extension;
+ Fatal : RTEMS.Fatal_Error_Extension;
+ end record;
+@end example
+@end ifset
+
+
+RTEMS allows the user to have multiple extension sets
+active at the same time. First, a single static extension set
+may be defined as the application's User Extension Table which
+is included as part of the Configuration Table. This extension
+set is active for the entire life of the system and may not be
+deleted. This extension set is especially important because it
+is the only way the application can provided a FATAL error
+extension which is invoked if RTEMS fails during the
+initialize_executive directive. The static extension set is
+optional and may be configured as NULL if no static extension
+set is required.
+
+Second, the user can install dynamic extensions using
+the @code{@value{DIRPREFIX}extension_create}
+directive. These extensions are RTEMS
+objects in that they have a name, an ID, and can be dynamically
+created and deleted. In contrast to the static extension set,
+these extensions can only be created and installed after the
+initialize_executive directive successfully completes execution.
+Dynamic extensions are useful for encapsulating the
+functionality of an extension set. For example, the application
+could use extensions to manage a special coprocessor, do
+performance monitoring, and to do stack bounds checking. Each
+of these extension sets could be written and installed
+independently of the others.
+
+All user extensions are optional and RTEMS places no
+naming restrictions on the user. The user extension entry points
+are copied into an internal RTEMS structure. This means the user
+does not need to keep the table after creating it, and changing the
+handler entry points dynamically in a table once created has no
+effect. Creating a table local to a function can save space in
+space limited applications.
+
+Extension switches do not effect the context switch overhead if
+no switch handler is installed.
+
+@subsection TCB Extension Area
+
+@cindex TCB extension area
+
+RTEMS provides for a pointer to a user-defined data
+area for each extension set to be linked to each task's control
+block. This set of pointers is an extension of the TCB and can
+be used to store additional data required by the user's
+extension functions. It is also possible for a user extension
+to utilize the notepad locations associated with each task
+although this may conflict with application usage of those
+particular notepads.
+
+The TCB extension is an array of pointers in the TCB. The
+index into the table can be obtained from the extension id
+returned when the extension is created:
+
+@findex rtems extensions table index
+@ifset is-C
+@example
+@group
+index = rtems_get_index(extension_id);
+@end group
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+There is currently no example for Ada.
+@end example
+@end ifset
+
+The number of pointers in the area is the same as the number of
+user extension sets configured. This allows an application to
+augment the TCB with user-defined information. For example, an
+application could implement task profiling by storing timing
+statistics in the TCB's extended memory area. When a task
+context switch is being executed, the TASK_SWITCH extension
+could read a real-time clock to calculate how long the task
+being swapped out has run as well as timestamp the starting time
+for the task being swapped in.
+
+If used, the extended memory area for the TCB should
+be allocated and the TCB extension pointer should be set at the
+time the task is created or started by either the TASK_CREATE or
+TASK_START extension. The application is responsible for
+managing this extended memory area for the TCBs. The memory may
+be reinitialized by the TASK_RESTART extension and should be
+deallocated by the TASK_DELETE extension when the task is
+deleted. Since the TCB extension buffers would most likely be
+of a fixed size, the RTEMS partition manager could be used to
+manage the application's extended memory area. The application
+could create a partition of fixed size TCB extension buffers and
+use the partition manager's allocation and deallocation
+directives to obtain and release the extension buffers.
+
+@subsection Extensions
+
+The sections that follow will contain a description
+of each extension. Each section will contain a prototype of a
+function with the appropriate calling sequence for the
+corresponding extension. The names given for the @value{LANGUAGE}
+@value{ROUTINE} and
+its arguments are all defined by the user. The names used in
+the examples were arbitrarily chosen and impose no naming
+conventions on the user.
+
+@subsubsection TASK_CREATE Extension
+
+The TASK_CREATE extension directly corresponds to the
+@code{@value{DIRPREFIX}task_create} directive. If this extension
+is defined in any
+static or dynamic extension set and a task is being created,
+then the extension routine will automatically be invoked by
+RTEMS. The extension should have a prototype similar to the
+following:
+
+@findex rtems_task_create_extension
+@findex rtems_extension
+@ifset is-C
+@example
+boolean user_task_create(
+ rtems_tcb *current_task,
+ rtems_tcb *new_task
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+function User_Task_Create (
+ Current_Task : in RTEMS.TCB_Pointer;
+ New_Task : in RTEMS.TCB_Pointer
+) returns Boolean;
+@end example
+@end ifset
+
+where @code{current_task} can be used to access the TCB for
+the currently executing task, and new_task can be used to access
+the TCB for the new task being created. This extension is
+invoked from the @code{@value{DIRPREFIX}task_create}
+directive after @code{new_task} has been
+completely initialized, but before it is placed on a ready TCB
+chain.
+
+The user extension is expected to return the boolean
+value @code{TRUE} if it successfully executed and
+@code{FALSE} otherwise. A task create user extension
+will frequently attempt to allocate resources. If this
+allocation fails, then the extension should return
+@code{FALSE} and the entire task create operation
+will fail.
+
+@subsubsection TASK_START Extension
+
+The TASK_START extension directly corresponds to the
+task_start directive. If this extension is defined in any
+static or dynamic extension set and a task is being started,
+then the extension routine will automatically be invoked by
+RTEMS. The extension should have a prototype similar to the
+following:
+
+@findex rtems_task_start_extension
+@ifset is-C
+@example
+rtems_extension user_task_start(
+ rtems_tcb *current_task,
+ rtems_tcb *started_task
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure User_Task_Start (
+ Current_Task : in RTEMS.TCB_Pointer;
+ Started_Task : in RTEMS.TCB_Pointer
+);
+@end example
+@end ifset
+
+where current_task can be used to access the TCB for
+the currently executing task, and started_task can be used to
+access the TCB for the dormant task being started. This
+extension is invoked from the task_start directive after
+started_task has been made ready to start execution, but before
+it is placed on a ready TCB chain.
+
+@subsubsection TASK_RESTART Extension
+
+The TASK_RESTART extension directly corresponds to
+the task_restart directive. If this extension is defined in any
+static or dynamic extension set and a task is being restarted,
+then the extension should have a prototype similar to the
+following:
+
+@findex rtems_task_restart_extension
+@ifset is-C
+@example
+rtems_extension user_task_restart(
+ rtems_tcb *current_task,
+ rtems_tcb *restarted_task
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure User_Task_Restart (
+ Current_Task : in RTEMS.TCB_Pointer;
+ Restarted_Task : in RTEMS.TCB_Pointer
+);
+@end example
+@end ifset
+
+where current_task can be used to access the TCB for
+the currently executing task, and restarted_task can be used to
+access the TCB for the task being restarted. This extension is
+invoked from the task_restart directive after restarted_task has
+been made ready to start execution, but before it is placed on a
+ready TCB chain.
+
+@subsubsection TASK_DELETE Extension
+
+The TASK_DELETE extension is associated with the
+task_delete directive. If this extension is defined in any
+static or dynamic extension set and a task is being deleted,
+then the extension routine will automatically be invoked by
+RTEMS. The extension should have a prototype similar to the
+following:
+
+@findex rtems_task_delete_extension
+@ifset is-C
+@example
+rtems_extension user_task_delete(
+ rtems_tcb *current_task,
+ rtems_tcb *deleted_task
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure User_Task_Delete (
+ Current_Task : in RTEMS.TCB_Pointer;
+ Deleted_Task : in RTEMS.TCB_Pointer
+);
+@end example
+@end ifset
+
+where current_task can be used to access the TCB for
+the currently executing task, and deleted_task can be used to
+access the TCB for the task being deleted. This extension is
+invoked from the task_delete directive after the TCB has been
+removed from a ready TCB chain, but before all its resources
+including the TCB have been returned to their respective free
+pools. This extension should not call any RTEMS directives if a
+task is deleting itself (current_task is equal to deleted_task).
+
+@subsubsection TASK_SWITCH Extension
+
+The TASK_SWITCH extension corresponds to a task
+context switch. If this extension is defined in any static or
+dynamic extension set and a task context switch is in progress,
+then the extension routine will automatically be invoked by
+RTEMS. The extension should have a prototype similar to the
+following:
+
+@findex rtems_task_switch_extension
+@ifset is-C
+@example
+rtems_extension user_task_switch(
+ rtems_tcb *current_task,
+ rtems_tcb *heir_task
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure User_Task_Switch (
+ Current_Task : in RTEMS.TCB_Pointer;
+ Heir_Task : in RTEMS.TCB_Pointer
+);
+@end example
+@end ifset
+
+where current_task can be used to access the TCB for
+the task that is being swapped out, and heir_task can be used to
+access the TCB for the task being swapped in. This extension is
+invoked from RTEMS' dispatcher routine after the current_task
+context has been saved, but before the heir_task context has
+been restored. This extension should not call any RTEMS
+directives.
+
+@subsubsection TASK_BEGIN Extension
+
+The TASK_BEGIN extension is invoked when a task
+begins execution. It is invoked immediately before the body of
+the starting procedure and executes in the context in the task.
+This user extension have a prototype similar to the following:
+
+@findex rtems_task_begin_extension
+@ifset is-C
+@example
+rtems_extension user_task_begin(
+ rtems_tcb *current_task
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure User_Task_Begin (
+ Current_Task : in RTEMS.TCB_Pointer
+);
+@end example
+@end ifset
+
+where current_task can be used to access the TCB for
+the currently executing task which has begun. The distinction
+between the TASK_BEGIN and TASK_START extension is that the
+TASK_BEGIN extension is executed in the context of the actual
+task while the TASK_START extension is executed in the context
+of the task performing the task_start directive. For most
+extensions, this is not a critical distinction.
+
+@subsubsection TASK_EXITTED Extension
+
+The TASK_EXITTED extension is invoked when a task
+exits the body of the starting procedure by either an implicit
+or explicit return statement. This user extension have a
+prototype similar to the following:
+
+@findex rtems_task_exitted_extension
+@ifset is-C
+@example
+rtems_extension user_task_exitted(
+ rtems_tcb *current_task
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure User_Task_Exitted (
+ Current_Task : in RTEMS.TCB_Pointer
+);
+@end example
+@end ifset
+
+where current_task can be used to access the TCB for
+the currently executing task which has just exitted.
+
+Although exiting of task is often considered to be a
+fatal error, this extension allows recovery by either restarting
+or deleting the exiting task. If the user does not wish to
+recover, then a fatal error may be reported. If the user does
+not provide a TASK_EXITTED extension or the provided handler
+returns control to RTEMS, then the RTEMS default handler will be
+used. This default handler invokes the directive
+fatal_error_occurred with the @code{@value{RPREFIX}TASK_EXITTED} directive status.
+
+@subsubsection FATAL Error Extension
+
+The FATAL error extension is associated with the
+fatal_error_occurred directive. If this extension is defined in
+any static or dynamic extension set and the fatal_error_occurred
+directive has been invoked, then this extension will be called.
+This extension should have a prototype similar to the following:
+
+@findex rtems_fatal_extension
+@ifset is-C
+@example
+rtems_extension user_fatal_error(
+ Internal_errors_Source the_source,
+ rtems_boolean is_internal,
+ rtems_unsigned32 the_error
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure User_Fatal_Error (
+ Error : in RTEMS.Unsigned32
+);
+@end example
+@end ifset
+
+where the_error is the error code passed to the
+fatal_error_occurred directive. This extension is invoked from
+the fatal_error_occurred directive.
+
+If defined, the user's FATAL error extension is
+invoked before RTEMS' default fatal error routine is invoked and
+the processor is stopped. For example, this extension could be
+used to pass control to a debugger when a fatal error occurs.
+This extension should not call any RTEMS directives.
+
+@subsection Order of Invocation
+
+When one of the critical system events occur, the
+user extensions are invoked in either "forward" or "reverse"
+order. Forward order indicates that the static extension set is
+invoked followed by the dynamic extension sets in the order in
+which they were created. Reverse order means that the dynamic
+extension sets are invoked in the opposite of the order in which
+they were created followed by the static extension set. By
+invoking the extension sets in this order, extensions can be
+built upon one another. At the following system events, the
+extensions are invoked in forward order:
+
+@itemize @bullet
+@item Task creation
+@item Task initiation
+@item Task reinitiation
+@item Task deletion
+@item Task context switch
+@item Post task context switch
+@item Task begins to execute
+@end itemize
+
+
+At the following system events, the extensions are
+invoked in reverse order:
+
+@itemize @bullet
+@item Task deletion
+@item Fatal error detection
+@end itemize
+
+At these system events, the extensions are invoked in
+reverse order to insure that if an extension set is built upon
+another, the more complicated extension is invoked before the
+extension set it is built upon. For example, by invoking the
+static extension set last it is known that the "system" fatal
+error extension will be the last fatal error extension executed.
+Another example is use of the task delete extension by the
+Standard C Library. Extension sets which are installed after
+the Standard C Library will operate correctly even if they
+utilize the C Library because the C Library's TASK_DELETE
+extension is invoked after that of the other extensions.
+
+@section Operations
+
+@subsection Creating an Extension Set
+
+The @code{@value{DIRPREFIX}extension_create} directive creates and installs
+an extension set by allocating a Extension Set Control Block
+(ESCB), assigning the extension set a user-specified name, and
+assigning it an extension set ID. Newly created extension sets
+are immediately installed and are invoked upon the next system
+even supporting an extension.
+
+@subsection Obtaining Extension Set IDs
+
+When an extension set is created, RTEMS generates a
+unique extension set ID and assigns it to the created extension
+set until it is deleted. The extension ID may be obtained by
+either of two methods. First, as the result of an invocation of
+the @code{@value{DIRPREFIX}extension_create}
+directive, the extension set ID is stored
+in a user provided location. Second, the extension set ID may
+be obtained later using the @code{@value{DIRPREFIX}extension_ident}
+directive. The extension set ID is used by other directives
+to manipulate this extension set.
+
+@subsection Deleting an Extension Set
+
+The @code{@value{DIRPREFIX}extension_delete} directive is used to delete an
+extension set. The extension set's control block is returned to
+the ESCB free list when it is deleted. An extension set can be
+deleted by a task other than the task which created the
+extension set. Any subsequent references to the extension's
+name and ID are invalid.
+
+@section Directives
+
+This section details the user extension manager's
+directives. A subsection is dedicated to each of this manager's
+directives and describes the calling sequence, related
+constants, usage, and status codes.
+
+@c
+@c
+@c
+@page
+@subsection EXTENSION_CREATE - Create a extension set
+
+@cindex create an extension set
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_extension_create
+@example
+rtems_status_code rtems_extension_create(
+ rtems_name name,
+ rtems_extensions_table *table,
+ rtems_id *id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Extension_Create (
+ Name : in RTEMS.Name;
+ Table : in RTEMS.Extensions_Table_Pointer;
+ ID : out RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - extension set created successfully@*
+@code{@value{RPREFIX}INVALID_NAME} - invalid extension set name@*
+@code{@value{RPREFIX}TOO_MANY} - too many extension sets created
+
+@subheading DESCRIPTION:
+
+This directive creates a extension set. The assigned
+extension set id is returned in id. This id is used to access
+the extension set with other user extension manager directives.
+For control and maintenance of the extension set, RTEMS
+allocates an ESCB from the local ESCB free pool and initializes
+it.
+
+@subheading NOTES:
+
+This directive will not cause the calling task to be
+preempted.
+
+@c
+@c
+@c
+@page
+@subsection EXTENSION_IDENT - Get ID of a extension set
+
+@cindex get ID of an extension set
+@cindex obtain ID of an extension set
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_extension_ident
+@example
+rtems_status_code rtems_extension_ident(
+ rtems_name name,
+ rtems_id *id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Extension_Ident (
+ Name : in RTEMS.Name;
+ ID : out RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - extension set identified successfully@*
+@code{@value{RPREFIX}INVALID_NAME} - extension set name not found
+
+@subheading DESCRIPTION:
+
+This directive obtains the extension set id
+associated with the extension set name to be acquired. If the
+extension set name is not unique, then the extension set id will
+match one of the extension sets with that name. However, this
+extension set id is not guaranteed to correspond to the desired
+extension set. The extension set id is used to access this
+extension set in other extension set related directives.
+
+@subheading NOTES:
+
+This directive will not cause the running task to be
+preempted.
+
+@c
+@c
+@c
+@page
+@subsection EXTENSION_DELETE - Delete a extension set
+
+@cindex delete an extension set
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_extension_delete
+@example
+rtems_status_code rtems_extension_delete(
+ rtems_id id
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Extension_Delete (
+ ID : in RTEMS.ID;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - extension set deleted successfully@*
+@code{@value{RPREFIX}INVALID_ID} - invalid extension set id
+
+@subheading DESCRIPTION:
+
+This directive deletes the extension set specified by
+id. If the extension set is running, it is automatically
+canceled. The ESCB for the deleted extension set is reclaimed
+by RTEMS.
+
+@subheading NOTES:
+
+This directive will not cause the running task to be
+preempted.
+
+A extension set can be deleted by a task other than
+the task which created the extension set.
+
+@subheading NOTES:
+
+This directive will not cause the running task to be
+preempted.