1(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ 2'use strict'; 3 4//Const 5var VALID_DOCTYPE_NAME = 'html', 6 QUIRKS_MODE_SYSTEM_ID = 'http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd', 7 QUIRKS_MODE_PUBLIC_ID_PREFIXES = [ 8 "+//silmaril//dtd html pro v0r11 19970101//en", 9 "-//advasoft ltd//dtd html 3.0 aswedit + extensions//en", 10 "-//as//dtd html 3.0 aswedit + extensions//en", 11 "-//ietf//dtd html 2.0 level 1//en", 12 "-//ietf//dtd html 2.0 level 2//en", 13 "-//ietf//dtd html 2.0 strict level 1//en", 14 "-//ietf//dtd html 2.0 strict level 2//en", 15 "-//ietf//dtd html 2.0 strict//en", 16 "-//ietf//dtd html 2.0//en", 17 "-//ietf//dtd html 2.1e//en", 18 "-//ietf//dtd html 3.0//en", 19 "-//ietf//dtd html 3.0//en//", 20 "-//ietf//dtd html 3.2 final//en", 21 "-//ietf//dtd html 3.2//en", 22 "-//ietf//dtd html 3//en", 23 "-//ietf//dtd html level 0//en", 24 "-//ietf//dtd html level 0//en//2.0", 25 "-//ietf//dtd html level 1//en", 26 "-//ietf//dtd html level 1//en//2.0", 27 "-//ietf//dtd html level 2//en", 28 "-//ietf//dtd html level 2//en//2.0", 29 "-//ietf//dtd html level 3//en", 30 "-//ietf//dtd html level 3//en//3.0", 31 "-//ietf//dtd html strict level 0//en", 32 "-//ietf//dtd html strict level 0//en//2.0", 33 "-//ietf//dtd html strict level 1//en", 34 "-//ietf//dtd html strict level 1//en//2.0", 35 "-//ietf//dtd html strict level 2//en", 36 "-//ietf//dtd html strict level 2//en//2.0", 37 "-//ietf//dtd html strict level 3//en", 38 "-//ietf//dtd html strict level 3//en//3.0", 39 "-//ietf//dtd html strict//en", 40 "-//ietf//dtd html strict//en//2.0", 41 "-//ietf//dtd html strict//en//3.0", 42 "-//ietf//dtd html//en", 43 "-//ietf//dtd html//en//2.0", 44 "-//ietf//dtd html//en//3.0", 45 "-//metrius//dtd metrius presentational//en", 46 "-//microsoft//dtd internet explorer 2.0 html strict//en", 47 "-//microsoft//dtd internet explorer 2.0 html//en", 48 "-//microsoft//dtd internet explorer 2.0 tables//en", 49 "-//microsoft//dtd internet explorer 3.0 html strict//en", 50 "-//microsoft//dtd internet explorer 3.0 html//en", 51 "-//microsoft//dtd internet explorer 3.0 tables//en", 52 "-//netscape comm. corp.//dtd html//en", 53 "-//netscape comm. corp.//dtd strict html//en", 54 "-//o'reilly and associates//dtd html 2.0//en", 55 "-//o'reilly and associates//dtd html extended 1.0//en", 56 "-//spyglass//dtd html 2.0 extended//en", 57 "-//sq//dtd html 2.0 hotmetal + extensions//en", 58 "-//sun microsystems corp.//dtd hotjava html//en", 59 "-//sun microsystems corp.//dtd hotjava strict html//en", 60 "-//w3c//dtd html 3 1995-03-24//en", 61 "-//w3c//dtd html 3.2 draft//en", 62 "-//w3c//dtd html 3.2 final//en", 63 "-//w3c//dtd html 3.2//en", 64 "-//w3c//dtd html 3.2s draft//en", 65 "-//w3c//dtd html 4.0 frameset//en", 66 "-//w3c//dtd html 4.0 transitional//en", 67 "-//w3c//dtd html experimental 19960712//en", 68 "-//w3c//dtd html experimental 970421//en", 69 "-//w3c//dtd w3 html//en", 70 "-//w3o//dtd w3 html 3.0//en", 71 "-//w3o//dtd w3 html 3.0//en//", 72 "-//webtechs//dtd mozilla html 2.0//en", 73 "-//webtechs//dtd mozilla html//en" 74 ], 75 QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES = [ 76 '-//w3c//dtd html 4.01 frameset//', 77 '-//w3c//dtd html 4.01 transitional//' 78 ], 79 QUIRKS_MODE_PUBLIC_IDS = [ 80 '-//w3o//dtd w3 html strict 3.0//en//', 81 '-/w3c/dtd html 4.0 transitional/en', 82 'html' 83 ]; 84 85 86//Utils 87function enquoteDoctypeId(id) { 88 var quote = id.indexOf('"') !== -1 ? '\'' : '"'; 89 90 return quote + id + quote; 91} 92 93 94//API 95exports.isQuirks = function (name, publicId, systemId) { 96 if (name !== VALID_DOCTYPE_NAME) 97 return true; 98 99 if (systemId && systemId.toLowerCase() === QUIRKS_MODE_SYSTEM_ID) 100 return true; 101 102 if (publicId !== null) { 103 publicId = publicId.toLowerCase(); 104 105 if (QUIRKS_MODE_PUBLIC_IDS.indexOf(publicId) > -1) 106 return true; 107 108 var prefixes = QUIRKS_MODE_PUBLIC_ID_PREFIXES; 109 110 if (systemId === null) 111 prefixes = prefixes.concat(QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES); 112 113 for (var i = 0; i < prefixes.length; i++) { 114 if (publicId.indexOf(prefixes[i]) === 0) 115 return true; 116 } 117 } 118 119 return false; 120}; 121 122exports.serializeContent = function (name, publicId, systemId) { 123 var str = '!DOCTYPE ' + name; 124 125 if (publicId !== null) 126 str += ' PUBLIC ' + enquoteDoctypeId(publicId); 127 128 else if (systemId !== null) 129 str += ' SYSTEM'; 130 131 if (systemId !== null) 132 str += ' ' + enquoteDoctypeId(systemId); 133 134 return str; 135}; 136 137},{}],2:[function(require,module,exports){ 138'use strict'; 139 140var Tokenizer = require('../tokenization/tokenizer'), 141 HTML = require('./html'); 142 143//Aliases 144var $ = HTML.TAG_NAMES, 145 NS = HTML.NAMESPACES, 146 ATTRS = HTML.ATTRS; 147 148 149//MIME types 150var MIME_TYPES = { 151 TEXT_HTML: 'text/html', 152 APPLICATION_XML: 'application/xhtml+xml' 153}; 154 155//Attributes 156var DEFINITION_URL_ATTR = 'definitionurl', 157 ADJUSTED_DEFINITION_URL_ATTR = 'definitionURL', 158 SVG_ATTRS_ADJUSTMENT_MAP = { 159 'attributename': 'attributeName', 160 'attributetype': 'attributeType', 161 'basefrequency': 'baseFrequency', 162 'baseprofile': 'baseProfile', 163 'calcmode': 'calcMode', 164 'clippathunits': 'clipPathUnits', 165 'contentscripttype': 'contentScriptType', 166 'contentstyletype': 'contentStyleType', 167 'diffuseconstant': 'diffuseConstant', 168 'edgemode': 'edgeMode', 169 'externalresourcesrequired': 'externalResourcesRequired', 170 'filterres': 'filterRes', 171 'filterunits': 'filterUnits', 172 'glyphref': 'glyphRef', 173 'gradienttransform': 'gradientTransform', 174 'gradientunits': 'gradientUnits', 175 'kernelmatrix': 'kernelMatrix', 176 'kernelunitlength': 'kernelUnitLength', 177 'keypoints': 'keyPoints', 178 'keysplines': 'keySplines', 179 'keytimes': 'keyTimes', 180 'lengthadjust': 'lengthAdjust', 181 'limitingconeangle': 'limitingConeAngle', 182 'markerheight': 'markerHeight', 183 'markerunits': 'markerUnits', 184 'markerwidth': 'markerWidth', 185 'maskcontentunits': 'maskContentUnits', 186 'maskunits': 'maskUnits', 187 'numoctaves': 'numOctaves', 188 'pathlength': 'pathLength', 189 'patterncontentunits': 'patternContentUnits', 190 'patterntransform': 'patternTransform', 191 'patternunits': 'patternUnits', 192 'pointsatx': 'pointsAtX', 193 'pointsaty': 'pointsAtY', 194 'pointsatz': 'pointsAtZ', 195 'preservealpha': 'preserveAlpha', 196 'preserveaspectratio': 'preserveAspectRatio', 197 'primitiveunits': 'primitiveUnits', 198 'refx': 'refX', 199 'refy': 'refY', 200 'repeatcount': 'repeatCount', 201 'repeatdur': 'repeatDur', 202 'requiredextensions': 'requiredExtensions', 203 'requiredfeatures': 'requiredFeatures', 204 'specularconstant': 'specularConstant', 205 'specularexponent': 'specularExponent', 206 'spreadmethod': 'spreadMethod', 207 'startoffset': 'startOffset', 208 'stddeviation': 'stdDeviation', 209 'stitchtiles': 'stitchTiles', 210 'surfacescale': 'surfaceScale', 211 'systemlanguage': 'systemLanguage', 212 'tablevalues': 'tableValues', 213 'targetx': 'targetX', 214 'targety': 'targetY', 215 'textlength': 'textLength', 216 'viewbox': 'viewBox', 217 'viewtarget': 'viewTarget', 218 'xchannelselector': 'xChannelSelector', 219 'ychannelselector': 'yChannelSelector', 220 'zoomandpan': 'zoomAndPan' 221 }, 222 XML_ATTRS_ADJUSTMENT_MAP = { 223 'xlink:actuate': {prefix: 'xlink', name: 'actuate', namespace: NS.XLINK}, 224 'xlink:arcrole': {prefix: 'xlink', name: 'arcrole', namespace: NS.XLINK}, 225 'xlink:href': {prefix: 'xlink', name: 'href', namespace: NS.XLINK}, 226 'xlink:role': {prefix: 'xlink', name: 'role', namespace: NS.XLINK}, 227 'xlink:show': {prefix: 'xlink', name: 'show', namespace: NS.XLINK}, 228 'xlink:title': {prefix: 'xlink', name: 'title', namespace: NS.XLINK}, 229 'xlink:type': {prefix: 'xlink', name: 'type', namespace: NS.XLINK}, 230 'xml:base': {prefix: 'xml', name: 'base', namespace: NS.XML}, 231 'xml:lang': {prefix: 'xml', name: 'lang', namespace: NS.XML}, 232 'xml:space': {prefix: 'xml', name: 'space', namespace: NS.XML}, 233 'xmlns': {prefix: '', name: 'xmlns', namespace: NS.XMLNS}, 234 'xmlns:xlink': {prefix: 'xmlns', name: 'xlink', namespace: NS.XMLNS} 235 236 }; 237 238//SVG tag names adjustment map 239var SVG_TAG_NAMES_ADJUSTMENT_MAP = { 240 'altglyph': 'altGlyph', 241 'altglyphdef': 'altGlyphDef', 242 'altglyphitem': 'altGlyphItem', 243 'animatecolor': 'animateColor', 244 'animatemotion': 'animateMotion', 245 'animatetransform': 'animateTransform', 246 'clippath': 'clipPath', 247 'feblend': 'feBlend', 248 'fecolormatrix': 'feColorMatrix', 249 'fecomponenttransfer': 'feComponentTransfer', 250 'fecomposite': 'feComposite', 251 'feconvolvematrix': 'feConvolveMatrix', 252 'fediffuselighting': 'feDiffuseLighting', 253 'fedisplacementmap': 'feDisplacementMap', 254 'fedistantlight': 'feDistantLight', 255 'feflood': 'feFlood', 256 'fefunca': 'feFuncA', 257 'fefuncb': 'feFuncB', 258 'fefuncg': 'feFuncG', 259 'fefuncr': 'feFuncR', 260 'fegaussianblur': 'feGaussianBlur', 261 'feimage': 'feImage', 262 'femerge': 'feMerge', 263 'femergenode': 'feMergeNode', 264 'femorphology': 'feMorphology', 265 'feoffset': 'feOffset', 266 'fepointlight': 'fePointLight', 267 'fespecularlighting': 'feSpecularLighting', 268 'fespotlight': 'feSpotLight', 269 'fetile': 'feTile', 270 'feturbulence': 'feTurbulence', 271 'foreignobject': 'foreignObject', 272 'glyphref': 'glyphRef', 273 'lineargradient': 'linearGradient', 274 'radialgradient': 'radialGradient', 275 'textpath': 'textPath' 276}; 277 278//Tags that causes exit from foreign content 279var EXITS_FOREIGN_CONTENT = {}; 280 281EXITS_FOREIGN_CONTENT[$.B] = true; 282EXITS_FOREIGN_CONTENT[$.BIG] = true; 283EXITS_FOREIGN_CONTENT[$.BLOCKQUOTE] = true; 284EXITS_FOREIGN_CONTENT[$.BODY] = true; 285EXITS_FOREIGN_CONTENT[$.BR] = true; 286EXITS_FOREIGN_CONTENT[$.CENTER] = true; 287EXITS_FOREIGN_CONTENT[$.CODE] = true; 288EXITS_FOREIGN_CONTENT[$.DD] = true; 289EXITS_FOREIGN_CONTENT[$.DIV] = true; 290EXITS_FOREIGN_CONTENT[$.DL] = true; 291EXITS_FOREIGN_CONTENT[$.DT] = true; 292EXITS_FOREIGN_CONTENT[$.EM] = true; 293EXITS_FOREIGN_CONTENT[$.EMBED] = true; 294EXITS_FOREIGN_CONTENT[$.H1] = true; 295EXITS_FOREIGN_CONTENT[$.H2] = true; 296EXITS_FOREIGN_CONTENT[$.H3] = true; 297EXITS_FOREIGN_CONTENT[$.H4] = true; 298EXITS_FOREIGN_CONTENT[$.H5] = true; 299EXITS_FOREIGN_CONTENT[$.H6] = true; 300EXITS_FOREIGN_CONTENT[$.HEAD] = true; 301EXITS_FOREIGN_CONTENT[$.HR] = true; 302EXITS_FOREIGN_CONTENT[$.I] = true; 303EXITS_FOREIGN_CONTENT[$.IMG] = true; 304EXITS_FOREIGN_CONTENT[$.LI] = true; 305EXITS_FOREIGN_CONTENT[$.LISTING] = true; 306EXITS_FOREIGN_CONTENT[$.MENU] = true; 307EXITS_FOREIGN_CONTENT[$.META] = true; 308EXITS_FOREIGN_CONTENT[$.NOBR] = true; 309EXITS_FOREIGN_CONTENT[$.OL] = true; 310EXITS_FOREIGN_CONTENT[$.P] = true; 311EXITS_FOREIGN_CONTENT[$.PRE] = true; 312EXITS_FOREIGN_CONTENT[$.RUBY] = true; 313EXITS_FOREIGN_CONTENT[$.S] = true; 314EXITS_FOREIGN_CONTENT[$.SMALL] = true; 315EXITS_FOREIGN_CONTENT[$.SPAN] = true; 316EXITS_FOREIGN_CONTENT[$.STRONG] = true; 317EXITS_FOREIGN_CONTENT[$.STRIKE] = true; 318EXITS_FOREIGN_CONTENT[$.SUB] = true; 319EXITS_FOREIGN_CONTENT[$.SUP] = true; 320EXITS_FOREIGN_CONTENT[$.TABLE] = true; 321EXITS_FOREIGN_CONTENT[$.TT] = true; 322EXITS_FOREIGN_CONTENT[$.U] = true; 323EXITS_FOREIGN_CONTENT[$.UL] = true; 324EXITS_FOREIGN_CONTENT[$.VAR] = true; 325 326//Check exit from foreign content 327exports.causesExit = function (startTagToken) { 328 var tn = startTagToken.tagName; 329 330 if (tn === $.FONT && (Tokenizer.getTokenAttr(startTagToken, ATTRS.COLOR) !== null || 331 Tokenizer.getTokenAttr(startTagToken, ATTRS.SIZE) !== null || 332 Tokenizer.getTokenAttr(startTagToken, ATTRS.FACE) !== null)) { 333 return true; 334 } 335 336 return EXITS_FOREIGN_CONTENT[tn]; 337}; 338 339//Token adjustments 340exports.adjustTokenMathMLAttrs = function (token) { 341 for (var i = 0; i < token.attrs.length; i++) { 342 if (token.attrs[i].name === DEFINITION_URL_ATTR) { 343 token.attrs[i].name = ADJUSTED_DEFINITION_URL_ATTR; 344 break; 345 } 346 } 347}; 348 349exports.adjustTokenSVGAttrs = function (token) { 350 for (var i = 0; i < token.attrs.length; i++) { 351 var adjustedAttrName = SVG_ATTRS_ADJUSTMENT_MAP[token.attrs[i].name]; 352 353 if (adjustedAttrName) 354 token.attrs[i].name = adjustedAttrName; 355 } 356}; 357 358exports.adjustTokenXMLAttrs = function (token) { 359 for (var i = 0; i < token.attrs.length; i++) { 360 var adjustedAttrEntry = XML_ATTRS_ADJUSTMENT_MAP[token.attrs[i].name]; 361 362 if (adjustedAttrEntry) { 363 token.attrs[i].prefix = adjustedAttrEntry.prefix; 364 token.attrs[i].name = adjustedAttrEntry.name; 365 token.attrs[i].namespace = adjustedAttrEntry.namespace; 366 } 367 } 368}; 369 370exports.adjustTokenSVGTagName = function (token) { 371 var adjustedTagName = SVG_TAG_NAMES_ADJUSTMENT_MAP[token.tagName]; 372 373 if (adjustedTagName) 374 token.tagName = adjustedTagName; 375}; 376 377//Integration points 378exports.isMathMLTextIntegrationPoint = function (tn, ns) { 379 return ns === NS.MATHML && (tn === $.MI || tn === $.MO || tn === $.MN || tn === $.MS || tn === $.MTEXT); 380}; 381 382exports.isHtmlIntegrationPoint = function (tn, ns, attrs) { 383 if (ns === NS.MATHML && tn === $.ANNOTATION_XML) { 384 for (var i = 0; i < attrs.length; i++) { 385 if (attrs[i].name === ATTRS.ENCODING) { 386 var value = attrs[i].value.toLowerCase(); 387 388 return value === MIME_TYPES.TEXT_HTML || value === MIME_TYPES.APPLICATION_XML; 389 } 390 } 391 } 392 393 return ns === NS.SVG && (tn === $.FOREIGN_OBJECT || tn === $.DESC || tn === $.TITLE); 394}; 395 396},{"../tokenization/tokenizer":14,"./html":3}],3:[function(require,module,exports){ 397'use strict'; 398 399var NS = exports.NAMESPACES = { 400 HTML: 'http://www.w3.org/1999/xhtml', 401 MATHML: 'http://www.w3.org/1998/Math/MathML', 402 SVG: 'http://www.w3.org/2000/svg', 403 XLINK: 'http://www.w3.org/1999/xlink', 404 XML: 'http://www.w3.org/XML/1998/namespace', 405 XMLNS: 'http://www.w3.org/2000/xmlns/' 406}; 407 408exports.ATTRS = { 409 TYPE: 'type', 410 ACTION: 'action', 411 ENCODING: 'encoding', 412 PROMPT: 'prompt', 413 NAME: 'name', 414 COLOR: 'color', 415 FACE: 'face', 416 SIZE: 'size' 417}; 418 419var $ = exports.TAG_NAMES = { 420 A: 'a', 421 ADDRESS: 'address', 422 ANNOTATION_XML: 'annotation-xml', 423 APPLET: 'applet', 424 AREA: 'area', 425 ARTICLE: 'article', 426 ASIDE: 'aside', 427 428 B: 'b', 429 BASE: 'base', 430 BASEFONT: 'basefont', 431 BGSOUND: 'bgsound', 432 BIG: 'big', 433 BLOCKQUOTE: 'blockquote', 434 BODY: 'body', 435 BR: 'br', 436 BUTTON: 'button', 437 438 CAPTION: 'caption', 439 CENTER: 'center', 440 CODE: 'code', 441 COL: 'col', 442 COLGROUP: 'colgroup', 443 COMMAND: 'command', 444 445 DD: 'dd', 446 DESC: 'desc', 447 DETAILS: 'details', 448 DIALOG: 'dialog', 449 DIR: 'dir', 450 DIV: 'div', 451 DL: 'dl', 452 DT: 'dt', 453 454 EM: 'em', 455 EMBED: 'embed', 456 457 FIELDSET: 'fieldset', 458 FIGCAPTION: 'figcaption', 459 FIGURE: 'figure', 460 FONT: 'font', 461 FOOTER: 'footer', 462 FOREIGN_OBJECT: 'foreignObject', 463 FORM: 'form', 464 FRAME: 'frame', 465 FRAMESET: 'frameset', 466 467 H1: 'h1', 468 H2: 'h2', 469 H3: 'h3', 470 H4: 'h4', 471 H5: 'h5', 472 H6: 'h6', 473 HEAD: 'head', 474 HEADER: 'header', 475 HGROUP: 'hgroup', 476 HR: 'hr', 477 HTML: 'html', 478 479 I: 'i', 480 IMG: 'img', 481 IMAGE: 'image', 482 INPUT: 'input', 483 IFRAME: 'iframe', 484 ISINDEX: 'isindex', 485 486 KEYGEN: 'keygen', 487 488 LABEL: 'label', 489 LI: 'li', 490 LINK: 'link', 491 LISTING: 'listing', 492 493 MAIN: 'main', 494 MALIGNMARK: 'malignmark', 495 MARQUEE: 'marquee', 496 MATH: 'math', 497 MENU: 'menu', 498 MENUITEM: 'menuitem', 499 META: 'meta', 500 MGLYPH: 'mglyph', 501 MI: 'mi', 502 MO: 'mo', 503 MN: 'mn', 504 MS: 'ms', 505 MTEXT: 'mtext', 506 507 NAV: 'nav', 508 NOBR: 'nobr', 509 NOFRAMES: 'noframes', 510 NOEMBED: 'noembed', 511 NOSCRIPT: 'noscript', 512 513 OBJECT: 'object', 514 OL: 'ol', 515 OPTGROUP: 'optgroup', 516 OPTION: 'option', 517 518 P: 'p', 519 PARAM: 'param', 520 PLAINTEXT: 'plaintext', 521 PRE: 'pre', 522 523 RP: 'rp', 524 RT: 'rt', 525 RUBY: 'ruby', 526 527 S: 's', 528 SCRIPT: 'script', 529 SECTION: 'section', 530 SELECT: 'select', 531 SOURCE: 'source', 532 SMALL: 'small', 533 SPAN: 'span', 534 STRIKE: 'strike', 535 STRONG: 'strong', 536 STYLE: 'style', 537 SUB: 'sub', 538 SUMMARY: 'summary', 539 SUP: 'sup', 540 541 TABLE: 'table', 542 TBODY: 'tbody', 543 TEMPLATE: 'template', 544 TEXTAREA: 'textarea', 545 TFOOT: 'tfoot', 546 TD: 'td', 547 TH: 'th', 548 THEAD: 'thead', 549 TITLE: 'title', 550 TR: 'tr', 551 TRACK: 'track', 552 TT: 'tt', 553 554 U: 'u', 555 UL: 'ul', 556 557 SVG: 'svg', 558 559 VAR: 'var', 560 561 WBR: 'wbr', 562 563 XMP: 'xmp' 564}; 565 566var SPECIAL_ELEMENTS = exports.SPECIAL_ELEMENTS = {}; 567 568SPECIAL_ELEMENTS[NS.HTML] = {}; 569SPECIAL_ELEMENTS[NS.HTML][$.ADDRESS] = true; 570SPECIAL_ELEMENTS[NS.HTML][$.APPLET] = true; 571SPECIAL_ELEMENTS[NS.HTML][$.AREA] = true; 572SPECIAL_ELEMENTS[NS.HTML][$.ARTICLE] = true; 573SPECIAL_ELEMENTS[NS.HTML][$.ASIDE] = true; 574SPECIAL_ELEMENTS[NS.HTML][$.BASE] = true; 575SPECIAL_ELEMENTS[NS.HTML][$.BASEFONT] = true; 576SPECIAL_ELEMENTS[NS.HTML][$.BGSOUND] = true; 577SPECIAL_ELEMENTS[NS.HTML][$.BLOCKQUOTE] = true; 578SPECIAL_ELEMENTS[NS.HTML][$.BODY] = true; 579SPECIAL_ELEMENTS[NS.HTML][$.BR] = true; 580SPECIAL_ELEMENTS[NS.HTML][$.BUTTON] = true; 581SPECIAL_ELEMENTS[NS.HTML][$.CAPTION] = true; 582SPECIAL_ELEMENTS[NS.HTML][$.CENTER] = true; 583SPECIAL_ELEMENTS[NS.HTML][$.COL] = true; 584SPECIAL_ELEMENTS[NS.HTML][$.COLGROUP] = true; 585SPECIAL_ELEMENTS[NS.HTML][$.DD] = true; 586SPECIAL_ELEMENTS[NS.HTML][$.DETAILS] = true; 587SPECIAL_ELEMENTS[NS.HTML][$.DIR] = true; 588SPECIAL_ELEMENTS[NS.HTML][$.DIV] = true; 589SPECIAL_ELEMENTS[NS.HTML][$.DL] = true; 590SPECIAL_ELEMENTS[NS.HTML][$.DT] = true; 591SPECIAL_ELEMENTS[NS.HTML][$.EMBED] = true; 592SPECIAL_ELEMENTS[NS.HTML][$.FIELDSET] = true; 593SPECIAL_ELEMENTS[NS.HTML][$.FIGCAPTION] = true; 594SPECIAL_ELEMENTS[NS.HTML][$.FIGURE] = true; 595SPECIAL_ELEMENTS[NS.HTML][$.FOOTER] = true; 596SPECIAL_ELEMENTS[NS.HTML][$.FORM] = true; 597SPECIAL_ELEMENTS[NS.HTML][$.FRAME] = true; 598SPECIAL_ELEMENTS[NS.HTML][$.FRAMESET] = true; 599SPECIAL_ELEMENTS[NS.HTML][$.H1] = true; 600SPECIAL_ELEMENTS[NS.HTML][$.H2] = true; 601SPECIAL_ELEMENTS[NS.HTML][$.H3] = true; 602SPECIAL_ELEMENTS[NS.HTML][$.H4] = true; 603SPECIAL_ELEMENTS[NS.HTML][$.H5] = true; 604SPECIAL_ELEMENTS[NS.HTML][$.H6] = true; 605SPECIAL_ELEMENTS[NS.HTML][$.HEAD] = true; 606SPECIAL_ELEMENTS[NS.HTML][$.HEADER] = true; 607SPECIAL_ELEMENTS[NS.HTML][$.HGROUP] = true; 608SPECIAL_ELEMENTS[NS.HTML][$.HR] = true; 609SPECIAL_ELEMENTS[NS.HTML][$.HTML] = true; 610SPECIAL_ELEMENTS[NS.HTML][$.IFRAME] = true; 611SPECIAL_ELEMENTS[NS.HTML][$.IMG] = true; 612SPECIAL_ELEMENTS[NS.HTML][$.INPUT] = true; 613SPECIAL_ELEMENTS[NS.HTML][$.ISINDEX] = true; 614SPECIAL_ELEMENTS[NS.HTML][$.LI] = true; 615SPECIAL_ELEMENTS[NS.HTML][$.LINK] = true; 616SPECIAL_ELEMENTS[NS.HTML][$.LISTING] = true; 617SPECIAL_ELEMENTS[NS.HTML][$.MAIN] = true; 618SPECIAL_ELEMENTS[NS.HTML][$.MARQUEE] = true; 619SPECIAL_ELEMENTS[NS.HTML][$.MENU] = true; 620SPECIAL_ELEMENTS[NS.HTML][$.MENUITEM] = true; 621SPECIAL_ELEMENTS[NS.HTML][$.META] = true; 622SPECIAL_ELEMENTS[NS.HTML][$.NAV] = true; 623SPECIAL_ELEMENTS[NS.HTML][$.NOEMBED] = true; 624SPECIAL_ELEMENTS[NS.HTML][$.NOFRAMES] = true; 625SPECIAL_ELEMENTS[NS.HTML][$.NOSCRIPT] = true; 626SPECIAL_ELEMENTS[NS.HTML][$.OBJECT] = true; 627SPECIAL_ELEMENTS[NS.HTML][$.OL] = true; 628SPECIAL_ELEMENTS[NS.HTML][$.P] = true; 629SPECIAL_ELEMENTS[NS.HTML][$.PARAM] = true; 630SPECIAL_ELEMENTS[NS.HTML][$.PLAINTEXT] = true; 631SPECIAL_ELEMENTS[NS.HTML][$.PRE] = true; 632SPECIAL_ELEMENTS[NS.HTML][$.SCRIPT] = true; 633SPECIAL_ELEMENTS[NS.HTML][$.SECTION] = true; 634SPECIAL_ELEMENTS[NS.HTML][$.SELECT] = true; 635SPECIAL_ELEMENTS[NS.HTML][$.SOURCE] = true; 636SPECIAL_ELEMENTS[NS.HTML][$.STYLE] = true; 637SPECIAL_ELEMENTS[NS.HTML][$.SUMMARY] = true; 638SPECIAL_ELEMENTS[NS.HTML][$.TABLE] = true; 639SPECIAL_ELEMENTS[NS.HTML][$.TBODY] = true; 640SPECIAL_ELEMENTS[NS.HTML][$.TD] = true; 641SPECIAL_ELEMENTS[NS.HTML][$.TEMPLATE] = true; 642SPECIAL_ELEMENTS[NS.HTML][$.TEXTAREA] = true; 643SPECIAL_ELEMENTS[NS.HTML][$.TFOOT] = true; 644SPECIAL_ELEMENTS[NS.HTML][$.TH] = true; 645SPECIAL_ELEMENTS[NS.HTML][$.THEAD] = true; 646SPECIAL_ELEMENTS[NS.HTML][$.TITLE] = true; 647SPECIAL_ELEMENTS[NS.HTML][$.TR] = true; 648SPECIAL_ELEMENTS[NS.HTML][$.TRACK] = true; 649SPECIAL_ELEMENTS[NS.HTML][$.UL] = true; 650SPECIAL_ELEMENTS[NS.HTML][$.WBR] = true; 651SPECIAL_ELEMENTS[NS.HTML][$.XMP] = true; 652 653SPECIAL_ELEMENTS[NS.MATHML] = {}; 654SPECIAL_ELEMENTS[NS.MATHML][$.MI] = true; 655SPECIAL_ELEMENTS[NS.MATHML][$.MO] = true; 656SPECIAL_ELEMENTS[NS.MATHML][$.MN] = true; 657SPECIAL_ELEMENTS[NS.MATHML][$.MS] = true; 658SPECIAL_ELEMENTS[NS.MATHML][$.MTEXT] = true; 659SPECIAL_ELEMENTS[NS.MATHML][$.ANNOTATION_XML] = true; 660 661SPECIAL_ELEMENTS[NS.SVG] = {}; 662SPECIAL_ELEMENTS[NS.SVG][$.TITLE] = true; 663SPECIAL_ELEMENTS[NS.SVG][$.FOREIGN_OBJECT] = true; 664SPECIAL_ELEMENTS[NS.SVG][$.DESC] = true; 665 666},{}],4:[function(require,module,exports){ 667'use strict'; 668 669exports.REPLACEMENT_CHARACTER = '\uFFFD'; 670 671exports.CODE_POINTS = { 672 EOF: -1, 673 NULL: 0x00, 674 TABULATION: 0x09, 675 CARRIAGE_RETURN: 0x0D, 676 LINE_FEED: 0x0A, 677 FORM_FEED: 0x0C, 678 SPACE: 0x20, 679 EXCLAMATION_MARK: 0x21, 680 QUOTATION_MARK: 0x22, 681 NUMBER_SIGN: 0x23, 682 AMPERSAND: 0x26, 683 APOSTROPHE: 0x27, 684 HYPHEN_MINUS: 0x2D, 685 SOLIDUS: 0x2F, 686 DIGIT_0: 0x30, 687 DIGIT_9: 0x39, 688 SEMICOLON: 0x3B, 689 LESS_THAN_SIGN: 0x3C, 690 EQUALS_SIGN: 0x3D, 691 GREATER_THAN_SIGN: 0x3E, 692 QUESTION_MARK: 0x3F, 693 LATIN_CAPITAL_A: 0x41, 694 LATIN_CAPITAL_F: 0x46, 695 LATIN_CAPITAL_X: 0x58, 696 LATIN_CAPITAL_Z: 0x5A, 697 GRAVE_ACCENT: 0x60, 698 LATIN_SMALL_A: 0x61, 699 LATIN_SMALL_F: 0x66, 700 LATIN_SMALL_X: 0x78, 701 LATIN_SMALL_Z: 0x7A, 702 BOM: 0xFEFF, 703 REPLACEMENT_CHARACTER: 0xFFFD 704}; 705 706exports.CODE_POINT_SEQUENCES = { 707 DASH_DASH_STRING: [0x2D, 0x2D], //-- 708 DOCTYPE_STRING: [0x44, 0x4F, 0x43, 0x54, 0x59, 0x50, 0x45], //DOCTYPE 709 CDATA_START_STRING: [0x5B, 0x43, 0x44, 0x41, 0x54, 0x41, 0x5B], //[CDATA[ 710 CDATA_END_STRING: [0x5D, 0x5D, 0x3E], //]]> 711 SCRIPT_STRING: [0x73, 0x63, 0x72, 0x69, 0x70, 0x74], //script 712 PUBLIC_STRING: [0x50, 0x55, 0x42, 0x4C, 0x49, 0x43], //PUBLIC 713 SYSTEM_STRING: [0x53, 0x59, 0x53, 0x54, 0x45, 0x4D] //SYSTEM 714}; 715 716},{}],5:[function(require,module,exports){ 717'use strict'; 718 719exports.mergeOptions = function (defaults, options) { 720 options = options || {}; 721 722 return [defaults, options].reduce(function (merged, optObj) { 723 Object.keys(optObj).forEach(function (key) { 724 merged[key] = optObj[key]; 725 }); 726 727 return merged; 728 }, {}); 729}; 730 731},{}],6:[function(require,module,exports){ 732(function (process){ 733'use strict'; 734 735var Parser = require('../tree_construction/parser'), 736 ParsingUnit = require('./parsing_unit'); 737 738//API 739exports.parseDocument = function (html, treeAdapter) { 740 //NOTE: this should be reentrant, so we create new parser here 741 var parser = new Parser(treeAdapter), 742 parsingUnit = new ParsingUnit(parser); 743 744 //NOTE: override parser loop method 745 parser._runParsingLoop = function () { 746 parsingUnit.parsingLoopLock = true; 747 748 while (!parsingUnit.suspended && !this.stopped) 749 this._iterateParsingLoop(); 750 751 parsingUnit.parsingLoopLock = false; 752 753 if (this.stopped) 754 parsingUnit.callback(this.document); 755 }; 756 757 //NOTE: wait while parserController will be adopted by calling code, then 758 //start parsing 759 process.nextTick(function () { 760 parser.parse(html); 761 }); 762 763 return parsingUnit; 764}; 765 766exports.parseInnerHtml = function (innerHtml, contextElement, treeAdapter) { 767 //NOTE: this should be reentrant, so we create new parser here 768 var parser = new Parser(treeAdapter); 769 770 return parser.parseFragment(innerHtml, contextElement); 771}; 772}).call(this,require('_process')) 773},{"../tree_construction/parser":20,"./parsing_unit":7,"_process":22}],7:[function(require,module,exports){ 774'use strict'; 775 776var ParsingUnit = module.exports = function (parser) { 777 this.parser = parser; 778 this.suspended = false; 779 this.parsingLoopLock = false; 780 this.callback = null; 781}; 782 783ParsingUnit.prototype._stateGuard = function (suspend) { 784 if (this.suspended && suspend) 785 throw new Error('parse5: Parser was already suspended. Please, check your control flow logic.'); 786 787 else if (!this.suspended && !suspend) 788 throw new Error('parse5: Parser was already resumed. Please, check your control flow logic.'); 789 790 return suspend; 791}; 792 793ParsingUnit.prototype.suspend = function () { 794 this.suspended = this._stateGuard(true); 795 796 return this; 797}; 798 799ParsingUnit.prototype.resume = function () { 800 this.suspended = this._stateGuard(false); 801 802 //NOTE: don't enter parsing loop if it is locked. Without this lock _runParsingLoop() may be called 803 //while parsing loop is still running. E.g. when suspend() and resume() called synchronously. 804 if (!this.parsingLoopLock) 805 this.parser._runParsingLoop(); 806 807 return this; 808}; 809 810ParsingUnit.prototype.documentWrite = function (html) { 811 this.parser.tokenizer.preprocessor.write(html); 812 813 return this; 814}; 815 816ParsingUnit.prototype.handleScripts = function (scriptHandler) { 817 this.parser.scriptHandler = scriptHandler; 818 819 return this; 820}; 821 822ParsingUnit.prototype.done = function (callback) { 823 this.callback = callback; 824 825 return this; 826}; 827 828},{}],8:[function(require,module,exports){ 829'use strict'; 830 831var DefaultTreeAdapter = require('../tree_adapters/default'), 832 Doctype = require('../common/doctype'), 833 Utils = require('../common/utils'), 834 HTML = require('../common/html'); 835 836//Aliases 837var $ = HTML.TAG_NAMES, 838 NS = HTML.NAMESPACES; 839 840//Default serializer options 841var DEFAULT_OPTIONS = { 842 encodeHtmlEntities: true 843}; 844 845//Escaping regexes 846var AMP_REGEX = /&/g, 847 NBSP_REGEX = /\u00a0/g, 848 DOUBLE_QUOTE_REGEX = /"/g, 849 LT_REGEX = /</g, 850 GT_REGEX = />/g; 851 852//Escape string 853function escapeString(str, attrMode) { 854 str = str 855 .replace(AMP_REGEX, '&') 856 .replace(NBSP_REGEX, ' '); 857 858 if (attrMode) 859 str = str.replace(DOUBLE_QUOTE_REGEX, '"'); 860 861 else { 862 str = str 863 .replace(LT_REGEX, '<') 864 .replace(GT_REGEX, '>'); 865 } 866 867 return str; 868} 869 870 871//Enquote doctype ID 872 873 874 875//Serializer 876var Serializer = module.exports = function (treeAdapter, options) { 877 this.treeAdapter = treeAdapter || DefaultTreeAdapter; 878 this.options = Utils.mergeOptions(DEFAULT_OPTIONS, options); 879}; 880 881 882//API 883Serializer.prototype.serialize = function (node) { 884 this.html = ''; 885 this._serializeChildNodes(node); 886 887 return this.html; 888}; 889 890 891//Internals 892Serializer.prototype._serializeChildNodes = function (parentNode) { 893 var childNodes = this.treeAdapter.getChildNodes(parentNode); 894 895 if (childNodes) { 896 for (var i = 0, cnLength = childNodes.length; i < cnLength; i++) { 897 var currentNode = childNodes[i]; 898 899 if (this.treeAdapter.isElementNode(currentNode)) 900 this._serializeElement(currentNode); 901 902 else if (this.treeAdapter.isTextNode(currentNode)) 903 this._serializeTextNode(currentNode); 904 905 else if (this.treeAdapter.isCommentNode(currentNode)) 906 this._serializeCommentNode(currentNode); 907 908 else if (this.treeAdapter.isDocumentTypeNode(currentNode)) 909 this._serializeDocumentTypeNode(currentNode); 910 } 911 } 912}; 913 914Serializer.prototype._serializeElement = function (node) { 915 var tn = this.treeAdapter.getTagName(node), 916 ns = this.treeAdapter.getNamespaceURI(node), 917 qualifiedTn = (ns === NS.HTML || ns === NS.SVG || ns === NS.MATHML) ? tn : (ns + ':' + tn); 918 919 this.html += '<' + qualifiedTn; 920 this._serializeAttributes(node); 921 this.html += '>'; 922 923 if (tn !== $.AREA && tn !== $.BASE && tn !== $.BASEFONT && tn !== $.BGSOUND && tn !== $.BR && tn !== $.BR && 924 tn !== $.COL && tn !== $.EMBED && tn !== $.FRAME && tn !== $.HR && tn !== $.IMG && tn !== $.INPUT && 925 tn !== $.KEYGEN && tn !== $.LINK && tn !== $.MENUITEM && tn !== $.META && tn !== $.PARAM && tn !== $.SOURCE && 926 tn !== $.TRACK && tn !== $.WBR) { 927 928 if (tn === $.PRE || tn === $.TEXTAREA || tn === $.LISTING) { 929 var firstChild = this.treeAdapter.getFirstChild(node); 930 931 if (firstChild && this.treeAdapter.isTextNode(firstChild)) { 932 var content = this.treeAdapter.getTextNodeContent(firstChild); 933 934 if (content[0] === '\n') 935 this.html += '\n'; 936 } 937 } 938 939 var childNodesHolder = tn === $.TEMPLATE && ns === NS.HTML ? 940 this.treeAdapter.getChildNodes(node)[0] : 941 node; 942 943 this._serializeChildNodes(childNodesHolder); 944 this.html += '</' + qualifiedTn + '>'; 945 } 946}; 947 948Serializer.prototype._serializeAttributes = function (node) { 949 var attrs = this.treeAdapter.getAttrList(node); 950 951 for (var i = 0, attrsLength = attrs.length; i < attrsLength; i++) { 952 var attr = attrs[i], 953 value = this.options.encodeHtmlEntities ? escapeString(attr.value, true) : attr.value; 954 955 this.html += ' '; 956 957 if (!attr.namespace) 958 this.html += attr.name; 959 960 else if (attr.namespace === NS.XML) 961 this.html += 'xml:' + attr.name; 962 963 else if (attr.namespace === NS.XMLNS) { 964 if (attr.name !== 'xmlns') 965 this.html += 'xmlns:'; 966 967 this.html += attr.name; 968 } 969 970 else if (attr.namespace === NS.XLINK) 971 this.html += 'xlink:' + attr.name; 972 973 else 974 this.html += attr.namespace + ':' + attr.name; 975 976 this.html += '="' + value + '"'; 977 } 978}; 979 980Serializer.prototype._serializeTextNode = function (node) { 981 var content = this.treeAdapter.getTextNodeContent(node), 982 parent = this.treeAdapter.getParentNode(node), 983 parentTn = void 0; 984 985 if (parent && this.treeAdapter.isElementNode(parent)) 986 parentTn = this.treeAdapter.getTagName(parent); 987 988 if (parentTn === $.STYLE || parentTn === $.SCRIPT || parentTn === $.XMP || parentTn === $.IFRAME || 989 parentTn === $.NOEMBED || parentTn === $.NOFRAMES || parentTn === $.PLAINTEXT || parentTn === $.NOSCRIPT) { 990 this.html += content; 991 } 992 993 else 994 this.html += this.options.encodeHtmlEntities ? escapeString(content, false) : content; 995}; 996 997Serializer.prototype._serializeCommentNode = function (node) { 998 this.html += '<!--' + this.treeAdapter.getCommentNodeContent(node) + '-->'; 999}; 1000 1001Serializer.prototype._serializeDocumentTypeNode = function (node) { 1002 var name = this.treeAdapter.getDocumentTypeNodeName(node), 1003 publicId = this.treeAdapter.getDocumentTypeNodePublicId(node), 1004 systemId = this.treeAdapter.getDocumentTypeNodeSystemId(node); 1005 1006 this.html += '<' + Doctype.serializeContent(name, publicId, systemId) + '>'; 1007}; 1008 1009},{"../common/doctype":1,"../common/html":3,"../common/utils":5,"../tree_adapters/default":15}],9:[function(require,module,exports){ 1010'use strict'; 1011 1012var Tokenizer = require('../tokenization/tokenizer'), 1013 TokenizerProxy = require('./tokenizer_proxy'), 1014 Utils = require('../common/utils'); 1015 1016//Default options 1017var DEFAULT_OPTIONS = { 1018 decodeHtmlEntities: true, 1019 locationInfo: false 1020}; 1021 1022//Skipping handler 1023function skip() { 1024 //NOTE: do nothing =) 1025} 1026 1027//SimpleApiParser 1028var SimpleApiParser = module.exports = function (handlers, options) { 1029 this.options = Utils.mergeOptions(DEFAULT_OPTIONS, options); 1030 this.handlers = { 1031 doctype: this._wrapHandler(handlers.doctype), 1032 startTag: this._wrapHandler(handlers.startTag), 1033 endTag: this._wrapHandler(handlers.endTag), 1034 text: this._wrapHandler(handlers.text), 1035 comment: this._wrapHandler(handlers.comment) 1036 }; 1037}; 1038 1039SimpleApiParser.prototype._wrapHandler = function (handler) { 1040 var parser = this; 1041 1042 handler = handler || skip; 1043 1044 if (this.options.locationInfo) { 1045 return function () { 1046 var args = Array.prototype.slice.call(arguments); 1047 args.push(parser.currentTokenLocation); 1048 handler.apply(handler, args); 1049 }; 1050 } 1051 1052 return handler; 1053}; 1054 1055//API 1056SimpleApiParser.prototype.parse = function (html) { 1057 var token = null; 1058 1059 this._reset(html); 1060 1061 do { 1062 token = this.tokenizerProxy.getNextToken(); 1063 1064 if (token.type === Tokenizer.CHARACTER_TOKEN || 1065 token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN || 1066 token.type === Tokenizer.NULL_CHARACTER_TOKEN) { 1067 1068 if (this.options.locationInfo) { 1069 if (this.pendingText === null) 1070 this.currentTokenLocation = token.location; 1071 1072 else 1073 this.currentTokenLocation.end = token.location.end; 1074 } 1075 1076 this.pendingText = (this.pendingText || '') + token.chars; 1077 } 1078 1079 else { 1080 this._emitPendingText(); 1081 this._handleToken(token); 1082 } 1083 } while (token.type !== Tokenizer.EOF_TOKEN); 1084}; 1085 1086//Internals 1087SimpleApiParser.prototype._handleToken = function (token) { 1088 if (this.options.locationInfo) 1089 this.currentTokenLocation = token.location; 1090 1091 if (token.type === Tokenizer.START_TAG_TOKEN) 1092 this.handlers.startTag(token.tagName, token.attrs, token.selfClosing); 1093 1094 else if (token.type === Tokenizer.END_TAG_TOKEN) 1095 this.handlers.endTag(token.tagName); 1096 1097 else if (token.type === Tokenizer.COMMENT_TOKEN) 1098 this.handlers.comment(token.data); 1099 1100 else if (token.type === Tokenizer.DOCTYPE_TOKEN) 1101 this.handlers.doctype(token.name, token.publicId, token.systemId); 1102 1103}; 1104 1105SimpleApiParser.prototype._reset = function (html) { 1106 this.tokenizerProxy = new TokenizerProxy(html, this.options); 1107 this.pendingText = null; 1108 this.currentTokenLocation = null; 1109}; 1110 1111SimpleApiParser.prototype._emitPendingText = function () { 1112 if (this.pendingText !== null) { 1113 this.handlers.text(this.pendingText); 1114 this.pendingText = null; 1115 } 1116}; 1117 1118},{"../common/utils":5,"../tokenization/tokenizer":14,"./tokenizer_proxy":10}],10:[function(require,module,exports){ 1119'use strict'; 1120 1121var Tokenizer = require('../tokenization/tokenizer'), 1122 ForeignContent = require('../common/foreign_content'), 1123 UNICODE = require('../common/unicode'), 1124 HTML = require('../common/html'); 1125 1126//Aliases 1127var $ = HTML.TAG_NAMES, 1128 NS = HTML.NAMESPACES; 1129 1130 1131//Tokenizer proxy 1132//NOTE: this proxy simulates adjustment of the Tokenizer which performed by standard parser during tree construction. 1133var TokenizerProxy = module.exports = function (html, options) { 1134 this.tokenizer = new Tokenizer(html, options); 1135 1136 this.namespaceStack = []; 1137 this.namespaceStackTop = -1; 1138 this.currentNamespace = null; 1139 this.inForeignContent = false; 1140}; 1141 1142//API 1143TokenizerProxy.prototype.getNextToken = function () { 1144 var token = this.tokenizer.getNextToken(); 1145 1146 if (token.type === Tokenizer.START_TAG_TOKEN) 1147 this._handleStartTagToken(token); 1148 1149 else if (token.type === Tokenizer.END_TAG_TOKEN) 1150 this._handleEndTagToken(token); 1151 1152 else if (token.type === Tokenizer.NULL_CHARACTER_TOKEN && this.inForeignContent) { 1153 token.type = Tokenizer.CHARACTER_TOKEN; 1154 token.chars = UNICODE.REPLACEMENT_CHARACTER; 1155 } 1156 1157 return token; 1158}; 1159 1160//Namespace stack mutations 1161TokenizerProxy.prototype._enterNamespace = function (namespace) { 1162 this.namespaceStackTop++; 1163 this.namespaceStack.push(namespace); 1164 1165 this.inForeignContent = namespace !== NS.HTML; 1166 this.currentNamespace = namespace; 1167 this.tokenizer.allowCDATA = this.inForeignContent; 1168}; 1169 1170TokenizerProxy.prototype._leaveCurrentNamespace = function () { 1171 this.namespaceStackTop--; 1172 this.namespaceStack.pop(); 1173 1174 this.currentNamespace = this.namespaceStack[this.namespaceStackTop]; 1175 this.inForeignContent = this.currentNamespace !== NS.HTML; 1176 this.tokenizer.allowCDATA = this.inForeignContent; 1177}; 1178 1179//Token handlers 1180TokenizerProxy.prototype._ensureTokenizerMode = function (tn) { 1181 if (tn === $.TEXTAREA || tn === $.TITLE) 1182 this.tokenizer.state = Tokenizer.MODE.RCDATA; 1183 1184 else if (tn === $.PLAINTEXT) 1185 this.tokenizer.state = Tokenizer.MODE.PLAINTEXT; 1186 1187 else if (tn === $.SCRIPT) 1188 this.tokenizer.state = Tokenizer.MODE.SCRIPT_DATA; 1189 1190 else if (tn === $.STYLE || tn === $.IFRAME || tn === $.XMP || 1191 tn === $.NOEMBED || tn === $.NOFRAMES || tn === $.NOSCRIPT) { 1192 this.tokenizer.state = Tokenizer.MODE.RAWTEXT; 1193 } 1194}; 1195 1196TokenizerProxy.prototype._handleStartTagToken = function (token) { 1197 var tn = token.tagName; 1198 1199 if (tn === $.SVG) 1200 this._enterNamespace(NS.SVG); 1201 1202 else if (tn === $.MATH) 1203 this._enterNamespace(NS.MATHML); 1204 1205 else { 1206 if (this.inForeignContent) { 1207 if (ForeignContent.causesExit(token)) 1208 this._leaveCurrentNamespace(); 1209 1210 else if (ForeignContent.isMathMLTextIntegrationPoint(tn, this.currentNamespace) || 1211 ForeignContent.isHtmlIntegrationPoint(tn, this.currentNamespace, token.attrs)) { 1212 this._enterNamespace(NS.HTML); 1213 } 1214 } 1215 1216 else 1217 this._ensureTokenizerMode(tn); 1218 } 1219}; 1220 1221TokenizerProxy.prototype._handleEndTagToken = function (token) { 1222 var tn = token.tagName; 1223 1224 if (!this.inForeignContent) { 1225 var previousNs = this.namespaceStack[this.namespaceStackTop - 1]; 1226 1227 //NOTE: check for exit from integration point 1228 if (ForeignContent.isMathMLTextIntegrationPoint(tn, previousNs) || 1229 ForeignContent.isHtmlIntegrationPoint(tn, previousNs, token.attrs)) { 1230 this._leaveCurrentNamespace(); 1231 } 1232 1233 else if (tn === $.SCRIPT) 1234 this.tokenizer.state = Tokenizer.MODE.DATA; 1235 } 1236 1237 else if ((tn === $.SVG && this.currentNamespace === NS.SVG) || 1238 (tn === $.MATH && this.currentNamespace === NS.MATHML)) 1239 this._leaveCurrentNamespace(); 1240}; 1241 1242},{"../common/foreign_content":2,"../common/html":3,"../common/unicode":4,"../tokenization/tokenizer":14}],11:[function(require,module,exports){ 1243'use strict'; 1244 1245exports.assign = function (tokenizer) { 1246 //NOTE: obtain Tokenizer proto this way to avoid module circular references 1247 var tokenizerProto = Object.getPrototypeOf(tokenizer); 1248 1249 tokenizer.tokenStartLoc = -1; 1250 1251 //NOTE: add location info builder method 1252 tokenizer._attachLocationInfo = function (token) { 1253 token.location = { 1254 start: this.tokenStartLoc, 1255 end: -1 1256 }; 1257 }; 1258 1259 //NOTE: patch token creation methods and attach location objects 1260 tokenizer._createStartTagToken = function (tagNameFirstCh) { 1261 tokenizerProto._createStartTagToken.call(this, tagNameFirstCh); 1262 this._attachLocationInfo(this.currentToken); 1263 }; 1264 1265 tokenizer._createEndTagToken = function (tagNameFirstCh) { 1266 tokenizerProto._createEndTagToken.call(this, tagNameFirstCh); 1267 this._attachLocationInfo(this.currentToken); 1268 }; 1269 1270 tokenizer._createCommentToken = function () { 1271 tokenizerProto._createCommentToken.call(this); 1272 this._attachLocationInfo(this.currentToken); 1273 }; 1274 1275 tokenizer._createDoctypeToken = function (doctypeNameFirstCh) { 1276 tokenizerProto._createDoctypeToken.call(this, doctypeNameFirstCh); 1277 this._attachLocationInfo(this.currentToken); 1278 }; 1279 1280 tokenizer._createCharacterToken = function (type, ch) { 1281 tokenizerProto._createCharacterToken.call(this, type, ch); 1282 this._attachLocationInfo(this.currentCharacterToken); 1283 }; 1284 1285 //NOTE: patch token emission methods to determine end location 1286 tokenizer._emitCurrentToken = function () { 1287 //NOTE: if we have pending character token make it's end location equal to the 1288 //current token's start location. 1289 if (this.currentCharacterToken) 1290 this.currentCharacterToken.location.end = this.currentToken.location.start; 1291 1292 this.currentToken.location.end = this.preprocessor.pos + 1; 1293 tokenizerProto._emitCurrentToken.call(this); 1294 }; 1295 1296 tokenizer._emitCurrentCharacterToken = function () { 1297 //NOTE: if we have character token and it's location wasn't set in the _emitCurrentToken(), 1298 //then set it's location at the current preprocessor position 1299 if (this.currentCharacterToken && this.currentCharacterToken.location.end === -1) { 1300 //NOTE: we don't need to increment preprocessor position, since character token 1301 //emission is always forced by the start of the next character token here. 1302 //So, we already have advanced position. 1303 this.currentCharacterToken.location.end = this.preprocessor.pos; 1304 } 1305 1306 tokenizerProto._emitCurrentCharacterToken.call(this); 1307 }; 1308 1309 //NOTE: patch initial states for each mode to obtain token start position 1310 Object.keys(tokenizerProto.MODE) 1311 1312 .map(function (modeName) { 1313 return tokenizerProto.MODE[modeName]; 1314 }) 1315 1316 .forEach(function (state) { 1317 tokenizer[state] = function (cp) { 1318 this.tokenStartLoc = this.preprocessor.pos; 1319 tokenizerProto[state].call(this, cp); 1320 }; 1321 }); 1322}; 1323 1324},{}],12:[function(require,module,exports){ 1325'use strict'; 1326 1327//NOTE: this file contains auto generated trie structure that is used for named entity references consumption 1328//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#tokenizing-character-references and 1329//http://www.whatwg.org/specs/web-apps/current-work/multipage/named-character-references.html#named-character-references) 1330module.exports = {65:{l:{69:{l:{108:{l:{105:{l:{103:{l:{59:{c:[198]}},c:[198]}}}}}}},77:{l:{80:{l:{59:{c:[38]}},c:[38]}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[193]}},c:[193]}}}}}}}}},98:{l:{114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[258]}}}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[194]}},c:[194]}}}}},121:{l:{59:{c:[1040]}}}}},102:{l:{114:{l:{59:{c:[120068]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[192]}},c:[192]}}}}}}}}},108:{l:{112:{l:{104:{l:{97:{l:{59:{c:[913]}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[256]}}}}}}}}},110:{l:{100:{l:{59:{c:[10835]}}}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[260]}}}}}}},112:{l:{102:{l:{59:{c:[120120]}}}}}}},112:{l:{112:{l:{108:{l:{121:{l:{70:{l:{117:{l:{110:{l:{99:{l:{116:{l:{105:{l:{111:{l:{110:{l:{59:{c:[8289]}}}}}}}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{110:{l:{103:{l:{59:{c:[197]}},c:[197]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119964]}}}}},115:{l:{105:{l:{103:{l:{110:{l:{59:{c:[8788]}}}}}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[195]}},c:[195]}}}}}}}}},117:{l:{109:{l:{108:{l:{59:{c:[196]}},c:[196]}}}}}}},66:{l:{97:{l:{99:{l:{107:{l:{115:{l:{108:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8726]}}}}}}}}}}}}}}},114:{l:{118:{l:{59:{c:[10983]}}},119:{l:{101:{l:{100:{l:{59:{c:[8966]}}}}}}}}}}},99:{l:{121:{l:{59:{c:[1041]}}}}},101:{l:{99:{l:{97:{l:{117:{l:{115:{l:{101:{l:{59:{c:[8757]}}}}}}}}}}},114:{l:{110:{l:{111:{l:{117:{l:{108:{l:{108:{l:{105:{l:{115:{l:{59:{c:[8492]}}}}}}}}}}}}}}}}},116:{l:{97:{l:{59:{c:[914]}}}}}}},102:{l:{114:{l:{59:{c:[120069]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120121]}}}}}}},114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[728]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8492]}}}}}}},117:{l:{109:{l:{112:{l:{101:{l:{113:{l:{59:{c:[8782]}}}}}}}}}}}}},67:{l:{72:{l:{99:{l:{121:{l:{59:{c:[1063]}}}}}}},79:{l:{80:{l:{89:{l:{59:{c:[169]}},c:[169]}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[262]}}}}}}}}},112:{l:{59:{c:[8914]},105:{l:{116:{l:{97:{l:{108:{l:{68:{l:{105:{l:{102:{l:{102:{l:{101:{l:{114:{l:{101:{l:{110:{l:{116:{l:{105:{l:{97:{l:{108:{l:{68:{l:{59:{c:[8517]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},121:{l:{108:{l:{101:{l:{121:{l:{115:{l:{59:{c:[8493]}}}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[268]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[199]}},c:[199]}}}}}}},105:{l:{114:{l:{99:{l:{59:{c:[264]}}}}}}},111:{l:{110:{l:{105:{l:{110:{l:{116:{l:{59:{c:[8752]}}}}}}}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[266]}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{108:{l:{97:{l:{59:{c:[184]}}}}}}}}}}},110:{l:{116:{l:{101:{l:{114:{l:{68:{l:{111:{l:{116:{l:{59:{c:[183]}}}}}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[8493]}}}}},104:{l:{105:{l:{59:{c:[935]}}}}},105:{l:{114:{l:{99:{l:{108:{l:{101:{l:{68:{l:{111:{l:{116:{l:{59:{c:[8857]}}}}}}},77:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[8854]}}}}}}}}}}},80:{l:{108:{l:{117:{l:{115:{l:{59:{c:[8853]}}}}}}}}},84:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8855]}}}}}}}}}}}}}}}}}}}}},108:{l:{111:{l:{99:{l:{107:{l:{119:{l:{105:{l:{115:{l:{101:{l:{67:{l:{111:{l:{110:{l:{116:{l:{111:{l:{117:{l:{114:{l:{73:{l:{110:{l:{116:{l:{101:{l:{103:{l:{114:{l:{97:{l:{108:{l:{59:{c:[8754]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{101:{l:{67:{l:{117:{l:{114:{l:{108:{l:{121:{l:{68:{l:{111:{l:{117:{l:{98:{l:{108:{l:{101:{l:{81:{l:{117:{l:{111:{l:{116:{l:{101:{l:{59:{c:[8221]}}}}}}}}}}}}}}}}}}}}}}},81:{l:{117:{l:{111:{l:{116:{l:{101:{l:{59:{c:[8217]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},111:{l:{108:{l:{111:{l:{110:{l:{59:{c:[8759]},101:{l:{59:{c:[10868]}}}}}}}}},110:{l:{103:{l:{114:{l:{117:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8801]}}}}}}}}}}}}},105:{l:{110:{l:{116:{l:{59:{c:[8751]}}}}}}},116:{l:{111:{l:{117:{l:{114:{l:{73:{l:{110:{l:{116:{l:{101:{l:{103:{l:{114:{l:{97:{l:{108:{l:{59:{c:[8750]}}}}}}}}}}}}}}}}}}}}}}}}}}},112:{l:{102:{l:{59:{c:[8450]}}},114:{l:{111:{l:{100:{l:{117:{l:{99:{l:{116:{l:{59:{c:[8720]}}}}}}}}}}}}}}},117:{l:{110:{l:{116:{l:{101:{l:{114:{l:{67:{l:{108:{l:{111:{l:{99:{l:{107:{l:{119:{l:{105:{l:{115:{l:{101:{l:{67:{l:{111:{l:{110:{l:{116:{l:{111:{l:{117:{l:{114:{l:{73:{l:{110:{l:{116:{l:{101:{l:{103:{l:{114:{l:{97:{l:{108:{l:{59:{c:[8755]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},114:{l:{111:{l:{115:{l:{115:{l:{59:{c:[10799]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119966]}}}}}}},117:{l:{112:{l:{59:{c:[8915]},67:{l:{97:{l:{112:{l:{59:{c:[8781]}}}}}}}}}}}}},68:{l:{68:{l:{59:{c:[8517]},111:{l:{116:{l:{114:{l:{97:{l:{104:{l:{100:{l:{59:{c:[10513]}}}}}}}}}}}}}}},74:{l:{99:{l:{121:{l:{59:{c:[1026]}}}}}}},83:{l:{99:{l:{121:{l:{59:{c:[1029]}}}}}}},90:{l:{99:{l:{121:{l:{59:{c:[1039]}}}}}}},97:{l:{103:{l:{103:{l:{101:{l:{114:{l:{59:{c:[8225]}}}}}}}}},114:{l:{114:{l:{59:{c:[8609]}}}}},115:{l:{104:{l:{118:{l:{59:{c:[10980]}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[270]}}}}}}}}},121:{l:{59:{c:[1044]}}}}},101:{l:{108:{l:{59:{c:[8711]},116:{l:{97:{l:{59:{c:[916]}}}}}}}}},102:{l:{114:{l:{59:{c:[120071]}}}}},105:{l:{97:{l:{99:{l:{114:{l:{105:{l:{116:{l:{105:{l:{99:{l:{97:{l:{108:{l:{65:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[180]}}}}}}}}}}},68:{l:{111:{l:{116:{l:{59:{c:[729]}}},117:{l:{98:{l:{108:{l:{101:{l:{65:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[733]}}}}}}}}}}}}}}}}}}}}}}},71:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[96]}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[732]}}}}}}}}}}}}}}}}}}}}}}}}}}},109:{l:{111:{l:{110:{l:{100:{l:{59:{c:[8900]}}}}}}}}}}},102:{l:{102:{l:{101:{l:{114:{l:{101:{l:{110:{l:{116:{l:{105:{l:{97:{l:{108:{l:{68:{l:{59:{c:[8518]}}}}}}}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120123]}}}}},116:{l:{59:{c:[168]},68:{l:{111:{l:{116:{l:{59:{c:[8412]}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8784]}}}}}}}}}}}}},117:{l:{98:{l:{108:{l:{101:{l:{67:{l:{111:{l:{110:{l:{116:{l:{111:{l:{117:{l:{114:{l:{73:{l:{110:{l:{116:{l:{101:{l:{103:{l:{114:{l:{97:{l:{108:{l:{59:{c:[8751]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},68:{l:{111:{l:{116:{l:{59:{c:[168]}}},119:{l:{110:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8659]}}}}}}}}}}}}}}}}}}},76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8656]}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8660]}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{59:{c:[10980]}}}}}}}}}}}}},111:{l:{110:{l:{103:{l:{76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10232]}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10234]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10233]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8658]}}}}}}}}}}},84:{l:{101:{l:{101:{l:{59:{c:[8872]}}}}}}}}}}}}}}}}},85:{l:{112:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8657]}}}}}}}}}}},68:{l:{111:{l:{119:{l:{110:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8661]}}}}}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{114:{l:{116:{l:{105:{l:{99:{l:{97:{l:{108:{l:{66:{l:{97:{l:{114:{l:{59:{c:[8741]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},119:{l:{110:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8595]},66:{l:{97:{l:{114:{l:{59:{c:[10515]}}}}}}},85:{l:{112:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8693]}}}}}}}}}}}}}}}}}}}}}}}}},66:{l:{114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[785]}}}}}}}}}}},76:{l:{101:{l:{102:{l:{116:{l:{82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10576]}}}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10590]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8637]},66:{l:{97:{l:{114:{l:{59:{c:[10582]}}}}}}}}}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{84:{l:{101:{l:{101:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10591]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8641]},66:{l:{97:{l:{114:{l:{59:{c:[10583]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{59:{c:[8868]},65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8615]}}}}}}}}}}}}}}}}},97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8659]}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119967]}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[272]}}}}}}}}}}}}},69:{l:{78:{l:{71:{l:{59:{c:[330]}}}}},84:{l:{72:{l:{59:{c:[208]}},c:[208]}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[201]}},c:[201]}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[282]}}}}}}}}},105:{l:{114:{l:{99:{l:{59:{c:[202]}},c:[202]}}}}},121:{l:{59:{c:[1069]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[278]}}}}}}},102:{l:{114:{l:{59:{c:[120072]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[200]}},c:[200]}}}}}}}}},108:{l:{101:{l:{109:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8712]}}}}}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[274]}}}}}}},112:{l:{116:{l:{121:{l:{83:{l:{109:{l:{97:{l:{108:{l:{108:{l:{83:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[9723]}}}}}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{114:{l:{121:{l:{83:{l:{109:{l:{97:{l:{108:{l:{108:{l:{83:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[9643]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[280]}}}}}}},112:{l:{102:{l:{59:{c:[120124]}}}}}}},112:{l:{115:{l:{105:{l:{108:{l:{111:{l:{110:{l:{59:{c:[917]}}}}}}}}}}}}},113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10869]},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8770]}}}}}}}}}}}}}}},105:{l:{108:{l:{105:{l:{98:{l:{114:{l:{105:{l:{117:{l:{109:{l:{59:{c:[8652]}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8496]}}}}},105:{l:{109:{l:{59:{c:[10867]}}}}}}},116:{l:{97:{l:{59:{c:[919]}}}}},117:{l:{109:{l:{108:{l:{59:{c:[203]}},c:[203]}}}}},120:{l:{105:{l:{115:{l:{116:{l:{115:{l:{59:{c:[8707]}}}}}}}}},112:{l:{111:{l:{110:{l:{101:{l:{110:{l:{116:{l:{105:{l:{97:{l:{108:{l:{69:{l:{59:{c:[8519]}}}}}}}}}}}}}}}}}}}}}}}}},70:{l:{99:{l:{121:{l:{59:{c:[1060]}}}}},102:{l:{114:{l:{59:{c:[120073]}}}}},105:{l:{108:{l:{108:{l:{101:{l:{100:{l:{83:{l:{109:{l:{97:{l:{108:{l:{108:{l:{83:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[9724]}}}}}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{114:{l:{121:{l:{83:{l:{109:{l:{97:{l:{108:{l:{108:{l:{83:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[9642]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120125]}}}}},114:{l:{65:{l:{108:{l:{108:{l:{59:{c:[8704]}}}}}}}}},117:{l:{114:{l:{105:{l:{101:{l:{114:{l:{116:{l:{114:{l:{102:{l:{59:{c:[8497]}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8497]}}}}}}}}},71:{l:{74:{l:{99:{l:{121:{l:{59:{c:[1027]}}}}}}},84:{l:{59:{c:[62]}},c:[62]},97:{l:{109:{l:{109:{l:{97:{l:{59:{c:[915]},100:{l:{59:{c:[988]}}}}}}}}}}},98:{l:{114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[286]}}}}}}}}}}},99:{l:{101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[290]}}}}}}}}},105:{l:{114:{l:{99:{l:{59:{c:[284]}}}}}}},121:{l:{59:{c:[1043]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[288]}}}}}}},102:{l:{114:{l:{59:{c:[120074]}}}}},103:{l:{59:{c:[8921]}}},111:{l:{112:{l:{102:{l:{59:{c:[120126]}}}}}}},114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8805]},76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8923]}}}}}}}}}}}}}}}}}}},70:{l:{117:{l:{108:{l:{108:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8807]}}}}}}}}}}}}}}}}}}},71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[10914]}}}}}}}}}}}}}}},76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8823]}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10878]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8819]}}}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119970]}}}}}}},116:{l:{59:{c:[8811]}}}}},72:{l:{65:{l:{82:{l:{68:{l:{99:{l:{121:{l:{59:{c:[1066]}}}}}}}}}}},97:{l:{99:{l:{101:{l:{107:{l:{59:{c:[711]}}}}}}},116:{l:{59:{c:[94]}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[292]}}}}}}}}},102:{l:{114:{l:{59:{c:[8460]}}}}},105:{l:{108:{l:{98:{l:{101:{l:{114:{l:{116:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8459]}}}}}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[8461]}}}}},114:{l:{105:{l:{122:{l:{111:{l:{110:{l:{116:{l:{97:{l:{108:{l:{76:{l:{105:{l:{110:{l:{101:{l:{59:{c:[9472]}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8459]}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[294]}}}}}}}}}}},117:{l:{109:{l:{112:{l:{68:{l:{111:{l:{119:{l:{110:{l:{72:{l:{117:{l:{109:{l:{112:{l:{59:{c:[8782]}}}}}}}}}}}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8783]}}}}}}}}}}}}}}}}}}},73:{l:{69:{l:{99:{l:{121:{l:{59:{c:[1045]}}}}}}},74:{l:{108:{l:{105:{l:{103:{l:{59:{c:[306]}}}}}}}}},79:{l:{99:{l:{121:{l:{59:{c:[1025]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[205]}},c:[205]}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[206]}},c:[206]}}}}},121:{l:{59:{c:[1048]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[304]}}}}}}},102:{l:{114:{l:{59:{c:[8465]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[204]}},c:[204]}}}}}}}}},109:{l:{59:{c:[8465]},97:{l:{99:{l:{114:{l:{59:{c:[298]}}}}},103:{l:{105:{l:{110:{l:{97:{l:{114:{l:{121:{l:{73:{l:{59:{c:[8520]}}}}}}}}}}}}}}}}},112:{l:{108:{l:{105:{l:{101:{l:{115:{l:{59:{c:[8658]}}}}}}}}}}}}},110:{l:{116:{l:{59:{c:[8748]},101:{l:{103:{l:{114:{l:{97:{l:{108:{l:{59:{c:[8747]}}}}}}}}},114:{l:{115:{l:{101:{l:{99:{l:{116:{l:{105:{l:{111:{l:{110:{l:{59:{c:[8898]}}}}}}}}}}}}}}}}}}}}},118:{l:{105:{l:{115:{l:{105:{l:{98:{l:{108:{l:{101:{l:{67:{l:{111:{l:{109:{l:{109:{l:{97:{l:{59:{c:[8291]}}}}}}}}}}},84:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8290]}}}}}}}}}}}}}}}}}}}}}}}}}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[302]}}}}}}},112:{l:{102:{l:{59:{c:[120128]}}}}},116:{l:{97:{l:{59:{c:[921]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8464]}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[296]}}}}}}}}}}},117:{l:{107:{l:{99:{l:{121:{l:{59:{c:[1030]}}}}}}},109:{l:{108:{l:{59:{c:[207]}},c:[207]}}}}}}},74:{l:{99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[308]}}}}}}},121:{l:{59:{c:[1049]}}}}},102:{l:{114:{l:{59:{c:[120077]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120129]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119973]}}}}},101:{l:{114:{l:{99:{l:{121:{l:{59:{c:[1032]}}}}}}}}}}},117:{l:{107:{l:{99:{l:{121:{l:{59:{c:[1028]}}}}}}}}}}},75:{l:{72:{l:{99:{l:{121:{l:{59:{c:[1061]}}}}}}},74:{l:{99:{l:{121:{l:{59:{c:[1036]}}}}}}},97:{l:{112:{l:{112:{l:{97:{l:{59:{c:[922]}}}}}}}}},99:{l:{101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[310]}}}}}}}}},121:{l:{59:{c:[1050]}}}}},102:{l:{114:{l:{59:{c:[120078]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120130]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119974]}}}}}}}}},76:{l:{74:{l:{99:{l:{121:{l:{59:{c:[1033]}}}}}}},84:{l:{59:{c:[60]}},c:[60]},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[313]}}}}}}}}},109:{l:{98:{l:{100:{l:{97:{l:{59:{c:[923]}}}}}}}}},110:{l:{103:{l:{59:{c:[10218]}}}}},112:{l:{108:{l:{97:{l:{99:{l:{101:{l:{116:{l:{114:{l:{102:{l:{59:{c:[8466]}}}}}}}}}}}}}}}}},114:{l:{114:{l:{59:{c:[8606]}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[317]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[315]}}}}}}}}},121:{l:{59:{c:[1051]}}}}},101:{l:{102:{l:{116:{l:{65:{l:{110:{l:{103:{l:{108:{l:{101:{l:{66:{l:{114:{l:{97:{l:{99:{l:{107:{l:{101:{l:{116:{l:{59:{c:[10216]}}}}}}}}}}}}}}}}}}}}}}},114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8592]},66:{l:{97:{l:{114:{l:{59:{c:[8676]}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8646]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},67:{l:{101:{l:{105:{l:{108:{l:{105:{l:{110:{l:{103:{l:{59:{c:[8968]}}}}}}}}}}}}}}},68:{l:{111:{l:{117:{l:{98:{l:{108:{l:{101:{l:{66:{l:{114:{l:{97:{l:{99:{l:{107:{l:{101:{l:{116:{l:{59:{c:[10214]}}}}}}}}}}}}}}}}}}}}}}},119:{l:{110:{l:{84:{l:{101:{l:{101:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10593]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8643]},66:{l:{97:{l:{114:{l:{59:{c:[10585]}}}}}}}}}}}}}}}}}}}}}}}}}}},70:{l:{108:{l:{111:{l:{111:{l:{114:{l:{59:{c:[8970]}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8596]}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10574]}}}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{59:{c:[8867]},65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8612]}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10586]}}}}}}}}}}}}}}}}},114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[8882]},66:{l:{97:{l:{114:{l:{59:{c:[10703]}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8884]}}}}}}}}}}}}}}}}}}}}}}}}}}},85:{l:{112:{l:{68:{l:{111:{l:{119:{l:{110:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10577]}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10592]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8639]},66:{l:{97:{l:{114:{l:{59:{c:[10584]}}}}}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8636]},66:{l:{97:{l:{114:{l:{59:{c:[10578]}}}}}}}}}}}}}}}}}}},97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8656]}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8660]}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{115:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[8922]}}}}}}}}}}}}}}}}}}}}}}}}},70:{l:{117:{l:{108:{l:{108:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8806]}}}}}}}}}}}}}}}}}}},71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[8822]}}}}}}}}}}}}}}},76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[10913]}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10877]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8818]}}}}}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120079]}}}}},108:{l:{59:{c:[8920]},101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8666]}}}}}}}}}}}}}}}}}}},109:{l:{105:{l:{100:{l:{111:{l:{116:{l:{59:{c:[319]}}}}}}}}}}},111:{l:{110:{l:{103:{l:{76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10229]}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10231]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10230]}}}}}}}}}}}}}}}}}}}}},108:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10232]}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10234]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10233]}}}}}}}}}}}}}}}}}}}}}}}}},112:{l:{102:{l:{59:{c:[120131]}}}}},119:{l:{101:{l:{114:{l:{76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8601]}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8600]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8466]}}}}},104:{l:{59:{c:[8624]}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[321]}}}}}}}}}}},116:{l:{59:{c:[8810]}}}}},77:{l:{97:{l:{112:{l:{59:{c:[10501]}}}}},99:{l:{121:{l:{59:{c:[1052]}}}}},101:{l:{100:{l:{105:{l:{117:{l:{109:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8287]}}}}}}}}}}}}}}}}}}},108:{l:{108:{l:{105:{l:{110:{l:{116:{l:{114:{l:{102:{l:{59:{c:[8499]}}}}}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120080]}}}}},105:{l:{110:{l:{117:{l:{115:{l:{80:{l:{108:{l:{117:{l:{115:{l:{59:{c:[8723]}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120132]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8499]}}}}}}},117:{l:{59:{c:[924]}}}}},78:{l:{74:{l:{99:{l:{121:{l:{59:{c:[1034]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[323]}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[327]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[325]}}}}}}}}},121:{l:{59:{c:[1053]}}}}},101:{l:{103:{l:{97:{l:{116:{l:{105:{l:{118:{l:{101:{l:{77:{l:{101:{l:{100:{l:{105:{l:{117:{l:{109:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8203]}}}}}}}}}}}}}}}}}}}}}}},84:{l:{104:{l:{105:{l:{99:{l:{107:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8203]}}}}}}}}}}}}}}},110:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8203]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{114:{l:{121:{l:{84:{l:{104:{l:{105:{l:{110:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8203]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{116:{l:{101:{l:{100:{l:{71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[8811]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},76:{l:{101:{l:{115:{l:{115:{l:{76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8810]}}}}}}}}}}}}}}}}}}}}}}}}},119:{l:{76:{l:{105:{l:{110:{l:{101:{l:{59:{c:[10]}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120081]}}}}},111:{l:{66:{l:{114:{l:{101:{l:{97:{l:{107:{l:{59:{c:[8288]}}}}}}}}}}},110:{l:{66:{l:{114:{l:{101:{l:{97:{l:{107:{l:{105:{l:{110:{l:{103:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[160]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},112:{l:{102:{l:{59:{c:[8469]}}}}},116:{l:{59:{c:[10988]},67:{l:{111:{l:{110:{l:{103:{l:{114:{l:{117:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8802]}}}}}}}}}}}}}}}}},117:{l:{112:{l:{67:{l:{97:{l:{112:{l:{59:{c:[8813]}}}}}}}}}}}}},68:{l:{111:{l:{117:{l:{98:{l:{108:{l:{101:{l:{86:{l:{101:{l:{114:{l:{116:{l:{105:{l:{99:{l:{97:{l:{108:{l:{66:{l:{97:{l:{114:{l:{59:{c:[8742]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},69:{l:{108:{l:{101:{l:{109:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8713]}}}}}}}}}}}}},113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8800]},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8770,824]}}}}}}}}}}}}}}}}}}},120:{l:{105:{l:{115:{l:{116:{l:{115:{l:{59:{c:[8708]}}}}}}}}}}}}},71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[8815]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8817]}}}}}}}}}}},70:{l:{117:{l:{108:{l:{108:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8807,824]}}}}}}}}}}}}}}}}}}},71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[8811,824]}}}}}}}}}}}}}}},76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8825]}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10878,824]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8821]}}}}}}}}}}}}}}}}}}}}}}}}},72:{l:{117:{l:{109:{l:{112:{l:{68:{l:{111:{l:{119:{l:{110:{l:{72:{l:{117:{l:{109:{l:{112:{l:{59:{c:[8782,824]}}}}}}}}}}}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8783,824]}}}}}}}}}}}}}}}}}}},76:{l:{101:{l:{102:{l:{116:{l:{84:{l:{114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[8938]},66:{l:{97:{l:{114:{l:{59:{c:[10703,824]}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8940]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{115:{l:{59:{c:[8814]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8816]}}}}}}}}}}},71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[8824]}}}}}}}}}}}}}}},76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8810,824]}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10877,824]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8820]}}}}}}}}}}}}}}}}}}},78:{l:{101:{l:{115:{l:{116:{l:{101:{l:{100:{l:{71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[10914,824]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},76:{l:{101:{l:{115:{l:{115:{l:{76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[10913,824]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},80:{l:{114:{l:{101:{l:{99:{l:{101:{l:{100:{l:{101:{l:{115:{l:{59:{c:[8832]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10927,824]}}}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8928]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},82:{l:{101:{l:{118:{l:{101:{l:{114:{l:{115:{l:{101:{l:{69:{l:{108:{l:{101:{l:{109:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8716]}}}}}}}}}}}}}}}}}}}}}}}}}}},105:{l:{103:{l:{104:{l:{116:{l:{84:{l:{114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[8939]},66:{l:{97:{l:{114:{l:{59:{c:[10704,824]}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8941]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},83:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{83:{l:{117:{l:{98:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8847,824]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8930]}}}}}}}}}}}}}}}}}}},112:{l:{101:{l:{114:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8848,824]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8931]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},117:{l:{98:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8834,8402]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8840]}}}}}}}}}}}}}}}}}}},99:{l:{99:{l:{101:{l:{101:{l:{100:{l:{115:{l:{59:{c:[8833]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10928,824]}}}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8929]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8831,824]}}}}}}}}}}}}}}}}}}}}}}},112:{l:{101:{l:{114:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8835,8402]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8841]}}}}}}}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8769]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8772]}}}}}}}}}}},70:{l:{117:{l:{108:{l:{108:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8775]}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8777]}}}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{114:{l:{116:{l:{105:{l:{99:{l:{97:{l:{108:{l:{66:{l:{97:{l:{114:{l:{59:{c:[8740]}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119977]}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[209]}},c:[209]}}}}}}}}},117:{l:{59:{c:[925]}}}}},79:{l:{69:{l:{108:{l:{105:{l:{103:{l:{59:{c:[338]}}}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[211]}},c:[211]}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[212]}},c:[212]}}}}},121:{l:{59:{c:[1054]}}}}},100:{l:{98:{l:{108:{l:{97:{l:{99:{l:{59:{c:[336]}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120082]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[210]}},c:[210]}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[332]}}}}}}},101:{l:{103:{l:{97:{l:{59:{c:[937]}}}}}}},105:{l:{99:{l:{114:{l:{111:{l:{110:{l:{59:{c:[927]}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120134]}}}}}}},112:{l:{101:{l:{110:{l:{67:{l:{117:{l:{114:{l:{108:{l:{121:{l:{68:{l:{111:{l:{117:{l:{98:{l:{108:{l:{101:{l:{81:{l:{117:{l:{111:{l:{116:{l:{101:{l:{59:{c:[8220]}}}}}}}}}}}}}}}}}}}}}}},81:{l:{117:{l:{111:{l:{116:{l:{101:{l:{59:{c:[8216]}}}}}}}}}}}}}}}}}}}}}}}}}}},114:{l:{59:{c:[10836]}}},115:{l:{99:{l:{114:{l:{59:{c:[119978]}}}}},108:{l:{97:{l:{115:{l:{104:{l:{59:{c:[216]}},c:[216]}}}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[213]}},c:[213]}}}}},109:{l:{101:{l:{115:{l:{59:{c:[10807]}}}}}}}}}}},117:{l:{109:{l:{108:{l:{59:{c:[214]}},c:[214]}}}}},118:{l:{101:{l:{114:{l:{66:{l:{97:{l:{114:{l:{59:{c:[8254]}}}}},114:{l:{97:{l:{99:{l:{101:{l:{59:{c:[9182]}}},107:{l:{101:{l:{116:{l:{59:{c:[9140]}}}}}}}}}}}}}}},80:{l:{97:{l:{114:{l:{101:{l:{110:{l:{116:{l:{104:{l:{101:{l:{115:{l:{105:{l:{115:{l:{59:{c:[9180]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},80:{l:{97:{l:{114:{l:{116:{l:{105:{l:{97:{l:{108:{l:{68:{l:{59:{c:[8706]}}}}}}}}}}}}}}},99:{l:{121:{l:{59:{c:[1055]}}}}},102:{l:{114:{l:{59:{c:[120083]}}}}},104:{l:{105:{l:{59:{c:[934]}}}}},105:{l:{59:{c:[928]}}},108:{l:{117:{l:{115:{l:{77:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[177]}}}}}}}}}}}}}}}}},111:{l:{105:{l:{110:{l:{99:{l:{97:{l:{114:{l:{101:{l:{112:{l:{108:{l:{97:{l:{110:{l:{101:{l:{59:{c:[8460]}}}}}}}}}}}}}}}}}}}}}}},112:{l:{102:{l:{59:{c:[8473]}}}}}}},114:{l:{59:{c:[10939]},101:{l:{99:{l:{101:{l:{100:{l:{101:{l:{115:{l:{59:{c:[8826]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10927]}}}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8828]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8830]}}}}}}}}}}}}}}}}}}}}}}},105:{l:{109:{l:{101:{l:{59:{c:[8243]}}}}}}},111:{l:{100:{l:{117:{l:{99:{l:{116:{l:{59:{c:[8719]}}}}}}}}},112:{l:{111:{l:{114:{l:{116:{l:{105:{l:{111:{l:{110:{l:{59:{c:[8759]},97:{l:{108:{l:{59:{c:[8733]}}}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119979]}}}}},105:{l:{59:{c:[936]}}}}}}},81:{l:{85:{l:{79:{l:{84:{l:{59:{c:[34]}},c:[34]}}}}},102:{l:{114:{l:{59:{c:[120084]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[8474]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119980]}}}}}}}}},82:{l:{66:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10512]}}}}}}}}},69:{l:{71:{l:{59:{c:[174]}},c:[174]}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[340]}}}}}}}}},110:{l:{103:{l:{59:{c:[10219]}}}}},114:{l:{114:{l:{59:{c:[8608]},116:{l:{108:{l:{59:{c:[10518]}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[344]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[342]}}}}}}}}},121:{l:{59:{c:[1056]}}}}},101:{l:{59:{c:[8476]},118:{l:{101:{l:{114:{l:{115:{l:{101:{l:{69:{l:{108:{l:{101:{l:{109:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8715]}}}}}}}}}}}}},113:{l:{117:{l:{105:{l:{108:{l:{105:{l:{98:{l:{114:{l:{105:{l:{117:{l:{109:{l:{59:{c:[8651]}}}}}}}}}}}}}}}}}}}}}}},85:{l:{112:{l:{69:{l:{113:{l:{117:{l:{105:{l:{108:{l:{105:{l:{98:{l:{114:{l:{105:{l:{117:{l:{109:{l:{59:{c:[10607]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[8476]}}}}},104:{l:{111:{l:{59:{c:[929]}}}}},105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{110:{l:{103:{l:{108:{l:{101:{l:{66:{l:{114:{l:{97:{l:{99:{l:{107:{l:{101:{l:{116:{l:{59:{c:[10217]}}}}}}}}}}}}}}}}}}}}}}},114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8594]},66:{l:{97:{l:{114:{l:{59:{c:[8677]}}}}}}},76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8644]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},67:{l:{101:{l:{105:{l:{108:{l:{105:{l:{110:{l:{103:{l:{59:{c:[8969]}}}}}}}}}}}}}}},68:{l:{111:{l:{117:{l:{98:{l:{108:{l:{101:{l:{66:{l:{114:{l:{97:{l:{99:{l:{107:{l:{101:{l:{116:{l:{59:{c:[10215]}}}}}}}}}}}}}}}}}}}}}}},119:{l:{110:{l:{84:{l:{101:{l:{101:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10589]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8642]},66:{l:{97:{l:{114:{l:{59:{c:[10581]}}}}}}}}}}}}}}}}}}}}}}}}}}},70:{l:{108:{l:{111:{l:{111:{l:{114:{l:{59:{c:[8971]}}}}}}}}}}},84:{l:{101:{l:{101:{l:{59:{c:[8866]},65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8614]}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10587]}}}}}}}}}}}}}}}}},114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[8883]},66:{l:{97:{l:{114:{l:{59:{c:[10704]}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8885]}}}}}}}}}}}}}}}}}}}}}}}}}}},85:{l:{112:{l:{68:{l:{111:{l:{119:{l:{110:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10575]}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10588]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8638]},66:{l:{97:{l:{114:{l:{59:{c:[10580]}}}}}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8640]},66:{l:{97:{l:{114:{l:{59:{c:[10579]}}}}}}}}}}}}}}}}}}},97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8658]}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[8477]}}}}},117:{l:{110:{l:{100:{l:{73:{l:{109:{l:{112:{l:{108:{l:{105:{l:{101:{l:{115:{l:{59:{c:[10608]}}}}}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8667]}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8475]}}}}},104:{l:{59:{c:[8625]}}}}},117:{l:{108:{l:{101:{l:{68:{l:{101:{l:{108:{l:{97:{l:{121:{l:{101:{l:{100:{l:{59:{c:[10740]}}}}}}}}}}}}}}}}}}}}}}},83:{l:{72:{l:{67:{l:{72:{l:{99:{l:{121:{l:{59:{c:[1065]}}}}}}}}},99:{l:{121:{l:{59:{c:[1064]}}}}}}},79:{l:{70:{l:{84:{l:{99:{l:{121:{l:{59:{c:[1068]}}}}}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[346]}}}}}}}}}}},99:{l:{59:{c:[10940]},97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[352]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[350]}}}}}}}}},105:{l:{114:{l:{99:{l:{59:{c:[348]}}}}}}},121:{l:{59:{c:[1057]}}}}},102:{l:{114:{l:{59:{c:[120086]}}}}},104:{l:{111:{l:{114:{l:{116:{l:{68:{l:{111:{l:{119:{l:{110:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8595]}}}}}}}}}}}}}}}}}}},76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8592]}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8594]}}}}}}}}}}}}}}}}}}}}},85:{l:{112:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8593]}}}}}}}}}}}}}}}}}}}}}}},105:{l:{103:{l:{109:{l:{97:{l:{59:{c:[931]}}}}}}}}},109:{l:{97:{l:{108:{l:{108:{l:{67:{l:{105:{l:{114:{l:{99:{l:{108:{l:{101:{l:{59:{c:[8728]}}}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120138]}}}}}}},113:{l:{114:{l:{116:{l:{59:{c:[8730]}}}}},117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[9633]},73:{l:{110:{l:{116:{l:{101:{l:{114:{l:{115:{l:{101:{l:{99:{l:{116:{l:{105:{l:{111:{l:{110:{l:{59:{c:[8851]}}}}}}}}}}}}}}}}}}}}}}}}},83:{l:{117:{l:{98:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8847]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8849]}}}}}}}}}}}}}}}}}}},112:{l:{101:{l:{114:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8848]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8850]}}}}}}}}}}}}}}}}}}}}}}}}}}},85:{l:{110:{l:{105:{l:{111:{l:{110:{l:{59:{c:[8852]}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119982]}}}}}}},116:{l:{97:{l:{114:{l:{59:{c:[8902]}}}}}}},117:{l:{98:{l:{59:{c:[8912]},115:{l:{101:{l:{116:{l:{59:{c:[8912]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8838]}}}}}}}}}}}}}}}}}}},99:{l:{99:{l:{101:{l:{101:{l:{100:{l:{115:{l:{59:{c:[8827]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10928]}}}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8829]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8831]}}}}}}}}}}}}}}}}}}}}},104:{l:{84:{l:{104:{l:{97:{l:{116:{l:{59:{c:[8715]}}}}}}}}}}}}},109:{l:{59:{c:[8721]}}},112:{l:{59:{c:[8913]},101:{l:{114:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8835]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8839]}}}}}}}}}}}}}}}}}}}}},115:{l:{101:{l:{116:{l:{59:{c:[8913]}}}}}}}}}}}}},84:{l:{72:{l:{79:{l:{82:{l:{78:{l:{59:{c:[222]}},c:[222]}}}}}}},82:{l:{65:{l:{68:{l:{69:{l:{59:{c:[8482]}}}}}}}}},83:{l:{72:{l:{99:{l:{121:{l:{59:{c:[1035]}}}}}}},99:{l:{121:{l:{59:{c:[1062]}}}}}}},97:{l:{98:{l:{59:{c:[9]}}},117:{l:{59:{c:[932]}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[356]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[354]}}}}}}}}},121:{l:{59:{c:[1058]}}}}},102:{l:{114:{l:{59:{c:[120087]}}}}},104:{l:{101:{l:{114:{l:{101:{l:{102:{l:{111:{l:{114:{l:{101:{l:{59:{c:[8756]}}}}}}}}}}}}},116:{l:{97:{l:{59:{c:[920]}}}}}}},105:{l:{99:{l:{107:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8287,8202]}}}}}}}}}}}}}}},110:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8201]}}}}}}}}}}}}}}}}},105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8764]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8771]}}}}}}}}}}},70:{l:{117:{l:{108:{l:{108:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8773]}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8776]}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120139]}}}}}}},114:{l:{105:{l:{112:{l:{108:{l:{101:{l:{68:{l:{111:{l:{116:{l:{59:{c:[8411]}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119983]}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[358]}}}}}}}}}}}}},85:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[218]}},c:[218]}}}}}}},114:{l:{114:{l:{59:{c:[8607]},111:{l:{99:{l:{105:{l:{114:{l:{59:{c:[10569]}}}}}}}}}}}}}}},98:{l:{114:{l:{99:{l:{121:{l:{59:{c:[1038]}}}}},101:{l:{118:{l:{101:{l:{59:{c:[364]}}}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[219]}},c:[219]}}}}},121:{l:{59:{c:[1059]}}}}},100:{l:{98:{l:{108:{l:{97:{l:{99:{l:{59:{c:[368]}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120088]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[217]}},c:[217]}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[362]}}}}}}}}},110:{l:{100:{l:{101:{l:{114:{l:{66:{l:{97:{l:{114:{l:{59:{c:[95]}}}}},114:{l:{97:{l:{99:{l:{101:{l:{59:{c:[9183]}}},107:{l:{101:{l:{116:{l:{59:{c:[9141]}}}}}}}}}}}}}}},80:{l:{97:{l:{114:{l:{101:{l:{110:{l:{116:{l:{104:{l:{101:{l:{115:{l:{105:{l:{115:{l:{59:{c:[9181]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},105:{l:{111:{l:{110:{l:{59:{c:[8899]},80:{l:{108:{l:{117:{l:{115:{l:{59:{c:[8846]}}}}}}}}}}}}}}}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[370]}}}}}}},112:{l:{102:{l:{59:{c:[120140]}}}}}}},112:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8593]},66:{l:{97:{l:{114:{l:{59:{c:[10514]}}}}}}},68:{l:{111:{l:{119:{l:{110:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8645]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},68:{l:{111:{l:{119:{l:{110:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8597]}}}}}}}}}}}}}}}}}}},69:{l:{113:{l:{117:{l:{105:{l:{108:{l:{105:{l:{98:{l:{114:{l:{105:{l:{117:{l:{109:{l:{59:{c:[10606]}}}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{59:{c:[8869]},65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8613]}}}}}}}}}}}}}}}}},97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8657]}}}}}}}}}}},100:{l:{111:{l:{119:{l:{110:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8661]}}}}}}}}}}}}}}}}}}},112:{l:{101:{l:{114:{l:{76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8598]}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8599]}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{105:{l:{59:{c:[978]},108:{l:{111:{l:{110:{l:{59:{c:[933]}}}}}}}}}}}}},114:{l:{105:{l:{110:{l:{103:{l:{59:{c:[366]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119984]}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[360]}}}}}}}}}}},117:{l:{109:{l:{108:{l:{59:{c:[220]}},c:[220]}}}}}}},86:{l:{68:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8875]}}}}}}}}},98:{l:{97:{l:{114:{l:{59:{c:[10987]}}}}}}},99:{l:{121:{l:{59:{c:[1042]}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8873]},108:{l:{59:{c:[10982]}}}}}}}}}}},101:{l:{101:{l:{59:{c:[8897]}}},114:{l:{98:{l:{97:{l:{114:{l:{59:{c:[8214]}}}}}}},116:{l:{59:{c:[8214]},105:{l:{99:{l:{97:{l:{108:{l:{66:{l:{97:{l:{114:{l:{59:{c:[8739]}}}}}}},76:{l:{105:{l:{110:{l:{101:{l:{59:{c:[124]}}}}}}}}},83:{l:{101:{l:{112:{l:{97:{l:{114:{l:{97:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10072]}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8768]}}}}}}}}}}}}}}}}}}}}},121:{l:{84:{l:{104:{l:{105:{l:{110:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8202]}}}}}}}}}}}}}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120089]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120141]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119985]}}}}}}},118:{l:{100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8874]}}}}}}}}}}}}},87:{l:{99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[372]}}}}}}}}},101:{l:{100:{l:{103:{l:{101:{l:{59:{c:[8896]}}}}}}}}},102:{l:{114:{l:{59:{c:[120090]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120142]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119986]}}}}}}}}},88:{l:{102:{l:{114:{l:{59:{c:[120091]}}}}},105:{l:{59:{c:[926]}}},111:{l:{112:{l:{102:{l:{59:{c:[120143]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119987]}}}}}}}}},89:{l:{65:{l:{99:{l:{121:{l:{59:{c:[1071]}}}}}}},73:{l:{99:{l:{121:{l:{59:{c:[1031]}}}}}}},85:{l:{99:{l:{121:{l:{59:{c:[1070]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[221]}},c:[221]}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[374]}}}}}}},121:{l:{59:{c:[1067]}}}}},102:{l:{114:{l:{59:{c:[120092]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120144]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119988]}}}}}}},117:{l:{109:{l:{108:{l:{59:{c:[376]}}}}}}}}},90:{l:{72:{l:{99:{l:{121:{l:{59:{c:[1046]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[377]}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[381]}}}}}}}}},121:{l:{59:{c:[1047]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[379]}}}}}}},101:{l:{114:{l:{111:{l:{87:{l:{105:{l:{100:{l:{116:{l:{104:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8203]}}}}}}}}}}}}}}}}}}}}}}}}},116:{l:{97:{l:{59:{c:[918]}}}}}}},102:{l:{114:{l:{59:{c:[8488]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[8484]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119989]}}}}}}}}},97:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[225]}},c:[225]}}}}}}}}},98:{l:{114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[259]}}}}}}}}}}},99:{l:{59:{c:[8766]},69:{l:{59:{c:[8766,819]}}},100:{l:{59:{c:[8767]}}},105:{l:{114:{l:{99:{l:{59:{c:[226]}},c:[226]}}}}},117:{l:{116:{l:{101:{l:{59:{c:[180]}},c:[180]}}}}},121:{l:{59:{c:[1072]}}}}},101:{l:{108:{l:{105:{l:{103:{l:{59:{c:[230]}},c:[230]}}}}}}},102:{l:{59:{c:[8289]},114:{l:{59:{c:[120094]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[224]}},c:[224]}}}}}}}}},108:{l:{101:{l:{102:{l:{115:{l:{121:{l:{109:{l:{59:{c:[8501]}}}}}}}}},112:{l:{104:{l:{59:{c:[8501]}}}}}}},112:{l:{104:{l:{97:{l:{59:{c:[945]}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[257]}}}}},108:{l:{103:{l:{59:{c:[10815]}}}}}}},112:{l:{59:{c:[38]}},c:[38]}}},110:{l:{100:{l:{59:{c:[8743]},97:{l:{110:{l:{100:{l:{59:{c:[10837]}}}}}}},100:{l:{59:{c:[10844]}}},115:{l:{108:{l:{111:{l:{112:{l:{101:{l:{59:{c:[10840]}}}}}}}}}}},118:{l:{59:{c:[10842]}}}}},103:{l:{59:{c:[8736]},101:{l:{59:{c:[10660]}}},108:{l:{101:{l:{59:{c:[8736]}}}}},109:{l:{115:{l:{100:{l:{59:{c:[8737]},97:{l:{97:{l:{59:{c:[10664]}}},98:{l:{59:{c:[10665]}}},99:{l:{59:{c:[10666]}}},100:{l:{59:{c:[10667]}}},101:{l:{59:{c:[10668]}}},102:{l:{59:{c:[10669]}}},103:{l:{59:{c:[10670]}}},104:{l:{59:{c:[10671]}}}}}}}}}}},114:{l:{116:{l:{59:{c:[8735]},118:{l:{98:{l:{59:{c:[8894]},100:{l:{59:{c:[10653]}}}}}}}}}}},115:{l:{112:{l:{104:{l:{59:{c:[8738]}}}}},116:{l:{59:{c:[197]}}}}},122:{l:{97:{l:{114:{l:{114:{l:{59:{c:[9084]}}}}}}}}}}}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[261]}}}}}}},112:{l:{102:{l:{59:{c:[120146]}}}}}}},112:{l:{59:{c:[8776]},69:{l:{59:{c:[10864]}}},97:{l:{99:{l:{105:{l:{114:{l:{59:{c:[10863]}}}}}}}}},101:{l:{59:{c:[8778]}}},105:{l:{100:{l:{59:{c:[8779]}}}}},111:{l:{115:{l:{59:{c:[39]}}}}},112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[8776]},101:{l:{113:{l:{59:{c:[8778]}}}}}}}}}}}}}}},114:{l:{105:{l:{110:{l:{103:{l:{59:{c:[229]}},c:[229]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119990]}}}}},116:{l:{59:{c:[42]}}},121:{l:{109:{l:{112:{l:{59:{c:[8776]},101:{l:{113:{l:{59:{c:[8781]}}}}}}}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[227]}},c:[227]}}}}}}}}},117:{l:{109:{l:{108:{l:{59:{c:[228]}},c:[228]}}}}},119:{l:{99:{l:{111:{l:{110:{l:{105:{l:{110:{l:{116:{l:{59:{c:[8755]}}}}}}}}}}}}},105:{l:{110:{l:{116:{l:{59:{c:[10769]}}}}}}}}}}},98:{l:{78:{l:{111:{l:{116:{l:{59:{c:[10989]}}}}}}},97:{l:{99:{l:{107:{l:{99:{l:{111:{l:{110:{l:{103:{l:{59:{c:[8780]}}}}}}}}},101:{l:{112:{l:{115:{l:{105:{l:{108:{l:{111:{l:{110:{l:{59:{c:[1014]}}}}}}}}}}}}}}},112:{l:{114:{l:{105:{l:{109:{l:{101:{l:{59:{c:[8245]}}}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8765]},101:{l:{113:{l:{59:{c:[8909]}}}}}}}}}}}}}}},114:{l:{118:{l:{101:{l:{101:{l:{59:{c:[8893]}}}}}}},119:{l:{101:{l:{100:{l:{59:{c:[8965]},103:{l:{101:{l:{59:{c:[8965]}}}}}}}}}}}}}}},98:{l:{114:{l:{107:{l:{59:{c:[9141]},116:{l:{98:{l:{114:{l:{107:{l:{59:{c:[9142]}}}}}}}}}}}}}}},99:{l:{111:{l:{110:{l:{103:{l:{59:{c:[8780]}}}}}}},121:{l:{59:{c:[1073]}}}}},100:{l:{113:{l:{117:{l:{111:{l:{59:{c:[8222]}}}}}}}}},101:{l:{99:{l:{97:{l:{117:{l:{115:{l:{59:{c:[8757]},101:{l:{59:{c:[8757]}}}}}}}}}}},109:{l:{112:{l:{116:{l:{121:{l:{118:{l:{59:{c:[10672]}}}}}}}}}}},112:{l:{115:{l:{105:{l:{59:{c:[1014]}}}}}}},114:{l:{110:{l:{111:{l:{117:{l:{59:{c:[8492]}}}}}}}}},116:{l:{97:{l:{59:{c:[946]}}},104:{l:{59:{c:[8502]}}},119:{l:{101:{l:{101:{l:{110:{l:{59:{c:[8812]}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120095]}}}}},105:{l:{103:{l:{99:{l:{97:{l:{112:{l:{59:{c:[8898]}}}}},105:{l:{114:{l:{99:{l:{59:{c:[9711]}}}}}}},117:{l:{112:{l:{59:{c:[8899]}}}}}}},111:{l:{100:{l:{111:{l:{116:{l:{59:{c:[10752]}}}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10753]}}}}}}}}},116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[10754]}}}}}}}}}}}}},115:{l:{113:{l:{99:{l:{117:{l:{112:{l:{59:{c:[10758]}}}}}}}}},116:{l:{97:{l:{114:{l:{59:{c:[9733]}}}}}}}}},116:{l:{114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{100:{l:{111:{l:{119:{l:{110:{l:{59:{c:[9661]}}}}}}}}},117:{l:{112:{l:{59:{c:[9651]}}}}}}}}}}}}}}}}}}}}},117:{l:{112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10756]}}}}}}}}}}},118:{l:{101:{l:{101:{l:{59:{c:[8897]}}}}}}},119:{l:{101:{l:{100:{l:{103:{l:{101:{l:{59:{c:[8896]}}}}}}}}}}}}}}},107:{l:{97:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10509]}}}}}}}}}}},108:{l:{97:{l:{99:{l:{107:{l:{108:{l:{111:{l:{122:{l:{101:{l:{110:{l:{103:{l:{101:{l:{59:{c:[10731]}}}}}}}}}}}}}}},115:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[9642]}}}}}}}}}}}}},116:{l:{114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[9652]},100:{l:{111:{l:{119:{l:{110:{l:{59:{c:[9662]}}}}}}}}},108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[9666]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[9656]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},110:{l:{107:{l:{59:{c:[9251]}}}}}}},107:{l:{49:{l:{50:{l:{59:{c:[9618]}}},52:{l:{59:{c:[9617]}}}}},51:{l:{52:{l:{59:{c:[9619]}}}}}}},111:{l:{99:{l:{107:{l:{59:{c:[9608]}}}}}}}}},110:{l:{101:{l:{59:{c:[61,8421]},113:{l:{117:{l:{105:{l:{118:{l:{59:{c:[8801,8421]}}}}}}}}}}},111:{l:{116:{l:{59:{c:[8976]}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120147]}}}}},116:{l:{59:{c:[8869]},116:{l:{111:{l:{109:{l:{59:{c:[8869]}}}}}}}}},119:{l:{116:{l:{105:{l:{101:{l:{59:{c:[8904]}}}}}}}}},120:{l:{68:{l:{76:{l:{59:{c:[9559]}}},82:{l:{59:{c:[9556]}}},108:{l:{59:{c:[9558]}}},114:{l:{59:{c:[9555]}}}}},72:{l:{59:{c:[9552]},68:{l:{59:{c:[9574]}}},85:{l:{59:{c:[9577]}}},100:{l:{59:{c:[9572]}}},117:{l:{59:{c:[9575]}}}}},85:{l:{76:{l:{59:{c:[9565]}}},82:{l:{59:{c:[9562]}}},108:{l:{59:{c:[9564]}}},114:{l:{59:{c:[9561]}}}}},86:{l:{59:{c:[9553]},72:{l:{59:{c:[9580]}}},76:{l:{59:{c:[9571]}}},82:{l:{59:{c:[9568]}}},104:{l:{59:{c:[9579]}}},108:{l:{59:{c:[9570]}}},114:{l:{59:{c:[9567]}}}}},98:{l:{111:{l:{120:{l:{59:{c:[10697]}}}}}}},100:{l:{76:{l:{59:{c:[9557]}}},82:{l:{59:{c:[9554]}}},108:{l:{59:{c:[9488]}}},114:{l:{59:{c:[9484]}}}}},104:{l:{59:{c:[9472]},68:{l:{59:{c:[9573]}}},85:{l:{59:{c:[9576]}}},100:{l:{59:{c:[9516]}}},117:{l:{59:{c:[9524]}}}}},109:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[8863]}}}}}}}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[8862]}}}}}}}}},116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8864]}}}}}}}}}}},117:{l:{76:{l:{59:{c:[9563]}}},82:{l:{59:{c:[9560]}}},108:{l:{59:{c:[9496]}}},114:{l:{59:{c:[9492]}}}}},118:{l:{59:{c:[9474]},72:{l:{59:{c:[9578]}}},76:{l:{59:{c:[9569]}}},82:{l:{59:{c:[9566]}}},104:{l:{59:{c:[9532]}}},108:{l:{59:{c:[9508]}}},114:{l:{59:{c:[9500]}}}}}}}}},112:{l:{114:{l:{105:{l:{109:{l:{101:{l:{59:{c:[8245]}}}}}}}}}}},114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[728]}}}}}}},118:{l:{98:{l:{97:{l:{114:{l:{59:{c:[166]}},c:[166]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119991]}}}}},101:{l:{109:{l:{105:{l:{59:{c:[8271]}}}}}}},105:{l:{109:{l:{59:{c:[8765]},101:{l:{59:{c:[8909]}}}}}}},111:{l:{108:{l:{59:{c:[92]},98:{l:{59:{c:[10693]}}},104:{l:{115:{l:{117:{l:{98:{l:{59:{c:[10184]}}}}}}}}}}}}}}},117:{l:{108:{l:{108:{l:{59:{c:[8226]},101:{l:{116:{l:{59:{c:[8226]}}}}}}}}},109:{l:{112:{l:{59:{c:[8782]},69:{l:{59:{c:[10926]}}},101:{l:{59:{c:[8783]},113:{l:{59:{c:[8783]}}}}}}}}}}}}},99:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[263]}}}}}}}}},112:{l:{59:{c:[8745]},97:{l:{110:{l:{100:{l:{59:{c:[10820]}}}}}}},98:{l:{114:{l:{99:{l:{117:{l:{112:{l:{59:{c:[10825]}}}}}}}}}}},99:{l:{97:{l:{112:{l:{59:{c:[10827]}}}}},117:{l:{112:{l:{59:{c:[10823]}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[10816]}}}}}}},115:{l:{59:{c:[8745,65024]}}}}},114:{l:{101:{l:{116:{l:{59:{c:[8257]}}}}},111:{l:{110:{l:{59:{c:[711]}}}}}}}}},99:{l:{97:{l:{112:{l:{115:{l:{59:{c:[10829]}}}}},114:{l:{111:{l:{110:{l:{59:{c:[269]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[231]}},c:[231]}}}}}}},105:{l:{114:{l:{99:{l:{59:{c:[265]}}}}}}},117:{l:{112:{l:{115:{l:{59:{c:[10828]},115:{l:{109:{l:{59:{c:[10832]}}}}}}}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[267]}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[184]}},c:[184]}}}}},109:{l:{112:{l:{116:{l:{121:{l:{118:{l:{59:{c:[10674]}}}}}}}}}}},110:{l:{116:{l:{59:{c:[162]},101:{l:{114:{l:{100:{l:{111:{l:{116:{l:{59:{c:[183]}}}}}}}}}}}},c:[162]}}}}},102:{l:{114:{l:{59:{c:[120096]}}}}},104:{l:{99:{l:{121:{l:{59:{c:[1095]}}}}},101:{l:{99:{l:{107:{l:{59:{c:[10003]},109:{l:{97:{l:{114:{l:{107:{l:{59:{c:[10003]}}}}}}}}}}}}}}},105:{l:{59:{c:[967]}}}}},105:{l:{114:{l:{59:{c:[9675]},69:{l:{59:{c:[10691]}}},99:{l:{59:{c:[710]},101:{l:{113:{l:{59:{c:[8791]}}}}},108:{l:{101:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8634]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8635]}}}}}}}}}}}}}}}}}}}}},100:{l:{82:{l:{59:{c:[174]}}},83:{l:{59:{c:[9416]}}},97:{l:{115:{l:{116:{l:{59:{c:[8859]}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[8858]}}}}}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8861]}}}}}}}}}}}}}}}}},101:{l:{59:{c:[8791]}}},102:{l:{110:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10768]}}}}}}}}}}},109:{l:{105:{l:{100:{l:{59:{c:[10991]}}}}}}},115:{l:{99:{l:{105:{l:{114:{l:{59:{c:[10690]}}}}}}}}}}}}},108:{l:{117:{l:{98:{l:{115:{l:{59:{c:[9827]},117:{l:{105:{l:{116:{l:{59:{c:[9827]}}}}}}}}}}}}}}},111:{l:{108:{l:{111:{l:{110:{l:{59:{c:[58]},101:{l:{59:{c:[8788]},113:{l:{59:{c:[8788]}}}}}}}}}}},109:{l:{109:{l:{97:{l:{59:{c:[44]},116:{l:{59:{c:[64]}}}}}}},112:{l:{59:{c:[8705]},102:{l:{110:{l:{59:{c:[8728]}}}}},108:{l:{101:{l:{109:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8705]}}}}}}}}},120:{l:{101:{l:{115:{l:{59:{c:[8450]}}}}}}}}}}}}}}},110:{l:{103:{l:{59:{c:[8773]},100:{l:{111:{l:{116:{l:{59:{c:[10861]}}}}}}}}},105:{l:{110:{l:{116:{l:{59:{c:[8750]}}}}}}}}},112:{l:{102:{l:{59:{c:[120148]}}},114:{l:{111:{l:{100:{l:{59:{c:[8720]}}}}}}},121:{l:{59:{c:[169]},115:{l:{114:{l:{59:{c:[8471]}}}}}},c:[169]}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8629]}}}}}}},111:{l:{115:{l:{115:{l:{59:{c:[10007]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119992]}}}}},117:{l:{98:{l:{59:{c:[10959]},101:{l:{59:{c:[10961]}}}}},112:{l:{59:{c:[10960]},101:{l:{59:{c:[10962]}}}}}}}}},116:{l:{100:{l:{111:{l:{116:{l:{59:{c:[8943]}}}}}}}}},117:{l:{100:{l:{97:{l:{114:{l:{114:{l:{108:{l:{59:{c:[10552]}}},114:{l:{59:{c:[10549]}}}}}}}}}}},101:{l:{112:{l:{114:{l:{59:{c:[8926]}}}}},115:{l:{99:{l:{59:{c:[8927]}}}}}}},108:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8630]},112:{l:{59:{c:[10557]}}}}}}}}}}},112:{l:{59:{c:[8746]},98:{l:{114:{l:{99:{l:{97:{l:{112:{l:{59:{c:[10824]}}}}}}}}}}},99:{l:{97:{l:{112:{l:{59:{c:[10822]}}}}},117:{l:{112:{l:{59:{c:[10826]}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8845]}}}}}}},111:{l:{114:{l:{59:{c:[10821]}}}}},115:{l:{59:{c:[8746,65024]}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8631]},109:{l:{59:{c:[10556]}}}}}}}}},108:{l:{121:{l:{101:{l:{113:{l:{112:{l:{114:{l:{101:{l:{99:{l:{59:{c:[8926]}}}}}}}}},115:{l:{117:{l:{99:{l:{99:{l:{59:{c:[8927]}}}}}}}}}}}}},118:{l:{101:{l:{101:{l:{59:{c:[8910]}}}}}}},119:{l:{101:{l:{100:{l:{103:{l:{101:{l:{59:{c:[8911]}}}}}}}}}}}}}}},114:{l:{101:{l:{110:{l:{59:{c:[164]}},c:[164]}}}}},118:{l:{101:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8630]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8631]}}}}}}}}}}}}}}}}}}}}}}}}}}},118:{l:{101:{l:{101:{l:{59:{c:[8910]}}}}}}},119:{l:{101:{l:{100:{l:{59:{c:[8911]}}}}}}}}},119:{l:{99:{l:{111:{l:{110:{l:{105:{l:{110:{l:{116:{l:{59:{c:[8754]}}}}}}}}}}}}},105:{l:{110:{l:{116:{l:{59:{c:[8753]}}}}}}}}},121:{l:{108:{l:{99:{l:{116:{l:{121:{l:{59:{c:[9005]}}}}}}}}}}}}},100:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8659]}}}}}}},72:{l:{97:{l:{114:{l:{59:{c:[10597]}}}}}}},97:{l:{103:{l:{103:{l:{101:{l:{114:{l:{59:{c:[8224]}}}}}}}}},108:{l:{101:{l:{116:{l:{104:{l:{59:{c:[8504]}}}}}}}}},114:{l:{114:{l:{59:{c:[8595]}}}}},115:{l:{104:{l:{59:{c:[8208]},118:{l:{59:{c:[8867]}}}}}}}}},98:{l:{107:{l:{97:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10511]}}}}}}}}}}},108:{l:{97:{l:{99:{l:{59:{c:[733]}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[271]}}}}}}}}},121:{l:{59:{c:[1076]}}}}},100:{l:{59:{c:[8518]},97:{l:{103:{l:{103:{l:{101:{l:{114:{l:{59:{c:[8225]}}}}}}}}},114:{l:{114:{l:{59:{c:[8650]}}}}}}},111:{l:{116:{l:{115:{l:{101:{l:{113:{l:{59:{c:[10871]}}}}}}}}}}}}},101:{l:{103:{l:{59:{c:[176]}},c:[176]},108:{l:{116:{l:{97:{l:{59:{c:[948]}}}}}}},109:{l:{112:{l:{116:{l:{121:{l:{118:{l:{59:{c:[10673]}}}}}}}}}}}}},102:{l:{105:{l:{115:{l:{104:{l:{116:{l:{59:{c:[10623]}}}}}}}}},114:{l:{59:{c:[120097]}}}}},104:{l:{97:{l:{114:{l:{108:{l:{59:{c:[8643]}}},114:{l:{59:{c:[8642]}}}}}}}}},105:{l:{97:{l:{109:{l:{59:{c:[8900]},111:{l:{110:{l:{100:{l:{59:{c:[8900]},115:{l:{117:{l:{105:{l:{116:{l:{59:{c:[9830]}}}}}}}}}}}}}}},115:{l:{59:{c:[9830]}}}}}}},101:{l:{59:{c:[168]}}},103:{l:{97:{l:{109:{l:{109:{l:{97:{l:{59:{c:[989]}}}}}}}}}}},115:{l:{105:{l:{110:{l:{59:{c:[8946]}}}}}}},118:{l:{59:{c:[247]},105:{l:{100:{l:{101:{l:{59:{c:[247]},111:{l:{110:{l:{116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8903]}}}}}}}}}}}}}}}},c:[247]}}}}},111:{l:{110:{l:{120:{l:{59:{c:[8903]}}}}}}}}}}},106:{l:{99:{l:{121:{l:{59:{c:[1106]}}}}}}},108:{l:{99:{l:{111:{l:{114:{l:{110:{l:{59:{c:[8990]}}}}}}},114:{l:{111:{l:{112:{l:{59:{c:[8973]}}}}}}}}}}},111:{l:{108:{l:{108:{l:{97:{l:{114:{l:{59:{c:[36]}}}}}}}}},112:{l:{102:{l:{59:{c:[120149]}}}}},116:{l:{59:{c:[729]},101:{l:{113:{l:{59:{c:[8784]},100:{l:{111:{l:{116:{l:{59:{c:[8785]}}}}}}}}}}},109:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[8760]}}}}}}}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[8724]}}}}}}}}},115:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[8865]}}}}}}}}}}}}}}},117:{l:{98:{l:{108:{l:{101:{l:{98:{l:{97:{l:{114:{l:{119:{l:{101:{l:{100:{l:{103:{l:{101:{l:{59:{c:[8966]}}}}}}}}}}}}}}}}}}}}}}}}},119:{l:{110:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8595]}}}}}}}}}}},100:{l:{111:{l:{119:{l:{110:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{115:{l:{59:{c:[8650]}}}}}}}}}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{111:{l:{111:{l:{110:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8643]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8642]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},114:{l:{98:{l:{107:{l:{97:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10512]}}}}}}}}}}}}},99:{l:{111:{l:{114:{l:{110:{l:{59:{c:[8991]}}}}}}},114:{l:{111:{l:{112:{l:{59:{c:[8972]}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119993]}}},121:{l:{59:{c:[1109]}}}}},111:{l:{108:{l:{59:{c:[10742]}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[273]}}}}}}}}}}},116:{l:{100:{l:{111:{l:{116:{l:{59:{c:[8945]}}}}}}},114:{l:{105:{l:{59:{c:[9663]},102:{l:{59:{c:[9662]}}}}}}}}},117:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8693]}}}}}}},104:{l:{97:{l:{114:{l:{59:{c:[10607]}}}}}}}}},119:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[10662]}}}}}}}}}}}}},122:{l:{99:{l:{121:{l:{59:{c:[1119]}}}}},105:{l:{103:{l:{114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10239]}}}}}}}}}}}}}}}}},101:{l:{68:{l:{68:{l:{111:{l:{116:{l:{59:{c:[10871]}}}}}}},111:{l:{116:{l:{59:{c:[8785]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[233]}},c:[233]}}}}}}},115:{l:{116:{l:{101:{l:{114:{l:{59:{c:[10862]}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[283]}}}}}}}}},105:{l:{114:{l:{59:{c:[8790]},99:{l:{59:{c:[234]}},c:[234]}}}}},111:{l:{108:{l:{111:{l:{110:{l:{59:{c:[8789]}}}}}}}}},121:{l:{59:{c:[1101]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[279]}}}}}}},101:{l:{59:{c:[8519]}}},102:{l:{68:{l:{111:{l:{116:{l:{59:{c:[8786]}}}}}}},114:{l:{59:{c:[120098]}}}}},103:{l:{59:{c:[10906]},114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[232]}},c:[232]}}}}}}},115:{l:{59:{c:[10902]},100:{l:{111:{l:{116:{l:{59:{c:[10904]}}}}}}}}}}},108:{l:{59:{c:[10905]},105:{l:{110:{l:{116:{l:{101:{l:{114:{l:{115:{l:{59:{c:[9191]}}}}}}}}}}}}},108:{l:{59:{c:[8467]}}},115:{l:{59:{c:[10901]},100:{l:{111:{l:{116:{l:{59:{c:[10903]}}}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[275]}}}}}}},112:{l:{116:{l:{121:{l:{59:{c:[8709]},115:{l:{101:{l:{116:{l:{59:{c:[8709]}}}}}}},118:{l:{59:{c:[8709]}}}}}}}}},115:{l:{112:{l:{49:{l:{51:{l:{59:{c:[8196]}}},52:{l:{59:{c:[8197]}}}}},59:{c:[8195]}}}}}}},110:{l:{103:{l:{59:{c:[331]}}},115:{l:{112:{l:{59:{c:[8194]}}}}}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[281]}}}}}}},112:{l:{102:{l:{59:{c:[120150]}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[8917]},115:{l:{108:{l:{59:{c:[10723]}}}}}}}}},108:{l:{117:{l:{115:{l:{59:{c:[10865]}}}}}}},115:{l:{105:{l:{59:{c:[949]},108:{l:{111:{l:{110:{l:{59:{c:[949]}}}}}}},118:{l:{59:{c:[1013]}}}}}}}}},113:{l:{99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[8790]}}}}}}},111:{l:{108:{l:{111:{l:{110:{l:{59:{c:[8789]}}}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8770]}}}}},108:{l:{97:{l:{110:{l:{116:{l:{103:{l:{116:{l:{114:{l:{59:{c:[10902]}}}}}}},108:{l:{101:{l:{115:{l:{115:{l:{59:{c:[10901]}}}}}}}}}}}}}}}}}}},117:{l:{97:{l:{108:{l:{115:{l:{59:{c:[61]}}}}}}},101:{l:{115:{l:{116:{l:{59:{c:[8799]}}}}}}},105:{l:{118:{l:{59:{c:[8801]},68:{l:{68:{l:{59:{c:[10872]}}}}}}}}}}},118:{l:{112:{l:{97:{l:{114:{l:{115:{l:{108:{l:{59:{c:[10725]}}}}}}}}}}}}}}},114:{l:{68:{l:{111:{l:{116:{l:{59:{c:[8787]}}}}}}},97:{l:{114:{l:{114:{l:{59:{c:[10609]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8495]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8784]}}}}}}},105:{l:{109:{l:{59:{c:[8770]}}}}}}},116:{l:{97:{l:{59:{c:[951]}}},104:{l:{59:{c:[240]}},c:[240]}}},117:{l:{109:{l:{108:{l:{59:{c:[235]}},c:[235]}}},114:{l:{111:{l:{59:{c:[8364]}}}}}}},120:{l:{99:{l:{108:{l:{59:{c:[33]}}}}},105:{l:{115:{l:{116:{l:{59:{c:[8707]}}}}}}},112:{l:{101:{l:{99:{l:{116:{l:{97:{l:{116:{l:{105:{l:{111:{l:{110:{l:{59:{c:[8496]}}}}}}}}}}}}}}}}},111:{l:{110:{l:{101:{l:{110:{l:{116:{l:{105:{l:{97:{l:{108:{l:{101:{l:{59:{c:[8519]}}}}}}}}}}}}}}}}}}}}}}}}},102:{l:{97:{l:{108:{l:{108:{l:{105:{l:{110:{l:{103:{l:{100:{l:{111:{l:{116:{l:{115:{l:{101:{l:{113:{l:{59:{c:[8786]}}}}}}}}}}}}}}}}}}}}}}}}},99:{l:{121:{l:{59:{c:[1092]}}}}},101:{l:{109:{l:{97:{l:{108:{l:{101:{l:{59:{c:[9792]}}}}}}}}}}},102:{l:{105:{l:{108:{l:{105:{l:{103:{l:{59:{c:[64259]}}}}}}}}},108:{l:{105:{l:{103:{l:{59:{c:[64256]}}}}},108:{l:{105:{l:{103:{l:{59:{c:[64260]}}}}}}}}},114:{l:{59:{c:[120099]}}}}},105:{l:{108:{l:{105:{l:{103:{l:{59:{c:[64257]}}}}}}}}},106:{l:{108:{l:{105:{l:{103:{l:{59:{c:[102,106]}}}}}}}}},108:{l:{97:{l:{116:{l:{59:{c:[9837]}}}}},108:{l:{105:{l:{103:{l:{59:{c:[64258]}}}}}}},116:{l:{110:{l:{115:{l:{59:{c:[9649]}}}}}}}}},110:{l:{111:{l:{102:{l:{59:{c:[402]}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120151]}}}}},114:{l:{97:{l:{108:{l:{108:{l:{59:{c:[8704]}}}}}}},107:{l:{59:{c:[8916]},118:{l:{59:{c:[10969]}}}}}}}}},112:{l:{97:{l:{114:{l:{116:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10765]}}}}}}}}}}}}}}},114:{l:{97:{l:{99:{l:{49:{l:{50:{l:{59:{c:[189]}},c:[189]},51:{l:{59:{c:[8531]}}},52:{l:{59:{c:[188]}},c:[188]},53:{l:{59:{c:[8533]}}},54:{l:{59:{c:[8537]}}},56:{l:{59:{c:[8539]}}}}},50:{l:{51:{l:{59:{c:[8532]}}},53:{l:{59:{c:[8534]}}}}},51:{l:{52:{l:{59:{c:[190]}},c:[190]},53:{l:{59:{c:[8535]}}},56:{l:{59:{c:[8540]}}}}},52:{l:{53:{l:{59:{c:[8536]}}}}},53:{l:{54:{l:{59:{c:[8538]}}},56:{l:{59:{c:[8541]}}}}},55:{l:{56:{l:{59:{c:[8542]}}}}}}},115:{l:{108:{l:{59:{c:[8260]}}}}}}},111:{l:{119:{l:{110:{l:{59:{c:[8994]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119995]}}}}}}}}},103:{l:{69:{l:{59:{c:[8807]},108:{l:{59:{c:[10892]}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[501]}}}}}}}}},109:{l:{109:{l:{97:{l:{59:{c:[947]},100:{l:{59:{c:[989]}}}}}}}}},112:{l:{59:{c:[10886]}}}}},98:{l:{114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[287]}}}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[285]}}}}}}},121:{l:{59:{c:[1075]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[289]}}}}}}},101:{l:{59:{c:[8805]},108:{l:{59:{c:[8923]}}},113:{l:{59:{c:[8805]},113:{l:{59:{c:[8807]}}},115:{l:{108:{l:{97:{l:{110:{l:{116:{l:{59:{c:[10878]}}}}}}}}}}}}},115:{l:{59:{c:[10878]},99:{l:{99:{l:{59:{c:[10921]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[10880]},111:{l:{59:{c:[10882]},108:{l:{59:{c:[10884]}}}}}}}}}}},108:{l:{59:{c:[8923,65024]},101:{l:{115:{l:{59:{c:[10900]}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120100]}}}}},103:{l:{59:{c:[8811]},103:{l:{59:{c:[8921]}}}}},105:{l:{109:{l:{101:{l:{108:{l:{59:{c:[8503]}}}}}}}}},106:{l:{99:{l:{121:{l:{59:{c:[1107]}}}}}}},108:{l:{59:{c:[8823]},69:{l:{59:{c:[10898]}}},97:{l:{59:{c:[10917]}}},106:{l:{59:{c:[10916]}}}}},110:{l:{69:{l:{59:{c:[8809]}}},97:{l:{112:{l:{59:{c:[10890]},112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10890]}}}}}}}}}}}}},101:{l:{59:{c:[10888]},113:{l:{59:{c:[10888]},113:{l:{59:{c:[8809]}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8935]}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120152]}}}}}}},114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[96]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8458]}}}}},105:{l:{109:{l:{59:{c:[8819]},101:{l:{59:{c:[10894]}}},108:{l:{59:{c:[10896]}}}}}}}}},116:{l:{59:{c:[62]},99:{l:{99:{l:{59:{c:[10919]}}},105:{l:{114:{l:{59:{c:[10874]}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8919]}}}}}}},108:{l:{80:{l:{97:{l:{114:{l:{59:{c:[10645]}}}}}}}}},113:{l:{117:{l:{101:{l:{115:{l:{116:{l:{59:{c:[10876]}}}}}}}}}}},114:{l:{97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10886]}}}}}}}}}}},114:{l:{114:{l:{59:{c:[10616]}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8919]}}}}}}},101:{l:{113:{l:{108:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8923]}}}}}}}}},113:{l:{108:{l:{101:{l:{115:{l:{115:{l:{59:{c:[10892]}}}}}}}}}}}}}}},108:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8823]}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8819]}}}}}}}}}},c:[62]},118:{l:{101:{l:{114:{l:{116:{l:{110:{l:{101:{l:{113:{l:{113:{l:{59:{c:[8809,65024]}}}}}}}}}}}}}}},110:{l:{69:{l:{59:{c:[8809,65024]}}}}}}}}},104:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8660]}}}}}}},97:{l:{105:{l:{114:{l:{115:{l:{112:{l:{59:{c:[8202]}}}}}}}}},108:{l:{102:{l:{59:{c:[189]}}}}},109:{l:{105:{l:{108:{l:{116:{l:{59:{c:[8459]}}}}}}}}},114:{l:{100:{l:{99:{l:{121:{l:{59:{c:[1098]}}}}}}},114:{l:{59:{c:[8596]},99:{l:{105:{l:{114:{l:{59:{c:[10568]}}}}}}},119:{l:{59:{c:[8621]}}}}}}}}},98:{l:{97:{l:{114:{l:{59:{c:[8463]}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[293]}}}}}}}}},101:{l:{97:{l:{114:{l:{116:{l:{115:{l:{59:{c:[9829]},117:{l:{105:{l:{116:{l:{59:{c:[9829]}}}}}}}}}}}}}}},108:{l:{108:{l:{105:{l:{112:{l:{59:{c:[8230]}}}}}}}}},114:{l:{99:{l:{111:{l:{110:{l:{59:{c:[8889]}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120101]}}}}},107:{l:{115:{l:{101:{l:{97:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10533]}}}}}}}}}}},119:{l:{97:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10534]}}}}}}}}}}}}}}},111:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8703]}}}}}}},109:{l:{116:{l:{104:{l:{116:{l:{59:{c:[8763]}}}}}}}}},111:{l:{107:{l:{108:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8617]}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8618]}}}}}}}}}}}}}}}}}}}}}}}}},112:{l:{102:{l:{59:{c:[120153]}}}}},114:{l:{98:{l:{97:{l:{114:{l:{59:{c:[8213]}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119997]}}}}},108:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8463]}}}}}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[295]}}}}}}}}}}},121:{l:{98:{l:{117:{l:{108:{l:{108:{l:{59:{c:[8259]}}}}}}}}},112:{l:{104:{l:{101:{l:{110:{l:{59:{c:[8208]}}}}}}}}}}}}},105:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[237]}},c:[237]}}}}}}}}},99:{l:{59:{c:[8291]},105:{l:{114:{l:{99:{l:{59:{c:[238]}},c:[238]}}}}},121:{l:{59:{c:[1080]}}}}},101:{l:{99:{l:{121:{l:{59:{c:[1077]}}}}},120:{l:{99:{l:{108:{l:{59:{c:[161]}},c:[161]}}}}}}},102:{l:{102:{l:{59:{c:[8660]}}},114:{l:{59:{c:[120102]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[236]}},c:[236]}}}}}}}}},105:{l:{59:{c:[8520]},105:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10764]}}}}}}},110:{l:{116:{l:{59:{c:[8749]}}}}}}},110:{l:{102:{l:{105:{l:{110:{l:{59:{c:[10716]}}}}}}}}},111:{l:{116:{l:{97:{l:{59:{c:[8489]}}}}}}}}},106:{l:{108:{l:{105:{l:{103:{l:{59:{c:[307]}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[299]}}}}},103:{l:{101:{l:{59:{c:[8465]}}},108:{l:{105:{l:{110:{l:{101:{l:{59:{c:[8464]}}}}}}}}},112:{l:{97:{l:{114:{l:{116:{l:{59:{c:[8465]}}}}}}}}}}},116:{l:{104:{l:{59:{c:[305]}}}}}}},111:{l:{102:{l:{59:{c:[8887]}}}}},112:{l:{101:{l:{100:{l:{59:{c:[437]}}}}}}}}},110:{l:{59:{c:[8712]},99:{l:{97:{l:{114:{l:{101:{l:{59:{c:[8453]}}}}}}}}},102:{l:{105:{l:{110:{l:{59:{c:[8734]},116:{l:{105:{l:{101:{l:{59:{c:[10717]}}}}}}}}}}}}},111:{l:{100:{l:{111:{l:{116:{l:{59:{c:[305]}}}}}}}}},116:{l:{59:{c:[8747]},99:{l:{97:{l:{108:{l:{59:{c:[8890]}}}}}}},101:{l:{103:{l:{101:{l:{114:{l:{115:{l:{59:{c:[8484]}}}}}}}}},114:{l:{99:{l:{97:{l:{108:{l:{59:{c:[8890]}}}}}}}}}}},108:{l:{97:{l:{114:{l:{104:{l:{107:{l:{59:{c:[10775]}}}}}}}}}}},112:{l:{114:{l:{111:{l:{100:{l:{59:{c:[10812]}}}}}}}}}}}}},111:{l:{99:{l:{121:{l:{59:{c:[1105]}}}}},103:{l:{111:{l:{110:{l:{59:{c:[303]}}}}}}},112:{l:{102:{l:{59:{c:[120154]}}}}},116:{l:{97:{l:{59:{c:[953]}}}}}}},112:{l:{114:{l:{111:{l:{100:{l:{59:{c:[10812]}}}}}}}}},113:{l:{117:{l:{101:{l:{115:{l:{116:{l:{59:{c:[191]}},c:[191]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119998]}}}}},105:{l:{110:{l:{59:{c:[8712]},69:{l:{59:{c:[8953]}}},100:{l:{111:{l:{116:{l:{59:{c:[8949]}}}}}}},115:{l:{59:{c:[8948]},118:{l:{59:{c:[8947]}}}}},118:{l:{59:{c:[8712]}}}}}}}}},116:{l:{59:{c:[8290]},105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[297]}}}}}}}}}}},117:{l:{107:{l:{99:{l:{121:{l:{59:{c:[1110]}}}}}}},109:{l:{108:{l:{59:{c:[239]}},c:[239]}}}}}}},106:{l:{99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[309]}}}}}}},121:{l:{59:{c:[1081]}}}}},102:{l:{114:{l:{59:{c:[120103]}}}}},109:{l:{97:{l:{116:{l:{104:{l:{59:{c:[567]}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120155]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119999]}}}}},101:{l:{114:{l:{99:{l:{121:{l:{59:{c:[1112]}}}}}}}}}}},117:{l:{107:{l:{99:{l:{121:{l:{59:{c:[1108]}}}}}}}}}}},107:{l:{97:{l:{112:{l:{112:{l:{97:{l:{59:{c:[954]},118:{l:{59:{c:[1008]}}}}}}}}}}},99:{l:{101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[311]}}}}}}}}},121:{l:{59:{c:[1082]}}}}},102:{l:{114:{l:{59:{c:[120104]}}}}},103:{l:{114:{l:{101:{l:{101:{l:{110:{l:{59:{c:[312]}}}}}}}}}}},104:{l:{99:{l:{121:{l:{59:{c:[1093]}}}}}}},106:{l:{99:{l:{121:{l:{59:{c:[1116]}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120156]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120000]}}}}}}}}},108:{l:{65:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8666]}}}}}}},114:{l:{114:{l:{59:{c:[8656]}}}}},116:{l:{97:{l:{105:{l:{108:{l:{59:{c:[10523]}}}}}}}}}}},66:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10510]}}}}}}}}},69:{l:{59:{c:[8806]},103:{l:{59:{c:[10891]}}}}},72:{l:{97:{l:{114:{l:{59:{c:[10594]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[314]}}}}}}}}},101:{l:{109:{l:{112:{l:{116:{l:{121:{l:{118:{l:{59:{c:[10676]}}}}}}}}}}}}},103:{l:{114:{l:{97:{l:{110:{l:{59:{c:[8466]}}}}}}}}},109:{l:{98:{l:{100:{l:{97:{l:{59:{c:[955]}}}}}}}}},110:{l:{103:{l:{59:{c:[10216]},100:{l:{59:{c:[10641]}}},108:{l:{101:{l:{59:{c:[10216]}}}}}}}}},112:{l:{59:{c:[10885]}}},113:{l:{117:{l:{111:{l:{59:{c:[171]}},c:[171]}}}}},114:{l:{114:{l:{59:{c:[8592]},98:{l:{59:{c:[8676]},102:{l:{115:{l:{59:{c:[10527]}}}}}}},102:{l:{115:{l:{59:{c:[10525]}}}}},104:{l:{107:{l:{59:{c:[8617]}}}}},108:{l:{112:{l:{59:{c:[8619]}}}}},112:{l:{108:{l:{59:{c:[10553]}}}}},115:{l:{105:{l:{109:{l:{59:{c:[10611]}}}}}}},116:{l:{108:{l:{59:{c:[8610]}}}}}}}}},116:{l:{59:{c:[10923]},97:{l:{105:{l:{108:{l:{59:{c:[10521]}}}}}}},101:{l:{59:{c:[10925]},115:{l:{59:{c:[10925,65024]}}}}}}}}},98:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10508]}}}}}}},98:{l:{114:{l:{107:{l:{59:{c:[10098]}}}}}}},114:{l:{97:{l:{99:{l:{101:{l:{59:{c:[123]}}},107:{l:{59:{c:[91]}}}}}}},107:{l:{101:{l:{59:{c:[10635]}}},115:{l:{108:{l:{100:{l:{59:{c:[10639]}}},117:{l:{59:{c:[10637]}}}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[318]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[316]}}}}}}},105:{l:{108:{l:{59:{c:[8968]}}}}}}},117:{l:{98:{l:{59:{c:[123]}}}}},121:{l:{59:{c:[1083]}}}}},100:{l:{99:{l:{97:{l:{59:{c:[10550]}}}}},113:{l:{117:{l:{111:{l:{59:{c:[8220]},114:{l:{59:{c:[8222]}}}}}}}}},114:{l:{100:{l:{104:{l:{97:{l:{114:{l:{59:{c:[10599]}}}}}}}}},117:{l:{115:{l:{104:{l:{97:{l:{114:{l:{59:{c:[10571]}}}}}}}}}}}}},115:{l:{104:{l:{59:{c:[8626]}}}}}}},101:{l:{59:{c:[8804]},102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8592]},116:{l:{97:{l:{105:{l:{108:{l:{59:{c:[8610]}}}}}}}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{111:{l:{111:{l:{110:{l:{100:{l:{111:{l:{119:{l:{110:{l:{59:{c:[8637]}}}}}}}}},117:{l:{112:{l:{59:{c:[8636]}}}}}}}}}}}}}}}}}}},108:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{115:{l:{59:{c:[8647]}}}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8596]},115:{l:{59:{c:[8646]}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{111:{l:{111:{l:{110:{l:{115:{l:{59:{c:[8651]}}}}}}}}}}}}}}}}},115:{l:{113:{l:{117:{l:{105:{l:{103:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8621]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},116:{l:{104:{l:{114:{l:{101:{l:{101:{l:{116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8907]}}}}}}}}}}}}}}}}}}}}}}}}},103:{l:{59:{c:[8922]}}},113:{l:{59:{c:[8804]},113:{l:{59:{c:[8806]}}},115:{l:{108:{l:{97:{l:{110:{l:{116:{l:{59:{c:[10877]}}}}}}}}}}}}},115:{l:{59:{c:[10877]},99:{l:{99:{l:{59:{c:[10920]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[10879]},111:{l:{59:{c:[10881]},114:{l:{59:{c:[10883]}}}}}}}}}}},103:{l:{59:{c:[8922,65024]},101:{l:{115:{l:{59:{c:[10899]}}}}}}},115:{l:{97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10885]}}}}}}}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8918]}}}}}}},101:{l:{113:{l:{103:{l:{116:{l:{114:{l:{59:{c:[8922]}}}}}}},113:{l:{103:{l:{116:{l:{114:{l:{59:{c:[10891]}}}}}}}}}}}}},103:{l:{116:{l:{114:{l:{59:{c:[8822]}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8818]}}}}}}}}}}}}},102:{l:{105:{l:{115:{l:{104:{l:{116:{l:{59:{c:[10620]}}}}}}}}},108:{l:{111:{l:{111:{l:{114:{l:{59:{c:[8970]}}}}}}}}},114:{l:{59:{c:[120105]}}}}},103:{l:{59:{c:[8822]},69:{l:{59:{c:[10897]}}}}},104:{l:{97:{l:{114:{l:{100:{l:{59:{c:[8637]}}},117:{l:{59:{c:[8636]},108:{l:{59:{c:[10602]}}}}}}}}},98:{l:{108:{l:{107:{l:{59:{c:[9604]}}}}}}}}},106:{l:{99:{l:{121:{l:{59:{c:[1113]}}}}}}},108:{l:{59:{c:[8810]},97:{l:{114:{l:{114:{l:{59:{c:[8647]}}}}}}},99:{l:{111:{l:{114:{l:{110:{l:{101:{l:{114:{l:{59:{c:[8990]}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{100:{l:{59:{c:[10603]}}}}}}}}},116:{l:{114:{l:{105:{l:{59:{c:[9722]}}}}}}}}},109:{l:{105:{l:{100:{l:{111:{l:{116:{l:{59:{c:[320]}}}}}}}}},111:{l:{117:{l:{115:{l:{116:{l:{59:{c:[9136]},97:{l:{99:{l:{104:{l:{101:{l:{59:{c:[9136]}}}}}}}}}}}}}}}}}}},110:{l:{69:{l:{59:{c:[8808]}}},97:{l:{112:{l:{59:{c:[10889]},112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10889]}}}}}}}}}}}}},101:{l:{59:{c:[10887]},113:{l:{59:{c:[10887]},113:{l:{59:{c:[8808]}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8934]}}}}}}}}},111:{l:{97:{l:{110:{l:{103:{l:{59:{c:[10220]}}}}},114:{l:{114:{l:{59:{c:[8701]}}}}}}},98:{l:{114:{l:{107:{l:{59:{c:[10214]}}}}}}},110:{l:{103:{l:{108:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10229]}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10231]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},109:{l:{97:{l:{112:{l:{115:{l:{116:{l:{111:{l:{59:{c:[10236]}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10230]}}}}}}}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8619]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8620]}}}}}}}}}}}}}}}}}}}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[10629]}}}}},102:{l:{59:{c:[120157]}}},108:{l:{117:{l:{115:{l:{59:{c:[10797]}}}}}}}}},116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[10804]}}}}}}}}}}},119:{l:{97:{l:{115:{l:{116:{l:{59:{c:[8727]}}}}}}},98:{l:{97:{l:{114:{l:{59:{c:[95]}}}}}}}}},122:{l:{59:{c:[9674]},101:{l:{110:{l:{103:{l:{101:{l:{59:{c:[9674]}}}}}}}}},102:{l:{59:{c:[10731]}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[40]},108:{l:{116:{l:{59:{c:[10643]}}}}}}}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8646]}}}}}}},99:{l:{111:{l:{114:{l:{110:{l:{101:{l:{114:{l:{59:{c:[8991]}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{59:{c:[8651]},100:{l:{59:{c:[10605]}}}}}}}}},109:{l:{59:{c:[8206]}}},116:{l:{114:{l:{105:{l:{59:{c:[8895]}}}}}}}}},115:{l:{97:{l:{113:{l:{117:{l:{111:{l:{59:{c:[8249]}}}}}}}}},99:{l:{114:{l:{59:{c:[120001]}}}}},104:{l:{59:{c:[8624]}}},105:{l:{109:{l:{59:{c:[8818]},101:{l:{59:{c:[10893]}}},103:{l:{59:{c:[10895]}}}}}}},113:{l:{98:{l:{59:{c:[91]}}},117:{l:{111:{l:{59:{c:[8216]},114:{l:{59:{c:[8218]}}}}}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[322]}}}}}}}}}}},116:{l:{59:{c:[60]},99:{l:{99:{l:{59:{c:[10918]}}},105:{l:{114:{l:{59:{c:[10873]}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8918]}}}}}}},104:{l:{114:{l:{101:{l:{101:{l:{59:{c:[8907]}}}}}}}}},105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8905]}}}}}}}}},108:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10614]}}}}}}}}},113:{l:{117:{l:{101:{l:{115:{l:{116:{l:{59:{c:[10875]}}}}}}}}}}},114:{l:{80:{l:{97:{l:{114:{l:{59:{c:[10646]}}}}}}},105:{l:{59:{c:[9667]},101:{l:{59:{c:[8884]}}},102:{l:{59:{c:[9666]}}}}}}}},c:[60]},117:{l:{114:{l:{100:{l:{115:{l:{104:{l:{97:{l:{114:{l:{59:{c:[10570]}}}}}}}}}}},117:{l:{104:{l:{97:{l:{114:{l:{59:{c:[10598]}}}}}}}}}}}}},118:{l:{101:{l:{114:{l:{116:{l:{110:{l:{101:{l:{113:{l:{113:{l:{59:{c:[8808,65024]}}}}}}}}}}}}}}},110:{l:{69:{l:{59:{c:[8808,65024]}}}}}}}}},109:{l:{68:{l:{68:{l:{111:{l:{116:{l:{59:{c:[8762]}}}}}}}}},97:{l:{99:{l:{114:{l:{59:{c:[175]}},c:[175]}}},108:{l:{101:{l:{59:{c:[9794]}}},116:{l:{59:{c:[10016]},101:{l:{115:{l:{101:{l:{59:{c:[10016]}}}}}}}}}}},112:{l:{59:{c:[8614]},115:{l:{116:{l:{111:{l:{59:{c:[8614]},100:{l:{111:{l:{119:{l:{110:{l:{59:{c:[8615]}}}}}}}}},108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8612]}}}}}}}}},117:{l:{112:{l:{59:{c:[8613]}}}}}}}}}}}}},114:{l:{107:{l:{101:{l:{114:{l:{59:{c:[9646]}}}}}}}}}}},99:{l:{111:{l:{109:{l:{109:{l:{97:{l:{59:{c:[10793]}}}}}}}}},121:{l:{59:{c:[1084]}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8212]}}}}}}}}},101:{l:{97:{l:{115:{l:{117:{l:{114:{l:{101:{l:{100:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[8737]}}}}}}}}}}}}}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120106]}}}}},104:{l:{111:{l:{59:{c:[8487]}}}}},105:{l:{99:{l:{114:{l:{111:{l:{59:{c:[181]}},c:[181]}}}}},100:{l:{59:{c:[8739]},97:{l:{115:{l:{116:{l:{59:{c:[42]}}}}}}},99:{l:{105:{l:{114:{l:{59:{c:[10992]}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[183]}},c:[183]}}}}}}},110:{l:{117:{l:{115:{l:{59:{c:[8722]},98:{l:{59:{c:[8863]}}},100:{l:{59:{c:[8760]},117:{l:{59:{c:[10794]}}}}}}}}}}}}},108:{l:{99:{l:{112:{l:{59:{c:[10971]}}}}},100:{l:{114:{l:{59:{c:[8230]}}}}}}},110:{l:{112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[8723]}}}}}}}}}}},111:{l:{100:{l:{101:{l:{108:{l:{115:{l:{59:{c:[8871]}}}}}}}}},112:{l:{102:{l:{59:{c:[120158]}}}}}}},112:{l:{59:{c:[8723]}}},115:{l:{99:{l:{114:{l:{59:{c:[120002]}}}}},116:{l:{112:{l:{111:{l:{115:{l:{59:{c:[8766]}}}}}}}}}}},117:{l:{59:{c:[956]},108:{l:{116:{l:{105:{l:{109:{l:{97:{l:{112:{l:{59:{c:[8888]}}}}}}}}}}}}},109:{l:{97:{l:{112:{l:{59:{c:[8888]}}}}}}}}}}},110:{l:{71:{l:{103:{l:{59:{c:[8921,824]}}},116:{l:{59:{c:[8811,8402]},118:{l:{59:{c:[8811,824]}}}}}}},76:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8653]}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8654]}}}}}}}}}}}}}}}}}}}}}}}}}}},108:{l:{59:{c:[8920,824]}}},116:{l:{59:{c:[8810,8402]},118:{l:{59:{c:[8810,824]}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8655]}}}}}}}}}}}}}}}}}}}}},86:{l:{68:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8879]}}}}}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8878]}}}}}}}}}}},97:{l:{98:{l:{108:{l:{97:{l:{59:{c:[8711]}}}}}}},99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[324]}}}}}}}}},110:{l:{103:{l:{59:{c:[8736,8402]}}}}},112:{l:{59:{c:[8777]},69:{l:{59:{c:[10864,824]}}},105:{l:{100:{l:{59:{c:[8779,824]}}}}},111:{l:{115:{l:{59:{c:[329]}}}}},112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[8777]}}}}}}}}}}},116:{l:{117:{l:{114:{l:{59:{c:[9838]},97:{l:{108:{l:{59:{c:[9838]},115:{l:{59:{c:[8469]}}}}}}}}}}}}}}},98:{l:{115:{l:{112:{l:{59:{c:[160]}},c:[160]}}},117:{l:{109:{l:{112:{l:{59:{c:[8782,824]},101:{l:{59:{c:[8783,824]}}}}}}}}}}},99:{l:{97:{l:{112:{l:{59:{c:[10819]}}},114:{l:{111:{l:{110:{l:{59:{c:[328]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[326]}}}}}}}}},111:{l:{110:{l:{103:{l:{59:{c:[8775]},100:{l:{111:{l:{116:{l:{59:{c:[10861,824]}}}}}}}}}}}}},117:{l:{112:{l:{59:{c:[10818]}}}}},121:{l:{59:{c:[1085]}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8211]}}}}}}}}},101:{l:{59:{c:[8800]},65:{l:{114:{l:{114:{l:{59:{c:[8663]}}}}}}},97:{l:{114:{l:{104:{l:{107:{l:{59:{c:[10532]}}}}},114:{l:{59:{c:[8599]},111:{l:{119:{l:{59:{c:[8599]}}}}}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8784,824]}}}}}}},113:{l:{117:{l:{105:{l:{118:{l:{59:{c:[8802]}}}}}}}}},115:{l:{101:{l:{97:{l:{114:{l:{59:{c:[10536]}}}}}}},105:{l:{109:{l:{59:{c:[8770,824]}}}}}}},120:{l:{105:{l:{115:{l:{116:{l:{59:{c:[8708]},115:{l:{59:{c:[8708]}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120107]}}}}},103:{l:{69:{l:{59:{c:[8807,824]}}},101:{l:{59:{c:[8817]},113:{l:{59:{c:[8817]},113:{l:{59:{c:[8807,824]}}},115:{l:{108:{l:{97:{l:{110:{l:{116:{l:{59:{c:[10878,824]}}}}}}}}}}}}},115:{l:{59:{c:[10878,824]}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8821]}}}}}}},116:{l:{59:{c:[8815]},114:{l:{59:{c:[8815]}}}}}}},104:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8654]}}}}}}},97:{l:{114:{l:{114:{l:{59:{c:[8622]}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[10994]}}}}}}}}},105:{l:{59:{c:[8715]},115:{l:{59:{c:[8956]},100:{l:{59:{c:[8954]}}}}},118:{l:{59:{c:[8715]}}}}},106:{l:{99:{l:{121:{l:{59:{c:[1114]}}}}}}},108:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8653]}}}}}}},69:{l:{59:{c:[8806,824]}}},97:{l:{114:{l:{114:{l:{59:{c:[8602]}}}}}}},100:{l:{114:{l:{59:{c:[8229]}}}}},101:{l:{59:{c:[8816]},102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8602]}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8622]}}}}}}}}}}}}}}}}}}}}}}}}},113:{l:{59:{c:[8816]},113:{l:{59:{c:[8806,824]}}},115:{l:{108:{l:{97:{l:{110:{l:{116:{l:{59:{c:[10877,824]}}}}}}}}}}}}},115:{l:{59:{c:[10877,824]},115:{l:{59:{c:[8814]}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8820]}}}}}}},116:{l:{59:{c:[8814]},114:{l:{105:{l:{59:{c:[8938]},101:{l:{59:{c:[8940]}}}}}}}}}}},109:{l:{105:{l:{100:{l:{59:{c:[8740]}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120159]}}}}},116:{l:{59:{c:[172]},105:{l:{110:{l:{59:{c:[8713]},69:{l:{59:{c:[8953,824]}}},100:{l:{111:{l:{116:{l:{59:{c:[8949,824]}}}}}}},118:{l:{97:{l:{59:{c:[8713]}}},98:{l:{59:{c:[8951]}}},99:{l:{59:{c:[8950]}}}}}}}}},110:{l:{105:{l:{59:{c:[8716]},118:{l:{97:{l:{59:{c:[8716]}}},98:{l:{59:{c:[8958]}}},99:{l:{59:{c:[8957]}}}}}}}}}},c:[172]}}},112:{l:{97:{l:{114:{l:{59:{c:[8742]},97:{l:{108:{l:{108:{l:{101:{l:{108:{l:{59:{c:[8742]}}}}}}}}}}},115:{l:{108:{l:{59:{c:[11005,8421]}}}}},116:{l:{59:{c:[8706,824]}}}}}}},111:{l:{108:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10772]}}}}}}}}}}},114:{l:{59:{c:[8832]},99:{l:{117:{l:{101:{l:{59:{c:[8928]}}}}}}},101:{l:{59:{c:[10927,824]},99:{l:{59:{c:[8832]},101:{l:{113:{l:{59:{c:[10927,824]}}}}}}}}}}}}},114:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8655]}}}}}}},97:{l:{114:{l:{114:{l:{59:{c:[8603]},99:{l:{59:{c:[10547,824]}}},119:{l:{59:{c:[8605,824]}}}}}}}}},105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8603]}}}}}}}}}}}}}}}}}}},116:{l:{114:{l:{105:{l:{59:{c:[8939]},101:{l:{59:{c:[8941]}}}}}}}}}}},115:{l:{99:{l:{59:{c:[8833]},99:{l:{117:{l:{101:{l:{59:{c:[8929]}}}}}}},101:{l:{59:{c:[10928,824]}}},114:{l:{59:{c:[120003]}}}}},104:{l:{111:{l:{114:{l:{116:{l:{109:{l:{105:{l:{100:{l:{59:{c:[8740]}}}}}}},112:{l:{97:{l:{114:{l:{97:{l:{108:{l:{108:{l:{101:{l:{108:{l:{59:{c:[8742]}}}}}}}}}}}}}}}}}}}}}}}}},105:{l:{109:{l:{59:{c:[8769]},101:{l:{59:{c:[8772]},113:{l:{59:{c:[8772]}}}}}}}}},109:{l:{105:{l:{100:{l:{59:{c:[8740]}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[8742]}}}}}}},113:{l:{115:{l:{117:{l:{98:{l:{101:{l:{59:{c:[8930]}}}}},112:{l:{101:{l:{59:{c:[8931]}}}}}}}}}}},117:{l:{98:{l:{59:{c:[8836]},69:{l:{59:{c:[10949,824]}}},101:{l:{59:{c:[8840]}}},115:{l:{101:{l:{116:{l:{59:{c:[8834,8402]},101:{l:{113:{l:{59:{c:[8840]},113:{l:{59:{c:[10949,824]}}}}}}}}}}}}}}},99:{l:{99:{l:{59:{c:[8833]},101:{l:{113:{l:{59:{c:[10928,824]}}}}}}}}},112:{l:{59:{c:[8837]},69:{l:{59:{c:[10950,824]}}},101:{l:{59:{c:[8841]}}},115:{l:{101:{l:{116:{l:{59:{c:[8835,8402]},101:{l:{113:{l:{59:{c:[8841]},113:{l:{59:{c:[10950,824]}}}}}}}}}}}}}}}}}}},116:{l:{103:{l:{108:{l:{59:{c:[8825]}}}}},105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[241]}},c:[241]}}}}}}},108:{l:{103:{l:{59:{c:[8824]}}}}},114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8938]},101:{l:{113:{l:{59:{c:[8940]}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8939]},101:{l:{113:{l:{59:{c:[8941]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},117:{l:{59:{c:[957]},109:{l:{59:{c:[35]},101:{l:{114:{l:{111:{l:{59:{c:[8470]}}}}}}},115:{l:{112:{l:{59:{c:[8199]}}}}}}}}},118:{l:{68:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8877]}}}}}}}}},72:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10500]}}}}}}}}},97:{l:{112:{l:{59:{c:[8781,8402]}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8876]}}}}}}}}},103:{l:{101:{l:{59:{c:[8805,8402]}}},116:{l:{59:{c:[62,8402]}}}}},105:{l:{110:{l:{102:{l:{105:{l:{110:{l:{59:{c:[10718]}}}}}}}}}}},108:{l:{65:{l:{114:{l:{114:{l:{59:{c:[10498]}}}}}}},101:{l:{59:{c:[8804,8402]}}},116:{l:{59:{c:[60,8402]},114:{l:{105:{l:{101:{l:{59:{c:[8884,8402]}}}}}}}}}}},114:{l:{65:{l:{114:{l:{114:{l:{59:{c:[10499]}}}}}}},116:{l:{114:{l:{105:{l:{101:{l:{59:{c:[8885,8402]}}}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8764,8402]}}}}}}}}},119:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8662]}}}}}}},97:{l:{114:{l:{104:{l:{107:{l:{59:{c:[10531]}}}}},114:{l:{59:{c:[8598]},111:{l:{119:{l:{59:{c:[8598]}}}}}}}}}}},110:{l:{101:{l:{97:{l:{114:{l:{59:{c:[10535]}}}}}}}}}}}}},111:{l:{83:{l:{59:{c:[9416]}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[243]}},c:[243]}}}}}}},115:{l:{116:{l:{59:{c:[8859]}}}}}}},99:{l:{105:{l:{114:{l:{59:{c:[8858]},99:{l:{59:{c:[244]}},c:[244]}}}}},121:{l:{59:{c:[1086]}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8861]}}}}}}},98:{l:{108:{l:{97:{l:{99:{l:{59:{c:[337]}}}}}}}}},105:{l:{118:{l:{59:{c:[10808]}}}}},111:{l:{116:{l:{59:{c:[8857]}}}}},115:{l:{111:{l:{108:{l:{100:{l:{59:{c:[10684]}}}}}}}}}}},101:{l:{108:{l:{105:{l:{103:{l:{59:{c:[339]}}}}}}}}},102:{l:{99:{l:{105:{l:{114:{l:{59:{c:[10687]}}}}}}},114:{l:{59:{c:[120108]}}}}},103:{l:{111:{l:{110:{l:{59:{c:[731]}}}}},114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[242]}},c:[242]}}}}}}},116:{l:{59:{c:[10689]}}}}},104:{l:{98:{l:{97:{l:{114:{l:{59:{c:[10677]}}}}}}},109:{l:{59:{c:[937]}}}}},105:{l:{110:{l:{116:{l:{59:{c:[8750]}}}}}}},108:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8634]}}}}}}},99:{l:{105:{l:{114:{l:{59:{c:[10686]}}}}},114:{l:{111:{l:{115:{l:{115:{l:{59:{c:[10683]}}}}}}}}}}},105:{l:{110:{l:{101:{l:{59:{c:[8254]}}}}}}},116:{l:{59:{c:[10688]}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[333]}}}}}}},101:{l:{103:{l:{97:{l:{59:{c:[969]}}}}}}},105:{l:{99:{l:{114:{l:{111:{l:{110:{l:{59:{c:[959]}}}}}}}}},100:{l:{59:{c:[10678]}}},110:{l:{117:{l:{115:{l:{59:{c:[8854]}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120160]}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[10679]}}}}},101:{l:{114:{l:{112:{l:{59:{c:[10681]}}}}}}},108:{l:{117:{l:{115:{l:{59:{c:[8853]}}}}}}}}},114:{l:{59:{c:[8744]},97:{l:{114:{l:{114:{l:{59:{c:[8635]}}}}}}},100:{l:{59:{c:[10845]},101:{l:{114:{l:{59:{c:[8500]},111:{l:{102:{l:{59:{c:[8500]}}}}}}}}},102:{l:{59:{c:[170]}},c:[170]},109:{l:{59:{c:[186]}},c:[186]}}},105:{l:{103:{l:{111:{l:{102:{l:{59:{c:[8886]}}}}}}}}},111:{l:{114:{l:{59:{c:[10838]}}}}},115:{l:{108:{l:{111:{l:{112:{l:{101:{l:{59:{c:[10839]}}}}}}}}}}},118:{l:{59:{c:[10843]}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8500]}}}}},108:{l:{97:{l:{115:{l:{104:{l:{59:{c:[248]}},c:[248]}}}}}}},111:{l:{108:{l:{59:{c:[8856]}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[245]}},c:[245]}}}}},109:{l:{101:{l:{115:{l:{59:{c:[8855]},97:{l:{115:{l:{59:{c:[10806]}}}}}}}}}}}}}}},117:{l:{109:{l:{108:{l:{59:{c:[246]}},c:[246]}}}}},118:{l:{98:{l:{97:{l:{114:{l:{59:{c:[9021]}}}}}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[8741]},97:{l:{59:{c:[182]},108:{l:{108:{l:{101:{l:{108:{l:{59:{c:[8741]}}}}}}}}}},c:[182]},115:{l:{105:{l:{109:{l:{59:{c:[10995]}}}}},108:{l:{59:{c:[11005]}}}}},116:{l:{59:{c:[8706]}}}}}}},99:{l:{121:{l:{59:{c:[1087]}}}}},101:{l:{114:{l:{99:{l:{110:{l:{116:{l:{59:{c:[37]}}}}}}},105:{l:{111:{l:{100:{l:{59:{c:[46]}}}}}}},109:{l:{105:{l:{108:{l:{59:{c:[8240]}}}}}}},112:{l:{59:{c:[8869]}}},116:{l:{101:{l:{110:{l:{107:{l:{59:{c:[8241]}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120109]}}}}},104:{l:{105:{l:{59:{c:[966]},118:{l:{59:{c:[981]}}}}},109:{l:{109:{l:{97:{l:{116:{l:{59:{c:[8499]}}}}}}}}},111:{l:{110:{l:{101:{l:{59:{c:[9742]}}}}}}}}},105:{l:{59:{c:[960]},116:{l:{99:{l:{104:{l:{102:{l:{111:{l:{114:{l:{107:{l:{59:{c:[8916]}}}}}}}}}}}}}}},118:{l:{59:{c:[982]}}}}},108:{l:{97:{l:{110:{l:{99:{l:{107:{l:{59:{c:[8463]},104:{l:{59:{c:[8462]}}}}}}},107:{l:{118:{l:{59:{c:[8463]}}}}}}}}},117:{l:{115:{l:{59:{c:[43]},97:{l:{99:{l:{105:{l:{114:{l:{59:{c:[10787]}}}}}}}}},98:{l:{59:{c:[8862]}}},99:{l:{105:{l:{114:{l:{59:{c:[10786]}}}}}}},100:{l:{111:{l:{59:{c:[8724]}}},117:{l:{59:{c:[10789]}}}}},101:{l:{59:{c:[10866]}}},109:{l:{110:{l:{59:{c:[177]}},c:[177]}}},115:{l:{105:{l:{109:{l:{59:{c:[10790]}}}}}}},116:{l:{119:{l:{111:{l:{59:{c:[10791]}}}}}}}}}}}}},109:{l:{59:{c:[177]}}},111:{l:{105:{l:{110:{l:{116:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10773]}}}}}}}}}}}}},112:{l:{102:{l:{59:{c:[120161]}}}}},117:{l:{110:{l:{100:{l:{59:{c:[163]}},c:[163]}}}}}}},114:{l:{59:{c:[8826]},69:{l:{59:{c:[10931]}}},97:{l:{112:{l:{59:{c:[10935]}}}}},99:{l:{117:{l:{101:{l:{59:{c:[8828]}}}}}}},101:{l:{59:{c:[10927]},99:{l:{59:{c:[8826]},97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10935]}}}}}}}}}}}}},99:{l:{117:{l:{114:{l:{108:{l:{121:{l:{101:{l:{113:{l:{59:{c:[8828]}}}}}}}}}}}}}}},101:{l:{113:{l:{59:{c:[10927]}}}}},110:{l:{97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10937]}}}}}}}}}}}}},101:{l:{113:{l:{113:{l:{59:{c:[10933]}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8936]}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8830]}}}}}}}}}}},105:{l:{109:{l:{101:{l:{59:{c:[8242]},115:{l:{59:{c:[8473]}}}}}}}}},110:{l:{69:{l:{59:{c:[10933]}}},97:{l:{112:{l:{59:{c:[10937]}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8936]}}}}}}}}},111:{l:{100:{l:{59:{c:[8719]}}},102:{l:{97:{l:{108:{l:{97:{l:{114:{l:{59:{c:[9006]}}}}}}}}},108:{l:{105:{l:{110:{l:{101:{l:{59:{c:[8978]}}}}}}}}},115:{l:{117:{l:{114:{l:{102:{l:{59:{c:[8979]}}}}}}}}}}},112:{l:{59:{c:[8733]},116:{l:{111:{l:{59:{c:[8733]}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8830]}}}}}}},117:{l:{114:{l:{101:{l:{108:{l:{59:{c:[8880]}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120005]}}}}},105:{l:{59:{c:[968]}}}}},117:{l:{110:{l:{99:{l:{115:{l:{112:{l:{59:{c:[8200]}}}}}}}}}}}}},113:{l:{102:{l:{114:{l:{59:{c:[120110]}}}}},105:{l:{110:{l:{116:{l:{59:{c:[10764]}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120162]}}}}}}},112:{l:{114:{l:{105:{l:{109:{l:{101:{l:{59:{c:[8279]}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120006]}}}}}}},117:{l:{97:{l:{116:{l:{101:{l:{114:{l:{110:{l:{105:{l:{111:{l:{110:{l:{115:{l:{59:{c:[8461]}}}}}}}}}}}}}}},105:{l:{110:{l:{116:{l:{59:{c:[10774]}}}}}}}}}}},101:{l:{115:{l:{116:{l:{59:{c:[63]},101:{l:{113:{l:{59:{c:[8799]}}}}}}}}}}},111:{l:{116:{l:{59:{c:[34]}},c:[34]}}}}}}},114:{l:{65:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8667]}}}}}}},114:{l:{114:{l:{59:{c:[8658]}}}}},116:{l:{97:{l:{105:{l:{108:{l:{59:{c:[10524]}}}}}}}}}}},66:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10511]}}}}}}}}},72:{l:{97:{l:{114:{l:{59:{c:[10596]}}}}}}},97:{l:{99:{l:{101:{l:{59:{c:[8765,817]}}},117:{l:{116:{l:{101:{l:{59:{c:[341]}}}}}}}}},100:{l:{105:{l:{99:{l:{59:{c:[8730]}}}}}}},101:{l:{109:{l:{112:{l:{116:{l:{121:{l:{118:{l:{59:{c:[10675]}}}}}}}}}}}}},110:{l:{103:{l:{59:{c:[10217]},100:{l:{59:{c:[10642]}}},101:{l:{59:{c:[10661]}}},108:{l:{101:{l:{59:{c:[10217]}}}}}}}}},113:{l:{117:{l:{111:{l:{59:{c:[187]}},c:[187]}}}}},114:{l:{114:{l:{59:{c:[8594]},97:{l:{112:{l:{59:{c:[10613]}}}}},98:{l:{59:{c:[8677]},102:{l:{115:{l:{59:{c:[10528]}}}}}}},99:{l:{59:{c:[10547]}}},102:{l:{115:{l:{59:{c:[10526]}}}}},104:{l:{107:{l:{59:{c:[8618]}}}}},108:{l:{112:{l:{59:{c:[8620]}}}}},112:{l:{108:{l:{59:{c:[10565]}}}}},115:{l:{105:{l:{109:{l:{59:{c:[10612]}}}}}}},116:{l:{108:{l:{59:{c:[8611]}}}}},119:{l:{59:{c:[8605]}}}}}}},116:{l:{97:{l:{105:{l:{108:{l:{59:{c:[10522]}}}}}}},105:{l:{111:{l:{59:{c:[8758]},110:{l:{97:{l:{108:{l:{115:{l:{59:{c:[8474]}}}}}}}}}}}}}}}}},98:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10509]}}}}}}},98:{l:{114:{l:{107:{l:{59:{c:[10099]}}}}}}},114:{l:{97:{l:{99:{l:{101:{l:{59:{c:[125]}}},107:{l:{59:{c:[93]}}}}}}},107:{l:{101:{l:{59:{c:[10636]}}},115:{l:{108:{l:{100:{l:{59:{c:[10638]}}},117:{l:{59:{c:[10640]}}}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[345]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[343]}}}}}}},105:{l:{108:{l:{59:{c:[8969]}}}}}}},117:{l:{98:{l:{59:{c:[125]}}}}},121:{l:{59:{c:[1088]}}}}},100:{l:{99:{l:{97:{l:{59:{c:[10551]}}}}},108:{l:{100:{l:{104:{l:{97:{l:{114:{l:{59:{c:[10601]}}}}}}}}}}},113:{l:{117:{l:{111:{l:{59:{c:[8221]},114:{l:{59:{c:[8221]}}}}}}}}},115:{l:{104:{l:{59:{c:[8627]}}}}}}},101:{l:{97:{l:{108:{l:{59:{c:[8476]},105:{l:{110:{l:{101:{l:{59:{c:[8475]}}}}}}},112:{l:{97:{l:{114:{l:{116:{l:{59:{c:[8476]}}}}}}}}},115:{l:{59:{c:[8477]}}}}}}},99:{l:{116:{l:{59:{c:[9645]}}}}},103:{l:{59:{c:[174]}},c:[174]}}},102:{l:{105:{l:{115:{l:{104:{l:{116:{l:{59:{c:[10621]}}}}}}}}},108:{l:{111:{l:{111:{l:{114:{l:{59:{c:[8971]}}}}}}}}},114:{l:{59:{c:[120111]}}}}},104:{l:{97:{l:{114:{l:{100:{l:{59:{c:[8641]}}},117:{l:{59:{c:[8640]},108:{l:{59:{c:[10604]}}}}}}}}},111:{l:{59:{c:[961]},118:{l:{59:{c:[1009]}}}}}}},105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8594]},116:{l:{97:{l:{105:{l:{108:{l:{59:{c:[8611]}}}}}}}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{111:{l:{111:{l:{110:{l:{100:{l:{111:{l:{119:{l:{110:{l:{59:{c:[8641]}}}}}}}}},117:{l:{112:{l:{59:{c:[8640]}}}}}}}}}}}}}}}}}}},108:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{115:{l:{59:{c:[8644]}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{111:{l:{111:{l:{110:{l:{115:{l:{59:{c:[8652]}}}}}}}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{115:{l:{59:{c:[8649]}}}}}}}}}}}}}}}}}}}}}}},115:{l:{113:{l:{117:{l:{105:{l:{103:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8605]}}}}}}}}}}}}}}}}}}}}},116:{l:{104:{l:{114:{l:{101:{l:{101:{l:{116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8908]}}}}}}}}}}}}}}}}}}}}}}}}}}},110:{l:{103:{l:{59:{c:[730]}}}}},115:{l:{105:{l:{110:{l:{103:{l:{100:{l:{111:{l:{116:{l:{115:{l:{101:{l:{113:{l:{59:{c:[8787]}}}}}}}}}}}}}}}}}}}}}}},108:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8644]}}}}}}},104:{l:{97:{l:{114:{l:{59:{c:[8652]}}}}}}},109:{l:{59:{c:[8207]}}}}},109:{l:{111:{l:{117:{l:{115:{l:{116:{l:{59:{c:[9137]},97:{l:{99:{l:{104:{l:{101:{l:{59:{c:[9137]}}}}}}}}}}}}}}}}}}},110:{l:{109:{l:{105:{l:{100:{l:{59:{c:[10990]}}}}}}}}},111:{l:{97:{l:{110:{l:{103:{l:{59:{c:[10221]}}}}},114:{l:{114:{l:{59:{c:[8702]}}}}}}},98:{l:{114:{l:{107:{l:{59:{c:[10215]}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[10630]}}}}},102:{l:{59:{c:[120163]}}},108:{l:{117:{l:{115:{l:{59:{c:[10798]}}}}}}}}},116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[10805]}}}}}}}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[41]},103:{l:{116:{l:{59:{c:[10644]}}}}}}}}},112:{l:{111:{l:{108:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10770]}}}}}}}}}}}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8649]}}}}}}}}},115:{l:{97:{l:{113:{l:{117:{l:{111:{l:{59:{c:[8250]}}}}}}}}},99:{l:{114:{l:{59:{c:[120007]}}}}},104:{l:{59:{c:[8625]}}},113:{l:{98:{l:{59:{c:[93]}}},117:{l:{111:{l:{59:{c:[8217]},114:{l:{59:{c:[8217]}}}}}}}}}}},116:{l:{104:{l:{114:{l:{101:{l:{101:{l:{59:{c:[8908]}}}}}}}}},105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8906]}}}}}}}}},114:{l:{105:{l:{59:{c:[9657]},101:{l:{59:{c:[8885]}}},102:{l:{59:{c:[9656]}}},108:{l:{116:{l:{114:{l:{105:{l:{59:{c:[10702]}}}}}}}}}}}}}}},117:{l:{108:{l:{117:{l:{104:{l:{97:{l:{114:{l:{59:{c:[10600]}}}}}}}}}}}}},120:{l:{59:{c:[8478]}}}}},115:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[347]}}}}}}}}}}},98:{l:{113:{l:{117:{l:{111:{l:{59:{c:[8218]}}}}}}}}},99:{l:{59:{c:[8827]},69:{l:{59:{c:[10932]}}},97:{l:{112:{l:{59:{c:[10936]}}},114:{l:{111:{l:{110:{l:{59:{c:[353]}}}}}}}}},99:{l:{117:{l:{101:{l:{59:{c:[8829]}}}}}}},101:{l:{59:{c:[10928]},100:{l:{105:{l:{108:{l:{59:{c:[351]}}}}}}}}},105:{l:{114:{l:{99:{l:{59:{c:[349]}}}}}}},110:{l:{69:{l:{59:{c:[10934]}}},97:{l:{112:{l:{59:{c:[10938]}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8937]}}}}}}}}},112:{l:{111:{l:{108:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10771]}}}}}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8831]}}}}}}},121:{l:{59:{c:[1089]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8901]},98:{l:{59:{c:[8865]}}},101:{l:{59:{c:[10854]}}}}}}}}},101:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8664]}}}}}}},97:{l:{114:{l:{104:{l:{107:{l:{59:{c:[10533]}}}}},114:{l:{59:{c:[8600]},111:{l:{119:{l:{59:{c:[8600]}}}}}}}}}}},99:{l:{116:{l:{59:{c:[167]}},c:[167]}}},109:{l:{105:{l:{59:{c:[59]}}}}},115:{l:{119:{l:{97:{l:{114:{l:{59:{c:[10537]}}}}}}}}},116:{l:{109:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[8726]}}}}}}}}},110:{l:{59:{c:[8726]}}}}}}},120:{l:{116:{l:{59:{c:[10038]}}}}}}},102:{l:{114:{l:{59:{c:[120112]},111:{l:{119:{l:{110:{l:{59:{c:[8994]}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{59:{c:[9839]}}}}}}},99:{l:{104:{l:{99:{l:{121:{l:{59:{c:[1097]}}}}}}},121:{l:{59:{c:[1096]}}}}},111:{l:{114:{l:{116:{l:{109:{l:{105:{l:{100:{l:{59:{c:[8739]}}}}}}},112:{l:{97:{l:{114:{l:{97:{l:{108:{l:{108:{l:{101:{l:{108:{l:{59:{c:[8741]}}}}}}}}}}}}}}}}}}}}}}},121:{l:{59:{c:[173]}},c:[173]}}},105:{l:{103:{l:{109:{l:{97:{l:{59:{c:[963]},102:{l:{59:{c:[962]}}},118:{l:{59:{c:[962]}}}}}}}}},109:{l:{59:{c:[8764]},100:{l:{111:{l:{116:{l:{59:{c:[10858]}}}}}}},101:{l:{59:{c:[8771]},113:{l:{59:{c:[8771]}}}}},103:{l:{59:{c:[10910]},69:{l:{59:{c:[10912]}}}}},108:{l:{59:{c:[10909]},69:{l:{59:{c:[10911]}}}}},110:{l:{101:{l:{59:{c:[8774]}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10788]}}}}}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10610]}}}}}}}}}}}}},108:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8592]}}}}}}}}},109:{l:{97:{l:{108:{l:{108:{l:{115:{l:{101:{l:{116:{l:{109:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[8726]}}}}}}}}}}}}}}}}}}}}},115:{l:{104:{l:{112:{l:{59:{c:[10803]}}}}}}}}},101:{l:{112:{l:{97:{l:{114:{l:{115:{l:{108:{l:{59:{c:[10724]}}}}}}}}}}}}},105:{l:{100:{l:{59:{c:[8739]}}},108:{l:{101:{l:{59:{c:[8995]}}}}}}},116:{l:{59:{c:[10922]},101:{l:{59:{c:[10924]},115:{l:{59:{c:[10924,65024]}}}}}}}}},111:{l:{102:{l:{116:{l:{99:{l:{121:{l:{59:{c:[1100]}}}}}}}}},108:{l:{59:{c:[47]},98:{l:{59:{c:[10692]},97:{l:{114:{l:{59:{c:[9023]}}}}}}}}},112:{l:{102:{l:{59:{c:[120164]}}}}}}},112:{l:{97:{l:{100:{l:{101:{l:{115:{l:{59:{c:[9824]},117:{l:{105:{l:{116:{l:{59:{c:[9824]}}}}}}}}}}}}},114:{l:{59:{c:[8741]}}}}}}},113:{l:{99:{l:{97:{l:{112:{l:{59:{c:[8851]},115:{l:{59:{c:[8851,65024]}}}}}}},117:{l:{112:{l:{59:{c:[8852]},115:{l:{59:{c:[8852,65024]}}}}}}}}},115:{l:{117:{l:{98:{l:{59:{c:[8847]},101:{l:{59:{c:[8849]}}},115:{l:{101:{l:{116:{l:{59:{c:[8847]},101:{l:{113:{l:{59:{c:[8849]}}}}}}}}}}}}},112:{l:{59:{c:[8848]},101:{l:{59:{c:[8850]}}},115:{l:{101:{l:{116:{l:{59:{c:[8848]},101:{l:{113:{l:{59:{c:[8850]}}}}}}}}}}}}}}}}},117:{l:{59:{c:[9633]},97:{l:{114:{l:{101:{l:{59:{c:[9633]}}},102:{l:{59:{c:[9642]}}}}}}},102:{l:{59:{c:[9642]}}}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8594]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120008]}}}}},101:{l:{116:{l:{109:{l:{110:{l:{59:{c:[8726]}}}}}}}}},109:{l:{105:{l:{108:{l:{101:{l:{59:{c:[8995]}}}}}}}}},116:{l:{97:{l:{114:{l:{102:{l:{59:{c:[8902]}}}}}}}}}}},116:{l:{97:{l:{114:{l:{59:{c:[9734]},102:{l:{59:{c:[9733]}}}}}}},114:{l:{97:{l:{105:{l:{103:{l:{104:{l:{116:{l:{101:{l:{112:{l:{115:{l:{105:{l:{108:{l:{111:{l:{110:{l:{59:{c:[1013]}}}}}}}}}}}}}}},112:{l:{104:{l:{105:{l:{59:{c:[981]}}}}}}}}}}}}}}}}},110:{l:{115:{l:{59:{c:[175]}}}}}}}}},117:{l:{98:{l:{59:{c:[8834]},69:{l:{59:{c:[10949]}}},100:{l:{111:{l:{116:{l:{59:{c:[10941]}}}}}}},101:{l:{59:{c:[8838]},100:{l:{111:{l:{116:{l:{59:{c:[10947]}}}}}}}}},109:{l:{117:{l:{108:{l:{116:{l:{59:{c:[10945]}}}}}}}}},110:{l:{69:{l:{59:{c:[10955]}}},101:{l:{59:{c:[8842]}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10943]}}}}}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10617]}}}}}}}}},115:{l:{101:{l:{116:{l:{59:{c:[8834]},101:{l:{113:{l:{59:{c:[8838]},113:{l:{59:{c:[10949]}}}}}}},110:{l:{101:{l:{113:{l:{59:{c:[8842]},113:{l:{59:{c:[10955]}}}}}}}}}}}}},105:{l:{109:{l:{59:{c:[10951]}}}}},117:{l:{98:{l:{59:{c:[10965]}}},112:{l:{59:{c:[10963]}}}}}}}}},99:{l:{99:{l:{59:{c:[8827]},97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10936]}}}}}}}}}}}}},99:{l:{117:{l:{114:{l:{108:{l:{121:{l:{101:{l:{113:{l:{59:{c:[8829]}}}}}}}}}}}}}}},101:{l:{113:{l:{59:{c:[10928]}}}}},110:{l:{97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10938]}}}}}}}}}}}}},101:{l:{113:{l:{113:{l:{59:{c:[10934]}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8937]}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8831]}}}}}}}}}}},109:{l:{59:{c:[8721]}}},110:{l:{103:{l:{59:{c:[9834]}}}}},112:{l:{49:{l:{59:{c:[185]}},c:[185]},50:{l:{59:{c:[178]}},c:[178]},51:{l:{59:{c:[179]}},c:[179]},59:{c:[8835]},69:{l:{59:{c:[10950]}}},100:{l:{111:{l:{116:{l:{59:{c:[10942]}}}}},115:{l:{117:{l:{98:{l:{59:{c:[10968]}}}}}}}}},101:{l:{59:{c:[8839]},100:{l:{111:{l:{116:{l:{59:{c:[10948]}}}}}}}}},104:{l:{115:{l:{111:{l:{108:{l:{59:{c:[10185]}}}}},117:{l:{98:{l:{59:{c:[10967]}}}}}}}}},108:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10619]}}}}}}}}},109:{l:{117:{l:{108:{l:{116:{l:{59:{c:[10946]}}}}}}}}},110:{l:{69:{l:{59:{c:[10956]}}},101:{l:{59:{c:[8843]}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10944]}}}}}}}}},115:{l:{101:{l:{116:{l:{59:{c:[8835]},101:{l:{113:{l:{59:{c:[8839]},113:{l:{59:{c:[10950]}}}}}}},110:{l:{101:{l:{113:{l:{59:{c:[8843]},113:{l:{59:{c:[10956]}}}}}}}}}}}}},105:{l:{109:{l:{59:{c:[10952]}}}}},117:{l:{98:{l:{59:{c:[10964]}}},112:{l:{59:{c:[10966]}}}}}}}}}}},119:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8665]}}}}}}},97:{l:{114:{l:{104:{l:{107:{l:{59:{c:[10534]}}}}},114:{l:{59:{c:[8601]},111:{l:{119:{l:{59:{c:[8601]}}}}}}}}}}},110:{l:{119:{l:{97:{l:{114:{l:{59:{c:[10538]}}}}}}}}}}},122:{l:{108:{l:{105:{l:{103:{l:{59:{c:[223]}},c:[223]}}}}}}}}},116:{l:{97:{l:{114:{l:{103:{l:{101:{l:{116:{l:{59:{c:[8982]}}}}}}}}},117:{l:{59:{c:[964]}}}}},98:{l:{114:{l:{107:{l:{59:{c:[9140]}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[357]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[355]}}}}}}}}},121:{l:{59:{c:[1090]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8411]}}}}}}},101:{l:{108:{l:{114:{l:{101:{l:{99:{l:{59:{c:[8981]}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120113]}}}}},104:{l:{101:{l:{114:{l:{101:{l:{52:{l:{59:{c:[8756]}}},102:{l:{111:{l:{114:{l:{101:{l:{59:{c:[8756]}}}}}}}}}}}}},116:{l:{97:{l:{59:{c:[952]},115:{l:{121:{l:{109:{l:{59:{c:[977]}}}}}}},118:{l:{59:{c:[977]}}}}}}}}},105:{l:{99:{l:{107:{l:{97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[8776]}}}}}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8764]}}}}}}}}}}},110:{l:{115:{l:{112:{l:{59:{c:[8201]}}}}}}}}},107:{l:{97:{l:{112:{l:{59:{c:[8776]}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8764]}}}}}}}}},111:{l:{114:{l:{110:{l:{59:{c:[254]}},c:[254]}}}}}}},105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[732]}}}}}}},109:{l:{101:{l:{115:{l:{59:{c:[215]},98:{l:{59:{c:[8864]},97:{l:{114:{l:{59:{c:[10801]}}}}}}},100:{l:{59:{c:[10800]}}}},c:[215]}}}}},110:{l:{116:{l:{59:{c:[8749]}}}}}}},111:{l:{101:{l:{97:{l:{59:{c:[10536]}}}}},112:{l:{59:{c:[8868]},98:{l:{111:{l:{116:{l:{59:{c:[9014]}}}}}}},99:{l:{105:{l:{114:{l:{59:{c:[10993]}}}}}}},102:{l:{59:{c:[120165]},111:{l:{114:{l:{107:{l:{59:{c:[10970]}}}}}}}}}}},115:{l:{97:{l:{59:{c:[10537]}}}}}}},112:{l:{114:{l:{105:{l:{109:{l:{101:{l:{59:{c:[8244]}}}}}}}}}}},114:{l:{97:{l:{100:{l:{101:{l:{59:{c:[8482]}}}}}}},105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[9653]},100:{l:{111:{l:{119:{l:{110:{l:{59:{c:[9663]}}}}}}}}},108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[9667]},101:{l:{113:{l:{59:{c:[8884]}}}}}}}}}}}}},113:{l:{59:{c:[8796]}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[9657]},101:{l:{113:{l:{59:{c:[8885]}}}}}}}}}}}}}}}}}}}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[9708]}}}}}}},101:{l:{59:{c:[8796]}}},109:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[10810]}}}}}}}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10809]}}}}}}}}},115:{l:{98:{l:{59:{c:[10701]}}}}},116:{l:{105:{l:{109:{l:{101:{l:{59:{c:[10811]}}}}}}}}}}},112:{l:{101:{l:{122:{l:{105:{l:{117:{l:{109:{l:{59:{c:[9186]}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120009]}}},121:{l:{59:{c:[1094]}}}}},104:{l:{99:{l:{121:{l:{59:{c:[1115]}}}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[359]}}}}}}}}}}},119:{l:{105:{l:{120:{l:{116:{l:{59:{c:[8812]}}}}}}},111:{l:{104:{l:{101:{l:{97:{l:{100:{l:{108:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8606]}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8608]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},117:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8657]}}}}}}},72:{l:{97:{l:{114:{l:{59:{c:[10595]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[250]}},c:[250]}}}}}}},114:{l:{114:{l:{59:{c:[8593]}}}}}}},98:{l:{114:{l:{99:{l:{121:{l:{59:{c:[1118]}}}}},101:{l:{118:{l:{101:{l:{59:{c:[365]}}}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[251]}},c:[251]}}}}},121:{l:{59:{c:[1091]}}}}},100:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8645]}}}}}}},98:{l:{108:{l:{97:{l:{99:{l:{59:{c:[369]}}}}}}}}},104:{l:{97:{l:{114:{l:{59:{c:[10606]}}}}}}}}},102:{l:{105:{l:{115:{l:{104:{l:{116:{l:{59:{c:[10622]}}}}}}}}},114:{l:{59:{c:[120114]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[249]}},c:[249]}}}}}}}}},104:{l:{97:{l:{114:{l:{108:{l:{59:{c:[8639]}}},114:{l:{59:{c:[8638]}}}}}}},98:{l:{108:{l:{107:{l:{59:{c:[9600]}}}}}}}}},108:{l:{99:{l:{111:{l:{114:{l:{110:{l:{59:{c:[8988]},101:{l:{114:{l:{59:{c:[8988]}}}}}}}}}}},114:{l:{111:{l:{112:{l:{59:{c:[8975]}}}}}}}}},116:{l:{114:{l:{105:{l:{59:{c:[9720]}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[363]}}}}}}},108:{l:{59:{c:[168]}},c:[168]}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[371]}}}}}}},112:{l:{102:{l:{59:{c:[120166]}}}}}}},112:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8593]}}}}}}}}}}},100:{l:{111:{l:{119:{l:{110:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8597]}}}}}}}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{111:{l:{111:{l:{110:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8639]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8638]}}}}}}}}}}}}}}}}}}}}}}}}},108:{l:{117:{l:{115:{l:{59:{c:[8846]}}}}}}},115:{l:{105:{l:{59:{c:[965]},104:{l:{59:{c:[978]}}},108:{l:{111:{l:{110:{l:{59:{c:[965]}}}}}}}}}}},117:{l:{112:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{115:{l:{59:{c:[8648]}}}}}}}}}}}}}}}}}}},114:{l:{99:{l:{111:{l:{114:{l:{110:{l:{59:{c:[8989]},101:{l:{114:{l:{59:{c:[8989]}}}}}}}}}}},114:{l:{111:{l:{112:{l:{59:{c:[8974]}}}}}}}}},105:{l:{110:{l:{103:{l:{59:{c:[367]}}}}}}},116:{l:{114:{l:{105:{l:{59:{c:[9721]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120010]}}}}}}},116:{l:{100:{l:{111:{l:{116:{l:{59:{c:[8944]}}}}}}},105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[361]}}}}}}}}},114:{l:{105:{l:{59:{c:[9653]},102:{l:{59:{c:[9652]}}}}}}}}},117:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8648]}}}}}}},109:{l:{108:{l:{59:{c:[252]}},c:[252]}}}}},119:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[10663]}}}}}}}}}}}}}}},118:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8661]}}}}}}},66:{l:{97:{l:{114:{l:{59:{c:[10984]},118:{l:{59:{c:[10985]}}}}}}}}},68:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8872]}}}}}}}}},97:{l:{110:{l:{103:{l:{114:{l:{116:{l:{59:{c:[10652]}}}}}}}}},114:{l:{101:{l:{112:{l:{115:{l:{105:{l:{108:{l:{111:{l:{110:{l:{59:{c:[1013]}}}}}}}}}}}}}}},107:{l:{97:{l:{112:{l:{112:{l:{97:{l:{59:{c:[1008]}}}}}}}}}}},110:{l:{111:{l:{116:{l:{104:{l:{105:{l:{110:{l:{103:{l:{59:{c:[8709]}}}}}}}}}}}}}}},112:{l:{104:{l:{105:{l:{59:{c:[981]}}}}},105:{l:{59:{c:[982]}}},114:{l:{111:{l:{112:{l:{116:{l:{111:{l:{59:{c:[8733]}}}}}}}}}}}}},114:{l:{59:{c:[8597]},104:{l:{111:{l:{59:{c:[1009]}}}}}}},115:{l:{105:{l:{103:{l:{109:{l:{97:{l:{59:{c:[962]}}}}}}}}},117:{l:{98:{l:{115:{l:{101:{l:{116:{l:{110:{l:{101:{l:{113:{l:{59:{c:[8842,65024]},113:{l:{59:{c:[10955,65024]}}}}}}}}}}}}}}}}},112:{l:{115:{l:{101:{l:{116:{l:{110:{l:{101:{l:{113:{l:{59:{c:[8843,65024]},113:{l:{59:{c:[10956,65024]}}}}}}}}}}}}}}}}}}}}},116:{l:{104:{l:{101:{l:{116:{l:{97:{l:{59:{c:[977]}}}}}}}}},114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8882]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8883]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},99:{l:{121:{l:{59:{c:[1074]}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8866]}}}}}}}}},101:{l:{101:{l:{59:{c:[8744]},98:{l:{97:{l:{114:{l:{59:{c:[8891]}}}}}}},101:{l:{113:{l:{59:{c:[8794]}}}}}}},108:{l:{108:{l:{105:{l:{112:{l:{59:{c:[8942]}}}}}}}}},114:{l:{98:{l:{97:{l:{114:{l:{59:{c:[124]}}}}}}},116:{l:{59:{c:[124]}}}}}}},102:{l:{114:{l:{59:{c:[120115]}}}}},108:{l:{116:{l:{114:{l:{105:{l:{59:{c:[8882]}}}}}}}}},110:{l:{115:{l:{117:{l:{98:{l:{59:{c:[8834,8402]}}},112:{l:{59:{c:[8835,8402]}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120167]}}}}}}},112:{l:{114:{l:{111:{l:{112:{l:{59:{c:[8733]}}}}}}}}},114:{l:{116:{l:{114:{l:{105:{l:{59:{c:[8883]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120011]}}}}},117:{l:{98:{l:{110:{l:{69:{l:{59:{c:[10955,65024]}}},101:{l:{59:{c:[8842,65024]}}}}}}},112:{l:{110:{l:{69:{l:{59:{c:[10956,65024]}}},101:{l:{59:{c:[8843,65024]}}}}}}}}}}},122:{l:{105:{l:{103:{l:{122:{l:{97:{l:{103:{l:{59:{c:[10650]}}}}}}}}}}}}}}},119:{l:{99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[373]}}}}}}}}},101:{l:{100:{l:{98:{l:{97:{l:{114:{l:{59:{c:[10847]}}}}}}},103:{l:{101:{l:{59:{c:[8743]},113:{l:{59:{c:[8793]}}}}}}}}},105:{l:{101:{l:{114:{l:{112:{l:{59:{c:[8472]}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120116]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120168]}}}}}}},112:{l:{59:{c:[8472]}}},114:{l:{59:{c:[8768]},101:{l:{97:{l:{116:{l:{104:{l:{59:{c:[8768]}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120012]}}}}}}}}},120:{l:{99:{l:{97:{l:{112:{l:{59:{c:[8898]}}}}},105:{l:{114:{l:{99:{l:{59:{c:[9711]}}}}}}},117:{l:{112:{l:{59:{c:[8899]}}}}}}},100:{l:{116:{l:{114:{l:{105:{l:{59:{c:[9661]}}}}}}}}},102:{l:{114:{l:{59:{c:[120117]}}}}},104:{l:{65:{l:{114:{l:{114:{l:{59:{c:[10234]}}}}}}},97:{l:{114:{l:{114:{l:{59:{c:[10231]}}}}}}}}},105:{l:{59:{c:[958]}}},108:{l:{65:{l:{114:{l:{114:{l:{59:{c:[10232]}}}}}}},97:{l:{114:{l:{114:{l:{59:{c:[10229]}}}}}}}}},109:{l:{97:{l:{112:{l:{59:{c:[10236]}}}}}}},110:{l:{105:{l:{115:{l:{59:{c:[8955]}}}}}}},111:{l:{100:{l:{111:{l:{116:{l:{59:{c:[10752]}}}}}}},112:{l:{102:{l:{59:{c:[120169]}}},108:{l:{117:{l:{115:{l:{59:{c:[10753]}}}}}}}}},116:{l:{105:{l:{109:{l:{101:{l:{59:{c:[10754]}}}}}}}}}}},114:{l:{65:{l:{114:{l:{114:{l:{59:{c:[10233]}}}}}}},97:{l:{114:{l:{114:{l:{59:{c:[10230]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120013]}}}}},113:{l:{99:{l:{117:{l:{112:{l:{59:{c:[10758]}}}}}}}}}}},117:{l:{112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10756]}}}}}}}}},116:{l:{114:{l:{105:{l:{59:{c:[9651]}}}}}}}}},118:{l:{101:{l:{101:{l:{59:{c:[8897]}}}}}}},119:{l:{101:{l:{100:{l:{103:{l:{101:{l:{59:{c:[8896]}}}}}}}}}}}}},121:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[253]}},c:[253]}}}}},121:{l:{59:{c:[1103]}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[375]}}}}}}},121:{l:{59:{c:[1099]}}}}},101:{l:{110:{l:{59:{c:[165]}},c:[165]}}},102:{l:{114:{l:{59:{c:[120118]}}}}},105:{l:{99:{l:{121:{l:{59:{c:[1111]}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120170]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120014]}}}}}}},117:{l:{99:{l:{121:{l:{59:{c:[1102]}}}}},109:{l:{108:{l:{59:{c:[255]}},c:[255]}}}}}}},122:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[378]}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[382]}}}}}}}}},121:{l:{59:{c:[1079]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[380]}}}}}}},101:{l:{101:{l:{116:{l:{114:{l:{102:{l:{59:{c:[8488]}}}}}}}}},116:{l:{97:{l:{59:{c:[950]}}}}}}},102:{l:{114:{l:{59:{c:[120119]}}}}},104:{l:{99:{l:{121:{l:{59:{c:[1078]}}}}}}},105:{l:{103:{l:{114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8669]}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120171]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120015]}}}}}}},119:{l:{106:{l:{59:{c:[8205]}}},110:{l:{106:{l:{59:{c:[8204]}}}}}}}}}}; 1331 1332},{}],13:[function(require,module,exports){ 1333'use strict'; 1334 1335var UNICODE = require('../common/unicode'); 1336 1337//Aliases 1338var $ = UNICODE.CODE_POINTS; 1339 1340//Utils 1341 1342//OPTIMIZATION: these utility functions should not be moved out of this module. V8 Crankshaft will not inline 1343//this functions if they will be situated in another module due to context switch. 1344//Always perform inlining check before modifying this functions ('node --trace-inlining'). 1345function isReservedCodePoint(cp) { 1346 return cp >= 0xD800 && cp <= 0xDFFF || cp > 0x10FFFF; 1347} 1348 1349function isSurrogatePair(cp1, cp2) { 1350 return cp1 >= 0xD800 && cp1 <= 0xDBFF && cp2 >= 0xDC00 && cp2 <= 0xDFFF; 1351} 1352 1353function getSurrogatePairCodePoint(cp1, cp2) { 1354 return (cp1 - 0xD800) * 0x400 + 0x2400 + cp2; 1355} 1356 1357//Preprocessor 1358//NOTE: HTML input preprocessing 1359//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#preprocessing-the-input-stream) 1360var Preprocessor = module.exports = function (html) { 1361 this.write(html); 1362 1363 //NOTE: one leading U+FEFF BYTE ORDER MARK character must be ignored if any are present in the input stream. 1364 this.pos = this.html.charCodeAt(0) === $.BOM ? 0 : -1; 1365 1366 this.gapStack = []; 1367 this.lastGapPos = -1; 1368 this.skipNextNewLine = false; 1369}; 1370 1371Preprocessor.prototype.write = function (html) { 1372 if (this.html) { 1373 this.html = this.html.substring(0, this.pos + 1) + 1374 html + 1375 this.html.substring(this.pos + 1, this.html.length); 1376 1377 } 1378 else 1379 this.html = html; 1380 1381 1382 this.lastCharPos = this.html.length - 1; 1383}; 1384 1385Preprocessor.prototype.advanceAndPeekCodePoint = function () { 1386 this.pos++; 1387 1388 if (this.pos > this.lastCharPos) 1389 return $.EOF; 1390 1391 var cp = this.html.charCodeAt(this.pos); 1392 1393 //NOTE: any U+000A LINE FEED (LF) characters that immediately follow a U+000D CARRIAGE RETURN (CR) character 1394 //must be ignored. 1395 if (this.skipNextNewLine && cp === $.LINE_FEED) { 1396 this.skipNextNewLine = false; 1397 this._addGap(); 1398 return this.advanceAndPeekCodePoint(); 1399 } 1400 1401 //NOTE: all U+000D CARRIAGE RETURN (CR) characters must be converted to U+000A LINE FEED (LF) characters 1402 if (cp === $.CARRIAGE_RETURN) { 1403 this.skipNextNewLine = true; 1404 return $.LINE_FEED; 1405 } 1406 1407 this.skipNextNewLine = false; 1408 1409 //OPTIMIZATION: first perform check if the code point in the allowed range that covers most common 1410 //HTML input (e.g. ASCII codes) to avoid performance-cost operations for high-range code points. 1411 return cp >= 0xD800 ? this._processHighRangeCodePoint(cp) : cp; 1412}; 1413 1414Preprocessor.prototype._processHighRangeCodePoint = function (cp) { 1415 //NOTE: try to peek a surrogate pair 1416 if (this.pos !== this.lastCharPos) { 1417 var nextCp = this.html.charCodeAt(this.pos + 1); 1418 1419 if (isSurrogatePair(cp, nextCp)) { 1420 //NOTE: we have a surrogate pair. Peek pair character and recalculate code point. 1421 this.pos++; 1422 cp = getSurrogatePairCodePoint(cp, nextCp); 1423 1424 //NOTE: add gap that should be avoided during retreat 1425 this._addGap(); 1426 } 1427 } 1428 1429 if (isReservedCodePoint(cp)) 1430 cp = $.REPLACEMENT_CHARACTER; 1431 1432 return cp; 1433}; 1434 1435Preprocessor.prototype._addGap = function () { 1436 this.gapStack.push(this.lastGapPos); 1437 this.lastGapPos = this.pos; 1438}; 1439 1440Preprocessor.prototype.retreat = function () { 1441 if (this.pos === this.lastGapPos) { 1442 this.lastGapPos = this.gapStack.pop(); 1443 this.pos--; 1444 } 1445 1446 this.pos--; 1447}; 1448 1449},{"../common/unicode":4}],14:[function(require,module,exports){ 1450'use strict'; 1451 1452var Preprocessor = require('./preprocessor'), 1453 LocationInfoMixin = require('./location_info_mixin'), 1454 UNICODE = require('../common/unicode'), 1455 NAMED_ENTITY_TRIE = require('./named_entity_trie'); 1456 1457//Aliases 1458var $ = UNICODE.CODE_POINTS, 1459 $$ = UNICODE.CODE_POINT_SEQUENCES; 1460 1461//Replacement code points for numeric entities 1462var NUMERIC_ENTITY_REPLACEMENTS = { 1463 0x00: 0xFFFD, 0x0D: 0x000D, 0x80: 0x20AC, 0x81: 0x0081, 0x82: 0x201A, 0x83: 0x0192, 0x84: 0x201E, 1464 0x85: 0x2026, 0x86: 0x2020, 0x87: 0x2021, 0x88: 0x02C6, 0x89: 0x2030, 0x8A: 0x0160, 0x8B: 0x2039, 1465 0x8C: 0x0152, 0x8D: 0x008D, 0x8E: 0x017D, 0x8F: 0x008F, 0x90: 0x0090, 0x91: 0x2018, 0x92: 0x2019, 1466 0x93: 0x201C, 0x94: 0x201D, 0x95: 0x2022, 0x96: 0x2013, 0x97: 0x2014, 0x98: 0x02DC, 0x99: 0x2122, 1467 0x9A: 0x0161, 0x9B: 0x203A, 0x9C: 0x0153, 0x9D: 0x009D, 0x9E: 0x017E, 0x9F: 0x0178 1468}; 1469 1470//States 1471var DATA_STATE = 'DATA_STATE', 1472 CHARACTER_REFERENCE_IN_DATA_STATE = 'CHARACTER_REFERENCE_IN_DATA_STATE', 1473 RCDATA_STATE = 'RCDATA_STATE', 1474 CHARACTER_REFERENCE_IN_RCDATA_STATE = 'CHARACTER_REFERENCE_IN_RCDATA_STATE', 1475 RAWTEXT_STATE = 'RAWTEXT_STATE', 1476 SCRIPT_DATA_STATE = 'SCRIPT_DATA_STATE', 1477 PLAINTEXT_STATE = 'PLAINTEXT_STATE', 1478 TAG_OPEN_STATE = 'TAG_OPEN_STATE', 1479 END_TAG_OPEN_STATE = 'END_TAG_OPEN_STATE', 1480 TAG_NAME_STATE = 'TAG_NAME_STATE', 1481 RCDATA_LESS_THAN_SIGN_STATE = 'RCDATA_LESS_THAN_SIGN_STATE', 1482 RCDATA_END_TAG_OPEN_STATE = 'RCDATA_END_TAG_OPEN_STATE', 1483 RCDATA_END_TAG_NAME_STATE = 'RCDATA_END_TAG_NAME_STATE', 1484 RAWTEXT_LESS_THAN_SIGN_STATE = 'RAWTEXT_LESS_THAN_SIGN_STATE', 1485 RAWTEXT_END_TAG_OPEN_STATE = 'RAWTEXT_END_TAG_OPEN_STATE', 1486 RAWTEXT_END_TAG_NAME_STATE = 'RAWTEXT_END_TAG_NAME_STATE', 1487 SCRIPT_DATA_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_LESS_THAN_SIGN_STATE', 1488 SCRIPT_DATA_END_TAG_OPEN_STATE = 'SCRIPT_DATA_END_TAG_OPEN_STATE', 1489 SCRIPT_DATA_END_TAG_NAME_STATE = 'SCRIPT_DATA_END_TAG_NAME_STATE', 1490 SCRIPT_DATA_ESCAPE_START_STATE = 'SCRIPT_DATA_ESCAPE_START_STATE', 1491 SCRIPT_DATA_ESCAPE_START_DASH_STATE = 'SCRIPT_DATA_ESCAPE_START_DASH_STATE', 1492 SCRIPT_DATA_ESCAPED_STATE = 'SCRIPT_DATA_ESCAPED_STATE', 1493 SCRIPT_DATA_ESCAPED_DASH_STATE = 'SCRIPT_DATA_ESCAPED_DASH_STATE', 1494 SCRIPT_DATA_ESCAPED_DASH_DASH_STATE = 'SCRIPT_DATA_ESCAPED_DASH_DASH_STATE', 1495 SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE', 1496 SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE = 'SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE', 1497 SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE = 'SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE', 1498 SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE', 1499 SCRIPT_DATA_DOUBLE_ESCAPED_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_STATE', 1500 SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE', 1501 SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE', 1502 SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE', 1503 SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE', 1504 BEFORE_ATTRIBUTE_NAME_STATE = 'BEFORE_ATTRIBUTE_NAME_STATE', 1505 ATTRIBUTE_NAME_STATE = 'ATTRIBUTE_NAME_STATE', 1506 AFTER_ATTRIBUTE_NAME_STATE = 'AFTER_ATTRIBUTE_NAME_STATE', 1507 BEFORE_ATTRIBUTE_VALUE_STATE = 'BEFORE_ATTRIBUTE_VALUE_STATE', 1508 ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE = 'ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE', 1509 ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE = 'ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE', 1510 ATTRIBUTE_VALUE_UNQUOTED_STATE = 'ATTRIBUTE_VALUE_UNQUOTED_STATE', 1511 CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE = 'CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE', 1512 AFTER_ATTRIBUTE_VALUE_QUOTED_STATE = 'AFTER_ATTRIBUTE_VALUE_QUOTED_STATE', 1513 SELF_CLOSING_START_TAG_STATE = 'SELF_CLOSING_START_TAG_STATE', 1514 BOGUS_COMMENT_STATE = 'BOGUS_COMMENT_STATE', 1515 MARKUP_DECLARATION_OPEN_STATE = 'MARKUP_DECLARATION_OPEN_STATE', 1516 COMMENT_START_STATE = 'COMMENT_START_STATE', 1517 COMMENT_START_DASH_STATE = 'COMMENT_START_DASH_STATE', 1518 COMMENT_STATE = 'COMMENT_STATE', 1519 COMMENT_END_DASH_STATE = 'COMMENT_END_DASH_STATE', 1520 COMMENT_END_STATE = 'COMMENT_END_STATE', 1521 COMMENT_END_BANG_STATE = 'COMMENT_END_BANG_STATE', 1522 DOCTYPE_STATE = 'DOCTYPE_STATE', 1523 BEFORE_DOCTYPE_NAME_STATE = 'BEFORE_DOCTYPE_NAME_STATE', 1524 DOCTYPE_NAME_STATE = 'DOCTYPE_NAME_STATE', 1525 AFTER_DOCTYPE_NAME_STATE = 'AFTER_DOCTYPE_NAME_STATE', 1526 AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE = 'AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE', 1527 BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE = 'BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE', 1528 DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE = 'DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE', 1529 DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE = 'DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE', 1530 AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE = 'AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE', 1531 BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE = 'BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE', 1532 AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE = 'AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE', 1533 BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE = 'BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE', 1534 DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE = 'DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE', 1535 DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE = 'DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE', 1536 AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE = 'AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE', 1537 BOGUS_DOCTYPE_STATE = 'BOGUS_DOCTYPE_STATE', 1538 CDATA_SECTION_STATE = 'CDATA_SECTION_STATE'; 1539 1540//Utils 1541 1542//OPTIMIZATION: these utility functions should not be moved out of this module. V8 Crankshaft will not inline 1543//this functions if they will be situated in another module due to context switch. 1544//Always perform inlining check before modifying this functions ('node --trace-inlining'). 1545function isWhitespace(cp) { 1546 return cp === $.SPACE || cp === $.LINE_FEED || cp === $.TABULATION || cp === $.FORM_FEED; 1547} 1548 1549function isAsciiDigit(cp) { 1550 return cp >= $.DIGIT_0 && cp <= $.DIGIT_9; 1551} 1552 1553function isAsciiUpper(cp) { 1554 return cp >= $.LATIN_CAPITAL_A && cp <= $.LATIN_CAPITAL_Z; 1555} 1556 1557function isAsciiLower(cp) { 1558 return cp >= $.LATIN_SMALL_A && cp <= $.LATIN_SMALL_Z; 1559} 1560 1561function isAsciiAlphaNumeric(cp) { 1562 return isAsciiDigit(cp) || isAsciiUpper(cp) || isAsciiLower(cp); 1563} 1564 1565function isDigit(cp, isHex) { 1566 return isAsciiDigit(cp) || (isHex && ((cp >= $.LATIN_CAPITAL_A && cp <= $.LATIN_CAPITAL_F) || 1567 (cp >= $.LATIN_SMALL_A && cp <= $.LATIN_SMALL_F))); 1568} 1569 1570function isReservedCodePoint(cp) { 1571 return cp >= 0xD800 && cp <= 0xDFFF || cp > 0x10FFFF; 1572} 1573 1574function toAsciiLowerCodePoint(cp) { 1575 return cp + 0x0020; 1576} 1577 1578//NOTE: String.fromCharCode() function can handle only characters from BMP subset. 1579//So, we need to workaround this manually. 1580//(see: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/fromCharCode#Getting_it_to_work_with_higher_values) 1581function toChar(cp) { 1582 if (cp <= 0xFFFF) 1583 return String.fromCharCode(cp); 1584 1585 cp -= 0x10000; 1586 return String.fromCharCode(cp >>> 10 & 0x3FF | 0xD800) + String.fromCharCode(0xDC00 | cp & 0x3FF); 1587} 1588 1589function toAsciiLowerChar(cp) { 1590 return String.fromCharCode(toAsciiLowerCodePoint(cp)); 1591} 1592 1593//Tokenizer 1594var Tokenizer = module.exports = function (html, options) { 1595 this.disableEntitiesDecoding = false; 1596 1597 this.preprocessor = new Preprocessor(html); 1598 1599 this.tokenQueue = []; 1600 1601 this.allowCDATA = false; 1602 1603 this.state = DATA_STATE; 1604 this.returnState = ''; 1605 1606 this.consumptionPos = 0; 1607 1608 this.tempBuff = []; 1609 this.additionalAllowedCp = void 0; 1610 this.lastStartTagName = ''; 1611 1612 this.currentCharacterToken = null; 1613 this.currentToken = null; 1614 this.currentAttr = null; 1615 1616 if (options) { 1617 this.disableEntitiesDecoding = !options.decodeHtmlEntities; 1618 1619 if (options.locationInfo) 1620 LocationInfoMixin.assign(this); 1621 } 1622}; 1623 1624//Token types 1625Tokenizer.CHARACTER_TOKEN = 'CHARACTER_TOKEN'; 1626Tokenizer.NULL_CHARACTER_TOKEN = 'NULL_CHARACTER_TOKEN'; 1627Tokenizer.WHITESPACE_CHARACTER_TOKEN = 'WHITESPACE_CHARACTER_TOKEN'; 1628Tokenizer.START_TAG_TOKEN = 'START_TAG_TOKEN'; 1629Tokenizer.END_TAG_TOKEN = 'END_TAG_TOKEN'; 1630Tokenizer.COMMENT_TOKEN = 'COMMENT_TOKEN'; 1631Tokenizer.DOCTYPE_TOKEN = 'DOCTYPE_TOKEN'; 1632Tokenizer.EOF_TOKEN = 'EOF_TOKEN'; 1633 1634//Tokenizer initial states for different modes 1635Tokenizer.MODE = Tokenizer.prototype.MODE = { 1636 DATA: DATA_STATE, 1637 RCDATA: RCDATA_STATE, 1638 RAWTEXT: RAWTEXT_STATE, 1639 SCRIPT_DATA: SCRIPT_DATA_STATE, 1640 PLAINTEXT: PLAINTEXT_STATE 1641}; 1642 1643//Static 1644Tokenizer.getTokenAttr = function (token, attrName) { 1645 for (var i = token.attrs.length - 1; i >= 0; i--) { 1646 if (token.attrs[i].name === attrName) 1647 return token.attrs[i].value; 1648 } 1649 1650 return null; 1651}; 1652 1653//Get token 1654Tokenizer.prototype.getNextToken = function () { 1655 while (!this.tokenQueue.length) 1656 this[this.state](this._consume()); 1657 1658 return this.tokenQueue.shift(); 1659}; 1660 1661//Consumption 1662Tokenizer.prototype._consume = function () { 1663 this.consumptionPos++; 1664 return this.preprocessor.advanceAndPeekCodePoint(); 1665}; 1666 1667Tokenizer.prototype._unconsume = function () { 1668 this.consumptionPos--; 1669 this.preprocessor.retreat(); 1670}; 1671 1672Tokenizer.prototype._unconsumeSeveral = function (count) { 1673 while (count--) 1674 this._unconsume(); 1675}; 1676 1677Tokenizer.prototype._reconsumeInState = function (state) { 1678 this.state = state; 1679 this._unconsume(); 1680}; 1681 1682Tokenizer.prototype._consumeSubsequentIfMatch = function (pattern, startCp, caseSensitive) { 1683 var rollbackPos = this.consumptionPos, 1684 isMatch = true, 1685 patternLength = pattern.length, 1686 patternPos = 0, 1687 cp = startCp, 1688 patternCp = void 0; 1689 1690 for (; patternPos < patternLength; patternPos++) { 1691 if (patternPos > 0) 1692 cp = this._consume(); 1693 1694 if (cp === $.EOF) { 1695 isMatch = false; 1696 break; 1697 } 1698 1699 patternCp = pattern[patternPos]; 1700 1701 if (cp !== patternCp && (caseSensitive || cp !== toAsciiLowerCodePoint(patternCp))) { 1702 isMatch = false; 1703 break; 1704 } 1705 } 1706 1707 if (!isMatch) 1708 this._unconsumeSeveral(this.consumptionPos - rollbackPos); 1709 1710 return isMatch; 1711}; 1712 1713//Lookahead 1714Tokenizer.prototype._lookahead = function () { 1715 var cp = this.preprocessor.advanceAndPeekCodePoint(); 1716 this.preprocessor.retreat(); 1717 1718 return cp; 1719}; 1720 1721//Temp buffer 1722Tokenizer.prototype.isTempBufferEqualToScriptString = function () { 1723 if (this.tempBuff.length !== $$.SCRIPT_STRING.length) 1724 return false; 1725 1726 for (var i = 0; i < this.tempBuff.length; i++) { 1727 if (this.tempBuff[i] !== $$.SCRIPT_STRING[i]) 1728 return false; 1729 } 1730 1731 return true; 1732}; 1733 1734//Token creation 1735Tokenizer.prototype.buildStartTagToken = function (tagName) { 1736 return { 1737 type: Tokenizer.START_TAG_TOKEN, 1738 tagName: tagName, 1739 selfClosing: false, 1740 attrs: [] 1741 }; 1742}; 1743 1744Tokenizer.prototype.buildEndTagToken = function (tagName) { 1745 return { 1746 type: Tokenizer.END_TAG_TOKEN, 1747 tagName: tagName, 1748 ignored: false, 1749 attrs: [] 1750 }; 1751}; 1752 1753Tokenizer.prototype._createStartTagToken = function (tagNameFirstCh) { 1754 this.currentToken = this.buildStartTagToken(tagNameFirstCh); 1755}; 1756 1757Tokenizer.prototype._createEndTagToken = function (tagNameFirstCh) { 1758 this.currentToken = this.buildEndTagToken(tagNameFirstCh); 1759}; 1760 1761Tokenizer.prototype._createCommentToken = function () { 1762 this.currentToken = { 1763 type: Tokenizer.COMMENT_TOKEN, 1764 data: '' 1765 }; 1766}; 1767 1768Tokenizer.prototype._createDoctypeToken = function (doctypeNameFirstCh) { 1769 this.currentToken = { 1770 type: Tokenizer.DOCTYPE_TOKEN, 1771 name: doctypeNameFirstCh || '', 1772 forceQuirks: false, 1773 publicId: null, 1774 systemId: null 1775 }; 1776}; 1777 1778Tokenizer.prototype._createCharacterToken = function (type, ch) { 1779 this.currentCharacterToken = { 1780 type: type, 1781 chars: ch 1782 }; 1783}; 1784 1785//Tag attributes 1786Tokenizer.prototype._createAttr = function (attrNameFirstCh) { 1787 this.currentAttr = { 1788 name: attrNameFirstCh, 1789 value: '' 1790 }; 1791}; 1792 1793Tokenizer.prototype._isDuplicateAttr = function () { 1794 return Tokenizer.getTokenAttr(this.currentToken, this.currentAttr.name) !== null; 1795}; 1796 1797Tokenizer.prototype._leaveAttrName = function (toState) { 1798 this.state = toState; 1799 1800 if (!this._isDuplicateAttr()) 1801 this.currentToken.attrs.push(this.currentAttr); 1802}; 1803 1804//Appropriate end tag token 1805//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#appropriate-end-tag-token) 1806Tokenizer.prototype._isAppropriateEndTagToken = function () { 1807 return this.lastStartTagName === this.currentToken.tagName; 1808}; 1809 1810//Token emission 1811Tokenizer.prototype._emitCurrentToken = function () { 1812 this._emitCurrentCharacterToken(); 1813 1814 //NOTE: store emited start tag's tagName to determine is the following end tag token is appropriate. 1815 if (this.currentToken.type === Tokenizer.START_TAG_TOKEN) 1816 this.lastStartTagName = this.currentToken.tagName; 1817 1818 this.tokenQueue.push(this.currentToken); 1819 this.currentToken = null; 1820}; 1821 1822Tokenizer.prototype._emitCurrentCharacterToken = function () { 1823 if (this.currentCharacterToken) { 1824 this.tokenQueue.push(this.currentCharacterToken); 1825 this.currentCharacterToken = null; 1826 } 1827}; 1828 1829Tokenizer.prototype._emitEOFToken = function () { 1830 this._emitCurrentCharacterToken(); 1831 this.tokenQueue.push({type: Tokenizer.EOF_TOKEN}); 1832}; 1833 1834//Characters emission 1835 1836//OPTIMIZATION: specification uses only one type of character tokens (one token per character). 1837//This causes a huge memory overhead and a lot of unnecessary parser loops. parse5 uses 3 groups of characters. 1838//If we have a sequence of characters that belong to the same group, parser can process it 1839//as a single solid character token. 1840//So, there are 3 types of character tokens in parse5: 1841//1)NULL_CHARACTER_TOKEN - \u0000-character sequences (e.g. '\u0000\u0000\u0000') 1842//2)WHITESPACE_CHARACTER_TOKEN - any whitespace/new-line character sequences (e.g. '\n \r\t \f') 1843//3)CHARACTER_TOKEN - any character sequence which don't belong to groups 1 and 2 (e.g. 'abcdef1234@@#$%^') 1844Tokenizer.prototype._appendCharToCurrentCharacterToken = function (type, ch) { 1845 if (this.currentCharacterToken && this.currentCharacterToken.type !== type) 1846 this._emitCurrentCharacterToken(); 1847 1848 if (this.currentCharacterToken) 1849 this.currentCharacterToken.chars += ch; 1850 1851 else 1852 this._createCharacterToken(type, ch); 1853}; 1854 1855Tokenizer.prototype._emitCodePoint = function (cp) { 1856 var type = Tokenizer.CHARACTER_TOKEN; 1857 1858 if (isWhitespace(cp)) 1859 type = Tokenizer.WHITESPACE_CHARACTER_TOKEN; 1860 1861 else if (cp === $.NULL) 1862 type = Tokenizer.NULL_CHARACTER_TOKEN; 1863 1864 this._appendCharToCurrentCharacterToken(type, toChar(cp)); 1865}; 1866 1867Tokenizer.prototype._emitSeveralCodePoints = function (codePoints) { 1868 for (var i = 0; i < codePoints.length; i++) 1869 this._emitCodePoint(codePoints[i]); 1870}; 1871 1872//NOTE: used then we emit character explicitly. This is always a non-whitespace and a non-null character. 1873//So we can avoid additional checks here. 1874Tokenizer.prototype._emitChar = function (ch) { 1875 this._appendCharToCurrentCharacterToken(Tokenizer.CHARACTER_TOKEN, ch); 1876}; 1877 1878//Character reference tokenization 1879Tokenizer.prototype._consumeNumericEntity = function (isHex) { 1880 var digits = '', 1881 nextCp = void 0; 1882 1883 do { 1884 digits += toChar(this._consume()); 1885 nextCp = this._lookahead(); 1886 } while (nextCp !== $.EOF && isDigit(nextCp, isHex)); 1887 1888 if (this._lookahead() === $.SEMICOLON) 1889 this._consume(); 1890 1891 var referencedCp = parseInt(digits, isHex ? 16 : 10), 1892 replacement = NUMERIC_ENTITY_REPLACEMENTS[referencedCp]; 1893 1894 if (replacement) 1895 return replacement; 1896 1897 if (isReservedCodePoint(referencedCp)) 1898 return $.REPLACEMENT_CHARACTER; 1899 1900 return referencedCp; 1901}; 1902 1903Tokenizer.prototype._consumeNamedEntity = function (startCp, inAttr) { 1904 var referencedCodePoints = null, 1905 entityCodePointsCount = 0, 1906 cp = startCp, 1907 leaf = NAMED_ENTITY_TRIE[cp], 1908 consumedCount = 1, 1909 semicolonTerminated = false; 1910 1911 for (; leaf && cp !== $.EOF; cp = this._consume(), consumedCount++, leaf = leaf.l && leaf.l[cp]) { 1912 if (leaf.c) { 1913 //NOTE: we have at least one named reference match. But we don't stop lookup at this point, 1914 //because longer matches still can be found (e.g. '¬' and '∉') except the case 1915 //then found match is terminated by semicolon. 1916 referencedCodePoints = leaf.c; 1917 entityCodePointsCount = consumedCount; 1918 1919 if (cp === $.SEMICOLON) { 1920 semicolonTerminated = true; 1921 break; 1922 } 1923 } 1924 } 1925 1926 if (referencedCodePoints) { 1927 if (!semicolonTerminated) { 1928 //NOTE: unconsume excess (e.g. 'it' in '¬it') 1929 this._unconsumeSeveral(consumedCount - entityCodePointsCount); 1930 1931 //NOTE: If the character reference is being consumed as part of an attribute and the next character 1932 //is either a U+003D EQUALS SIGN character (=) or an alphanumeric ASCII character, then, for historical 1933 //reasons, all the characters that were matched after the U+0026 AMPERSAND character (&) must be 1934 //unconsumed, and nothing is returned. 1935 //However, if this next character is in fact a U+003D EQUALS SIGN character (=), then this is a 1936 //parse error, because some legacy user agents will misinterpret the markup in those cases. 1937 //(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#tokenizing-character-references) 1938 if (inAttr) { 1939 var nextCp = this._lookahead(); 1940 1941 if (nextCp === $.EQUALS_SIGN || isAsciiAlphaNumeric(nextCp)) { 1942 this._unconsumeSeveral(entityCodePointsCount); 1943 return null; 1944 } 1945 } 1946 } 1947 1948 return referencedCodePoints; 1949 } 1950 1951 this._unconsumeSeveral(consumedCount); 1952 1953 return null; 1954}; 1955 1956Tokenizer.prototype._consumeCharacterReference = function (startCp, inAttr) { 1957 if (this.disableEntitiesDecoding || isWhitespace(startCp) || startCp === $.GREATER_THAN_SIGN || 1958 startCp === $.AMPERSAND || startCp === this.additionalAllowedCp || startCp === $.EOF) { 1959 //NOTE: not a character reference. No characters are consumed, and nothing is returned. 1960 this._unconsume(); 1961 return null; 1962 } 1963 1964 else if (startCp === $.NUMBER_SIGN) { 1965 //NOTE: we have a numeric entity candidate, now we should determine if it's hex or decimal 1966 var isHex = false, 1967 nextCp = this._lookahead(); 1968 1969 if (nextCp === $.LATIN_SMALL_X || nextCp === $.LATIN_CAPITAL_X) { 1970 this._consume(); 1971 isHex = true; 1972 } 1973 1974 nextCp = this._lookahead(); 1975 1976 //NOTE: if we have at least one digit this is a numeric entity for sure, so we consume it 1977 if (nextCp !== $.EOF && isDigit(nextCp, isHex)) 1978 return [this._consumeNumericEntity(isHex)]; 1979 1980 else { 1981 //NOTE: otherwise this is a bogus number entity and a parse error. Unconsume the number sign 1982 //and the 'x'-character if appropriate. 1983 this._unconsumeSeveral(isHex ? 2 : 1); 1984 return null; 1985 } 1986 } 1987 1988 else 1989 return this._consumeNamedEntity(startCp, inAttr); 1990}; 1991 1992//State machine 1993var _ = Tokenizer.prototype; 1994 1995//12.2.4.1 Data state 1996//------------------------------------------------------------------ 1997_[DATA_STATE] = function dataState(cp) { 1998 if (cp === $.AMPERSAND) 1999 this.state = CHARACTER_REFERENCE_IN_DATA_STATE; 2000 2001 else if (cp === $.LESS_THAN_SIGN) 2002 this.state = TAG_OPEN_STATE; 2003 2004 else if (cp === $.NULL) 2005 this._emitCodePoint(cp); 2006 2007 else if (cp === $.EOF) 2008 this._emitEOFToken(); 2009 2010 else 2011 this._emitCodePoint(cp); 2012}; 2013 2014 2015//12.2.4.2 Character reference in data state 2016//------------------------------------------------------------------ 2017_[CHARACTER_REFERENCE_IN_DATA_STATE] = function characterReferenceInDataState(cp) { 2018 this.state = DATA_STATE; 2019 this.additionalAllowedCp = void 0; 2020 2021 var referencedCodePoints = this._consumeCharacterReference(cp, false); 2022 2023 if (referencedCodePoints) 2024 this._emitSeveralCodePoints(referencedCodePoints); 2025 else 2026 this._emitChar('&'); 2027}; 2028 2029 2030//12.2.4.3 RCDATA state 2031//------------------------------------------------------------------ 2032_[RCDATA_STATE] = function rcdataState(cp) { 2033 if (cp === $.AMPERSAND) 2034 this.state = CHARACTER_REFERENCE_IN_RCDATA_STATE; 2035 2036 else if (cp === $.LESS_THAN_SIGN) 2037 this.state = RCDATA_LESS_THAN_SIGN_STATE; 2038 2039 else if (cp === $.NULL) 2040 this._emitChar(UNICODE.REPLACEMENT_CHARACTER); 2041 2042 else if (cp === $.EOF) 2043 this._emitEOFToken(); 2044 2045 else 2046 this._emitCodePoint(cp); 2047}; 2048 2049 2050//12.2.4.4 Character reference in RCDATA state 2051//------------------------------------------------------------------ 2052_[CHARACTER_REFERENCE_IN_RCDATA_STATE] = function characterReferenceInRcdataState(cp) { 2053 this.state = RCDATA_STATE; 2054 this.additionalAllowedCp = void 0; 2055 2056 var referencedCodePoints = this._consumeCharacterReference(cp, false); 2057 2058 if (referencedCodePoints) 2059 this._emitSeveralCodePoints(referencedCodePoints); 2060 else 2061 this._emitChar('&'); 2062}; 2063 2064 2065//12.2.4.5 RAWTEXT state 2066//------------------------------------------------------------------ 2067_[RAWTEXT_STATE] = function rawtextState(cp) { 2068 if (cp === $.LESS_THAN_SIGN) 2069 this.state = RAWTEXT_LESS_THAN_SIGN_STATE; 2070 2071 else if (cp === $.NULL) 2072 this._emitChar(UNICODE.REPLACEMENT_CHARACTER); 2073 2074 else if (cp === $.EOF) 2075 this._emitEOFToken(); 2076 2077 else 2078 this._emitCodePoint(cp); 2079}; 2080 2081 2082//12.2.4.6 Script data state 2083//------------------------------------------------------------------ 2084_[SCRIPT_DATA_STATE] = function scriptDataState(cp) { 2085 if (cp === $.LESS_THAN_SIGN) 2086 this.state = SCRIPT_DATA_LESS_THAN_SIGN_STATE; 2087 2088 else if (cp === $.NULL) 2089 this._emitChar(UNICODE.REPLACEMENT_CHARACTER); 2090 2091 else if (cp === $.EOF) 2092 this._emitEOFToken(); 2093 2094 else 2095 this._emitCodePoint(cp); 2096}; 2097 2098 2099//12.2.4.7 PLAINTEXT state 2100//------------------------------------------------------------------ 2101_[PLAINTEXT_STATE] = function plaintextState(cp) { 2102 if (cp === $.NULL) 2103 this._emitChar(UNICODE.REPLACEMENT_CHARACTER); 2104 2105 else if (cp === $.EOF) 2106 this._emitEOFToken(); 2107 2108 else 2109 this._emitCodePoint(cp); 2110}; 2111 2112 2113//12.2.4.8 Tag open state 2114//------------------------------------------------------------------ 2115_[TAG_OPEN_STATE] = function tagOpenState(cp) { 2116 if (cp === $.EXCLAMATION_MARK) 2117 this.state = MARKUP_DECLARATION_OPEN_STATE; 2118 2119 else if (cp === $.SOLIDUS) 2120 this.state = END_TAG_OPEN_STATE; 2121 2122 else if (isAsciiUpper(cp)) { 2123 this._createStartTagToken(toAsciiLowerChar(cp)); 2124 this.state = TAG_NAME_STATE; 2125 } 2126 2127 else if (isAsciiLower(cp)) { 2128 this._createStartTagToken(toChar(cp)); 2129 this.state = TAG_NAME_STATE; 2130 } 2131 2132 else if (cp === $.QUESTION_MARK) { 2133 //NOTE: call bogus comment state directly with current consumed character to avoid unnecessary reconsumption. 2134 this[BOGUS_COMMENT_STATE](cp); 2135 } 2136 2137 else { 2138 this._emitChar('<'); 2139 this._reconsumeInState(DATA_STATE); 2140 } 2141}; 2142 2143 2144//12.2.4.9 End tag open state 2145//------------------------------------------------------------------ 2146_[END_TAG_OPEN_STATE] = function endTagOpenState(cp) { 2147 if (isAsciiUpper(cp)) { 2148 this._createEndTagToken(toAsciiLowerChar(cp)); 2149 this.state = TAG_NAME_STATE; 2150 } 2151 2152 else if (isAsciiLower(cp)) { 2153 this._createEndTagToken(toChar(cp)); 2154 this.state = TAG_NAME_STATE; 2155 } 2156 2157 else if (cp === $.GREATER_THAN_SIGN) 2158 this.state = DATA_STATE; 2159 2160 else if (cp === $.EOF) { 2161 this._reconsumeInState(DATA_STATE); 2162 this._emitChar('<'); 2163 this._emitChar('/'); 2164 } 2165 2166 else { 2167 //NOTE: call bogus comment state directly with current consumed character to avoid unnecessary reconsumption. 2168 this[BOGUS_COMMENT_STATE](cp); 2169 } 2170}; 2171 2172 2173//12.2.4.10 Tag name state 2174//------------------------------------------------------------------ 2175_[TAG_NAME_STATE] = function tagNameState(cp) { 2176 if (isWhitespace(cp)) 2177 this.state = BEFORE_ATTRIBUTE_NAME_STATE; 2178 2179 else if (cp === $.SOLIDUS) 2180 this.state = SELF_CLOSING_START_TAG_STATE; 2181 2182 else if (cp === $.GREATER_THAN_SIGN) { 2183 this.state = DATA_STATE; 2184 this._emitCurrentToken(); 2185 } 2186 2187 else if (isAsciiUpper(cp)) 2188 this.currentToken.tagName += toAsciiLowerChar(cp); 2189 2190 else if (cp === $.NULL) 2191 this.currentToken.tagName += UNICODE.REPLACEMENT_CHARACTER; 2192 2193 else if (cp === $.EOF) 2194 this._reconsumeInState(DATA_STATE); 2195 2196 else 2197 this.currentToken.tagName += toChar(cp); 2198}; 2199 2200 2201//12.2.4.11 RCDATA less-than sign state 2202//------------------------------------------------------------------ 2203_[RCDATA_LESS_THAN_SIGN_STATE] = function rcdataLessThanSignState(cp) { 2204 if (cp === $.SOLIDUS) { 2205 this.tempBuff = []; 2206 this.state = RCDATA_END_TAG_OPEN_STATE; 2207 } 2208 2209 else { 2210 this._emitChar('<'); 2211 this._reconsumeInState(RCDATA_STATE); 2212 } 2213}; 2214 2215 2216//12.2.4.12 RCDATA end tag open state 2217//------------------------------------------------------------------ 2218_[RCDATA_END_TAG_OPEN_STATE] = function rcdataEndTagOpenState(cp) { 2219 if (isAsciiUpper(cp)) { 2220 this._createEndTagToken(toAsciiLowerChar(cp)); 2221 this.tempBuff.push(cp); 2222 this.state = RCDATA_END_TAG_NAME_STATE; 2223 } 2224 2225 else if (isAsciiLower(cp)) { 2226 this._createEndTagToken(toChar(cp)); 2227 this.tempBuff.push(cp); 2228 this.state = RCDATA_END_TAG_NAME_STATE; 2229 } 2230 2231 else { 2232 this._emitChar('<'); 2233 this._emitChar('/'); 2234 this._reconsumeInState(RCDATA_STATE); 2235 } 2236}; 2237 2238 2239//12.2.4.13 RCDATA end tag name state 2240//------------------------------------------------------------------ 2241_[RCDATA_END_TAG_NAME_STATE] = function rcdataEndTagNameState(cp) { 2242 if (isAsciiUpper(cp)) { 2243 this.currentToken.tagName += toAsciiLowerChar(cp); 2244 this.tempBuff.push(cp); 2245 } 2246 2247 else if (isAsciiLower(cp)) { 2248 this.currentToken.tagName += toChar(cp); 2249 this.tempBuff.push(cp); 2250 } 2251 2252 else { 2253 if (this._isAppropriateEndTagToken()) { 2254 if (isWhitespace(cp)) { 2255 this.state = BEFORE_ATTRIBUTE_NAME_STATE; 2256 return; 2257 } 2258 2259 if (cp === $.SOLIDUS) { 2260 this.state = SELF_CLOSING_START_TAG_STATE; 2261 return; 2262 } 2263 2264 if (cp === $.GREATER_THAN_SIGN) { 2265 this.state = DATA_STATE; 2266 this._emitCurrentToken(); 2267 return; 2268 } 2269 } 2270 2271 this._emitChar('<'); 2272 this._emitChar('/'); 2273 this._emitSeveralCodePoints(this.tempBuff); 2274 this._reconsumeInState(RCDATA_STATE); 2275 } 2276}; 2277 2278 2279//12.2.4.14 RAWTEXT less-than sign state 2280//------------------------------------------------------------------ 2281_[RAWTEXT_LESS_THAN_SIGN_STATE] = function rawtextLessThanSignState(cp) { 2282 if (cp === $.SOLIDUS) { 2283 this.tempBuff = []; 2284 this.state = RAWTEXT_END_TAG_OPEN_STATE; 2285 } 2286 2287 else { 2288 this._emitChar('<'); 2289 this._reconsumeInState(RAWTEXT_STATE); 2290 } 2291}; 2292 2293 2294//12.2.4.15 RAWTEXT end tag open state 2295//------------------------------------------------------------------ 2296_[RAWTEXT_END_TAG_OPEN_STATE] = function rawtextEndTagOpenState(cp) { 2297 if (isAsciiUpper(cp)) { 2298 this._createEndTagToken(toAsciiLowerChar(cp)); 2299 this.tempBuff.push(cp); 2300 this.state = RAWTEXT_END_TAG_NAME_STATE; 2301 } 2302 2303 else if (isAsciiLower(cp)) { 2304 this._createEndTagToken(toChar(cp)); 2305 this.tempBuff.push(cp); 2306 this.state = RAWTEXT_END_TAG_NAME_STATE; 2307 } 2308 2309 else { 2310 this._emitChar('<'); 2311 this._emitChar('/'); 2312 this._reconsumeInState(RAWTEXT_STATE); 2313 } 2314}; 2315 2316 2317//12.2.4.16 RAWTEXT end tag name state 2318//------------------------------------------------------------------ 2319_[RAWTEXT_END_TAG_NAME_STATE] = function rawtextEndTagNameState(cp) { 2320 if (isAsciiUpper(cp)) { 2321 this.currentToken.tagName += toAsciiLowerChar(cp); 2322 this.tempBuff.push(cp); 2323 } 2324 2325 else if (isAsciiLower(cp)) { 2326 this.currentToken.tagName += toChar(cp); 2327 this.tempBuff.push(cp); 2328 } 2329 2330 else { 2331 if (this._isAppropriateEndTagToken()) { 2332 if (isWhitespace(cp)) { 2333 this.state = BEFORE_ATTRIBUTE_NAME_STATE; 2334 return; 2335 } 2336 2337 if (cp === $.SOLIDUS) { 2338 this.state = SELF_CLOSING_START_TAG_STATE; 2339 return; 2340 } 2341 2342 if (cp === $.GREATER_THAN_SIGN) { 2343 this._emitCurrentToken(); 2344 this.state = DATA_STATE; 2345 return; 2346 } 2347 } 2348 2349 this._emitChar('<'); 2350 this._emitChar('/'); 2351 this._emitSeveralCodePoints(this.tempBuff); 2352 this._reconsumeInState(RAWTEXT_STATE); 2353 } 2354}; 2355 2356 2357//12.2.4.17 Script data less-than sign state 2358//------------------------------------------------------------------ 2359_[SCRIPT_DATA_LESS_THAN_SIGN_STATE] = function scriptDataLessThanSignState(cp) { 2360 if (cp === $.SOLIDUS) { 2361 this.tempBuff = []; 2362 this.state = SCRIPT_DATA_END_TAG_OPEN_STATE; 2363 } 2364 2365 else if (cp === $.EXCLAMATION_MARK) { 2366 this.state = SCRIPT_DATA_ESCAPE_START_STATE; 2367 this._emitChar('<'); 2368 this._emitChar('!'); 2369 } 2370 2371 else { 2372 this._emitChar('<'); 2373 this._reconsumeInState(SCRIPT_DATA_STATE); 2374 } 2375}; 2376 2377 2378//12.2.4.18 Script data end tag open state 2379//------------------------------------------------------------------ 2380_[SCRIPT_DATA_END_TAG_OPEN_STATE] = function scriptDataEndTagOpenState(cp) { 2381 if (isAsciiUpper(cp)) { 2382 this._createEndTagToken(toAsciiLowerChar(cp)); 2383 this.tempBuff.push(cp); 2384 this.state = SCRIPT_DATA_END_TAG_NAME_STATE; 2385 } 2386 2387 else if (isAsciiLower(cp)) { 2388 this._createEndTagToken(toChar(cp)); 2389 this.tempBuff.push(cp); 2390 this.state = SCRIPT_DATA_END_TAG_NAME_STATE; 2391 } 2392 2393 else { 2394 this._emitChar('<'); 2395 this._emitChar('/'); 2396 this._reconsumeInState(SCRIPT_DATA_STATE); 2397 } 2398}; 2399 2400 2401//12.2.4.19 Script data end tag name state 2402//------------------------------------------------------------------ 2403_[SCRIPT_DATA_END_TAG_NAME_STATE] = function scriptDataEndTagNameState(cp) { 2404 if (isAsciiUpper(cp)) { 2405 this.currentToken.tagName += toAsciiLowerChar(cp); 2406 this.tempBuff.push(cp); 2407 } 2408 2409 else if (isAsciiLower(cp)) { 2410 this.currentToken.tagName += toChar(cp); 2411 this.tempBuff.push(cp); 2412 } 2413 2414 else { 2415 if (this._isAppropriateEndTagToken()) { 2416 if (isWhitespace(cp)) { 2417 this.state = BEFORE_ATTRIBUTE_NAME_STATE; 2418 return; 2419 } 2420 2421 else if (cp === $.SOLIDUS) { 2422 this.state = SELF_CLOSING_START_TAG_STATE; 2423 return; 2424 } 2425 2426 else if (cp === $.GREATER_THAN_SIGN) { 2427 this._emitCurrentToken(); 2428 this.state = DATA_STATE; 2429 return; 2430 } 2431 } 2432 2433 this._emitChar('<'); 2434 this._emitChar('/'); 2435 this._emitSeveralCodePoints(this.tempBuff); 2436 this._reconsumeInState(SCRIPT_DATA_STATE); 2437 } 2438}; 2439 2440 2441//12.2.4.20 Script data escape start state 2442//------------------------------------------------------------------ 2443_[SCRIPT_DATA_ESCAPE_START_STATE] = function scriptDataEscapeStartState(cp) { 2444 if (cp === $.HYPHEN_MINUS) { 2445 this.state = SCRIPT_DATA_ESCAPE_START_DASH_STATE; 2446 this._emitChar('-'); 2447 } 2448 2449 else 2450 this._reconsumeInState(SCRIPT_DATA_STATE); 2451}; 2452 2453 2454//12.2.4.21 Script data escape start dash state 2455//------------------------------------------------------------------ 2456_[SCRIPT_DATA_ESCAPE_START_DASH_STATE] = function scriptDataEscapeStartDashState(cp) { 2457 if (cp === $.HYPHEN_MINUS) { 2458 this.state = SCRIPT_DATA_ESCAPED_DASH_DASH_STATE; 2459 this._emitChar('-'); 2460 } 2461 2462 else 2463 this._reconsumeInState(SCRIPT_DATA_STATE); 2464}; 2465 2466 2467//12.2.4.22 Script data escaped state 2468//------------------------------------------------------------------ 2469_[SCRIPT_DATA_ESCAPED_STATE] = function scriptDataEscapedState(cp) { 2470 if (cp === $.HYPHEN_MINUS) { 2471 this.state = SCRIPT_DATA_ESCAPED_DASH_STATE; 2472 this._emitChar('-'); 2473 } 2474 2475 else if (cp === $.LESS_THAN_SIGN) 2476 this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE; 2477 2478 else if (cp === $.NULL) 2479 this._emitChar(UNICODE.REPLACEMENT_CHARACTER); 2480 2481 else if (cp === $.EOF) 2482 this._reconsumeInState(DATA_STATE); 2483 2484 else 2485 this._emitCodePoint(cp); 2486}; 2487 2488 2489//12.2.4.23 Script data escaped dash state 2490//------------------------------------------------------------------ 2491_[SCRIPT_DATA_ESCAPED_DASH_STATE] = function scriptDataEscapedDashState(cp) { 2492 if (cp === $.HYPHEN_MINUS) { 2493 this.state = SCRIPT_DATA_ESCAPED_DASH_DASH_STATE; 2494 this._emitChar('-'); 2495 } 2496 2497 else if (cp === $.LESS_THAN_SIGN) 2498 this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE; 2499 2500 else if (cp === $.NULL) { 2501 this.state = SCRIPT_DATA_ESCAPED_STATE; 2502 this._emitChar(UNICODE.REPLACEMENT_CHARACTER); 2503 } 2504 2505 else if (cp === $.EOF) 2506 this._reconsumeInState(DATA_STATE); 2507 2508 else { 2509 this.state = SCRIPT_DATA_ESCAPED_STATE; 2510 this._emitCodePoint(cp); 2511 } 2512}; 2513 2514 2515//12.2.4.24 Script data escaped dash dash state 2516//------------------------------------------------------------------ 2517_[SCRIPT_DATA_ESCAPED_DASH_DASH_STATE] = function scriptDataEscapedDashDashState(cp) { 2518 if (cp === $.HYPHEN_MINUS) 2519 this._emitChar('-'); 2520 2521 else if (cp === $.LESS_THAN_SIGN) 2522 this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE; 2523 2524 else if (cp === $.GREATER_THAN_SIGN) { 2525 this.state = SCRIPT_DATA_STATE; 2526 this._emitChar('>'); 2527 } 2528 2529 else if (cp === $.NULL) { 2530 this.state = SCRIPT_DATA_ESCAPED_STATE; 2531 this._emitChar(UNICODE.REPLACEMENT_CHARACTER); 2532 } 2533 2534 else if (cp === $.EOF) 2535 this._reconsumeInState(DATA_STATE); 2536 2537 else { 2538 this.state = SCRIPT_DATA_ESCAPED_STATE; 2539 this._emitCodePoint(cp); 2540 } 2541}; 2542 2543 2544//12.2.4.25 Script data escaped less-than sign state 2545//------------------------------------------------------------------ 2546_[SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE] = function scriptDataEscapedLessThanSignState(cp) { 2547 if (cp === $.SOLIDUS) { 2548 this.tempBuff = []; 2549 this.state = SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE; 2550 } 2551 2552 else if (isAsciiUpper(cp)) { 2553 this.tempBuff = []; 2554 this.tempBuff.push(toAsciiLowerCodePoint(cp)); 2555 this.state = SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE; 2556 this._emitChar('<'); 2557 this._emitCodePoint(cp); 2558 } 2559 2560 else if (isAsciiLower(cp)) { 2561 this.tempBuff = []; 2562 this.tempBuff.push(cp); 2563 this.state = SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE; 2564 this._emitChar('<'); 2565 this._emitCodePoint(cp); 2566 } 2567 2568 else { 2569 this._emitChar('<'); 2570 this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE); 2571 } 2572}; 2573 2574 2575//12.2.4.26 Script data escaped end tag open state 2576//------------------------------------------------------------------ 2577_[SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE] = function scriptDataEscapedEndTagOpenState(cp) { 2578 if (isAsciiUpper(cp)) { 2579 this._createEndTagToken(toAsciiLowerChar(cp)); 2580 this.tempBuff.push(cp); 2581 this.state = SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE; 2582 } 2583 2584 else if (isAsciiLower(cp)) { 2585 this._createEndTagToken(toChar(cp)); 2586 this.tempBuff.push(cp); 2587 this.state = SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE; 2588 } 2589 2590 else { 2591 this._emitChar('<'); 2592 this._emitChar('/'); 2593 this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE); 2594 } 2595}; 2596 2597 2598//12.2.4.27 Script data escaped end tag name state 2599//------------------------------------------------------------------ 2600_[SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE] = function scriptDataEscapedEndTagNameState(cp) { 2601 if (isAsciiUpper(cp)) { 2602 this.currentToken.tagName += toAsciiLowerChar(cp); 2603 this.tempBuff.push(cp); 2604 } 2605 2606 else if (isAsciiLower(cp)) { 2607 this.currentToken.tagName += toChar(cp); 2608 this.tempBuff.push(cp); 2609 } 2610 2611 else { 2612 if (this._isAppropriateEndTagToken()) { 2613 if (isWhitespace(cp)) { 2614 this.state = BEFORE_ATTRIBUTE_NAME_STATE; 2615 return; 2616 } 2617 2618 if (cp === $.SOLIDUS) { 2619 this.state = SELF_CLOSING_START_TAG_STATE; 2620 return; 2621 } 2622 2623 if (cp === $.GREATER_THAN_SIGN) { 2624 this._emitCurrentToken(); 2625 this.state = DATA_STATE; 2626 return; 2627 } 2628 } 2629 2630 this._emitChar('<'); 2631 this._emitChar('/'); 2632 this._emitSeveralCodePoints(this.tempBuff); 2633 this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE); 2634 } 2635}; 2636 2637 2638//12.2.4.28 Script data double escape start state 2639//------------------------------------------------------------------ 2640_[SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE] = function scriptDataDoubleEscapeStartState(cp) { 2641 if (isWhitespace(cp) || cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN) { 2642 this.state = this.isTempBufferEqualToScriptString() ? SCRIPT_DATA_DOUBLE_ESCAPED_STATE : SCRIPT_DATA_ESCAPED_STATE; 2643 this._emitCodePoint(cp); 2644 } 2645 2646 else if (isAsciiUpper(cp)) { 2647 this.tempBuff.push(toAsciiLowerCodePoint(cp)); 2648 this._emitCodePoint(cp); 2649 } 2650 2651 else if (isAsciiLower(cp)) { 2652 this.tempBuff.push(cp); 2653 this._emitCodePoint(cp); 2654 } 2655 2656 else 2657 this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE); 2658}; 2659 2660 2661//12.2.4.29 Script data double escaped state 2662//------------------------------------------------------------------ 2663_[SCRIPT_DATA_DOUBLE_ESCAPED_STATE] = function scriptDataDoubleEscapedState(cp) { 2664 if (cp === $.HYPHEN_MINUS) { 2665 this.state = SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE; 2666 this._emitChar('-'); 2667 } 2668 2669 else if (cp === $.LESS_THAN_SIGN) { 2670 this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE; 2671 this._emitChar('<'); 2672 } 2673 2674 else if (cp === $.NULL) 2675 this._emitChar(UNICODE.REPLACEMENT_CHARACTER); 2676 2677 else if (cp === $.EOF) 2678 this._reconsumeInState(DATA_STATE); 2679 2680 else 2681 this._emitCodePoint(cp); 2682}; 2683 2684 2685//12.2.4.30 Script data double escaped dash state 2686//------------------------------------------------------------------ 2687_[SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE] = function scriptDataDoubleEscapedDashState(cp) { 2688 if (cp === $.HYPHEN_MINUS) { 2689 this.state = SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE; 2690 this._emitChar('-'); 2691 } 2692 2693 else if (cp === $.LESS_THAN_SIGN) { 2694 this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE; 2695 this._emitChar('<'); 2696 } 2697 2698 else if (cp === $.NULL) { 2699 this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE; 2700 this._emitChar(UNICODE.REPLACEMENT_CHARACTER); 2701 } 2702 2703 else if (cp === $.EOF) 2704 this._reconsumeInState(DATA_STATE); 2705 2706 else { 2707 this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE; 2708 this._emitCodePoint(cp); 2709 } 2710}; 2711 2712 2713//12.2.4.31 Script data double escaped dash dash state 2714//------------------------------------------------------------------ 2715_[SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE] = function scriptDataDoubleEscapedDashDashState(cp) { 2716 if (cp === $.HYPHEN_MINUS) 2717 this._emitChar('-'); 2718 2719 else if (cp === $.LESS_THAN_SIGN) { 2720 this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE; 2721 this._emitChar('<'); 2722 } 2723 2724 else if (cp === $.GREATER_THAN_SIGN) { 2725 this.state = SCRIPT_DATA_STATE; 2726 this._emitChar('>'); 2727 } 2728 2729 else if (cp === $.NULL) { 2730 this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE; 2731 this._emitChar(UNICODE.REPLACEMENT_CHARACTER); 2732 } 2733 2734 else if (cp === $.EOF) 2735 this._reconsumeInState(DATA_STATE); 2736 2737 else { 2738 this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE; 2739 this._emitCodePoint(cp); 2740 } 2741}; 2742 2743 2744//12.2.4.32 Script data double escaped less-than sign state 2745//------------------------------------------------------------------ 2746_[SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE] = function scriptDataDoubleEscapedLessThanSignState(cp) { 2747 if (cp === $.SOLIDUS) { 2748 this.tempBuff = []; 2749 this.state = SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE; 2750 this._emitChar('/'); 2751 } 2752 2753 else 2754 this._reconsumeInState(SCRIPT_DATA_DOUBLE_ESCAPED_STATE); 2755}; 2756 2757 2758//12.2.4.33 Script data double escape end state 2759//------------------------------------------------------------------ 2760_[SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE] = function scriptDataDoubleEscapeEndState(cp) { 2761 if (isWhitespace(cp) || cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN) { 2762 this.state = this.isTempBufferEqualToScriptString() ? SCRIPT_DATA_ESCAPED_STATE : SCRIPT_DATA_DOUBLE_ESCAPED_STATE; 2763 2764 this._emitCodePoint(cp); 2765 } 2766 2767 else if (isAsciiUpper(cp)) { 2768 this.tempBuff.push(toAsciiLowerCodePoint(cp)); 2769 this._emitCodePoint(cp); 2770 } 2771 2772 else if (isAsciiLower(cp)) { 2773 this.tempBuff.push(cp); 2774 this._emitCodePoint(cp); 2775 } 2776 2777 else 2778 this._reconsumeInState(SCRIPT_DATA_DOUBLE_ESCAPED_STATE); 2779}; 2780 2781 2782//12.2.4.34 Before attribute name state 2783//------------------------------------------------------------------ 2784_[BEFORE_ATTRIBUTE_NAME_STATE] = function beforeAttributeNameState(cp) { 2785 if (isWhitespace(cp)) 2786 return; 2787 2788 if (cp === $.SOLIDUS) 2789 this.state = SELF_CLOSING_START_TAG_STATE; 2790 2791 else if (cp === $.GREATER_THAN_SIGN) { 2792 this.state = DATA_STATE; 2793 this._emitCurrentToken(); 2794 } 2795 2796 else if (isAsciiUpper(cp)) { 2797 this._createAttr(toAsciiLowerChar(cp)); 2798 this.state = ATTRIBUTE_NAME_STATE; 2799 } 2800 2801 else if (cp === $.NULL) { 2802 this._createAttr(UNICODE.REPLACEMENT_CHARACTER); 2803 this.state = ATTRIBUTE_NAME_STATE; 2804 } 2805 2806 else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN || cp === $.EQUALS_SIGN) { 2807 this._createAttr(toChar(cp)); 2808 this.state = ATTRIBUTE_NAME_STATE; 2809 } 2810 2811 else if (cp === $.EOF) 2812 this._reconsumeInState(DATA_STATE); 2813 2814 else { 2815 this._createAttr(toChar(cp)); 2816 this.state = ATTRIBUTE_NAME_STATE; 2817 } 2818}; 2819 2820 2821//12.2.4.35 Attribute name state 2822//------------------------------------------------------------------ 2823_[ATTRIBUTE_NAME_STATE] = function attributeNameState(cp) { 2824 if (isWhitespace(cp)) 2825 this._leaveAttrName(AFTER_ATTRIBUTE_NAME_STATE); 2826 2827 else if (cp === $.SOLIDUS) 2828 this._leaveAttrName(SELF_CLOSING_START_TAG_STATE); 2829 2830 else if (cp === $.EQUALS_SIGN) 2831 this._leaveAttrName(BEFORE_ATTRIBUTE_VALUE_STATE); 2832 2833 else if (cp === $.GREATER_THAN_SIGN) { 2834 this._leaveAttrName(DATA_STATE); 2835 this._emitCurrentToken(); 2836 } 2837 2838 else if (isAsciiUpper(cp)) 2839 this.currentAttr.name += toAsciiLowerChar(cp); 2840 2841 else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN) 2842 this.currentAttr.name += toChar(cp); 2843 2844 else if (cp === $.NULL) 2845 this.currentAttr.name += UNICODE.REPLACEMENT_CHARACTER; 2846 2847 else if (cp === $.EOF) 2848 this._reconsumeInState(DATA_STATE); 2849 2850 else 2851 this.currentAttr.name += toChar(cp); 2852}; 2853 2854 2855//12.2.4.36 After attribute name state 2856//------------------------------------------------------------------ 2857_[AFTER_ATTRIBUTE_NAME_STATE] = function afterAttributeNameState(cp) { 2858 if (isWhitespace(cp)) 2859 return; 2860 2861 if (cp === $.SOLIDUS) 2862 this.state = SELF_CLOSING_START_TAG_STATE; 2863 2864 else if (cp === $.EQUALS_SIGN) 2865 this.state = BEFORE_ATTRIBUTE_VALUE_STATE; 2866 2867 else if (cp === $.GREATER_THAN_SIGN) { 2868 this.state = DATA_STATE; 2869 this._emitCurrentToken(); 2870 } 2871 2872 else if (isAsciiUpper(cp)) { 2873 this._createAttr(toAsciiLowerChar(cp)); 2874 this.state = ATTRIBUTE_NAME_STATE; 2875 } 2876 2877 else if (cp === $.NULL) { 2878 this._createAttr(UNICODE.REPLACEMENT_CHARACTER); 2879 this.state = ATTRIBUTE_NAME_STATE; 2880 } 2881 2882 else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN) { 2883 this._createAttr(toChar(cp)); 2884 this.state = ATTRIBUTE_NAME_STATE; 2885 } 2886 2887 else if (cp === $.EOF) 2888 this._reconsumeInState(DATA_STATE); 2889 2890 else { 2891 this._createAttr(toChar(cp)); 2892 this.state = ATTRIBUTE_NAME_STATE; 2893 } 2894}; 2895 2896 2897//12.2.4.37 Before attribute value state 2898//------------------------------------------------------------------ 2899_[BEFORE_ATTRIBUTE_VALUE_STATE] = function beforeAttributeValueState(cp) { 2900 if (isWhitespace(cp)) 2901 return; 2902 2903 if (cp === $.QUOTATION_MARK) 2904 this.state = ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE; 2905 2906 else if (cp === $.AMPERSAND) 2907 this._reconsumeInState(ATTRIBUTE_VALUE_UNQUOTED_STATE); 2908 2909 else if (cp === $.APOSTROPHE) 2910 this.state = ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE; 2911 2912 else if (cp === $.NULL) { 2913 this.currentAttr.value += UNICODE.REPLACEMENT_CHARACTER; 2914 this.state = ATTRIBUTE_VALUE_UNQUOTED_STATE; 2915 } 2916 2917 else if (cp === $.GREATER_THAN_SIGN) { 2918 this.state = DATA_STATE; 2919 this._emitCurrentToken(); 2920 } 2921 2922 else if (cp === $.LESS_THAN_SIGN || cp === $.EQUALS_SIGN || cp === $.GRAVE_ACCENT) { 2923 this.currentAttr.value += toChar(cp); 2924 this.state = ATTRIBUTE_VALUE_UNQUOTED_STATE; 2925 } 2926 2927 else if (cp === $.EOF) 2928 this._reconsumeInState(DATA_STATE); 2929 2930 else { 2931 this.currentAttr.value += toChar(cp); 2932 this.state = ATTRIBUTE_VALUE_UNQUOTED_STATE; 2933 } 2934}; 2935 2936 2937//12.2.4.38 Attribute value (double-quoted) state 2938//------------------------------------------------------------------ 2939_[ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE] = function attributeValueDoubleQuotedState(cp) { 2940 if (cp === $.QUOTATION_MARK) 2941 this.state = AFTER_ATTRIBUTE_VALUE_QUOTED_STATE; 2942 2943 else if (cp === $.AMPERSAND) { 2944 this.additionalAllowedCp = $.QUOTATION_MARK; 2945 this.returnState = this.state; 2946 this.state = CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE; 2947 } 2948 2949 else if (cp === $.NULL) 2950 this.currentAttr.value += UNICODE.REPLACEMENT_CHARACTER; 2951 2952 else if (cp === $.EOF) 2953 this._reconsumeInState(DATA_STATE); 2954 2955 else 2956 this.currentAttr.value += toChar(cp); 2957}; 2958 2959 2960//12.2.4.39 Attribute value (single-quoted) state 2961//------------------------------------------------------------------ 2962_[ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE] = function attributeValueSingleQuotedState(cp) { 2963 if (cp === $.APOSTROPHE) 2964 this.state = AFTER_ATTRIBUTE_VALUE_QUOTED_STATE; 2965 2966 else if (cp === $.AMPERSAND) { 2967 this.additionalAllowedCp = $.APOSTROPHE; 2968 this.returnState = this.state; 2969 this.state = CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE; 2970 } 2971 2972 else if (cp === $.NULL) 2973 this.currentAttr.value += UNICODE.REPLACEMENT_CHARACTER; 2974 2975 else if (cp === $.EOF) 2976 this._reconsumeInState(DATA_STATE); 2977 2978 else 2979 this.currentAttr.value += toChar(cp); 2980}; 2981 2982 2983//12.2.4.40 Attribute value (unquoted) state 2984//------------------------------------------------------------------ 2985_[ATTRIBUTE_VALUE_UNQUOTED_STATE] = function attributeValueUnquotedState(cp) { 2986 if (isWhitespace(cp)) 2987 this.state = BEFORE_ATTRIBUTE_NAME_STATE; 2988 2989 else if (cp === $.AMPERSAND) { 2990 this.additionalAllowedCp = $.GREATER_THAN_SIGN; 2991 this.returnState = this.state; 2992 this.state = CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE; 2993 } 2994 2995 else if (cp === $.GREATER_THAN_SIGN) { 2996 this.state = DATA_STATE; 2997 this._emitCurrentToken(); 2998 } 2999 3000 else if (cp === $.NULL) 3001 this.currentAttr.value += UNICODE.REPLACEMENT_CHARACTER; 3002 3003 else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN || 3004 cp === $.EQUALS_SIGN || cp === $.GRAVE_ACCENT) { 3005 this.currentAttr.value += toChar(cp); 3006 } 3007 3008 else if (cp === $.EOF) 3009 this._reconsumeInState(DATA_STATE); 3010 3011 else 3012 this.currentAttr.value += toChar(cp); 3013}; 3014 3015 3016//12.2.4.41 Character reference in attribute value state 3017//------------------------------------------------------------------ 3018_[CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE] = function characterReferenceInAttributeValueState(cp) { 3019 var referencedCodePoints = this._consumeCharacterReference(cp, true); 3020 3021 if (referencedCodePoints) { 3022 for (var i = 0; i < referencedCodePoints.length; i++) 3023 this.currentAttr.value += toChar(referencedCodePoints[i]); 3024 } else 3025 this.currentAttr.value += '&'; 3026 3027 this.state = this.returnState; 3028}; 3029 3030 3031//12.2.4.42 After attribute value (quoted) state 3032//------------------------------------------------------------------ 3033_[AFTER_ATTRIBUTE_VALUE_QUOTED_STATE] = function afterAttributeValueQuotedState(cp) { 3034 if (isWhitespace(cp)) 3035 this.state = BEFORE_ATTRIBUTE_NAME_STATE; 3036 3037 else if (cp === $.SOLIDUS) 3038 this.state = SELF_CLOSING_START_TAG_STATE; 3039 3040 else if (cp === $.GREATER_THAN_SIGN) { 3041 this.state = DATA_STATE; 3042 this._emitCurrentToken(); 3043 } 3044 3045 else if (cp === $.EOF) 3046 this._reconsumeInState(DATA_STATE); 3047 3048 else 3049 this._reconsumeInState(BEFORE_ATTRIBUTE_NAME_STATE); 3050}; 3051 3052 3053//12.2.4.43 Self-closing start tag state 3054//------------------------------------------------------------------ 3055_[SELF_CLOSING_START_TAG_STATE] = function selfClosingStartTagState(cp) { 3056 if (cp === $.GREATER_THAN_SIGN) { 3057 this.currentToken.selfClosing = true; 3058 this.state = DATA_STATE; 3059 this._emitCurrentToken(); 3060 } 3061 3062 else if (cp === $.EOF) 3063 this._reconsumeInState(DATA_STATE); 3064 3065 else 3066 this._reconsumeInState(BEFORE_ATTRIBUTE_NAME_STATE); 3067}; 3068 3069 3070//12.2.4.44 Bogus comment state 3071//------------------------------------------------------------------ 3072_[BOGUS_COMMENT_STATE] = function bogusCommentState(cp) { 3073 this._createCommentToken(); 3074 3075 while (true) { 3076 if (cp === $.GREATER_THAN_SIGN) { 3077 this.state = DATA_STATE; 3078 break; 3079 } 3080 3081 else if (cp === $.EOF) { 3082 this._reconsumeInState(DATA_STATE); 3083 break; 3084 } 3085 3086 else { 3087 this.currentToken.data += cp === $.NULL ? UNICODE.REPLACEMENT_CHARACTER : toChar(cp); 3088 cp = this._consume(); 3089 } 3090 } 3091 3092 this._emitCurrentToken(); 3093}; 3094 3095 3096//12.2.4.45 Markup declaration open state 3097//------------------------------------------------------------------ 3098_[MARKUP_DECLARATION_OPEN_STATE] = function markupDeclarationOpenState(cp) { 3099 if (this._consumeSubsequentIfMatch($$.DASH_DASH_STRING, cp, true)) { 3100 this._createCommentToken(); 3101 this.state = COMMENT_START_STATE; 3102 } 3103 3104 else if (this._consumeSubsequentIfMatch($$.DOCTYPE_STRING, cp, false)) 3105 this.state = DOCTYPE_STATE; 3106 3107 else if (this.allowCDATA && this._consumeSubsequentIfMatch($$.CDATA_START_STRING, cp, true)) 3108 this.state = CDATA_SECTION_STATE; 3109 3110 else { 3111 //NOTE: call bogus comment state directly with current consumed character to avoid unnecessary reconsumption. 3112 this[BOGUS_COMMENT_STATE](cp); 3113 } 3114}; 3115 3116 3117//12.2.4.46 Comment start state 3118//------------------------------------------------------------------ 3119_[COMMENT_START_STATE] = function commentStartState(cp) { 3120 if (cp === $.HYPHEN_MINUS) 3121 this.state = COMMENT_START_DASH_STATE; 3122 3123 else if (cp === $.NULL) { 3124 this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER; 3125 this.state = COMMENT_STATE; 3126 } 3127 3128 else if (cp === $.GREATER_THAN_SIGN) { 3129 this.state = DATA_STATE; 3130 this._emitCurrentToken(); 3131 } 3132 3133 else if (cp === $.EOF) { 3134 this._emitCurrentToken(); 3135 this._reconsumeInState(DATA_STATE); 3136 } 3137 3138 else { 3139 this.currentToken.data += toChar(cp); 3140 this.state = COMMENT_STATE; 3141 } 3142}; 3143 3144 3145//12.2.4.47 Comment start dash state 3146//------------------------------------------------------------------ 3147_[COMMENT_START_DASH_STATE] = function commentStartDashState(cp) { 3148 if (cp === $.HYPHEN_MINUS) 3149 this.state = COMMENT_END_STATE; 3150 3151 else if (cp === $.NULL) { 3152 this.currentToken.data += '-'; 3153 this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER; 3154 this.state = COMMENT_STATE; 3155 } 3156 3157 else if (cp === $.GREATER_THAN_SIGN) { 3158 this.state = DATA_STATE; 3159 this._emitCurrentToken(); 3160 } 3161 3162 else if (cp === $.EOF) { 3163 this._emitCurrentToken(); 3164 this._reconsumeInState(DATA_STATE); 3165 } 3166 3167 else { 3168 this.currentToken.data += '-'; 3169 this.currentToken.data += toChar(cp); 3170 this.state = COMMENT_STATE; 3171 } 3172}; 3173 3174 3175//12.2.4.48 Comment state 3176//------------------------------------------------------------------ 3177_[COMMENT_STATE] = function commentState(cp) { 3178 if (cp === $.HYPHEN_MINUS) 3179 this.state = COMMENT_END_DASH_STATE; 3180 3181 else if (cp === $.NULL) 3182 this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER; 3183 3184 else if (cp === $.EOF) { 3185 this._emitCurrentToken(); 3186 this._reconsumeInState(DATA_STATE); 3187 } 3188 3189 else 3190 this.currentToken.data += toChar(cp); 3191}; 3192 3193 3194//12.2.4.49 Comment end dash state 3195//------------------------------------------------------------------ 3196_[COMMENT_END_DASH_STATE] = function commentEndDashState(cp) { 3197 if (cp === $.HYPHEN_MINUS) 3198 this.state = COMMENT_END_STATE; 3199 3200 else if (cp === $.NULL) { 3201 this.currentToken.data += '-'; 3202 this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER; 3203 this.state = COMMENT_STATE; 3204 } 3205 3206 else if (cp === $.EOF) { 3207 this._emitCurrentToken(); 3208 this._reconsumeInState(DATA_STATE); 3209 } 3210 3211 else { 3212 this.currentToken.data += '-'; 3213 this.currentToken.data += toChar(cp); 3214 this.state = COMMENT_STATE; 3215 } 3216}; 3217 3218 3219//12.2.4.50 Comment end state 3220//------------------------------------------------------------------ 3221_[COMMENT_END_STATE] = function commentEndState(cp) { 3222 if (cp === $.GREATER_THAN_SIGN) { 3223 this.state = DATA_STATE; 3224 this._emitCurrentToken(); 3225 } 3226 3227 else if (cp === $.EXCLAMATION_MARK) 3228 this.state = COMMENT_END_BANG_STATE; 3229 3230 else if (cp === $.HYPHEN_MINUS) 3231 this.currentToken.data += '-'; 3232 3233 else if (cp === $.NULL) { 3234 this.currentToken.data += '--'; 3235 this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER; 3236 this.state = COMMENT_STATE; 3237 } 3238 3239 else if (cp === $.EOF) { 3240 this._reconsumeInState(DATA_STATE); 3241 this._emitCurrentToken(); 3242 } 3243 3244 else { 3245 this.currentToken.data += '--'; 3246 this.currentToken.data += toChar(cp); 3247 this.state = COMMENT_STATE; 3248 } 3249}; 3250 3251 3252//12.2.4.51 Comment end bang state 3253//------------------------------------------------------------------ 3254_[COMMENT_END_BANG_STATE] = function commentEndBangState(cp) { 3255 if (cp === $.HYPHEN_MINUS) { 3256 this.currentToken.data += '--!'; 3257 this.state = COMMENT_END_DASH_STATE; 3258 } 3259 3260 else if (cp === $.GREATER_THAN_SIGN) { 3261 this.state = DATA_STATE; 3262 this._emitCurrentToken(); 3263 } 3264 3265 else if (cp === $.NULL) { 3266 this.currentToken.data += '--!'; 3267 this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER; 3268 this.state = COMMENT_STATE; 3269 } 3270 3271 else if (cp === $.EOF) { 3272 this._emitCurrentToken(); 3273 this._reconsumeInState(DATA_STATE); 3274 } 3275 3276 else { 3277 this.currentToken.data += '--!'; 3278 this.currentToken.data += toChar(cp); 3279 this.state = COMMENT_STATE; 3280 } 3281}; 3282 3283 3284//12.2.4.52 DOCTYPE state 3285//------------------------------------------------------------------ 3286_[DOCTYPE_STATE] = function doctypeState(cp) { 3287 if (isWhitespace(cp)) 3288 this.state = BEFORE_DOCTYPE_NAME_STATE; 3289 3290 else if (cp === $.EOF) { 3291 this._createDoctypeToken(); 3292 this.currentToken.forceQuirks = true; 3293 this._emitCurrentToken(); 3294 this._reconsumeInState(DATA_STATE); 3295 } 3296 3297 else 3298 this._reconsumeInState(BEFORE_DOCTYPE_NAME_STATE); 3299}; 3300 3301 3302//12.2.4.53 Before DOCTYPE name state 3303//------------------------------------------------------------------ 3304_[BEFORE_DOCTYPE_NAME_STATE] = function beforeDoctypeNameState(cp) { 3305 if (isWhitespace(cp)) 3306 return; 3307 3308 if (isAsciiUpper(cp)) { 3309 this._createDoctypeToken(toAsciiLowerChar(cp)); 3310 this.state = DOCTYPE_NAME_STATE; 3311 } 3312 3313 else if (cp === $.GREATER_THAN_SIGN) { 3314 this._createDoctypeToken(); 3315 this.currentToken.forceQuirks = true; 3316 this._emitCurrentToken(); 3317 this.state = DATA_STATE; 3318 } 3319 3320 else if (cp === $.EOF) { 3321 this._createDoctypeToken(); 3322 this.currentToken.forceQuirks = true; 3323 this._emitCurrentToken(); 3324 this._reconsumeInState(DATA_STATE); 3325 } 3326 3327 else if (cp === $.NULL) { 3328 this._createDoctypeToken(UNICODE.REPLACEMENT_CHARACTER); 3329 this.state = DOCTYPE_NAME_STATE; 3330 } 3331 3332 else { 3333 this._createDoctypeToken(toChar(cp)); 3334 this.state = DOCTYPE_NAME_STATE; 3335 } 3336}; 3337 3338 3339//12.2.4.54 DOCTYPE name state 3340//------------------------------------------------------------------ 3341_[DOCTYPE_NAME_STATE] = function doctypeNameState(cp) { 3342 if (isWhitespace(cp)) 3343 this.state = AFTER_DOCTYPE_NAME_STATE; 3344 3345 else if (cp === $.GREATER_THAN_SIGN) { 3346 this._emitCurrentToken(); 3347 this.state = DATA_STATE; 3348 } 3349 3350 else if (isAsciiUpper(cp)) 3351 this.currentToken.name += toAsciiLowerChar(cp); 3352 3353 else if (cp === $.NULL) 3354 this.currentToken.name += UNICODE.REPLACEMENT_CHARACTER; 3355 3356 else if (cp === $.EOF) { 3357 this.currentToken.forceQuirks = true; 3358 this._emitCurrentToken(); 3359 this._reconsumeInState(DATA_STATE); 3360 } 3361 3362 else 3363 this.currentToken.name += toChar(cp); 3364}; 3365 3366 3367//12.2.4.55 After DOCTYPE name state 3368//------------------------------------------------------------------ 3369_[AFTER_DOCTYPE_NAME_STATE] = function afterDoctypeNameState(cp) { 3370 if (isWhitespace(cp)) 3371 return; 3372 3373 if (cp === $.GREATER_THAN_SIGN) { 3374 this.state = DATA_STATE; 3375 this._emitCurrentToken(); 3376 } 3377 3378 else if (cp === $.EOF) { 3379 this.currentToken.forceQuirks = true; 3380 this._emitCurrentToken(); 3381 this._reconsumeInState(DATA_STATE); 3382 } 3383 3384 else if (this._consumeSubsequentIfMatch($$.PUBLIC_STRING, cp, false)) 3385 this.state = AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE; 3386 3387 else if (this._consumeSubsequentIfMatch($$.SYSTEM_STRING, cp, false)) 3388 this.state = AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE; 3389 3390 else { 3391 this.currentToken.forceQuirks = true; 3392 this.state = BOGUS_DOCTYPE_STATE; 3393 } 3394}; 3395 3396 3397//12.2.4.56 After DOCTYPE public keyword state 3398//------------------------------------------------------------------ 3399_[AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE] = function afterDoctypePublicKeywordState(cp) { 3400 if (isWhitespace(cp)) 3401 this.state = BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE; 3402 3403 else if (cp === $.QUOTATION_MARK) { 3404 this.currentToken.publicId = ''; 3405 this.state = DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE; 3406 } 3407 3408 else if (cp === $.APOSTROPHE) { 3409 this.currentToken.publicId = ''; 3410 this.state = DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE; 3411 } 3412 3413 else if (cp === $.GREATER_THAN_SIGN) { 3414 this.currentToken.forceQuirks = true; 3415 this._emitCurrentToken(); 3416 this.state = DATA_STATE; 3417 } 3418 3419 else if (cp === $.EOF) { 3420 this.currentToken.forceQuirks = true; 3421 this._emitCurrentToken(); 3422 this._reconsumeInState(DATA_STATE); 3423 } 3424 3425 else { 3426 this.currentToken.forceQuirks = true; 3427 this.state = BOGUS_DOCTYPE_STATE; 3428 } 3429}; 3430 3431 3432//12.2.4.57 Before DOCTYPE public identifier state 3433//------------------------------------------------------------------ 3434_[BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE] = function beforeDoctypePublicIdentifierState(cp) { 3435 if (isWhitespace(cp)) 3436 return; 3437 3438 if (cp === $.QUOTATION_MARK) { 3439 this.currentToken.publicId = ''; 3440 this.state = DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE; 3441 } 3442 3443 else if (cp === $.APOSTROPHE) { 3444 this.currentToken.publicId = ''; 3445 this.state = DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE; 3446 } 3447 3448 else if (cp === $.GREATER_THAN_SIGN) { 3449 this.currentToken.forceQuirks = true; 3450 this._emitCurrentToken(); 3451 this.state = DATA_STATE; 3452 } 3453 3454 else if (cp === $.EOF) { 3455 this.currentToken.forceQuirks = true; 3456 this._emitCurrentToken(); 3457 this._reconsumeInState(DATA_STATE); 3458 } 3459 3460 else { 3461 this.currentToken.forceQuirks = true; 3462 this.state = BOGUS_DOCTYPE_STATE; 3463 } 3464}; 3465 3466 3467//12.2.4.58 DOCTYPE public identifier (double-quoted) state 3468//------------------------------------------------------------------ 3469_[DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE] = function doctypePublicIdentifierDoubleQuotedState(cp) { 3470 if (cp === $.QUOTATION_MARK) 3471 this.state = AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE; 3472 3473 else if (cp === $.NULL) 3474 this.currentToken.publicId += UNICODE.REPLACEMENT_CHARACTER; 3475 3476 else if (cp === $.GREATER_THAN_SIGN) { 3477 this.currentToken.forceQuirks = true; 3478 this._emitCurrentToken(); 3479 this.state = DATA_STATE; 3480 } 3481 3482 else if (cp === $.EOF) { 3483 this.currentToken.forceQuirks = true; 3484 this._emitCurrentToken(); 3485 this._reconsumeInState(DATA_STATE); 3486 } 3487 3488 else 3489 this.currentToken.publicId += toChar(cp); 3490}; 3491 3492 3493//12.2.4.59 DOCTYPE public identifier (single-quoted) state 3494//------------------------------------------------------------------ 3495_[DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE] = function doctypePublicIdentifierSingleQuotedState(cp) { 3496 if (cp === $.APOSTROPHE) 3497 this.state = AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE; 3498 3499 else if (cp === $.NULL) 3500 this.currentToken.publicId += UNICODE.REPLACEMENT_CHARACTER; 3501 3502 else if (cp === $.GREATER_THAN_SIGN) { 3503 this.currentToken.forceQuirks = true; 3504 this._emitCurrentToken(); 3505 this.state = DATA_STATE; 3506 } 3507 3508 else if (cp === $.EOF) { 3509 this.currentToken.forceQuirks = true; 3510 this._emitCurrentToken(); 3511 this._reconsumeInState(DATA_STATE); 3512 } 3513 3514 else 3515 this.currentToken.publicId += toChar(cp); 3516}; 3517 3518 3519//12.2.4.60 After DOCTYPE public identifier state 3520//------------------------------------------------------------------ 3521_[AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE] = function afterDoctypePublicIdentifierState(cp) { 3522 if (isWhitespace(cp)) 3523 this.state = BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE; 3524 3525 else if (cp === $.GREATER_THAN_SIGN) { 3526 this._emitCurrentToken(); 3527 this.state = DATA_STATE; 3528 } 3529 3530 else if (cp === $.QUOTATION_MARK) { 3531 this.currentToken.systemId = ''; 3532 this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE; 3533 } 3534 3535 else if (cp === $.APOSTROPHE) { 3536 this.currentToken.systemId = ''; 3537 this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE; 3538 } 3539 3540 else if (cp === $.EOF) { 3541 this.currentToken.forceQuirks = true; 3542 this._emitCurrentToken(); 3543 this._reconsumeInState(DATA_STATE); 3544 } 3545 3546 else { 3547 this.currentToken.forceQuirks = true; 3548 this.state = BOGUS_DOCTYPE_STATE; 3549 } 3550}; 3551 3552 3553//12.2.4.61 Between DOCTYPE public and system identifiers state 3554//------------------------------------------------------------------ 3555_[BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE] = function betweenDoctypePublicAndSystemIdentifiersState(cp) { 3556 if (isWhitespace(cp)) 3557 return; 3558 3559 if (cp === $.GREATER_THAN_SIGN) { 3560 this._emitCurrentToken(); 3561 this.state = DATA_STATE; 3562 } 3563 3564 else if (cp === $.QUOTATION_MARK) { 3565 this.currentToken.systemId = ''; 3566 this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE; 3567 } 3568 3569 3570 else if (cp === $.APOSTROPHE) { 3571 this.currentToken.systemId = ''; 3572 this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE; 3573 } 3574 3575 else if (cp === $.EOF) { 3576 this.currentToken.forceQuirks = true; 3577 this._emitCurrentToken(); 3578 this._reconsumeInState(DATA_STATE); 3579 } 3580 3581 else { 3582 this.currentToken.forceQuirks = true; 3583 this.state = BOGUS_DOCTYPE_STATE; 3584 } 3585}; 3586 3587 3588//12.2.4.62 After DOCTYPE system keyword state 3589//------------------------------------------------------------------ 3590_[AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE] = function afterDoctypeSystemKeywordState(cp) { 3591 if (isWhitespace(cp)) 3592 this.state = BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE; 3593 3594 else if (cp === $.QUOTATION_MARK) { 3595 this.currentToken.systemId = ''; 3596 this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE; 3597 } 3598 3599 else if (cp === $.APOSTROPHE) { 3600 this.currentToken.systemId = ''; 3601 this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE; 3602 } 3603 3604 else if (cp === $.GREATER_THAN_SIGN) { 3605 this.currentToken.forceQuirks = true; 3606 this._emitCurrentToken(); 3607 this.state = DATA_STATE; 3608 } 3609 3610 else if (cp === $.EOF) { 3611 this.currentToken.forceQuirks = true; 3612 this._emitCurrentToken(); 3613 this._reconsumeInState(DATA_STATE); 3614 } 3615 3616 else { 3617 this.currentToken.forceQuirks = true; 3618 this.state = BOGUS_DOCTYPE_STATE; 3619 } 3620}; 3621 3622 3623//12.2.4.63 Before DOCTYPE system identifier state 3624//------------------------------------------------------------------ 3625_[BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE] = function beforeDoctypeSystemIdentifierState(cp) { 3626 if (isWhitespace(cp)) 3627 return; 3628 3629 if (cp === $.QUOTATION_MARK) { 3630 this.currentToken.systemId = ''; 3631 this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE; 3632 } 3633 3634 else if (cp === $.APOSTROPHE) { 3635 this.currentToken.systemId = ''; 3636 this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE; 3637 } 3638 3639 else if (cp === $.GREATER_THAN_SIGN) { 3640 this.currentToken.forceQuirks = true; 3641 this._emitCurrentToken(); 3642 this.state = DATA_STATE; 3643 } 3644 3645 else if (cp === $.EOF) { 3646 this.currentToken.forceQuirks = true; 3647 this._emitCurrentToken(); 3648 this._reconsumeInState(DATA_STATE); 3649 } 3650 3651 else { 3652 this.currentToken.forceQuirks = true; 3653 this.state = BOGUS_DOCTYPE_STATE; 3654 } 3655}; 3656 3657 3658//12.2.4.64 DOCTYPE system identifier (double-quoted) state 3659//------------------------------------------------------------------ 3660_[DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE] = function doctypeSystemIdentifierDoubleQuotedState(cp) { 3661 if (cp === $.QUOTATION_MARK) 3662 this.state = AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE; 3663 3664 else if (cp === $.GREATER_THAN_SIGN) { 3665 this.currentToken.forceQuirks = true; 3666 this._emitCurrentToken(); 3667 this.state = DATA_STATE; 3668 } 3669 3670 else if (cp === $.NULL) 3671 this.currentToken.systemId += UNICODE.REPLACEMENT_CHARACTER; 3672 3673 else if (cp === $.EOF) { 3674 this.currentToken.forceQuirks = true; 3675 this._emitCurrentToken(); 3676 this._reconsumeInState(DATA_STATE); 3677 } 3678 3679 else 3680 this.currentToken.systemId += toChar(cp); 3681}; 3682 3683 3684//12.2.4.65 DOCTYPE system identifier (single-quoted) state 3685//------------------------------------------------------------------ 3686_[DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE] = function doctypeSystemIdentifierSingleQuotedState(cp) { 3687 if (cp === $.APOSTROPHE) 3688 this.state = AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE; 3689 3690 else if (cp === $.GREATER_THAN_SIGN) { 3691 this.currentToken.forceQuirks = true; 3692 this._emitCurrentToken(); 3693 this.state = DATA_STATE; 3694 } 3695 3696 else if (cp === $.NULL) 3697 this.currentToken.systemId += UNICODE.REPLACEMENT_CHARACTER; 3698 3699 else if (cp === $.EOF) { 3700 this.currentToken.forceQuirks = true; 3701 this._emitCurrentToken(); 3702 this._reconsumeInState(DATA_STATE); 3703 } 3704 3705 else 3706 this.currentToken.systemId += toChar(cp); 3707}; 3708 3709 3710//12.2.4.66 After DOCTYPE system identifier state 3711//------------------------------------------------------------------ 3712_[AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE] = function afterDoctypeSystemIdentifierState(cp) { 3713 if (isWhitespace(cp)) 3714 return; 3715 3716 if (cp === $.GREATER_THAN_SIGN) { 3717 this._emitCurrentToken(); 3718 this.state = DATA_STATE; 3719 } 3720 3721 else if (cp === $.EOF) { 3722 this.currentToken.forceQuirks = true; 3723 this._emitCurrentToken(); 3724 this._reconsumeInState(DATA_STATE); 3725 } 3726 3727 else 3728 this.state = BOGUS_DOCTYPE_STATE; 3729}; 3730 3731 3732//12.2.4.67 Bogus DOCTYPE state 3733//------------------------------------------------------------------ 3734_[BOGUS_DOCTYPE_STATE] = function bogusDoctypeState(cp) { 3735 if (cp === $.GREATER_THAN_SIGN) { 3736 this._emitCurrentToken(); 3737 this.state = DATA_STATE; 3738 } 3739 3740 else if (cp === $.EOF) { 3741 this._emitCurrentToken(); 3742 this._reconsumeInState(DATA_STATE); 3743 } 3744}; 3745 3746 3747//12.2.4.68 CDATA section state 3748//------------------------------------------------------------------ 3749_[CDATA_SECTION_STATE] = function cdataSectionState(cp) { 3750 while (true) { 3751 if (cp === $.EOF) { 3752 this._reconsumeInState(DATA_STATE); 3753 break; 3754 } 3755 3756 else if (this._consumeSubsequentIfMatch($$.CDATA_END_STRING, cp, true)) { 3757 this.state = DATA_STATE; 3758 break; 3759 } 3760 3761 else { 3762 this._emitCodePoint(cp); 3763 cp = this._consume(); 3764 } 3765 } 3766}; 3767 3768},{"../common/unicode":4,"./location_info_mixin":11,"./named_entity_trie":12,"./preprocessor":13}],15:[function(require,module,exports){ 3769'use strict'; 3770 3771//Node construction 3772exports.createDocument = function () { 3773 return { 3774 nodeName: '#document', 3775 quirksMode: false, 3776 childNodes: [] 3777 }; 3778}; 3779 3780exports.createDocumentFragment = function () { 3781 return { 3782 nodeName: '#document-fragment', 3783 quirksMode: false, 3784 childNodes: [] 3785 }; 3786}; 3787 3788exports.createElement = function (tagName, namespaceURI, attrs) { 3789 return { 3790 nodeName: tagName, 3791 tagName: tagName, 3792 attrs: attrs, 3793 namespaceURI: namespaceURI, 3794 childNodes: [], 3795 parentNode: null 3796 }; 3797}; 3798 3799exports.createCommentNode = function (data) { 3800 return { 3801 nodeName: '#comment', 3802 data: data, 3803 parentNode: null 3804 }; 3805}; 3806 3807var createTextNode = function (value) { 3808 return { 3809 nodeName: '#text', 3810 value: value, 3811 parentNode: null 3812 } 3813}; 3814 3815 3816//Tree mutation 3817exports.setDocumentType = function (document, name, publicId, systemId) { 3818 var doctypeNode = null; 3819 3820 for (var i = 0; i < document.childNodes.length; i++) { 3821 if (document.childNodes[i].nodeName === '#documentType') { 3822 doctypeNode = document.childNodes[i]; 3823 break; 3824 } 3825 } 3826 3827 if (doctypeNode) { 3828 doctypeNode.name = name; 3829 doctypeNode.publicId = publicId; 3830 doctypeNode.systemId = systemId; 3831 } 3832 3833 else { 3834 appendChild(document, { 3835 nodeName: '#documentType', 3836 name: name, 3837 publicId: publicId, 3838 systemId: systemId 3839 }); 3840 } 3841}; 3842 3843exports.setQuirksMode = function (document) { 3844 document.quirksMode = true; 3845}; 3846 3847exports.isQuirksMode = function (document) { 3848 return document.quirksMode; 3849}; 3850 3851var appendChild = exports.appendChild = function (parentNode, newNode) { 3852 parentNode.childNodes.push(newNode); 3853 newNode.parentNode = parentNode; 3854}; 3855 3856var insertBefore = exports.insertBefore = function (parentNode, newNode, referenceNode) { 3857 var insertionIdx = parentNode.childNodes.indexOf(referenceNode); 3858 3859 parentNode.childNodes.splice(insertionIdx, 0, newNode); 3860 newNode.parentNode = parentNode; 3861}; 3862 3863exports.detachNode = function (node) { 3864 if (node.parentNode) { 3865 var idx = node.parentNode.childNodes.indexOf(node); 3866 3867 node.parentNode.childNodes.splice(idx, 1); 3868 node.parentNode = null; 3869 } 3870}; 3871 3872exports.insertText = function (parentNode, text) { 3873 if (parentNode.childNodes.length) { 3874 var prevNode = parentNode.childNodes[parentNode.childNodes.length - 1]; 3875 3876 if (prevNode.nodeName === '#text') { 3877 prevNode.value += text; 3878 return; 3879 } 3880 } 3881 3882 appendChild(parentNode, createTextNode(text)); 3883}; 3884 3885exports.insertTextBefore = function (parentNode, text, referenceNode) { 3886 var prevNode = parentNode.childNodes[parentNode.childNodes.indexOf(referenceNode) - 1]; 3887 3888 if (prevNode && prevNode.nodeName === '#text') 3889 prevNode.value += text; 3890 else 3891 insertBefore(parentNode, createTextNode(text), referenceNode); 3892}; 3893 3894exports.adoptAttributes = function (recipientNode, attrs) { 3895 var recipientAttrsMap = []; 3896 3897 for (var i = 0; i < recipientNode.attrs.length; i++) 3898 recipientAttrsMap.push(recipientNode.attrs[i].name); 3899 3900 for (var j = 0; j < attrs.length; j++) { 3901 if (recipientAttrsMap.indexOf(attrs[j].name) === -1) 3902 recipientNode.attrs.push(attrs[j]); 3903 } 3904}; 3905 3906 3907//Tree traversing 3908exports.getFirstChild = function (node) { 3909 return node.childNodes[0]; 3910}; 3911 3912exports.getChildNodes = function (node) { 3913 return node.childNodes; 3914}; 3915 3916exports.getParentNode = function (node) { 3917 return node.parentNode; 3918}; 3919 3920exports.getAttrList = function (node) { 3921 return node.attrs; 3922}; 3923 3924//Node data 3925exports.getTagName = function (element) { 3926 return element.tagName; 3927}; 3928 3929exports.getNamespaceURI = function (element) { 3930 return element.namespaceURI; 3931}; 3932 3933exports.getTextNodeContent = function (textNode) { 3934 return textNode.value; 3935}; 3936 3937exports.getCommentNodeContent = function (commentNode) { 3938 return commentNode.data; 3939}; 3940 3941exports.getDocumentTypeNodeName = function (doctypeNode) { 3942 return doctypeNode.name; 3943}; 3944 3945exports.getDocumentTypeNodePublicId = function (doctypeNode) { 3946 return doctypeNode.publicId; 3947}; 3948 3949exports.getDocumentTypeNodeSystemId = function (doctypeNode) { 3950 return doctypeNode.systemId; 3951}; 3952 3953//Node types 3954exports.isTextNode = function (node) { 3955 return node.nodeName === '#text'; 3956}; 3957 3958exports.isCommentNode = function (node) { 3959 return node.nodeName === '#comment'; 3960}; 3961 3962exports.isDocumentTypeNode = function (node) { 3963 return node.nodeName === '#documentType'; 3964}; 3965 3966exports.isElementNode = function (node) { 3967 return !!node.tagName; 3968}; 3969 3970},{}],16:[function(require,module,exports){ 3971'use strict'; 3972 3973var Doctype = require('../common/doctype'); 3974 3975//Conversion tables for DOM Level1 structure emulation 3976var nodeTypes = { 3977 element: 1, 3978 text: 3, 3979 cdata: 4, 3980 comment: 8 3981}; 3982 3983var nodePropertyShorthands = { 3984 tagName: 'name', 3985 childNodes: 'children', 3986 parentNode: 'parent', 3987 previousSibling: 'prev', 3988 nextSibling: 'next', 3989 nodeValue: 'data' 3990}; 3991 3992//Node 3993var Node = function (props) { 3994 for (var key in props) { 3995 if (props.hasOwnProperty(key)) 3996 this[key] = props[key]; 3997 } 3998}; 3999 4000Node.prototype = { 4001 get firstChild() { 4002 var children = this.children; 4003 return children && children[0] || null; 4004 }, 4005 4006 get lastChild() { 4007 var children = this.children; 4008 return children && children[children.length - 1] || null; 4009 }, 4010 4011 get nodeType() { 4012 return nodeTypes[this.type] || nodeTypes.element; 4013 } 4014}; 4015 4016Object.keys(nodePropertyShorthands).forEach(function (key) { 4017 var shorthand = nodePropertyShorthands[key]; 4018 4019 Object.defineProperty(Node.prototype, key, { 4020 get: function () { 4021 return this[shorthand] || null; 4022 }, 4023 set: function (val) { 4024 this[shorthand] = val; 4025 return val; 4026 } 4027 }); 4028}); 4029 4030 4031//Node construction 4032exports.createDocument = 4033exports.createDocumentFragment = function () { 4034 return new Node({ 4035 type: 'root', 4036 name: 'root', 4037 parent: null, 4038 prev: null, 4039 next: null, 4040 children: [] 4041 }); 4042}; 4043 4044exports.createElement = function (tagName, namespaceURI, attrs) { 4045 var attribs = {}, 4046 attribsNamespace = {}, 4047 attribsPrefix = {}; 4048 4049 for (var i = 0; i < attrs.length; i++) { 4050 var attrName = attrs[i].name; 4051 4052 attribs[attrName] = attrs[i].value; 4053 attribsNamespace[attrName] = attrs[i].namespace; 4054 attribsPrefix[attrName] = attrs[i].prefix; 4055 } 4056 4057 return new Node({ 4058 type: tagName === 'script' || tagName === 'style' ? tagName : 'tag', 4059 name: tagName, 4060 namespace: namespaceURI, 4061 attribs: attribs, 4062 'x-attribsNamespace': attribsNamespace, 4063 'x-attribsPrefix': attribsPrefix, 4064 children: [], 4065 parent: null, 4066 prev: null, 4067 next: null 4068 }); 4069}; 4070 4071exports.createCommentNode = function (data) { 4072 return new Node({ 4073 type: 'comment', 4074 data: data, 4075 parent: null, 4076 prev: null, 4077 next: null 4078 }); 4079}; 4080 4081var createTextNode = function (value) { 4082 return new Node({ 4083 type: 'text', 4084 data: value, 4085 parent: null, 4086 prev: null, 4087 next: null 4088 }); 4089}; 4090 4091 4092//Tree mutation 4093exports.setDocumentType = function (document, name, publicId, systemId) { 4094 var data = Doctype.serializeContent(name, publicId, systemId), 4095 doctypeNode = null; 4096 4097 for (var i = 0; i < document.children.length; i++) { 4098 if (document.children[i].type === 'directive' && document.children[i].name === '!doctype') { 4099 doctypeNode = document.children[i]; 4100 break; 4101 } 4102 } 4103 4104 if (doctypeNode) { 4105 doctypeNode.data = data; 4106 doctypeNode['x-name'] = name; 4107 doctypeNode['x-publicId'] = publicId; 4108 doctypeNode['x-systemId'] = systemId; 4109 } 4110 4111 else { 4112 appendChild(document, new Node({ 4113 type: 'directive', 4114 name: '!doctype', 4115 data: data, 4116 'x-name': name, 4117 'x-publicId': publicId, 4118 'x-systemId': systemId 4119 })); 4120 } 4121 4122}; 4123 4124exports.setQuirksMode = function (document) { 4125 document.quirksMode = true; 4126}; 4127 4128exports.isQuirksMode = function (document) { 4129 return document.quirksMode; 4130}; 4131 4132var appendChild = exports.appendChild = function (parentNode, newNode) { 4133 var prev = parentNode.children[parentNode.children.length - 1]; 4134 4135 if (prev) { 4136 prev.next = newNode; 4137 newNode.prev = prev; 4138 } 4139 4140 parentNode.children.push(newNode); 4141 newNode.parent = parentNode; 4142}; 4143 4144var insertBefore = exports.insertBefore = function (parentNode, newNode, referenceNode) { 4145 var insertionIdx = parentNode.children.indexOf(referenceNode), 4146 prev = referenceNode.prev; 4147 4148 if (prev) { 4149 prev.next = newNode; 4150 newNode.prev = prev; 4151 } 4152 4153 referenceNode.prev = newNode; 4154 newNode.next = referenceNode; 4155 4156 parentNode.children.splice(insertionIdx, 0, newNode); 4157 newNode.parent = parentNode; 4158}; 4159 4160exports.detachNode = function (node) { 4161 if (node.parent) { 4162 var idx = node.parent.children.indexOf(node), 4163 prev = node.prev, 4164 next = node.next; 4165 4166 node.prev = null; 4167 node.next = null; 4168 4169 if (prev) 4170 prev.next = next; 4171 4172 if (next) 4173 next.prev = prev; 4174 4175 node.parent.children.splice(idx, 1); 4176 node.parent = null; 4177 } 4178}; 4179 4180exports.insertText = function (parentNode, text) { 4181 var lastChild = parentNode.children[parentNode.children.length - 1]; 4182 4183 if (lastChild && lastChild.type === 'text') 4184 lastChild.data += text; 4185 else 4186 appendChild(parentNode, createTextNode(text)); 4187}; 4188 4189exports.insertTextBefore = function (parentNode, text, referenceNode) { 4190 var prevNode = parentNode.children[parentNode.children.indexOf(referenceNode) - 1]; 4191 4192 if (prevNode && prevNode.type === 'text') 4193 prevNode.data += text; 4194 else 4195 insertBefore(parentNode, createTextNode(text), referenceNode); 4196}; 4197 4198exports.adoptAttributes = function (recipientNode, attrs) { 4199 for (var i = 0; i < attrs.length; i++) { 4200 var attrName = attrs[i].name; 4201 4202 if (typeof recipientNode.attribs[attrName] === 'undefined') { 4203 recipientNode.attribs[attrName] = attrs[i].value; 4204 recipientNode['x-attribsNamespace'][attrName] = attrs[i].namespace; 4205 recipientNode['x-attribsPrefix'][attrName] = attrs[i].prefix; 4206 } 4207 } 4208}; 4209 4210 4211//Tree traversing 4212exports.getFirstChild = function (node) { 4213 return node.children[0]; 4214}; 4215 4216exports.getChildNodes = function (node) { 4217 return node.children; 4218}; 4219 4220exports.getParentNode = function (node) { 4221 return node.parent; 4222}; 4223 4224exports.getAttrList = function (node) { 4225 var attrList = []; 4226 4227 for (var name in node.attribs) { 4228 if (node.attribs.hasOwnProperty(name)) { 4229 attrList.push({ 4230 name: name, 4231 value: node.attribs[name], 4232 namespace: node['x-attribsNamespace'][name], 4233 prefix: node['x-attribsPrefix'][name] 4234 }); 4235 } 4236 } 4237 4238 return attrList; 4239}; 4240 4241 4242//Node data 4243exports.getTagName = function (element) { 4244 return element.name; 4245}; 4246 4247exports.getNamespaceURI = function (element) { 4248 return element.namespace; 4249}; 4250 4251exports.getTextNodeContent = function (textNode) { 4252 return textNode.data; 4253}; 4254 4255exports.getCommentNodeContent = function (commentNode) { 4256 return commentNode.data; 4257}; 4258 4259exports.getDocumentTypeNodeName = function (doctypeNode) { 4260 return doctypeNode['x-name']; 4261}; 4262 4263exports.getDocumentTypeNodePublicId = function (doctypeNode) { 4264 return doctypeNode['x-publicId']; 4265}; 4266 4267exports.getDocumentTypeNodeSystemId = function (doctypeNode) { 4268 return doctypeNode['x-systemId']; 4269}; 4270 4271 4272//Node types 4273exports.isTextNode = function (node) { 4274 return node.type === 'text'; 4275}; 4276 4277exports.isCommentNode = function (node) { 4278 return node.type === 'comment'; 4279}; 4280 4281exports.isDocumentTypeNode = function (node) { 4282 return node.type === 'directive' && node.name === '!doctype'; 4283}; 4284 4285exports.isElementNode = function (node) { 4286 return !!node.attribs; 4287}; 4288 4289},{"../common/doctype":1}],17:[function(require,module,exports){ 4290'use strict'; 4291 4292//Const 4293var NOAH_ARK_CAPACITY = 3; 4294 4295//List of formatting elements 4296var FormattingElementList = module.exports = function (treeAdapter) { 4297 this.length = 0; 4298 this.entries = []; 4299 this.treeAdapter = treeAdapter; 4300 this.bookmark = null; 4301}; 4302 4303//Entry types 4304FormattingElementList.MARKER_ENTRY = 'MARKER_ENTRY'; 4305FormattingElementList.ELEMENT_ENTRY = 'ELEMENT_ENTRY'; 4306 4307//Noah Ark's condition 4308//OPTIMIZATION: at first we try to find possible candidates for exclusion using 4309//lightweight heuristics without thorough attributes check. 4310FormattingElementList.prototype._getNoahArkConditionCandidates = function (newElement) { 4311 var candidates = []; 4312 4313 if (this.length >= NOAH_ARK_CAPACITY) { 4314 var neAttrsLength = this.treeAdapter.getAttrList(newElement).length, 4315 neTagName = this.treeAdapter.getTagName(newElement), 4316 neNamespaceURI = this.treeAdapter.getNamespaceURI(newElement); 4317 4318 for (var i = this.length - 1; i >= 0; i--) { 4319 var entry = this.entries[i]; 4320 4321 if (entry.type === FormattingElementList.MARKER_ENTRY) 4322 break; 4323 4324 var element = entry.element, 4325 elementAttrs = this.treeAdapter.getAttrList(element); 4326 4327 if (this.treeAdapter.getTagName(element) === neTagName && 4328 this.treeAdapter.getNamespaceURI(element) === neNamespaceURI && 4329 elementAttrs.length === neAttrsLength) { 4330 candidates.push({idx: i, attrs: elementAttrs}); 4331 } 4332 } 4333 } 4334 4335 return candidates.length < NOAH_ARK_CAPACITY ? [] : candidates; 4336}; 4337 4338FormattingElementList.prototype._ensureNoahArkCondition = function (newElement) { 4339 var candidates = this._getNoahArkConditionCandidates(newElement), 4340 cLength = candidates.length; 4341 4342 if (cLength) { 4343 var neAttrs = this.treeAdapter.getAttrList(newElement), 4344 neAttrsLength = neAttrs.length, 4345 neAttrsMap = {}; 4346 4347 //NOTE: build attrs map for the new element so we can perform fast lookups 4348 for (var i = 0; i < neAttrsLength; i++) { 4349 var neAttr = neAttrs[i]; 4350 4351 neAttrsMap[neAttr.name] = neAttr.value; 4352 } 4353 4354 for (var i = 0; i < neAttrsLength; i++) { 4355 for (var j = 0; j < cLength; j++) { 4356 var cAttr = candidates[j].attrs[i]; 4357 4358 if (neAttrsMap[cAttr.name] !== cAttr.value) { 4359 candidates.splice(j, 1); 4360 cLength--; 4361 } 4362 4363 if (candidates.length < NOAH_ARK_CAPACITY) 4364 return; 4365 } 4366 } 4367 4368 //NOTE: remove bottommost candidates until Noah's Ark condition will not be met 4369 for (var i = cLength - 1; i >= NOAH_ARK_CAPACITY - 1; i--) { 4370 this.entries.splice(candidates[i].idx, 1); 4371 this.length--; 4372 } 4373 } 4374}; 4375 4376//Mutations 4377FormattingElementList.prototype.insertMarker = function () { 4378 this.entries.push({type: FormattingElementList.MARKER_ENTRY}); 4379 this.length++; 4380}; 4381 4382FormattingElementList.prototype.pushElement = function (element, token) { 4383 this._ensureNoahArkCondition(element); 4384 4385 this.entries.push({ 4386 type: FormattingElementList.ELEMENT_ENTRY, 4387 element: element, 4388 token: token 4389 }); 4390 4391 this.length++; 4392}; 4393 4394FormattingElementList.prototype.insertElementAfterBookmark = function (element, token) { 4395 var bookmarkIdx = this.length - 1; 4396 4397 for (; bookmarkIdx >= 0; bookmarkIdx--) { 4398 if (this.entries[bookmarkIdx] === this.bookmark) 4399 break; 4400 } 4401 4402 this.entries.splice(bookmarkIdx + 1, 0, { 4403 type: FormattingElementList.ELEMENT_ENTRY, 4404 element: element, 4405 token: token 4406 }); 4407 4408 this.length++; 4409}; 4410 4411FormattingElementList.prototype.removeEntry = function (entry) { 4412 for (var i = this.length - 1; i >= 0; i--) { 4413 if (this.entries[i] === entry) { 4414 this.entries.splice(i, 1); 4415 this.length--; 4416 break; 4417 } 4418 } 4419}; 4420 4421FormattingElementList.prototype.clearToLastMarker = function () { 4422 while (this.length) { 4423 var entry = this.entries.pop(); 4424 4425 this.length--; 4426 4427 if (entry.type === FormattingElementList.MARKER_ENTRY) 4428 break; 4429 } 4430}; 4431 4432//Search 4433FormattingElementList.prototype.getElementEntryInScopeWithTagName = function (tagName) { 4434 for (var i = this.length - 1; i >= 0; i--) { 4435 var entry = this.entries[i]; 4436 4437 if (entry.type === FormattingElementList.MARKER_ENTRY) 4438 return null; 4439 4440 if (this.treeAdapter.getTagName(entry.element) === tagName) 4441 return entry; 4442 } 4443 4444 return null; 4445}; 4446 4447FormattingElementList.prototype.getElementEntry = function (element) { 4448 for (var i = this.length - 1; i >= 0; i--) { 4449 var entry = this.entries[i]; 4450 4451 if (entry.type === FormattingElementList.ELEMENT_ENTRY && entry.element == element) 4452 return entry; 4453 } 4454 4455 return null; 4456}; 4457 4458},{}],18:[function(require,module,exports){ 4459'use strict'; 4460 4461var OpenElementStack = require('./open_element_stack'), 4462 Tokenizer = require('../tokenization/tokenizer'), 4463 HTML = require('../common/html'); 4464 4465 4466//Aliases 4467var $ = HTML.TAG_NAMES; 4468 4469 4470function setEndLocation(element, closingToken, treeAdapter) { 4471 var loc = element.__location; 4472 4473 if (!loc) 4474 return; 4475 4476 if (!loc.startTag) { 4477 loc.startTag = { 4478 start: loc.start, 4479 end: loc.end 4480 }; 4481 } 4482 4483 if (closingToken.location) { 4484 var tn = treeAdapter.getTagName(element), 4485 // NOTE: For cases like <p> <p> </p> - First 'p' closes without a closing tag and 4486 // for cases like <td> <p> </td> - 'p' closes without a closing tag 4487 isClosingEndTag = closingToken.type === Tokenizer.END_TAG_TOKEN && 4488 tn === closingToken.tagName; 4489 4490 if (isClosingEndTag) { 4491 loc.endTag = { 4492 start: closingToken.location.start, 4493 end: closingToken.location.end 4494 }; 4495 } 4496 4497 loc.end = closingToken.location.end; 4498 } 4499} 4500 4501//NOTE: patch open elements stack, so we can assign end location for the elements 4502function patchOpenElementsStack(stack, parser) { 4503 var treeAdapter = parser.treeAdapter; 4504 4505 stack.pop = function () { 4506 setEndLocation(this.current, parser.currentToken, treeAdapter); 4507 OpenElementStack.prototype.pop.call(this); 4508 }; 4509 4510 stack.popAllUpToHtmlElement = function () { 4511 for (var i = this.stackTop; i > 0; i--) 4512 setEndLocation(this.items[i], parser.currentToken, treeAdapter); 4513 4514 OpenElementStack.prototype.popAllUpToHtmlElement.call(this); 4515 }; 4516 4517 stack.remove = function (element) { 4518 setEndLocation(element, parser.currentToken, treeAdapter); 4519 OpenElementStack.prototype.remove.call(this, element); 4520 }; 4521} 4522 4523exports.assign = function (parser) { 4524 //NOTE: obtain Parser proto this way to avoid module circular references 4525 var parserProto = Object.getPrototypeOf(parser), 4526 treeAdapter = parser.treeAdapter; 4527 4528 4529 //NOTE: patch _reset method 4530 parser._reset = function (html, document, fragmentContext) { 4531 parserProto._reset.call(this, html, document, fragmentContext); 4532 4533 this.attachableElementLocation = null; 4534 this.lastFosterParentingLocation = null; 4535 this.currentToken = null; 4536 4537 patchOpenElementsStack(this.openElements, parser); 4538 }; 4539 4540 parser._processTokenInForeignContent = function (token) { 4541 this.currentToken = token; 4542 parserProto._processTokenInForeignContent.call(this, token); 4543 }; 4544 4545 parser._processToken = function (token) { 4546 this.currentToken = token; 4547 parserProto._processToken.call(this, token); 4548 4549 //NOTE: <body> and <html> are never popped from the stack, so we need to updated 4550 //their end location explicitly. 4551 if (token.type === Tokenizer.END_TAG_TOKEN && 4552 (token.tagName === $.HTML || 4553 (token.tagName === $.BODY && this.openElements.hasInScope($.BODY)))) { 4554 for (var i = this.openElements.stackTop; i >= 0; i--) { 4555 var element = this.openElements.items[i]; 4556 4557 if (this.treeAdapter.getTagName(element) === token.tagName) { 4558 setEndLocation(element, token, treeAdapter); 4559 break; 4560 } 4561 } 4562 } 4563 }; 4564 4565 //Doctype 4566 parser._setDocumentType = function (token) { 4567 parserProto._setDocumentType.call(this, token); 4568 4569 var documentChildren = this.treeAdapter.getChildNodes(this.document), 4570 cnLength = documentChildren.length; 4571 4572 for (var i = 0; i < cnLength; i++) { 4573 var node = documentChildren[i]; 4574 4575 if (this.treeAdapter.isDocumentTypeNode(node)) { 4576 node.__location = token.location; 4577 break; 4578 } 4579 } 4580 }; 4581 4582 //Elements 4583 parser._attachElementToTree = function (element) { 4584 //NOTE: _attachElementToTree is called from _appendElement, _insertElement and _insertTemplate methods. 4585 //So we will use token location stored in this methods for the element. 4586 element.__location = this.attachableElementLocation || null; 4587 this.attachableElementLocation = null; 4588 parserProto._attachElementToTree.call(this, element); 4589 }; 4590 4591 parser._appendElement = function (token, namespaceURI) { 4592 this.attachableElementLocation = token.location; 4593 parserProto._appendElement.call(this, token, namespaceURI); 4594 }; 4595 4596 parser._insertElement = function (token, namespaceURI) { 4597 this.attachableElementLocation = token.location; 4598 parserProto._insertElement.call(this, token, namespaceURI); 4599 }; 4600 4601 parser._insertTemplate = function (token) { 4602 this.attachableElementLocation = token.location; 4603 parserProto._insertTemplate.call(this, token); 4604 4605 var tmplContent = this.treeAdapter.getChildNodes(this.openElements.current)[0]; 4606 4607 tmplContent.__location = null; 4608 }; 4609 4610 parser._insertFakeRootElement = function () { 4611 parserProto._insertFakeRootElement.call(this); 4612 this.openElements.current.__location = null; 4613 }; 4614 4615 //Comments 4616 parser._appendCommentNode = function (token, parent) { 4617 parserProto._appendCommentNode.call(this, token, parent); 4618 4619 var children = this.treeAdapter.getChildNodes(parent), 4620 commentNode = children[children.length - 1]; 4621 4622 commentNode.__location = token.location; 4623 }; 4624 4625 //Text 4626 parser._findFosterParentingLocation = function () { 4627 //NOTE: store last foster parenting location, so we will be able to find inserted text 4628 //in case of foster parenting 4629 this.lastFosterParentingLocation = parserProto._findFosterParentingLocation.call(this); 4630 return this.lastFosterParentingLocation; 4631 }; 4632 4633 parser._insertCharacters = function (token) { 4634 parserProto._insertCharacters.call(this, token); 4635 4636 var hasFosterParent = this._shouldFosterParentOnInsertion(), 4637 parentingLocation = this.lastFosterParentingLocation, 4638 parent = (hasFosterParent && parentingLocation.parent) || 4639 this.openElements.currentTmplContent || 4640 this.openElements.current, 4641 siblings = this.treeAdapter.getChildNodes(parent), 4642 textNodeIdx = hasFosterParent && parentingLocation.beforeElement ? 4643 siblings.indexOf(parentingLocation.beforeElement) - 1 : 4644 siblings.length - 1, 4645 textNode = siblings[textNodeIdx]; 4646 4647 //NOTE: if we have location assigned by another token, then just update end position 4648 if (textNode.__location) 4649 textNode.__location.end = token.location.end; 4650 4651 else 4652 textNode.__location = token.location; 4653 }; 4654}; 4655 4656 4657},{"../common/html":3,"../tokenization/tokenizer":14,"./open_element_stack":19}],19:[function(require,module,exports){ 4658'use strict'; 4659 4660var HTML = require('../common/html'); 4661 4662//Aliases 4663var $ = HTML.TAG_NAMES, 4664 NS = HTML.NAMESPACES; 4665 4666//Element utils 4667 4668//OPTIMIZATION: Integer comparisons are low-cost, so we can use very fast tag name length filters here. 4669//It's faster than using dictionary. 4670function isImpliedEndTagRequired(tn) { 4671 switch (tn.length) { 4672 case 1: 4673 return tn === $.P; 4674 4675 case 2: 4676 return tn === $.RP || tn === $.RT || tn === $.DD || tn === $.DT || tn === $.LI; 4677 4678 case 6: 4679 return tn === $.OPTION; 4680 4681 case 8: 4682 return tn === $.OPTGROUP; 4683 } 4684 4685 return false; 4686} 4687 4688function isScopingElement(tn, ns) { 4689 switch (tn.length) { 4690 case 2: 4691 if (tn === $.TD || tn === $.TH) 4692 return ns === NS.HTML; 4693 4694 else if (tn === $.MI || tn === $.MO || tn == $.MN || tn === $.MS) 4695 return ns === NS.MATHML; 4696 4697 break; 4698 4699 case 4: 4700 if (tn === $.HTML) 4701 return ns === NS.HTML; 4702 4703 else if (tn === $.DESC) 4704 return ns === NS.SVG; 4705 4706 break; 4707 4708 case 5: 4709 if (tn === $.TABLE) 4710 return ns === NS.HTML; 4711 4712 else if (tn === $.MTEXT) 4713 return ns === NS.MATHML; 4714 4715 else if (tn === $.TITLE) 4716 return ns === NS.SVG; 4717 4718 break; 4719 4720 case 6: 4721 return (tn === $.APPLET || tn === $.OBJECT) && ns === NS.HTML; 4722 4723 case 7: 4724 return (tn === $.CAPTION || tn === $.MARQUEE) && ns === NS.HTML; 4725 4726 case 8: 4727 return tn === $.TEMPLATE && ns === NS.HTML; 4728 4729 case 13: 4730 return tn === $.FOREIGN_OBJECT && ns === NS.SVG; 4731 4732 case 14: 4733 return tn === $.ANNOTATION_XML && ns === NS.MATHML; 4734 } 4735 4736 return false; 4737} 4738 4739//Stack of open elements 4740var OpenElementStack = module.exports = function (document, treeAdapter) { 4741 this.stackTop = -1; 4742 this.items = []; 4743 this.current = document; 4744 this.currentTagName = null; 4745 this.currentTmplContent = null; 4746 this.tmplCount = 0; 4747 this.treeAdapter = treeAdapter; 4748}; 4749 4750//Index of element 4751OpenElementStack.prototype._indexOf = function (element) { 4752 var idx = -1; 4753 4754 for (var i = this.stackTop; i >= 0; i--) { 4755 if (this.items[i] === element) { 4756 idx = i; 4757 break; 4758 } 4759 } 4760 return idx; 4761}; 4762 4763//Update current element 4764OpenElementStack.prototype._isInTemplate = function () { 4765 if (this.currentTagName !== $.TEMPLATE) 4766 return false; 4767 4768 return this.treeAdapter.getNamespaceURI(this.current) === NS.HTML; 4769}; 4770 4771OpenElementStack.prototype._updateCurrentElement = function () { 4772 this.current = this.items[this.stackTop]; 4773 this.currentTagName = this.current && this.treeAdapter.getTagName(this.current); 4774 4775 this.currentTmplContent = this._isInTemplate() ? this.treeAdapter.getChildNodes(this.current)[0] : null; 4776}; 4777 4778//Mutations 4779OpenElementStack.prototype.push = function (element) { 4780 this.items[++this.stackTop] = element; 4781 this._updateCurrentElement(); 4782 4783 if (this._isInTemplate()) 4784 this.tmplCount++; 4785 4786}; 4787 4788OpenElementStack.prototype.pop = function () { 4789 this.stackTop--; 4790 4791 if (this.tmplCount > 0 && this._isInTemplate()) 4792 this.tmplCount--; 4793 4794 this._updateCurrentElement(); 4795}; 4796 4797OpenElementStack.prototype.replace = function (oldElement, newElement) { 4798 var idx = this._indexOf(oldElement); 4799 this.items[idx] = newElement; 4800 4801 if (idx === this.stackTop) 4802 this._updateCurrentElement(); 4803}; 4804 4805OpenElementStack.prototype.insertAfter = function (referenceElement, newElement) { 4806 var insertionIdx = this._indexOf(referenceElement) + 1; 4807 4808 this.items.splice(insertionIdx, 0, newElement); 4809 4810 if (insertionIdx == ++this.stackTop) 4811 this._updateCurrentElement(); 4812}; 4813 4814OpenElementStack.prototype.popUntilTagNamePopped = function (tagName) { 4815 while (this.stackTop > -1) { 4816 var tn = this.currentTagName; 4817 4818 this.pop(); 4819 4820 if (tn === tagName) 4821 break; 4822 } 4823}; 4824 4825OpenElementStack.prototype.popUntilTemplatePopped = function () { 4826 while (this.stackTop > -1) { 4827 var tn = this.currentTagName, 4828 ns = this.treeAdapter.getNamespaceURI(this.current); 4829 4830 this.pop(); 4831 4832 if (tn === $.TEMPLATE && ns === NS.HTML) 4833 break; 4834 } 4835}; 4836 4837OpenElementStack.prototype.popUntilElementPopped = function (element) { 4838 while (this.stackTop > -1) { 4839 var poppedElement = this.current; 4840 4841 this.pop(); 4842 4843 if (poppedElement === element) 4844 break; 4845 } 4846}; 4847 4848OpenElementStack.prototype.popUntilNumberedHeaderPopped = function () { 4849 while (this.stackTop > -1) { 4850 var tn = this.currentTagName; 4851 4852 this.pop(); 4853 4854 if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6) 4855 break; 4856 } 4857}; 4858 4859OpenElementStack.prototype.popAllUpToHtmlElement = function () { 4860 //NOTE: here we assume that root <html> element is always first in the open element stack, so 4861 //we perform this fast stack clean up. 4862 this.stackTop = 0; 4863 this._updateCurrentElement(); 4864}; 4865 4866OpenElementStack.prototype.clearBackToTableContext = function () { 4867 while (this.currentTagName !== $.TABLE && this.currentTagName !== $.TEMPLATE && this.currentTagName !== $.HTML) 4868 this.pop(); 4869}; 4870 4871OpenElementStack.prototype.clearBackToTableBodyContext = function () { 4872 while (this.currentTagName !== $.TBODY && this.currentTagName !== $.TFOOT && 4873 this.currentTagName !== $.THEAD && this.currentTagName !== $.TEMPLATE && 4874 this.currentTagName !== $.HTML) { 4875 this.pop(); 4876 } 4877}; 4878 4879OpenElementStack.prototype.clearBackToTableRowContext = function () { 4880 while (this.currentTagName !== $.TR && this.currentTagName !== $.TEMPLATE && this.currentTagName !== $.HTML) 4881 this.pop(); 4882}; 4883 4884OpenElementStack.prototype.remove = function (element) { 4885 for (var i = this.stackTop; i >= 0; i--) { 4886 if (this.items[i] === element) { 4887 this.items.splice(i, 1); 4888 this.stackTop--; 4889 this._updateCurrentElement(); 4890 break; 4891 } 4892 } 4893}; 4894 4895//Search 4896OpenElementStack.prototype.tryPeekProperlyNestedBodyElement = function () { 4897 //Properly nested <body> element (should be second element in stack). 4898 var element = this.items[1]; 4899 return element && this.treeAdapter.getTagName(element) === $.BODY ? element : null; 4900}; 4901 4902OpenElementStack.prototype.contains = function (element) { 4903 return this._indexOf(element) > -1; 4904}; 4905 4906OpenElementStack.prototype.getCommonAncestor = function (element) { 4907 var elementIdx = this._indexOf(element); 4908 4909 return --elementIdx >= 0 ? this.items[elementIdx] : null; 4910}; 4911 4912OpenElementStack.prototype.isRootHtmlElementCurrent = function () { 4913 return this.stackTop === 0 && this.currentTagName === $.HTML; 4914}; 4915 4916//Element in scope 4917OpenElementStack.prototype.hasInScope = function (tagName) { 4918 for (var i = this.stackTop; i >= 0; i--) { 4919 var tn = this.treeAdapter.getTagName(this.items[i]); 4920 4921 if (tn === tagName) 4922 return true; 4923 4924 var ns = this.treeAdapter.getNamespaceURI(this.items[i]); 4925 4926 if (isScopingElement(tn, ns)) 4927 return false; 4928 } 4929 4930 return true; 4931}; 4932 4933OpenElementStack.prototype.hasNumberedHeaderInScope = function () { 4934 for (var i = this.stackTop; i >= 0; i--) { 4935 var tn = this.treeAdapter.getTagName(this.items[i]); 4936 4937 if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6) 4938 return true; 4939 4940 if (isScopingElement(tn, this.treeAdapter.getNamespaceURI(this.items[i]))) 4941 return false; 4942 } 4943 4944 return true; 4945}; 4946 4947OpenElementStack.prototype.hasInListItemScope = function (tagName) { 4948 for (var i = this.stackTop; i >= 0; i--) { 4949 var tn = this.treeAdapter.getTagName(this.items[i]); 4950 4951 if (tn === tagName) 4952 return true; 4953 4954 var ns = this.treeAdapter.getNamespaceURI(this.items[i]); 4955 4956 if (((tn === $.UL || tn === $.OL) && ns === NS.HTML) || isScopingElement(tn, ns)) 4957 return false; 4958 } 4959 4960 return true; 4961}; 4962 4963OpenElementStack.prototype.hasInButtonScope = function (tagName) { 4964 for (var i = this.stackTop; i >= 0; i--) { 4965 var tn = this.treeAdapter.getTagName(this.items[i]); 4966 4967 if (tn === tagName) 4968 return true; 4969 4970 var ns = this.treeAdapter.getNamespaceURI(this.items[i]); 4971 4972 if ((tn === $.BUTTON && ns === NS.HTML) || isScopingElement(tn, ns)) 4973 return false; 4974 } 4975 4976 return true; 4977}; 4978 4979OpenElementStack.prototype.hasInTableScope = function (tagName) { 4980 for (var i = this.stackTop; i >= 0; i--) { 4981 var tn = this.treeAdapter.getTagName(this.items[i]); 4982 4983 if (tn === tagName) 4984 return true; 4985 4986 var ns = this.treeAdapter.getNamespaceURI(this.items[i]); 4987 4988 if ((tn === $.TABLE || tn === $.TEMPLATE || tn === $.HTML) && ns === NS.HTML) 4989 return false; 4990 } 4991 4992 return true; 4993}; 4994 4995OpenElementStack.prototype.hasTableBodyContextInTableScope = function () { 4996 for (var i = this.stackTop; i >= 0; i--) { 4997 var tn = this.treeAdapter.getTagName(this.items[i]); 4998 4999 if (tn === $.TBODY || tn === $.THEAD || tn === $.TFOOT) 5000 return true; 5001 5002 var ns = this.treeAdapter.getNamespaceURI(this.items[i]); 5003 5004 if ((tn === $.TABLE || tn === $.HTML) && ns === NS.HTML) 5005 return false; 5006 } 5007 5008 return true; 5009}; 5010 5011OpenElementStack.prototype.hasInSelectScope = function (tagName) { 5012 for (var i = this.stackTop; i >= 0; i--) { 5013 var tn = this.treeAdapter.getTagName(this.items[i]); 5014 5015 if (tn === tagName) 5016 return true; 5017 5018 var ns = this.treeAdapter.getNamespaceURI(this.items[i]); 5019 5020 if (tn !== $.OPTION && tn !== $.OPTGROUP && ns === NS.HTML) 5021 return false; 5022 } 5023 5024 return true; 5025}; 5026 5027//Implied end tags 5028OpenElementStack.prototype.generateImpliedEndTags = function () { 5029 while (isImpliedEndTagRequired(this.currentTagName)) 5030 this.pop(); 5031}; 5032 5033OpenElementStack.prototype.generateImpliedEndTagsWithExclusion = function (exclusionTagName) { 5034 while (isImpliedEndTagRequired(this.currentTagName) && this.currentTagName !== exclusionTagName) 5035 this.pop(); 5036}; 5037 5038},{"../common/html":3}],20:[function(require,module,exports){ 5039'use strict'; 5040 5041var Tokenizer = require('../tokenization/tokenizer'), 5042 OpenElementStack = require('./open_element_stack'), 5043 FormattingElementList = require('./formatting_element_list'), 5044 LocationInfoMixin = require('./location_info_mixin'), 5045 DefaultTreeAdapter = require('../tree_adapters/default'), 5046 Doctype = require('../common/doctype'), 5047 ForeignContent = require('../common/foreign_content'), 5048 Utils = require('../common/utils'), 5049 UNICODE = require('../common/unicode'), 5050 HTML = require('../common/html'); 5051 5052//Aliases 5053var $ = HTML.TAG_NAMES, 5054 NS = HTML.NAMESPACES, 5055 ATTRS = HTML.ATTRS; 5056 5057//Default options 5058var DEFAULT_OPTIONS = { 5059 decodeHtmlEntities: true, 5060 locationInfo: false 5061}; 5062 5063//Misc constants 5064var SEARCHABLE_INDEX_DEFAULT_PROMPT = 'This is a searchable index. Enter search keywords: ', 5065 SEARCHABLE_INDEX_INPUT_NAME = 'isindex', 5066 HIDDEN_INPUT_TYPE = 'hidden'; 5067 5068//Adoption agency loops iteration count 5069var AA_OUTER_LOOP_ITER = 8, 5070 AA_INNER_LOOP_ITER = 3; 5071 5072//Insertion modes 5073var INITIAL_MODE = 'INITIAL_MODE', 5074 BEFORE_HTML_MODE = 'BEFORE_HTML_MODE', 5075 BEFORE_HEAD_MODE = 'BEFORE_HEAD_MODE', 5076 IN_HEAD_MODE = 'IN_HEAD_MODE', 5077 AFTER_HEAD_MODE = 'AFTER_HEAD_MODE', 5078 IN_BODY_MODE = 'IN_BODY_MODE', 5079 TEXT_MODE = 'TEXT_MODE', 5080 IN_TABLE_MODE = 'IN_TABLE_MODE', 5081 IN_TABLE_TEXT_MODE = 'IN_TABLE_TEXT_MODE', 5082 IN_CAPTION_MODE = 'IN_CAPTION_MODE', 5083 IN_COLUMN_GROUP_MODE = 'IN_COLUMN_GROUP_MODE', 5084 IN_TABLE_BODY_MODE = 'IN_TABLE_BODY_MODE', 5085 IN_ROW_MODE = 'IN_ROW_MODE', 5086 IN_CELL_MODE = 'IN_CELL_MODE', 5087 IN_SELECT_MODE = 'IN_SELECT_MODE', 5088 IN_SELECT_IN_TABLE_MODE = 'IN_SELECT_IN_TABLE_MODE', 5089 IN_TEMPLATE_MODE = 'IN_TEMPLATE_MODE', 5090 AFTER_BODY_MODE = 'AFTER_BODY_MODE', 5091 IN_FRAMESET_MODE = 'IN_FRAMESET_MODE', 5092 AFTER_FRAMESET_MODE = 'AFTER_FRAMESET_MODE', 5093 AFTER_AFTER_BODY_MODE = 'AFTER_AFTER_BODY_MODE', 5094 AFTER_AFTER_FRAMESET_MODE = 'AFTER_AFTER_FRAMESET_MODE'; 5095 5096//Insertion mode reset map 5097var INSERTION_MODE_RESET_MAP = {}; 5098 5099INSERTION_MODE_RESET_MAP[$.TR] = IN_ROW_MODE; 5100INSERTION_MODE_RESET_MAP[$.TBODY] = 5101INSERTION_MODE_RESET_MAP[$.THEAD] = 5102INSERTION_MODE_RESET_MAP[$.TFOOT] = IN_TABLE_BODY_MODE; 5103INSERTION_MODE_RESET_MAP[$.CAPTION] = IN_CAPTION_MODE; 5104INSERTION_MODE_RESET_MAP[$.COLGROUP] = IN_COLUMN_GROUP_MODE; 5105INSERTION_MODE_RESET_MAP[$.TABLE] = IN_TABLE_MODE; 5106INSERTION_MODE_RESET_MAP[$.BODY] = IN_BODY_MODE; 5107INSERTION_MODE_RESET_MAP[$.FRAMESET] = IN_FRAMESET_MODE; 5108 5109//Template insertion mode switch map 5110var TEMPLATE_INSERTION_MODE_SWITCH_MAP = {}; 5111 5112TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.CAPTION] = 5113TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.COLGROUP] = 5114TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TBODY] = 5115TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TFOOT] = 5116TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.THEAD] = IN_TABLE_MODE; 5117TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.COL] = IN_COLUMN_GROUP_MODE; 5118TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TR] = IN_TABLE_BODY_MODE; 5119TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TD] = 5120TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TH] = IN_ROW_MODE; 5121 5122//Token handlers map for insertion modes 5123var _ = {}; 5124 5125_[INITIAL_MODE] = {}; 5126_[INITIAL_MODE][Tokenizer.CHARACTER_TOKEN] = 5127_[INITIAL_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInInitialMode; 5128_[INITIAL_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken; 5129_[INITIAL_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; 5130_[INITIAL_MODE][Tokenizer.DOCTYPE_TOKEN] = doctypeInInitialMode; 5131_[INITIAL_MODE][Tokenizer.START_TAG_TOKEN] = 5132_[INITIAL_MODE][Tokenizer.END_TAG_TOKEN] = 5133_[INITIAL_MODE][Tokenizer.EOF_TOKEN] = tokenInInitialMode; 5134 5135_[BEFORE_HTML_MODE] = {}; 5136_[BEFORE_HTML_MODE][Tokenizer.CHARACTER_TOKEN] = 5137_[BEFORE_HTML_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenBeforeHtml; 5138_[BEFORE_HTML_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken; 5139_[BEFORE_HTML_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; 5140_[BEFORE_HTML_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; 5141_[BEFORE_HTML_MODE][Tokenizer.START_TAG_TOKEN] = startTagBeforeHtml; 5142_[BEFORE_HTML_MODE][Tokenizer.END_TAG_TOKEN] = endTagBeforeHtml; 5143_[BEFORE_HTML_MODE][Tokenizer.EOF_TOKEN] = tokenBeforeHtml; 5144 5145_[BEFORE_HEAD_MODE] = {}; 5146_[BEFORE_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] = 5147_[BEFORE_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenBeforeHead; 5148_[BEFORE_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken; 5149_[BEFORE_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; 5150_[BEFORE_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; 5151_[BEFORE_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagBeforeHead; 5152_[BEFORE_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagBeforeHead; 5153_[BEFORE_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenBeforeHead; 5154 5155_[IN_HEAD_MODE] = {}; 5156_[IN_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] = 5157_[IN_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInHead; 5158_[IN_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters; 5159_[IN_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; 5160_[IN_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; 5161_[IN_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagInHead; 5162_[IN_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagInHead; 5163_[IN_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenInHead; 5164 5165_[AFTER_HEAD_MODE] = {}; 5166_[AFTER_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] = 5167_[AFTER_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterHead; 5168_[AFTER_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters; 5169_[AFTER_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; 5170_[AFTER_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; 5171_[AFTER_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterHead; 5172_[AFTER_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterHead; 5173_[AFTER_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenAfterHead; 5174 5175_[IN_BODY_MODE] = {}; 5176_[IN_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody; 5177_[IN_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; 5178_[IN_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody; 5179_[IN_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; 5180_[IN_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; 5181_[IN_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagInBody; 5182_[IN_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagInBody; 5183_[IN_BODY_MODE][Tokenizer.EOF_TOKEN] = eofInBody; 5184 5185_[TEXT_MODE] = {}; 5186_[TEXT_MODE][Tokenizer.CHARACTER_TOKEN] = 5187_[TEXT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = 5188_[TEXT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters; 5189_[TEXT_MODE][Tokenizer.COMMENT_TOKEN] = 5190_[TEXT_MODE][Tokenizer.DOCTYPE_TOKEN] = 5191_[TEXT_MODE][Tokenizer.START_TAG_TOKEN] = ignoreToken; 5192_[TEXT_MODE][Tokenizer.END_TAG_TOKEN] = endTagInText; 5193_[TEXT_MODE][Tokenizer.EOF_TOKEN] = eofInText; 5194 5195_[IN_TABLE_MODE] = {}; 5196_[IN_TABLE_MODE][Tokenizer.CHARACTER_TOKEN] = 5197_[IN_TABLE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = 5198_[IN_TABLE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable; 5199_[IN_TABLE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; 5200_[IN_TABLE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; 5201_[IN_TABLE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTable; 5202_[IN_TABLE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTable; 5203_[IN_TABLE_MODE][Tokenizer.EOF_TOKEN] = eofInBody; 5204 5205_[IN_TABLE_TEXT_MODE] = {}; 5206_[IN_TABLE_TEXT_MODE][Tokenizer.CHARACTER_TOKEN] = characterInTableText; 5207_[IN_TABLE_TEXT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; 5208_[IN_TABLE_TEXT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInTableText; 5209_[IN_TABLE_TEXT_MODE][Tokenizer.COMMENT_TOKEN] = 5210_[IN_TABLE_TEXT_MODE][Tokenizer.DOCTYPE_TOKEN] = 5211_[IN_TABLE_TEXT_MODE][Tokenizer.START_TAG_TOKEN] = 5212_[IN_TABLE_TEXT_MODE][Tokenizer.END_TAG_TOKEN] = 5213_[IN_TABLE_TEXT_MODE][Tokenizer.EOF_TOKEN] = tokenInTableText; 5214 5215_[IN_CAPTION_MODE] = {}; 5216_[IN_CAPTION_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody; 5217_[IN_CAPTION_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; 5218_[IN_CAPTION_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody; 5219_[IN_CAPTION_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; 5220_[IN_CAPTION_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; 5221_[IN_CAPTION_MODE][Tokenizer.START_TAG_TOKEN] = startTagInCaption; 5222_[IN_CAPTION_MODE][Tokenizer.END_TAG_TOKEN] = endTagInCaption; 5223_[IN_CAPTION_MODE][Tokenizer.EOF_TOKEN] = eofInBody; 5224 5225_[IN_COLUMN_GROUP_MODE] = {}; 5226_[IN_COLUMN_GROUP_MODE][Tokenizer.CHARACTER_TOKEN] = 5227_[IN_COLUMN_GROUP_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInColumnGroup; 5228_[IN_COLUMN_GROUP_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters; 5229_[IN_COLUMN_GROUP_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; 5230_[IN_COLUMN_GROUP_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; 5231_[IN_COLUMN_GROUP_MODE][Tokenizer.START_TAG_TOKEN] = startTagInColumnGroup; 5232_[IN_COLUMN_GROUP_MODE][Tokenizer.END_TAG_TOKEN] = endTagInColumnGroup; 5233_[IN_COLUMN_GROUP_MODE][Tokenizer.EOF_TOKEN] = eofInBody; 5234 5235_[IN_TABLE_BODY_MODE] = {}; 5236_[IN_TABLE_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = 5237_[IN_TABLE_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = 5238_[IN_TABLE_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable; 5239_[IN_TABLE_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; 5240_[IN_TABLE_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; 5241_[IN_TABLE_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTableBody; 5242_[IN_TABLE_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTableBody; 5243_[IN_TABLE_BODY_MODE][Tokenizer.EOF_TOKEN] = eofInBody; 5244 5245_[IN_ROW_MODE] = {}; 5246_[IN_ROW_MODE][Tokenizer.CHARACTER_TOKEN] = 5247_[IN_ROW_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = 5248_[IN_ROW_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable; 5249_[IN_ROW_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; 5250_[IN_ROW_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; 5251_[IN_ROW_MODE][Tokenizer.START_TAG_TOKEN] = startTagInRow; 5252_[IN_ROW_MODE][Tokenizer.END_TAG_TOKEN] = endTagInRow; 5253_[IN_ROW_MODE][Tokenizer.EOF_TOKEN] = eofInBody; 5254 5255_[IN_CELL_MODE] = {}; 5256_[IN_CELL_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody; 5257_[IN_CELL_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; 5258_[IN_CELL_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody; 5259_[IN_CELL_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; 5260_[IN_CELL_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; 5261_[IN_CELL_MODE][Tokenizer.START_TAG_TOKEN] = startTagInCell; 5262_[IN_CELL_MODE][Tokenizer.END_TAG_TOKEN] = endTagInCell; 5263_[IN_CELL_MODE][Tokenizer.EOF_TOKEN] = eofInBody; 5264 5265_[IN_SELECT_MODE] = {}; 5266_[IN_SELECT_MODE][Tokenizer.CHARACTER_TOKEN] = insertCharacters; 5267_[IN_SELECT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; 5268_[IN_SELECT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters; 5269_[IN_SELECT_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; 5270_[IN_SELECT_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; 5271_[IN_SELECT_MODE][Tokenizer.START_TAG_TOKEN] = startTagInSelect; 5272_[IN_SELECT_MODE][Tokenizer.END_TAG_TOKEN] = endTagInSelect; 5273_[IN_SELECT_MODE][Tokenizer.EOF_TOKEN] = eofInBody; 5274 5275_[IN_SELECT_IN_TABLE_MODE] = {}; 5276_[IN_SELECT_IN_TABLE_MODE][Tokenizer.CHARACTER_TOKEN] = insertCharacters; 5277_[IN_SELECT_IN_TABLE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; 5278_[IN_SELECT_IN_TABLE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters; 5279_[IN_SELECT_IN_TABLE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; 5280_[IN_SELECT_IN_TABLE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; 5281_[IN_SELECT_IN_TABLE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInSelectInTable; 5282_[IN_SELECT_IN_TABLE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInSelectInTable; 5283_[IN_SELECT_IN_TABLE_MODE][Tokenizer.EOF_TOKEN] = eofInBody; 5284 5285_[IN_TEMPLATE_MODE] = {}; 5286_[IN_TEMPLATE_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody; 5287_[IN_TEMPLATE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; 5288_[IN_TEMPLATE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody; 5289_[IN_TEMPLATE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; 5290_[IN_TEMPLATE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; 5291_[IN_TEMPLATE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTemplate; 5292_[IN_TEMPLATE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTemplate; 5293_[IN_TEMPLATE_MODE][Tokenizer.EOF_TOKEN] = eofInTemplate; 5294 5295_[AFTER_BODY_MODE] = {}; 5296_[AFTER_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = 5297_[AFTER_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterBody; 5298_[AFTER_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody; 5299_[AFTER_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToRootHtmlElement; 5300_[AFTER_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; 5301_[AFTER_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterBody; 5302_[AFTER_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterBody; 5303_[AFTER_BODY_MODE][Tokenizer.EOF_TOKEN] = stopParsing; 5304 5305_[IN_FRAMESET_MODE] = {}; 5306_[IN_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] = 5307_[IN_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; 5308_[IN_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters; 5309_[IN_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; 5310_[IN_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; 5311_[IN_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagInFrameset; 5312_[IN_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = endTagInFrameset; 5313_[IN_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing; 5314 5315_[AFTER_FRAMESET_MODE] = {}; 5316_[AFTER_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] = 5317_[AFTER_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; 5318_[AFTER_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters; 5319_[AFTER_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; 5320_[AFTER_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; 5321_[AFTER_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterFrameset; 5322_[AFTER_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterFrameset; 5323_[AFTER_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing; 5324 5325_[AFTER_AFTER_BODY_MODE] = {}; 5326_[AFTER_AFTER_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = tokenAfterAfterBody; 5327_[AFTER_AFTER_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterAfterBody; 5328_[AFTER_AFTER_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody; 5329_[AFTER_AFTER_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToDocument; 5330_[AFTER_AFTER_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; 5331_[AFTER_AFTER_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterAfterBody; 5332_[AFTER_AFTER_BODY_MODE][Tokenizer.END_TAG_TOKEN] = tokenAfterAfterBody; 5333_[AFTER_AFTER_BODY_MODE][Tokenizer.EOF_TOKEN] = stopParsing; 5334 5335_[AFTER_AFTER_FRAMESET_MODE] = {}; 5336_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] = 5337_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; 5338_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody; 5339_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToDocument; 5340_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; 5341_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterAfterFrameset; 5342_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = ignoreToken; 5343_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing; 5344 5345//Searchable index building utils (<isindex> tag) 5346function getSearchableIndexFormAttrs(isindexStartTagToken) { 5347 var indexAction = Tokenizer.getTokenAttr(isindexStartTagToken, ATTRS.ACTION), 5348 attrs = []; 5349 5350 if (indexAction !== null) { 5351 attrs.push({ 5352 name: ATTRS.ACTION, 5353 value: indexAction 5354 }); 5355 } 5356 5357 return attrs; 5358} 5359 5360function getSearchableIndexLabelText(isindexStartTagToken) { 5361 var indexPrompt = Tokenizer.getTokenAttr(isindexStartTagToken, ATTRS.PROMPT); 5362 5363 return indexPrompt === null ? SEARCHABLE_INDEX_DEFAULT_PROMPT : indexPrompt; 5364} 5365 5366function getSearchableIndexInputAttrs(isindexStartTagToken) { 5367 var isindexAttrs = isindexStartTagToken.attrs, 5368 inputAttrs = []; 5369 5370 for (var i = 0; i < isindexAttrs.length; i++) { 5371 var name = isindexAttrs[i].name; 5372 5373 if (name !== ATTRS.NAME && name !== ATTRS.ACTION && name !== ATTRS.PROMPT) 5374 inputAttrs.push(isindexAttrs[i]); 5375 } 5376 5377 inputAttrs.push({ 5378 name: ATTRS.NAME, 5379 value: SEARCHABLE_INDEX_INPUT_NAME 5380 }); 5381 5382 return inputAttrs; 5383} 5384 5385//Parser 5386var Parser = module.exports = function (treeAdapter, options) { 5387 this.treeAdapter = treeAdapter || DefaultTreeAdapter; 5388 this.options = Utils.mergeOptions(DEFAULT_OPTIONS, options); 5389 this.scriptHandler = null; 5390 5391 if (this.options.locationInfo) 5392 LocationInfoMixin.assign(this); 5393}; 5394 5395//API 5396Parser.prototype.parse = function (html) { 5397 var document = this.treeAdapter.createDocument(); 5398 5399 this._reset(html, document, null); 5400 this._runParsingLoop(); 5401 5402 return document; 5403}; 5404 5405Parser.prototype.parseFragment = function (html, fragmentContext) { 5406 //NOTE: use <template> element as a fragment context if context element was not provided, 5407 //so we will parse in "forgiving" manner 5408 if (!fragmentContext) 5409 fragmentContext = this.treeAdapter.createElement($.TEMPLATE, NS.HTML, []); 5410 5411 //NOTE: create fake element which will be used as 'document' for fragment parsing. 5412 //This is important for jsdom there 'document' can't be recreated, therefore 5413 //fragment parsing causes messing of the main `document`. 5414 var documentMock = this.treeAdapter.createElement('documentmock', NS.HTML, []); 5415 5416 this._reset(html, documentMock, fragmentContext); 5417 5418 if (this.treeAdapter.getTagName(fragmentContext) === $.TEMPLATE) 5419 this._pushTmplInsertionMode(IN_TEMPLATE_MODE); 5420 5421 this._initTokenizerForFragmentParsing(); 5422 this._insertFakeRootElement(); 5423 this._resetInsertionMode(); 5424 this._findFormInFragmentContext(); 5425 this._runParsingLoop(); 5426 5427 var rootElement = this.treeAdapter.getFirstChild(documentMock), 5428 fragment = this.treeAdapter.createDocumentFragment(); 5429 5430 this._adoptNodes(rootElement, fragment); 5431 5432 return fragment; 5433}; 5434 5435//Reset state 5436Parser.prototype._reset = function (html, document, fragmentContext) { 5437 this.tokenizer = new Tokenizer(html, this.options); 5438 5439 this.stopped = false; 5440 5441 this.insertionMode = INITIAL_MODE; 5442 this.originalInsertionMode = ''; 5443 5444 this.document = document; 5445 this.fragmentContext = fragmentContext; 5446 5447 this.headElement = null; 5448 this.formElement = null; 5449 5450 this.openElements = new OpenElementStack(this.document, this.treeAdapter); 5451 this.activeFormattingElements = new FormattingElementList(this.treeAdapter); 5452 5453 this.tmplInsertionModeStack = []; 5454 this.tmplInsertionModeStackTop = -1; 5455 this.currentTmplInsertionMode = null; 5456 5457 this.pendingCharacterTokens = []; 5458 this.hasNonWhitespacePendingCharacterToken = false; 5459 5460 this.framesetOk = true; 5461 this.skipNextNewLine = false; 5462 this.fosterParentingEnabled = false; 5463}; 5464 5465//Parsing loop 5466Parser.prototype._iterateParsingLoop = function () { 5467 this._setupTokenizerCDATAMode(); 5468 5469 var token = this.tokenizer.getNextToken(); 5470 5471 if (this.skipNextNewLine) { 5472 this.skipNextNewLine = false; 5473 5474 if (token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN && token.chars[0] === '\n') { 5475 if (token.chars.length === 1) 5476 return; 5477 5478 token.chars = token.chars.substr(1); 5479 } 5480 } 5481 5482 if (this._shouldProcessTokenInForeignContent(token)) 5483 this._processTokenInForeignContent(token); 5484 5485 else 5486 this._processToken(token); 5487}; 5488 5489Parser.prototype._runParsingLoop = function () { 5490 while (!this.stopped) 5491 this._iterateParsingLoop(); 5492}; 5493 5494//Text parsing 5495Parser.prototype._setupTokenizerCDATAMode = function () { 5496 var current = this._getAdjustedCurrentElement(); 5497 5498 this.tokenizer.allowCDATA = current && current !== this.document && 5499 this.treeAdapter.getNamespaceURI(current) !== NS.HTML && 5500 (!this._isHtmlIntegrationPoint(current)) && 5501 (!this._isMathMLTextIntegrationPoint(current)); 5502}; 5503 5504Parser.prototype._switchToTextParsing = function (currentToken, nextTokenizerState) { 5505 this._insertElement(currentToken, NS.HTML); 5506 this.tokenizer.state = nextTokenizerState; 5507 this.originalInsertionMode = this.insertionMode; 5508 this.insertionMode = TEXT_MODE; 5509}; 5510 5511//Fragment parsing 5512Parser.prototype._getAdjustedCurrentElement = function () { 5513 return this.openElements.stackTop === 0 && this.fragmentContext ? 5514 this.fragmentContext : 5515 this.openElements.current; 5516}; 5517 5518Parser.prototype._findFormInFragmentContext = function () { 5519 var node = this.fragmentContext; 5520 5521 do { 5522 if (this.treeAdapter.getTagName(node) === $.FORM) { 5523 this.formElement = node; 5524 break; 5525 } 5526 5527 node = this.treeAdapter.getParentNode(node); 5528 } while (node); 5529}; 5530 5531Parser.prototype._initTokenizerForFragmentParsing = function () { 5532 var tn = this.treeAdapter.getTagName(this.fragmentContext); 5533 5534 if (tn === $.TITLE || tn === $.TEXTAREA) 5535 this.tokenizer.state = Tokenizer.MODE.RCDATA; 5536 5537 else if (tn === $.STYLE || tn === $.XMP || tn === $.IFRAME || 5538 tn === $.NOEMBED || tn === $.NOFRAMES || tn === $.NOSCRIPT) { 5539 this.tokenizer.state = Tokenizer.MODE.RAWTEXT; 5540 } 5541 5542 else if (tn === $.SCRIPT) 5543 this.tokenizer.state = Tokenizer.MODE.SCRIPT_DATA; 5544 5545 else if (tn === $.PLAINTEXT) 5546 this.tokenizer.state = Tokenizer.MODE.PLAINTEXT; 5547}; 5548 5549//Tree mutation 5550Parser.prototype._setDocumentType = function (token) { 5551 this.treeAdapter.setDocumentType(this.document, token.name, token.publicId, token.systemId); 5552}; 5553 5554Parser.prototype._attachElementToTree = function (element) { 5555 if (this._shouldFosterParentOnInsertion()) 5556 this._fosterParentElement(element); 5557 5558 else { 5559 var parent = this.openElements.currentTmplContent || this.openElements.current; 5560 5561 this.treeAdapter.appendChild(parent, element); 5562 } 5563}; 5564 5565Parser.prototype._appendElement = function (token, namespaceURI) { 5566 var element = this.treeAdapter.createElement(token.tagName, namespaceURI, token.attrs); 5567 5568 this._attachElementToTree(element); 5569}; 5570 5571Parser.prototype._insertElement = function (token, namespaceURI) { 5572 var element = this.treeAdapter.createElement(token.tagName, namespaceURI, token.attrs); 5573 5574 this._attachElementToTree(element); 5575 this.openElements.push(element); 5576}; 5577 5578Parser.prototype._insertTemplate = function (token) { 5579 var tmpl = this.treeAdapter.createElement(token.tagName, NS.HTML, token.attrs), 5580 content = this.treeAdapter.createDocumentFragment(); 5581 5582 this.treeAdapter.appendChild(tmpl, content); 5583 this._attachElementToTree(tmpl); 5584 this.openElements.push(tmpl); 5585}; 5586 5587Parser.prototype._insertFakeRootElement = function () { 5588 var element = this.treeAdapter.createElement($.HTML, NS.HTML, []); 5589 5590 this.treeAdapter.appendChild(this.openElements.current, element); 5591 this.openElements.push(element); 5592}; 5593 5594Parser.prototype._appendCommentNode = function (token, parent) { 5595 var commentNode = this.treeAdapter.createCommentNode(token.data); 5596 5597 this.treeAdapter.appendChild(parent, commentNode); 5598}; 5599 5600Parser.prototype._insertCharacters = function (token) { 5601 if (this._shouldFosterParentOnInsertion()) 5602 this._fosterParentText(token.chars); 5603 5604 else { 5605 var parent = this.openElements.currentTmplContent || this.openElements.current; 5606 5607 this.treeAdapter.insertText(parent, token.chars); 5608 } 5609}; 5610 5611Parser.prototype._adoptNodes = function (donor, recipient) { 5612 while (true) { 5613 var child = this.treeAdapter.getFirstChild(donor); 5614 5615 if (!child) 5616 break; 5617 5618 this.treeAdapter.detachNode(child); 5619 this.treeAdapter.appendChild(recipient, child); 5620 } 5621}; 5622 5623//Token processing 5624Parser.prototype._shouldProcessTokenInForeignContent = function (token) { 5625 var current = this._getAdjustedCurrentElement(); 5626 5627 if (!current || current === this.document) 5628 return false; 5629 5630 var ns = this.treeAdapter.getNamespaceURI(current); 5631 5632 if (ns === NS.HTML) 5633 return false; 5634 5635 if (this.treeAdapter.getTagName(current) === $.ANNOTATION_XML && ns === NS.MATHML && 5636 token.type === Tokenizer.START_TAG_TOKEN && token.tagName === $.SVG) { 5637 return false; 5638 } 5639 5640 var isCharacterToken = token.type === Tokenizer.CHARACTER_TOKEN || 5641 token.type === Tokenizer.NULL_CHARACTER_TOKEN || 5642 token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN, 5643 isMathMLTextStartTag = token.type === Tokenizer.START_TAG_TOKEN && 5644 token.tagName !== $.MGLYPH && 5645 token.tagName !== $.MALIGNMARK; 5646 5647 if ((isMathMLTextStartTag || isCharacterToken) && this._isMathMLTextIntegrationPoint(current)) 5648 return false; 5649 5650 if ((token.type === Tokenizer.START_TAG_TOKEN || isCharacterToken) && this._isHtmlIntegrationPoint(current)) 5651 return false; 5652 5653 return token.type !== Tokenizer.EOF_TOKEN; 5654}; 5655 5656Parser.prototype._processToken = function (token) { 5657 _[this.insertionMode][token.type](this, token); 5658}; 5659 5660Parser.prototype._processTokenInBodyMode = function (token) { 5661 _[IN_BODY_MODE][token.type](this, token); 5662}; 5663 5664Parser.prototype._processTokenInForeignContent = function (token) { 5665 if (token.type === Tokenizer.CHARACTER_TOKEN) 5666 characterInForeignContent(this, token); 5667 5668 else if (token.type === Tokenizer.NULL_CHARACTER_TOKEN) 5669 nullCharacterInForeignContent(this, token); 5670 5671 else if (token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN) 5672 insertCharacters(this, token); 5673 5674 else if (token.type === Tokenizer.COMMENT_TOKEN) 5675 appendComment(this, token); 5676 5677 else if (token.type === Tokenizer.START_TAG_TOKEN) 5678 startTagInForeignContent(this, token); 5679 5680 else if (token.type === Tokenizer.END_TAG_TOKEN) 5681 endTagInForeignContent(this, token); 5682}; 5683 5684Parser.prototype._processFakeStartTagWithAttrs = function (tagName, attrs) { 5685 var fakeToken = this.tokenizer.buildStartTagToken(tagName); 5686 5687 fakeToken.attrs = attrs; 5688 this._processToken(fakeToken); 5689}; 5690 5691Parser.prototype._processFakeStartTag = function (tagName) { 5692 var fakeToken = this.tokenizer.buildStartTagToken(tagName); 5693 5694 this._processToken(fakeToken); 5695 return fakeToken; 5696}; 5697 5698Parser.prototype._processFakeEndTag = function (tagName) { 5699 var fakeToken = this.tokenizer.buildEndTagToken(tagName); 5700 5701 this._processToken(fakeToken); 5702 return fakeToken; 5703}; 5704 5705//Integration points 5706Parser.prototype._isMathMLTextIntegrationPoint = function (element) { 5707 var tn = this.treeAdapter.getTagName(element), 5708 ns = this.treeAdapter.getNamespaceURI(element); 5709 5710 return ForeignContent.isMathMLTextIntegrationPoint(tn, ns); 5711}; 5712 5713Parser.prototype._isHtmlIntegrationPoint = function (element) { 5714 var tn = this.treeAdapter.getTagName(element), 5715 ns = this.treeAdapter.getNamespaceURI(element), 5716 attrs = this.treeAdapter.getAttrList(element); 5717 5718 return ForeignContent.isHtmlIntegrationPoint(tn, ns, attrs); 5719}; 5720 5721//Active formatting elements reconstruction 5722Parser.prototype._reconstructActiveFormattingElements = function () { 5723 var listLength = this.activeFormattingElements.length; 5724 5725 if (listLength) { 5726 var unopenIdx = listLength, 5727 entry = null; 5728 5729 do { 5730 unopenIdx--; 5731 entry = this.activeFormattingElements.entries[unopenIdx]; 5732 5733 if (entry.type === FormattingElementList.MARKER_ENTRY || this.openElements.contains(entry.element)) { 5734 unopenIdx++; 5735 break; 5736 } 5737 } while (unopenIdx > 0); 5738 5739 for (var i = unopenIdx; i < listLength; i++) { 5740 entry = this.activeFormattingElements.entries[i]; 5741 this._insertElement(entry.token, this.treeAdapter.getNamespaceURI(entry.element)); 5742 entry.element = this.openElements.current; 5743 } 5744 } 5745}; 5746 5747//Close elements 5748Parser.prototype._closeTableCell = function () { 5749 if (this.openElements.hasInTableScope($.TD)) 5750 this._processFakeEndTag($.TD); 5751 5752 else 5753 this._processFakeEndTag($.TH); 5754}; 5755 5756Parser.prototype._closePElement = function () { 5757 this.openElements.generateImpliedEndTagsWithExclusion($.P); 5758 this.openElements.popUntilTagNamePopped($.P); 5759}; 5760 5761//Insertion modes 5762Parser.prototype._resetInsertionMode = function () { 5763 for (var i = this.openElements.stackTop, last = false; i >= 0; i--) { 5764 var element = this.openElements.items[i]; 5765 5766 if (i === 0) { 5767 last = true; 5768 5769 if (this.fragmentContext) 5770 element = this.fragmentContext; 5771 } 5772 5773 var tn = this.treeAdapter.getTagName(element), 5774 newInsertionMode = INSERTION_MODE_RESET_MAP[tn]; 5775 5776 if (newInsertionMode) { 5777 this.insertionMode = newInsertionMode; 5778 break; 5779 } 5780 5781 else if (!last && (tn === $.TD || tn === $.TH)) { 5782 this.insertionMode = IN_CELL_MODE; 5783 break; 5784 } 5785 5786 else if (!last && tn === $.HEAD) { 5787 this.insertionMode = IN_HEAD_MODE; 5788 break; 5789 } 5790 5791 else if (tn === $.SELECT) { 5792 this._resetInsertionModeForSelect(i); 5793 break; 5794 } 5795 5796 else if (tn === $.TEMPLATE) { 5797 this.insertionMode = this.currentTmplInsertionMode; 5798 break; 5799 } 5800 5801 else if (tn === $.HTML) { 5802 this.insertionMode = this.headElement ? AFTER_HEAD_MODE : BEFORE_HEAD_MODE; 5803 break; 5804 } 5805 5806 else if (last) { 5807 this.insertionMode = IN_BODY_MODE; 5808 break; 5809 } 5810 } 5811}; 5812 5813Parser.prototype._resetInsertionModeForSelect = function (selectIdx) { 5814 if (selectIdx > 0) { 5815 for (var i = selectIdx - 1; i > 0; i--) { 5816 var ancestor = this.openElements.items[i], 5817 tn = this.treeAdapter.getTagName(ancestor); 5818 5819 if (tn === $.TEMPLATE) 5820 break; 5821 5822 else if (tn === $.TABLE) { 5823 this.insertionMode = IN_SELECT_IN_TABLE_MODE; 5824 return; 5825 } 5826 } 5827 } 5828 5829 this.insertionMode = IN_SELECT_MODE; 5830}; 5831 5832Parser.prototype._pushTmplInsertionMode = function (mode) { 5833 this.tmplInsertionModeStack.push(mode); 5834 this.tmplInsertionModeStackTop++; 5835 this.currentTmplInsertionMode = mode; 5836}; 5837 5838Parser.prototype._popTmplInsertionMode = function () { 5839 this.tmplInsertionModeStack.pop(); 5840 this.tmplInsertionModeStackTop--; 5841 this.currentTmplInsertionMode = this.tmplInsertionModeStack[this.tmplInsertionModeStackTop]; 5842}; 5843 5844//Foster parenting 5845Parser.prototype._isElementCausesFosterParenting = function (element) { 5846 var tn = this.treeAdapter.getTagName(element); 5847 5848 return tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT || tn == $.THEAD || tn === $.TR; 5849}; 5850 5851Parser.prototype._shouldFosterParentOnInsertion = function () { 5852 return this.fosterParentingEnabled && this._isElementCausesFosterParenting(this.openElements.current); 5853}; 5854 5855Parser.prototype._findFosterParentingLocation = function () { 5856 var location = { 5857 parent: null, 5858 beforeElement: null 5859 }; 5860 5861 for (var i = this.openElements.stackTop; i >= 0; i--) { 5862 var openElement = this.openElements.items[i], 5863 tn = this.treeAdapter.getTagName(openElement), 5864 ns = this.treeAdapter.getNamespaceURI(openElement); 5865 5866 if (tn === $.TEMPLATE && ns === NS.HTML) { 5867 location.parent = this.treeAdapter.getChildNodes(openElement)[0]; 5868 break; 5869 } 5870 5871 else if (tn === $.TABLE) { 5872 location.parent = this.treeAdapter.getParentNode(openElement); 5873 5874 if (location.parent) 5875 location.beforeElement = openElement; 5876 else 5877 location.parent = this.openElements.items[i - 1]; 5878 5879 break; 5880 } 5881 } 5882 5883 if (!location.parent) 5884 location.parent = this.openElements.items[0]; 5885 5886 return location; 5887}; 5888 5889Parser.prototype._fosterParentElement = function (element) { 5890 var location = this._findFosterParentingLocation(); 5891 5892 if (location.beforeElement) 5893 this.treeAdapter.insertBefore(location.parent, element, location.beforeElement); 5894 else 5895 this.treeAdapter.appendChild(location.parent, element); 5896}; 5897 5898Parser.prototype._fosterParentText = function (chars) { 5899 var location = this._findFosterParentingLocation(); 5900 5901 if (location.beforeElement) 5902 this.treeAdapter.insertTextBefore(location.parent, chars, location.beforeElement); 5903 else 5904 this.treeAdapter.insertText(location.parent, chars); 5905}; 5906 5907//Special elements 5908Parser.prototype._isSpecialElement = function (element) { 5909 var tn = this.treeAdapter.getTagName(element), 5910 ns = this.treeAdapter.getNamespaceURI(element); 5911 5912 return HTML.SPECIAL_ELEMENTS[ns][tn]; 5913}; 5914 5915//Adoption agency algorithm 5916//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tree-construction.html#adoptionAgency) 5917//------------------------------------------------------------------ 5918 5919//Steps 5-8 of the algorithm 5920function aaObtainFormattingElementEntry(p, token) { 5921 var formattingElementEntry = p.activeFormattingElements.getElementEntryInScopeWithTagName(token.tagName); 5922 5923 if (formattingElementEntry) { 5924 if (!p.openElements.contains(formattingElementEntry.element)) { 5925 p.activeFormattingElements.removeEntry(formattingElementEntry); 5926 formattingElementEntry = null; 5927 } 5928 5929 else if (!p.openElements.hasInScope(token.tagName)) 5930 formattingElementEntry = null; 5931 } 5932 5933 else 5934 genericEndTagInBody(p, token); 5935 5936 return formattingElementEntry; 5937} 5938 5939//Steps 9 and 10 of the algorithm 5940function aaObtainFurthestBlock(p, formattingElementEntry) { 5941 var furthestBlock = null; 5942 5943 for (var i = p.openElements.stackTop; i >= 0; i--) { 5944 var element = p.openElements.items[i]; 5945 5946 if (element === formattingElementEntry.element) 5947 break; 5948 5949 if (p._isSpecialElement(element)) 5950 furthestBlock = element; 5951 } 5952 5953 if (!furthestBlock) { 5954 p.openElements.popUntilElementPopped(formattingElementEntry.element); 5955 p.activeFormattingElements.removeEntry(formattingElementEntry); 5956 } 5957 5958 return furthestBlock; 5959} 5960 5961//Step 13 of the algorithm 5962function aaInnerLoop(p, furthestBlock, formattingElement) { 5963 var element = null, 5964 lastElement = furthestBlock, 5965 nextElement = p.openElements.getCommonAncestor(furthestBlock); 5966 5967 for (var i = 0; i < AA_INNER_LOOP_ITER; i++) { 5968 element = nextElement; 5969 5970 //NOTE: store next element for the next loop iteration (it may be deleted from the stack by step 9.5) 5971 nextElement = p.openElements.getCommonAncestor(element); 5972 5973 var elementEntry = p.activeFormattingElements.getElementEntry(element); 5974 5975 if (!elementEntry) { 5976 p.openElements.remove(element); 5977 continue; 5978 } 5979 5980 if (element === formattingElement) 5981 break; 5982 5983 element = aaRecreateElementFromEntry(p, elementEntry); 5984 5985 if (lastElement === furthestBlock) 5986 p.activeFormattingElements.bookmark = elementEntry; 5987 5988 p.treeAdapter.detachNode(lastElement); 5989 p.treeAdapter.appendChild(element, lastElement); 5990 lastElement = element; 5991 } 5992 5993 return lastElement; 5994} 5995 5996//Step 13.7 of the algorithm 5997function aaRecreateElementFromEntry(p, elementEntry) { 5998 var ns = p.treeAdapter.getNamespaceURI(elementEntry.element), 5999 newElement = p.treeAdapter.createElement(elementEntry.token.tagName, ns, elementEntry.token.attrs); 6000 6001 p.openElements.replace(elementEntry.element, newElement); 6002 elementEntry.element = newElement; 6003 6004 return newElement; 6005} 6006 6007//Step 14 of the algorithm 6008function aaInsertLastNodeInCommonAncestor(p, commonAncestor, lastElement) { 6009 if (p._isElementCausesFosterParenting(commonAncestor)) 6010 p._fosterParentElement(lastElement); 6011 6012 else { 6013 var tn = p.treeAdapter.getTagName(commonAncestor), 6014 ns = p.treeAdapter.getNamespaceURI(commonAncestor); 6015 6016 if (tn === $.TEMPLATE && ns === NS.HTML) 6017 commonAncestor = p.treeAdapter.getChildNodes(commonAncestor)[0]; 6018 6019 p.treeAdapter.appendChild(commonAncestor, lastElement); 6020 } 6021} 6022 6023//Steps 15-19 of the algorithm 6024function aaReplaceFormattingElement(p, furthestBlock, formattingElementEntry) { 6025 var ns = p.treeAdapter.getNamespaceURI(formattingElementEntry.element), 6026 token = formattingElementEntry.token, 6027 newElement = p.treeAdapter.createElement(token.tagName, ns, token.attrs); 6028 6029 p._adoptNodes(furthestBlock, newElement); 6030 p.treeAdapter.appendChild(furthestBlock, newElement); 6031 6032 p.activeFormattingElements.insertElementAfterBookmark(newElement, formattingElementEntry.token); 6033 p.activeFormattingElements.removeEntry(formattingElementEntry); 6034 6035 p.openElements.remove(formattingElementEntry.element); 6036 p.openElements.insertAfter(furthestBlock, newElement); 6037} 6038 6039//Algorithm entry point 6040function callAdoptionAgency(p, token) { 6041 for (var i = 0; i < AA_OUTER_LOOP_ITER; i++) { 6042 var formattingElementEntry = aaObtainFormattingElementEntry(p, token, formattingElementEntry); 6043 6044 if (!formattingElementEntry) 6045 break; 6046 6047 var furthestBlock = aaObtainFurthestBlock(p, formattingElementEntry); 6048 6049 if (!furthestBlock) 6050 break; 6051 6052 p.activeFormattingElements.bookmark = formattingElementEntry; 6053 6054 var lastElement = aaInnerLoop(p, furthestBlock, formattingElementEntry.element), 6055 commonAncestor = p.openElements.getCommonAncestor(formattingElementEntry.element); 6056 6057 p.treeAdapter.detachNode(lastElement); 6058 aaInsertLastNodeInCommonAncestor(p, commonAncestor, lastElement); 6059 aaReplaceFormattingElement(p, furthestBlock, formattingElementEntry); 6060 } 6061} 6062 6063 6064//Generic token handlers 6065//------------------------------------------------------------------ 6066function ignoreToken(p, token) { 6067 //NOTE: do nothing =) 6068} 6069 6070function appendComment(p, token) { 6071 p._appendCommentNode(token, p.openElements.currentTmplContent || p.openElements.current) 6072} 6073 6074function appendCommentToRootHtmlElement(p, token) { 6075 p._appendCommentNode(token, p.openElements.items[0]); 6076} 6077 6078function appendCommentToDocument(p, token) { 6079 p._appendCommentNode(token, p.document); 6080} 6081 6082function insertCharacters(p, token) { 6083 p._insertCharacters(token); 6084} 6085 6086function stopParsing(p, token) { 6087 p.stopped = true; 6088} 6089 6090//12.2.5.4.1 The "initial" insertion mode 6091//------------------------------------------------------------------ 6092function doctypeInInitialMode(p, token) { 6093 p._setDocumentType(token); 6094 6095 if (token.forceQuirks || Doctype.isQuirks(token.name, token.publicId, token.systemId)) 6096 p.treeAdapter.setQuirksMode(p.document); 6097 6098 p.insertionMode = BEFORE_HTML_MODE; 6099} 6100 6101function tokenInInitialMode(p, token) { 6102 p.treeAdapter.setQuirksMode(p.document); 6103 p.insertionMode = BEFORE_HTML_MODE; 6104 p._processToken(token); 6105} 6106 6107 6108//12.2.5.4.2 The "before html" insertion mode 6109//------------------------------------------------------------------ 6110function startTagBeforeHtml(p, token) { 6111 if (token.tagName === $.HTML) { 6112 p._insertElement(token, NS.HTML); 6113 p.insertionMode = BEFORE_HEAD_MODE; 6114 } 6115 6116 else 6117 tokenBeforeHtml(p, token); 6118} 6119 6120function endTagBeforeHtml(p, token) { 6121 var tn = token.tagName; 6122 6123 if (tn === $.HTML || tn === $.HEAD || tn === $.BODY || tn === $.BR) 6124 tokenBeforeHtml(p, token); 6125} 6126 6127function tokenBeforeHtml(p, token) { 6128 p._insertFakeRootElement(); 6129 p.insertionMode = BEFORE_HEAD_MODE; 6130 p._processToken(token); 6131} 6132 6133 6134//12.2.5.4.3 The "before head" insertion mode 6135//------------------------------------------------------------------ 6136function startTagBeforeHead(p, token) { 6137 var tn = token.tagName; 6138 6139 if (tn === $.HTML) 6140 startTagInBody(p, token); 6141 6142 else if (tn === $.HEAD) { 6143 p._insertElement(token, NS.HTML); 6144 p.headElement = p.openElements.current; 6145 p.insertionMode = IN_HEAD_MODE; 6146 } 6147 6148 else 6149 tokenBeforeHead(p, token); 6150} 6151 6152function endTagBeforeHead(p, token) { 6153 var tn = token.tagName; 6154 6155 if (tn === $.HEAD || tn === $.BODY || tn === $.HTML || tn === $.BR) 6156 tokenBeforeHead(p, token); 6157} 6158 6159function tokenBeforeHead(p, token) { 6160 p._processFakeStartTag($.HEAD); 6161 p._processToken(token); 6162} 6163 6164 6165//12.2.5.4.4 The "in head" insertion mode 6166//------------------------------------------------------------------ 6167function startTagInHead(p, token) { 6168 var tn = token.tagName; 6169 6170 if (tn === $.HTML) 6171 startTagInBody(p, token); 6172 6173 else if (tn === $.BASE || tn === $.BASEFONT || tn === $.BGSOUND || 6174 tn === $.COMMAND || tn === $.LINK || tn === $.META) { 6175 p._appendElement(token, NS.HTML); 6176 } 6177 6178 else if (tn === $.TITLE) 6179 p._switchToTextParsing(token, Tokenizer.MODE.RCDATA); 6180 6181 //NOTE: here we assume that we always act as an interactive user agent with enabled scripting, so we parse 6182 //<noscript> as a rawtext. 6183 else if (tn === $.NOSCRIPT || tn === $.NOFRAMES || tn === $.STYLE) 6184 p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT); 6185 6186 else if (tn === $.SCRIPT) 6187 p._switchToTextParsing(token, Tokenizer.MODE.SCRIPT_DATA); 6188 6189 else if (tn === $.TEMPLATE) { 6190 p._insertTemplate(token, NS.HTML); 6191 p.activeFormattingElements.insertMarker(); 6192 p.framesetOk = false; 6193 p.insertionMode = IN_TEMPLATE_MODE; 6194 p._pushTmplInsertionMode(IN_TEMPLATE_MODE); 6195 } 6196 6197 else if (tn !== $.HEAD) 6198 tokenInHead(p, token); 6199} 6200 6201function endTagInHead(p, token) { 6202 var tn = token.tagName; 6203 6204 if (tn === $.HEAD) { 6205 p.openElements.pop(); 6206 p.insertionMode = AFTER_HEAD_MODE; 6207 } 6208 6209 else if (tn === $.BODY || tn === $.BR || tn === $.HTML) 6210 tokenInHead(p, token); 6211 6212 else if (tn === $.TEMPLATE && p.openElements.tmplCount > 0) { 6213 p.openElements.generateImpliedEndTags(); 6214 p.openElements.popUntilTemplatePopped(); 6215 p.activeFormattingElements.clearToLastMarker(); 6216 p._popTmplInsertionMode(); 6217 p._resetInsertionMode(); 6218 } 6219} 6220 6221function tokenInHead(p, token) { 6222 p._processFakeEndTag($.HEAD); 6223 p._processToken(token); 6224} 6225 6226 6227//12.2.5.4.6 The "after head" insertion mode 6228//------------------------------------------------------------------ 6229function startTagAfterHead(p, token) { 6230 var tn = token.tagName; 6231 6232 if (tn === $.HTML) 6233 startTagInBody(p, token); 6234 6235 else if (tn === $.BODY) { 6236 p._insertElement(token, NS.HTML); 6237 p.framesetOk = false; 6238 p.insertionMode = IN_BODY_MODE; 6239 } 6240 6241 else if (tn === $.FRAMESET) { 6242 p._insertElement(token, NS.HTML); 6243 p.insertionMode = IN_FRAMESET_MODE; 6244 } 6245 6246 else if (tn === $.BASE || tn === $.BASEFONT || tn === $.BGSOUND || tn === $.LINK || tn === $.META || 6247 tn === $.NOFRAMES || tn === $.SCRIPT || tn === $.STYLE || tn === $.TEMPLATE || tn === $.TITLE) { 6248 p.openElements.push(p.headElement); 6249 startTagInHead(p, token); 6250 p.openElements.remove(p.headElement); 6251 } 6252 6253 else if (tn !== $.HEAD) 6254 tokenAfterHead(p, token); 6255} 6256 6257function endTagAfterHead(p, token) { 6258 var tn = token.tagName; 6259 6260 if (tn === $.BODY || tn === $.HTML || tn === $.BR) 6261 tokenAfterHead(p, token); 6262 6263 else if (tn === $.TEMPLATE) 6264 endTagInHead(p, token); 6265} 6266 6267function tokenAfterHead(p, token) { 6268 p._processFakeStartTag($.BODY); 6269 p.framesetOk = true; 6270 p._processToken(token); 6271} 6272 6273 6274//12.2.5.4.7 The "in body" insertion mode 6275//------------------------------------------------------------------ 6276function whitespaceCharacterInBody(p, token) { 6277 p._reconstructActiveFormattingElements(); 6278 p._insertCharacters(token); 6279} 6280 6281function characterInBody(p, token) { 6282 p._reconstructActiveFormattingElements(); 6283 p._insertCharacters(token); 6284 p.framesetOk = false; 6285} 6286 6287function htmlStartTagInBody(p, token) { 6288 if (p.openElements.tmplCount === 0) 6289 p.treeAdapter.adoptAttributes(p.openElements.items[0], token.attrs); 6290} 6291 6292function bodyStartTagInBody(p, token) { 6293 var bodyElement = p.openElements.tryPeekProperlyNestedBodyElement(); 6294 6295 if (bodyElement && p.openElements.tmplCount === 0) { 6296 p.framesetOk = false; 6297 p.treeAdapter.adoptAttributes(bodyElement, token.attrs); 6298 } 6299} 6300 6301function framesetStartTagInBody(p, token) { 6302 var bodyElement = p.openElements.tryPeekProperlyNestedBodyElement(); 6303 6304 if (p.framesetOk && bodyElement) { 6305 p.treeAdapter.detachNode(bodyElement); 6306 p.openElements.popAllUpToHtmlElement(); 6307 p._insertElement(token, NS.HTML); 6308 p.insertionMode = IN_FRAMESET_MODE; 6309 } 6310} 6311 6312function addressStartTagInBody(p, token) { 6313 if (p.openElements.hasInButtonScope($.P)) 6314 p._closePElement(); 6315 6316 p._insertElement(token, NS.HTML); 6317} 6318 6319function numberedHeaderStartTagInBody(p, token) { 6320 if (p.openElements.hasInButtonScope($.P)) 6321 p._closePElement(); 6322 6323 var tn = p.openElements.currentTagName; 6324 6325 if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6) 6326 p.openElements.pop(); 6327 6328 p._insertElement(token, NS.HTML); 6329} 6330 6331function preStartTagInBody(p, token) { 6332 if (p.openElements.hasInButtonScope($.P)) 6333 p._closePElement(); 6334 6335 p._insertElement(token, NS.HTML); 6336 //NOTE: If the next token is a U+000A LINE FEED (LF) character token, then ignore that token and move 6337 //on to the next one. (Newlines at the start of pre blocks are ignored as an authoring convenience.) 6338 p.skipNextNewLine = true; 6339 p.framesetOk = false; 6340} 6341 6342function formStartTagInBody(p, token) { 6343 var inTemplate = p.openElements.tmplCount > 0; 6344 6345 if (!p.formElement || inTemplate) { 6346 if (p.openElements.hasInButtonScope($.P)) 6347 p._closePElement(); 6348 6349 p._insertElement(token, NS.HTML); 6350 6351 if (!inTemplate) 6352 p.formElement = p.openElements.current; 6353 } 6354} 6355 6356function listItemStartTagInBody(p, token) { 6357 p.framesetOk = false; 6358 6359 for (var i = p.openElements.stackTop; i >= 0; i--) { 6360 var element = p.openElements.items[i], 6361 tn = p.treeAdapter.getTagName(element); 6362 6363 if ((token.tagName === $.LI && tn === $.LI) || 6364 ((token.tagName === $.DD || token.tagName === $.DT) && (tn === $.DD || tn == $.DT))) { 6365 p._processFakeEndTag(tn); 6366 break; 6367 } 6368 6369 if (tn !== $.ADDRESS && tn !== $.DIV && tn !== $.P && p._isSpecialElement(element)) 6370 break; 6371 } 6372 6373 if (p.openElements.hasInButtonScope($.P)) 6374 p._closePElement(); 6375 6376 p._insertElement(token, NS.HTML); 6377} 6378 6379function plaintextStartTagInBody(p, token) { 6380 if (p.openElements.hasInButtonScope($.P)) 6381 p._closePElement(); 6382 6383 p._insertElement(token, NS.HTML); 6384 p.tokenizer.state = Tokenizer.MODE.PLAINTEXT; 6385} 6386 6387function buttonStartTagInBody(p, token) { 6388 if (p.openElements.hasInScope($.BUTTON)) { 6389 p._processFakeEndTag($.BUTTON); 6390 buttonStartTagInBody(p, token); 6391 } 6392 6393 else { 6394 p._reconstructActiveFormattingElements(); 6395 p._insertElement(token, NS.HTML); 6396 p.framesetOk = false; 6397 } 6398} 6399 6400function aStartTagInBody(p, token) { 6401 var activeElementEntry = p.activeFormattingElements.getElementEntryInScopeWithTagName($.A); 6402 6403 if (activeElementEntry) { 6404 p._processFakeEndTag($.A); 6405 p.openElements.remove(activeElementEntry.element); 6406 p.activeFormattingElements.removeEntry(activeElementEntry); 6407 } 6408 6409 p._reconstructActiveFormattingElements(); 6410 p._insertElement(token, NS.HTML); 6411 p.activeFormattingElements.pushElement(p.openElements.current, token); 6412} 6413 6414function bStartTagInBody(p, token) { 6415 p._reconstructActiveFormattingElements(); 6416 p._insertElement(token, NS.HTML); 6417 p.activeFormattingElements.pushElement(p.openElements.current, token); 6418} 6419 6420function nobrStartTagInBody(p, token) { 6421 p._reconstructActiveFormattingElements(); 6422 6423 if (p.openElements.hasInScope($.NOBR)) { 6424 p._processFakeEndTag($.NOBR); 6425 p._reconstructActiveFormattingElements(); 6426 } 6427 6428 p._insertElement(token, NS.HTML); 6429 p.activeFormattingElements.pushElement(p.openElements.current, token); 6430} 6431 6432function appletStartTagInBody(p, token) { 6433 p._reconstructActiveFormattingElements(); 6434 p._insertElement(token, NS.HTML); 6435 p.activeFormattingElements.insertMarker(); 6436 p.framesetOk = false; 6437} 6438 6439function tableStartTagInBody(p, token) { 6440 if (!p.treeAdapter.isQuirksMode(p.document) && p.openElements.hasInButtonScope($.P)) 6441 p._closePElement(); 6442 6443 p._insertElement(token, NS.HTML); 6444 p.framesetOk = false; 6445 p.insertionMode = IN_TABLE_MODE; 6446} 6447 6448function areaStartTagInBody(p, token) { 6449 p._reconstructActiveFormattingElements(); 6450 p._appendElement(token, NS.HTML); 6451 p.framesetOk = false; 6452} 6453 6454function inputStartTagInBody(p, token) { 6455 p._reconstructActiveFormattingElements(); 6456 p._appendElement(token, NS.HTML); 6457 6458 var inputType = Tokenizer.getTokenAttr(token, ATTRS.TYPE); 6459 6460 if (!inputType || inputType.toLowerCase() !== HIDDEN_INPUT_TYPE) 6461 p.framesetOk = false; 6462 6463} 6464 6465function paramStartTagInBody(p, token) { 6466 p._appendElement(token, NS.HTML); 6467} 6468 6469function hrStartTagInBody(p, token) { 6470 if (p.openElements.hasInButtonScope($.P)) 6471 p._closePElement(); 6472 6473 p._appendElement(token, NS.HTML); 6474 p.framesetOk = false; 6475} 6476 6477function imageStartTagInBody(p, token) { 6478 token.tagName = $.IMG; 6479 areaStartTagInBody(p, token); 6480} 6481 6482function isindexStartTagInBody(p, token) { 6483 if (!p.formElement || p.openElements.tmplCount > 0) { 6484 p._processFakeStartTagWithAttrs($.FORM, getSearchableIndexFormAttrs(token)); 6485 p._processFakeStartTag($.HR); 6486 p._processFakeStartTag($.LABEL); 6487 p.treeAdapter.insertText(p.openElements.current, getSearchableIndexLabelText(token)); 6488 p._processFakeStartTagWithAttrs($.INPUT, getSearchableIndexInputAttrs(token)); 6489 p._processFakeEndTag($.LABEL); 6490 p._processFakeStartTag($.HR); 6491 p._processFakeEndTag($.FORM); 6492 } 6493} 6494 6495function textareaStartTagInBody(p, token) { 6496 p._insertElement(token, NS.HTML); 6497 //NOTE: If the next token is a U+000A LINE FEED (LF) character token, then ignore that token and move 6498 //on to the next one. (Newlines at the start of textarea elements are ignored as an authoring convenience.) 6499 p.skipNextNewLine = true; 6500 p.tokenizer.state = Tokenizer.MODE.RCDATA; 6501 p.originalInsertionMode = p.insertionMode; 6502 p.framesetOk = false; 6503 p.insertionMode = TEXT_MODE; 6504} 6505 6506function xmpStartTagInBody(p, token) { 6507 if (p.openElements.hasInButtonScope($.P)) 6508 p._closePElement(); 6509 6510 p._reconstructActiveFormattingElements(); 6511 p.framesetOk = false; 6512 p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT); 6513} 6514 6515function iframeStartTagInBody(p, token) { 6516 p.framesetOk = false; 6517 p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT); 6518} 6519 6520//NOTE: here we assume that we always act as an user agent with enabled plugins, so we parse 6521//<noembed> as a rawtext. 6522function noembedStartTagInBody(p, token) { 6523 p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT); 6524} 6525 6526function selectStartTagInBody(p, token) { 6527 p._reconstructActiveFormattingElements(); 6528 p._insertElement(token, NS.HTML); 6529 p.framesetOk = false; 6530 6531 if (p.insertionMode === IN_TABLE_MODE || p.insertionMode === IN_CAPTION_MODE || 6532 p.insertionMode === IN_TABLE_BODY_MODE || p.insertionMode === IN_ROW_MODE || 6533 p.insertionMode === IN_CELL_MODE) { 6534 p.insertionMode = IN_SELECT_IN_TABLE_MODE; 6535 } 6536 6537 else 6538 p.insertionMode = IN_SELECT_MODE; 6539} 6540 6541function optgroupStartTagInBody(p, token) { 6542 if (p.openElements.currentTagName === $.OPTION) 6543 p._processFakeEndTag($.OPTION); 6544 6545 p._reconstructActiveFormattingElements(); 6546 p._insertElement(token, NS.HTML); 6547} 6548 6549function rpStartTagInBody(p, token) { 6550 if (p.openElements.hasInScope($.RUBY)) 6551 p.openElements.generateImpliedEndTags(); 6552 6553 p._insertElement(token, NS.HTML); 6554} 6555 6556function menuitemStartTagInBody(p, token) { 6557 p._appendElement(token, NS.HTML); 6558} 6559 6560function mathStartTagInBody(p, token) { 6561 p._reconstructActiveFormattingElements(); 6562 6563 ForeignContent.adjustTokenMathMLAttrs(token); 6564 ForeignContent.adjustTokenXMLAttrs(token); 6565 6566 if (token.selfClosing) 6567 p._appendElement(token, NS.MATHML); 6568 else 6569 p._insertElement(token, NS.MATHML); 6570} 6571 6572function svgStartTagInBody(p, token) { 6573 p._reconstructActiveFormattingElements(); 6574 6575 ForeignContent.adjustTokenSVGAttrs(token); 6576 ForeignContent.adjustTokenXMLAttrs(token); 6577 6578 if (token.selfClosing) 6579 p._appendElement(token, NS.SVG); 6580 else 6581 p._insertElement(token, NS.SVG); 6582} 6583 6584function genericStartTagInBody(p, token) { 6585 p._reconstructActiveFormattingElements(); 6586 p._insertElement(token, NS.HTML); 6587} 6588 6589//OPTIMIZATION: Integer comparisons are low-cost, so we can use very fast tag name length filters here. 6590//It's faster than using dictionary. 6591function startTagInBody(p, token) { 6592 var tn = token.tagName; 6593 6594 switch (tn.length) { 6595 case 1: 6596 if (tn === $.I || tn === $.S || tn === $.B || tn === $.U) 6597 bStartTagInBody(p, token); 6598 6599 else if (tn === $.P) 6600 addressStartTagInBody(p, token); 6601 6602 else if (tn === $.A) 6603 aStartTagInBody(p, token); 6604 6605 else 6606 genericStartTagInBody(p, token); 6607 6608 break; 6609 6610 case 2: 6611 if (tn === $.DL || tn === $.OL || tn === $.UL) 6612 addressStartTagInBody(p, token); 6613 6614 else if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6) 6615 numberedHeaderStartTagInBody(p, token); 6616 6617 else if (tn === $.LI || tn === $.DD || tn === $.DT) 6618 listItemStartTagInBody(p, token); 6619 6620 else if (tn === $.EM || tn === $.TT) 6621 bStartTagInBody(p, token); 6622 6623 else if (tn === $.BR) 6624 areaStartTagInBody(p, token); 6625 6626 else if (tn === $.HR) 6627 hrStartTagInBody(p, token); 6628 6629 else if (tn === $.RP || tn === $.RT) 6630 rpStartTagInBody(p, token); 6631 6632 else if (tn !== $.TH && tn !== $.TD && tn !== $.TR) 6633 genericStartTagInBody(p, token); 6634 6635 break; 6636 6637 case 3: 6638 if (tn === $.DIV || tn === $.DIR || tn === $.NAV) 6639 addressStartTagInBody(p, token); 6640 6641 else if (tn === $.PRE) 6642 preStartTagInBody(p, token); 6643 6644 else if (tn === $.BIG) 6645 bStartTagInBody(p, token); 6646 6647 else if (tn === $.IMG || tn === $.WBR) 6648 areaStartTagInBody(p, token); 6649 6650 else if (tn === $.XMP) 6651 xmpStartTagInBody(p, token); 6652 6653 else if (tn === $.SVG) 6654 svgStartTagInBody(p, token); 6655 6656 else if (tn !== $.COL) 6657 genericStartTagInBody(p, token); 6658 6659 break; 6660 6661 case 4: 6662 if (tn === $.HTML) 6663 htmlStartTagInBody(p, token); 6664 6665 else if (tn === $.BASE || tn === $.LINK || tn === $.META) 6666 startTagInHead(p, token); 6667 6668 else if (tn === $.BODY) 6669 bodyStartTagInBody(p, token); 6670 6671 else if (tn === $.MAIN || tn === $.MENU) 6672 addressStartTagInBody(p, token); 6673 6674 else if (tn === $.FORM) 6675 formStartTagInBody(p, token); 6676 6677 else if (tn === $.CODE || tn === $.FONT) 6678 bStartTagInBody(p, token); 6679 6680 else if (tn === $.NOBR) 6681 nobrStartTagInBody(p, token); 6682 6683 else if (tn === $.AREA) 6684 areaStartTagInBody(p, token); 6685 6686 else if (tn === $.MATH) 6687 mathStartTagInBody(p, token); 6688 6689 else if (tn !== $.HEAD) 6690 genericStartTagInBody(p, token); 6691 6692 break; 6693 6694 case 5: 6695 if (tn === $.STYLE || tn === $.TITLE) 6696 startTagInHead(p, token); 6697 6698 else if (tn === $.ASIDE) 6699 addressStartTagInBody(p, token); 6700 6701 else if (tn === $.SMALL) 6702 bStartTagInBody(p, token); 6703 6704 else if (tn === $.TABLE) 6705 tableStartTagInBody(p, token); 6706 6707 else if (tn === $.EMBED) 6708 areaStartTagInBody(p, token); 6709 6710 else if (tn === $.INPUT) 6711 inputStartTagInBody(p, token); 6712 6713 else if (tn === $.PARAM || tn === $.TRACK) 6714 paramStartTagInBody(p, token); 6715 6716 else if (tn === $.IMAGE) 6717 imageStartTagInBody(p, token); 6718 6719 else if (tn !== $.FRAME && tn !== $.TBODY && tn !== $.TFOOT && tn !== $.THEAD) 6720 genericStartTagInBody(p, token); 6721 6722 break; 6723 6724 case 6: 6725 if (tn === $.SCRIPT) 6726 startTagInHead(p, token); 6727 6728 else if (tn === $.CENTER || tn === $.FIGURE || tn === $.FOOTER || tn === $.HEADER || tn === $.HGROUP) 6729 addressStartTagInBody(p, token); 6730 6731 else if (tn === $.BUTTON) 6732 buttonStartTagInBody(p, token); 6733 6734 else if (tn === $.STRIKE || tn === $.STRONG) 6735 bStartTagInBody(p, token); 6736 6737 else if (tn === $.APPLET || tn === $.OBJECT) 6738 appletStartTagInBody(p, token); 6739 6740 else if (tn === $.KEYGEN) 6741 areaStartTagInBody(p, token); 6742 6743 else if (tn === $.SOURCE) 6744 paramStartTagInBody(p, token); 6745 6746 else if (tn === $.IFRAME) 6747 iframeStartTagInBody(p, token); 6748 6749 else if (tn === $.SELECT) 6750 selectStartTagInBody(p, token); 6751 6752 else if (tn === $.OPTION) 6753 optgroupStartTagInBody(p, token); 6754 6755 else 6756 genericStartTagInBody(p, token); 6757 6758 break; 6759 6760 case 7: 6761 if (tn === $.BGSOUND || tn === $.COMMAND) 6762 startTagInHead(p, token); 6763 6764 else if (tn === $.DETAILS || tn === $.ADDRESS || tn === $.ARTICLE || tn === $.SECTION || tn === $.SUMMARY) 6765 addressStartTagInBody(p, token); 6766 6767 else if (tn === $.LISTING) 6768 preStartTagInBody(p, token); 6769 6770 else if (tn === $.MARQUEE) 6771 appletStartTagInBody(p, token); 6772 6773 else if (tn === $.ISINDEX) 6774 isindexStartTagInBody(p, token); 6775 6776 else if (tn === $.NOEMBED) 6777 noembedStartTagInBody(p, token); 6778 6779 else if (tn !== $.CAPTION) 6780 genericStartTagInBody(p, token); 6781 6782 break; 6783 6784 case 8: 6785 if (tn === $.BASEFONT || tn === $.MENUITEM) 6786 menuitemStartTagInBody(p, token); 6787 6788 else if (tn === $.FRAMESET) 6789 framesetStartTagInBody(p, token); 6790 6791 else if (tn === $.FIELDSET) 6792 addressStartTagInBody(p, token); 6793 6794 else if (tn === $.TEXTAREA) 6795 textareaStartTagInBody(p, token); 6796 6797 else if (tn === $.TEMPLATE) 6798 startTagInHead(p, token); 6799 6800 else if (tn === $.NOSCRIPT) 6801 noembedStartTagInBody(p, token); 6802 6803 else if (tn === $.OPTGROUP) 6804 optgroupStartTagInBody(p, token); 6805 6806 else if (tn !== $.COLGROUP) 6807 genericStartTagInBody(p, token); 6808 6809 break; 6810 6811 case 9: 6812 if (tn === $.PLAINTEXT) 6813 plaintextStartTagInBody(p, token); 6814 6815 else 6816 genericStartTagInBody(p, token); 6817 6818 break; 6819 6820 case 10: 6821 if (tn === $.BLOCKQUOTE || tn === $.FIGCAPTION) 6822 addressStartTagInBody(p, token); 6823 6824 else 6825 genericStartTagInBody(p, token); 6826 6827 break; 6828 6829 default: 6830 genericStartTagInBody(p, token); 6831 } 6832} 6833 6834function bodyEndTagInBody(p, token) { 6835 if (p.openElements.hasInScope($.BODY)) 6836 p.insertionMode = AFTER_BODY_MODE; 6837 6838 else 6839 token.ignored = true; 6840} 6841 6842function htmlEndTagInBody(p, token) { 6843 var fakeToken = p._processFakeEndTag($.BODY); 6844 6845 if (!fakeToken.ignored) 6846 p._processToken(token); 6847} 6848 6849function addressEndTagInBody(p, token) { 6850 var tn = token.tagName; 6851 6852 if (p.openElements.hasInScope(tn)) { 6853 p.openElements.generateImpliedEndTags(); 6854 p.openElements.popUntilTagNamePopped(tn); 6855 } 6856} 6857 6858function formEndTagInBody(p, token) { 6859 var inTemplate = p.openElements.tmplCount > 0, 6860 formElement = p.formElement; 6861 6862 if (!inTemplate) 6863 p.formElement = null; 6864 6865 if ((formElement || inTemplate) && p.openElements.hasInScope($.FORM)) { 6866 p.openElements.generateImpliedEndTags(); 6867 6868 if (inTemplate) 6869 p.openElements.popUntilTagNamePopped($.FORM); 6870 6871 else 6872 p.openElements.remove(formElement); 6873 } 6874} 6875 6876function pEndTagInBody(p, token) { 6877 if (p.openElements.hasInButtonScope($.P)) { 6878 p.openElements.generateImpliedEndTagsWithExclusion($.P); 6879 p.openElements.popUntilTagNamePopped($.P); 6880 } 6881 6882 else { 6883 p._processFakeStartTag($.P); 6884 p._processToken(token); 6885 } 6886} 6887 6888function liEndTagInBody(p, token) { 6889 if (p.openElements.hasInListItemScope($.LI)) { 6890 p.openElements.generateImpliedEndTagsWithExclusion($.LI); 6891 p.openElements.popUntilTagNamePopped($.LI); 6892 } 6893} 6894 6895function ddEndTagInBody(p, token) { 6896 var tn = token.tagName; 6897 6898 if (p.openElements.hasInScope(tn)) { 6899 p.openElements.generateImpliedEndTagsWithExclusion(tn); 6900 p.openElements.popUntilTagNamePopped(tn); 6901 } 6902} 6903 6904function numberedHeaderEndTagInBody(p, token) { 6905 if (p.openElements.hasNumberedHeaderInScope()) { 6906 p.openElements.generateImpliedEndTags(); 6907 p.openElements.popUntilNumberedHeaderPopped(); 6908 } 6909} 6910 6911function appletEndTagInBody(p, token) { 6912 var tn = token.tagName; 6913 6914 if (p.openElements.hasInScope(tn)) { 6915 p.openElements.generateImpliedEndTags(); 6916 p.openElements.popUntilTagNamePopped(tn); 6917 p.activeFormattingElements.clearToLastMarker(); 6918 } 6919} 6920 6921function brEndTagInBody(p, token) { 6922 p._processFakeStartTag($.BR); 6923} 6924 6925function genericEndTagInBody(p, token) { 6926 var tn = token.tagName; 6927 6928 for (var i = p.openElements.stackTop; i > 0; i--) { 6929 var element = p.openElements.items[i]; 6930 6931 if (p.treeAdapter.getTagName(element) === tn) { 6932 p.openElements.generateImpliedEndTagsWithExclusion(tn); 6933 p.openElements.popUntilElementPopped(element); 6934 break; 6935 } 6936 6937 if (p._isSpecialElement(element)) 6938 break; 6939 } 6940} 6941 6942//OPTIMIZATION: Integer comparisons are low-cost, so we can use very fast tag name length filters here. 6943//It's faster than using dictionary. 6944function endTagInBody(p, token) { 6945 var tn = token.tagName; 6946 6947 switch (tn.length) { 6948 case 1: 6949 if (tn === $.A || tn === $.B || tn === $.I || tn === $.S || tn == $.U) 6950 callAdoptionAgency(p, token); 6951 6952 else if (tn === $.P) 6953 pEndTagInBody(p, token); 6954 6955 else 6956 genericEndTagInBody(p, token); 6957 6958 break; 6959 6960 case 2: 6961 if (tn == $.DL || tn === $.UL || tn === $.OL) 6962 addressEndTagInBody(p, token); 6963 6964 else if (tn === $.LI) 6965 liEndTagInBody(p, token); 6966 6967 else if (tn === $.DD || tn === $.DT) 6968 ddEndTagInBody(p, token); 6969 6970 else if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6) 6971 numberedHeaderEndTagInBody(p, token); 6972 6973 else if (tn === $.BR) 6974 brEndTagInBody(p, token); 6975 6976 else if (tn === $.EM || tn === $.TT) 6977 callAdoptionAgency(p, token); 6978 6979 else 6980 genericEndTagInBody(p, token); 6981 6982 break; 6983 6984 case 3: 6985 if (tn === $.BIG) 6986 callAdoptionAgency(p, token); 6987 6988 else if (tn === $.DIR || tn === $.DIV || tn === $.NAV) 6989 addressEndTagInBody(p, token); 6990 6991 else 6992 genericEndTagInBody(p, token); 6993 6994 break; 6995 6996 case 4: 6997 if (tn === $.BODY) 6998 bodyEndTagInBody(p, token); 6999 7000 else if (tn === $.HTML) 7001 htmlEndTagInBody(p, token); 7002 7003 else if (tn === $.FORM) 7004 formEndTagInBody(p, token); 7005 7006 else if (tn === $.CODE || tn === $.FONT || tn === $.NOBR) 7007 callAdoptionAgency(p, token); 7008 7009 else if (tn === $.MAIN || tn === $.MENU) 7010 addressEndTagInBody(p, token); 7011 7012 else 7013 genericEndTagInBody(p, token); 7014 7015 break; 7016 7017 case 5: 7018 if (tn === $.ASIDE) 7019 addressEndTagInBody(p, token); 7020 7021 else if (tn === $.SMALL) 7022 callAdoptionAgency(p, token); 7023 7024 else 7025 genericEndTagInBody(p, token); 7026 7027 break; 7028 7029 case 6: 7030 if (tn === $.CENTER || tn === $.FIGURE || tn === $.FOOTER || tn === $.HEADER || tn === $.HGROUP) 7031 addressEndTagInBody(p, token); 7032 7033 else if (tn === $.APPLET || tn === $.OBJECT) 7034 appletEndTagInBody(p, token); 7035 7036 else if (tn == $.STRIKE || tn === $.STRONG) 7037 callAdoptionAgency(p, token); 7038 7039 else 7040 genericEndTagInBody(p, token); 7041 7042 break; 7043 7044 case 7: 7045 if (tn === $.ADDRESS || tn === $.ARTICLE || tn === $.DETAILS || tn === $.SECTION || tn === $.SUMMARY) 7046 addressEndTagInBody(p, token); 7047 7048 else if (tn === $.MARQUEE) 7049 appletEndTagInBody(p, token); 7050 7051 else 7052 genericEndTagInBody(p, token); 7053 7054 break; 7055 7056 case 8: 7057 if (tn === $.FIELDSET) 7058 addressEndTagInBody(p, token); 7059 7060 else if (tn === $.TEMPLATE) 7061 endTagInHead(p, token); 7062 7063 else 7064 genericEndTagInBody(p, token); 7065 7066 break; 7067 7068 case 10: 7069 if (tn === $.BLOCKQUOTE || tn === $.FIGCAPTION) 7070 addressEndTagInBody(p, token); 7071 7072 else 7073 genericEndTagInBody(p, token); 7074 7075 break; 7076 7077 default : 7078 genericEndTagInBody(p, token); 7079 } 7080} 7081 7082function eofInBody(p, token) { 7083 if (p.tmplInsertionModeStackTop > -1) 7084 eofInTemplate(p, token); 7085 7086 else 7087 p.stopped = true; 7088} 7089 7090//12.2.5.4.8 The "text" insertion mode 7091//------------------------------------------------------------------ 7092function endTagInText(p, token) { 7093 if (!p.fragmentContext && p.scriptHandler && token.tagName === $.SCRIPT) 7094 p.scriptHandler(p.document, p.openElements.current); 7095 7096 p.openElements.pop(); 7097 p.insertionMode = p.originalInsertionMode; 7098} 7099 7100 7101function eofInText(p, token) { 7102 p.openElements.pop(); 7103 p.insertionMode = p.originalInsertionMode; 7104 p._processToken(token); 7105} 7106 7107 7108//12.2.5.4.9 The "in table" insertion mode 7109//------------------------------------------------------------------ 7110function characterInTable(p, token) { 7111 var curTn = p.openElements.currentTagName; 7112 7113 if (curTn === $.TABLE || curTn === $.TBODY || curTn === $.TFOOT || curTn === $.THEAD || curTn === $.TR) { 7114 p.pendingCharacterTokens = []; 7115 p.hasNonWhitespacePendingCharacterToken = false; 7116 p.originalInsertionMode = p.insertionMode; 7117 p.insertionMode = IN_TABLE_TEXT_MODE; 7118 p._processToken(token); 7119 } 7120 7121 else 7122 tokenInTable(p, token); 7123} 7124 7125function captionStartTagInTable(p, token) { 7126 p.openElements.clearBackToTableContext(); 7127 p.activeFormattingElements.insertMarker(); 7128 p._insertElement(token, NS.HTML); 7129 p.insertionMode = IN_CAPTION_MODE; 7130} 7131 7132function colgroupStartTagInTable(p, token) { 7133 p.openElements.clearBackToTableContext(); 7134 p._insertElement(token, NS.HTML); 7135 p.insertionMode = IN_COLUMN_GROUP_MODE; 7136} 7137 7138function colStartTagInTable(p, token) { 7139 p._processFakeStartTag($.COLGROUP); 7140 p._processToken(token); 7141} 7142 7143function tbodyStartTagInTable(p, token) { 7144 p.openElements.clearBackToTableContext(); 7145 p._insertElement(token, NS.HTML); 7146 p.insertionMode = IN_TABLE_BODY_MODE; 7147} 7148 7149function tdStartTagInTable(p, token) { 7150 p._processFakeStartTag($.TBODY); 7151 p._processToken(token); 7152} 7153 7154function tableStartTagInTable(p, token) { 7155 var fakeToken = p._processFakeEndTag($.TABLE); 7156 7157 //NOTE: The fake end tag token here can only be ignored in the fragment case. 7158 if (!fakeToken.ignored) 7159 p._processToken(token); 7160} 7161 7162function inputStartTagInTable(p, token) { 7163 var inputType = Tokenizer.getTokenAttr(token, ATTRS.TYPE); 7164 7165 if (inputType && inputType.toLowerCase() === HIDDEN_INPUT_TYPE) 7166 p._appendElement(token, NS.HTML); 7167 7168 else 7169 tokenInTable(p, token); 7170} 7171 7172function formStartTagInTable(p, token) { 7173 if (!p.formElement && p.openElements.tmplCount === 0) { 7174 p._insertElement(token, NS.HTML); 7175 p.formElement = p.openElements.current; 7176 p.openElements.pop(); 7177 } 7178} 7179 7180function startTagInTable(p, token) { 7181 var tn = token.tagName; 7182 7183 switch (tn.length) { 7184 case 2: 7185 if (tn === $.TD || tn === $.TH || tn === $.TR) 7186 tdStartTagInTable(p, token); 7187 7188 else 7189 tokenInTable(p, token); 7190 7191 break; 7192 7193 case 3: 7194 if (tn === $.COL) 7195 colStartTagInTable(p, token); 7196 7197 else 7198 tokenInTable(p, token); 7199 7200 break; 7201 7202 case 4: 7203 if (tn === $.FORM) 7204 formStartTagInTable(p, token); 7205 7206 else 7207 tokenInTable(p, token); 7208 7209 break; 7210 7211 case 5: 7212 if (tn === $.TABLE) 7213 tableStartTagInTable(p, token); 7214 7215 else if (tn === $.STYLE) 7216 startTagInHead(p, token); 7217 7218 else if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) 7219 tbodyStartTagInTable(p, token); 7220 7221 else if (tn === $.INPUT) 7222 inputStartTagInTable(p, token); 7223 7224 else 7225 tokenInTable(p, token); 7226 7227 break; 7228 7229 case 6: 7230 if (tn === $.SCRIPT) 7231 startTagInHead(p, token); 7232 7233 else 7234 tokenInTable(p, token); 7235 7236 break; 7237 7238 case 7: 7239 if (tn === $.CAPTION) 7240 captionStartTagInTable(p, token); 7241 7242 else 7243 tokenInTable(p, token); 7244 7245 break; 7246 7247 case 8: 7248 if (tn === $.COLGROUP) 7249 colgroupStartTagInTable(p, token); 7250 7251 else if (tn === $.TEMPLATE) 7252 startTagInHead(p, token); 7253 7254 else 7255 tokenInTable(p, token); 7256 7257 break; 7258 7259 default: 7260 tokenInTable(p, token); 7261 } 7262 7263} 7264 7265function endTagInTable(p, token) { 7266 var tn = token.tagName; 7267 7268 if (tn === $.TABLE) { 7269 if (p.openElements.hasInTableScope($.TABLE)) { 7270 p.openElements.popUntilTagNamePopped($.TABLE); 7271 p._resetInsertionMode(); 7272 } 7273 7274 else 7275 token.ignored = true; 7276 } 7277 7278 else if (tn === $.TEMPLATE) 7279 endTagInHead(p, token); 7280 7281 else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP && tn !== $.HTML && 7282 tn !== $.TBODY && tn !== $.TD && tn !== $.TFOOT && tn !== $.TH && tn !== $.THEAD && tn !== $.TR) { 7283 tokenInTable(p, token); 7284 } 7285} 7286 7287function tokenInTable(p, token) { 7288 var savedFosterParentingState = p.fosterParentingEnabled; 7289 7290 p.fosterParentingEnabled = true; 7291 p._processTokenInBodyMode(token); 7292 p.fosterParentingEnabled = savedFosterParentingState; 7293} 7294 7295 7296//12.2.5.4.10 The "in table text" insertion mode 7297//------------------------------------------------------------------ 7298function whitespaceCharacterInTableText(p, token) { 7299 p.pendingCharacterTokens.push(token); 7300} 7301 7302function characterInTableText(p, token) { 7303 p.pendingCharacterTokens.push(token); 7304 p.hasNonWhitespacePendingCharacterToken = true; 7305} 7306 7307function tokenInTableText(p, token) { 7308 if (p.hasNonWhitespacePendingCharacterToken) { 7309 for (var i = 0; i < p.pendingCharacterTokens.length; i++) 7310 tokenInTable(p, p.pendingCharacterTokens[i]); 7311 } 7312 7313 else { 7314 for (var i = 0; i < p.pendingCharacterTokens.length; i++) 7315 p._insertCharacters(p.pendingCharacterTokens[i]); 7316 } 7317 7318 p.insertionMode = p.originalInsertionMode; 7319 p._processToken(token); 7320} 7321 7322 7323//12.2.5.4.11 The "in caption" insertion mode 7324//------------------------------------------------------------------ 7325function startTagInCaption(p, token) { 7326 var tn = token.tagName; 7327 7328 if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP || tn === $.TBODY || 7329 tn === $.TD || tn === $.TFOOT || tn === $.TH || tn === $.THEAD || tn === $.TR) { 7330 var fakeToken = p._processFakeEndTag($.CAPTION); 7331 7332 //NOTE: The fake end tag token here can only be ignored in the fragment case. 7333 if (!fakeToken.ignored) 7334 p._processToken(token); 7335 } 7336 7337 else 7338 startTagInBody(p, token); 7339} 7340 7341function endTagInCaption(p, token) { 7342 var tn = token.tagName; 7343 7344 if (tn === $.CAPTION) { 7345 if (p.openElements.hasInTableScope($.CAPTION)) { 7346 p.openElements.generateImpliedEndTags(); 7347 p.openElements.popUntilTagNamePopped($.CAPTION); 7348 p.activeFormattingElements.clearToLastMarker(); 7349 p.insertionMode = IN_TABLE_MODE; 7350 } 7351 7352 else 7353 token.ignored = true; 7354 } 7355 7356 else if (tn === $.TABLE) { 7357 var fakeToken = p._processFakeEndTag($.CAPTION); 7358 7359 //NOTE: The fake end tag token here can only be ignored in the fragment case. 7360 if (!fakeToken.ignored) 7361 p._processToken(token); 7362 } 7363 7364 else if (tn !== $.BODY && tn !== $.COL && tn !== $.COLGROUP && tn !== $.HTML && tn !== $.TBODY && 7365 tn !== $.TD && tn !== $.TFOOT && tn !== $.TH && tn !== $.THEAD && tn !== $.TR) { 7366 endTagInBody(p, token); 7367 } 7368} 7369 7370 7371//12.2.5.4.12 The "in column group" insertion mode 7372//------------------------------------------------------------------ 7373function startTagInColumnGroup(p, token) { 7374 var tn = token.tagName; 7375 7376 if (tn === $.HTML) 7377 startTagInBody(p, token); 7378 7379 else if (tn === $.COL) 7380 p._appendElement(token, NS.HTML); 7381 7382 else if (tn === $.TEMPLATE) 7383 startTagInHead(p, token); 7384 7385 else 7386 tokenInColumnGroup(p, token); 7387} 7388 7389function endTagInColumnGroup(p, token) { 7390 var tn = token.tagName; 7391 7392 if (tn === $.COLGROUP) { 7393 if (p.openElements.currentTagName !== $.COLGROUP) 7394 token.ignored = true; 7395 7396 else { 7397 p.openElements.pop(); 7398 p.insertionMode = IN_TABLE_MODE; 7399 } 7400 } 7401 7402 else if (tn === $.TEMPLATE) 7403 endTagInHead(p, token); 7404 7405 else if (tn !== $.COL) 7406 tokenInColumnGroup(p, token); 7407} 7408 7409function tokenInColumnGroup(p, token) { 7410 var fakeToken = p._processFakeEndTag($.COLGROUP); 7411 7412 //NOTE: The fake end tag token here can only be ignored in the fragment case. 7413 if (!fakeToken.ignored) 7414 p._processToken(token); 7415} 7416 7417//12.2.5.4.13 The "in table body" insertion mode 7418//------------------------------------------------------------------ 7419function startTagInTableBody(p, token) { 7420 var tn = token.tagName; 7421 7422 if (tn === $.TR) { 7423 p.openElements.clearBackToTableBodyContext(); 7424 p._insertElement(token, NS.HTML); 7425 p.insertionMode = IN_ROW_MODE; 7426 } 7427 7428 else if (tn === $.TH || tn === $.TD) { 7429 p._processFakeStartTag($.TR); 7430 p._processToken(token); 7431 } 7432 7433 else if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP || 7434 tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) { 7435 7436 if (p.openElements.hasTableBodyContextInTableScope()) { 7437 p.openElements.clearBackToTableBodyContext(); 7438 p._processFakeEndTag(p.openElements.currentTagName); 7439 p._processToken(token); 7440 } 7441 } 7442 7443 else 7444 startTagInTable(p, token); 7445} 7446 7447function endTagInTableBody(p, token) { 7448 var tn = token.tagName; 7449 7450 if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) { 7451 if (p.openElements.hasInTableScope(tn)) { 7452 p.openElements.clearBackToTableBodyContext(); 7453 p.openElements.pop(); 7454 p.insertionMode = IN_TABLE_MODE; 7455 } 7456 } 7457 7458 else if (tn === $.TABLE) { 7459 if (p.openElements.hasTableBodyContextInTableScope()) { 7460 p.openElements.clearBackToTableBodyContext(); 7461 p._processFakeEndTag(p.openElements.currentTagName); 7462 p._processToken(token); 7463 } 7464 } 7465 7466 else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP || 7467 tn !== $.HTML && tn !== $.TD && tn !== $.TH && tn !== $.TR) { 7468 endTagInTable(p, token); 7469 } 7470} 7471 7472//12.2.5.4.14 The "in row" insertion mode 7473//------------------------------------------------------------------ 7474function startTagInRow(p, token) { 7475 var tn = token.tagName; 7476 7477 if (tn === $.TH || tn === $.TD) { 7478 p.openElements.clearBackToTableRowContext(); 7479 p._insertElement(token, NS.HTML); 7480 p.insertionMode = IN_CELL_MODE; 7481 p.activeFormattingElements.insertMarker(); 7482 } 7483 7484 else if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP || tn === $.TBODY || 7485 tn === $.TFOOT || tn === $.THEAD || tn === $.TR) { 7486 var fakeToken = p._processFakeEndTag($.TR); 7487 7488 //NOTE: The fake end tag token here can only be ignored in the fragment case. 7489 if (!fakeToken.ignored) 7490 p._processToken(token); 7491 } 7492 7493 else 7494 startTagInTable(p, token); 7495} 7496 7497function endTagInRow(p, token) { 7498 var tn = token.tagName; 7499 7500 if (tn === $.TR) { 7501 if (p.openElements.hasInTableScope($.TR)) { 7502 p.openElements.clearBackToTableRowContext(); 7503 p.openElements.pop(); 7504 p.insertionMode = IN_TABLE_BODY_MODE; 7505 } 7506 7507 else 7508 token.ignored = true; 7509 } 7510 7511 else if (tn === $.TABLE) { 7512 var fakeToken = p._processFakeEndTag($.TR); 7513 7514 //NOTE: The fake end tag token here can only be ignored in the fragment case. 7515 if (!fakeToken.ignored) 7516 p._processToken(token); 7517 } 7518 7519 else if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) { 7520 if (p.openElements.hasInTableScope(tn)) { 7521 p._processFakeEndTag($.TR); 7522 p._processToken(token); 7523 } 7524 } 7525 7526 else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP || 7527 tn !== $.HTML && tn !== $.TD && tn !== $.TH) { 7528 endTagInTable(p, token); 7529 } 7530} 7531 7532 7533//12.2.5.4.15 The "in cell" insertion mode 7534//------------------------------------------------------------------ 7535function startTagInCell(p, token) { 7536 var tn = token.tagName; 7537 7538 if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP || tn === $.TBODY || 7539 tn === $.TD || tn === $.TFOOT || tn === $.TH || tn === $.THEAD || tn === $.TR) { 7540 7541 if (p.openElements.hasInTableScope($.TD) || p.openElements.hasInTableScope($.TH)) { 7542 p._closeTableCell(); 7543 p._processToken(token); 7544 } 7545 } 7546 7547 else 7548 startTagInBody(p, token); 7549} 7550 7551function endTagInCell(p, token) { 7552 var tn = token.tagName; 7553 7554 if (tn === $.TD || tn === $.TH) { 7555 if (p.openElements.hasInTableScope(tn)) { 7556 p.openElements.generateImpliedEndTags(); 7557 p.openElements.popUntilTagNamePopped(tn); 7558 p.activeFormattingElements.clearToLastMarker(); 7559 p.insertionMode = IN_ROW_MODE; 7560 } 7561 } 7562 7563 else if (tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD || tn === $.TR) { 7564 if (p.openElements.hasInTableScope(tn)) { 7565 p._closeTableCell(); 7566 p._processToken(token); 7567 } 7568 } 7569 7570 else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP && tn !== $.HTML) 7571 endTagInBody(p, token); 7572} 7573 7574//12.2.5.4.16 The "in select" insertion mode 7575//------------------------------------------------------------------ 7576function startTagInSelect(p, token) { 7577 var tn = token.tagName; 7578 7579 if (tn === $.HTML) 7580 startTagInBody(p, token); 7581 7582 else if (tn === $.OPTION) { 7583 if (p.openElements.currentTagName === $.OPTION) 7584 p._processFakeEndTag($.OPTION); 7585 7586 p._insertElement(token, NS.HTML); 7587 } 7588 7589 else if (tn === $.OPTGROUP) { 7590 if (p.openElements.currentTagName === $.OPTION) 7591 p._processFakeEndTag($.OPTION); 7592 7593 if (p.openElements.currentTagName === $.OPTGROUP) 7594 p._processFakeEndTag($.OPTGROUP); 7595 7596 p._insertElement(token, NS.HTML); 7597 } 7598 7599 else if (tn === $.SELECT) 7600 p._processFakeEndTag($.SELECT); 7601 7602 else if (tn === $.INPUT || tn === $.KEYGEN || tn === $.TEXTAREA) { 7603 if (p.openElements.hasInSelectScope($.SELECT)) { 7604 p._processFakeEndTag($.SELECT); 7605 p._processToken(token); 7606 } 7607 } 7608 7609 else if (tn === $.SCRIPT || tn === $.TEMPLATE) 7610 startTagInHead(p, token); 7611} 7612 7613function endTagInSelect(p, token) { 7614 var tn = token.tagName; 7615 7616 if (tn === $.OPTGROUP) { 7617 var prevOpenElement = p.openElements.items[p.openElements.stackTop - 1], 7618 prevOpenElementTn = prevOpenElement && p.treeAdapter.getTagName(prevOpenElement); 7619 7620 if (p.openElements.currentTagName === $.OPTION && prevOpenElementTn === $.OPTGROUP) 7621 p._processFakeEndTag($.OPTION); 7622 7623 if (p.openElements.currentTagName === $.OPTGROUP) 7624 p.openElements.pop(); 7625 } 7626 7627 else if (tn === $.OPTION) { 7628 if (p.openElements.currentTagName === $.OPTION) 7629 p.openElements.pop(); 7630 } 7631 7632 else if (tn === $.SELECT && p.openElements.hasInSelectScope($.SELECT)) { 7633 p.openElements.popUntilTagNamePopped($.SELECT); 7634 p._resetInsertionMode(); 7635 } 7636 7637 else if (tn === $.TEMPLATE) 7638 endTagInHead(p, token); 7639} 7640 7641//12.2.5.4.17 The "in select in table" insertion mode 7642//------------------------------------------------------------------ 7643function startTagInSelectInTable(p, token) { 7644 var tn = token.tagName; 7645 7646 if (tn === $.CAPTION || tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT || 7647 tn === $.THEAD || tn === $.TR || tn === $.TD || tn === $.TH) { 7648 p._processFakeEndTag($.SELECT); 7649 p._processToken(token); 7650 } 7651 7652 else 7653 startTagInSelect(p, token); 7654} 7655 7656function endTagInSelectInTable(p, token) { 7657 var tn = token.tagName; 7658 7659 if (tn === $.CAPTION || tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT || 7660 tn === $.THEAD || tn === $.TR || tn === $.TD || tn === $.TH) { 7661 if (p.openElements.hasInTableScope(tn)) { 7662 p._processFakeEndTag($.SELECT); 7663 p._processToken(token); 7664 } 7665 } 7666 7667 else 7668 endTagInSelect(p, token); 7669} 7670 7671//12.2.5.4.18 The "in template" insertion mode 7672//------------------------------------------------------------------ 7673function startTagInTemplate(p, token) { 7674 var tn = token.tagName; 7675 7676 if (tn === $.BASE || tn === $.BASEFONT || tn === $.BGSOUND || tn === $.LINK || tn === $.META || 7677 tn === $.NOFRAMES || tn === $.SCRIPT || tn === $.STYLE || tn === $.TEMPLATE || tn === $.TITLE) { 7678 startTagInHead(p, token); 7679 } 7680 7681 else { 7682 var newInsertionMode = TEMPLATE_INSERTION_MODE_SWITCH_MAP[tn] || IN_BODY_MODE; 7683 7684 p._popTmplInsertionMode(); 7685 p._pushTmplInsertionMode(newInsertionMode); 7686 p.insertionMode = newInsertionMode; 7687 p._processToken(token); 7688 } 7689} 7690 7691function endTagInTemplate(p, token) { 7692 if (token.tagName === $.TEMPLATE) 7693 endTagInHead(p, token); 7694} 7695 7696function eofInTemplate(p, token) { 7697 if (p.openElements.tmplCount > 0) { 7698 p.openElements.popUntilTemplatePopped(); 7699 p.activeFormattingElements.clearToLastMarker(); 7700 p._popTmplInsertionMode(); 7701 p._resetInsertionMode(); 7702 p._processToken(token); 7703 } 7704 7705 else 7706 p.stopped = true; 7707} 7708 7709 7710//12.2.5.4.19 The "after body" insertion mode 7711//------------------------------------------------------------------ 7712function startTagAfterBody(p, token) { 7713 if (token.tagName === $.HTML) 7714 startTagInBody(p, token); 7715 7716 else 7717 tokenAfterBody(p, token); 7718} 7719 7720function endTagAfterBody(p, token) { 7721 if (token.tagName === $.HTML) { 7722 if (!p.fragmentContext) 7723 p.insertionMode = AFTER_AFTER_BODY_MODE; 7724 } 7725 7726 else 7727 tokenAfterBody(p, token); 7728} 7729 7730function tokenAfterBody(p, token) { 7731 p.insertionMode = IN_BODY_MODE; 7732 p._processToken(token); 7733} 7734 7735//12.2.5.4.20 The "in frameset" insertion mode 7736//------------------------------------------------------------------ 7737function startTagInFrameset(p, token) { 7738 var tn = token.tagName; 7739 7740 if (tn === $.HTML) 7741 startTagInBody(p, token); 7742 7743 else if (tn === $.FRAMESET) 7744 p._insertElement(token, NS.HTML); 7745 7746 else if (tn === $.FRAME) 7747 p._appendElement(token, NS.HTML); 7748 7749 else if (tn === $.NOFRAMES) 7750 startTagInHead(p, token); 7751} 7752 7753function endTagInFrameset(p, token) { 7754 if (token.tagName === $.FRAMESET && !p.openElements.isRootHtmlElementCurrent()) { 7755 p.openElements.pop(); 7756 7757 if (!p.fragmentContext && p.openElements.currentTagName !== $.FRAMESET) 7758 p.insertionMode = AFTER_FRAMESET_MODE; 7759 } 7760} 7761 7762//12.2.5.4.21 The "after frameset" insertion mode 7763//------------------------------------------------------------------ 7764function startTagAfterFrameset(p, token) { 7765 var tn = token.tagName; 7766 7767 if (tn === $.HTML) 7768 startTagInBody(p, token); 7769 7770 else if (tn === $.NOFRAMES) 7771 startTagInHead(p, token); 7772} 7773 7774function endTagAfterFrameset(p, token) { 7775 if (token.tagName === $.HTML) 7776 p.insertionMode = AFTER_AFTER_FRAMESET_MODE; 7777} 7778 7779//12.2.5.4.22 The "after after body" insertion mode 7780//------------------------------------------------------------------ 7781function startTagAfterAfterBody(p, token) { 7782 if (token.tagName === $.HTML) 7783 startTagInBody(p, token); 7784 7785 else 7786 tokenAfterAfterBody(p, token); 7787} 7788 7789function tokenAfterAfterBody(p, token) { 7790 p.insertionMode = IN_BODY_MODE; 7791 p._processToken(token); 7792} 7793 7794//12.2.5.4.23 The "after after frameset" insertion mode 7795//------------------------------------------------------------------ 7796function startTagAfterAfterFrameset(p, token) { 7797 var tn = token.tagName; 7798 7799 if (tn === $.HTML) 7800 startTagInBody(p, token); 7801 7802 else if (tn === $.NOFRAMES) 7803 startTagInHead(p, token); 7804} 7805 7806 7807//12.2.5.5 The rules for parsing tokens in foreign content 7808//------------------------------------------------------------------ 7809function nullCharacterInForeignContent(p, token) { 7810 token.chars = UNICODE.REPLACEMENT_CHARACTER; 7811 p._insertCharacters(token); 7812} 7813 7814function characterInForeignContent(p, token) { 7815 p._insertCharacters(token); 7816 p.framesetOk = false; 7817} 7818 7819function startTagInForeignContent(p, token) { 7820 if (ForeignContent.causesExit(token) && !p.fragmentContext) { 7821 while (p.treeAdapter.getNamespaceURI(p.openElements.current) !== NS.HTML && 7822 (!p._isMathMLTextIntegrationPoint(p.openElements.current)) && 7823 (!p._isHtmlIntegrationPoint(p.openElements.current))) { 7824 p.openElements.pop(); 7825 } 7826 7827 p._processToken(token); 7828 } 7829 7830 else { 7831 var current = p._getAdjustedCurrentElement(), 7832 currentNs = p.treeAdapter.getNamespaceURI(current); 7833 7834 if (currentNs === NS.MATHML) 7835 ForeignContent.adjustTokenMathMLAttrs(token); 7836 7837 else if (currentNs === NS.SVG) { 7838 ForeignContent.adjustTokenSVGTagName(token); 7839 ForeignContent.adjustTokenSVGAttrs(token); 7840 } 7841 7842 ForeignContent.adjustTokenXMLAttrs(token); 7843 7844 if (token.selfClosing) 7845 p._appendElement(token, currentNs); 7846 else 7847 p._insertElement(token, currentNs); 7848 } 7849} 7850 7851function endTagInForeignContent(p, token) { 7852 for (var i = p.openElements.stackTop; i > 0; i--) { 7853 var element = p.openElements.items[i]; 7854 7855 if (p.treeAdapter.getNamespaceURI(element) === NS.HTML) { 7856 p._processToken(token); 7857 break; 7858 } 7859 7860 if (p.treeAdapter.getTagName(element).toLowerCase() === token.tagName) { 7861 p.openElements.popUntilElementPopped(element); 7862 break; 7863 } 7864 } 7865} 7866 7867},{"../common/doctype":1,"../common/foreign_content":2,"../common/html":3,"../common/unicode":4,"../common/utils":5,"../tokenization/tokenizer":14,"../tree_adapters/default":15,"./formatting_element_list":17,"./location_info_mixin":18,"./open_element_stack":19}],21:[function(require,module,exports){ 7868(function (global){ 7869'use strict'; 7870 7871global.parse5 = {}; 7872 7873parse5.Parser = require('./lib/tree_construction/parser'); 7874parse5.SimpleApiParser = require('./lib/simple_api/simple_api_parser'); 7875parse5.TreeSerializer = 7876parse5.Serializer = require('./lib/serialization/serializer'); 7877parse5.JsDomParser = require('./lib/jsdom/jsdom_parser'); 7878 7879parse5.TreeAdapters = { 7880 default: require('./lib/tree_adapters/default'), 7881 htmlparser2: require('./lib/tree_adapters/htmlparser2') 7882}; 7883 7884}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) 7885},{"./lib/jsdom/jsdom_parser":6,"./lib/serialization/serializer":8,"./lib/simple_api/simple_api_parser":9,"./lib/tree_adapters/default":15,"./lib/tree_adapters/htmlparser2":16,"./lib/tree_construction/parser":20}],22:[function(require,module,exports){ 7886// shim for using process in browser 7887 7888var process = module.exports = {}; 7889var queue = []; 7890var draining = false; 7891var currentQueue; 7892var queueIndex = -1; 7893 7894function cleanUpNextTick() { 7895 draining = false; 7896 if (currentQueue.length) { 7897 queue = currentQueue.concat(queue); 7898 } else { 7899 queueIndex = -1; 7900 } 7901 if (queue.length) { 7902 drainQueue(); 7903 } 7904} 7905 7906function drainQueue() { 7907 if (draining) { 7908 return; 7909 } 7910 var timeout = setTimeout(cleanUpNextTick); 7911 draining = true; 7912 7913 var len = queue.length; 7914 while(len) { 7915 currentQueue = queue; 7916 queue = []; 7917 while (++queueIndex < len) { 7918 currentQueue[queueIndex].run(); 7919 } 7920 queueIndex = -1; 7921 len = queue.length; 7922 } 7923 currentQueue = null; 7924 draining = false; 7925 clearTimeout(timeout); 7926} 7927 7928process.nextTick = function (fun) { 7929 var args = new Array(arguments.length - 1); 7930 if (arguments.length > 1) { 7931 for (var i = 1; i < arguments.length; i++) { 7932 args[i - 1] = arguments[i]; 7933 } 7934 } 7935 queue.push(new Item(fun, args)); 7936 if (queue.length === 1 && !draining) { 7937 setTimeout(drainQueue, 0); 7938 } 7939}; 7940 7941// v8 likes predictible objects 7942function Item(fun, array) { 7943 this.fun = fun; 7944 this.array = array; 7945} 7946Item.prototype.run = function () { 7947 this.fun.apply(null, this.array); 7948}; 7949process.title = 'browser'; 7950process.browser = true; 7951process.env = {}; 7952process.argv = []; 7953process.version = ''; // empty string to avoid regexp issues 7954process.versions = {}; 7955 7956function noop() {} 7957 7958process.on = noop; 7959process.addListener = noop; 7960process.once = noop; 7961process.off = noop; 7962process.removeListener = noop; 7963process.removeAllListeners = noop; 7964process.emit = noop; 7965 7966process.binding = function (name) { 7967 throw new Error('process.binding is not supported'); 7968}; 7969 7970// TODO(shtylman) 7971process.cwd = function () { return '/' }; 7972process.chdir = function (dir) { 7973 throw new Error('process.chdir is not supported'); 7974}; 7975process.umask = function() { return 0; }; 7976 7977},{}]},{},[21]); 7978