*** empty log message ***
[m17n/m17n-db.git] / FORMATS / IM.txt
1 /* Copyright (C) 2003, 2004, 2005
2      National Institute of Advanced Industrial Science and Technology (AIST)
3      Registration Number H15PRO112
4    See the end for copying conditions.  */
5
6 /***en
7
8 @page mdbIM Input Method
9
10 @section im-description DESCRIPTION
11
12 The m17n library provides a driver for input methods that are
13 dynamically loadable from the m17n database (see @ref m17nInputMethod
14 @latexonly (P.\pageref{group__m17nInputMethod}) @endlatexonly).
15
16 This section describes the data format that defines those input
17 methods.
18
19 @section im-format SYNTAX and SEMANTICS
20
21 The following data format defines an input method.  The driver loads a
22 definition from a file, a stream, etc.  The definition is converted
23 into the form of plist in the driver.
24
25 @verbatim
26 INPUT-METHOD ::=
27     IM-DECLARATION ? DESCRIPTION ? VARIABLE-LIST ? COMMAND-LIST ?
28     TITLE MAP-LIST MACRO-LIST ? MODULE-LIST ? STATE-LIST
29
30 IM-DECLARATION ::= '(' 'input-method' LANGUAGE NAME ')'
31 DESCRIPTION ::= '(' 'description' MTEXT ')'
32 VARIABLE-LIST ::= '(' 'variable' VARIABLE-DECLARATION * ')'
33 COMMAND-LIST ::= '(' 'command' COMMAND-DECLARATION * ')'
34 TITLE ::= '(' 'title' TITLE-TEXT ')'
35
36 VARIABLE-DECLARATION ::=
37     '(' VAR-NAME [ VAR-DESCRIPTION | nil ] VALUE VALUE-CANDIDATE * ')'
38
39 COMMAND-DECLARATION ::=
40     '(' CMD-NAME [ CMD-DESCRIPTION | nil ] KEYSEQ * ')'
41
42 LANGUAGE ::= SYMBOL
43 NAME ::= SYMBOL
44 IM-DESCRIPTION ::= MTEXT
45 VAR-NAME ::= SYMBOL
46 VAR-DESCRIPTION ::= MTEXT
47 VALUE ::= MTEXT | SYMBOL | INTEGER
48 VALUE-CANDIDATE ::= VALUE | '(' RANGE-FROM RANGE-TO ')'
49 RANGE-FROM ::= INTEGER
50 RANGE-TO ::= INTEGER
51 CMD-NAME ::= SYMBOL
52 CMD-DESCRIPTION ::= MTEXT
53 TITLE-TEXT ::= MTEXT
54 @endverbatim
55
56 @c IM-DECLARATION specifies the language and name of this input
57 method.
58
59 @c DESCRIPTION specifies @c MTEXT as the description text of this
60 input method.
61
62 @c VARIABLE-DECLARATION declares a variable used in this input method.
63 If a variable must be initialized to the default value, or is to be
64 customized by a user, it must be declared here.
65
66 @c COMMAND-DECLARATION declares a command used in this input method.
67 If a command must be bound to the default key sequence, or is to be
68 customized by a user, it must be declared here.
69
70 @c TITLE-TEXT is a text displayed on the screen when this input method
71 is active.
72
73 @verbatim
74 MAP-LIST ::= '(' 'map' MAP * ')'
75
76 MAP ::= '(' MAP-NAME RULE * ')'
77
78 MAP-NAME ::= SYMBOL
79
80 RULE ::= '(' KEYSEQ MAP-ACTION * ')'
81
82 KEYSEQ ::= MTEXT | '(' [ SYMBOL | INTEGER ] * ')'
83 @endverbatim
84
85 @c SYMBOL in the definitions of @c MAP-NAME must not be @c t nor @c
86 nil.
87
88 @c MTEXT in the definition of @c KEYSEQ consists of characters that
89 can be generated by a keyboard.  Therefore @c MTEXT usually contains
90 only ASCII characters.  However, if the input method is intended to be
91 used, for instance, with a West European keyboard, @c MTEXT may
92 contain Latin-1 characters.
93
94 @c SYMBOL in the definition of @c KEYSEQ must be the return value of
95 the minput_event_to_key () function.
96
97 @c INTEGER in the definition of @c KEYSEQ must be a valid character
98 code.
99
100 @verbatim
101 MAP-ACTION ::= ACTION
102
103 ACTION ::= INSERT | DELETE | SELECT | MOVE | MARK
104            | SHOW | HIDE | PUSHBACK | UNDO | UNHANDLE | SHIFT | CALL
105            | SET | IF | COND | '(' MACRO-NAME ')'
106
107 PREDEFINED-SYMBOL ::=
108     '@0' | '@1' | '@2' | '@3' | '@4'
109     | '@5' | '@6' | '@7' | '@8' | '@9'
110     | '@<' | '@=' | '@>' | '@-' | '@+' | '@[' | '@]'
111     | '@@
112     | '@-N | '@+N
113 @endverbatim
114 @verbatim
115 MACRO-LIST ::= '(' 'macro' MACRO * ')'
116
117 MACRO ::= '(' MACRO-NAME MACRO-ACTION * ')'
118
119 MACRO-NAME ::= SYMBOL
120
121 MACRO-ACTION ::= ACTION
122 @endverbatim
123 @verbatim
124 MODULE-LIST ::= '(' 'module' MODULE * ')'
125
126 MODULE ::= '(' MODULE-NAME FUNCTION * ')'
127
128 MODULE-NAME ::= SYMBOL
129
130 FUNCTION ::= SYMBOL
131 @endverbatim
132
133 Each @c MODULE declares the name of external module (i.e. dynamic
134 library) and function names exported by the module.  If a @c FUNCTION has
135 name "init", it is called with only the default arguments (see the
136 section about @c CALL) when an input context is created for the input
137 method.  If a @c FUNCTION has name "fini", it is called with only the
138 default arguments when an input context is destroyed.
139
140 @verbatim
141 STATE-LIST ::= '(' 'state' STATE * ')'
142
143 STATE ::= '(' STATE-NAME [ STATE-TITLE-TEXT ] BRANCH * ')'
144
145 STATE-NAME ::= SYMBOL
146
147 STATE-TITLE-TEXT ::= MTEXT
148
149 BRANCH ::= '(' MAP-NAME BRANCH-ACTION * ')'
150            | '(' nil BRANCH-ACTION * ')'
151            | '(' t BRANCH-ACTION * ')'
152 @endverbatim
153
154 The optional @c STATE-TITLE-TEXT specifies a title text displayed on
155 the screen when the input method is in this state.  If @c
156 STATE-TITLE-TEXT is omitted, @c TITLE-TEXT is used.
157
158 In the first form of @c BRANCH, @c MAP-NAME must be an item that
159 appears in @c MAP.  In this case, if a key sequence matching one of @c
160 KEYSEQs of @c MAP-NAME is typed, @c BRANCH-ACTIONs are executed.
161
162 In the second form of @c BRANCH, @c BRANCH-ACTIONs are executed if a
163 key sequence that doesn't match any of @c Branch's of the current
164 state is typed.
165
166 In the third form of @c BRANCH, @c BRANCH-ACTIONs are executed when
167 shifted to the current state.  If the current state is the initial
168 state, @c BRANCH-ACTIONs are executed also when an input context of
169 the input method is created.
170
171 @verbatim
172 BRANCH-ACTION ::= ACTION
173 @endverbatim
174
175 An input method has the following two lists of symbols.
176
177 <ul>
178 <li> marker list
179
180 A marker is a symbol indicating a character position in the preediting
181 text.  The @c MARK action assigns a position to a marker.  The
182 position of a marker is referred by the @c MOVE and the @c DELETE actions.
183
184 <li> variable list
185
186 A variable is a symbol associated with an integer value.  The value of
187 a variable is set by the @c SET action, and is referred by the @c SET,
188 the @c INSERT, and the @c IF actions.  All variables are implicitly
189 initialized to zero.
190
191 </ul>
192
193 Each @c PREDEFINED-SYMBOL has a special meaning when used as a marker.
194
195 <ul>
196 <li> @c @@0, @c @@1, @c @@2, @c @@3, @c @@4, @c @@5, @c @@6, @c @@7, @c @@8, @c @@9
197
198 The 0th, 1st, 2nd, ... 9th position respectively.
199
200 <li> @c @@<, @c @@=, @c @@>
201
202 The first, the current, and the last position.
203
204 <li> @c @@-, @c @@+
205
206 The previous and the next position.
207
208 <li> @c @@[, @c @@]
209
210 The previous and the next position where a candidate list changes.
211 </ul>
212
213 Some of the @c PREDEFINED-SYMBOL has a special meaning when used as a candidate
214 index in the @c SELECT action.
215
216 <ul>
217
218 <li> @c @@<, @c @@=, @c @@>
219
220 The first, the current, and the last candidate of the current candidate group.
221
222 <li> @c @@-
223
224 The previous candidate.  If the current candidate is the first one in
225 the current candidate group, then it means the last candidate in the
226 previous candidate group.
227
228 <li> @c @@+
229
230 The next candidate.  If the current candidate is the last one in the
231 current candidate group, then it means the first candidate in the next
232 candidate group.
233
234 <li> @c @@[, @c @@]
235
236 The candidate in the previous and the next candidate group having the same
237 candidate index as the current one.
238 </ul>
239
240 And, this also has a special meaning.
241
242 <ul>
243 <li> @c @@@
244
245 Number of handled keys at that moment.
246
247 </ul>
248
249 These are for supporting surround text handling.
250
251 <ul>
252 <li> @c @@-N
253
254 Here, @c N is a positive integer.  The value is a character at Nth
255 previous position from the current caret of the surrounding text.
256 When this is used as the argument of @c delete action, it specifies
257 how many preceding characters in the surround text to delete.
258
259 <li> @c @@+N
260
261 Here, @c N is a positive integer.  The value is a character at Nth
262 next position from the current caret of the surrounding text.
263 When this is used as the argument of @c delete action, it specifies
264 how many following characters in the surround text to delete.
265 </ul>
266
267 The arguments and the behavior of each action are listed below.
268
269 @verbatim
270 INSERT ::= '(' 'insert' MTEXT ')'
271            | MTEXT
272            | INTEGER
273            | '(' 'insert' SYMBOL ')'
274            | '(' 'insert' '(' CANDIDATES * ')' ')'
275            | '(' CANDIDATES * ')' 
276
277 CANDIDATES ::= MTEXT | '(' MTEXT * ')'
278 @endverbatim
279
280 The first and second forms insert @c MTEXT before the current position.
281
282 The third form inserts the character @c INTEGER before the current
283 position.
284
285 The fourth form treats @c SYMBOL as a variable, and inserts its value
286 (if it is a valid character code) before the current position.
287
288 In the fifth and sixth forms, each @c CANDIDATES represents a
289 candidate group, and each element of @c CANDIDATES represents a
290 candidate, i.e. if @c CANDIDATES is an M-text, the candidates are the
291 characters in the M-text; if @c CANDIDATES is a list of M-texts, the
292 candidates are the M-texts in the list.
293
294 These forms insert the first candidate before the current position.
295 The inserted string is associated with the list of candidates and
296 the information indicating the currently selected candidate.
297
298 The marker positions affected by the insertion are automatically relocated.
299
300 @verbatim
301 DELETE ::= '(' 'delete' SYMBOL ')'
302            | '(' 'delete' INTEGER ')'
303 @endverbatim
304
305 The first form treats @c SYMBOL as a marker, and deletes characters
306 between the current position and the marker position.
307
308 The second form treats @c INTEGER as a character position, and deletes
309 characters between the current position and the character position.
310
311 The marker positions affected by the deletion are automatically relocated.
312
313 @verbatim
314 SELECT ::= '(' 'select' PREDEFINED-SYMBOL ')'
315            | '(' 'select' INTEGER ')'
316 @endverbatim
317
318 This action first checks if the character just before the current position
319 belongs to a string that is associated with a candidate list.  If it is,
320 the action replaces that string with a candidate specified by the
321 argument.
322
323 The first form treats @c PREDEFINED-SYMBOL as a candidate index (as
324 described above) that specifies a new candidate in the candidate list.
325
326 The second form treats @c INTEGER as a candidate index that specifies a
327 new candidate in the candidate list.
328
329 @verbatim
330 SHOW ::= '(show)'
331 @endverbatim
332
333 This actions instructs the input method driver to display a candidate
334 list associated with the string before the current position.
335
336 @verbatim
337 HIDE ::= '(hide)'
338 @endverbatim
339
340 This action instructs the input method driver to hide the currently
341 displayed candidate list.
342
343 @verbatim
344 MOVE ::= '(' 'move' SYMBOL ')'
345          | '(' 'move' INTEGER ')'
346 @endverbatim
347
348 The first form treats @c SYMBOL as a marker, and makes the marker
349 position be the new current position.
350
351 The second form treats @c INTEGER as a character position, and makes
352 that position be the new current position.
353
354 @verbatim
355 MARK ::= '(' 'mark' SYMBOL ')'
356 @endverbatim
357
358 This action treats @c SYMBOL as a marker, and sets its position to the
359 current position.  @c SYMBOL must not be a @c PREDEFINED-SYMBOL.
360
361 @verbatim
362 PUSHBACK :: = '(' 'pushback' INTEGER ')'
363               | '(' 'pushback' KEYSEQ ')'
364 @endverbatim
365
366 The first form pushes back the latest @c INTEGER number of key events
367 to the event queue if @c INTEGER is positive, and pushes back all key
368 events if @c INTEGER is zero.
369
370 The second form pushes back keys in @c KEYSEQ to the event queue.
371
372 @verbatim
373 UNDO :: = '(' 'undo' [ INTEGER | SYMBOL ] ')'
374 @endverbatim
375
376 If there's no argument, this action cancels the last two key events
377 (i.e. the one that invoked this command, and the previous one).
378
379 If there's an integer argument NUM, it must be positive or negative
380 (not zero).  If positive, the NUMth event to the last one are
381 canceled.  If negative the last (- NUM) events are canceled.
382
383 If there's a symbol argument, it must be resolved to an integer number
384 and the number is treated as the actual argument as above.
385
386 @verbatim
387 UNHANDLE :: = '(unhandle)'
388 @endverbatim
389
390 This action commit the current preedit and return the last key as
391 unhandled.
392
393 @verbatim
394 SHIFT :: = '(' 'shift' STATE-NAME ')'
395 @endverbatim
396
397 This action shifts the current state to @c STATE-NAME.  @c
398 STATE-NAME must appear in @c STATE-LIST.
399
400 @verbatim
401 CALL ::= '(' 'call' MODULE-NAME FUNCTION ARG * ')'
402
403 ARG ::= INTEGER | SYMBOL | MTEXT | PLIST
404 @endverbatim
405
406 This action calls the function @c FUNCTION of external module @c
407 MODULE-NAME.  @c MODULE-NAME and @c FUNCTION must appear in @c
408 MODULE-LIST.
409
410 The function is called with an argument of the type (#MPlist *).  The
411 key of the first element is #Mt and its value is a pointer to an
412 object of the type #MInputContext.  The key of the second element is
413 #Msymbol and its value is the current state name.  @c ARGs are used as
414 the value of the third and later elements.  Their keys are determined
415 automatically; if an @c ARG is an integer, the corresponding key is
416 #Minteger; if an @c ARG is a symbol, the corresponding key is
417 #Msymbol, etc.
418
419 The function must return NULL or a value of the type (#MPlist *) that
420 represents a list of actions to take.
421
422 @verbatim
423 SET ::= '(' CMD SYMBOL1 EXPRESSION ')'
424
425 CMD ::= 'set' | 'add' | 'sub' | 'mul' | 'div'
426
427 EXPRESSION ::= INTEGER | SYMBOL2 | '(' OPERAND EXPRESSION * ')'
428
429 OPERAND ::= '+' | '-' | '*' | '/' | '|' | '&' | '!'
430             | '=' | '<' | '>' | '<=' | '>='
431
432 @endverbatim
433
434 This action treats @c SYMBOL1 and @c SYMBOL2 as variables and sets the
435 value of @c SYMBOL1 as below.
436
437 If @c CMD is 'set', it sets the value of @c SYMBOL1 to the value of @c
438 EXPRESSION.
439
440 If @c CMD is 'add', it increments the value of @c SYMBOL1 by the value
441 of @c EXPRESSION.
442
443 If @c CMD is 'sub', it decrements the value of @c SYMBOL1 by the value
444 of @c EXPRESSION.
445
446 If @c CMD is 'mul', it multiplies the value of @c SYMBOL1 by the value
447 of @c EXPRESSION.
448
449 If @c CMD is 'div', it divides the value of @c SYMBOL1 by the value of
450 @c EXPRESSION.
451
452 @verbatim
453 IF ::= '(' CONDITION ACTION-LIST1 ACTION-LIST2 ')'
454
455 CONDITION ::= [ '=' | '<' | '>' | '<=' | '>=' ] EXPRESSION1 EXPRESSION2
456
457 ACTION-LIST1 ::= '(' ACTION * ')'
458
459 ACTION-LIST2 ::= '(' ACTION * ')'
460 @endverbatim
461
462 This action performs actions in @c ACTION-LIST1 if @c CONDITION is
463 true, and performs @c ACTION-LIST2 (if any) otherwise.
464
465 @c SYMBOL1 and @c SYMBOL2 are treated as variables.
466
467 @verbatim
468 COND ::= '(' 'cond' [ '(' EXPRESSION ACTION * ') ] * ')'
469 @endverbatim
470
471 This action performs the first action @c ACTION whose corresponding
472 @c EXPRESSION has nonzero value.
473
474 @ifnot FOR-MAN
475
476 @section im-example1 EXAMPLE 1
477
478 This is a very simple example for inputting Latin characters with
479 diacritical marks (acute and cedilla).  For instance, when you type:
480 @verbatim
481     Comme'die-Franc,aise, chic,,
482 @endverbatim
483 you will get this:
484 @if FOR-HTML
485 @verbatim
486     Commédie-Française, chic,
487 @endverbatim
488 @endif
489 @if FOR-LATEX
490 @latexonly
491 \hskip5mm\texttt{\footnotesize Comm\'{e}die-Fran\c{c}aise, chic,}
492 @endlatexonly
493 @endif
494
495 The definition of the input method is very simple as below, and it is
496 quite straight forward to extend it to cover all Latin characters.
497
498 @if FOR-HTML
499 @verbatim
500 (title "latin-postfix")
501 (map
502  (trans
503   ("a'" ?á) ("e'" ?é) ("i'" ?í) ("o'" ?ó) ("u'" ?ú) ("c," ?ç)
504   ("A'" ?Á) ("E'" ?É) ("I'" ?Í) ("O'" ?Ó) ("U'" ?Ú) ("C," ?Ç)
505   ("a''" "a'") ("e''" "e'") ("i''" "i'") ("o''" "o'") ("u''" "u'")
506   ("c,," "c,")
507   ("A''" "A'") ("E''" "E'") ("I''" "I'") ("O''" "O'") ("U''" "U'")
508   ("C,," "C,")))
509 (state
510  (init
511   (trans)))
512 @endverbatim
513 @endif
514 @if FOR-LATEX
515 @latexonly
516 \texttt{\footnotesize
517 \hskip2mm(title "latin-postfix")\\
518 \hskip2mm(map\\
519 \hskip4mm (trans\\
520 \hskip6mm  ("a'" ?\'{a}) ("e'" ?\'{e}) ("i'" ?\'{i}) ("o'" ?\'{o})
521 ("u'" ?\'{u}) ("c," ?\c{c})\\
522 \hskip6mm  ("A'" ?\'{A}) ("E'" ?\'{E}) ("I'" ?\'{I}) ("O'" ?\'{O})
523 ("U'" ?\'{U}) ("C," ?\c{C})\\
524 \hskip6mm  ("a''" "a'") ("e''" "e'") ("i''" "i'") ("o''" "o'") ("u''" "u'")\\
525 \hskip6mm  ("c,," "c,")\\
526 \hskip6mm  ("A''" "A'") ("E''" "E'") ("I''" "I'") ("O''" "O'") ("U''" "U'")\\
527 \hskip6mm  ("C,," "C,")))\\
528 \hskip2mm(state\\
529 \hskip4mm (init\\
530 \hskip6mm  (trans)))}
531 @endlatexonly
532 @endif
533
534 @section im-example2 EXAMPLE 2
535
536 This example is for inputting Unicode characters by typing C-u
537 (Control-u) followed by four hexadecimal numbers.  For instance, when
538 you type ("^u" means Control-u):
539 @verbatim
540     ^u2190^u2191^u2192^u2193
541 @endverbatim
542 you will get this (Unicode arrow symbols):
543 @verbatim
544     ←↑→↓
545 @endverbatim
546
547 The definition utilizes @c SET and @c IF commands as below:
548 @verbatim
549 (title "UNICODE")
550 (map
551  (starter
552   ((C-U) "U+"))
553  (hex
554   ("0" ?0) ("1" ?1) ... ("9" ?9) ("a" ?A) ("b" ?B) ... ("f" ?F)))
555 (state
556  (init
557   (starter (set code 0) (set count 0) (shift unicode)))
558  (unicode
559   (hex (set this @-)
560        (< this ?A
561           ((sub this 48))
562           ((sub this 55)))
563        (mul code 16) (add code this)
564        (add count 1)
565        (= count 4
566           ((delete @<) (insert code) (shift init))))))
567 @endverbatim
568
569 @section im-example3 EXAMPLE 3
570
571 This example is for inputting Chinese characters by typing PinYin key
572 sequence.
573 @if FOR-HTML
574 For instance, when you type:
575 @verbatim
576     nihaobei2jing2
577 @endverbatim
578 you will get:
579 @verbatim
580     你好北京
581 @endverbatim
582
583 The definition utilizes @c CANDIDATE and @c SELECT commands as below.
584 Note that this is just an example, and it ignores such important key
585 as Backspace.
586
587 @verbatim
588 (title "拼")
589
590 (map
591  ;; The initial character of Pinyin.
592  (starter
593   ("a") ("b") ... ("h") ("j") ... ("t") ("w") ("x") ("y") ("z"))
594
595  ;; Big table of Pinyin vs the corresponding Chinese characters.
596  (pinyin
597   ...
598   ("bei" ("被北备背悲辈杯倍贝碑" ...))
599   ("hao" ("好号毫豪浩耗皓嚎昊郝" ...))
600   ("jing" ("经京精境警竟静惊景敬" ...))
601   ("ni" ("你呢尼泥逆倪匿拟腻妮" ...))
602   ...)
603  ;; Typing 1, 2, ..., 0 selects the 0th, 1st, ..., 9th candidate.
604  (choose
605   ("1" (select 0)) ("2" (select 1)) ... ("9" (select 8)) ("0" (select 9))))
606
607 (state
608  (init
609   ;; When an initial character of Pinyin is typed, re-handle it in
610   ;; "main" state.  Anything else is just produced as is.
611   (starter (show) (pushback 1) (shift main)))
612
613  (main
614   ;; When a complete Pinyin sequence is typed, shift to "select" state
615   ;; to allow users to select one from the candidates.
616   (pinyin (shift select))
617
618   ;; When anything else is typed, produce the current candidate (if
619   ;; any), and re-handle the last input in "init" state.
620   (nil (hide) (shift init)))
621
622  (select
623   ;; When a number is typed, select the corresponding canidate,
624   ;; produce it, and shift to "init" state.
625   (choose (hide) (shift init))
626
627   ;; When anything else is typed, produce the current candidate,
628   ;; and re-handle the last input in "init" state.
629   (nil (hide) (shift init))))
630 @endverbatim
631
632 @elseif FOR-LATEX
633 @latexonly
634 \begin{center}
635 \fbox{This example is readable only in the documentation of HTML version.}
636 \end{center}
637 @endlatexonly
638 @endif
639
640 @endif
641
642 @section im-seealso SEE ALSO
643
644 @ref mim-list "Input Methods provided by the m17n database",
645 @ref mdbGeneral "mdbGeneral(5)"
646 */
647
648 /* 
649 Copyright (C) 2003, 2004, 2005
650   National Institute of Advanced Industrial Science and Technology (AIST)
651   Registration Number H15PRO112
652
653 This file is part of the m17n database; a sub-part of the m17n
654 library.
655
656 The m17n library is free software; you can redistribute it and/or
657 modify it under the terms of the GNU Lesser General Public License
658 as published by the Free Software Foundation; either version 2.1 of
659 the License, or (at your option) any later version.
660
661 The m17n library is distributed in the hope that it will be useful,
662 but WITHOUT ANY WARRANTY; without even the implied warranty of
663 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
664 Lesser General Public License for more details.
665
666 You should have received a copy of the GNU Lesser General Public
667 License along with the m17n library; if not, write to the Free
668 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
669 02111-1307, USA.
670 */
671
672 /* Local Variables: */
673 /* coding: utf-8 */
674 /* End: */