    <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/">
     <channel>
        <title>ACCU  :: Building the Board (part II)</title>
        <link>https://members.accu.org/index.php/journals/1045</link>
        <description>Professionalism in Programming</description>
        <dc:language>en-us</dc:language> 
        <dc:creator>Administrator</dc:creator> 
        <admin:generatorAgent rdf:resource="http://www.xaraya.org" /> 
        <admin:errorReportsTo rdf:resource="mailto:webeditor@accu.org" />
       <sy:updatePeriod>hourly</sy:updatePeriod>
       <sy:updateFrequency>1</sy:updateFrequency>
       <docs>http://backend.userland.com/rss</docs>


        <h2>Journal Articles</h2>


<div class="xar-mod-head"><span class="xar-mod-title">CVu Journal Vol 12, #5 - Sep 2000 + Programming Topics</span></div>

<table border="0" cellpadding="1" cellspacing="0">
    <tbody>
    <tr>
        <td valign="top">
            Browse in :
       </td>
       <td valign="top">

                                            <a href="https://members.accu.org/index.php/journals/">All</a>

                     &gt;                         <a href="https://members.accu.org/index.php/journals/c76/">Journals</a>

                     &gt;                         <a href="https://members.accu.org/index.php/journals/c77/">CVu</a>

                     &gt;                         <a href="https://members.accu.org/index.php/journals/c124/">125</a>
                    (21)
<br />

                                            <a href="https://members.accu.org/index.php/journals/">All</a>

                     &gt;                         <a href="https://members.accu.org/index.php/journals/c13/">Topics</a>

                     &gt;                         <a href="https://members.accu.org/index.php/journals/c65/">Programming</a>
                    (877)
<br />

                                            <a href="https://members.accu.org/index.php/journals/c124-65/">Any of these categories</a>

                    -                        <a href="https://members.accu.org/index.php/journals/c124+65/">All of these categories</a>
<br />
</td>
   </tr>
   </tbody>
</table>




<div class="xar-error">
   <p>
 <strong>Note:</strong> when you create a new publication type,
the articles module will automatically use the templates
<em>user-display-[publicationtype].xt</em>
and <em>user-summary-[publicationtype].xt</em>.
If those templates do not exist when you try to preview or display a new article,
you'll get this warning :-)  Please place your own templates in themes/<em>yourtheme</em>/modules/articles . The templates will get the extension .xt there. </p>
</div>
<div class="xar-norm xar-standard-box-padding">
   <h1><strong>Title:</strong>&nbsp;Building the Board (part II)</h1>
<p><strong>Author:</strong>&nbsp;</p>
<p>
<strong>Date:</strong> 03 September 2000 13:15:39 +01:00 or Sun, 03 September 2000 13:15:39 +01:00</p>
<p><strong>Summary:</strong>&nbsp;</p>
<p><strong>Body:</strong>&nbsp;<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e18" id="d0e18"></a></h2>
</div>
<p>The hexes on the board need to be ordered into some sort of grid
according to requirement Hex/Board-1. One of the most important
gains from putting the hexes into a grid is the ability to
determine relative positions. A grid is traditionally built as a
set of indices with two coordinates indicating the location of any
grid element in a planer surface. Since the game board is a planer
surface, it makes sense to start with a two coordinate system.
Figure 1 is an effort to place the hexes within such a grid.</p>
<div class="mediaobject">
<pre class="literallayout">
   / \     / \     / \
  /   \   /   \   /   \
 /     \ /     \ /     \
|       |       |       |
| -3,1  | -1,1  |  1,1  |
|       |       |       |
 \     / \     / \     / \
  \   /   \   /   \   /   \
   \ /     \ /     \ /     \
    |       |       |       |
    | -2,0  |  0,0  |  2,0  |
    |       |       |       |
   / \     / \     / \     /
  /   \   /   \   /   \   /
 /     \ /     \ /     \ /
|       |       |       |
| -3,-1 | -1,-1 |  1,-1 |
|       |       |       |
 \     / \     / \     /
  \   /   \   /   \   /
   \ /     \ /     \ /
         Figure 1
</pre></div>
<p>To test the appropriateness of this grid, it is necessary to
check and see if it is possible to calculate the distance between
hexes. The traditional way to calculate the distance between two
points is to take the absolute value of the difference between the
ordinates. Consider two points on the grid (x1, y1) and (x2, y2).
The distance between the two points is given by the formula:</p>
<pre class="literallayout">
<span class=
"bold"><b>Delta = SQR((x<sub>1</sub>-x<sub>2</sub>)<sup>2</sup> + (y<sub>1</sub>-y<sub>2</sub>)<sup>2</sup>)</b></span>
</pre>
<p>This formula is determined by drawing an imaginary right
triangle. One side of the triangle is the along the x-axis, one
side is along the y-axis (these two sides are perpendicular, thus
making the triangle a right triangle), and the third is a diagonal
between the two points. Since the shortest distance between two
points is a straight line, the diagonal line is the distance
between the two points. To calculate the length of a triangle's
diagonal from its sides (remember the length of the sides are given
by the coordinates) the formula shown above is used.</p>
<p>The hex at (0, 0) touches the hex at (2, 0), so the distance
between them should be one hex (it would be necessary to move once
to go from one hex to the other). Using the formula derived above,
the distance is SQR((0-2)2 + (0-0)2) which is SQR(4+0) or 2. Thus,
the distance formula gives a distance of 2 units. This is not good.
In addition, it is difficult to tell which faces of the hexes are
touching just by using the coordinates.</p>
<p>All of these problems stem from the fact that the two coordinate
planer grid system was designed for handling four sided objects
(squares) and the hexes used in the game are six sided. The axes in
a two coordinate system bisect all sides of a square, so
relationships between squares are well defined. In order for the
hexes to share the same relationship qualities, it would be
necessary for the axes to bisect the sides of the hexes. If this
were to happen, then there would have to be three axes separated by
60 degrees instead of the normal 90 degrees. It is worthwhile to
investigate that possibility.</p>
<p>In this scenario, each hex position would be defined by a triple
instead of a pair. Thus, Figure 1 would be renumbered as shown in
Figure 2.</p>
<p>In this strange coordinate system, however, how is it possible
to calculate the distance between two hexes? The game board sits in
a plane but there are three axes presenting values (generally
associated with three dimensional space). This third axis does make
it easier to determine which faces a pair of touching hexes have in
common, but the extra information generated by the third axis
actually overwhelms the calculations for determining distance.</p>
<div class="mediaobject">
<pre class="literallayout">
   / \     / \     / \
  /   \   /   \   /   \
 /     \ /     \ /     \
|       |       |       |
|1,-1,0 | 1,0,1 | 1,1,2 |
|       |       |       |
 \     / \     / \     / \
  \   /   \   /   \   /   \
   \ /     \ /     \ /     \
    |       |       |       |
    | 0,0,0 | 0,1,1 | 0,2,2 |
    |       |       |       |
   / \     / \     / \     /
  /   \   /   \   /   \   /
 /     \ /     \ /     \ /
|       |       |       |
|-1,0,-1|-1,1,0 |-1,2,1 |
|       |       |       |
 \     / \     / \     /
  \   /   \   /   \   /
   \ /     \ /     \ /
         Figure 2
</pre></div>
<p>What now? Stumped I turned to Mark Stowell (<tt class=
"email">&lt;<a href=
"mailto:stowell@gang.umass.edu">stowell@gang.umass.edu</a>&gt;</tt>)
who is an expert in graphical geometry. He kindly lent his time and
helped resolve this problem. Clearly three axes do not work, so it
is necessary to return to a two axis solution. It is possible,
however, to generate an oblique set of axes that do the job. By
creating new axes (u and v) with u 30 degrees below the traditional
x-axis and v 30 degrees above the traditional x-axis, it is
possible to generate a coordinate system that will show accurate
distances between hexes. This new mapping is shown in Figure 3.</p>
<div class="mediaobject">
<pre class="literallayout">
   / \     / \     / \
  /   \   /   \   /   \
 /     \ /     \ /     \
|       |       |       |
|  0,1  |  1,1  |  2,1  |
|       |       |       |
 \     / \     / \     / \
  \   /   \   /   \   /   \
   \ /     \ /     \ /     \
    |       |       |       |
    |  0,0  |  1,0  |  2,0  |
    |       |       |       |
   / \     / \     / \     /
  /   \   /   \   /   \   /
 /     \ /     \ /     \ /
|       |       |       |
| -1,-1 |  0,-1 |  1,-1 |
|       |       |       |
 \     / \     / \     /
  \   /   \   /   \   /
   \ /     \ /     \ /
         Figure 3
</pre></div>
<p>Using some moderately complicated derivations which I will
gladly review on the mailing list should anyone be interested, Mr.
Stowell determined that the distance between any two hexes is given
by the following formula:</p>
<pre class="literallayout">
<span class=
"bold"><b>Delta = SQR((u<sub>1</sub>-u<sub>2</sub>)<sup>2</sup> +(u<sub>1</sub>-u<sub>2</sub>)(v<sub>1</sub>-v<sub>2</sub>)+(v<sub>1</sub>-v<sub>2</sub>)<sup>2</sup>)</b></span>
</pre>
<p>where the first hex is at location (u<sub>1</sub>,
v<sub>1</sub>) and the second hex is at location (u<sub>2</sub>,
v<sub>2</sub>).</p>
<p>Using this coordinate system, the hex at (0, 0) does not touch
the hex at (2, 0) and the two hexes are 2 units apart. Applying the
equation above, the difference between the two hexes is:</p>
<pre class="literallayout">
<span class=
"bold"><b>Delta = SQR((0-2)<sup>2</sup> + (0-2)(0-0) + (0-0)<sup>2</sup>)
      = SQR(4 + (-2)(0) + 0)
      = SQR(4) = 2</b></span>
</pre>
<p>HURRAY! This works as expected. For comfort, consider one more
case where the two hexes are touching, so the distance should be 1.
The difference between (1, 0) and (1, -1) is:</p>
<pre class="literallayout">
<span class=
"bold"><b>Delta = SQR((1-1)<sup>2</sup> + (1-1)(0-(-1)) + (0-(-1))<sup>2</sup>)
      = SQR(0 + 0 + 1)
      = SQR(1) = 1</b></span>
</pre>
<p>Yes! We can conclude from this small sample that the derivation
is indeed correct and we now have a way of calculating the distance
between any two hexes. Thus the coordinate system to use is defined
and the initial requirement is met.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e148" id="d0e148"></a>Finding Your
Neighbor</h2>
</div>
<p>Now, using this coordinate system, it is necessary to figure out
which faces of any two given hexes are touching. It is reasonable
to assume that from this point forward that the hexes being
analyzed have already been found to have a distance between them of
1 (i.e. that they are indeed touching).</p>
<p>Hexes that are along either the u or v axis will have a
coordinate in common. Since the u axis bisects the Southeast and
Northwest faces, hexes with a common u coordinate will be touching
on those faces. Whichever hex has a larger v coordinate will be
touching on the Southeast face, the smaller v coordinate will be
touching on the Northwest face. Similarly, the v axis bisects the
West and East faces. Thus, when hexes have the same v coordinate,
whichever has the larger u component will be touching on the West
face, whereas the hex with the smaller u component will be touching
on the East face.</p>
<p>This leaves one more set of faces to resolve. If both the u and
v coordinates are larger, then the hex with the larger coordinates
will be touching on the Southwest face. In the reverse case, the
hex with the smaller coordinates will be touching on the Northeast
face.</p>
<p>This information is summarized in Table 1.</p>
<div class="table"><a name="d0e159" id="d0e159"></a>
<table summary="" border="1" cellspacing="0">
&lt;colgroup&gt;
&lt;col&gt;
&lt;col&gt;
&lt;col&gt;&lt;/colgroup&gt;
&lt;thead&gt;
<tr>
<th>Conditions</th>
<th>(u<sub>1</sub>,v<sub>1</sub>) face</th>
<th>(u<sub>2</sub>,v<sub>2</sub>) face</th>
</tr>
&lt;/thead&gt;
&lt;tbody&gt;
<tr>
<td>u<sub>1</sub>==u<sub>2</sub>,
v<sub>1</sub>&gt;v<sub>2</sub></td>
<td>Southwest</td>
<td>Northwest</td>
</tr>
<tr>
<td>u<sub>1</sub>==u<sub>2</sub>,
v<sub>1</sub>&lt;v<sub>2</sub></td>
<td>Northwest</td>
<td>Souteast</td>
</tr>
<tr>
<td>v<sub>1</sub>==v<sub>2</sub>,
u<sub>1</sub>&gt;u<sub>2</sub></td>
<td>West</td>
<td>East</td>
</tr>
<tr>
<td>v<sub>1</sub>==v<sub>2</sub>,
u<sub>1</sub>&lt;u<sub>2</sub></td>
<td>East</td>
<td>West</td>
</tr>
<tr>
<td>v<sub>1</sub>&gt;v<sub>2</sub>,
u<sub>1</sub>&gt;u<sub>2</sub></td>
<td>Southwest</td>
<td>Northeast</td>
</tr>
<tr>
<td>v<sub>1</sub>&lt;v<sub>2</sub>,
u<sub>1</sub>&lt;u<sub>2</sub></td>
<td>Northeast</td>
<td>Southwest</td>
</tr>
&lt;/tbody&gt;
</table>
<p class="title c2">Table 1. </p>
</div>
<p>The grid system defined makes it possible to determine how far
apart any two hexes are and which faces of two touching hexes are
held in common. Thus, the grid system defined meets requirement
Board-5 and part of requirement Hex/Board-3.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e293" id="d0e293"></a>Where to
Start?</h2>
</div>
<p>An additional requirement (Hex/Board-2) is that the board be
able to determine what hex is diametrically opposed to another on
opposite edges of the board. Given the 19 hex arrangement being
considered, edge hexes will always have at least one coordinate
with an absolute value of 2. No interior hexes will have a
coordinate with an absolute value of 2. In this manner the set of
edge hexes can be easily identified as required by requirement
Hex/Board-3.</p>
<p>The next step after finding the set of edge hexes, is to figure
out how to calculate the coordinate pair of a diametrically opposed
hex. Because the coordinate system is centered on the center hex,
the coordinates of a diametrically opposed hex can be determined
simply by multiplying both coordinates of the current hex by -1.
Thus, the diametrically opposed hex to (2, 2) is (-2, -2). Simple
analysis of a 19 hex board with the hexes properly labeled with
their coordinates shows this to be true. In this manner, the grid
system fulfills requirement Hex/Board-2.</p>
<p>To determine a starting position for a new player, it is
necessary to pick a set of three hexes. Once one starting position
has been determined the starting positions available to other
players are deterministic, although which player takes which
position remains a player decision. To build this three hex
starting position, it is necessary to take an edge hex and
determine which two additional edge hexes are touching it.</p>
<p>Keeping in mind that all edge hexes have a 2 in at least one of
the (u,v) coordinate pair, it should be possible to:</p>
<div class="orderedlist">
<ol type="1">
<li>
<p>take a given hex position,</p>
</li>
<li>
<p>calculate what hexes would be one hex away (there would be
six),</p>
</li>
<li>
<p>discard hexes with a 3 in either coordinate pair, and</p>
</li>
<li>
<p>select hexes with a 2 in at least one of the (u, v) coordinate
pairs.</p>
</li>
</ol>
</div>
<p>Given the knowledge that we have from Table 1, it is possible to
calculate which hexes would appear on which faces. The calculations
for each face are shown in Table 2</p>
<div class="table"><a name="d0e319" id="d0e319"></a>
<table summary="" border="1" cellspacing="0">
&lt;colgroup&gt;
&lt;col&gt;
&lt;col&gt;&lt;/colgroup&gt;
&lt;thead&gt;
<tr>
<th>Calculations</th>
<th>face</th>
</tr>
&lt;/thead&gt;
&lt;tbody&gt;
<tr>
<td>u<sub>1</sub>==u<sub>2</sub>,
v<sub>2</sub>==v<sub>1</sub>-1</td>
<td>Southeast</td>
</tr>
<tr>
<td>u<sub>1</sub>==u<sub>2</sub>,
v<sub>2</sub>==v<sub>2</sub>+1</td>
<td>Northwest</td>
</tr>
<tr>
<td>v<sub>1</sub>==v<sub>2</sub>,
u<sub>2</sub>==u<sub>1</sub>-1</td>
<td>West</td>
</tr>
<tr>
<td>v<sub>1</sub>==v<sub>2</sub>,
u<sub>2</sub>==u<sub>1</sub>+1</td>
<td>East</td>
</tr>
<tr>
<td>
v<sub>1</sub>==v<sub>2</sub>-1,u<sub>2</sub>==u<sub>1</sub>-1</td>
<td>Southwest</td>
</tr>
<tr>
<td>
v<sub>1</sub>==v<sub>2</sub>+1,u<sub>2</sub>==u<sub>1</sub>+1</td>
<td>Northeast</td>
</tr>
&lt;/tbody&gt;
</table>
<p class="title c2">Table 2. </p>
</div>
<p>Using table two, it is now possible to calculate the six
possible hexes, remove the hexes outside the edges of the board and
identify the two neighbor edge hexes. This meets requirement
Board-6 and Board-7.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e433" id=
"d0e433"></a>Pseudo-code</h2>
</div>
<p>Since the grid system can be represented as a two-dimensional
array, it seems like a good starting place for the 19 hex board to
store the hexes in a two-dimensional array. Given the configuration
of the board from requirement Board-1, it will be necessary to have
an array with dimensions of -2 to 2 on both the u and v axes. This
is reflected in the pseudo-code for the board seen in Listing
1.</p>
<p>The board also requires a number of functions for determining
the possible starting positions as defined in requirement Board-7
(<tt class="function">find_start</tt>), determining whether a hex
is on an edge (<tt class="function">is_edge</tt>), finding a
diametrically opposed hex as defined in requirement Hex/Board-2
(<tt class="function">find_opposed</tt>), finding the neighbors of
a given hex as defined in requirement Board-5 (<tt class=
"function">find_neighbors</tt>), determining which faces are
touching on a pair of hexes (<tt class=
"function">faces_touching</tt>), and the distance between two hexes
(<tt class="function">distance_between</tt>). These functions are
generally defined in the pseudo code of Listing 1.</p>
<p>To facilitate error checking and bounds checking, the board also
contains minimums and maximums for u and v. While this will not
guarantee that there is a hex with coordinates bounded by the
minimums and maximums, it will assure that the boundaries of the
array will not be exceeded. It is worthwhile to discuss what
happens in the array when a pair of coordinates is given that is
within the minimum/maximum boundary values, but is not on the
board. In this case, the hex will be <tt class="literal">NULL</tt>
and any functions that work on the board need to check for
<tt class="literal">NULL</tt> returns as a result. The first most
likely application of this will be in the <tt class=
"function">find_neighbors</tt> routine.</p>
<div class="sidebar">
<p class="title c2">Listing 1</p>
<pre class="programlisting">
class board 
{
  private:
    short u_max, u_min, v_max, v_min, max_hex;
    std::map&lt;hex::coordinate_pair, hex::hex&gt; hex_list;
  public:
    hex::coordinate_pair&amp; virtual add_hex(hex::hex&amp; new_hex);
    std::list&lt;hex::hex&gt;&amp; virtual find_start (hex::hex&amp; new_hex);
    binary virtual is_edge(hex::hex&amp; check_hex);
    hex::hex&amp; virtual find_opposed(hex::hex&amp; check_hex);
    std::list&lt;hex::hex&gt;&amp; virtual find_neighbors(hex::hex&amp; check_hex);
    binary virtual faces_touching(hex::hex&amp; hex1, hex::hex&amp; hex2);
    short virtual distance_between(hex::hex&amp; hex1, hex::hex&amp; hex2);
    binary virtual draw_board(display_type disp);
}
</pre></div>
<p>In addition, it seems like a good idea for the hex to know its
coordinate position on the board, so the pseudo-code for the hex
has been modified as shown in listing 2. This listing also shows
some changes recommended by Francis who has been the only commenter
on this game thus far.</p>
<p>A coordinate pair represents the coordinate position on the
board. The coordinate pair is exhaustively defined in an effort to
make manipulations using coordinates as meaningful and complete as
possible. The reason for this is that there are many operations
that will come in the future that are likely to make use of the
coordinate class. By carefully defining that class now, it will
reduce the burden later on without putting an undue burden on the
current exercise.</p>
<p>In an effort to incorporate the concept of Data Attribute
Notation where appropriate, the u and v coordinates are represented
by different classes, which eases the manipulations that may be
done on one coordinate without effecting the other. It will also
make the code more readable and does not incur undue overhead in
this case. Care to argue with this skimpy reasoning? Post on the
mailing list!</p>
<div class="sidebar">
<p class="title c2">Listing 2</p>
<pre class="programlisting">
enum hex_sides {W_side = 0, NW_side, NE_side, E_side, SE_side, SW_side, Center_side };
enum hex_color { Brown=0, Green, Blue };
enum display_type { Character=0 };
class colored_area {
  private:
    hex_color color;
    std::map&lt;hex_sides, float&gt; sides_touched;
  public:
    int draw_color();
    boolean touching_side(hex_sides side,float portion);
};
class coordinate {
  private:
    short coord;
  public:
    coord operator short();
    coord operator + (short ord);
    coord operator - (short ord);
    coord operator ++ (short ord);
    coord operator - (short ord);
    friend ostream&amp; operator &lt;&lt; (coordinate&amp; ord);
    friend ostream&amp; operator &gt;&gt; (coordinate&amp; ord);
};
class u_coordinate : private coordinate {public: operator short(); };
class v_coordinate : private coordinate {public: operator short(); };
class coordinate_pair {
  private:
    u_coordinate u;
    v_coordinate v;
  public:
    coordinate_pair&amp; operator &lt;&lt; (v_coordinate&amp; ord);
    coordinate_pair&amp; operator &lt;&lt; (u_coordinate&amp; ord);
    coordinate_pair&amp; operator &gt;&gt; (v_coordinate&amp; ord);
    coordinate_pair&amp; operator &gt;&gt; (u_coordinate&amp; ord);
    coordinate_pair&amp; operator v_coordinate() const;
    coordinate_pair&amp; operator u_coordinate() const;
    int operator - (const coordinate_pair&amp; ord);
};
class hex {
  private:
    external_orientation ext_face;
    int color_count;
    coordinate_pair    board_location;
    hex_sides&amp; externtointern(hex_sides side);
    hex_sides&amp; interntoextern(hex_sides side);
    boolean virtual    build_colors();
  public:
    binary virtual draw_hex(display_type disp, int line);
    colored_area&amp; virtual get_color(hex_sides extern_side, float portion);
    binary virtual rotate_hex(external_orientation face);
};
</pre></div>
<p>Something that has not really been addressed is how the board
will be displayed (the display of individual hexes has already been
discussed). Well, for the current time we will be using ASCII
characters to display the hexes. This requires that the board be
drawn a line at a time, not just a hex at a time. Thus, we have to
add the <tt class="varname">display_type</tt> variable to the board
that tells the draw routines what type of display is expected. For
now, the <tt class="varname">display_type</tt> only has &quot;character&quot;
as a member, but others will follow in the months to come. To draw
the board and hexes, draw functions are required and they are
defined in Listings 1 and 2 respectively.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e493" id="d0e493"></a>Get Ready to
Code</h2>
</div>
<p>OK, it is really too early to begin considering coding these two
components, but this is a magazine about code, not about design.
Moreover, I am itching to code this stuff after too many months of
intermittent design! So, next issue, be prepared to discuss the
coding of both the hex and the board objects. Heck, you could even
prepare some testing software based on the interfaces defined and
send it in to the list&hellip;</p>
<p class="c3"><span class="remark">Editorial Comment</span></p>
<p class="c3"><span class="remark">The code and pseudo code in this
article has not been fully checked because the author had not
realised that C Vu was about to go to print. I, and I hope you, am
very grateful for the way that he responded to my enquiry about his
column five days before the final copy was due to go to the
printers (I knew he was writing a column and had simply allocated
space for it, assuming he would deliver after the last
weekend).</span></p>
<p class="c3"><span class="remark">I hope that many of you will now
start to participate. Francis</span></p>
</div>
</p>
<p><strong>Notes:</strong>&nbsp;</p>
<p><em>More fields may be available via dynamicdata ..</em></p>
</div>
</channel>
</rss>
