blob: ec566c208e9448f489ef67edc30820e1b8aff08a [file] [log] [blame]
Ian Maxone2b799e2015-11-24 18:20:03 -08001<!DOCTYPE html>
2<!--
3 | Generated by Apache Maven Doxia at 2015-11-24
4 | Rendered using Apache Maven Fluido Skin 1.3.0
5-->
6<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7 <head>
8 <meta charset="UTF-8" />
9 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
10 <meta name="Date-Revision-yyyymmdd" content="20151124" />
11 <meta http-equiv="Content-Language" content="en" />
12 <title>AsterixDB &#x2013; AsterixDB Temporal Functions: Allens Relations</title>
13 <link rel="stylesheet" href="../css/apache-maven-fluido-1.3.0.min.css" />
14 <link rel="stylesheet" href="../css/site.css" />
15 <link rel="stylesheet" href="../css/print.css" media="print" />
16
17
18 <script type="text/javascript" src="../js/apache-maven-fluido-1.3.0.min.js"></script>
19
20
21
22<script>(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
23 (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
24 m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
25 })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
26
27 ga('create', 'UA-41536543-1', 'uci.edu');
28 ga('send', 'pageview');</script>
29
30 </head>
31 <body class="topBarDisabled">
32
33
34
35
36 <div class="container-fluid">
37 <div id="banner">
38 <div class="pull-left">
39 <a href="http://asterixdb.apache.org/" id="bannerLeft">
40 <img src="../images/asterixlogo.png" alt="AsterixDB"/>
41 </a>
42 </div>
43 <div class="pull-right"> </div>
44 <div class="clear"><hr/></div>
45 </div>
46
47 <div id="breadcrumbs">
48 <ul class="breadcrumb">
49
50
51 <li id="publishDate">Last Published: 2015-11-24</li>
52
53
54
55 <li id="projectVersion" class="pull-right">Version: 0.8.7-incubating</li>
56
57 <li class="divider pull-right">|</li>
58
59 <li class="pull-right"> <a href="../index.html" title="Documentation Home">
60 Documentation Home</a>
61 </li>
62
63 </ul>
64 </div>
65
66
67 <div class="row-fluid">
68 <div id="leftColumn" class="span3">
69 <div class="well sidebar-nav">
70
71
72 <ul class="nav nav-list">
73 <li class="nav-header">Documentation</li>
74
75 <li>
76
77 <a href="../install.html" title="Installing and Managing AsterixDB using Managix">
78 <i class="none"></i>
79 Installing and Managing AsterixDB using Managix</a>
80 </li>
81
82 <li>
83
84 <a href="../yarn.html" title="Deploying AsterixDB using YARN">
85 <i class="none"></i>
86 Deploying AsterixDB using YARN</a>
87 </li>
88
89 <li>
90
91 <a href="../aql/primer.html" title="AsterixDB 101: An ADM and AQL Primer">
92 <i class="none"></i>
93 AsterixDB 101: An ADM and AQL Primer</a>
94 </li>
95
96 <li>
97
98 <a href="../aql/primer-sql-like.html" title="AsterixDB 101: An ADM and AQL Primer (For SQL Fans)">
99 <i class="none"></i>
100 AsterixDB 101: An ADM and AQL Primer (For SQL Fans)</a>
101 </li>
102
103 <li>
104
105 <a href="../aql/js-sdk.html" title="AsterixDB Javascript SDK">
106 <i class="none"></i>
107 AsterixDB Javascript SDK</a>
108 </li>
109
110 <li>
111
112 <a href="../aql/datamodel.html" title="Asterix Data Model (ADM)">
113 <i class="none"></i>
114 Asterix Data Model (ADM)</a>
115 </li>
116
117 <li>
118
119 <a href="../aql/manual.html" title="Asterix Query Language (AQL)">
120 <i class="none"></i>
121 Asterix Query Language (AQL)</a>
122 </li>
123
124 <li>
125
126 <a href="../aql/functions.html" title="AQL Functions">
127 <i class="none"></i>
128 AQL Functions</a>
129 </li>
130
131 <li class="active">
132
133 <a href="#"><i class="none"></i>AQL Allen's Relations Functions</a>
134 </li>
135
136 <li>
137
138 <a href="../aql/similarity.html" title="AQL Support of Similarity Queries">
139 <i class="none"></i>
140 AQL Support of Similarity Queries</a>
141 </li>
142
143 <li>
144
145 <a href="../aql/externaldata.html" title="Accessing External Data">
146 <i class="none"></i>
147 Accessing External Data</a>
148 </li>
149
150 <li>
151
152 <a href="../feeds/tutorial.html" title="Support for Data Ingestion in AsterixDB">
153 <i class="none"></i>
154 Support for Data Ingestion in AsterixDB</a>
155 </li>
156
157 <li>
158
159 <a href="../udf.html" title="Support for User Defined Functions in AsterixDB">
160 <i class="none"></i>
161 Support for User Defined Functions in AsterixDB</a>
162 </li>
163
164 <li>
165
166 <a href="../aql/filters.html" title="Filter-Based LSM Index Acceleration">
167 <i class="none"></i>
168 Filter-Based LSM Index Acceleration</a>
169 </li>
170
171 <li>
172
173 <a href="../api.html" title="HTTP API to AsterixDB">
174 <i class="none"></i>
175 HTTP API to AsterixDB</a>
176 </li>
177 </ul>
178
179
180
181 <hr class="divider" />
182
183 <div id="poweredBy">
184 <div class="clear"></div>
185 <div class="clear"></div>
186 <div class="clear"></div>
187 <a href="https://code.google.com/p/hyracks/" title="Hyracks" class="builtBy">
188 <img class="builtBy" alt="Hyracks" src="../images/hyrax_ts.png" />
189 </a>
190 </div>
191 </div>
192 </div>
193
194
195 <div id="bodyColumn" class="span9" >
196
197 <!-- ! Licensed to the Apache Software Foundation (ASF) under one
198 ! or more contributor license agreements. See the NOTICE file
199 ! distributed with this work for additional information
200 ! regarding copyright ownership. The ASF licenses this file
201 ! to you under the Apache License, Version 2.0 (the
202 ! "License"); you may not use this file except in compliance
203 ! with the License. You may obtain a copy of the License at
204 !
205 ! http://www.apache.org/licenses/LICENSE-2.0
206 !
207 ! Unless required by applicable law or agreed to in writing,
208 ! software distributed under the License is distributed on an
209 ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
210 ! KIND, either express or implied. See the License for the
211 ! specific language governing permissions and limitations
212 ! under the License.
213 ! --><h1>AsterixDB Temporal Functions: Allen&#x2019;s Relations</h1>
214<div class="section">
215<h2><a name="Table_of_Contents"></a><a name="toc" id="toc">Table of Contents</a></h2>
216
217<ul>
218
219<li><a href="#AboutAllensRelations">About Allen&#x2019;s Relations</a></li>
220
221<li><a href="#AllensRelatonsFunctions">Allen&#x2019;s Relations Functions</a></li>
222</ul></div>
223<div class="section">
224<h2><a name="About_Allens_Relations_Back_to_TOC"></a><a name="AboutAllensRelations" id="AboutAllensRelations">About Allen&#x2019;s Relations</a> <font size="4"><a href="#toc">[Back to TOC]</a></font></h2>
225<p>AsterixDB supports Allen&#x2019;s relations over interval types. Allen&#x2019;s relations are also called Allen&#x2019;s interval algebra. There are totally 13 base relations described by this algebra, and all of them are supported in AsterixDB (note that <tt>interval-equals</tt> is supported by the <tt>=</tt> comparison symbol so there is no extra function for it). </p>
226<p>A detailed description of Allen&#x2019;s relations can be found from its <a class="externalLink" href="http://en.wikipedia.org/wiki/Allen&apos;s_interval_algebra">wikipedia entry</a>. </p></div>
227<div class="section">
228<h2><a name="Allens_Relations_Functions_Back_to_TOC"></a><a name="AllensRelatonsFunctions" id="AllensRelatonsFunctions">Allen&#x2019;s Relations Functions</a> <font size="4"><a href="#toc">[Back to TOC]</a></font></h2>
229<div class="section">
230<h3><a name="interval-before_interval-after"></a>interval-before, interval-after</h3>
231
232<ul>
233
234<li>
235<p>Syntax:</p>
236
237<div class="source">
238<div class="source">
239<pre>interval-before(interval1, interval2)
240interval-after(interval1, interval2)
241</pre></div></div></li>
242
243<li>
244<p>These two functions check whether an interval happens before/after another interval. </p></li>
245
246<li>Arguments:
247
248<ul>
249
250<li><tt>interval1</tt>, <tt>interval2</tt>: two intervals to be compared</li>
251 </ul></li>
252
253<li>
254<p>Return Value:</p>
255<p>A <tt>boolean</tt> value. Specifically, <tt>interval-before(interval1, interval2)</tt> is true if and only if <tt>interval1.end &lt; interval2.start</tt>, and <tt>interval-after(interval1, interval2)</tt> is true if and only if <tt>interval1.start &gt; interval2.end</tt>. If any of the two inputs is <tt>null</tt>, <tt>null</tt> is returned.</p></li>
256
257<li>
258<p>Examples:</p>
259
260<div class="source">
261<div class="source">
262<pre>let $itv1 := interval-from-date(&quot;2000-01-01&quot;, &quot;2005-01-01&quot;)
263let $itv2 := interval-from-date(&quot;2005-05-01&quot;, &quot;2012-09-09&quot;)
264return {&quot;interval-before&quot;: interval-before($itv1, $itv2), &quot;interval-after&quot;: interval-after($itv2, $itv1)}
265</pre></div></div></li>
266
267<li>
268<p>The expected result is:</p>
269
270<div class="source">
271<div class="source">
272<pre>{ &quot;interval-before&quot;: true, &quot;interval-after&quot;: true }
273</pre></div></div></li>
274</ul></div>
275<div class="section">
276<h3><a name="interval-covers_interval-covered-by"></a>interval-covers, interval-covered-by</h3>
277
278<ul>
279
280<li>
281<p>Syntax:</p>
282
283<div class="source">
284<div class="source">
285<pre>interval-covers(interval1, interval2)
286interval-covered-by(interval1, interval2)
287</pre></div></div></li>
288
289<li>
290<p>These two functions check whether one interval covers the other interval.</p></li>
291
292<li>Arguments:
293
294<ul>
295
296<li><tt>interval1</tt>, <tt>interval2</tt>: two intervals to be compared</li>
297 </ul></li>
298
299<li>
300<p>Return Value:</p>
301<p>A <tt>boolean</tt> value. Specifically, <tt>interval-covers(interval1, interval2)</tt> is true if and only if</p>
302
303<div class="source">
304<div class="source">
305<pre>interval1.start &lt;= interval2.start
306AND interval1.end &gt;= interval2.end
307</pre></div></div>
308<p><tt>interval-covered-by(interval1, interval2)</tt> is true if and only if</p>
309
310<div class="source">
311<div class="source">
312<pre>interval2.start &lt;= interval1.start
313AND interval2.end &gt;= interval1.end
314</pre></div></div>
315<p>For both functions, if any of the two inputs is <tt>null</tt>, <tt>null</tt> is returned.</p></li>
316
317<li>
318<p>Examples:</p>
319
320<div class="source">
321<div class="source">
322<pre>let $itv1 := interval-from-date(&quot;2000-01-01&quot;, &quot;2005-01-01&quot;)
323let $itv2 := interval-from-date(&quot;2000-03-01&quot;, &quot;2004-09-09&quot;)
324let $itv3 := interval-from-date(&quot;2006-08-01&quot;, &quot;2007-03-01&quot;)
325let $itv4 := interval-from-date(&quot;2004-09-10&quot;, &quot;2012-08-01&quot;)
326return {&quot;interval-covers&quot;: interval-covers($itv1, $itv2), &quot;interval-covered-by&quot;: interval-covered-by($itv3, $itv4)}
327</pre></div></div></li>
328
329<li>
330<p>The expected result is:</p>
331
332<div class="source">
333<div class="source">
334<pre>{ &quot;interval-covers&quot;: true, &quot;interval-covered-by&quot;: true }
335</pre></div></div></li>
336</ul></div>
337<div class="section">
338<h3><a name="interval-overlaps_interval-overlapped-by"></a>interval-overlaps, interval-overlapped-by</h3>
339
340<ul>
341
342<li>
343<p>Syntax:</p>
344
345<div class="source">
346<div class="source">
347<pre>interval-overlaps(interval1, interval2)
348interval-overlapped-by(interval1, interval2)
349</pre></div></div></li>
350
351<li>
352<p>These functions check whether two intervals overlap with each other.</p></li>
353
354<li>Arguments:
355
356<ul>
357
358<li><tt>interval1</tt>, <tt>interval2</tt>: two intervals to be compared</li>
359 </ul></li>
360
361<li>
362<p>Return Value:</p>
363<p>A <tt>boolean</tt> value. Specifically, <tt>interval-overlaps(interval1, interval2)</tt> is true if and only if</p>
364
365<div class="source">
366<div class="source">
367<pre>interval1.start &lt; interval2.start
368AND interval2.end &gt; interval1.end
369AND interval1.end &gt; interval2.start
370</pre></div></div>
371<p><tt>interval-overlapped-by(interval1, interval2)</tt> is true if and only if</p>
372
373<div class="source">
374<div class="source">
375<pre>interval2.start &lt; interval1.start
376AND interval1.end &gt; interval2.end
377AND interval2.end &gt; interval1.start
378</pre></div></div>
379<p>For all these functions, if any of the two inputs is <tt>null</tt>, <tt>null</tt> is returned.</p>
380<p>Note that <tt>interval-overlaps</tt> and <tt>interval-overlapped-by</tt> are following the Allen&#x2019;s relations on the definition of overlap.</p></li>
381
382<li>
383<p>Examples:</p>
384
385<div class="source">
386<div class="source">
387<pre>let $itv1 := interval-from-date(&quot;2000-01-01&quot;, &quot;2005-01-01&quot;)
388let $itv2 := interval-from-date(&quot;2004-05-01&quot;, &quot;2012-09-09&quot;)
389let $itv3 := interval-from-date(&quot;2006-08-01&quot;, &quot;2007-03-01&quot;)
390let $itv4 := interval-from-date(&quot;2004-09-10&quot;, &quot;2006-12-31&quot;)
391return {&quot;overlaps&quot;: interval-overlaps($itv1, $itv2),
392 &quot;overlapped-by&quot;: interval-overlapped-by($itv3, $itv4)}
393</pre></div></div></li>
394
395<li>
396<p>The expected result is:</p>
397
398<div class="source">
399<div class="source">
400<pre>{ &quot;overlaps&quot;: true, &quot;overlapped-by&quot;: true }
401</pre></div></div></li>
402</ul></div>
403<div class="section">
404<h3><a name="interval-overlapping"></a>interval-overlapping</h3>
405<p>Note that <tt>interval-overlapping</tt> is not an Allen&#x2019;s Relation, but syntactic sugar we added for the case that the intersect of two intervals is not empty. Basically this function returns true if any of these functions return true: <tt>interval-overlaps</tt>, <tt>interval-overlapped-by</tt>, <tt>interval-covers</tt>, or <tt>interval-covered-by</tt>.</p>
406
407<ul>
408
409<li>
410<p>Syntax:</p>
411
412<div class="source">
413<div class="source">
414<pre>interval-overlapping(interval1, interval2)
415</pre></div></div></li>
416
417<li>
418<p>This functions check whether two intervals share any points with each other. </p></li>
419
420<li>Arguments:
421
422<ul>
423
424<li><tt>interval1</tt>, <tt>interval2</tt>: two intervals to be compared</li>
425 </ul></li>
426
427<li>
428<p>Return Value:</p>
429<p>A <tt>boolean</tt> value. Specifically, <tt>interval-overlapping(interval1, interval2)</tt> is true if</p>
430
431<div class="source">
432<div class="source">
433<pre>(interval2.start &gt;= interval1.start
434AND interval2.start &lt; interval1.end)
435OR
436(interval2.end &gt; interval1.start
437AND interval2.end &lt;= interval1.end)
438</pre></div></div>
439<p>If any of the two inputs is <tt>null</tt>, <tt>null</tt> is returned.</p></li>
440
441<li>
442<p>Examples:</p>
443
444<div class="source">
445<div class="source">
446<pre>let $itv1 := interval-from-date(&quot;2000-01-01&quot;, &quot;2005-01-01&quot;)
447let $itv2 := interval-from-date(&quot;2004-05-01&quot;, &quot;2012-09-09&quot;)
448let $itv3 := interval-from-date(&quot;2006-08-01&quot;, &quot;2007-03-01&quot;)
449let $itv4 := interval-from-date(&quot;2004-09-10&quot;, &quot;2006-12-31&quot;)
450return {&quot;overlapping1&quot;: interval-overlapping($itv1, $itv2),
451 &quot;overlapping2&quot;: interval-overlapping($itv3, $itv4)}
452</pre></div></div></li>
453
454<li>
455<p>The expected result is:</p>
456
457<div class="source">
458<div class="source">
459<pre>{ &quot;overlapping1&quot;: true, &quot;overlapping2&quot;: true }
460</pre></div></div></li>
461</ul></div>
462<div class="section">
463<h3><a name="interval-meets_interval-met-by"></a>interval-meets, interval-met-by</h3>
464
465<ul>
466
467<li>
468<p>Syntax:</p>
469
470<div class="source">
471<div class="source">
472<pre>interval-meets(interval1, interval2)
473interval-met-by(interval1, interval2)
474</pre></div></div></li>
475
476<li>
477<p>These two functions check whether an interval meets with another interval. </p></li>
478
479<li>Arguments:
480
481<ul>
482
483<li><tt>interval1</tt>, <tt>interval2</tt>: two intervals to be compared</li>
484 </ul></li>
485
486<li>
487<p>Return Value:</p>
488<p>A <tt>boolean</tt> value. Specifically, <tt>interval-meets(interval1, interval2)</tt> is true if and only if <tt>interval1.end = interval2.start</tt>, and <tt>interval-met-by(interval1, interval2)</tt> is true if and only if <tt>interval1.start = interval2.end</tt>. If any of the two inputs is <tt>null</tt>, <tt>null</tt> is returned.</p></li>
489
490<li>
491<p>Examples:</p>
492
493<div class="source">
494<div class="source">
495<pre>let $itv1 := interval-from-date(&quot;2000-01-01&quot;, &quot;2005-01-01&quot;)
496let $itv2 := interval-from-date(&quot;2005-01-01&quot;, &quot;2012-09-09&quot;)
497let $itv3 := interval-from-date(&quot;2006-08-01&quot;, &quot;2007-03-01&quot;)
498let $itv4 := interval-from-date(&quot;2004-09-10&quot;, &quot;2006-08-01&quot;)
499return {&quot;meets&quot;: interval-meets($itv1, $itv2), &quot;metby&quot;: interval-met-by($itv3, $itv4)}
500</pre></div></div></li>
501
502<li>
503<p>The expected result is:</p>
504
505<div class="source">
506<div class="source">
507<pre>{ &quot;meets&quot;: true, &quot;metby&quot;: true }
508</pre></div></div></li>
509</ul></div>
510<div class="section">
511<h3><a name="interval-starts_interval-started-by"></a>interval-starts, interval-started-by</h3>
512
513<ul>
514
515<li>
516<p>Syntax:</p>
517
518<div class="source">
519<div class="source">
520<pre>interval-starts(interval1, interval2)
521interval-started-by(interval1, interval2)
522</pre></div></div></li>
523
524<li>
525<p>These two functions check whether one interval starts with the other interval.</p></li>
526
527<li>Arguments:
528
529<ul>
530
531<li><tt>interval1</tt>, <tt>interval2</tt>: two intervals to be compared</li>
532 </ul></li>
533
534<li>
535<p>Return Value:</p>
536<p>A <tt>boolean</tt> value. Specifically, <tt>interval-starts(interval1, interval2)</tt> returns true if and only if</p>
537
538<div class="source">
539<div class="source">
540<pre>interval1.start = interval2.start
541AND interval1.end &lt;= interval2.end
542</pre></div></div>
543<p><tt>interval-started-by(interval1, interval2)</tt> returns true if and only if</p>
544
545<div class="source">
546<div class="source">
547<pre>interval1.start = interval2.start
548AND interval2.end &lt;= interval1.end
549</pre></div></div>
550<p>For both functions, if any of the two inputs is <tt>null</tt>, <tt>null</tt> is returned.</p></li>
551
552<li>
553<p>Examples:</p>
554
555<div class="source">
556<div class="source">
557<pre>let $itv1 := interval-from-date(&quot;2000-01-01&quot;, &quot;2005-01-01&quot;)
558let $itv2 := interval-from-date(&quot;2000-01-01&quot;, &quot;2012-09-09&quot;)
559let $itv3 := interval-from-date(&quot;2006-08-01&quot;, &quot;2007-03-01&quot;)
560let $itv4 := interval-from-date(&quot;2006-08-01&quot;, &quot;2006-08-01&quot;)
561return {&quot;interval-starts&quot;: interval-starts($itv1, $itv2), &quot;interval-started-by&quot;: interval-started-by($itv3, $itv4)}
562</pre></div></div></li>
563
564<li>
565<p>The expected result is:</p>
566
567<div class="source">
568<div class="source">
569<pre>{ &quot;interval-starts&quot;: true, &quot;interval-started-by&quot;: true }
570</pre></div></div></li>
571</ul></div>
572<div class="section">
573<h3><a name="interval-ends_interval-ended-by"></a>interval-ends, interval-ended-by</h3>
574
575<ul>
576
577<li>
578<p>Syntax:</p>
579
580<div class="source">
581<div class="source">
582<pre>interval-ends(interval1, interval2)
583interval-ended-by(interval1, interval2)
584</pre></div></div></li>
585
586<li>
587<p>These two functions check whether one interval ends with the other interval.</p></li>
588
589<li>Arguments:
590
591<ul>
592
593<li><tt>interval1</tt>, <tt>interval2</tt>: two intervals to be compared</li>
594 </ul></li>
595
596<li>
597<p>Return Value:</p>
598<p>A <tt>boolean</tt> value. Specifically, <tt>interval-ends(interval1, interval2)</tt> returns true if and only if</p>
599
600<div class="source">
601<div class="source">
602<pre>interval1.end = interval2.end
603AND interval1.start &gt;= interval2.start
604</pre></div></div>
605<p><tt>interval-ended-by(interval1, interval2)</tt> returns true if and only if</p>
606
607<div class="source">
608<div class="source">
609<pre>interval2.end = interval1.end
610AND interval2.start &gt;= interval1.start
611</pre></div></div>
612<p>For both functions, if any of the two inputs is <tt>null</tt>, <tt>null</tt> is returned.</p></li>
613
614<li>
615<p>Examples:</p>
616
617<div class="source">
618<div class="source">
619<pre>let $itv1 := interval-from-date(&quot;2000-01-01&quot;, &quot;2005-01-01&quot;)
620let $itv2 := interval-from-date(&quot;1998-01-01&quot;, &quot;2005-01-01&quot;)
621let $itv3 := interval-from-date(&quot;2006-08-01&quot;, &quot;2007-03-01&quot;)
622let $itv4 := interval-from-date(&quot;2006-09-10&quot;, &quot;2007-03-01&quot;)
623return {&quot;interval-ends&quot;: interval-ends($itv1, $itv2), &quot;interval-ended-by&quot;: interval-ended-by($itv3, $itv4) }
624</pre></div></div></li>
625
626<li>
627<p>The expected result is:</p>
628
629<div class="source">
630<div class="source">
631<pre>{ &quot;interval-ends&quot;: true, &quot;interval-ended-by&quot;: true }
632</pre></div></div></li>
633</ul></div></div>
634 </div>
635 </div>
636 </div>
637
638 <hr/>
639
640 <footer>
641 <div class="container-fluid">
642 <div class="row span12">Copyright &copy; 2015
643 <a href="http://www.apache.org/">The Apache Software Foundation</a>.
644 All Rights Reserved.
645
646 </div>
647
648 <?xml version="1.0" encoding="UTF-8"?>
649<div class="row-fluid">Apache AsterixDB, AsterixDB, Apache, the Apache
650 feather logo, and the Apache AsterixDB project logo are either
651 registered trademarks or trademarks of The Apache Software
652 Foundation in the United States and other countries.
653 All other marks mentioned may be trademarks or registered
654 trademarks of their respective owners.</div>
655
656
657 </div>
658 </footer>
659 </body>
660</html>