ibm-information-center/dist/eclipse/plugins/i5OS.ic.apis_5.4.0.1/qspmovjb.htm

869 lines
24 KiB
HTML
Raw Permalink Normal View History

2024-04-02 14:02:31 +00:00
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Copyright" content="Copyright (c) 2006 by IBM Corporation">
<title>Move Job (QSPMOVJB) API</title>
<!-- Begin Header Records ========================================== -->
<!-- All rights reserved. Licensed Materials Property of IBM -->
<!-- US Government Users Restricted Rights -->
<!-- Use, duplication or disclosure restricted by -->
<!-- GSA ADP Schedule Contract with IBM Corp. -->
<!-- WM SCRIPT A converted by B2H R4.1 (346) (CMS) by V2KEA304 -->
<!-- at RCHVMW2 on 17 Feb 1999 at 11:05:09 -->
<!-- Change History: -->
<!-- YYMMDD USERID Change description -->
<!-- File cleanup completed Jan 2002 by v2cdijab -->
<!-- End Header Records -->
<link rel="stylesheet" type="text/css" href="../rzahg/ic.css">
</head>
<body>
<a name="Top_Of_Page"></a>
<!-- Java sync-link -->
<script type="text/javascript" language="Javascript" src="../rzahg/synch.js">
</script>
<h2>Move Job (QSPMOVJB) API</h2>
<div class="box" style="width: 80%;">
<br>
&nbsp;&nbsp;Required Parameter Group:<br>
<!-- iddvc RMBR -->
<br>
<table width="100%">
<tr>
<td align="center" valign="top" width="10%">1</td>
<td align="left" valign="top" width="50%">Function information</td>
<td align="left" valign="top" width="20%">Input</td>
<td align="left" valign="top" width="20%">Char(*)</td>
</tr>
<tr>
<td align="center" valign="top">2</td>
<td align="left" valign="top">Length of function information</td>
<td align="left" valign="top">Input</td>
<td align="left" valign="top">Binary(4)</td>
</tr>
<tr>
<td align="center" valign="top">3</td>
<td align="left" valign="top">Function information format</td>
<td align="left" valign="top">Input</td>
<td align="left" valign="top">Char(8)</td>
</tr>
<tr>
<td align="center" valign="top">4</td>
<td align="left" valign="top">Error code</td>
<td align="left" valign="top">I/O</td>
<td align="left" valign="top">Char(*)</td>
</tr>
</table>
<br>
&nbsp;&nbsp;Default Public Authority: *USE<br>
<!-- iddvc RMBR -->
<br>
&nbsp;&nbsp;Threadsafe: No<br>
<!-- iddvc RMBR -->
<br>
</div>
<p>The Move Job (QSPMOVJB) API performs one of two functions. They are to:</p>
<ul>
<li>Move one job at a time to the top of a job queue</li>
<li>Move a job after another job</li>
</ul>
<p>The jobs are identified by the internal job identifier or by the qualified
job name. See <a href="#HDRJTBL">How to Specify Job Identifying Fields</a> for
the valid combinations of identifying jobs.</p>
<p>As a result of using this API, a job could:</p>
<ul>
<li>Change job queues
<p>The job changes job queues when it is moved to the top of another job
queue.</p>
<p>The job being moved resides on the job queue of the target job.</p>
</li>
<li>Change priority
<p>The job priority is changed to the requester's highest schedule priority if
the job is moved to the top of a job queue.</p>
<pre>
Requester's priority = 2
Job Priority
New priority = 2 when moved here--------------&gt;
A 3
B 5
</pre>
<p>The job priority will be changed to the priority of the target job if the
requester's highest schedule priority is equal to or less than the target
job.</p>
<pre>
Requester's priority = 2
Job Priority
C 3
New priority = 3 when moved here-------------&gt;
D 5
</pre>
<p>The job priority is changed to the requester's highest schedule priority
if:</p>
<ul>
<li>The requester's priority is greater than the target job and</li>
<li>The requester's priority is greater or equal to the jobs it is moving ahead
of.</li>
</ul>
<pre>
Requester's priority = 4
Job Priority
C 3
New priority = 4 when moved here-------------&gt;
D 5
</pre>
<pre>
Requester's priority = 4
Job Priority
E 3
New priority = 4 when moved here-------------&gt;
F 4
The owner of the job moving must also be
the owner of job F.
</pre>
</li>
<li>Be held
<p>A job in ready status is held when it is moved after a job that is held.</p>
</li>
<li>Be released
<p>A job in held status is released when it is moved to the top of a job
queue.</p>
<p>A job in held status is released when it is moved after a job that is
released.</p>
</li>
</ul>
<br>
<h3><a name="Header_130">Restrictions for Movement of Jobs</a></h3>
<p>The Move Job API has restrictions that determine whether a job can be
moved.</p>
<ul>
<li>Scheduled jobs cannot be referenced as the source job or the target
job.</li>
<li>The job to be moved must exist, be a batch job, and be on a job queue.</li>
<li>The job queue must exist.</li>
<li>If a job is held with hold spooled files specified, and the job is to be
moved to the top of a queue, no spooled file must exist for the job.</li>
</ul>
<br>
<h3>Authorities and Locks</h3>
<p><strong>Job Authorities:</strong>&nbsp;&nbsp;The requester is authorized to
the job if one or more of the following conditions are met.</p>
<ul>
<li>The requester is the owner of the job to be moved.</li>
<li>The requester has *JOBCTL authority.</li>
</ul>
<h4>Job Queue Authority</h4>
<dl>
<dt><em><img src="delta.gif" alt="Start of change">Authority to the target job queue</em></dt>
<dd>*READ</dd>
<dt><em>Authority to the target job queue library</em></dt>
<dd>*EXECUTE<img src="deltaend.gif" alt="End of change"></dd>
<dt><em>Job queue lock on which the source job resides</em></dt>
<dd>*EXCLRD</dd>
<dt><em>Job queue lock on which the target job resides</em></dt>
<dd>*EXCLRD</dd>
</dl>
<h4>User Profile Highest Schedule Priority</h4>
<ul>
<li>The requester must have a priority limit of at least x-1 (x being the
priority of the job that will follow after this job).</li>
<li>If the requester has equal priority to a job that it is moving ahead of,
the requester must own all of the jobs it is moving ahead of at that priority
level or have *JOBCTL authority.</li>
</ul>
<br>
<h3>Required Parameter Group</h3>
<dl>
<dt><strong>Function information</strong></dt>
<dd>INPUT; CHAR(*)
<p>The information that is associated with the job or jobs to be moved and the
job queue to which the jobs are to be moved. See the <a href="#HDRFUNLISJ">
Format of the Function Information</a> for the format of this parameter.</p>
</dd>
<dt><strong>Length of function information</strong></dt>
<dd>INPUT; BINARY(4)
<p>The length of the function information in the function information
parameter. The length depends on the function format. Each format has a
different (but fixed) length as shown in the specific format tables. The
minimum length for format MJOB0100 is 62 bytes; the minimum length for format
MJOB0200 is 84 bytes.</p>
</dd>
<dt><strong>Function information format</strong></dt>
<dd>INPUT; CHAR(8)
<p>The format of the function information that is being provided. The
information is provided in the function information parameter. They are:</p>
<table cellpadding="5">
<!-- cols="15 85" -->
<tr>
<td align="left" valign="top"><em>MJOB0100</em></td>
<td align="left" valign="top">Format for the function of *NEXT, which is moving
one job at a time to the top of a job queue.</td>
</tr>
<tr>
<td align="left" valign="top"><em>MJOB0200</em></td>
<td align="left" valign="top">Format for the function of *AFTER, which is
moving a job after another job.</td>
</tr>
</table>
<br>
</dd>
<dt><strong>Error code</strong></dt>
<dd>I/O; CHAR(*)
<p>The structure in which to return error information. For the format of the
structure, see <a href="../apiref/error.htm#hdrerrcod">Error Code Parameter</a>.</p>
</dd>
</dl>
<br>
<h3><a name="HDRFUNLISJ">Format of the Function Information</a></h3>
<p><strong><a name="HDRMJOB100">MJOB0100 Format:</a></strong>&nbsp;&nbsp;The
following table shows the information for the MJOB0100 format. For more details
about the fields in the following tables see, <a href="#HDRMJOBDES">Field
Descriptions</a>.</p>
<table border width="80%">
<tr>
<th align="center" valign="bottom" colspan="2">Offset</th>
<th align="left" valign="bottom" rowspan="2">Type</th>
<th align="left" valign="bottom" rowspan="2">Field</th>
</tr>
<tr>
<th align="center" valign="bottom">Dec</th>
<th align="center" valign="bottom">Hex</th>
</tr>
<tr>
<td align="center" valign="top" width="10%">0</td>
<td align="center" valign="top" width="10%">0</td>
<td align="left" valign="top" width="20%">CHAR(10)</td>
<td align="left" valign="top" width="60%">Source job name</td>
</tr>
<tr>
<td align="center" valign="top">10</td>
<td align="center" valign="top">A</td>
<td align="left" valign="top">CHAR(10)</td>
<td align="left" valign="top">Source job user name</td>
</tr>
<tr>
<td align="center" valign="top">20</td>
<td align="center" valign="top">14</td>
<td align="left" valign="top">CHAR(6)</td>
<td align="left" valign="top">Source job number</td>
</tr>
<tr>
<td align="center" valign="top">26</td>
<td align="center" valign="top">18</td>
<td align="left" valign="top">CHAR(16)</td>
<td align="left" valign="top">Source internal job identifier</td>
</tr>
<tr>
<td align="center" valign="top">42</td>
<td align="center" valign="top">2A</td>
<td align="left" valign="top">CHAR(10)</td>
<td align="left" valign="top">Target job queue name</td>
</tr>
<tr>
<td align="center" valign="top">52</td>
<td align="center" valign="top">34</td>
<td align="left" valign="top">CHAR(10)</td>
<td align="left" valign="top">Target job queue library name</td>
</tr>
</table>
<br>
<br>
<p><strong><a name="HDRMJOB200">MJOB0200 Format:</a></strong>&nbsp;&nbsp; The
following table shows the information for the MJOB0200 format. For more details
about the fields in the following tables see, <a href="#HDRMJOBDES">Field
Descriptions</a>.</p>
<table border width="80%">
<tr>
<th align="center" valign="bottom" colspan="2">Offset</th>
<th align="left" valign="bottom" rowspan="2">Type</th>
<th align="left" valign="bottom" rowspan="2">Field</th>
</tr>
<tr>
<th align="center" valign="bottom">Dec</th>
<th align="center" valign="bottom">Hex</th>
</tr>
<tr>
<td align="center" valign="top" width="10%">0</td>
<td align="center" valign="top" width="10%">0</td>
<td align="left" valign="top" width="20%">CHAR(10)</td>
<td align="left" valign="top" width="60%">Source job name</td>
</tr>
<tr>
<td align="center" valign="top">10</td>
<td align="center" valign="top">A</td>
<td align="left" valign="top">CHAR(10)</td>
<td align="left" valign="top">Source job user name</td>
</tr>
<tr>
<td align="center" valign="top">20</td>
<td align="center" valign="top">14</td>
<td align="left" valign="top">CHAR(6)</td>
<td align="left" valign="top">Source job number</td>
</tr>
<tr>
<td align="center" valign="top">26</td>
<td align="center" valign="top">18</td>
<td align="left" valign="top">CHAR(16)</td>
<td align="left" valign="top">Source internal job identifier</td>
</tr>
<tr>
<td align="center" valign="top">42</td>
<td align="center" valign="top">2A</td>
<td align="left" valign="top">CHAR(10)</td>
<td align="left" valign="top">Target job name</td>
</tr>
<tr>
<td align="center" valign="top">52</td>
<td align="center" valign="top">34</td>
<td align="left" valign="top">CHAR(10)</td>
<td align="left" valign="top">Target job user name</td>
</tr>
<tr>
<td align="center" valign="top">62</td>
<td align="center" valign="top">3E</td>
<td align="left" valign="top">CHAR(6)</td>
<td align="left" valign="top">Target job number</td>
</tr>
<tr>
<td align="center" valign="top">68</td>
<td align="center" valign="top">44</td>
<td align="left" valign="top">CHAR(16)</td>
<td align="left" valign="top">Target internal job identifier</td>
</tr>
</table>
<br>
<br>
<h3><a name="HDRMJOBDES">Field Descriptions</a></h3>
<p><strong>Source internal job identifier.</strong> The internal identifier for
the job to be moved. The identifier is not valid following an initial program
load (IPL). If you attempt to use it after an IPL, an exception occurs. This
field must be blank when a source job name is given. Use one of the following
APIs to make the identifier available:</p>
<dl>
<dd><a href="qusljob.htm">List Job (QUSLJOB) API</a><br>
<br>
</dd>
<dd><a href="qusrjobi.htm">Retrieve Job Information (QUSRJOBI)
API</a><br>
<br>
</dd>
</dl>
<p>There may be a performance advantage when identifying the source job by its
internal identifier.</p>
<p><strong>Source job name.</strong> The name of the job to be moved. The
possible values are:</p>
<table cellpadding="5">
<!-- cols="10 90" -->
<tr>
<td align="left" valign="top"><em>*INT</em></td>
<td align="left" valign="top">The job to be moved is identified by the internal
job identifier.</td>
</tr>
<tr>
<td align="left" valign="top"><em>Name</em></td>
<td align="left" valign="top">The name of the job to be moved.</td>
</tr>
</table>
<p><strong>Source job number.</strong> The number of the job to be moved. It
can optionally be blank when a source job name or a source job user name or
both are specified. This field must be blank when the source job name is
specified as *INT.</p>
<p><strong>Source job user name.</strong> The user name of the job to be moved.
It can optionally be blank when a source job name is specified. This field must
be blank when the source job name is specified as *INT.</p>
<p><strong>Target internal job identifier.</strong> The internal identifier for
the job after which the source job is to be moved. The identifier is not valid
following an initial program load (IPL). If you attempt to use it after an IPL,
an exception occurs. This field must be blank when a target job name is given.
Use one of the following APIs to make the identifier available:</p>
<dl>
<dd><a href="qusljob.htm">List Job (QUSLJOB) API</a><br>
<br>
</dd>
<dd><a href="qusrjobi.htm">Retrieve Job Information (QUSRJOBI)
API</a><br>
<br>
</dd>
</dl>
<p>There may be a performance advantage when identifying the target job by its
internal identifier.</p>
<p><strong>Target job name.</strong> The name of the job after which the source
job is to be moved. The possible values are:</p>
<table cellpadding="5">
<!-- cols="10 90" -->
<tr>
<td align="left" valign="top"><em>*INT</em></td>
<td align="left" valign="top">The target job is identified by the internal job
identifier.</td>
</tr>
<tr>
<td align="left" valign="top"><em>Name</em></td>
<td align="left" valign="top">The name of the job after which the source job is
to be moved.</td>
</tr>
</table>
<p><strong>Target job number.</strong> The number of the target job. It can
optionally be blank when a target job name or target job user name or both are
specified. This field must be blank when the target job name is specified as
*INT.</p>
<p><strong>Target job queue library name.</strong> The name of the library that
contains the job queue. This must be specified when a target job queue name is
given. The possible values are:</p>
<table cellpadding="5">
<!-- cols="15 85" -->
<tr>
<td align="left" valign="top"><em>*LIBL</em></td>
<td align="left" valign="top">The library list is used to locate the job
queue.</td>
</tr>
<tr>
<td align="left" valign="top"><em>*CURLIB</em></td>
<td align="left" valign="top">The current library is used to locate the job
queue. If no library is specified as the current library for the job, QGPL is
used.</td>
</tr>
<tr>
<td align="left" valign="top"><em>Name</em></td>
<td align="left" valign="top">The library name.</td>
</tr>
<tr>
<td align="left" valign="top"><em>Blanks</em></td>
<td align="left" valign="top">No library name is given when the job queue name
is *SAME.</td>
</tr>
</table>
<p><strong>Target job queue name.</strong> The name of the job queue to which
the job is to move. The possible values are:</p>
<table cellpadding="5">
<!-- cols="15 85" -->
<tr>
<td align="left" valign="top"><em>*SAME</em></td>
<td align="left" valign="top">The job will move to the top of the job queue on
which it currently resides.</td>
</tr>
<tr>
<td align="left" valign="top"><em>Name</em></td>
<td align="left" valign="top">The name of the job queue to which the job is to
move to the top of.</td>
</tr>
</table>
<p><strong>Target job user name.</strong> The user name of the target job. It
can optionally be blank when a target job name is specified. This field must be
blank when the target job name is specified as *INT.</p>
<br>
<h3><a name="HDRJTBL">How to Specify Job Identifying Fields</a></h3>
<p>This table illustrates the valid combinations of values for format
MJOB0100.</p>
<table border width ="80%">
<tr>
<th align="center" valign="bottom" colspan="3">Qualified Job Name</th>
<th align="left" valign="bottom" rowspan="2">Internal Job Identifier</th>
<th align="left" valign="bottom" rowspan="2">Job Queue</th>
</tr>
<tr>
<th align="left" valign="bottom">Job Name</th>
<th align="left" valign="bottom">User Name</th>
<th align="left" valign="bottom">Job Number</th>
</tr>
<tr>
<td align="left" valign="top" width="20%">Name</td>
<td align="left" valign="top" width="20%">Name</td>
<td align="left" valign="top" width="20%">Number</td>
<td align="left" valign="top" width="20%">Blanks</td>
<td align="left" valign="top" width="20%">Name</td>
</tr>
<tr>
<td align="left" valign="top">Name</td>
<td align="left" valign="top">Name</td>
<td align="left" valign="top">Blanks</td>
<td align="left" valign="top">Blanks</td>
<td align="left" valign="top">Name</td>
</tr>
<tr>
<td align="left" valign="top">Name</td>
<td align="left" valign="top">Blanks</td>
<td align="left" valign="top">Number</td>
<td align="left" valign="top">Blanks</td>
<td align="left" valign="top">Name</td>
</tr>
<tr>
<td align="left" valign="top">Name</td>
<td align="left" valign="top">Blanks</td>
<td align="left" valign="top">Blanks</td>
<td align="left" valign="top">Blanks</td>
<td align="left" valign="top">Name</td>
</tr>
<tr>
<td align="left" valign="top">*INT</td>
<td align="left" valign="top">Blanks</td>
<td align="left" valign="top">Blanks</td>
<td align="left" valign="top">Internal job identifier</td>
<td align="left" valign="top">Name</td>
</tr>
</table>
<br>
<br>
<p>This table illustrates the valid combinations of values for format
MJOB0200.</p>
<p>The qualified job name can use the same combinations of the qualified job
name specified in format MJOB0100.</p>
<table border width ="80%">
<tr>
<th align="left" valign="bottom">Source <br>Qualified Job Name</th>
<th align="left" valign="bottom">Source <br>Internal Job Identifier</th>
<th align="left" valign="bottom">Target <br>Qualified Job Name</th>
<th align="left" valign="bottom">Target <br>Internal Job Identifier</th>
</tr>
<tr>
<td align="left" valign="top" width="25%">Qualified job name</td>
<td align="left" valign="top" width="25%">Blanks</td>
<td align="left" valign="top" width="25%">Qualified job name</td>
<td align="left" valign="top" width="25%">Blanks</td>
</tr>
<tr>
<td align="left" valign="top">Qualified job name</td>
<td align="left" valign="top">Blanks</td>
<td align="left" valign="top">*INT</td>
<td align="left" valign="top">Internal Job identifier</td>
</tr>
<tr>
<td align="left" valign="top">*INT</td>
<td align="left" valign="top">Internal Job identifier</td>
<td align="left" valign="top">Qualified job name</td>
<td align="left" valign="top">Blanks</td>
</tr>
<tr>
<td align="left" valign="top">*INT</td>
<td align="left" valign="top">Internal Job identifier</td>
<td align="left" valign="top">*INT</td>
<td align="left" valign="top">Internal job identifier</td>
</tr>
</table>
<br>
<br>
<h3>Error Messages</h3>
<table width="100%">
<tr>
<th align="left" valign="top">Message ID</th>
<th align="left" valign="top">Error Message Text</th>
</tr>
<tr>
<td align="left" valign="top" width="15%">CPF24B4 E</td>
<td align="left" valign="top" width="85%">Severe error while addressing
parameter list.</td>
</tr>
<tr>
<td align="left" valign="top">CPF33C1 E</td>
<td align="left" valign="top">Job &amp;3/&amp;2/&amp;1 not on job queue. Job
not moved.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3CF1 E</td>
<td align="left" valign="top">Error code parameter not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C1D E</td>
<td align="left" valign="top">Length specified in parameter &amp;1 not
valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C21 E</td>
<td align="left" valign="top">Format name &amp;1 is not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C42 E</td>
<td align="left" valign="top">User name or job number is not blank.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C43 E</td>
<td align="left" valign="top">Internal job identifier is not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C52 E</td>
<td align="left" valign="top">Internal job identifier no longer valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C53 E</td>
<td align="left" valign="top">Job &amp;3/&amp;2/&amp;1 not found.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C58 E</td>
<td align="left" valign="top">Job name specified is not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C90 E</td>
<td align="left" valign="top">Literal value cannot be changed.</td>
</tr>
<tr>
<td align="left" valign="top">CPF33BA E</td>
<td align="left" valign="top">Job queue &amp;1 in library &amp;2 is not
valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPF33B3 E</td>
<td align="left" valign="top">Not authorized to job queue &amp;1.</td>
</tr>
<tr>
<td align="left" valign="top">CPF33B4 E</td>
<td align="left" valign="top">Not authorized to job &amp;3/&amp;2/&amp;1. Job
not moved.</td>
</tr>
<tr>
<td align="left" valign="top">CPF33B5 E</td>
<td align="left" valign="top">Job &amp;3/&amp;2/&amp;1 is not available for
moving.</td>
</tr>
<tr>
<td align="left" valign="top">CPF33B6 E</td>
<td align="left" valign="top">Job &amp;3/&amp;2/&amp;1 held by HLDJOB command.
Job not moved.</td>
</tr>
<tr>
<td align="left" valign="top">CPF33B7 E</td>
<td align="left" valign="top">Job &amp;3/&amp;2/&amp;1 specified more than
once. Job not moved.</td>
</tr>
<tr>
<td align="left" valign="top">CPF33B8 E</td>
<td align="left" valign="top">Priority required to move job
&amp;3/&amp;2/&amp;1 exceeds limit of user &amp;9.</td>
</tr>
<tr>
<td align="left" valign="top">CPF33B9 E</td>
<td align="left" valign="top">Priority required to move job
&amp;3/&amp;2/&amp;1 exceeds limit of user &amp;9.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3330 E</td>
<td align="left" valign="top">Necessary resource not available.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3343 E</td>
<td align="left" valign="top">Duplicate job names found.</td>
</tr>
<tr>
<td align="left" valign="top">CPF8121 E</td>
<td align="left" valign="top">&amp;8 damage on job queue &amp;4 in library
&amp;9.</td>
</tr>
<tr>
<td align="left" valign="top">CPF8122 E</td>
<td align="left" valign="top">&amp;8 damage on library &amp;4.</td>
</tr>
<tr>
<td align="left" valign="top">CPF9801 E</td>
<td align="left" valign="top">Object &amp;2 in library &amp;3 not found.</td>
</tr>
<tr>
<td align="left" valign="top">CPF9810 E</td>
<td align="left" valign="top">Library &amp;1 not found.</td>
</tr>
<tr>
<td align="left" valign="top">CPF9872 E</td>
<td align="left" valign="top">Program or service program &amp;1 in library
&amp;2 ended. Reason code &amp;3.</td>
</tr>
</table>
<br>
<hr>
API introduced: V3R1
<hr>
<center>
<table cellpadding="2" cellspacing="2">
<tr align="center">
<td valign="middle" align="center">
<a href="#Top">Top</a> |
<a href="wm1.htm">Work Management APIs</a> |
<a href="aplist.htm">APIs by category</a></td>
</tr>
</table>
</center>
</body>
</html>