JSONiqTokenizer.ebnf 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544
  1. <?xqlint
  2. /* ***** BEGIN LICENSE BLOCK *****
  3. * Distributed under the BSD license:
  4. *
  5. * Copyright (c) 2010, Ajax.org B.V.
  6. * All rights reserved.
  7. *
  8. * Redistribution and use in source and binary forms, with or without
  9. * modification, are permitted provided that the following conditions are met:
  10. * * Redistributions of source code must retain the above copyright
  11. * notice, this list of conditions and the following disclaimer.
  12. * * Redistributions in binary form must reproduce the above copyright
  13. * notice, this list of conditions and the following disclaimer in the
  14. * documentation and/or other materials provided with the distribution.
  15. * * Neither the name of Ajax.org B.V. nor the
  16. * names of its contributors may be used to endorse or promote products
  17. * derived from this software without specific prior written permission.
  18. *
  19. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  20. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  21. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  22. * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
  23. * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  24. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  25. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  26. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  28. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29. *
  30. * ***** END LICENSE BLOCK ***** */
  31. define(function(require, exports, module){
  32. var JSONiqTokenizer = exports.JSONiqTokenizer = function JSONiqTokenizer(string, parsingEventHandler)
  33. {
  34. init(string, parsingEventHandler);
  35. ?>
  36. start ::= '<![CDATA['
  37. | '<!--'
  38. | '<?'
  39. | '(#'
  40. | '(:~'
  41. | '(:'
  42. | '"'
  43. | "'"
  44. | "}"
  45. | "{"
  46. | "("
  47. | ")"
  48. | "/"
  49. | "["
  50. | "]"
  51. | ","
  52. | "."
  53. | ";"
  54. | ":"
  55. | "!"
  56. | "|"
  57. | Annotation
  58. | ModuleDecl
  59. | OptionDecl
  60. | AttrTest
  61. | Wildcard
  62. | IntegerLiteral
  63. | DecimalLiteral
  64. | DoubleLiteral
  65. | Variable
  66. | EQName
  67. | Tag
  68. | Operator
  69. | EOF
  70. StartTag ::= '>' | '/>' | QName | "=" | '"' | "'" | EOF
  71. TagContent
  72. ::= ElementContentChar | Tag | EndTag | '<![CDATA[' | '<!--' | PredefinedEntityRef | CharRef | '{{' | '}}' | '{' | EOF
  73. /* ws: explicit */
  74. AposAttr
  75. ::= EscapeApos | AposAttrContentChar | PredefinedEntityRef | CharRef | '{{' | '}}' | '{' | "'" | EOF
  76. /* ws: explicit */
  77. QuotAttr
  78. ::= EscapeQuot | QuotAttrContentChar | PredefinedEntityRef | CharRef | '{{' | '}}' | '{' | '"' | EOF
  79. /* ws: explicit */
  80. CData ::= CDataSectionContents | ']]>' | EOF
  81. /* ws: explicit */
  82. XMLComment
  83. ::= DirCommentContents | '-->' | EOF
  84. /* ws: explicit */
  85. PI ::= DirPIContents | '?' | '?>' | EOF
  86. /* ws: explicit */
  87. Pragma ::= PragmaContents | '#' | '#)' | EOF
  88. /* ws: explicit */
  89. Comment ::= ':)' | '(:' | CommentContents | EOF
  90. /* ws: explicit */
  91. CommentDoc
  92. ::= DocTag | DocCommentContents | ':)' | '(:' | EOF
  93. /* ws: explicit */
  94. QuotString
  95. ::= PredefinedEntityRef | CharRef | EscapeQuot | QuotChar | '"' | EOF
  96. /* ws: explicit */
  97. AposString
  98. ::= PredefinedEntityRef | CharRef | EscapeApos | AposChar | "'" | EOF
  99. /* ws: explicit */
  100. Prefix ::= NCName
  101. _EQName ::= EQName
  102. Whitespace
  103. ::= S^WS
  104. /* ws: definition */
  105. EQName ::= FunctionName
  106. | 'attribute'
  107. | 'comment'
  108. | 'document-node'
  109. | 'element'
  110. | 'empty-sequence'
  111. | 'function'
  112. | 'if'
  113. | 'item'
  114. | 'namespace-node'
  115. | 'node'
  116. | 'processing-instruction'
  117. | 'schema-attribute'
  118. | 'schema-element'
  119. | 'switch'
  120. | 'text'
  121. | 'typeswitch'
  122. FunctionName
  123. ::= EQName^Token
  124. | 'after'
  125. | 'ancestor'
  126. | 'ancestor-or-self'
  127. | 'and'
  128. | 'as'
  129. | 'ascending'
  130. | 'before'
  131. | 'case'
  132. | 'cast'
  133. | 'castable'
  134. | 'child'
  135. | 'collation'
  136. | 'copy'
  137. | 'count'
  138. | 'declare'
  139. | 'default'
  140. | 'delete'
  141. | 'descendant'
  142. | 'descendant-or-self'
  143. | 'descending'
  144. | 'div'
  145. | 'document'
  146. | 'else'
  147. | 'empty'
  148. | 'end'
  149. | 'eq'
  150. | 'every'
  151. | 'except'
  152. | 'first'
  153. | 'following'
  154. | 'following-sibling'
  155. | 'for'
  156. | 'ge'
  157. | 'group'
  158. | 'gt'
  159. | 'idiv'
  160. | 'import'
  161. | 'insert'
  162. | 'instance'
  163. | 'intersect'
  164. | 'into'
  165. | 'is'
  166. | 'last'
  167. | 'le'
  168. | 'let'
  169. | 'lt'
  170. | 'mod'
  171. | 'modify'
  172. | 'module'
  173. | 'namespace'
  174. | 'ne'
  175. | 'only'
  176. | 'or'
  177. | 'order'
  178. | 'ordered'
  179. | 'parent'
  180. | 'preceding'
  181. | 'preceding-sibling'
  182. | 'rename'
  183. | 'replace'
  184. | 'return'
  185. | 'satisfies'
  186. | 'self'
  187. | 'some'
  188. | 'stable'
  189. | 'start'
  190. | 'to'
  191. | 'treat'
  192. | 'try'
  193. | 'union'
  194. | 'unordered'
  195. | 'validate'
  196. | 'where'
  197. | 'with'
  198. | 'xquery'
  199. | 'allowing'
  200. | 'at'
  201. | 'base-uri'
  202. | 'boundary-space'
  203. | 'break'
  204. | 'catch'
  205. | 'construction'
  206. | 'context'
  207. | 'continue'
  208. | 'copy-namespaces'
  209. | 'decimal-format'
  210. | 'encoding'
  211. | 'exit'
  212. | 'external'
  213. | 'ft-option'
  214. | 'in'
  215. | 'index'
  216. | 'integrity'
  217. | 'lax'
  218. | 'nodes'
  219. | 'option'
  220. | 'ordering'
  221. | 'revalidation'
  222. | 'schema'
  223. | 'score'
  224. | 'sliding'
  225. | 'strict'
  226. | 'tumbling'
  227. | 'type'
  228. | 'updating'
  229. | 'value'
  230. | 'variable'
  231. | 'version'
  232. | 'while'
  233. | 'constraint'
  234. | 'loop'
  235. | 'returning'
  236. NCName ::= NCName^Token
  237. | 'after'
  238. | 'and'
  239. | 'as'
  240. | 'ascending'
  241. | 'before'
  242. | 'case'
  243. | 'cast'
  244. | 'castable'
  245. | 'collation'
  246. | 'count'
  247. | 'default'
  248. | 'descending'
  249. | 'div'
  250. | 'else'
  251. | 'empty'
  252. | 'end'
  253. | 'eq'
  254. | 'except'
  255. | 'for'
  256. | 'ge'
  257. | 'group'
  258. | 'gt'
  259. | 'idiv'
  260. | 'instance'
  261. | 'intersect'
  262. | 'into'
  263. | 'is'
  264. | 'le'
  265. | 'let'
  266. | 'lt'
  267. | 'mod'
  268. | 'modify'
  269. | 'ne'
  270. | 'only'
  271. | 'or'
  272. | 'order'
  273. | 'return'
  274. | 'satisfies'
  275. | 'stable'
  276. | 'start'
  277. | 'to'
  278. | 'treat'
  279. | 'union'
  280. | 'where'
  281. | 'with'
  282. | 'ancestor'
  283. | 'ancestor-or-self'
  284. | 'attribute'
  285. | 'child'
  286. | 'comment'
  287. | 'copy'
  288. | 'declare'
  289. | 'delete'
  290. | 'descendant'
  291. | 'descendant-or-self'
  292. | 'document'
  293. | 'document-node'
  294. | 'element'
  295. | 'empty-sequence'
  296. | 'every'
  297. | 'first'
  298. | 'following'
  299. | 'following-sibling'
  300. | 'function'
  301. | 'if'
  302. | 'import'
  303. | 'insert'
  304. | 'item'
  305. | 'last'
  306. | 'module'
  307. | 'namespace'
  308. | 'namespace-node'
  309. | 'node'
  310. | 'ordered'
  311. | 'parent'
  312. | 'preceding'
  313. | 'preceding-sibling'
  314. | 'processing-instruction'
  315. | 'rename'
  316. | 'replace'
  317. | 'schema-attribute'
  318. | 'schema-element'
  319. | 'self'
  320. | 'some'
  321. | 'switch'
  322. | 'text'
  323. | 'try'
  324. | 'typeswitch'
  325. | 'unordered'
  326. | 'validate'
  327. | 'variable'
  328. | 'xquery'
  329. | 'allowing'
  330. | 'at'
  331. | 'base-uri'
  332. | 'boundary-space'
  333. | 'break'
  334. | 'catch'
  335. | 'construction'
  336. | 'context'
  337. | 'continue'
  338. | 'copy-namespaces'
  339. | 'decimal-format'
  340. | 'encoding'
  341. | 'exit'
  342. | 'external'
  343. | 'ft-option'
  344. | 'in'
  345. | 'index'
  346. | 'integrity'
  347. | 'lax'
  348. | 'nodes'
  349. | 'option'
  350. | 'ordering'
  351. | 'revalidation'
  352. | 'schema'
  353. | 'score'
  354. | 'sliding'
  355. | 'strict'
  356. | 'tumbling'
  357. | 'type'
  358. | 'updating'
  359. | 'value'
  360. | 'version'
  361. | 'while'
  362. | 'constraint'
  363. | 'loop'
  364. | 'returning'
  365. <?TOKENS?>
  366. ModuleDecl
  367. ::= ('import' S)? ('module' | 'schema') S 'namespace'
  368. Annotation
  369. ::= '%' EQName ?
  370. OptionDecl
  371. ::= 'declare' S ( ( 'decimal-format' | 'option' )
  372. | ('default' S 'decimal-format') )
  373. Operator ::= '!=' | ':=' | '>=' | '<=' | '=' | '<' | '>' | '-' | '+' | 'div' | '||' | '?'
  374. Variable ::= '$' EQName
  375. Tag ::= '<' QName
  376. EndTag ::= '</' QName S? '>'
  377. PragmaContents
  378. ::= ( Char* - ( Char* '#' Char* ) )+
  379. DirCommentContents
  380. ::= ( ( Char - '-' ) | '-' ( Char - '-' ) )+
  381. DirPIContents
  382. ::= ( Char* - ( Char* '?' Char* ) )+
  383. CDataSectionContents
  384. ::= ( Char+ - ( Char* ']]>' Char* ) ) & ']]'
  385. | ( Char+ - ( Char* ']]>' Char* ) ) & $
  386. AttrTest ::= "@" ( Wildcard | QName )
  387. Wildcard ::= "*"
  388. | (NCName ":" "*")
  389. | ("*" ":" NCName)
  390. | (BracedURILiteral "*")
  391. EQName ::= QName
  392. | URIQualifiedName
  393. URIQualifiedName
  394. ::= BracedURILiteral NCName
  395. BracedURILiteral
  396. ::= 'Q' '{' (PredefinedEntityRef | CharRef | [^&{}] )* '}'
  397. URILiteral
  398. ::= StringLiteral
  399. IntegerLiteral
  400. ::= Digits
  401. DecimalLiteral
  402. ::= '.' Digits
  403. | Digits '.' [0-9]*
  404. /* ws: explicit */
  405. DoubleLiteral
  406. ::= ( '.' Digits | Digits ( '.' [0-9]* )? ) [Ee] [+#x002D]? Digits
  407. /* ws: explicit */
  408. PredefinedEntityRef
  409. ::= '&' ( 'lt' | 'gt' | 'amp' | 'quot' | 'apos' ) ';'
  410. /* ws: explicit */
  411. EscapeQuot
  412. ::= '""'
  413. EscapeApos
  414. ::= "''"
  415. QuotChar ::= (Char - ["&])+
  416. AposChar ::= (Char - [&'])+
  417. ElementContentChar
  418. ::= (Char - [&<{}])+
  419. QuotAttrContentChar
  420. ::= (Char - ["&<{}])+
  421. AposAttrContentChar
  422. ::= (Char - [&'<{}])+
  423. PITarget ::= NCName - ( ( 'X' | 'x' ) ( 'M' | 'm' ) ( 'L' | 'l' ) )
  424. Name ::= NameStartChar NameChar*
  425. NameStartChar
  426. ::= [:A-Z_a-z#x00C0-#x00D6#x00D8-#x00F6#x00F8-#x02FF#x0370-#x037D#x037F-#x1FFF#x200C-#x200D#x2070-#x218F#x2C00-#x2FEF#x3001-#xD7FF#xF900-#xFDCF#xFDF0-#xFFFD#x10000-#xEFFFF]
  427. NameChar ::= NameStartChar
  428. | [-.0-9#x00B7#x0300-#x036F#x203F-#x2040]
  429. NCName ::= Name - ( Char* (':' | '.') Char* )
  430. Char ::= [#x0009#x000A#x000D#x0020-#xD7FF#xE000-#xFFFD#x10000-#x10FFFF]
  431. QName ::= PrefixedName
  432. | UnprefixedName
  433. PrefixedName
  434. ::= Prefix ':' LocalPart
  435. UnprefixedName
  436. ::= LocalPart
  437. Prefix ::= NCName
  438. LocalPart
  439. ::= NCName
  440. S ::= [#x0009#x000A#x000D#x0020]+
  441. CharRef ::= '&#' [0-9]+ ';'
  442. | '&#x' [0-9A-Fa-f]+ ';'
  443. Digits ::= [0-9]+
  444. CommentContents
  445. ::= ( Char+ - ( Char* ( '(:' | ':)' ) Char* ) ) & '(:'
  446. | ( Char+ - ( Char* ( '(:' | ':)' ) Char* ) ) & $
  447. | ( ( Char+ - ( Char* ( '(:' | ':)' ) Char* ) ) - ( Char* '(' ) ) & ':'
  448. DocTag ::= ' @' NCName?
  449. DocCommentContents
  450. ::= ( ( Char+ - ( Char* ( '(:' | ':)' | ' @' ) Char* ) ) - ( Char* '(' ) ) & ':'
  451. | ( Char+ - ( Char* ( '(:' | ':)' | ' @' ) Char* ) ) & '(:'
  452. | ( Char+ - ( Char* ( '(:' | ':)' | ' @' ) Char* ) ) & ' @'
  453. | ( Char+ - ( Char* ( '(:' | ':)' | ' @') Char* ) ) & $
  454. EOF ::= $
  455. NonNCNameChar
  456. ::= $
  457. | ':'
  458. | '.'
  459. | ( Char - NameChar )
  460. DelimitingChar
  461. ::= NonNCNameChar
  462. | '-'
  463. | '.'
  464. DelimitingChar
  465. \\ IntegerLiteral DecimalLiteral DoubleLiteral
  466. NonNCNameChar
  467. \\ EQName^Token QName NCName^Token 'NaN' 'after' 'all'
  468. 'allowing' 'ancestor' 'ancestor-or-self' 'and' 'any'
  469. 'append' 'array' 'as' 'ascending' 'at' 'attribute'
  470. 'base-uri' 'before' 'boundary-space' 'break' 'by' 'case'
  471. 'cast' 'castable' 'catch' 'check' 'child' 'collation'
  472. 'collection' 'comment' 'constraint' 'construction'
  473. 'contains' 'content' 'context' 'continue' 'copy'
  474. 'copy-namespaces' 'count' 'decimal-format'
  475. 'decimal-separator' 'declare' 'default' 'delete'
  476. 'descendant' 'descendant-or-self' 'descending'
  477. 'diacritics' 'different' 'digit' 'distance' 'div'
  478. 'document' 'document-node' 'element' 'else' 'empty'
  479. 'empty-sequence' 'encoding' 'end' 'entire' 'eq' 'every'
  480. 'exactly' 'except' 'exit' 'external' 'first' 'following'
  481. 'following-sibling' 'for' 'foreach' 'foreign' 'from'
  482. 'ft-option' 'ftand' 'ftnot' 'ftor' 'function' 'ge'
  483. 'greatest' 'group' 'grouping-separator' 'gt' 'idiv' 'if'
  484. 'import' 'in' 'index' 'infinity' 'inherit' 'insensitive'
  485. 'insert' 'instance' 'integrity' 'intersect' 'into' 'is'
  486. 'item' 'json' 'json-item' 'key' 'language' 'last' 'lax'
  487. 'le' 'least' 'let' 'levels' 'loop' 'lowercase' 'lt'
  488. 'minus-sign' 'mod' 'modify' 'module' 'most' 'namespace'
  489. 'namespace-node' 'ne' 'next' 'no' 'no-inherit'
  490. 'no-preserve' 'node' 'nodes' 'not' 'object' 'occurs'
  491. 'of' 'on' 'only' 'option' 'or' 'order' 'ordered'
  492. 'ordering' 'paragraph' 'paragraphs' 'parent'
  493. 'pattern-separator' 'per-mille' 'percent' 'phrase'
  494. 'position' 'preceding' 'preceding-sibling' 'preserve'
  495. 'previous' 'processing-instruction' 'relationship'
  496. 'rename' 'replace' 'return' 'returning' 'revalidation'
  497. 'same' 'satisfies' 'schema' 'schema-attribute'
  498. 'schema-element' 'score' 'self' 'sensitive' 'sentence'
  499. 'sentences' 'skip' 'sliding' 'some' 'stable' 'start'
  500. 'stemming' 'stop' 'strict' 'strip' 'structured-item'
  501. 'switch' 'text' 'then' 'thesaurus' 'times' 'to'
  502. 'treat' 'try' 'tumbling' 'type' 'typeswitch' 'union'
  503. 'unique' 'unordered' 'updating' 'uppercase' 'using'
  504. 'validate' 'value' 'variable' 'version' 'weight'
  505. 'when' 'where' 'while' 'wildcards' 'window' 'with'
  506. 'without' 'word' 'words' 'xquery' 'zero-digit'
  507. '*' << Wildcard '*'^OccurrenceIndicator
  508. EQName^Token
  509. << 'after' 'ancestor' 'ancestor-or-self' 'and' 'as' 'ascending' 'attribute' 'before' 'case' 'cast' 'castable' 'child' 'collation' 'comment' 'copy' 'count' 'declare' 'default' 'delete' 'descendant' 'descendant-or-self' 'descending' 'div' 'document' 'document-node' 'element' 'else' 'empty' 'empty-sequence' 'end' 'eq' 'every' 'except' 'first' 'following' 'following-sibling' 'for' 'function' 'ge' 'group' 'gt' 'idiv' 'if' 'import' 'insert' 'instance' 'intersect' 'into' 'is' 'item' 'last' 'le' 'let' 'lt' 'mod' 'modify' 'module' 'namespace' 'namespace-node' 'ne' 'node' 'only' 'or' 'order' 'ordered' 'parent' 'preceding' 'preceding-sibling' 'processing-instruction' 'rename' 'replace' 'return' 'satisfies' 'schema-attribute' 'schema-element' 'self' 'some' 'stable' 'start' 'switch' 'text' 'to' 'treat' 'try' 'typeswitch' 'union' 'unordered' 'validate' 'where' 'with' 'xquery' 'contains' 'paragraphs' 'sentences' 'times' 'words' 'by' 'collection' 'allowing' 'at' 'base-uri' 'boundary-space' 'break' 'catch' 'construction' 'context' 'continue' 'copy-namespaces' 'decimal-format' 'encoding' 'exit' 'external' 'ft-option' 'in' 'index' 'integrity' 'lax' 'nodes' 'option' 'ordering' 'revalidation' 'schema' 'score' 'sliding' 'strict' 'tumbling' 'type' 'updating' 'value' 'variable' 'version' 'while' 'constraint' 'loop' 'returning' 'append' 'array' 'json-item' 'object' 'structured-item'
  510. NCName^Token
  511. << 'after' 'and' 'as' 'ascending' 'before' 'case' 'cast' 'castable' 'collation' 'count' 'default' 'descending' 'div' 'else' 'empty' 'end' 'eq' 'except' 'for' 'ge' 'group' 'gt' 'idiv' 'instance' 'intersect' 'into' 'is' 'le' 'let' 'lt' 'mod' 'modify' 'ne' 'only' 'or' 'order' 'return' 'satisfies' 'stable' 'start' 'to' 'treat' 'union' 'where' 'with' 'contains' 'paragraphs' 'sentences' 'times' 'words' 'by' 'ancestor' 'ancestor-or-self' 'attribute' 'child' 'comment' 'copy' 'declare' 'delete' 'descendant' 'descendant-or-self' 'document' 'document-node' 'element' 'empty-sequence' 'every' 'first' 'following' 'following-sibling' 'function' 'if' 'import' 'insert' 'item' 'last' 'module' 'namespace' 'namespace-node' 'node' 'ordered' 'parent' 'preceding' 'preceding-sibling' 'processing-instruction' 'rename' 'replace' 'schema-attribute' 'schema-element' 'self' 'some' 'switch' 'text' 'try' 'typeswitch' 'unordered' 'validate' 'variable' 'xquery' 'allowing' 'at' 'base-uri' 'boundary-space' 'break' 'catch' 'construction' 'context' 'continue' 'copy-namespaces' 'decimal-format' 'encoding' 'exit' 'external' 'ft-option' 'in' 'index' 'integrity' 'lax' 'nodes' 'option' 'ordering' 'revalidation' 'schema' 'score' 'sliding' 'strict' 'tumbling' 'type' 'updating' 'value' 'version' 'while' 'constraint' 'loop' 'returning'
  512. <?ENCORE?>
  513. <?xqlint
  514. });
  515. ?>