⌈⌋ ⎇ branch:  Bitrhythm


Hex Artifact Content

Artifact bad6a1fa4b8a16bd6b998e046b442fd680f99d3ddfd1d3f62b566cca9f549e43:


0000: 2f 2a 20 52 69 6f 74 20 76 32 2e 36 2e 31 2c 20  /* Riot v2.6.1, 
0010: 40 6c 69 63 65 6e 73 65 20 4d 49 54 20 2a 2f 0a  @license MIT */.
0020: 0a 3b 28 66 75 6e 63 74 69 6f 6e 28 77 69 6e 64  .;(function(wind
0030: 6f 77 2c 20 75 6e 64 65 66 69 6e 65 64 29 20 7b  ow, undefined) {
0040: 0a 20 20 27 75 73 65 20 73 74 72 69 63 74 27 3b  .  'use strict';
0050: 0a 76 61 72 20 72 69 6f 74 20 3d 20 7b 20 76 65  .var riot = { ve
0060: 72 73 69 6f 6e 3a 20 27 76 32 2e 36 2e 31 27 2c  rsion: 'v2.6.1',
0070: 20 73 65 74 74 69 6e 67 73 3a 20 7b 7d 20 7d 2c   settings: {} },
0080: 0a 20 20 2f 2f 20 62 65 20 61 77 61 72 65 2c 20  .  // be aware, 
0090: 69 6e 74 65 72 6e 61 6c 20 75 73 61 67 65 0a 20  internal usage. 
00a0: 20 2f 2f 20 41 54 54 45 4e 54 49 4f 4e 3a 20 70   // ATTENTION: p
00b0: 72 65 66 69 78 20 74 68 65 20 67 6c 6f 62 61 6c  refix the global
00c0: 20 64 79 6e 61 6d 69 63 20 76 61 72 69 61 62 6c   dynamic variabl
00d0: 65 73 20 77 69 74 68 20 60 5f 5f 60 0a 0a 20 20  es with `__`..  
00e0: 2f 2f 20 63 6f 75 6e 74 65 72 20 74 6f 20 67 69  // counter to gi
00f0: 76 65 20 61 20 75 6e 69 71 75 65 20 69 64 20 74  ve a unique id t
0100: 6f 20 61 6c 6c 20 74 68 65 20 54 61 67 20 69 6e  o all the Tag in
0110: 73 74 61 6e 63 65 73 0a 20 20 5f 5f 75 69 64 20  stances.  __uid 
0120: 3d 20 30 2c 0a 20 20 2f 2f 20 74 61 67 73 20 69  = 0,.  // tags i
0130: 6e 73 74 61 6e 63 65 73 20 63 61 63 68 65 0a 20  nstances cache. 
0140: 20 5f 5f 76 69 72 74 75 61 6c 44 6f 6d 20 3d 20   __virtualDom = 
0150: 5b 5d 2c 0a 20 20 2f 2f 20 74 61 67 73 20 69 6d  [],.  // tags im
0160: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 63 61 63  plementation cac
0170: 68 65 0a 20 20 5f 5f 74 61 67 49 6d 70 6c 20 3d  he.  __tagImpl =
0180: 20 7b 7d 2c 0a 0a 20 20 2f 2a 2a 0a 20 20 20 2a   {},..  /**.   *
0190: 20 43 6f 6e 73 74 0a 20 20 20 2a 2f 0a 20 20 47   Const.   */.  G
01a0: 4c 4f 42 41 4c 5f 4d 49 58 49 4e 20 3d 20 27 5f  LOBAL_MIXIN = '_
01b0: 5f 67 6c 6f 62 61 6c 5f 6d 69 78 69 6e 27 2c 0a  _global_mixin',.
01c0: 0a 20 20 2f 2f 20 72 69 6f 74 20 73 70 65 63 69  .  // riot speci
01d0: 66 69 63 20 70 72 65 66 69 78 65 73 0a 20 20 52  fic prefixes.  R
01e0: 49 4f 54 5f 50 52 45 46 49 58 20 3d 20 27 72 69  IOT_PREFIX = 'ri
01f0: 6f 74 2d 27 2c 0a 20 20 52 49 4f 54 5f 54 41 47  ot-',.  RIOT_TAG
0200: 20 3d 20 52 49 4f 54 5f 50 52 45 46 49 58 20 2b   = RIOT_PREFIX +
0210: 20 27 74 61 67 27 2c 0a 20 20 52 49 4f 54 5f 54   'tag',.  RIOT_T
0220: 41 47 5f 49 53 20 3d 20 27 64 61 74 61 2d 69 73  AG_IS = 'data-is
0230: 27 2c 0a 0a 20 20 2f 2f 20 66 6f 72 20 74 79 70  ',..  // for typ
0240: 65 6f 66 20 3d 3d 20 27 27 20 63 6f 6d 70 61 72  eof == '' compar
0250: 69 73 6f 6e 73 0a 20 20 54 5f 53 54 52 49 4e 47  isons.  T_STRING
0260: 20 3d 20 27 73 74 72 69 6e 67 27 2c 0a 20 20 54   = 'string',.  T
0270: 5f 4f 42 4a 45 43 54 20 3d 20 27 6f 62 6a 65 63  _OBJECT = 'objec
0280: 74 27 2c 0a 20 20 54 5f 55 4e 44 45 46 20 20 3d  t',.  T_UNDEF  =
0290: 20 27 75 6e 64 65 66 69 6e 65 64 27 2c 0a 20 20   'undefined',.  
02a0: 54 5f 46 55 4e 43 54 49 4f 4e 20 3d 20 27 66 75  T_FUNCTION = 'fu
02b0: 6e 63 74 69 6f 6e 27 2c 0a 20 20 58 4c 49 4e 4b  nction',.  XLINK
02c0: 5f 4e 53 20 3d 20 27 68 74 74 70 3a 2f 2f 77 77  _NS = 'http://ww
02d0: 77 2e 77 33 2e 6f 72 67 2f 31 39 39 39 2f 78 6c  w.w3.org/1999/xl
02e0: 69 6e 6b 27 2c 0a 20 20 58 4c 49 4e 4b 5f 52 45  ink',.  XLINK_RE
02f0: 47 45 58 20 3d 20 2f 5e 78 6c 69 6e 6b 3a 28 5c  GEX = /^xlink:(\
0300: 77 2b 29 2f 2c 0a 20 20 2f 2f 20 73 70 65 63 69  w+)/,.  // speci
0310: 61 6c 20 6e 61 74 69 76 65 20 74 61 67 73 20 74  al native tags t
0320: 68 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  hat cannot be tr
0330: 65 61 74 65 64 20 6c 69 6b 65 20 74 68 65 20 6f  eated like the o
0340: 74 68 65 72 73 0a 20 20 53 50 45 43 49 41 4c 5f  thers.  SPECIAL_
0350: 54 41 47 53 5f 52 45 47 45 58 20 3d 20 2f 5e 28  TAGS_REGEX = /^(
0360: 3f 3a 74 28 3f 3a 62 6f 64 79 7c 68 65 61 64 7c  ?:t(?:body|head|
0370: 66 6f 6f 74 7c 5b 72 68 64 5d 29 7c 63 61 70 74  foot|[rhd])|capt
0380: 69 6f 6e 7c 63 6f 6c 28 3f 3a 67 72 6f 75 70 29  ion|col(?:group)
0390: 3f 7c 6f 70 74 28 3f 3a 69 6f 6e 7c 67 72 6f 75  ?|opt(?:ion|grou
03a0: 70 29 29 24 2f 2c 0a 20 20 52 45 53 45 52 56 45  p))$/,.  RESERVE
03b0: 44 5f 57 4f 52 44 53 5f 42 4c 41 43 4b 4c 49 53  D_WORDS_BLACKLIS
03c0: 54 20 3d 20 2f 5e 28 3f 3a 5f 28 3f 3a 69 74 65  T = /^(?:_(?:ite
03d0: 6d 7c 69 64 7c 70 61 72 65 6e 74 29 7c 75 70 64  m|id|parent)|upd
03e0: 61 74 65 7c 72 6f 6f 74 7c 28 3f 3a 75 6e 29 3f  ate|root|(?:un)?
03f0: 6d 6f 75 6e 74 7c 6d 69 78 69 6e 7c 69 73 28 3f  mount|mixin|is(?
0400: 3a 4d 6f 75 6e 74 65 64 7c 4c 6f 6f 70 29 7c 74  :Mounted|Loop)|t
0410: 61 67 73 7c 70 61 72 65 6e 74 7c 6f 70 74 73 7c  ags|parent|opts|
0420: 74 72 69 67 67 65 72 7c 6f 28 3f 3a 6e 7c 66 66  trigger|o(?:n|ff
0430: 7c 6e 65 29 29 24 2f 2c 0a 20 20 2f 2f 20 53 56  |ne))$/,.  // SV
0440: 47 20 74 61 67 73 20 6c 69 73 74 20 68 74 74 70  G tags list http
0450: 73 3a 2f 2f 77 77 77 2e 77 33 2e 6f 72 67 2f 54  s://www.w3.org/T
0460: 52 2f 53 56 47 2f 61 74 74 69 6e 64 65 78 2e 68  R/SVG/attindex.h
0470: 74 6d 6c 23 50 72 65 73 65 6e 74 61 74 69 6f 6e  tml#Presentation
0480: 41 74 74 72 69 62 75 74 65 73 0a 20 20 53 56 47  Attributes.  SVG
0490: 5f 54 41 47 53 5f 4c 49 53 54 20 3d 20 5b 27 61  _TAGS_LIST = ['a
04a0: 6c 74 47 6c 79 70 68 27 2c 20 27 61 6e 69 6d 61  ltGlyph', 'anima
04b0: 74 65 27 2c 20 27 61 6e 69 6d 61 74 65 43 6f 6c  te', 'animateCol
04c0: 6f 72 27 2c 20 27 63 69 72 63 6c 65 27 2c 20 27  or', 'circle', '
04d0: 63 6c 69 70 50 61 74 68 27 2c 20 27 64 65 66 73  clipPath', 'defs
04e0: 27 2c 20 27 65 6c 6c 69 70 73 65 27 2c 20 27 66  ', 'ellipse', 'f
04f0: 65 42 6c 65 6e 64 27 2c 20 27 66 65 43 6f 6c 6f  eBlend', 'feColo
0500: 72 4d 61 74 72 69 78 27 2c 20 27 66 65 43 6f 6d  rMatrix', 'feCom
0510: 70 6f 6e 65 6e 74 54 72 61 6e 73 66 65 72 27 2c  ponentTransfer',
0520: 20 27 66 65 43 6f 6d 70 6f 73 69 74 65 27 2c 20   'feComposite', 
0530: 27 66 65 43 6f 6e 76 6f 6c 76 65 4d 61 74 72 69  'feConvolveMatri
0540: 78 27 2c 20 27 66 65 44 69 66 66 75 73 65 4c 69  x', 'feDiffuseLi
0550: 67 68 74 69 6e 67 27 2c 20 27 66 65 44 69 73 70  ghting', 'feDisp
0560: 6c 61 63 65 6d 65 6e 74 4d 61 70 27 2c 20 27 66  lacementMap', 'f
0570: 65 46 6c 6f 6f 64 27 2c 20 27 66 65 47 61 75 73  eFlood', 'feGaus
0580: 73 69 61 6e 42 6c 75 72 27 2c 20 27 66 65 49 6d  sianBlur', 'feIm
0590: 61 67 65 27 2c 20 27 66 65 4d 65 72 67 65 27 2c  age', 'feMerge',
05a0: 20 27 66 65 4d 6f 72 70 68 6f 6c 6f 67 79 27 2c   'feMorphology',
05b0: 20 27 66 65 4f 66 66 73 65 74 27 2c 20 27 66 65   'feOffset', 'fe
05c0: 53 70 65 63 75 6c 61 72 4c 69 67 68 74 69 6e 67  SpecularLighting
05d0: 27 2c 20 27 66 65 54 69 6c 65 27 2c 20 27 66 65  ', 'feTile', 'fe
05e0: 54 75 72 62 75 6c 65 6e 63 65 27 2c 20 27 66 69  Turbulence', 'fi
05f0: 6c 74 65 72 27 2c 20 27 66 6f 6e 74 27 2c 20 27  lter', 'font', '
0600: 66 6f 72 65 69 67 6e 4f 62 6a 65 63 74 27 2c 20  foreignObject', 
0610: 27 67 27 2c 20 27 67 6c 79 70 68 27 2c 20 27 67  'g', 'glyph', 'g
0620: 6c 79 70 68 52 65 66 27 2c 20 27 69 6d 61 67 65  lyphRef', 'image
0630: 27 2c 20 27 6c 69 6e 65 27 2c 20 27 6c 69 6e 65  ', 'line', 'line
0640: 61 72 47 72 61 64 69 65 6e 74 27 2c 20 27 6d 61  arGradient', 'ma
0650: 72 6b 65 72 27 2c 20 27 6d 61 73 6b 27 2c 20 27  rker', 'mask', '
0660: 6d 69 73 73 69 6e 67 2d 67 6c 79 70 68 27 2c 20  missing-glyph', 
0670: 27 70 61 74 68 27 2c 20 27 70 61 74 74 65 72 6e  'path', 'pattern
0680: 27 2c 20 27 70 6f 6c 79 67 6f 6e 27 2c 20 27 70  ', 'polygon', 'p
0690: 6f 6c 79 6c 69 6e 65 27 2c 20 27 72 61 64 69 61  olyline', 'radia
06a0: 6c 47 72 61 64 69 65 6e 74 27 2c 20 27 72 65 63  lGradient', 'rec
06b0: 74 27 2c 20 27 73 74 6f 70 27 2c 20 27 73 76 67  t', 'stop', 'svg
06c0: 27 2c 20 27 73 77 69 74 63 68 27 2c 20 27 73 79  ', 'switch', 'sy
06d0: 6d 62 6f 6c 27 2c 20 27 74 65 78 74 27 2c 20 27  mbol', 'text', '
06e0: 74 65 78 74 50 61 74 68 27 2c 20 27 74 72 65 66  textPath', 'tref
06f0: 27 2c 20 27 74 73 70 61 6e 27 2c 20 27 75 73 65  ', 'tspan', 'use
0700: 27 5d 2c 0a 0a 20 20 2f 2f 20 76 65 72 73 69 6f  '],..  // versio
0710: 6e 23 20 66 6f 72 20 49 45 20 38 2d 31 31 2c 20  n# for IE 8-11, 
0720: 30 20 66 6f 72 20 6f 74 68 65 72 73 0a 20 20 49  0 for others.  I
0730: 45 5f 56 45 52 53 49 4f 4e 20 3d 20 28 77 69 6e  E_VERSION = (win
0740: 64 6f 77 20 26 26 20 77 69 6e 64 6f 77 2e 64 6f  dow && window.do
0750: 63 75 6d 65 6e 74 20 7c 7c 20 7b 7d 29 2e 64 6f  cument || {}).do
0760: 63 75 6d 65 6e 74 4d 6f 64 65 20 7c 20 30 2c 0a  cumentMode | 0,.
0770: 0a 20 20 2f 2f 20 64 65 74 65 63 74 20 66 69 72  .  // detect fir
0780: 65 66 6f 78 20 74 6f 20 66 69 78 20 23 31 33 37  efox to fix #137
0790: 34 0a 20 20 46 49 52 45 46 4f 58 20 3d 20 77 69  4.  FIREFOX = wi
07a0: 6e 64 6f 77 20 26 26 20 21 21 77 69 6e 64 6f 77  ndow && !!window
07b0: 2e 49 6e 73 74 61 6c 6c 54 72 69 67 67 65 72 0a  .InstallTrigger.
07c0: 2f 2a 20 69 73 74 61 6e 62 75 6c 20 69 67 6e 6f  /* istanbul igno
07d0: 72 65 20 6e 65 78 74 20 2a 2f 0a 72 69 6f 74 2e  re next */.riot.
07e0: 6f 62 73 65 72 76 61 62 6c 65 20 3d 20 66 75 6e  observable = fun
07f0: 63 74 69 6f 6e 28 65 6c 29 20 7b 0a 0a 20 20 2f  ction(el) {..  /
0800: 2a 2a 0a 20 20 20 2a 20 45 78 74 65 6e 64 20 74  **.   * Extend t
0810: 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 62 6a 65  he original obje
0820: 63 74 20 6f 72 20 63 72 65 61 74 65 20 61 20 6e  ct or create a n
0830: 65 77 20 65 6d 70 74 79 20 6f 6e 65 0a 20 20 20  ew empty one.   
0840: 2a 20 40 74 79 70 65 20 7b 20 4f 62 6a 65 63 74  * @type { Object
0850: 20 7d 0a 20 20 20 2a 2f 0a 0a 20 20 65 6c 20 3d   }.   */..  el =
0860: 20 65 6c 20 7c 7c 20 7b 7d 0a 0a 20 20 2f 2a 2a   el || {}..  /**
0870: 0a 20 20 20 2a 20 50 72 69 76 61 74 65 20 76 61  .   * Private va
0880: 72 69 61 62 6c 65 73 0a 20 20 20 2a 2f 0a 20 20  riables.   */.  
0890: 76 61 72 20 63 61 6c 6c 62 61 63 6b 73 20 3d 20  var callbacks = 
08a0: 7b 7d 2c 0a 20 20 20 20 73 6c 69 63 65 20 3d 20  {},.    slice = 
08b0: 41 72 72 61 79 2e 70 72 6f 74 6f 74 79 70 65 2e  Array.prototype.
08c0: 73 6c 69 63 65 0a 0a 20 20 2f 2a 2a 0a 20 20 20  slice..  /**.   
08d0: 2a 20 50 72 69 76 61 74 65 20 4d 65 74 68 6f 64  * Private Method
08e0: 73 0a 20 20 20 2a 2f 0a 0a 20 20 2f 2a 2a 0a 20  s.   */..  /**. 
08f0: 20 20 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74    * Helper funct
0900: 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 67 65  ion needed to ge
0910: 74 20 61 6e 64 20 6c 6f 6f 70 20 61 6c 6c 20 74  t and loop all t
0920: 68 65 20 65 76 65 6e 74 73 20 69 6e 20 61 20 73  he events in a s
0930: 74 72 69 6e 67 0a 20 20 20 2a 20 40 70 61 72 61  tring.   * @para
0940: 6d 20 20 20 7b 20 53 74 72 69 6e 67 20 7d 20 20  m   { String }  
0950: 20 65 20 2d 20 65 76 65 6e 74 20 73 74 72 69 6e   e - event strin
0960: 67 0a 20 20 20 2a 20 40 70 61 72 61 6d 20 20 20  g.   * @param   
0970: 7b 46 75 6e 63 74 69 6f 6e 7d 20 20 20 66 6e 20  {Function}   fn 
0980: 2d 20 63 61 6c 6c 62 61 63 6b 0a 20 20 20 2a 2f  - callback.   */
0990: 0a 20 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 45 61  .  function onEa
09a0: 63 68 45 76 65 6e 74 28 65 2c 20 66 6e 29 20 7b  chEvent(e, fn) {
09b0: 0a 20 20 20 20 76 61 72 20 65 73 20 3d 20 65 2e  .    var es = e.
09c0: 73 70 6c 69 74 28 27 20 27 29 2c 20 6c 20 3d 20  split(' '), l = 
09d0: 65 73 2e 6c 65 6e 67 74 68 2c 20 69 20 3d 20 30  es.length, i = 0
09e0: 0a 20 20 20 20 66 6f 72 20 28 3b 20 69 20 3c 20  .    for (; i < 
09f0: 6c 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20  l; i++) {.      
0a00: 76 61 72 20 6e 61 6d 65 20 3d 20 65 73 5b 69 5d  var name = es[i]
0a10: 0a 20 20 20 20 20 20 69 66 20 28 6e 61 6d 65 29  .      if (name)
0a20: 20 66 6e 28 6e 61 6d 65 2c 20 69 29 0a 20 20 20   fn(name, i).   
0a30: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 0a 20 20   }.  }..  /**.  
0a40: 20 2a 20 50 75 62 6c 69 63 20 41 70 69 0a 20 20   * Public Api.  
0a50: 20 2a 2f 0a 0a 20 20 2f 2f 20 65 78 74 65 6e 64   */..  // extend
0a60: 20 74 68 65 20 65 6c 20 6f 62 6a 65 63 74 20 61   the el object a
0a70: 64 64 69 6e 67 20 74 68 65 20 6f 62 73 65 72 76  dding the observ
0a80: 61 62 6c 65 20 6d 65 74 68 6f 64 73 0a 20 20 4f  able methods.  O
0a90: 62 6a 65 63 74 2e 64 65 66 69 6e 65 50 72 6f 70  bject.defineProp
0aa0: 65 72 74 69 65 73 28 65 6c 2c 20 7b 0a 20 20 20  erties(el, {.   
0ab0: 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 4c 69 73 74   /**.     * List
0ac0: 65 6e 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  en to the given 
0ad0: 73 70 61 63 65 20 73 65 70 61 72 61 74 65 64 20  space separated 
0ae0: 6c 69 73 74 20 6f 66 20 60 65 76 65 6e 74 73 60  list of `events`
0af0: 20 61 6e 64 0a 20 20 20 20 20 2a 20 65 78 65 63   and.     * exec
0b00: 75 74 65 20 74 68 65 20 60 63 61 6c 6c 62 61 63  ute the `callbac
0b10: 6b 60 20 65 61 63 68 20 74 69 6d 65 20 61 6e 20  k` each time an 
0b20: 65 76 65 6e 74 20 69 73 20 74 72 69 67 67 65 72  event is trigger
0b30: 65 64 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61  ed..     * @para
0b40: 6d 20 20 7b 20 53 74 72 69 6e 67 20 7d 20 65 76  m  { String } ev
0b50: 65 6e 74 73 20 2d 20 65 76 65 6e 74 73 20 69 64  ents - events id
0b60: 73 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  s.     * @param 
0b70: 20 7b 20 46 75 6e 63 74 69 6f 6e 20 7d 20 66 6e   { Function } fn
0b80: 20 2d 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63   - callback func
0b90: 74 69 6f 6e 0a 20 20 20 20 20 2a 20 40 72 65 74  tion.     * @ret
0ba0: 75 72 6e 73 20 7b 20 4f 62 6a 65 63 74 20 7d 20  urns { Object } 
0bb0: 65 6c 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 6f  el.     */.    o
0bc0: 6e 3a 20 7b 0a 20 20 20 20 20 20 76 61 6c 75 65  n: {.      value
0bd0: 3a 20 66 75 6e 63 74 69 6f 6e 28 65 76 65 6e 74  : function(event
0be0: 73 2c 20 66 6e 29 20 7b 0a 20 20 20 20 20 20 20  s, fn) {.       
0bf0: 20 69 66 20 28 74 79 70 65 6f 66 20 66 6e 20 21   if (typeof fn !
0c00: 3d 20 27 66 75 6e 63 74 69 6f 6e 27 29 20 20 72  = 'function')  r
0c10: 65 74 75 72 6e 20 65 6c 0a 0a 20 20 20 20 20 20  eturn el..      
0c20: 20 20 6f 6e 45 61 63 68 45 76 65 6e 74 28 65 76    onEachEvent(ev
0c30: 65 6e 74 73 2c 20 66 75 6e 63 74 69 6f 6e 28 6e  ents, function(n
0c40: 61 6d 65 2c 20 70 6f 73 29 20 7b 0a 20 20 20 20  ame, pos) {.    
0c50: 20 20 20 20 20 20 28 63 61 6c 6c 62 61 63 6b 73        (callbacks
0c60: 5b 6e 61 6d 65 5d 20 3d 20 63 61 6c 6c 62 61 63  [name] = callbac
0c70: 6b 73 5b 6e 61 6d 65 5d 20 7c 7c 20 5b 5d 29 2e  ks[name] || []).
0c80: 70 75 73 68 28 66 6e 29 0a 20 20 20 20 20 20 20  push(fn).       
0c90: 20 20 20 66 6e 2e 74 79 70 65 64 20 3d 20 70 6f     fn.typed = po
0ca0: 73 20 3e 20 30 0a 20 20 20 20 20 20 20 20 7d 29  s > 0.        })
0cb0: 0a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
0cc0: 20 65 6c 0a 20 20 20 20 20 20 7d 2c 0a 20 20 20   el.      },.   
0cd0: 20 20 20 65 6e 75 6d 65 72 61 62 6c 65 3a 20 66     enumerable: f
0ce0: 61 6c 73 65 2c 0a 20 20 20 20 20 20 77 72 69 74  alse,.      writ
0cf0: 61 62 6c 65 3a 20 66 61 6c 73 65 2c 0a 20 20 20  able: false,.   
0d00: 20 20 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 3a     configurable:
0d10: 20 66 61 6c 73 65 0a 20 20 20 20 7d 2c 0a 0a 20   false.    },.. 
0d20: 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 52 65     /**.     * Re
0d30: 6d 6f 76 65 73 20 74 68 65 20 67 69 76 65 6e 20  moves the given 
0d40: 73 70 61 63 65 20 73 65 70 61 72 61 74 65 64 20  space separated 
0d50: 6c 69 73 74 20 6f 66 20 60 65 76 65 6e 74 73 60  list of `events`
0d60: 20 6c 69 73 74 65 6e 65 72 73 0a 20 20 20 20 20   listeners.     
0d70: 2a 20 40 70 61 72 61 6d 20 20 20 7b 20 53 74 72  * @param   { Str
0d80: 69 6e 67 20 7d 20 65 76 65 6e 74 73 20 2d 20 65  ing } events - e
0d90: 76 65 6e 74 73 20 69 64 73 0a 20 20 20 20 20 2a  vents ids.     *
0da0: 20 40 70 61 72 61 6d 20 20 20 7b 20 46 75 6e 63   @param   { Func
0db0: 74 69 6f 6e 20 7d 20 66 6e 20 2d 20 63 61 6c 6c  tion } fn - call
0dc0: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 0a 20 20  back function.  
0dd0: 20 20 20 2a 20 40 72 65 74 75 72 6e 73 20 7b 20     * @returns { 
0de0: 4f 62 6a 65 63 74 20 7d 20 65 6c 0a 20 20 20 20  Object } el.    
0df0: 20 2a 2f 0a 20 20 20 20 6f 66 66 3a 20 7b 0a 20   */.    off: {. 
0e00: 20 20 20 20 20 76 61 6c 75 65 3a 20 66 75 6e 63       value: func
0e10: 74 69 6f 6e 28 65 76 65 6e 74 73 2c 20 66 6e 29  tion(events, fn)
0e20: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 65   {.        if (e
0e30: 76 65 6e 74 73 20 3d 3d 20 27 2a 27 20 26 26 20  vents == '*' && 
0e40: 21 66 6e 29 20 63 61 6c 6c 62 61 63 6b 73 20 3d  !fn) callbacks =
0e50: 20 7b 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 65   {}.        else
0e60: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 45   {.          onE
0e70: 61 63 68 45 76 65 6e 74 28 65 76 65 6e 74 73 2c  achEvent(events,
0e80: 20 66 75 6e 63 74 69 6f 6e 28 6e 61 6d 65 2c 20   function(name, 
0e90: 70 6f 73 29 20 7b 0a 20 20 20 20 20 20 20 20 20  pos) {.         
0ea0: 20 20 20 69 66 20 28 66 6e 29 20 7b 0a 20 20 20     if (fn) {.   
0eb0: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 20 61             var a
0ec0: 72 72 20 3d 20 63 61 6c 6c 62 61 63 6b 73 5b 6e  rr = callbacks[n
0ed0: 61 6d 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ame].           
0ee0: 20 20 20 66 6f 72 20 28 76 61 72 20 69 20 3d 20     for (var i = 
0ef0: 30 2c 20 63 62 3b 20 63 62 20 3d 20 61 72 72 20  0, cb; cb = arr 
0f00: 26 26 20 61 72 72 5b 69 5d 3b 20 2b 2b 69 29 20  && arr[i]; ++i) 
0f10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
0f20: 20 20 69 66 20 28 63 62 20 3d 3d 20 66 6e 29 20    if (cb == fn) 
0f30: 61 72 72 2e 73 70 6c 69 63 65 28 69 2d 2d 2c 20  arr.splice(i--, 
0f40: 31 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1).             
0f50: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
0f60: 20 65 6c 73 65 20 64 65 6c 65 74 65 20 63 61 6c   else delete cal
0f70: 6c 62 61 63 6b 73 5b 6e 61 6d 65 5d 0a 20 20 20  lbacks[name].   
0f80: 20 20 20 20 20 20 20 7d 29 0a 20 20 20 20 20 20         }).      
0f90: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
0fa0: 72 6e 20 65 6c 0a 20 20 20 20 20 20 7d 2c 0a 20  rn el.      },. 
0fb0: 20 20 20 20 20 65 6e 75 6d 65 72 61 62 6c 65 3a       enumerable:
0fc0: 20 66 61 6c 73 65 2c 0a 20 20 20 20 20 20 77 72   false,.      wr
0fd0: 69 74 61 62 6c 65 3a 20 66 61 6c 73 65 2c 0a 20  itable: false,. 
0fe0: 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 62 6c       configurabl
0ff0: 65 3a 20 66 61 6c 73 65 0a 20 20 20 20 7d 2c 0a  e: false.    },.
1000: 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20  .    /**.     * 
1010: 4c 69 73 74 65 6e 20 74 6f 20 74 68 65 20 67 69  Listen to the gi
1020: 76 65 6e 20 73 70 61 63 65 20 73 65 70 61 72 61  ven space separa
1030: 74 65 64 20 6c 69 73 74 20 6f 66 20 60 65 76 65  ted list of `eve
1040: 6e 74 73 60 20 61 6e 64 0a 20 20 20 20 20 2a 20  nts` and.     * 
1050: 65 78 65 63 75 74 65 20 74 68 65 20 60 63 61 6c  execute the `cal
1060: 6c 62 61 63 6b 60 20 61 74 20 6d 6f 73 74 20 6f  lback` at most o
1070: 6e 63 65 0a 20 20 20 20 20 2a 20 40 70 61 72 61  nce.     * @para
1080: 6d 20 20 20 7b 20 53 74 72 69 6e 67 20 7d 20 65  m   { String } e
1090: 76 65 6e 74 73 20 2d 20 65 76 65 6e 74 73 20 69  vents - events i
10a0: 64 73 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d  ds.     * @param
10b0: 20 20 20 7b 20 46 75 6e 63 74 69 6f 6e 20 7d 20     { Function } 
10c0: 66 6e 20 2d 20 63 61 6c 6c 62 61 63 6b 20 66 75  fn - callback fu
10d0: 6e 63 74 69 6f 6e 0a 20 20 20 20 20 2a 20 40 72  nction.     * @r
10e0: 65 74 75 72 6e 73 20 7b 20 4f 62 6a 65 63 74 20  eturns { Object 
10f0: 7d 20 65 6c 0a 20 20 20 20 20 2a 2f 0a 20 20 20  } el.     */.   
1100: 20 6f 6e 65 3a 20 7b 0a 20 20 20 20 20 20 76 61   one: {.      va
1110: 6c 75 65 3a 20 66 75 6e 63 74 69 6f 6e 28 65 76  lue: function(ev
1120: 65 6e 74 73 2c 20 66 6e 29 20 7b 0a 20 20 20 20  ents, fn) {.    
1130: 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 28      function on(
1140: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 65 6c  ) {.          el
1150: 2e 6f 66 66 28 65 76 65 6e 74 73 2c 20 6f 6e 29  .off(events, on)
1160: 0a 20 20 20 20 20 20 20 20 20 20 66 6e 2e 61 70  .          fn.ap
1170: 70 6c 79 28 65 6c 2c 20 61 72 67 75 6d 65 6e 74  ply(el, argument
1180: 73 29 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  s).        }.   
1190: 20 20 20 20 20 72 65 74 75 72 6e 20 65 6c 2e 6f       return el.o
11a0: 6e 28 65 76 65 6e 74 73 2c 20 6f 6e 29 0a 20 20  n(events, on).  
11b0: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 65 6e 75      },.      enu
11c0: 6d 65 72 61 62 6c 65 3a 20 66 61 6c 73 65 2c 0a  merable: false,.
11d0: 20 20 20 20 20 20 77 72 69 74 61 62 6c 65 3a 20        writable: 
11e0: 66 61 6c 73 65 2c 0a 20 20 20 20 20 20 63 6f 6e  false,.      con
11f0: 66 69 67 75 72 61 62 6c 65 3a 20 66 61 6c 73 65  figurable: false
1200: 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 2f 2a 2a  .    },..    /**
1210: 0a 20 20 20 20 20 2a 20 45 78 65 63 75 74 65 20  .     * Execute 
1220: 61 6c 6c 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  all callback fun
1230: 63 74 69 6f 6e 73 20 74 68 61 74 20 6c 69 73 74  ctions that list
1240: 65 6e 20 74 6f 0a 20 20 20 20 20 2a 20 74 68 65  en to.     * the
1250: 20 67 69 76 65 6e 20 73 70 61 63 65 20 73 65 70   given space sep
1260: 61 72 61 74 65 64 20 6c 69 73 74 20 6f 66 20 60  arated list of `
1270: 65 76 65 6e 74 73 60 0a 20 20 20 20 20 2a 20 40  events`.     * @
1280: 70 61 72 61 6d 20 20 20 7b 20 53 74 72 69 6e 67  param   { String
1290: 20 7d 20 65 76 65 6e 74 73 20 2d 20 65 76 65 6e   } events - even
12a0: 74 73 20 69 64 73 0a 20 20 20 20 20 2a 20 40 72  ts ids.     * @r
12b0: 65 74 75 72 6e 73 20 7b 20 4f 62 6a 65 63 74 20  eturns { Object 
12c0: 7d 20 65 6c 0a 20 20 20 20 20 2a 2f 0a 20 20 20  } el.     */.   
12d0: 20 74 72 69 67 67 65 72 3a 20 7b 0a 20 20 20 20   trigger: {.    
12e0: 20 20 76 61 6c 75 65 3a 20 66 75 6e 63 74 69 6f    value: functio
12f0: 6e 28 65 76 65 6e 74 73 29 20 7b 0a 0a 20 20 20  n(events) {..   
1300: 20 20 20 20 20 2f 2f 20 67 65 74 74 69 6e 67 20       // getting 
1310: 74 68 65 20 61 72 67 75 6d 65 6e 74 73 0a 20 20  the arguments.  
1320: 20 20 20 20 20 20 76 61 72 20 61 72 67 6c 65 6e        var arglen
1330: 20 3d 20 61 72 67 75 6d 65 6e 74 73 2e 6c 65 6e   = arguments.len
1340: 67 74 68 20 2d 20 31 2c 0a 20 20 20 20 20 20 20  gth - 1,.       
1350: 20 20 20 61 72 67 73 20 3d 20 6e 65 77 20 41 72     args = new Ar
1360: 72 61 79 28 61 72 67 6c 65 6e 29 2c 0a 20 20 20  ray(arglen),.   
1370: 20 20 20 20 20 20 20 66 6e 73 0a 0a 20 20 20 20         fns..    
1380: 20 20 20 20 66 6f 72 20 28 76 61 72 20 69 20 3d      for (var i =
1390: 20 30 3b 20 69 20 3c 20 61 72 67 6c 65 6e 3b 20   0; i < arglen; 
13a0: 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20  i++) {.         
13b0: 20 61 72 67 73 5b 69 5d 20 3d 20 61 72 67 75 6d   args[i] = argum
13c0: 65 6e 74 73 5b 69 20 2b 20 31 5d 20 2f 2f 20 73  ents[i + 1] // s
13d0: 6b 69 70 20 66 69 72 73 74 20 61 72 67 75 6d 65  kip first argume
13e0: 6e 74 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  nt.        }..  
13f0: 20 20 20 20 20 20 6f 6e 45 61 63 68 45 76 65 6e        onEachEven
1400: 74 28 65 76 65 6e 74 73 2c 20 66 75 6e 63 74 69  t(events, functi
1410: 6f 6e 28 6e 61 6d 65 2c 20 70 6f 73 29 20 7b 0a  on(name, pos) {.
1420: 0a 20 20 20 20 20 20 20 20 20 20 66 6e 73 20 3d  .          fns =
1430: 20 73 6c 69 63 65 2e 63 61 6c 6c 28 63 61 6c 6c   slice.call(call
1440: 62 61 63 6b 73 5b 6e 61 6d 65 5d 20 7c 7c 20 5b  backs[name] || [
1450: 5d 2c 20 30 29 0a 0a 20 20 20 20 20 20 20 20 20  ], 0)..         
1460: 20 66 6f 72 20 28 76 61 72 20 69 20 3d 20 30 2c   for (var i = 0,
1470: 20 66 6e 3b 20 66 6e 20 3d 20 66 6e 73 5b 69 5d   fn; fn = fns[i]
1480: 3b 20 2b 2b 69 29 20 7b 0a 20 20 20 20 20 20 20  ; ++i) {.       
1490: 20 20 20 20 20 69 66 20 28 66 6e 2e 62 75 73 79       if (fn.busy
14a0: 29 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 20  ) continue.     
14b0: 20 20 20 20 20 20 20 66 6e 2e 62 75 73 79 20 3d         fn.busy =
14c0: 20 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 66   1.            f
14d0: 6e 2e 61 70 70 6c 79 28 65 6c 2c 20 66 6e 2e 74  n.apply(el, fn.t
14e0: 79 70 65 64 20 3f 20 5b 6e 61 6d 65 5d 2e 63 6f  yped ? [name].co
14f0: 6e 63 61 74 28 61 72 67 73 29 20 3a 20 61 72 67  ncat(args) : arg
1500: 73 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  s).            i
1510: 66 20 28 66 6e 73 5b 69 5d 20 21 3d 3d 20 66 6e  f (fns[i] !== fn
1520: 29 20 7b 20 69 2d 2d 20 7d 0a 20 20 20 20 20 20  ) { i-- }.      
1530: 20 20 20 20 20 20 66 6e 2e 62 75 73 79 20 3d 20        fn.busy = 
1540: 30 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  0.          }.. 
1550: 20 20 20 20 20 20 20 20 20 69 66 20 28 63 61 6c           if (cal
1560: 6c 62 61 63 6b 73 5b 27 2a 27 5d 20 26 26 20 6e  lbacks['*'] && n
1570: 61 6d 65 20 21 3d 20 27 2a 27 29 0a 20 20 20 20  ame != '*').    
1580: 20 20 20 20 20 20 20 20 65 6c 2e 74 72 69 67 67          el.trigg
1590: 65 72 2e 61 70 70 6c 79 28 65 6c 2c 20 5b 27 2a  er.apply(el, ['*
15a0: 27 2c 20 6e 61 6d 65 5d 2e 63 6f 6e 63 61 74 28  ', name].concat(
15b0: 61 72 67 73 29 29 0a 0a 20 20 20 20 20 20 20 20  args))..        
15c0: 7d 29 0a 0a 20 20 20 20 20 20 20 20 72 65 74 75  })..        retu
15d0: 72 6e 20 65 6c 0a 20 20 20 20 20 20 7d 2c 0a 20  rn el.      },. 
15e0: 20 20 20 20 20 65 6e 75 6d 65 72 61 62 6c 65 3a       enumerable:
15f0: 20 66 61 6c 73 65 2c 0a 20 20 20 20 20 20 77 72   false,.      wr
1600: 69 74 61 62 6c 65 3a 20 66 61 6c 73 65 2c 0a 20  itable: false,. 
1610: 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 62 6c       configurabl
1620: 65 3a 20 66 61 6c 73 65 0a 20 20 20 20 7d 0a 20  e: false.    }. 
1630: 20 7d 29 0a 0a 20 20 72 65 74 75 72 6e 20 65 6c   })..  return el
1640: 0a 0a 7d 0a 2f 2a 20 69 73 74 61 6e 62 75 6c 20  ..}./* istanbul 
1650: 69 67 6e 6f 72 65 20 6e 65 78 74 20 2a 2f 0a 3b  ignore next */.;
1660: 28 66 75 6e 63 74 69 6f 6e 28 72 69 6f 74 29 20  (function(riot) 
1670: 7b 0a 0a 2f 2a 2a 0a 20 2a 20 53 69 6d 70 6c 65  {../**. * Simple
1680: 20 63 6c 69 65 6e 74 2d 73 69 64 65 20 72 6f 75   client-side rou
1690: 74 65 72 0a 20 2a 20 40 6d 6f 64 75 6c 65 20 72  ter. * @module r
16a0: 69 6f 74 2d 72 6f 75 74 65 0a 20 2a 2f 0a 0a 0a  iot-route. */...
16b0: 76 61 72 20 52 45 5f 4f 52 49 47 49 4e 20 3d 20  var RE_ORIGIN = 
16c0: 2f 5e 2e 2b 3f 5c 2f 5c 2f 2b 5b 5e 5c 2f 5d 2b  /^.+?\/\/+[^\/]+
16d0: 2f 2c 0a 20 20 45 56 45 4e 54 5f 4c 49 53 54 45  /,.  EVENT_LISTE
16e0: 4e 45 52 20 3d 20 27 45 76 65 6e 74 4c 69 73 74  NER = 'EventList
16f0: 65 6e 65 72 27 2c 0a 20 20 52 45 4d 4f 56 45 5f  ener',.  REMOVE_
1700: 45 56 45 4e 54 5f 4c 49 53 54 45 4e 45 52 20 3d  EVENT_LISTENER =
1710: 20 27 72 65 6d 6f 76 65 27 20 2b 20 45 56 45 4e   'remove' + EVEN
1720: 54 5f 4c 49 53 54 45 4e 45 52 2c 0a 20 20 41 44  T_LISTENER,.  AD
1730: 44 5f 45 56 45 4e 54 5f 4c 49 53 54 45 4e 45 52  D_EVENT_LISTENER
1740: 20 3d 20 27 61 64 64 27 20 2b 20 45 56 45 4e 54   = 'add' + EVENT
1750: 5f 4c 49 53 54 45 4e 45 52 2c 0a 20 20 48 41 53  _LISTENER,.  HAS
1760: 5f 41 54 54 52 49 42 55 54 45 20 3d 20 27 68 61  _ATTRIBUTE = 'ha
1770: 73 41 74 74 72 69 62 75 74 65 27 2c 0a 20 20 52  sAttribute',.  R
1780: 45 50 4c 41 43 45 20 3d 20 27 72 65 70 6c 61 63  EPLACE = 'replac
1790: 65 27 2c 0a 20 20 50 4f 50 53 54 41 54 45 20 3d  e',.  POPSTATE =
17a0: 20 27 70 6f 70 73 74 61 74 65 27 2c 0a 20 20 48   'popstate',.  H
17b0: 41 53 48 43 48 41 4e 47 45 20 3d 20 27 68 61 73  ASHCHANGE = 'has
17c0: 68 63 68 61 6e 67 65 27 2c 0a 20 20 54 52 49 47  hchange',.  TRIG
17d0: 47 45 52 20 3d 20 27 74 72 69 67 67 65 72 27 2c  GER = 'trigger',
17e0: 0a 20 20 4d 41 58 5f 45 4d 49 54 5f 53 54 41 43  .  MAX_EMIT_STAC
17f0: 4b 5f 4c 45 56 45 4c 20 3d 20 33 2c 0a 20 20 77  K_LEVEL = 3,.  w
1800: 69 6e 20 3d 20 74 79 70 65 6f 66 20 77 69 6e 64  in = typeof wind
1810: 6f 77 20 21 3d 20 27 75 6e 64 65 66 69 6e 65 64  ow != 'undefined
1820: 27 20 26 26 20 77 69 6e 64 6f 77 2c 0a 20 20 64  ' && window,.  d
1830: 6f 63 20 3d 20 74 79 70 65 6f 66 20 64 6f 63 75  oc = typeof docu
1840: 6d 65 6e 74 20 21 3d 20 27 75 6e 64 65 66 69 6e  ment != 'undefin
1850: 65 64 27 20 26 26 20 64 6f 63 75 6d 65 6e 74 2c  ed' && document,
1860: 0a 20 20 68 69 73 74 20 3d 20 77 69 6e 20 26 26  .  hist = win &&
1870: 20 68 69 73 74 6f 72 79 2c 0a 20 20 6c 6f 63 20   history,.  loc 
1880: 3d 20 77 69 6e 20 26 26 20 28 68 69 73 74 2e 6c  = win && (hist.l
1890: 6f 63 61 74 69 6f 6e 20 7c 7c 20 77 69 6e 2e 6c  ocation || win.l
18a0: 6f 63 61 74 69 6f 6e 29 2c 20 2f 2f 20 73 65 65  ocation), // see
18b0: 20 68 74 6d 6c 35 2d 68 69 73 74 6f 72 79 2d 61   html5-history-a
18c0: 70 69 0a 20 20 70 72 6f 74 20 3d 20 52 6f 75 74  pi.  prot = Rout
18d0: 65 72 2e 70 72 6f 74 6f 74 79 70 65 2c 20 2f 2f  er.prototype, //
18e0: 20 74 6f 20 6d 69 6e 69 66 79 20 6d 6f 72 65 0a   to minify more.
18f0: 20 20 63 6c 69 63 6b 45 76 65 6e 74 20 3d 20 64    clickEvent = d
1900: 6f 63 20 26 26 20 64 6f 63 2e 6f 6e 74 6f 75 63  oc && doc.ontouc
1910: 68 73 74 61 72 74 20 3f 20 27 74 6f 75 63 68 73  hstart ? 'touchs
1920: 74 61 72 74 27 20 3a 20 27 63 6c 69 63 6b 27 2c  tart' : 'click',
1930: 0a 20 20 73 74 61 72 74 65 64 20 3d 20 66 61 6c  .  started = fal
1940: 73 65 2c 0a 20 20 63 65 6e 74 72 61 6c 20 3d 20  se,.  central = 
1950: 72 69 6f 74 2e 6f 62 73 65 72 76 61 62 6c 65 28  riot.observable(
1960: 29 2c 0a 20 20 72 6f 75 74 65 46 6f 75 6e 64 20  ),.  routeFound 
1970: 3d 20 66 61 6c 73 65 2c 0a 20 20 64 65 62 6f 75  = false,.  debou
1980: 6e 63 65 64 45 6d 69 74 2c 0a 20 20 62 61 73 65  ncedEmit,.  base
1990: 2c 20 63 75 72 72 65 6e 74 2c 20 70 61 72 73 65  , current, parse
19a0: 72 2c 20 73 65 63 6f 6e 64 50 61 72 73 65 72 2c  r, secondParser,
19b0: 20 65 6d 69 74 53 74 61 63 6b 20 3d 20 5b 5d 2c   emitStack = [],
19c0: 20 65 6d 69 74 53 74 61 63 6b 4c 65 76 65 6c 20   emitStackLevel 
19d0: 3d 20 30 0a 0a 2f 2a 2a 0a 20 2a 20 44 65 66 61  = 0../**. * Defa
19e0: 75 6c 74 20 70 61 72 73 65 72 2e 20 59 6f 75 20  ult parser. You 
19f0: 63 61 6e 20 72 65 70 6c 61 63 65 20 69 74 20 76  can replace it v
1a00: 69 61 20 72 6f 75 74 65 72 2e 70 61 72 73 65 72  ia router.parser
1a10: 20 6d 65 74 68 6f 64 2e 0a 20 2a 20 40 70 61 72   method.. * @par
1a20: 61 6d 20 7b 73 74 72 69 6e 67 7d 20 70 61 74 68  am {string} path
1a30: 20 2d 20 63 75 72 72 65 6e 74 20 70 61 74 68 20   - current path 
1a40: 28 6e 6f 72 6d 61 6c 69 7a 65 64 29 0a 20 2a 20  (normalized). * 
1a50: 40 72 65 74 75 72 6e 73 20 7b 61 72 72 61 79 7d  @returns {array}
1a60: 20 61 72 72 61 79 0a 20 2a 2f 0a 66 75 6e 63 74   array. */.funct
1a70: 69 6f 6e 20 44 45 46 41 55 4c 54 5f 50 41 52 53  ion DEFAULT_PARS
1a80: 45 52 28 70 61 74 68 29 20 7b 0a 20 20 72 65 74  ER(path) {.  ret
1a90: 75 72 6e 20 70 61 74 68 2e 73 70 6c 69 74 28 2f  urn path.split(/
1aa0: 5b 2f 3f 23 5d 2f 29 0a 7d 0a 0a 2f 2a 2a 0a 20  [/?#]/).}../**. 
1ab0: 2a 20 44 65 66 61 75 6c 74 20 70 61 72 73 65 72  * Default parser
1ac0: 20 28 73 65 63 6f 6e 64 29 2e 20 59 6f 75 20 63   (second). You c
1ad0: 61 6e 20 72 65 70 6c 61 63 65 20 69 74 20 76 69  an replace it vi
1ae0: 61 20 72 6f 75 74 65 72 2e 70 61 72 73 65 72 20  a router.parser 
1af0: 6d 65 74 68 6f 64 2e 0a 20 2a 20 40 70 61 72 61  method.. * @para
1b00: 6d 20 7b 73 74 72 69 6e 67 7d 20 70 61 74 68 20  m {string} path 
1b10: 2d 20 63 75 72 72 65 6e 74 20 70 61 74 68 20 28  - current path (
1b20: 6e 6f 72 6d 61 6c 69 7a 65 64 29 0a 20 2a 20 40  normalized). * @
1b30: 70 61 72 61 6d 20 7b 73 74 72 69 6e 67 7d 20 66  param {string} f
1b40: 69 6c 74 65 72 20 2d 20 66 69 6c 74 65 72 20 73  ilter - filter s
1b50: 74 72 69 6e 67 20 28 6e 6f 72 6d 61 6c 69 7a 65  tring (normalize
1b60: 64 29 0a 20 2a 20 40 72 65 74 75 72 6e 73 20 7b  d). * @returns {
1b70: 61 72 72 61 79 7d 20 61 72 72 61 79 0a 20 2a 2f  array} array. */
1b80: 0a 66 75 6e 63 74 69 6f 6e 20 44 45 46 41 55 4c  .function DEFAUL
1b90: 54 5f 53 45 43 4f 4e 44 5f 50 41 52 53 45 52 28  T_SECOND_PARSER(
1ba0: 70 61 74 68 2c 20 66 69 6c 74 65 72 29 20 7b 0a  path, filter) {.
1bb0: 20 20 76 61 72 20 72 65 20 3d 20 6e 65 77 20 52    var re = new R
1bc0: 65 67 45 78 70 28 27 5e 27 20 2b 20 66 69 6c 74  egExp('^' + filt
1bd0: 65 72 5b 52 45 50 4c 41 43 45 5d 28 2f 5c 2a 2f  er[REPLACE](/\*/
1be0: 67 2c 20 27 28 5b 5e 2f 3f 23 5d 2b 3f 29 27 29  g, '([^/?#]+?)')
1bf0: 5b 52 45 50 4c 41 43 45 5d 28 2f 5c 2e 5c 2e 2f  [REPLACE](/\.\./
1c00: 2c 20 27 2e 2a 27 29 20 2b 20 27 24 27 29 2c 0a  , '.*') + '$'),.
1c10: 20 20 20 20 61 72 67 73 20 3d 20 70 61 74 68 2e      args = path.
1c20: 6d 61 74 63 68 28 72 65 29 0a 0a 20 20 69 66 20  match(re)..  if 
1c30: 28 61 72 67 73 29 20 72 65 74 75 72 6e 20 61 72  (args) return ar
1c40: 67 73 2e 73 6c 69 63 65 28 31 29 0a 7d 0a 0a 2f  gs.slice(1).}../
1c50: 2a 2a 0a 20 2a 20 53 69 6d 70 6c 65 2f 63 68 65  **. * Simple/che
1c60: 61 70 20 64 65 62 6f 75 6e 63 65 20 69 6d 70 6c  ap debounce impl
1c70: 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 2a 20 40 70  ementation. * @p
1c80: 61 72 61 6d 20 20 20 7b 66 75 6e 63 74 69 6f 6e  aram   {function
1c90: 7d 20 66 6e 20 2d 20 63 61 6c 6c 62 61 63 6b 0a  } fn - callback.
1ca0: 20 2a 20 40 70 61 72 61 6d 20 20 20 7b 6e 75 6d   * @param   {num
1cb0: 62 65 72 7d 20 64 65 6c 61 79 20 2d 20 64 65 6c  ber} delay - del
1cc0: 61 79 20 69 6e 20 73 65 63 6f 6e 64 73 0a 20 2a  ay in seconds. *
1cd0: 20 40 72 65 74 75 72 6e 73 20 7b 66 75 6e 63 74   @returns {funct
1ce0: 69 6f 6e 7d 20 64 65 62 6f 75 6e 63 65 64 20 66  ion} debounced f
1cf0: 75 6e 63 74 69 6f 6e 0a 20 2a 2f 0a 66 75 6e 63  unction. */.func
1d00: 74 69 6f 6e 20 64 65 62 6f 75 6e 63 65 28 66 6e  tion debounce(fn
1d10: 2c 20 64 65 6c 61 79 29 20 7b 0a 20 20 76 61 72  , delay) {.  var
1d20: 20 74 0a 20 20 72 65 74 75 72 6e 20 66 75 6e 63   t.  return func
1d30: 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20 63 6c  tion () {.    cl
1d40: 65 61 72 54 69 6d 65 6f 75 74 28 74 29 0a 20 20  earTimeout(t).  
1d50: 20 20 74 20 3d 20 73 65 74 54 69 6d 65 6f 75 74    t = setTimeout
1d60: 28 66 6e 2c 20 64 65 6c 61 79 29 0a 20 20 7d 0a  (fn, delay).  }.
1d70: 7d 0a 0a 2f 2a 2a 0a 20 2a 20 53 65 74 20 74 68  }../**. * Set th
1d80: 65 20 77 69 6e 64 6f 77 20 6c 69 73 74 65 6e 65  e window listene
1d90: 72 73 20 74 6f 20 74 72 69 67 67 65 72 20 74 68  rs to trigger th
1da0: 65 20 72 6f 75 74 65 73 0a 20 2a 20 40 70 61 72  e routes. * @par
1db0: 61 6d 20 7b 62 6f 6f 6c 65 61 6e 7d 20 61 75 74  am {boolean} aut
1dc0: 6f 45 78 65 63 20 2d 20 73 65 65 20 72 6f 75 74  oExec - see rout
1dd0: 65 2e 73 74 61 72 74 0a 20 2a 2f 0a 66 75 6e 63  e.start. */.func
1de0: 74 69 6f 6e 20 73 74 61 72 74 28 61 75 74 6f 45  tion start(autoE
1df0: 78 65 63 29 20 7b 0a 20 20 64 65 62 6f 75 6e 63  xec) {.  debounc
1e00: 65 64 45 6d 69 74 20 3d 20 64 65 62 6f 75 6e 63  edEmit = debounc
1e10: 65 28 65 6d 69 74 2c 20 31 29 0a 20 20 77 69 6e  e(emit, 1).  win
1e20: 5b 41 44 44 5f 45 56 45 4e 54 5f 4c 49 53 54 45  [ADD_EVENT_LISTE
1e30: 4e 45 52 5d 28 50 4f 50 53 54 41 54 45 2c 20 64  NER](POPSTATE, d
1e40: 65 62 6f 75 6e 63 65 64 45 6d 69 74 29 0a 20 20  ebouncedEmit).  
1e50: 77 69 6e 5b 41 44 44 5f 45 56 45 4e 54 5f 4c 49  win[ADD_EVENT_LI
1e60: 53 54 45 4e 45 52 5d 28 48 41 53 48 43 48 41 4e  STENER](HASHCHAN
1e70: 47 45 2c 20 64 65 62 6f 75 6e 63 65 64 45 6d 69  GE, debouncedEmi
1e80: 74 29 0a 20 20 64 6f 63 5b 41 44 44 5f 45 56 45  t).  doc[ADD_EVE
1e90: 4e 54 5f 4c 49 53 54 45 4e 45 52 5d 28 63 6c 69  NT_LISTENER](cli
1ea0: 63 6b 45 76 65 6e 74 2c 20 63 6c 69 63 6b 29 0a  ckEvent, click).
1eb0: 20 20 69 66 20 28 61 75 74 6f 45 78 65 63 29 20    if (autoExec) 
1ec0: 65 6d 69 74 28 74 72 75 65 29 0a 7d 0a 0a 2f 2a  emit(true).}../*
1ed0: 2a 0a 20 2a 20 52 6f 75 74 65 72 20 63 6c 61 73  *. * Router clas
1ee0: 73 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 52  s. */.function R
1ef0: 6f 75 74 65 72 28 29 20 7b 0a 20 20 74 68 69 73  outer() {.  this
1f00: 2e 24 20 3d 20 5b 5d 0a 20 20 72 69 6f 74 2e 6f  .$ = [].  riot.o
1f10: 62 73 65 72 76 61 62 6c 65 28 74 68 69 73 29 20  bservable(this) 
1f20: 2f 2f 20 6d 61 6b 65 20 69 74 20 6f 62 73 65 72  // make it obser
1f30: 76 61 62 6c 65 0a 20 20 63 65 6e 74 72 61 6c 2e  vable.  central.
1f40: 6f 6e 28 27 73 74 6f 70 27 2c 20 74 68 69 73 2e  on('stop', this.
1f50: 73 2e 62 69 6e 64 28 74 68 69 73 29 29 0a 20 20  s.bind(this)).  
1f60: 63 65 6e 74 72 61 6c 2e 6f 6e 28 27 65 6d 69 74  central.on('emit
1f70: 27 2c 20 74 68 69 73 2e 65 2e 62 69 6e 64 28 74  ', this.e.bind(t
1f80: 68 69 73 29 29 0a 7d 0a 0a 66 75 6e 63 74 69 6f  his)).}..functio
1f90: 6e 20 6e 6f 72 6d 61 6c 69 7a 65 28 70 61 74 68  n normalize(path
1fa0: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 74  ) {.  return pat
1fb0: 68 5b 52 45 50 4c 41 43 45 5d 28 2f 5e 5c 2f 7c  h[REPLACE](/^\/|
1fc0: 5c 2f 24 2f 2c 20 27 27 29 0a 7d 0a 0a 66 75 6e  \/$/, '').}..fun
1fd0: 63 74 69 6f 6e 20 69 73 53 74 72 69 6e 67 28 73  ction isString(s
1fe0: 74 72 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 74  tr) {.  return t
1ff0: 79 70 65 6f 66 20 73 74 72 20 3d 3d 20 27 73 74  ypeof str == 'st
2000: 72 69 6e 67 27 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20  ring'.}../**. * 
2010: 47 65 74 20 74 68 65 20 70 61 72 74 20 61 66 74  Get the part aft
2020: 65 72 20 64 6f 6d 61 69 6e 20 6e 61 6d 65 0a 20  er domain name. 
2030: 2a 20 40 70 61 72 61 6d 20 7b 73 74 72 69 6e 67  * @param {string
2040: 7d 20 68 72 65 66 20 2d 20 66 75 6c 6c 70 61 74  } href - fullpat
2050: 68 0a 20 2a 20 40 72 65 74 75 72 6e 73 20 7b 73  h. * @returns {s
2060: 74 72 69 6e 67 7d 20 70 61 74 68 20 66 72 6f 6d  tring} path from
2070: 20 72 6f 6f 74 0a 20 2a 2f 0a 66 75 6e 63 74 69   root. */.functi
2080: 6f 6e 20 67 65 74 50 61 74 68 46 72 6f 6d 52 6f  on getPathFromRo
2090: 6f 74 28 68 72 65 66 29 20 7b 0a 20 20 72 65 74  ot(href) {.  ret
20a0: 75 72 6e 20 28 68 72 65 66 20 7c 7c 20 6c 6f 63  urn (href || loc
20b0: 2e 68 72 65 66 29 5b 52 45 50 4c 41 43 45 5d 28  .href)[REPLACE](
20c0: 52 45 5f 4f 52 49 47 49 4e 2c 20 27 27 29 0a 7d  RE_ORIGIN, '').}
20d0: 0a 0a 2f 2a 2a 0a 20 2a 20 47 65 74 20 74 68 65  ../**. * Get the
20e0: 20 70 61 72 74 20 61 66 74 65 72 20 62 61 73 65   part after base
20f0: 0a 20 2a 20 40 70 61 72 61 6d 20 7b 73 74 72 69  . * @param {stri
2100: 6e 67 7d 20 68 72 65 66 20 2d 20 66 75 6c 6c 70  ng} href - fullp
2110: 61 74 68 0a 20 2a 20 40 72 65 74 75 72 6e 73 20  ath. * @returns 
2120: 7b 73 74 72 69 6e 67 7d 20 70 61 74 68 20 66 72  {string} path fr
2130: 6f 6d 20 62 61 73 65 0a 20 2a 2f 0a 66 75 6e 63  om base. */.func
2140: 74 69 6f 6e 20 67 65 74 50 61 74 68 46 72 6f 6d  tion getPathFrom
2150: 42 61 73 65 28 68 72 65 66 29 20 7b 0a 20 20 72  Base(href) {.  r
2160: 65 74 75 72 6e 20 62 61 73 65 5b 30 5d 20 3d 3d  eturn base[0] ==
2170: 20 27 23 27 0a 20 20 20 20 3f 20 28 68 72 65 66   '#'.    ? (href
2180: 20 7c 7c 20 6c 6f 63 2e 68 72 65 66 20 7c 7c 20   || loc.href || 
2190: 27 27 29 2e 73 70 6c 69 74 28 62 61 73 65 29 5b  '').split(base)[
21a0: 31 5d 20 7c 7c 20 27 27 0a 20 20 20 20 3a 20 28  1] || ''.    : (
21b0: 6c 6f 63 20 3f 20 67 65 74 50 61 74 68 46 72 6f  loc ? getPathFro
21c0: 6d 52 6f 6f 74 28 68 72 65 66 29 20 3a 20 68 72  mRoot(href) : hr
21d0: 65 66 20 7c 7c 20 27 27 29 5b 52 45 50 4c 41 43  ef || '')[REPLAC
21e0: 45 5d 28 62 61 73 65 2c 20 27 27 29 0a 7d 0a 0a  E](base, '').}..
21f0: 66 75 6e 63 74 69 6f 6e 20 65 6d 69 74 28 66 6f  function emit(fo
2200: 72 63 65 29 20 7b 0a 20 20 2f 2f 20 74 68 65 20  rce) {.  // the 
2210: 73 74 61 63 6b 20 69 73 20 6e 65 65 64 65 64 20  stack is needed 
2220: 66 6f 72 20 72 65 64 69 72 65 63 74 69 6f 6e 73  for redirections
2230: 0a 20 20 76 61 72 20 69 73 52 6f 6f 74 20 3d 20  .  var isRoot = 
2240: 65 6d 69 74 53 74 61 63 6b 4c 65 76 65 6c 20 3d  emitStackLevel =
2250: 3d 20 30 2c 20 66 69 72 73 74 0a 20 20 69 66 20  = 0, first.  if 
2260: 28 4d 41 58 5f 45 4d 49 54 5f 53 54 41 43 4b 5f  (MAX_EMIT_STACK_
2270: 4c 45 56 45 4c 20 3c 3d 20 65 6d 69 74 53 74 61  LEVEL <= emitSta
2280: 63 6b 4c 65 76 65 6c 29 20 72 65 74 75 72 6e 0a  ckLevel) return.
2290: 0a 20 20 65 6d 69 74 53 74 61 63 6b 4c 65 76 65  .  emitStackLeve
22a0: 6c 2b 2b 0a 20 20 65 6d 69 74 53 74 61 63 6b 2e  l++.  emitStack.
22b0: 70 75 73 68 28 66 75 6e 63 74 69 6f 6e 28 29 20  push(function() 
22c0: 7b 0a 20 20 20 20 76 61 72 20 70 61 74 68 20 3d  {.    var path =
22d0: 20 67 65 74 50 61 74 68 46 72 6f 6d 42 61 73 65   getPathFromBase
22e0: 28 29 0a 20 20 20 20 69 66 20 28 66 6f 72 63 65  ().    if (force
22f0: 20 7c 7c 20 70 61 74 68 20 21 3d 20 63 75 72 72   || path != curr
2300: 65 6e 74 29 20 7b 0a 20 20 20 20 20 20 63 65 6e  ent) {.      cen
2310: 74 72 61 6c 5b 54 52 49 47 47 45 52 5d 28 27 65  tral[TRIGGER]('e
2320: 6d 69 74 27 2c 20 70 61 74 68 29 0a 20 20 20 20  mit', path).    
2330: 20 20 63 75 72 72 65 6e 74 20 3d 20 70 61 74 68    current = path
2340: 0a 20 20 20 20 7d 0a 20 20 7d 29 0a 20 20 69 66  .    }.  }).  if
2350: 20 28 69 73 52 6f 6f 74 29 20 7b 0a 20 20 20 20   (isRoot) {.    
2360: 77 68 69 6c 65 20 28 66 69 72 73 74 20 3d 20 65  while (first = e
2370: 6d 69 74 53 74 61 63 6b 2e 73 68 69 66 74 28 29  mitStack.shift()
2380: 29 20 66 69 72 73 74 28 29 20 2f 2f 20 73 74 61  ) first() // sta
2390: 63 6b 20 69 6e 63 72 65 73 65 73 20 77 69 74 68  ck increses with
23a0: 69 6e 20 74 68 69 73 20 63 61 6c 6c 0a 20 20 20  in this call.   
23b0: 20 65 6d 69 74 53 74 61 63 6b 4c 65 76 65 6c 20   emitStackLevel 
23c0: 3d 20 30 0a 20 20 7d 0a 7d 0a 0a 66 75 6e 63 74  = 0.  }.}..funct
23d0: 69 6f 6e 20 63 6c 69 63 6b 28 65 29 20 7b 0a 20  ion click(e) {. 
23e0: 20 69 66 20 28 0a 20 20 20 20 65 2e 77 68 69 63   if (.    e.whic
23f0: 68 20 21 3d 20 31 20 2f 2f 20 6e 6f 74 20 6c 65  h != 1 // not le
2400: 66 74 20 63 6c 69 63 6b 0a 20 20 20 20 7c 7c 20  ft click.    || 
2410: 65 2e 6d 65 74 61 4b 65 79 20 7c 7c 20 65 2e 63  e.metaKey || e.c
2420: 74 72 6c 4b 65 79 20 7c 7c 20 65 2e 73 68 69 66  trlKey || e.shif
2430: 74 4b 65 79 20 2f 2f 20 6f 72 20 6d 65 74 61 20  tKey // or meta 
2440: 6b 65 79 73 0a 20 20 20 20 7c 7c 20 65 2e 64 65  keys.    || e.de
2450: 66 61 75 6c 74 50 72 65 76 65 6e 74 65 64 20 2f  faultPrevented /
2460: 2f 20 6f 72 20 64 65 66 61 75 6c 74 20 70 72 65  / or default pre
2470: 76 65 6e 74 65 64 0a 20 20 29 20 72 65 74 75 72  vented.  ) retur
2480: 6e 0a 0a 20 20 76 61 72 20 65 6c 20 3d 20 65 2e  n..  var el = e.
2490: 74 61 72 67 65 74 0a 20 20 77 68 69 6c 65 20 28  target.  while (
24a0: 65 6c 20 26 26 20 65 6c 2e 6e 6f 64 65 4e 61 6d  el && el.nodeNam
24b0: 65 20 21 3d 20 27 41 27 29 20 65 6c 20 3d 20 65  e != 'A') el = e
24c0: 6c 2e 70 61 72 65 6e 74 4e 6f 64 65 0a 0a 20 20  l.parentNode..  
24d0: 69 66 20 28 0a 20 20 20 20 21 65 6c 20 7c 7c 20  if (.    !el || 
24e0: 65 6c 2e 6e 6f 64 65 4e 61 6d 65 20 21 3d 20 27  el.nodeName != '
24f0: 41 27 20 2f 2f 20 6e 6f 74 20 41 20 74 61 67 0a  A' // not A tag.
2500: 20 20 20 20 7c 7c 20 65 6c 5b 48 41 53 5f 41 54      || el[HAS_AT
2510: 54 52 49 42 55 54 45 5d 28 27 64 6f 77 6e 6c 6f  TRIBUTE]('downlo
2520: 61 64 27 29 20 2f 2f 20 68 61 73 20 64 6f 77 6e  ad') // has down
2530: 6c 6f 61 64 20 61 74 74 72 0a 20 20 20 20 7c 7c  load attr.    ||
2540: 20 21 65 6c 5b 48 41 53 5f 41 54 54 52 49 42 55   !el[HAS_ATTRIBU
2550: 54 45 5d 28 27 68 72 65 66 27 29 20 2f 2f 20 68  TE]('href') // h
2560: 61 73 20 6e 6f 20 68 72 65 66 20 61 74 74 72 0a  as no href attr.
2570: 20 20 20 20 7c 7c 20 65 6c 2e 74 61 72 67 65 74      || el.target
2580: 20 26 26 20 65 6c 2e 74 61 72 67 65 74 20 21 3d   && el.target !=
2590: 20 27 5f 73 65 6c 66 27 20 2f 2f 20 61 6e 6f 74   '_self' // anot
25a0: 68 65 72 20 77 69 6e 64 6f 77 20 6f 72 20 66 72  her window or fr
25b0: 61 6d 65 0a 20 20 20 20 7c 7c 20 65 6c 2e 68 72  ame.    || el.hr
25c0: 65 66 2e 69 6e 64 65 78 4f 66 28 6c 6f 63 2e 68  ef.indexOf(loc.h
25d0: 72 65 66 2e 6d 61 74 63 68 28 52 45 5f 4f 52 49  ref.match(RE_ORI
25e0: 47 49 4e 29 5b 30 5d 29 20 3d 3d 20 2d 31 20 2f  GIN)[0]) == -1 /
25f0: 2f 20 63 72 6f 73 73 20 6f 72 69 67 69 6e 0a 20  / cross origin. 
2600: 20 29 20 72 65 74 75 72 6e 0a 0a 20 20 69 66 20   ) return..  if 
2610: 28 65 6c 2e 68 72 65 66 20 21 3d 20 6c 6f 63 2e  (el.href != loc.
2620: 68 72 65 66 0a 20 20 20 20 26 26 20 28 0a 20 20  href.    && (.  
2630: 20 20 20 20 65 6c 2e 68 72 65 66 2e 73 70 6c 69      el.href.spli
2640: 74 28 27 23 27 29 5b 30 5d 20 3d 3d 20 6c 6f 63  t('#')[0] == loc
2650: 2e 68 72 65 66 2e 73 70 6c 69 74 28 27 23 27 29  .href.split('#')
2660: 5b 30 5d 20 2f 2f 20 69 6e 74 65 72 6e 61 6c 20  [0] // internal 
2670: 6a 75 6d 70 0a 20 20 20 20 20 20 7c 7c 20 62 61  jump.      || ba
2680: 73 65 5b 30 5d 20 21 3d 20 27 23 27 20 26 26 20  se[0] != '#' && 
2690: 67 65 74 50 61 74 68 46 72 6f 6d 52 6f 6f 74 28  getPathFromRoot(
26a0: 65 6c 2e 68 72 65 66 29 2e 69 6e 64 65 78 4f 66  el.href).indexOf
26b0: 28 62 61 73 65 29 20 21 3d 3d 20 30 20 2f 2f 20  (base) !== 0 // 
26c0: 6f 75 74 73 69 64 65 20 6f 66 20 62 61 73 65 0a  outside of base.
26d0: 20 20 20 20 20 20 7c 7c 20 62 61 73 65 5b 30 5d        || base[0]
26e0: 20 3d 3d 20 27 23 27 20 26 26 20 65 6c 2e 68 72   == '#' && el.hr
26f0: 65 66 2e 73 70 6c 69 74 28 62 61 73 65 29 5b 30  ef.split(base)[0
2700: 5d 20 21 3d 20 6c 6f 63 2e 68 72 65 66 2e 73 70  ] != loc.href.sp
2710: 6c 69 74 28 62 61 73 65 29 5b 30 5d 20 2f 2f 20  lit(base)[0] // 
2720: 6f 75 74 73 69 64 65 20 6f 66 20 23 62 61 73 65  outside of #base
2730: 0a 20 20 20 20 20 20 7c 7c 20 21 67 6f 28 67 65  .      || !go(ge
2740: 74 50 61 74 68 46 72 6f 6d 42 61 73 65 28 65 6c  tPathFromBase(el
2750: 2e 68 72 65 66 29 2c 20 65 6c 2e 74 69 74 6c 65  .href), el.title
2760: 20 7c 7c 20 64 6f 63 2e 74 69 74 6c 65 29 20 2f   || doc.title) /
2770: 2f 20 72 6f 75 74 65 20 6e 6f 74 20 66 6f 75 6e  / route not foun
2780: 64 0a 20 20 20 20 29 29 20 72 65 74 75 72 6e 0a  d.    )) return.
2790: 0a 20 20 65 2e 70 72 65 76 65 6e 74 44 65 66 61  .  e.preventDefa
27a0: 75 6c 74 28 29 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20  ult().}../**. * 
27b0: 47 6f 20 74 6f 20 74 68 65 20 70 61 74 68 0a 20  Go to the path. 
27c0: 2a 20 40 70 61 72 61 6d 20 7b 73 74 72 69 6e 67  * @param {string
27d0: 7d 20 70 61 74 68 20 2d 20 64 65 73 74 69 6e 61  } path - destina
27e0: 74 69 6f 6e 20 70 61 74 68 0a 20 2a 20 40 70 61  tion path. * @pa
27f0: 72 61 6d 20 7b 73 74 72 69 6e 67 7d 20 74 69 74  ram {string} tit
2800: 6c 65 20 2d 20 70 61 67 65 20 74 69 74 6c 65 0a  le - page title.
2810: 20 2a 20 40 70 61 72 61 6d 20 7b 62 6f 6f 6c 65   * @param {boole
2820: 61 6e 7d 20 73 68 6f 75 6c 64 52 65 70 6c 61 63  an} shouldReplac
2830: 65 20 2d 20 75 73 65 20 72 65 70 6c 61 63 65 53  e - use replaceS
2840: 74 61 74 65 20 6f 72 20 70 75 73 68 53 74 61 74  tate or pushStat
2850: 65 0a 20 2a 20 40 72 65 74 75 72 6e 73 20 7b 62  e. * @returns {b
2860: 6f 6f 6c 65 61 6e 7d 20 2d 20 72 6f 75 74 65 20  oolean} - route 
2870: 6e 6f 74 20 66 6f 75 6e 64 20 66 6c 61 67 0a 20  not found flag. 
2880: 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 67 6f 28 70  */.function go(p
2890: 61 74 68 2c 20 74 69 74 6c 65 2c 20 73 68 6f 75  ath, title, shou
28a0: 6c 64 52 65 70 6c 61 63 65 29 20 7b 0a 20 20 2f  ldReplace) {.  /
28b0: 2f 20 53 65 72 76 65 72 2d 73 69 64 65 20 75 73  / Server-side us
28c0: 61 67 65 3a 20 64 69 72 65 63 74 6c 79 20 65 78  age: directly ex
28d0: 65 63 75 74 65 20 68 61 6e 64 6c 65 72 73 20 66  ecute handlers f
28e0: 6f 72 20 74 68 65 20 70 61 74 68 0a 20 20 69 66  or the path.  if
28f0: 20 28 21 68 69 73 74 29 20 72 65 74 75 72 6e 20   (!hist) return 
2900: 63 65 6e 74 72 61 6c 5b 54 52 49 47 47 45 52 5d  central[TRIGGER]
2910: 28 27 65 6d 69 74 27 2c 20 67 65 74 50 61 74 68  ('emit', getPath
2920: 46 72 6f 6d 42 61 73 65 28 70 61 74 68 29 29 0a  FromBase(path)).
2930: 0a 20 20 70 61 74 68 20 3d 20 62 61 73 65 20 2b  .  path = base +
2940: 20 6e 6f 72 6d 61 6c 69 7a 65 28 70 61 74 68 29   normalize(path)
2950: 0a 20 20 74 69 74 6c 65 20 3d 20 74 69 74 6c 65  .  title = title
2960: 20 7c 7c 20 64 6f 63 2e 74 69 74 6c 65 0a 20 20   || doc.title.  
2970: 2f 2f 20 62 72 6f 77 73 65 72 73 20 69 67 6e 6f  // browsers igno
2980: 72 65 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  res the second p
2990: 61 72 61 6d 65 74 65 72 20 60 74 69 74 6c 65 60  arameter `title`
29a0: 0a 20 20 73 68 6f 75 6c 64 52 65 70 6c 61 63 65  .  shouldReplace
29b0: 0a 20 20 20 20 3f 20 68 69 73 74 2e 72 65 70 6c  .    ? hist.repl
29c0: 61 63 65 53 74 61 74 65 28 6e 75 6c 6c 2c 20 74  aceState(null, t
29d0: 69 74 6c 65 2c 20 70 61 74 68 29 0a 20 20 20 20  itle, path).    
29e0: 3a 20 68 69 73 74 2e 70 75 73 68 53 74 61 74 65  : hist.pushState
29f0: 28 6e 75 6c 6c 2c 20 74 69 74 6c 65 2c 20 70 61  (null, title, pa
2a00: 74 68 29 0a 20 20 2f 2f 20 73 6f 20 77 65 20 6e  th).  // so we n
2a10: 65 65 64 20 74 6f 20 73 65 74 20 69 74 20 6d 61  eed to set it ma
2a20: 6e 75 61 6c 6c 79 0a 20 20 64 6f 63 2e 74 69 74  nually.  doc.tit
2a30: 6c 65 20 3d 20 74 69 74 6c 65 0a 20 20 72 6f 75  le = title.  rou
2a40: 74 65 46 6f 75 6e 64 20 3d 20 66 61 6c 73 65 0a  teFound = false.
2a50: 20 20 65 6d 69 74 28 29 0a 20 20 72 65 74 75 72    emit().  retur
2a60: 6e 20 72 6f 75 74 65 46 6f 75 6e 64 0a 7d 0a 0a  n routeFound.}..
2a70: 2f 2a 2a 0a 20 2a 20 47 6f 20 74 6f 20 70 61 74  /**. * Go to pat
2a80: 68 20 6f 72 20 73 65 74 20 61 63 74 69 6f 6e 0a  h or set action.
2a90: 20 2a 20 61 20 73 69 6e 67 6c 65 20 73 74 72 69   * a single stri
2aa0: 6e 67 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ng:             
2ab0: 20 20 20 67 6f 20 74 68 65 72 65 0a 20 2a 20 74     go there. * t
2ac0: 77 6f 20 73 74 72 69 6e 67 73 3a 20 20 20 20 20  wo strings:     
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67                 g
2ae0: 6f 20 74 68 65 72 65 20 77 69 74 68 20 73 65 74  o there with set
2af0: 74 69 6e 67 20 61 20 74 69 74 6c 65 0a 20 2a 20  ting a title. * 
2b00: 74 77 6f 20 73 74 72 69 6e 67 73 20 61 6e 64 20  two strings and 
2b10: 62 6f 6f 6c 65 61 6e 3a 20 20 20 20 20 20 20 20  boolean:        
2b20: 72 65 70 6c 61 63 65 20 68 69 73 74 6f 72 79 20  replace history 
2b30: 77 69 74 68 20 73 65 74 74 69 6e 67 20 61 20 74  with setting a t
2b40: 69 74 6c 65 0a 20 2a 20 61 20 73 69 6e 67 6c 65  itle. * a single
2b50: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 20 20 20 20   function:      
2b60: 20 20 20 20 20 20 20 20 73 65 74 20 61 6e 20 61          set an a
2b70: 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 65 66  ction on the def
2b80: 61 75 6c 74 20 72 6f 75 74 65 0a 20 2a 20 61 20  ault route. * a 
2b90: 73 74 72 69 6e 67 2f 52 65 67 45 78 70 20 61 6e  string/RegExp an
2ba0: 64 20 61 20 66 75 6e 63 74 69 6f 6e 3a 20 73 65  d a function: se
2bb0: 74 20 61 6e 20 61 63 74 69 6f 6e 20 6f 6e 20 74  t an action on t
2bc0: 68 65 20 72 6f 75 74 65 0a 20 2a 20 40 70 61 72  he route. * @par
2bd0: 61 6d 20 7b 28 73 74 72 69 6e 67 7c 66 75 6e 63  am {(string|func
2be0: 74 69 6f 6e 29 7d 20 66 69 72 73 74 20 2d 20 70  tion)} first - p
2bf0: 61 74 68 20 2f 20 61 63 74 69 6f 6e 20 2f 20 66  ath / action / f
2c00: 69 6c 74 65 72 0a 20 2a 20 40 70 61 72 61 6d 20  ilter. * @param 
2c10: 7b 28 73 74 72 69 6e 67 7c 52 65 67 45 78 70 7c  {(string|RegExp|
2c20: 66 75 6e 63 74 69 6f 6e 29 7d 20 73 65 63 6f 6e  function)} secon
2c30: 64 20 2d 20 74 69 74 6c 65 20 2f 20 61 63 74 69  d - title / acti
2c40: 6f 6e 0a 20 2a 20 40 70 61 72 61 6d 20 7b 62 6f  on. * @param {bo
2c50: 6f 6c 65 61 6e 7d 20 74 68 69 72 64 20 2d 20 72  olean} third - r
2c60: 65 70 6c 61 63 65 20 66 6c 61 67 0a 20 2a 2f 0a  eplace flag. */.
2c70: 70 72 6f 74 2e 6d 20 3d 20 66 75 6e 63 74 69 6f  prot.m = functio
2c80: 6e 28 66 69 72 73 74 2c 20 73 65 63 6f 6e 64 2c  n(first, second,
2c90: 20 74 68 69 72 64 29 20 7b 0a 20 20 69 66 20 28   third) {.  if (
2ca0: 69 73 53 74 72 69 6e 67 28 66 69 72 73 74 29 20  isString(first) 
2cb0: 26 26 20 28 21 73 65 63 6f 6e 64 20 7c 7c 20 69  && (!second || i
2cc0: 73 53 74 72 69 6e 67 28 73 65 63 6f 6e 64 29 29  sString(second))
2cd0: 29 20 67 6f 28 66 69 72 73 74 2c 20 73 65 63 6f  ) go(first, seco
2ce0: 6e 64 2c 20 74 68 69 72 64 20 7c 7c 20 66 61 6c  nd, third || fal
2cf0: 73 65 29 0a 20 20 65 6c 73 65 20 69 66 20 28 73  se).  else if (s
2d00: 65 63 6f 6e 64 29 20 74 68 69 73 2e 72 28 66 69  econd) this.r(fi
2d10: 72 73 74 2c 20 73 65 63 6f 6e 64 29 0a 20 20 65  rst, second).  e
2d20: 6c 73 65 20 74 68 69 73 2e 72 28 27 40 27 2c 20  lse this.r('@', 
2d30: 66 69 72 73 74 29 0a 7d 0a 0a 2f 2a 2a 0a 20 2a  first).}../**. *
2d40: 20 53 74 6f 70 20 72 6f 75 74 69 6e 67 0a 20 2a   Stop routing. *
2d50: 2f 0a 70 72 6f 74 2e 73 20 3d 20 66 75 6e 63 74  /.prot.s = funct
2d60: 69 6f 6e 28 29 20 7b 0a 20 20 74 68 69 73 2e 6f  ion() {.  this.o
2d70: 66 66 28 27 2a 27 29 0a 20 20 74 68 69 73 2e 24  ff('*').  this.$
2d80: 20 3d 20 5b 5d 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20   = [].}../**. * 
2d90: 45 6d 69 74 0a 20 2a 20 40 70 61 72 61 6d 20 7b  Emit. * @param {
2da0: 73 74 72 69 6e 67 7d 20 70 61 74 68 20 2d 20 70  string} path - p
2db0: 61 74 68 0a 20 2a 2f 0a 70 72 6f 74 2e 65 20 3d  ath. */.prot.e =
2dc0: 20 66 75 6e 63 74 69 6f 6e 28 70 61 74 68 29 20   function(path) 
2dd0: 7b 0a 20 20 74 68 69 73 2e 24 2e 63 6f 6e 63 61  {.  this.$.conca
2de0: 74 28 27 40 27 29 2e 73 6f 6d 65 28 66 75 6e 63  t('@').some(func
2df0: 74 69 6f 6e 28 66 69 6c 74 65 72 29 20 7b 0a 20  tion(filter) {. 
2e00: 20 20 20 76 61 72 20 61 72 67 73 20 3d 20 28 66     var args = (f
2e10: 69 6c 74 65 72 20 3d 3d 20 27 40 27 20 3f 20 70  ilter == '@' ? p
2e20: 61 72 73 65 72 20 3a 20 73 65 63 6f 6e 64 50 61  arser : secondPa
2e30: 72 73 65 72 29 28 6e 6f 72 6d 61 6c 69 7a 65 28  rser)(normalize(
2e40: 70 61 74 68 29 2c 20 6e 6f 72 6d 61 6c 69 7a 65  path), normalize
2e50: 28 66 69 6c 74 65 72 29 29 0a 20 20 20 20 69 66  (filter)).    if
2e60: 20 28 74 79 70 65 6f 66 20 61 72 67 73 20 21 3d   (typeof args !=
2e70: 20 27 75 6e 64 65 66 69 6e 65 64 27 29 20 7b 0a   'undefined') {.
2e80: 20 20 20 20 20 20 74 68 69 73 5b 54 52 49 47 47        this[TRIGG
2e90: 45 52 5d 2e 61 70 70 6c 79 28 6e 75 6c 6c 2c 20  ER].apply(null, 
2ea0: 5b 66 69 6c 74 65 72 5d 2e 63 6f 6e 63 61 74 28  [filter].concat(
2eb0: 61 72 67 73 29 29 0a 20 20 20 20 20 20 72 65 74  args)).      ret
2ec0: 75 72 6e 20 72 6f 75 74 65 46 6f 75 6e 64 20 3d  urn routeFound =
2ed0: 20 74 72 75 65 20 2f 2f 20 65 78 69 74 20 66 72   true // exit fr
2ee0: 6f 6d 20 6c 6f 6f 70 0a 20 20 20 20 7d 0a 20 20  om loop.    }.  
2ef0: 7d 2c 20 74 68 69 73 29 0a 7d 0a 0a 2f 2a 2a 0a  }, this).}../**.
2f00: 20 2a 20 52 65 67 69 73 74 65 72 20 72 6f 75 74   * Register rout
2f10: 65 0a 20 2a 20 40 70 61 72 61 6d 20 7b 73 74 72  e. * @param {str
2f20: 69 6e 67 7d 20 66 69 6c 74 65 72 20 2d 20 66 69  ing} filter - fi
2f30: 6c 74 65 72 20 66 6f 72 20 6d 61 74 63 68 69 6e  lter for matchin
2f40: 67 20 74 6f 20 75 72 6c 0a 20 2a 20 40 70 61 72  g to url. * @par
2f50: 61 6d 20 7b 66 75 6e 63 74 69 6f 6e 7d 20 61 63  am {function} ac
2f60: 74 69 6f 6e 20 2d 20 61 63 74 69 6f 6e 20 74 6f  tion - action to
2f70: 20 72 65 67 69 73 74 65 72 0a 20 2a 2f 0a 70 72   register. */.pr
2f80: 6f 74 2e 72 20 3d 20 66 75 6e 63 74 69 6f 6e 28  ot.r = function(
2f90: 66 69 6c 74 65 72 2c 20 61 63 74 69 6f 6e 29 20  filter, action) 
2fa0: 7b 0a 20 20 69 66 20 28 66 69 6c 74 65 72 20 21  {.  if (filter !
2fb0: 3d 20 27 40 27 29 20 7b 0a 20 20 20 20 66 69 6c  = '@') {.    fil
2fc0: 74 65 72 20 3d 20 27 2f 27 20 2b 20 6e 6f 72 6d  ter = '/' + norm
2fd0: 61 6c 69 7a 65 28 66 69 6c 74 65 72 29 0a 20 20  alize(filter).  
2fe0: 20 20 74 68 69 73 2e 24 2e 70 75 73 68 28 66 69    this.$.push(fi
2ff0: 6c 74 65 72 29 0a 20 20 7d 0a 20 20 74 68 69 73  lter).  }.  this
3000: 2e 6f 6e 28 66 69 6c 74 65 72 2c 20 61 63 74 69  .on(filter, acti
3010: 6f 6e 29 0a 7d 0a 0a 76 61 72 20 6d 61 69 6e 52  on).}..var mainR
3020: 6f 75 74 65 72 20 3d 20 6e 65 77 20 52 6f 75 74  outer = new Rout
3030: 65 72 28 29 0a 76 61 72 20 72 6f 75 74 65 20 3d  er().var route =
3040: 20 6d 61 69 6e 52 6f 75 74 65 72 2e 6d 2e 62 69   mainRouter.m.bi
3050: 6e 64 28 6d 61 69 6e 52 6f 75 74 65 72 29 0a 0a  nd(mainRouter)..
3060: 2f 2a 2a 0a 20 2a 20 43 72 65 61 74 65 20 61 20  /**. * Create a 
3070: 73 75 62 20 72 6f 75 74 65 72 0a 20 2a 20 40 72  sub router. * @r
3080: 65 74 75 72 6e 73 20 7b 66 75 6e 63 74 69 6f 6e  eturns {function
3090: 7d 20 74 68 65 20 6d 65 74 68 6f 64 20 6f 66 20  } the method of 
30a0: 61 20 6e 65 77 20 52 6f 75 74 65 72 20 6f 62 6a  a new Router obj
30b0: 65 63 74 0a 20 2a 2f 0a 72 6f 75 74 65 2e 63 72  ect. */.route.cr
30c0: 65 61 74 65 20 3d 20 66 75 6e 63 74 69 6f 6e 28  eate = function(
30d0: 29 20 7b 0a 20 20 76 61 72 20 6e 65 77 53 75 62  ) {.  var newSub
30e0: 52 6f 75 74 65 72 20 3d 20 6e 65 77 20 52 6f 75  Router = new Rou
30f0: 74 65 72 28 29 0a 20 20 2f 2f 20 61 73 73 69 67  ter().  // assig
3100: 6e 20 73 75 62 2d 72 6f 75 74 65 72 27 73 20 6d  n sub-router's m
3110: 61 69 6e 20 6d 65 74 68 6f 64 0a 20 20 76 61 72  ain method.  var
3120: 20 72 6f 75 74 65 72 20 3d 20 6e 65 77 53 75 62   router = newSub
3130: 52 6f 75 74 65 72 2e 6d 2e 62 69 6e 64 28 6e 65  Router.m.bind(ne
3140: 77 53 75 62 52 6f 75 74 65 72 29 0a 20 20 2f 2f  wSubRouter).  //
3150: 20 73 74 6f 70 20 6f 6e 6c 79 20 74 68 69 73 20   stop only this 
3160: 73 75 62 2d 72 6f 75 74 65 72 0a 20 20 72 6f 75  sub-router.  rou
3170: 74 65 72 2e 73 74 6f 70 20 3d 20 6e 65 77 53 75  ter.stop = newSu
3180: 62 52 6f 75 74 65 72 2e 73 2e 62 69 6e 64 28 6e  bRouter.s.bind(n
3190: 65 77 53 75 62 52 6f 75 74 65 72 29 0a 20 20 72  ewSubRouter).  r
31a0: 65 74 75 72 6e 20 72 6f 75 74 65 72 0a 7d 0a 0a  eturn router.}..
31b0: 2f 2a 2a 0a 20 2a 20 53 65 74 20 74 68 65 20 62  /**. * Set the b
31c0: 61 73 65 20 6f 66 20 75 72 6c 0a 20 2a 20 40 70  ase of url. * @p
31d0: 61 72 61 6d 20 7b 28 73 74 72 7c 52 65 67 45 78  aram {(str|RegEx
31e0: 70 29 7d 20 61 72 67 20 2d 20 61 20 6e 65 77 20  p)} arg - a new 
31f0: 62 61 73 65 20 6f 72 20 27 23 27 20 6f 72 20 27  base or '#' or '
3200: 23 21 27 0a 20 2a 2f 0a 72 6f 75 74 65 2e 62 61  #!'. */.route.ba
3210: 73 65 20 3d 20 66 75 6e 63 74 69 6f 6e 28 61 72  se = function(ar
3220: 67 29 20 7b 0a 20 20 62 61 73 65 20 3d 20 61 72  g) {.  base = ar
3230: 67 20 7c 7c 20 27 23 27 0a 20 20 63 75 72 72 65  g || '#'.  curre
3240: 6e 74 20 3d 20 67 65 74 50 61 74 68 46 72 6f 6d  nt = getPathFrom
3250: 42 61 73 65 28 29 20 2f 2f 20 72 65 63 61 6c 63  Base() // recalc
3260: 75 6c 61 74 65 20 63 75 72 72 65 6e 74 20 70 61  ulate current pa
3270: 74 68 0a 7d 0a 0a 2f 2a 2a 20 45 78 65 63 20 72  th.}../** Exec r
3280: 6f 75 74 69 6e 67 20 72 69 67 68 74 20 6e 6f 77  outing right now
3290: 20 2a 2a 2f 0a 72 6f 75 74 65 2e 65 78 65 63 20   **/.route.exec 
32a0: 3d 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20  = function() {. 
32b0: 20 65 6d 69 74 28 74 72 75 65 29 0a 7d 0a 0a 2f   emit(true).}../
32c0: 2a 2a 0a 20 2a 20 52 65 70 6c 61 63 65 20 74 68  **. * Replace th
32d0: 65 20 64 65 66 61 75 6c 74 20 72 6f 75 74 65 72  e default router
32e0: 20 74 6f 20 79 6f 75 72 73 0a 20 2a 20 40 70 61   to yours. * @pa
32f0: 72 61 6d 20 7b 66 75 6e 63 74 69 6f 6e 7d 20 66  ram {function} f
3300: 6e 20 2d 20 79 6f 75 72 20 70 61 72 73 65 72 20  n - your parser 
3310: 66 75 6e 63 74 69 6f 6e 0a 20 2a 20 40 70 61 72  function. * @par
3320: 61 6d 20 7b 66 75 6e 63 74 69 6f 6e 7d 20 66 6e  am {function} fn
3330: 32 20 2d 20 79 6f 75 72 20 73 65 63 6f 6e 64 50  2 - your secondP
3340: 61 72 73 65 72 20 66 75 6e 63 74 69 6f 6e 0a 20  arser function. 
3350: 2a 2f 0a 72 6f 75 74 65 2e 70 61 72 73 65 72 20  */.route.parser 
3360: 3d 20 66 75 6e 63 74 69 6f 6e 28 66 6e 2c 20 66  = function(fn, f
3370: 6e 32 29 20 7b 0a 20 20 69 66 20 28 21 66 6e 20  n2) {.  if (!fn 
3380: 26 26 20 21 66 6e 32 29 20 7b 0a 20 20 20 20 2f  && !fn2) {.    /
3390: 2f 20 72 65 73 65 74 20 70 61 72 73 65 72 20 66  / reset parser f
33a0: 6f 72 20 74 65 73 74 69 6e 67 2e 2e 2e 0a 20 20  or testing....  
33b0: 20 20 70 61 72 73 65 72 20 3d 20 44 45 46 41 55    parser = DEFAU
33c0: 4c 54 5f 50 41 52 53 45 52 0a 20 20 20 20 73 65  LT_PARSER.    se
33d0: 63 6f 6e 64 50 61 72 73 65 72 20 3d 20 44 45 46  condParser = DEF
33e0: 41 55 4c 54 5f 53 45 43 4f 4e 44 5f 50 41 52 53  AULT_SECOND_PARS
33f0: 45 52 0a 20 20 7d 0a 20 20 69 66 20 28 66 6e 29  ER.  }.  if (fn)
3400: 20 70 61 72 73 65 72 20 3d 20 66 6e 0a 20 20 69   parser = fn.  i
3410: 66 20 28 66 6e 32 29 20 73 65 63 6f 6e 64 50 61  f (fn2) secondPa
3420: 72 73 65 72 20 3d 20 66 6e 32 0a 7d 0a 0a 2f 2a  rser = fn2.}../*
3430: 2a 0a 20 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *. * Helper func
3440: 74 69 6f 6e 20 74 6f 20 67 65 74 20 75 72 6c 20  tion to get url 
3450: 71 75 65 72 79 20 61 73 20 61 6e 20 6f 62 6a 65  query as an obje
3460: 63 74 0a 20 2a 20 40 72 65 74 75 72 6e 73 20 7b  ct. * @returns {
3470: 6f 62 6a 65 63 74 7d 20 70 61 72 73 65 64 20 71  object} parsed q
3480: 75 65 72 79 0a 20 2a 2f 0a 72 6f 75 74 65 2e 71  uery. */.route.q
3490: 75 65 72 79 20 3d 20 66 75 6e 63 74 69 6f 6e 28  uery = function(
34a0: 29 20 7b 0a 20 20 76 61 72 20 71 20 3d 20 7b 7d  ) {.  var q = {}
34b0: 0a 20 20 76 61 72 20 68 72 65 66 20 3d 20 6c 6f  .  var href = lo
34c0: 63 2e 68 72 65 66 20 7c 7c 20 63 75 72 72 65 6e  c.href || curren
34d0: 74 0a 20 20 68 72 65 66 5b 52 45 50 4c 41 43 45  t.  href[REPLACE
34e0: 5d 28 2f 5b 3f 26 5d 28 2e 2b 3f 29 3d 28 5b 5e  ](/[?&](.+?)=([^
34f0: 26 5d 2a 29 2f 67 2c 20 66 75 6e 63 74 69 6f 6e  &]*)/g, function
3500: 28 5f 2c 20 6b 2c 20 76 29 20 7b 20 71 5b 6b 5d  (_, k, v) { q[k]
3510: 20 3d 20 76 20 7d 29 0a 20 20 72 65 74 75 72 6e   = v }).  return
3520: 20 71 0a 7d 0a 0a 2f 2a 2a 20 53 74 6f 70 20 72   q.}../** Stop r
3530: 6f 75 74 69 6e 67 20 2a 2a 2f 0a 72 6f 75 74 65  outing **/.route
3540: 2e 73 74 6f 70 20 3d 20 66 75 6e 63 74 69 6f 6e  .stop = function
3550: 20 28 29 20 7b 0a 20 20 69 66 20 28 73 74 61 72   () {.  if (star
3560: 74 65 64 29 20 7b 0a 20 20 20 20 69 66 20 28 77  ted) {.    if (w
3570: 69 6e 29 20 7b 0a 20 20 20 20 20 20 77 69 6e 5b  in) {.      win[
3580: 52 45 4d 4f 56 45 5f 45 56 45 4e 54 5f 4c 49 53  REMOVE_EVENT_LIS
3590: 54 45 4e 45 52 5d 28 50 4f 50 53 54 41 54 45 2c  TENER](POPSTATE,
35a0: 20 64 65 62 6f 75 6e 63 65 64 45 6d 69 74 29 0a   debouncedEmit).
35b0: 20 20 20 20 20 20 77 69 6e 5b 52 45 4d 4f 56 45        win[REMOVE
35c0: 5f 45 56 45 4e 54 5f 4c 49 53 54 45 4e 45 52 5d  _EVENT_LISTENER]
35d0: 28 48 41 53 48 43 48 41 4e 47 45 2c 20 64 65 62  (HASHCHANGE, deb
35e0: 6f 75 6e 63 65 64 45 6d 69 74 29 0a 20 20 20 20  ouncedEmit).    
35f0: 20 20 64 6f 63 5b 52 45 4d 4f 56 45 5f 45 56 45    doc[REMOVE_EVE
3600: 4e 54 5f 4c 49 53 54 45 4e 45 52 5d 28 63 6c 69  NT_LISTENER](cli
3610: 63 6b 45 76 65 6e 74 2c 20 63 6c 69 63 6b 29 0a  ckEvent, click).
3620: 20 20 20 20 7d 0a 20 20 20 20 63 65 6e 74 72 61      }.    centra
3630: 6c 5b 54 52 49 47 47 45 52 5d 28 27 73 74 6f 70  l[TRIGGER]('stop
3640: 27 29 0a 20 20 20 20 73 74 61 72 74 65 64 20 3d  ').    started =
3650: 20 66 61 6c 73 65 0a 20 20 7d 0a 7d 0a 0a 2f 2a   false.  }.}../*
3660: 2a 0a 20 2a 20 53 74 61 72 74 20 72 6f 75 74 69  *. * Start routi
3670: 6e 67 0a 20 2a 20 40 70 61 72 61 6d 20 7b 62 6f  ng. * @param {bo
3680: 6f 6c 65 61 6e 7d 20 61 75 74 6f 45 78 65 63 20  olean} autoExec 
3690: 2d 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  - automatically 
36a0: 65 78 65 63 20 61 66 74 65 72 20 73 74 61 72 74  exec after start
36b0: 69 6e 67 20 69 66 20 74 72 75 65 0a 20 2a 2f 0a  ing if true. */.
36c0: 72 6f 75 74 65 2e 73 74 61 72 74 20 3d 20 66 75  route.start = fu
36d0: 6e 63 74 69 6f 6e 20 28 61 75 74 6f 45 78 65 63  nction (autoExec
36e0: 29 20 7b 0a 20 20 69 66 20 28 21 73 74 61 72 74  ) {.  if (!start
36f0: 65 64 29 20 7b 0a 20 20 20 20 69 66 20 28 77 69  ed) {.    if (wi
3700: 6e 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28 64  n) {.      if (d
3710: 6f 63 75 6d 65 6e 74 2e 72 65 61 64 79 53 74 61  ocument.readySta
3720: 74 65 20 3d 3d 20 27 63 6f 6d 70 6c 65 74 65 27  te == 'complete'
3730: 29 20 73 74 61 72 74 28 61 75 74 6f 45 78 65 63  ) start(autoExec
3740: 29 0a 20 20 20 20 20 20 2f 2f 20 74 68 65 20 74  ).      // the t
3750: 69 6d 65 6f 75 74 20 69 73 20 6e 65 65 64 65 64  imeout is needed
3760: 20 74 6f 20 73 6f 6c 76 65 0a 20 20 20 20 20 20   to solve.      
3770: 2f 2f 20 61 20 77 65 69 72 64 20 73 61 66 61 72  // a weird safar
3780: 69 20 62 75 67 20 68 74 74 70 73 3a 2f 2f 67 69  i bug https://gi
3790: 74 68 75 62 2e 63 6f 6d 2f 72 69 6f 74 2f 72 6f  thub.com/riot/ro
37a0: 75 74 65 2f 69 73 73 75 65 73 2f 33 33 0a 20 20  ute/issues/33.  
37b0: 20 20 20 20 65 6c 73 65 20 77 69 6e 5b 41 44 44      else win[ADD
37c0: 5f 45 56 45 4e 54 5f 4c 49 53 54 45 4e 45 52 5d  _EVENT_LISTENER]
37d0: 28 27 6c 6f 61 64 27 2c 20 66 75 6e 63 74 69 6f  ('load', functio
37e0: 6e 28 29 20 7b 0a 20 20 20 20 20 20 20 20 73 65  n() {.        se
37f0: 74 54 69 6d 65 6f 75 74 28 66 75 6e 63 74 69 6f  tTimeout(functio
3800: 6e 28 29 20 7b 20 73 74 61 72 74 28 61 75 74 6f  n() { start(auto
3810: 45 78 65 63 29 20 7d 2c 20 31 29 0a 20 20 20 20  Exec) }, 1).    
3820: 20 20 7d 29 0a 20 20 20 20 7d 0a 20 20 20 20 73    }).    }.    s
3830: 74 61 72 74 65 64 20 3d 20 74 72 75 65 0a 20 20  tarted = true.  
3840: 7d 0a 7d 0a 0a 2f 2a 2a 20 50 72 65 70 61 72 65  }.}../** Prepare
3850: 20 74 68 65 20 72 6f 75 74 65 72 20 2a 2a 2f 0a   the router **/.
3860: 72 6f 75 74 65 2e 62 61 73 65 28 29 0a 72 6f 75  route.base().rou
3870: 74 65 2e 70 61 72 73 65 72 28 29 0a 0a 72 69 6f  te.parser()..rio
3880: 74 2e 72 6f 75 74 65 20 3d 20 72 6f 75 74 65 0a  t.route = route.
3890: 7d 29 28 72 69 6f 74 29 0a 2f 2a 20 69 73 74 61  })(riot)./* ista
38a0: 6e 62 75 6c 20 69 67 6e 6f 72 65 20 6e 65 78 74  nbul ignore next
38b0: 20 2a 2f 0a 0a 2f 2a 2a 0a 20 2a 20 54 68 65 20   */../**. * The 
38c0: 72 69 6f 74 20 74 65 6d 70 6c 61 74 65 20 65 6e  riot template en
38d0: 67 69 6e 65 0a 20 2a 20 40 76 65 72 73 69 6f 6e  gine. * @version
38e0: 20 76 32 2e 34 2e 31 0a 20 2a 2f 0a 2f 2a 2a 0a   v2.4.1. */./**.
38f0: 20 2a 20 72 69 6f 74 2e 75 74 69 6c 2e 62 72 61   * riot.util.bra
3900: 63 6b 65 74 73 0a 20 2a 0a 20 2a 20 2d 20 60 62  ckets. *. * - `b
3910: 72 61 63 6b 65 74 73 20 20 20 20 60 20 2d 20 52  rackets    ` - R
3920: 65 74 75 72 6e 73 20 61 20 73 74 72 69 6e 67 20  eturns a string 
3930: 6f 72 20 72 65 67 65 78 20 62 61 73 65 64 20 6f  or regex based o
3940: 6e 20 69 74 73 20 70 61 72 61 6d 65 74 65 72 0a  n its parameter.
3950: 20 2a 20 2d 20 60 62 72 61 63 6b 65 74 73 2e 73   * - `brackets.s
3960: 65 74 60 20 2d 20 43 68 61 6e 67 65 20 74 68 65  et` - Change the
3970: 20 63 75 72 72 65 6e 74 20 72 69 6f 74 20 62 72   current riot br
3980: 61 63 6b 65 74 73 0a 20 2a 0a 20 2a 20 40 6d 6f  ackets. *. * @mo
3990: 64 75 6c 65 0a 20 2a 2f 0a 0a 76 61 72 20 62 72  dule. */..var br
39a0: 61 63 6b 65 74 73 20 3d 20 28 66 75 6e 63 74 69  ackets = (functi
39b0: 6f 6e 20 28 55 4e 44 45 46 29 20 7b 0a 0a 20 20  on (UNDEF) {..  
39c0: 76 61 72 0a 20 20 20 20 52 45 47 4c 4f 42 20 3d  var.    REGLOB =
39d0: 20 27 67 27 2c 0a 0a 20 20 20 20 52 5f 4d 4c 43   'g',..    R_MLC
39e0: 4f 4d 4d 53 20 3d 20 2f 5c 2f 5c 2a 5b 5e 2a 5d  OMMS = /\/\*[^*]
39f0: 2a 5c 2a 2b 28 3f 3a 5b 5e 2a 5c 2f 5d 5b 5e 2a  *\*+(?:[^*\/][^*
3a00: 5d 2a 5c 2a 2b 29 2a 5c 2f 2f 67 2c 0a 0a 20 20  ]*\*+)*\//g,..  
3a10: 20 20 52 5f 53 54 52 49 4e 47 53 20 3d 20 2f 22    R_STRINGS = /"
3a20: 5b 5e 22 5c 5c 5d 2a 28 3f 3a 5c 5c 5b 5c 53 5c  [^"\\]*(?:\\[\S\
3a30: 73 5d 5b 5e 22 5c 5c 5d 2a 29 2a 22 7c 27 5b 5e  s][^"\\]*)*"|'[^
3a40: 27 5c 5c 5d 2a 28 3f 3a 5c 5c 5b 5c 53 5c 73 5d  '\\]*(?:\\[\S\s]
3a50: 5b 5e 27 5c 5c 5d 2a 29 2a 27 2f 67 2c 0a 0a 20  [^'\\]*)*'/g,.. 
3a60: 20 20 20 53 5f 51 42 4c 4f 43 4b 53 20 3d 20 52     S_QBLOCKS = R
3a70: 5f 53 54 52 49 4e 47 53 2e 73 6f 75 72 63 65 20  _STRINGS.source 
3a80: 2b 20 27 7c 27 20 2b 0a 20 20 20 20 20 20 2f 28  + '|' +.      /(
3a90: 3f 3a 5c 62 72 65 74 75 72 6e 5c 73 2b 7c 28 3f  ?:\breturn\s+|(?
3aa0: 3a 5b 24 5c 77 5c 29 5c 5d 5d 7c 5c 2b 5c 2b 7c  :[$\w\)\]]|\+\+|
3ab0: 2d 2d 29 5c 73 2a 28 5c 2f 29 28 3f 21 5b 2a 5c  --)\s*(\/)(?![*\
3ac0: 2f 5d 29 29 2f 2e 73 6f 75 72 63 65 20 2b 20 27  /]))/.source + '
3ad0: 7c 27 20 2b 0a 20 20 20 20 20 20 2f 5c 2f 28 3f  |' +.      /\/(?
3ae0: 3d 5b 5e 2a 5c 2f 5d 29 5b 5e 5b 5c 2f 5c 5c 5d  =[^*\/])[^[\/\\]
3af0: 2a 28 3f 3a 28 3f 3a 5c 5b 28 3f 3a 5c 5c 2e 7c  *(?:(?:\[(?:\\.|
3b00: 5b 5e 5c 5d 5c 5c 5d 2a 29 2a 5c 5d 7c 5c 5c 2e  [^\]\\]*)*\]|\\.
3b10: 29 5b 5e 5b 5c 2f 5c 5c 5d 2a 29 2a 3f 28 5c 2f  )[^[\/\\]*)*?(\/
3b20: 29 5b 67 69 6d 5d 2a 2f 2e 73 6f 75 72 63 65 2c  )[gim]*/.source,
3b30: 0a 0a 20 20 20 20 55 4e 53 55 50 50 4f 52 54 45  ..    UNSUPPORTE
3b40: 44 20 3d 20 52 65 67 45 78 70 28 27 5b 5c 5c 27  D = RegExp('[\\'
3b50: 20 2b 20 27 78 30 30 2d 5c 5c 78 31 46 3c 3e 61   + 'x00-\\x1F<>a
3b60: 2d 7a 41 2d 5a 30 2d 39 5c 27 22 2c 3b 5c 5c 5c  -zA-Z0-9\'",;\\\
3b70: 5c 5d 27 29 2c 0a 0a 20 20 20 20 4e 45 45 44 5f  \]'),..    NEED_
3b80: 45 53 43 41 50 45 20 3d 20 2f 28 3f 3d 5b 5b 5c  ESCAPE = /(?=[[\
3b90: 5d 28 29 2a 2b 3f 2e 5e 24 7c 5d 29 2f 67 2c 0a  ]()*+?.^$|])/g,.
3ba0: 0a 20 20 20 20 46 49 4e 44 42 52 41 43 45 53 20  .    FINDBRACES 
3bb0: 3d 20 7b 0a 20 20 20 20 20 20 27 28 27 3a 20 52  = {.      '(': R
3bc0: 65 67 45 78 70 28 27 28 5b 28 29 5d 29 7c 27 20  egExp('([()])|' 
3bd0: 20 20 2b 20 53 5f 51 42 4c 4f 43 4b 53 2c 20 52    + S_QBLOCKS, R
3be0: 45 47 4c 4f 42 29 2c 0a 20 20 20 20 20 20 27 5b  EGLOB),.      '[
3bf0: 27 3a 20 52 65 67 45 78 70 28 27 28 5b 5b 5c 5c  ': RegExp('([[\\
3c00: 5d 5d 29 7c 27 20 2b 20 53 5f 51 42 4c 4f 43 4b  ]])|' + S_QBLOCK
3c10: 53 2c 20 52 45 47 4c 4f 42 29 2c 0a 20 20 20 20  S, REGLOB),.    
3c20: 20 20 27 7b 27 3a 20 52 65 67 45 78 70 28 27 28    '{': RegExp('(
3c30: 5b 7b 7d 5d 29 7c 27 20 20 20 2b 20 53 5f 51 42  [{}])|'   + S_QB
3c40: 4c 4f 43 4b 53 2c 20 52 45 47 4c 4f 42 29 0a 20  LOCKS, REGLOB). 
3c50: 20 20 20 7d 2c 0a 0a 20 20 20 20 44 45 46 41 55     },..    DEFAU
3c60: 4c 54 20 3d 20 27 7b 20 7d 27 0a 0a 20 20 76 61  LT = '{ }'..  va
3c70: 72 20 5f 70 61 69 72 73 20 3d 20 5b 0a 20 20 20  r _pairs = [.   
3c80: 20 27 7b 27 2c 20 27 7d 27 2c 0a 20 20 20 20 27   '{', '}',.    '
3c90: 7b 27 2c 20 27 7d 27 2c 0a 20 20 20 20 2f 7b 5b  {', '}',.    /{[
3ca0: 5e 7d 5d 2a 7d 2f 2c 0a 20 20 20 20 2f 5c 5c 28  ^}]*}/,.    /\\(
3cb0: 5b 7b 7d 5d 29 2f 67 2c 0a 20 20 20 20 2f 5c 5c  [{}])/g,.    /\\
3cc0: 28 7b 29 7c 7b 2f 67 2c 0a 20 20 20 20 52 65 67  ({)|{/g,.    Reg
3cd0: 45 78 70 28 27 5c 5c 5c 5c 28 7d 29 7c 28 5b 5b  Exp('\\\\(})|([[
3ce0: 28 7b 5d 29 7c 28 7d 29 7c 27 20 2b 20 53 5f 51  ({])|(})|' + S_Q
3cf0: 42 4c 4f 43 4b 53 2c 20 52 45 47 4c 4f 42 29 2c  BLOCKS, REGLOB),
3d00: 0a 20 20 20 20 44 45 46 41 55 4c 54 2c 0a 20 20  .    DEFAULT,.  
3d10: 20 20 2f 5e 5c 73 2a 7b 5c 5e 3f 5c 73 2a 28 5b    /^\s*{\^?\s*([
3d20: 24 5c 77 5d 2b 29 28 3f 3a 5c 73 2a 2c 5c 73 2a  $\w]+)(?:\s*,\s*
3d30: 28 5c 53 2b 29 29 3f 5c 73 2b 69 6e 5c 73 2b 28  (\S+))?\s+in\s+(
3d40: 5c 53 2e 2a 29 5c 73 2a 7d 2f 2c 0a 20 20 20 20  \S.*)\s*}/,.    
3d50: 2f 28 5e 7c 5b 5e 5c 5c 5d 29 7b 3d 5b 5c 53 5c  /(^|[^\\]){=[\S\
3d60: 73 5d 2a 3f 7d 2f 0a 20 20 5d 0a 0a 20 20 76 61  s]*?}/.  ]..  va
3d70: 72 0a 20 20 20 20 63 61 63 68 65 64 42 72 61 63  r.    cachedBrac
3d80: 6b 65 74 73 20 3d 20 55 4e 44 45 46 2c 0a 20 20  kets = UNDEF,.  
3d90: 20 20 5f 72 65 67 65 78 2c 0a 20 20 20 20 5f 63    _regex,.    _c
3da0: 61 63 68 65 20 3d 20 5b 5d 2c 0a 20 20 20 20 5f  ache = [],.    _
3db0: 73 65 74 74 69 6e 67 73 0a 0a 20 20 66 75 6e 63  settings..  func
3dc0: 74 69 6f 6e 20 5f 6c 6f 6f 70 62 61 63 6b 20 28  tion _loopback (
3dd0: 72 65 29 20 7b 20 72 65 74 75 72 6e 20 72 65 20  re) { return re 
3de0: 7d 0a 0a 20 20 66 75 6e 63 74 69 6f 6e 20 5f 72  }..  function _r
3df0: 65 77 72 69 74 65 20 28 72 65 2c 20 62 70 29 20  ewrite (re, bp) 
3e00: 7b 0a 20 20 20 20 69 66 20 28 21 62 70 29 20 62  {.    if (!bp) b
3e10: 70 20 3d 20 5f 63 61 63 68 65 0a 20 20 20 20 72  p = _cache.    r
3e20: 65 74 75 72 6e 20 6e 65 77 20 52 65 67 45 78 70  eturn new RegExp
3e30: 28 0a 20 20 20 20 20 20 72 65 2e 73 6f 75 72 63  (.      re.sourc
3e40: 65 2e 72 65 70 6c 61 63 65 28 2f 7b 2f 67 2c 20  e.replace(/{/g, 
3e50: 62 70 5b 32 5d 29 2e 72 65 70 6c 61 63 65 28 2f  bp[2]).replace(/
3e60: 7d 2f 67 2c 20 62 70 5b 33 5d 29 2c 20 72 65 2e  }/g, bp[3]), re.
3e70: 67 6c 6f 62 61 6c 20 3f 20 52 45 47 4c 4f 42 20  global ? REGLOB 
3e80: 3a 20 27 27 0a 20 20 20 20 29 0a 20 20 7d 0a 0a  : ''.    ).  }..
3e90: 20 20 66 75 6e 63 74 69 6f 6e 20 5f 63 72 65 61    function _crea
3ea0: 74 65 20 28 70 61 69 72 29 20 7b 0a 20 20 20 20  te (pair) {.    
3eb0: 69 66 20 28 70 61 69 72 20 3d 3d 3d 20 44 45 46  if (pair === DEF
3ec0: 41 55 4c 54 29 20 72 65 74 75 72 6e 20 5f 70 61  AULT) return _pa
3ed0: 69 72 73 0a 0a 20 20 20 20 76 61 72 20 61 72 72  irs..    var arr
3ee0: 20 3d 20 70 61 69 72 2e 73 70 6c 69 74 28 27 20   = pair.split(' 
3ef0: 27 29 0a 0a 20 20 20 20 69 66 20 28 61 72 72 2e  ')..    if (arr.
3f00: 6c 65 6e 67 74 68 20 21 3d 3d 20 32 20 7c 7c 20  length !== 2 || 
3f10: 55 4e 53 55 50 50 4f 52 54 45 44 2e 74 65 73 74  UNSUPPORTED.test
3f20: 28 70 61 69 72 29 29 20 7b 0a 20 20 20 20 20 20  (pair)) {.      
3f30: 74 68 72 6f 77 20 6e 65 77 20 45 72 72 6f 72 28  throw new Error(
3f40: 27 55 6e 73 75 70 70 6f 72 74 65 64 20 62 72 61  'Unsupported bra
3f50: 63 6b 65 74 73 20 22 27 20 2b 20 70 61 69 72 20  ckets "' + pair 
3f60: 2b 20 27 22 27 29 0a 20 20 20 20 7d 0a 20 20 20  + '"').    }.   
3f70: 20 61 72 72 20 3d 20 61 72 72 2e 63 6f 6e 63 61   arr = arr.conca
3f80: 74 28 70 61 69 72 2e 72 65 70 6c 61 63 65 28 4e  t(pair.replace(N
3f90: 45 45 44 5f 45 53 43 41 50 45 2c 20 27 5c 5c 27  EED_ESCAPE, '\\'
3fa0: 29 2e 73 70 6c 69 74 28 27 20 27 29 29 0a 0a 20  ).split(' ')).. 
3fb0: 20 20 20 61 72 72 5b 34 5d 20 3d 20 5f 72 65 77     arr[4] = _rew
3fc0: 72 69 74 65 28 61 72 72 5b 31 5d 2e 6c 65 6e 67  rite(arr[1].leng
3fd0: 74 68 20 3e 20 31 20 3f 20 2f 7b 5b 5c 53 5c 73  th > 1 ? /{[\S\s
3fe0: 5d 2a 3f 7d 2f 20 3a 20 5f 70 61 69 72 73 5b 34  ]*?}/ : _pairs[4
3ff0: 5d 2c 20 61 72 72 29 0a 20 20 20 20 61 72 72 5b  ], arr).    arr[
4000: 35 5d 20 3d 20 5f 72 65 77 72 69 74 65 28 70 61  5] = _rewrite(pa
4010: 69 72 2e 6c 65 6e 67 74 68 20 3e 20 33 20 3f 20  ir.length > 3 ? 
4020: 2f 5c 5c 28 7b 7c 7d 29 2f 67 20 3a 20 5f 70 61  /\\({|})/g : _pa
4030: 69 72 73 5b 35 5d 2c 20 61 72 72 29 0a 20 20 20  irs[5], arr).   
4040: 20 61 72 72 5b 36 5d 20 3d 20 5f 72 65 77 72 69   arr[6] = _rewri
4050: 74 65 28 5f 70 61 69 72 73 5b 36 5d 2c 20 61 72  te(_pairs[6], ar
4060: 72 29 0a 20 20 20 20 61 72 72 5b 37 5d 20 3d 20  r).    arr[7] = 
4070: 52 65 67 45 78 70 28 27 5c 5c 5c 5c 28 27 20 2b  RegExp('\\\\(' +
4080: 20 61 72 72 5b 33 5d 20 2b 20 27 29 7c 28 5b 5b   arr[3] + ')|([[
4090: 28 7b 5d 29 7c 28 27 20 2b 20 61 72 72 5b 33 5d  ({])|(' + arr[3]
40a0: 20 2b 20 27 29 7c 27 20 2b 20 53 5f 51 42 4c 4f   + ')|' + S_QBLO
40b0: 43 4b 53 2c 20 52 45 47 4c 4f 42 29 0a 20 20 20  CKS, REGLOB).   
40c0: 20 61 72 72 5b 38 5d 20 3d 20 70 61 69 72 0a 20   arr[8] = pair. 
40d0: 20 20 20 72 65 74 75 72 6e 20 61 72 72 0a 20 20     return arr.  
40e0: 7d 0a 0a 20 20 66 75 6e 63 74 69 6f 6e 20 5f 62  }..  function _b
40f0: 72 61 63 6b 65 74 73 20 28 72 65 4f 72 49 64 78  rackets (reOrIdx
4100: 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ) {.    return r
4110: 65 4f 72 49 64 78 20 69 6e 73 74 61 6e 63 65 6f  eOrIdx instanceo
4120: 66 20 52 65 67 45 78 70 20 3f 20 5f 72 65 67 65  f RegExp ? _rege
4130: 78 28 72 65 4f 72 49 64 78 29 20 3a 20 5f 63 61  x(reOrIdx) : _ca
4140: 63 68 65 5b 72 65 4f 72 49 64 78 5d 0a 20 20 7d  che[reOrIdx].  }
4150: 0a 0a 20 20 5f 62 72 61 63 6b 65 74 73 2e 73 70  ..  _brackets.sp
4160: 6c 69 74 20 3d 20 66 75 6e 63 74 69 6f 6e 20 73  lit = function s
4170: 70 6c 69 74 20 28 73 74 72 2c 20 74 6d 70 6c 2c  plit (str, tmpl,
4180: 20 5f 62 70 29 20 7b 0a 20 20 20 20 2f 2f 20 69   _bp) {.    // i
4190: 73 74 61 6e 62 75 6c 20 69 67 6e 6f 72 65 20 6e  stanbul ignore n
41a0: 65 78 74 3a 20 5f 62 70 20 69 73 20 66 6f 72 20  ext: _bp is for 
41b0: 74 68 65 20 63 6f 6d 70 69 6c 65 72 0a 20 20 20  the compiler.   
41c0: 20 69 66 20 28 21 5f 62 70 29 20 5f 62 70 20 3d   if (!_bp) _bp =
41d0: 20 5f 63 61 63 68 65 0a 0a 20 20 20 20 76 61 72   _cache..    var
41e0: 0a 20 20 20 20 20 20 70 61 72 74 73 20 3d 20 5b  .      parts = [
41f0: 5d 2c 0a 20 20 20 20 20 20 6d 61 74 63 68 2c 0a  ],.      match,.
4200: 20 20 20 20 20 20 69 73 65 78 70 72 2c 0a 20 20        isexpr,.  
4210: 20 20 20 20 73 74 61 72 74 2c 0a 20 20 20 20 20      start,.     
4220: 20 70 6f 73 2c 0a 20 20 20 20 20 20 72 65 20 3d   pos,.      re =
4230: 20 5f 62 70 5b 36 5d 0a 0a 20 20 20 20 69 73 65   _bp[6]..    ise
4240: 78 70 72 20 3d 20 73 74 61 72 74 20 3d 20 72 65  xpr = start = re
4250: 2e 6c 61 73 74 49 6e 64 65 78 20 3d 20 30 0a 0a  .lastIndex = 0..
4260: 20 20 20 20 77 68 69 6c 65 20 28 28 6d 61 74 63      while ((matc
4270: 68 20 3d 20 72 65 2e 65 78 65 63 28 73 74 72 29  h = re.exec(str)
4280: 29 29 20 7b 0a 0a 20 20 20 20 20 20 70 6f 73 20  )) {..      pos 
4290: 3d 20 6d 61 74 63 68 2e 69 6e 64 65 78 0a 0a 20  = match.index.. 
42a0: 20 20 20 20 20 69 66 20 28 69 73 65 78 70 72 29       if (isexpr)
42b0: 20 7b 0a 0a 20 20 20 20 20 20 20 20 69 66 20 28   {..        if (
42c0: 6d 61 74 63 68 5b 32 5d 29 20 7b 0a 20 20 20 20  match[2]) {.    
42d0: 20 20 20 20 20 20 72 65 2e 6c 61 73 74 49 6e 64        re.lastInd
42e0: 65 78 20 3d 20 73 6b 69 70 42 72 61 63 65 73 28  ex = skipBraces(
42f0: 73 74 72 2c 20 6d 61 74 63 68 5b 32 5d 2c 20 72  str, match[2], r
4300: 65 2e 6c 61 73 74 49 6e 64 65 78 29 0a 20 20 20  e.lastIndex).   
4310: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a         continue.
4320: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4330: 20 20 69 66 20 28 21 6d 61 74 63 68 5b 33 5d 29    if (!match[3])
4340: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   {.          con
4350: 74 69 6e 75 65 0a 20 20 20 20 20 20 20 20 7d 0a  tinue.        }.
4360: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
4370: 66 20 28 21 6d 61 74 63 68 5b 31 5d 29 20 7b 0a  f (!match[1]) {.
4380: 20 20 20 20 20 20 20 20 75 6e 65 73 63 61 70 65          unescape
4390: 53 74 72 28 73 74 72 2e 73 6c 69 63 65 28 73 74  Str(str.slice(st
43a0: 61 72 74 2c 20 70 6f 73 29 29 0a 20 20 20 20 20  art, pos)).     
43b0: 20 20 20 73 74 61 72 74 20 3d 20 72 65 2e 6c 61     start = re.la
43c0: 73 74 49 6e 64 65 78 0a 20 20 20 20 20 20 20 20  stIndex.        
43d0: 72 65 20 3d 20 5f 62 70 5b 36 20 2b 20 28 69 73  re = _bp[6 + (is
43e0: 65 78 70 72 20 5e 3d 20 31 29 5d 0a 20 20 20 20  expr ^= 1)].    
43f0: 20 20 20 20 72 65 2e 6c 61 73 74 49 6e 64 65 78      re.lastIndex
4400: 20 3d 20 73 74 61 72 74 0a 20 20 20 20 20 20 7d   = start.      }
4410: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
4420: 73 74 72 20 26 26 20 73 74 61 72 74 20 3c 20 73  str && start < s
4430: 74 72 2e 6c 65 6e 67 74 68 29 20 7b 0a 20 20 20  tr.length) {.   
4440: 20 20 20 75 6e 65 73 63 61 70 65 53 74 72 28 73     unescapeStr(s
4450: 74 72 2e 73 6c 69 63 65 28 73 74 61 72 74 29 29  tr.slice(start))
4460: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75  .    }..    retu
4470: 72 6e 20 70 61 72 74 73 0a 0a 20 20 20 20 66 75  rn parts..    fu
4480: 6e 63 74 69 6f 6e 20 75 6e 65 73 63 61 70 65 53  nction unescapeS
4490: 74 72 20 28 73 29 20 7b 0a 20 20 20 20 20 20 69  tr (s) {.      i
44a0: 66 20 28 74 6d 70 6c 20 7c 7c 20 69 73 65 78 70  f (tmpl || isexp
44b0: 72 29 20 7b 0a 20 20 20 20 20 20 20 20 70 61 72  r) {.        par
44c0: 74 73 2e 70 75 73 68 28 73 20 26 26 20 73 2e 72  ts.push(s && s.r
44d0: 65 70 6c 61 63 65 28 5f 62 70 5b 35 5d 2c 20 27  eplace(_bp[5], '
44e0: 24 31 27 29 29 0a 20 20 20 20 20 20 7d 20 65 6c  $1')).      } el
44f0: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 70 61 72  se {.        par
4500: 74 73 2e 70 75 73 68 28 73 29 0a 20 20 20 20 20  ts.push(s).     
4510: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 75   }.    }..    fu
4520: 6e 63 74 69 6f 6e 20 73 6b 69 70 42 72 61 63 65  nction skipBrace
4530: 73 20 28 73 2c 20 63 68 2c 20 69 78 29 20 7b 0a  s (s, ch, ix) {.
4540: 20 20 20 20 20 20 76 61 72 0a 20 20 20 20 20 20        var.      
4550: 20 20 6d 61 74 63 68 2c 0a 20 20 20 20 20 20 20    match,.       
4560: 20 72 65 63 63 68 20 3d 20 46 49 4e 44 42 52 41   recch = FINDBRA
4570: 43 45 53 5b 63 68 5d 0a 0a 20 20 20 20 20 20 72  CES[ch]..      r
4580: 65 63 63 68 2e 6c 61 73 74 49 6e 64 65 78 20 3d  ecch.lastIndex =
4590: 20 69 78 0a 20 20 20 20 20 20 69 78 20 3d 20 31   ix.      ix = 1
45a0: 0a 20 20 20 20 20 20 77 68 69 6c 65 20 28 28 6d  .      while ((m
45b0: 61 74 63 68 20 3d 20 72 65 63 63 68 2e 65 78 65  atch = recch.exe
45c0: 63 28 73 29 29 29 20 7b 0a 20 20 20 20 20 20 20  c(s))) {.       
45d0: 20 69 66 20 28 6d 61 74 63 68 5b 31 5d 20 26 26   if (match[1] &&
45e0: 0a 20 20 20 20 20 20 20 20 20 20 21 28 6d 61 74  .          !(mat
45f0: 63 68 5b 31 5d 20 3d 3d 3d 20 63 68 20 3f 20 2b  ch[1] === ch ? +
4600: 2b 69 78 20 3a 20 2d 2d 69 78 29 29 20 62 72 65  +ix : --ix)) bre
4610: 61 6b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ak.      }.     
4620: 20 72 65 74 75 72 6e 20 69 78 20 3f 20 73 2e 6c   return ix ? s.l
4630: 65 6e 67 74 68 20 3a 20 72 65 63 63 68 2e 6c 61  ength : recch.la
4640: 73 74 49 6e 64 65 78 0a 20 20 20 20 7d 0a 20 20  stIndex.    }.  
4650: 7d 0a 0a 20 20 5f 62 72 61 63 6b 65 74 73 2e 68  }..  _brackets.h
4660: 61 73 45 78 70 72 20 3d 20 66 75 6e 63 74 69 6f  asExpr = functio
4670: 6e 20 68 61 73 45 78 70 72 20 28 73 74 72 29 20  n hasExpr (str) 
4680: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 5f 63 61  {.    return _ca
4690: 63 68 65 5b 34 5d 2e 74 65 73 74 28 73 74 72 29  che[4].test(str)
46a0: 0a 20 20 7d 0a 0a 20 20 5f 62 72 61 63 6b 65 74  .  }..  _bracket
46b0: 73 2e 6c 6f 6f 70 4b 65 79 73 20 3d 20 66 75 6e  s.loopKeys = fun
46c0: 63 74 69 6f 6e 20 6c 6f 6f 70 4b 65 79 73 20 28  ction loopKeys (
46d0: 65 78 70 72 29 20 7b 0a 20 20 20 20 76 61 72 20  expr) {.    var 
46e0: 6d 20 3d 20 65 78 70 72 2e 6d 61 74 63 68 28 5f  m = expr.match(_
46f0: 63 61 63 68 65 5b 39 5d 29 0a 0a 20 20 20 20 72  cache[9])..    r
4700: 65 74 75 72 6e 20 6d 0a 20 20 20 20 20 20 3f 20  eturn m.      ? 
4710: 7b 20 6b 65 79 3a 20 6d 5b 31 5d 2c 20 70 6f 73  { key: m[1], pos
4720: 3a 20 6d 5b 32 5d 2c 20 76 61 6c 3a 20 5f 63 61  : m[2], val: _ca
4730: 63 68 65 5b 30 5d 20 2b 20 6d 5b 33 5d 2e 74 72  che[0] + m[3].tr
4740: 69 6d 28 29 20 2b 20 5f 63 61 63 68 65 5b 31 5d  im() + _cache[1]
4750: 20 7d 0a 20 20 20 20 20 20 3a 20 7b 20 76 61 6c   }.      : { val
4760: 3a 20 65 78 70 72 2e 74 72 69 6d 28 29 20 7d 0a  : expr.trim() }.
4770: 20 20 7d 0a 0a 20 20 5f 62 72 61 63 6b 65 74 73    }..  _brackets
4780: 2e 61 72 72 61 79 20 3d 20 66 75 6e 63 74 69 6f  .array = functio
4790: 6e 20 61 72 72 61 79 20 28 70 61 69 72 29 20 7b  n array (pair) {
47a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 69 72  .    return pair
47b0: 20 3f 20 5f 63 72 65 61 74 65 28 70 61 69 72 29   ? _create(pair)
47c0: 20 3a 20 5f 63 61 63 68 65 0a 20 20 7d 0a 0a 20   : _cache.  }.. 
47d0: 20 66 75 6e 63 74 69 6f 6e 20 5f 72 65 73 65 74   function _reset
47e0: 20 28 70 61 69 72 29 20 7b 0a 20 20 20 20 69 66   (pair) {.    if
47f0: 20 28 28 70 61 69 72 20 7c 7c 20 28 70 61 69 72   ((pair || (pair
4800: 20 3d 20 44 45 46 41 55 4c 54 29 29 20 21 3d 3d   = DEFAULT)) !==
4810: 20 5f 63 61 63 68 65 5b 38 5d 29 20 7b 0a 20 20   _cache[8]) {.  
4820: 20 20 20 20 5f 63 61 63 68 65 20 3d 20 5f 63 72      _cache = _cr
4830: 65 61 74 65 28 70 61 69 72 29 0a 20 20 20 20 20  eate(pair).     
4840: 20 5f 72 65 67 65 78 20 3d 20 70 61 69 72 20 3d   _regex = pair =
4850: 3d 3d 20 44 45 46 41 55 4c 54 20 3f 20 5f 6c 6f  == DEFAULT ? _lo
4860: 6f 70 62 61 63 6b 20 3a 20 5f 72 65 77 72 69 74  opback : _rewrit
4870: 65 0a 20 20 20 20 20 20 5f 63 61 63 68 65 5b 39  e.      _cache[9
4880: 5d 20 3d 20 5f 72 65 67 65 78 28 5f 70 61 69 72  ] = _regex(_pair
4890: 73 5b 39 5d 29 0a 20 20 20 20 7d 0a 20 20 20 20  s[9]).    }.    
48a0: 63 61 63 68 65 64 42 72 61 63 6b 65 74 73 20 3d  cachedBrackets =
48b0: 20 70 61 69 72 0a 20 20 7d 0a 0a 20 20 66 75 6e   pair.  }..  fun
48c0: 63 74 69 6f 6e 20 5f 73 65 74 53 65 74 74 69 6e  ction _setSettin
48d0: 67 73 20 28 6f 29 20 7b 0a 20 20 20 20 76 61 72  gs (o) {.    var
48e0: 20 62 0a 0a 20 20 20 20 6f 20 3d 20 6f 20 7c 7c   b..    o = o ||
48f0: 20 7b 7d 0a 20 20 20 20 62 20 3d 20 6f 2e 62 72   {}.    b = o.br
4900: 61 63 6b 65 74 73 0a 20 20 20 20 4f 62 6a 65 63  ackets.    Objec
4910: 74 2e 64 65 66 69 6e 65 50 72 6f 70 65 72 74 79  t.defineProperty
4920: 28 6f 2c 20 27 62 72 61 63 6b 65 74 73 27 2c 20  (o, 'brackets', 
4930: 7b 0a 20 20 20 20 20 20 73 65 74 3a 20 5f 72 65  {.      set: _re
4940: 73 65 74 2c 0a 20 20 20 20 20 20 67 65 74 3a 20  set,.      get: 
4950: 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b 20 72 65  function () { re
4960: 74 75 72 6e 20 63 61 63 68 65 64 42 72 61 63 6b  turn cachedBrack
4970: 65 74 73 20 7d 2c 0a 20 20 20 20 20 20 65 6e 75  ets },.      enu
4980: 6d 65 72 61 62 6c 65 3a 20 74 72 75 65 0a 20 20  merable: true.  
4990: 20 20 7d 29 0a 20 20 20 20 5f 73 65 74 74 69 6e    }).    _settin
49a0: 67 73 20 3d 20 6f 0a 20 20 20 20 5f 72 65 73 65  gs = o.    _rese
49b0: 74 28 62 29 0a 20 20 7d 0a 0a 20 20 4f 62 6a 65  t(b).  }..  Obje
49c0: 63 74 2e 64 65 66 69 6e 65 50 72 6f 70 65 72 74  ct.definePropert
49d0: 79 28 5f 62 72 61 63 6b 65 74 73 2c 20 27 73 65  y(_brackets, 'se
49e0: 74 74 69 6e 67 73 27 2c 20 7b 0a 20 20 20 20 73  ttings', {.    s
49f0: 65 74 3a 20 5f 73 65 74 53 65 74 74 69 6e 67 73  et: _setSettings
4a00: 2c 0a 20 20 20 20 67 65 74 3a 20 66 75 6e 63 74  ,.    get: funct
4a10: 69 6f 6e 20 28 29 20 7b 20 72 65 74 75 72 6e 20  ion () { return 
4a20: 5f 73 65 74 74 69 6e 67 73 20 7d 0a 20 20 7d 29  _settings }.  })
4a30: 0a 0a 20 20 2f 2a 20 69 73 74 61 6e 62 75 6c 20  ..  /* istanbul 
4a40: 69 67 6e 6f 72 65 20 6e 65 78 74 3a 20 69 6e 20  ignore next: in 
4a50: 74 68 65 20 62 72 6f 77 73 65 72 20 72 69 6f 74  the browser riot
4a60: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 74 68   is always in th
4a70: 65 20 73 63 6f 70 65 20 2a 2f 0a 20 20 5f 62 72  e scope */.  _br
4a80: 61 63 6b 65 74 73 2e 73 65 74 74 69 6e 67 73 20  ackets.settings 
4a90: 3d 20 74 79 70 65 6f 66 20 72 69 6f 74 20 21 3d  = typeof riot !=
4aa0: 3d 20 27 75 6e 64 65 66 69 6e 65 64 27 20 26 26  = 'undefined' &&
4ab0: 20 72 69 6f 74 2e 73 65 74 74 69 6e 67 73 20 7c   riot.settings |
4ac0: 7c 20 7b 7d 0a 20 20 5f 62 72 61 63 6b 65 74 73  | {}.  _brackets
4ad0: 2e 73 65 74 20 3d 20 5f 72 65 73 65 74 0a 0a 20  .set = _reset.. 
4ae0: 20 5f 62 72 61 63 6b 65 74 73 2e 52 5f 53 54 52   _brackets.R_STR
4af0: 49 4e 47 53 20 3d 20 52 5f 53 54 52 49 4e 47 53  INGS = R_STRINGS
4b00: 0a 20 20 5f 62 72 61 63 6b 65 74 73 2e 52 5f 4d  .  _brackets.R_M
4b10: 4c 43 4f 4d 4d 53 20 3d 20 52 5f 4d 4c 43 4f 4d  LCOMMS = R_MLCOM
4b20: 4d 53 0a 20 20 5f 62 72 61 63 6b 65 74 73 2e 53  MS.  _brackets.S
4b30: 5f 51 42 4c 4f 43 4b 53 20 3d 20 53 5f 51 42 4c  _QBLOCKS = S_QBL
4b40: 4f 43 4b 53 0a 0a 20 20 72 65 74 75 72 6e 20 5f  OCKS..  return _
4b50: 62 72 61 63 6b 65 74 73 0a 0a 7d 29 28 29 0a 0a  brackets..})()..
4b60: 2f 2a 2a 0a 20 2a 20 40 6d 6f 64 75 6c 65 20 74  /**. * @module t
4b70: 6d 70 6c 0a 20 2a 0a 20 2a 20 74 6d 70 6c 20 20  mpl. *. * tmpl  
4b80: 20 20 20 20 20 20 20 20 2d 20 52 6f 6f 74 20 66          - Root f
4b90: 75 6e 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 73  unction, returns
4ba0: 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 76 61   the template va
4bb0: 6c 75 65 2c 20 72 65 6e 64 65 72 20 77 69 74 68  lue, render with
4bc0: 20 64 61 74 61 0a 20 2a 20 74 6d 70 6c 2e 68 61   data. * tmpl.ha
4bd0: 73 45 78 70 72 20 20 2d 20 54 65 73 74 20 74 68  sExpr  - Test th
4be0: 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61  e existence of a
4bf0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 73 69   expression insi
4c00: 64 65 20 61 20 73 74 72 69 6e 67 0a 20 2a 20 74  de a string. * t
4c10: 6d 70 6c 2e 6c 6f 6f 70 4b 65 79 73 20 2d 20 47  mpl.loopKeys - G
4c20: 65 74 20 74 68 65 20 6b 65 79 73 20 66 6f 72 20  et the keys for 
4c30: 61 6e 20 27 65 61 63 68 27 20 6c 6f 6f 70 20 28  an 'each' loop (
4c40: 75 73 65 64 20 62 79 20 60 5f 65 61 63 68 60 29  used by `_each`)
4c50: 0a 20 2a 2f 0a 0a 76 61 72 20 74 6d 70 6c 20 3d  . */..var tmpl =
4c60: 20 28 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a   (function () {.
4c70: 0a 20 20 76 61 72 20 5f 63 61 63 68 65 20 3d 20  .  var _cache = 
4c80: 7b 7d 0a 0a 20 20 66 75 6e 63 74 69 6f 6e 20 5f  {}..  function _
4c90: 74 6d 70 6c 20 28 73 74 72 2c 20 64 61 74 61 29  tmpl (str, data)
4ca0: 20 7b 0a 20 20 20 20 69 66 20 28 21 73 74 72 29   {.    if (!str)
4cb0: 20 72 65 74 75 72 6e 20 73 74 72 0a 0a 20 20 20   return str..   
4cc0: 20 72 65 74 75 72 6e 20 28 5f 63 61 63 68 65 5b   return (_cache[
4cd0: 73 74 72 5d 20 7c 7c 20 28 5f 63 61 63 68 65 5b  str] || (_cache[
4ce0: 73 74 72 5d 20 3d 20 5f 63 72 65 61 74 65 28 73  str] = _create(s
4cf0: 74 72 29 29 29 2e 63 61 6c 6c 28 64 61 74 61 2c  tr))).call(data,
4d00: 20 5f 6c 6f 67 45 72 72 29 0a 20 20 7d 0a 0a 20   _logErr).  }.. 
4d10: 20 5f 74 6d 70 6c 2e 68 61 76 65 52 61 77 20 3d   _tmpl.haveRaw =
4d20: 20 62 72 61 63 6b 65 74 73 2e 68 61 73 52 61 77   brackets.hasRaw
4d30: 0a 0a 20 20 5f 74 6d 70 6c 2e 68 61 73 45 78 70  ..  _tmpl.hasExp
4d40: 72 20 3d 20 62 72 61 63 6b 65 74 73 2e 68 61 73  r = brackets.has
4d50: 45 78 70 72 0a 0a 20 20 5f 74 6d 70 6c 2e 6c 6f  Expr..  _tmpl.lo
4d60: 6f 70 4b 65 79 73 20 3d 20 62 72 61 63 6b 65 74  opKeys = bracket
4d70: 73 2e 6c 6f 6f 70 4b 65 79 73 0a 0a 20 20 2f 2f  s.loopKeys..  //
4d80: 20 69 73 74 61 6e 62 75 6c 20 69 67 6e 6f 72 65   istanbul ignore
4d90: 20 6e 65 78 74 0a 20 20 5f 74 6d 70 6c 2e 63 6c   next.  _tmpl.cl
4da0: 65 61 72 43 61 63 68 65 20 3d 20 66 75 6e 63 74  earCache = funct
4db0: 69 6f 6e 20 28 29 20 7b 20 5f 63 61 63 68 65 20  ion () { _cache 
4dc0: 3d 20 7b 7d 20 7d 0a 0a 20 20 5f 74 6d 70 6c 2e  = {} }..  _tmpl.
4dd0: 65 72 72 6f 72 48 61 6e 64 6c 65 72 20 3d 20 6e  errorHandler = n
4de0: 75 6c 6c 0a 0a 20 20 66 75 6e 63 74 69 6f 6e 20  ull..  function 
4df0: 5f 6c 6f 67 45 72 72 20 28 65 72 72 2c 20 63 74  _logErr (err, ct
4e00: 78 29 20 7b 0a 0a 20 20 20 20 69 66 20 28 5f 74  x) {..    if (_t
4e10: 6d 70 6c 2e 65 72 72 6f 72 48 61 6e 64 6c 65 72  mpl.errorHandler
4e20: 29 20 7b 0a 0a 20 20 20 20 20 20 65 72 72 2e 72  ) {..      err.r
4e30: 69 6f 74 44 61 74 61 20 3d 20 7b 0a 20 20 20 20  iotData = {.    
4e40: 20 20 20 20 74 61 67 4e 61 6d 65 3a 20 63 74 78      tagName: ctx
4e50: 20 26 26 20 63 74 78 2e 72 6f 6f 74 20 26 26 20   && ctx.root && 
4e60: 63 74 78 2e 72 6f 6f 74 2e 74 61 67 4e 61 6d 65  ctx.root.tagName
4e70: 2c 0a 20 20 20 20 20 20 20 20 5f 72 69 6f 74 5f  ,.        _riot_
4e80: 69 64 3a 20 63 74 78 20 26 26 20 63 74 78 2e 5f  id: ctx && ctx._
4e90: 72 69 6f 74 5f 69 64 20 20 2f 2f 65 73 6c 69 6e  riot_id  //eslin
4ea0: 74 2d 64 69 73 61 62 6c 65 2d 6c 69 6e 65 20 63  t-disable-line c
4eb0: 61 6d 65 6c 63 61 73 65 0a 20 20 20 20 20 20 7d  amelcase.      }
4ec0: 0a 20 20 20 20 20 20 5f 74 6d 70 6c 2e 65 72 72  .      _tmpl.err
4ed0: 6f 72 48 61 6e 64 6c 65 72 28 65 72 72 29 0a 20  orHandler(err). 
4ee0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 75 6e 63     }.  }..  func
4ef0: 74 69 6f 6e 20 5f 63 72 65 61 74 65 20 28 73 74  tion _create (st
4f00: 72 29 20 7b 0a 20 20 20 20 76 61 72 20 65 78 70  r) {.    var exp
4f10: 72 20 3d 20 5f 67 65 74 54 6d 70 6c 28 73 74 72  r = _getTmpl(str
4f20: 29 0a 0a 20 20 20 20 69 66 20 28 65 78 70 72 2e  )..    if (expr.
4f30: 73 6c 69 63 65 28 30 2c 20 31 31 29 20 21 3d 3d  slice(0, 11) !==
4f40: 20 27 74 72 79 7b 72 65 74 75 72 6e 20 27 29 20   'try{return ') 
4f50: 65 78 70 72 20 3d 20 27 72 65 74 75 72 6e 20 27  expr = 'return '
4f60: 20 2b 20 65 78 70 72 0a 0a 20 20 20 20 72 65 74   + expr..    ret
4f70: 75 72 6e 20 6e 65 77 20 46 75 6e 63 74 69 6f 6e  urn new Function
4f80: 28 27 45 27 2c 20 65 78 70 72 20 2b 20 27 3b 27  ('E', expr + ';'
4f90: 29 20 20 20 20 2f 2f 20 65 73 6c 69 6e 74 2d 64  )    // eslint-d
4fa0: 69 73 61 62 6c 65 2d 6c 69 6e 65 20 6e 6f 2d 6e  isable-line no-n
4fb0: 65 77 2d 66 75 6e 63 0a 20 20 7d 0a 0a 20 20 76  ew-func.  }..  v
4fc0: 61 72 0a 20 20 20 20 43 48 5f 49 44 45 58 50 52  ar.    CH_IDEXPR
4fd0: 20 3d 20 27 5c 75 32 30 35 37 27 2c 0a 20 20 20   = '\u2057',.   
4fe0: 20 52 45 5f 43 53 4e 41 4d 45 20 3d 20 2f 5e 28   RE_CSNAME = /^(
4ff0: 3f 3a 28 2d 3f 5b 5f 41 2d 5a 61 2d 7a 5c 78 41  ?:(-?[_A-Za-z\xA
5000: 30 2d 5c 78 46 46 5d 5b 2d 5c 77 5c 78 41 30 2d  0-\xFF][-\w\xA0-
5010: 5c 78 46 46 5d 2a 29 7c 5c 75 32 30 35 37 28 5c  \xFF]*)|\u2057(\
5020: 64 2b 29 7e 29 3a 2f 2c 0a 20 20 20 20 52 45 5f  d+)~):/,.    RE_
5030: 51 42 4c 4f 43 4b 20 3d 20 52 65 67 45 78 70 28  QBLOCK = RegExp(
5040: 62 72 61 63 6b 65 74 73 2e 53 5f 51 42 4c 4f 43  brackets.S_QBLOC
5050: 4b 53 2c 20 27 67 27 29 2c 0a 20 20 20 20 52 45  KS, 'g'),.    RE
5060: 5f 44 51 55 4f 54 45 20 3d 20 2f 5c 75 32 30 35  _DQUOTE = /\u205
5070: 37 2f 67 2c 0a 20 20 20 20 52 45 5f 51 42 4d 41  7/g,.    RE_QBMA
5080: 52 4b 20 3d 20 2f 5c 75 32 30 35 37 28 5c 64 2b  RK = /\u2057(\d+
5090: 29 7e 2f 67 0a 0a 20 20 66 75 6e 63 74 69 6f 6e  )~/g..  function
50a0: 20 5f 67 65 74 54 6d 70 6c 20 28 73 74 72 29 20   _getTmpl (str) 
50b0: 7b 0a 20 20 20 20 76 61 72 0a 20 20 20 20 20 20  {.    var.      
50c0: 71 73 74 72 20 3d 20 5b 5d 2c 0a 20 20 20 20 20  qstr = [],.     
50d0: 20 65 78 70 72 2c 0a 20 20 20 20 20 20 70 61 72   expr,.      par
50e0: 74 73 20 3d 20 62 72 61 63 6b 65 74 73 2e 73 70  ts = brackets.sp
50f0: 6c 69 74 28 73 74 72 2e 72 65 70 6c 61 63 65 28  lit(str.replace(
5100: 52 45 5f 44 51 55 4f 54 45 2c 20 27 22 27 29 2c  RE_DQUOTE, '"'),
5110: 20 31 29 0a 0a 20 20 20 20 69 66 20 28 70 61 72   1)..    if (par
5120: 74 73 2e 6c 65 6e 67 74 68 20 3e 20 32 20 7c 7c  ts.length > 2 ||
5130: 20 70 61 72 74 73 5b 30 5d 29 20 7b 0a 20 20 20   parts[0]) {.   
5140: 20 20 20 76 61 72 20 69 2c 20 6a 2c 20 6c 69 73     var i, j, lis
5150: 74 20 3d 20 5b 5d 0a 0a 20 20 20 20 20 20 66 6f  t = []..      fo
5160: 72 20 28 69 20 3d 20 6a 20 3d 20 30 3b 20 69 20  r (i = j = 0; i 
5170: 3c 20 70 61 72 74 73 2e 6c 65 6e 67 74 68 3b 20  < parts.length; 
5180: 2b 2b 69 29 20 7b 0a 0a 20 20 20 20 20 20 20 20  ++i) {..        
5190: 65 78 70 72 20 3d 20 70 61 72 74 73 5b 69 5d 0a  expr = parts[i].
51a0: 0a 20 20 20 20 20 20 20 20 69 66 20 28 65 78 70  .        if (exp
51b0: 72 20 26 26 20 28 65 78 70 72 20 3d 20 69 20 26  r && (expr = i &
51c0: 20 31 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   1..            
51d0: 3f 20 5f 70 61 72 73 65 45 78 70 72 28 65 78 70  ? _parseExpr(exp
51e0: 72 2c 20 31 2c 20 71 73 74 72 29 0a 0a 20 20 20  r, 1, qstr)..   
51f0: 20 20 20 20 20 20 20 20 20 3a 20 27 22 27 20 2b           : '"' +
5200: 20 65 78 70 72 0a 20 20 20 20 20 20 20 20 20 20   expr.          
5210: 20 20 20 20 20 20 2e 72 65 70 6c 61 63 65 28 2f        .replace(/
5220: 5c 5c 2f 67 2c 20 27 5c 5c 5c 5c 27 29 0a 20 20  \\/g, '\\\\').  
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2e 72                .r
5240: 65 70 6c 61 63 65 28 2f 5c 72 5c 6e 3f 7c 5c 6e  eplace(/\r\n?|\n
5250: 2f 67 2c 20 27 5c 5c 6e 27 29 0a 20 20 20 20 20  /g, '\\n').     
5260: 20 20 20 20 20 20 20 20 20 20 20 2e 72 65 70 6c             .repl
5270: 61 63 65 28 2f 22 2f 67 2c 20 27 5c 5c 22 27 29  ace(/"/g, '\\"')
5280: 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
5290: 20 27 22 27 0a 0a 20 20 20 20 20 20 20 20 20 20   '"'..          
52a0: 29 29 20 6c 69 73 74 5b 6a 2b 2b 5d 20 3d 20 65  )) list[j++] = e
52b0: 78 70 72 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20  xpr..      }..  
52c0: 20 20 20 20 65 78 70 72 20 3d 20 6a 20 3c 20 32      expr = j < 2
52d0: 20 3f 20 6c 69 73 74 5b 30 5d 0a 20 20 20 20 20   ? list[0].     
52e0: 20 20 20 20 20 20 3a 20 27 5b 27 20 2b 20 6c 69        : '[' + li
52f0: 73 74 2e 6a 6f 69 6e 28 27 2c 27 29 20 2b 20 27  st.join(',') + '
5300: 5d 2e 6a 6f 69 6e 28 22 22 29 27 0a 0a 20 20 20  ].join("")'..   
5310: 20 7d 20 65 6c 73 65 20 7b 0a 0a 20 20 20 20 20   } else {..     
5320: 20 65 78 70 72 20 3d 20 5f 70 61 72 73 65 45 78   expr = _parseEx
5330: 70 72 28 70 61 72 74 73 5b 31 5d 2c 20 30 2c 20  pr(parts[1], 0, 
5340: 71 73 74 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20  qstr).    }..   
5350: 20 69 66 20 28 71 73 74 72 5b 30 5d 29 20 7b 0a   if (qstr[0]) {.
5360: 20 20 20 20 20 20 65 78 70 72 20 3d 20 65 78 70        expr = exp
5370: 72 2e 72 65 70 6c 61 63 65 28 52 45 5f 51 42 4d  r.replace(RE_QBM
5380: 41 52 4b 2c 20 66 75 6e 63 74 69 6f 6e 20 28 5f  ARK, function (_
5390: 2c 20 70 6f 73 29 20 7b 0a 20 20 20 20 20 20 20  , pos) {.       
53a0: 20 72 65 74 75 72 6e 20 71 73 74 72 5b 70 6f 73   return qstr[pos
53b0: 5d 0a 20 20 20 20 20 20 20 20 20 20 2e 72 65 70  ].          .rep
53c0: 6c 61 63 65 28 2f 5c 72 2f 67 2c 20 27 5c 5c 72  lace(/\r/g, '\\r
53d0: 27 29 0a 20 20 20 20 20 20 20 20 20 20 2e 72 65  ').          .re
53e0: 70 6c 61 63 65 28 2f 5c 6e 2f 67 2c 20 27 5c 5c  place(/\n/g, '\\
53f0: 6e 27 29 0a 20 20 20 20 20 20 7d 29 0a 20 20 20  n').      }).   
5400: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 65 78   }.    return ex
5410: 70 72 0a 20 20 7d 0a 0a 20 20 76 61 72 0a 20 20  pr.  }..  var.  
5420: 20 20 52 45 5f 42 52 45 4e 44 20 3d 20 7b 0a 20    RE_BREND = {. 
5430: 20 20 20 20 20 27 28 27 3a 20 2f 5b 28 29 5d 2f       '(': /[()]/
5440: 67 2c 0a 20 20 20 20 20 20 27 5b 27 3a 20 2f 5b  g,.      '[': /[
5450: 5b 5c 5d 5d 2f 67 2c 0a 20 20 20 20 20 20 27 7b  [\]]/g,.      '{
5460: 27 3a 20 2f 5b 7b 7d 5d 2f 67 0a 20 20 20 20 7d  ': /[{}]/g.    }
5470: 0a 0a 20 20 66 75 6e 63 74 69 6f 6e 20 5f 70 61  ..  function _pa
5480: 72 73 65 45 78 70 72 20 28 65 78 70 72 2c 20 61  rseExpr (expr, a
5490: 73 54 65 78 74 2c 20 71 73 74 72 29 20 7b 0a 0a  sText, qstr) {..
54a0: 20 20 20 20 65 78 70 72 20 3d 20 65 78 70 72 0a      expr = expr.
54b0: 20 20 20 20 20 20 20 20 20 20 2e 72 65 70 6c 61            .repla
54c0: 63 65 28 52 45 5f 51 42 4c 4f 43 4b 2c 20 66 75  ce(RE_QBLOCK, fu
54d0: 6e 63 74 69 6f 6e 20 28 73 2c 20 64 69 76 29 20  nction (s, div) 
54e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
54f0: 74 75 72 6e 20 73 2e 6c 65 6e 67 74 68 20 3e 20  turn s.length > 
5500: 32 20 26 26 20 21 64 69 76 20 3f 20 43 48 5f 49  2 && !div ? CH_I
5510: 44 45 58 50 52 20 2b 20 28 71 73 74 72 2e 70 75  DEXPR + (qstr.pu
5520: 73 68 28 73 29 20 2d 20 31 29 20 2b 20 27 7e 27  sh(s) - 1) + '~'
5530: 20 3a 20 73 0a 20 20 20 20 20 20 20 20 20 20 7d   : s.          }
5540: 29 0a 20 20 20 20 20 20 20 20 20 20 2e 72 65 70  ).          .rep
5550: 6c 61 63 65 28 2f 5c 73 2b 2f 67 2c 20 27 20 27  lace(/\s+/g, ' '
5560: 29 2e 74 72 69 6d 28 29 0a 20 20 20 20 20 20 20  ).trim().       
5570: 20 20 20 2e 72 65 70 6c 61 63 65 28 2f 5c 20 3f     .replace(/\ ?
5580: 28 5b 5b 5c 28 7b 7d 2c 3f 5c 2e 3a 5d 29 5c 20  ([[\({},?\.:])\ 
5590: 3f 2f 67 2c 20 27 24 31 27 29 0a 0a 20 20 20 20  ?/g, '$1')..    
55a0: 69 66 20 28 65 78 70 72 29 20 7b 0a 20 20 20 20  if (expr) {.    
55b0: 20 20 76 61 72 0a 20 20 20 20 20 20 20 20 6c 69    var.        li
55c0: 73 74 20 3d 20 5b 5d 2c 0a 20 20 20 20 20 20 20  st = [],.       
55d0: 20 63 6e 74 20 3d 20 30 2c 0a 20 20 20 20 20 20   cnt = 0,.      
55e0: 20 20 6d 61 74 63 68 0a 0a 20 20 20 20 20 20 77    match..      w
55f0: 68 69 6c 65 20 28 65 78 70 72 20 26 26 0a 20 20  hile (expr &&.  
5600: 20 20 20 20 20 20 20 20 20 20 28 6d 61 74 63 68            (match
5610: 20 3d 20 65 78 70 72 2e 6d 61 74 63 68 28 52 45   = expr.match(RE
5620: 5f 43 53 4e 41 4d 45 29 29 20 26 26 0a 20 20 20  _CSNAME)) &&.   
5630: 20 20 20 20 20 20 20 20 20 21 6d 61 74 63 68 2e           !match.
5640: 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 29 20  index.        ) 
5650: 7b 0a 20 20 20 20 20 20 20 20 76 61 72 0a 20 20  {.        var.  
5660: 20 20 20 20 20 20 20 20 6b 65 79 2c 0a 20 20 20          key,.   
5670: 20 20 20 20 20 20 20 6a 73 62 2c 0a 20 20 20 20         jsb,.    
5680: 20 20 20 20 20 20 72 65 20 3d 20 2f 2c 7c 28 5b        re = /,|([
5690: 5b 7b 28 5d 29 7c 24 2f 67 0a 0a 20 20 20 20 20  [{(])|$/g..     
56a0: 20 20 20 65 78 70 72 20 3d 20 52 65 67 45 78 70     expr = RegExp
56b0: 2e 72 69 67 68 74 43 6f 6e 74 65 78 74 0a 20 20  .rightContext.  
56c0: 20 20 20 20 20 20 6b 65 79 20 20 3d 20 6d 61 74        key  = mat
56d0: 63 68 5b 32 5d 20 3f 20 71 73 74 72 5b 6d 61 74  ch[2] ? qstr[mat
56e0: 63 68 5b 32 5d 5d 2e 73 6c 69 63 65 28 31 2c 20  ch[2]].slice(1, 
56f0: 2d 31 29 2e 74 72 69 6d 28 29 2e 72 65 70 6c 61  -1).trim().repla
5700: 63 65 28 2f 5c 73 2b 2f 67 2c 20 27 20 27 29 20  ce(/\s+/g, ' ') 
5710: 3a 20 6d 61 74 63 68 5b 31 5d 0a 0a 20 20 20 20  : match[1]..    
5720: 20 20 20 20 77 68 69 6c 65 20 28 6a 73 62 20 3d      while (jsb =
5730: 20 28 6d 61 74 63 68 20 3d 20 72 65 2e 65 78 65   (match = re.exe
5740: 63 28 65 78 70 72 29 29 5b 31 5d 29 20 73 6b 69  c(expr))[1]) ski
5750: 70 42 72 61 63 65 73 28 6a 73 62 2c 20 72 65 29  pBraces(jsb, re)
5760: 0a 0a 20 20 20 20 20 20 20 20 6a 73 62 20 20 3d  ..        jsb  =
5770: 20 65 78 70 72 2e 73 6c 69 63 65 28 30 2c 20 6d   expr.slice(0, m
5780: 61 74 63 68 2e 69 6e 64 65 78 29 0a 20 20 20 20  atch.index).    
5790: 20 20 20 20 65 78 70 72 20 3d 20 52 65 67 45 78      expr = RegEx
57a0: 70 2e 72 69 67 68 74 43 6f 6e 74 65 78 74 0a 0a  p.rightContext..
57b0: 20 20 20 20 20 20 20 20 6c 69 73 74 5b 63 6e 74          list[cnt
57c0: 2b 2b 5d 20 3d 20 5f 77 72 61 70 45 78 70 72 28  ++] = _wrapExpr(
57d0: 6a 73 62 2c 20 31 2c 20 6b 65 79 29 0a 20 20 20  jsb, 1, key).   
57e0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 65 78 70 72     }..      expr
57f0: 20 3d 20 21 63 6e 74 20 3f 20 5f 77 72 61 70 45   = !cnt ? _wrapE
5800: 78 70 72 28 65 78 70 72 2c 20 61 73 54 65 78 74  xpr(expr, asText
5810: 29 0a 20 20 20 20 20 20 20 20 20 20 20 3a 20 63  ).           : c
5820: 6e 74 20 3e 20 31 20 3f 20 27 5b 27 20 2b 20 6c  nt > 1 ? '[' + l
5830: 69 73 74 2e 6a 6f 69 6e 28 27 2c 27 29 20 2b 20  ist.join(',') + 
5840: 27 5d 2e 6a 6f 69 6e 28 22 20 22 29 2e 74 72 69  '].join(" ").tri
5850: 6d 28 29 27 20 3a 20 6c 69 73 74 5b 30 5d 0a 20  m()' : list[0]. 
5860: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
5870: 65 78 70 72 0a 0a 20 20 20 20 66 75 6e 63 74 69  expr..    functi
5880: 6f 6e 20 73 6b 69 70 42 72 61 63 65 73 20 28 63  on skipBraces (c
5890: 68 2c 20 72 65 29 20 7b 0a 20 20 20 20 20 20 76  h, re) {.      v
58a0: 61 72 0a 20 20 20 20 20 20 20 20 6d 6d 2c 0a 20  ar.        mm,. 
58b0: 20 20 20 20 20 20 20 6c 76 20 3d 20 31 2c 0a 20         lv = 1,. 
58c0: 20 20 20 20 20 20 20 69 72 20 3d 20 52 45 5f 42         ir = RE_B
58d0: 52 45 4e 44 5b 63 68 5d 0a 0a 20 20 20 20 20 20  REND[ch]..      
58e0: 69 72 2e 6c 61 73 74 49 6e 64 65 78 20 3d 20 72  ir.lastIndex = r
58f0: 65 2e 6c 61 73 74 49 6e 64 65 78 0a 20 20 20 20  e.lastIndex.    
5900: 20 20 77 68 69 6c 65 20 28 6d 6d 20 3d 20 69 72    while (mm = ir
5910: 2e 65 78 65 63 28 65 78 70 72 29 29 20 7b 0a 20  .exec(expr)) {. 
5920: 20 20 20 20 20 20 20 69 66 20 28 6d 6d 5b 30 5d         if (mm[0]
5930: 20 3d 3d 3d 20 63 68 29 20 2b 2b 6c 76 0a 20 20   === ch) ++lv.  
5940: 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 21        else if (!
5950: 2d 2d 6c 76 29 20 62 72 65 61 6b 0a 20 20 20 20  --lv) break.    
5960: 20 20 7d 0a 20 20 20 20 20 20 72 65 2e 6c 61 73    }.      re.las
5970: 74 49 6e 64 65 78 20 3d 20 6c 76 20 3f 20 65 78  tIndex = lv ? ex
5980: 70 72 2e 6c 65 6e 67 74 68 20 3a 20 69 72 2e 6c  pr.length : ir.l
5990: 61 73 74 49 6e 64 65 78 0a 20 20 20 20 7d 0a 20  astIndex.    }. 
59a0: 20 7d 0a 0a 20 20 2f 2f 20 69 73 74 61 6e 62 75   }..  // istanbu
59b0: 6c 20 69 67 6e 6f 72 65 20 6e 65 78 74 3a 20 6e  l ignore next: n
59c0: 6f 74 20 62 6f 74 68 0a 20 20 76 61 72 20 2f 2f  ot both.  var //
59d0: 20 65 73 6c 69 6e 74 2d 64 69 73 61 62 6c 65 2d   eslint-disable-
59e0: 6e 65 78 74 2d 6c 69 6e 65 20 6d 61 78 2d 6c 65  next-line max-le
59f0: 6e 0a 20 20 20 20 4a 53 5f 43 4f 4e 54 45 58 54  n.    JS_CONTEXT
5a00: 20 3d 20 27 22 69 6e 20 74 68 69 73 3f 74 68 69   = '"in this?thi
5a10: 73 3a 27 20 2b 20 28 74 79 70 65 6f 66 20 77 69  s:' + (typeof wi
5a20: 6e 64 6f 77 20 21 3d 3d 20 27 6f 62 6a 65 63 74  ndow !== 'object
5a30: 27 20 3f 20 27 67 6c 6f 62 61 6c 27 20 3a 20 27  ' ? 'global' : '
5a40: 77 69 6e 64 6f 77 27 29 20 2b 20 27 29 2e 27 2c  window') + ').',
5a50: 0a 20 20 20 20 4a 53 5f 56 41 52 4e 41 4d 45 20  .    JS_VARNAME 
5a60: 3d 20 2f 5b 2c 7b 5d 5b 24 5c 77 5d 2b 28 3f 3d  = /[,{][$\w]+(?=
5a70: 3a 29 7c 28 5e 20 2a 7c 5b 5e 24 5c 77 5c 2e 5d  :)|(^ *|[^$\w\.]
5a80: 29 28 3f 21 28 3f 3a 74 79 70 65 6f 66 7c 74 72  )(?!(?:typeof|tr
5a90: 75 65 7c 66 61 6c 73 65 7c 6e 75 6c 6c 7c 75 6e  ue|false|null|un
5aa0: 64 65 66 69 6e 65 64 7c 69 6e 7c 69 6e 73 74 61  defined|in|insta
5ab0: 6e 63 65 6f 66 7c 69 73 28 3f 3a 46 69 6e 69 74  nceof|is(?:Finit
5ac0: 65 7c 4e 61 4e 29 7c 76 6f 69 64 7c 4e 61 4e 7c  e|NaN)|void|NaN|
5ad0: 6e 65 77 7c 44 61 74 65 7c 52 65 67 45 78 70 7c  new|Date|RegExp|
5ae0: 4d 61 74 68 29 28 3f 21 5b 24 5c 77 5d 29 29 28  Math)(?![$\w]))(
5af0: 5b 24 5f 41 2d 5a 61 2d 7a 5d 5b 24 5c 77 5d 2a  [$_A-Za-z][$\w]*
5b00: 29 2f 67 2c 0a 20 20 20 20 4a 53 5f 4e 4f 50 52  )/g,.    JS_NOPR
5b10: 4f 50 53 20 3d 20 2f 5e 28 3f 3d 28 5c 2e 5b 24  OPS = /^(?=(\.[$
5b20: 5c 77 5d 2b 29 29 5c 31 28 3f 3a 5b 5e 2e 5b 28  \w]+))\1(?:[^.[(
5b30: 5d 7c 24 29 2f 0a 0a 20 20 66 75 6e 63 74 69 6f  ]|$)/..  functio
5b40: 6e 20 5f 77 72 61 70 45 78 70 72 20 28 65 78 70  n _wrapExpr (exp
5b50: 72 2c 20 61 73 54 65 78 74 2c 20 6b 65 79 29 20  r, asText, key) 
5b60: 7b 0a 20 20 20 20 76 61 72 20 74 62 0a 0a 20 20  {.    var tb..  
5b70: 20 20 65 78 70 72 20 3d 20 65 78 70 72 2e 72 65    expr = expr.re
5b80: 70 6c 61 63 65 28 4a 53 5f 56 41 52 4e 41 4d 45  place(JS_VARNAME
5b90: 2c 20 66 75 6e 63 74 69 6f 6e 20 28 6d 61 74 63  , function (matc
5ba0: 68 2c 20 70 2c 20 6d 76 61 72 2c 20 70 6f 73 2c  h, p, mvar, pos,
5bb0: 20 73 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28   s) {.      if (
5bc0: 6d 76 61 72 29 20 7b 0a 20 20 20 20 20 20 20 20  mvar) {.        
5bd0: 70 6f 73 20 3d 20 74 62 20 3f 20 30 20 3a 20 70  pos = tb ? 0 : p
5be0: 6f 73 20 2b 20 6d 61 74 63 68 2e 6c 65 6e 67 74  os + match.lengt
5bf0: 68 0a 0a 20 20 20 20 20 20 20 20 69 66 20 28 6d  h..        if (m
5c00: 76 61 72 20 21 3d 3d 20 27 74 68 69 73 27 20 26  var !== 'this' &
5c10: 26 20 6d 76 61 72 20 21 3d 3d 20 27 67 6c 6f 62  & mvar !== 'glob
5c20: 61 6c 27 20 26 26 20 6d 76 61 72 20 21 3d 3d 20  al' && mvar !== 
5c30: 27 77 69 6e 64 6f 77 27 29 20 7b 0a 20 20 20 20  'window') {.    
5c40: 20 20 20 20 20 20 6d 61 74 63 68 20 3d 20 70 20        match = p 
5c50: 2b 20 27 28 22 27 20 2b 20 6d 76 61 72 20 2b 20  + '("' + mvar + 
5c60: 4a 53 5f 43 4f 4e 54 45 58 54 20 2b 20 6d 76 61  JS_CONTEXT + mva
5c70: 72 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  r.          if (
5c80: 70 6f 73 29 20 74 62 20 3d 20 28 73 20 3d 20 73  pos) tb = (s = s
5c90: 5b 70 6f 73 5d 29 20 3d 3d 3d 20 27 2e 27 20 7c  [pos]) === '.' |
5ca0: 7c 20 73 20 3d 3d 3d 20 27 28 27 20 7c 7c 20 73  | s === '(' || s
5cb0: 20 3d 3d 3d 20 27 5b 27 0a 20 20 20 20 20 20 20   === '['.       
5cc0: 20 7d 20 65 6c 73 65 20 69 66 20 28 70 6f 73 29   } else if (pos)
5cd0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 74 62 20   {.          tb 
5ce0: 3d 20 21 4a 53 5f 4e 4f 50 52 4f 50 53 2e 74 65  = !JS_NOPROPS.te
5cf0: 73 74 28 73 2e 73 6c 69 63 65 28 70 6f 73 29 29  st(s.slice(pos))
5d00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5d10: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
5d20: 6d 61 74 63 68 0a 20 20 20 20 7d 29 0a 0a 20 20  match.    })..  
5d30: 20 20 69 66 20 28 74 62 29 20 7b 0a 20 20 20 20    if (tb) {.    
5d40: 20 20 65 78 70 72 20 3d 20 27 74 72 79 7b 72 65    expr = 'try{re
5d50: 74 75 72 6e 20 27 20 2b 20 65 78 70 72 20 2b 20  turn ' + expr + 
5d60: 27 7d 63 61 74 63 68 28 65 29 7b 45 28 65 2c 74  '}catch(e){E(e,t
5d70: 68 69 73 29 7d 27 0a 20 20 20 20 7d 0a 0a 20 20  his)}'.    }..  
5d80: 20 20 69 66 20 28 6b 65 79 29 20 7b 0a 0a 20 20    if (key) {..  
5d90: 20 20 20 20 65 78 70 72 20 3d 20 28 74 62 0a 20      expr = (tb. 
5da0: 20 20 20 20 20 20 20 20 20 3f 20 27 66 75 6e 63           ? 'func
5db0: 74 69 6f 6e 28 29 7b 27 20 2b 20 65 78 70 72 20  tion(){' + expr 
5dc0: 2b 20 27 7d 2e 63 61 6c 6c 28 74 68 69 73 29 27  + '}.call(this)'
5dd0: 20 3a 20 27 28 27 20 2b 20 65 78 70 72 20 2b 20   : '(' + expr + 
5de0: 27 29 27 0a 20 20 20 20 20 20 20 20 29 20 2b 20  ')'.        ) + 
5df0: 27 3f 22 27 20 2b 20 6b 65 79 20 2b 20 27 22 3a  '?"' + key + '":
5e00: 22 22 27 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20  ""'..    } else 
5e10: 69 66 20 28 61 73 54 65 78 74 29 20 7b 0a 0a 20  if (asText) {.. 
5e20: 20 20 20 20 20 65 78 70 72 20 3d 20 27 66 75 6e       expr = 'fun
5e30: 63 74 69 6f 6e 28 76 29 7b 27 20 2b 20 28 74 62  ction(v){' + (tb
5e40: 0a 20 20 20 20 20 20 20 20 20 20 3f 20 65 78 70  .          ? exp
5e50: 72 2e 72 65 70 6c 61 63 65 28 27 72 65 74 75 72  r.replace('retur
5e60: 6e 20 27 2c 20 27 76 3d 27 29 20 3a 20 27 76 3d  n ', 'v=') : 'v=
5e70: 28 27 20 2b 20 65 78 70 72 20 2b 20 27 29 27 0a  (' + expr + ')'.
5e80: 20 20 20 20 20 20 20 20 29 20 2b 20 27 3b 72 65          ) + ';re
5e90: 74 75 72 6e 20 76 7c 7c 76 3d 3d 3d 30 3f 76 3a  turn v||v===0?v:
5ea0: 22 22 7d 2e 63 61 6c 6c 28 74 68 69 73 29 27 0a  ""}.call(this)'.
5eb0: 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72      }..    retur
5ec0: 6e 20 65 78 70 72 0a 20 20 7d 0a 0a 20 20 5f 74  n expr.  }..  _t
5ed0: 6d 70 6c 2e 76 65 72 73 69 6f 6e 20 3d 20 62 72  mpl.version = br
5ee0: 61 63 6b 65 74 73 2e 76 65 72 73 69 6f 6e 20 3d  ackets.version =
5ef0: 20 27 76 32 2e 34 2e 31 27 0a 0a 20 20 72 65 74   'v2.4.1'..  ret
5f00: 75 72 6e 20 5f 74 6d 70 6c 0a 0a 7d 29 28 29 0a  urn _tmpl..})().
5f10: 0a 2f 2a 0a 20 20 6c 69 62 2f 62 72 6f 77 73 65  ./*.  lib/browse
5f20: 72 2f 74 61 67 2f 6d 6b 64 6f 6d 2e 6a 73 0a 0a  r/tag/mkdom.js..
5f30: 20 20 49 6e 63 6c 75 64 65 73 20 68 61 63 6b 73    Includes hacks
5f40: 20 6e 65 65 64 65 64 20 66 6f 72 20 74 68 65 20   needed for the 
5f50: 49 6e 74 65 72 6e 65 74 20 45 78 70 6c 6f 72 65  Internet Explore
5f60: 72 20 76 65 72 73 69 6f 6e 20 39 20 61 6e 64 20  r version 9 and 
5f70: 62 65 6c 6f 77 0a 20 20 53 65 65 3a 20 68 74 74  below.  See: htt
5f80: 70 3a 2f 2f 6b 61 6e 67 61 78 2e 67 69 74 68 75  p://kangax.githu
5f90: 62 2e 69 6f 2f 63 6f 6d 70 61 74 2d 74 61 62 6c  b.io/compat-tabl
5fa0: 65 2f 65 73 35 2f 23 69 65 38 0a 20 20 20 20 20  e/es5/#ie8.     
5fb0: 20 20 68 74 74 70 3a 2f 2f 63 6f 64 65 70 6c 61    http://codepla
5fc0: 6e 65 74 2e 69 6f 2f 64 72 6f 70 70 69 6e 67 2d  net.io/dropping-
5fd0: 69 65 38 2f 0a 2a 2f 0a 76 61 72 20 6d 6b 64 6f  ie8/.*/.var mkdo
5fe0: 6d 20 3d 20 28 66 75 6e 63 74 69 6f 6e 20 5f 6d  m = (function _m
5ff0: 6b 64 6f 6d 28 29 20 7b 0a 20 20 76 61 72 0a 20  kdom() {.  var. 
6000: 20 20 20 72 65 48 61 73 59 69 65 6c 64 20 20 3d     reHasYield  =
6010: 20 2f 3c 79 69 65 6c 64 5c 62 2f 69 2c 0a 20 20   /<yield\b/i,.  
6020: 20 20 72 65 59 69 65 6c 64 41 6c 6c 20 20 3d 20    reYieldAll  = 
6030: 2f 3c 79 69 65 6c 64 5c 73 2a 28 3f 3a 5c 2f 3e  /<yield\s*(?:\/>
6040: 7c 3e 28 5b 5c 53 5c 73 5d 2a 3f 29 3c 5c 2f 79  |>([\S\s]*?)<\/y
6050: 69 65 6c 64 5c 73 2a 3e 7c 3e 29 2f 69 67 2c 0a  ield\s*>|>)/ig,.
6060: 20 20 20 20 72 65 59 69 65 6c 64 53 72 63 20 20      reYieldSrc  
6070: 3d 20 2f 3c 79 69 65 6c 64 5c 73 2b 74 6f 3d 5b  = /<yield\s+to=[
6080: 27 22 5d 28 5b 5e 27 22 3e 5d 2a 29 5b 27 22 5d  '"]([^'">]*)['"]
6090: 5c 73 2a 3e 28 5b 5c 53 5c 73 5d 2a 3f 29 3c 5c  \s*>([\S\s]*?)<\
60a0: 2f 79 69 65 6c 64 5c 73 2a 3e 2f 69 67 2c 0a 20  /yield\s*>/ig,. 
60b0: 20 20 20 72 65 59 69 65 6c 64 44 65 73 74 20 3d     reYieldDest =
60c0: 20 2f 3c 79 69 65 6c 64 5c 73 2b 66 72 6f 6d 3d   /<yield\s+from=
60d0: 5b 27 22 5d 3f 28 5b 2d 5c 77 5d 2b 29 5b 27 22  ['"]?([-\w]+)['"
60e0: 5d 3f 5c 73 2a 28 3f 3a 5c 2f 3e 7c 3e 28 5b 5c  ]?\s*(?:\/>|>([\
60f0: 53 5c 73 5d 2a 3f 29 3c 5c 2f 79 69 65 6c 64 5c  S\s]*?)<\/yield\
6100: 73 2a 3e 29 2f 69 67 0a 20 20 76 61 72 0a 20 20  s*>)/ig.  var.  
6110: 20 20 72 6f 6f 74 45 6c 73 20 3d 20 7b 20 74 72    rootEls = { tr
6120: 3a 20 27 74 62 6f 64 79 27 2c 20 74 68 3a 20 27  : 'tbody', th: '
6130: 74 72 27 2c 20 74 64 3a 20 27 74 72 27 2c 20 63  tr', td: 'tr', c
6140: 6f 6c 3a 20 27 63 6f 6c 67 72 6f 75 70 27 20 7d  ol: 'colgroup' }
6150: 2c 0a 20 20 20 20 74 62 6c 54 61 67 73 20 3d 20  ,.    tblTags = 
6160: 49 45 5f 56 45 52 53 49 4f 4e 20 26 26 20 49 45  IE_VERSION && IE
6170: 5f 56 45 52 53 49 4f 4e 20 3c 20 31 30 0a 20 20  _VERSION < 10.  
6180: 20 20 20 20 3f 20 53 50 45 43 49 41 4c 5f 54 41      ? SPECIAL_TA
6190: 47 53 5f 52 45 47 45 58 20 3a 20 2f 5e 28 3f 3a  GS_REGEX : /^(?:
61a0: 74 28 3f 3a 62 6f 64 79 7c 68 65 61 64 7c 66 6f  t(?:body|head|fo
61b0: 6f 74 7c 5b 72 68 64 5d 29 7c 63 61 70 74 69 6f  ot|[rhd])|captio
61c0: 6e 7c 63 6f 6c 28 3f 3a 67 72 6f 75 70 29 3f 29  n|col(?:group)?)
61d0: 24 2f 0a 0a 20 20 2f 2a 2a 0a 20 20 20 2a 20 43  $/..  /**.   * C
61e0: 72 65 61 74 65 73 20 61 20 44 4f 4d 20 65 6c 65  reates a DOM ele
61f0: 6d 65 6e 74 20 74 6f 20 77 72 61 70 20 74 68 65  ment to wrap the
6200: 20 67 69 76 65 6e 20 63 6f 6e 74 65 6e 74 2e 20   given content. 
6210: 4e 6f 72 6d 61 6c 6c 79 20 61 6e 20 60 44 49 56  Normally an `DIV
6220: 60 2c 20 62 75 74 20 63 61 6e 20 62 65 0a 20 20  `, but can be.  
6230: 20 2a 20 61 6c 73 6f 20 61 20 60 54 41 42 4c 45   * also a `TABLE
6240: 60 2c 20 60 53 45 4c 45 43 54 60 2c 20 60 54 42  `, `SELECT`, `TB
6250: 4f 44 59 60 2c 20 60 54 52 60 2c 20 6f 72 20 60  ODY`, `TR`, or `
6260: 43 4f 4c 47 52 4f 55 50 60 20 65 6c 65 6d 65 6e  COLGROUP` elemen
6270: 74 2e 0a 20 20 20 2a 0a 20 20 20 2a 20 40 70 61  t..   *.   * @pa
6280: 72 61 6d 20 20 20 7b 73 74 72 69 6e 67 7d 20 74  ram   {string} t
6290: 65 6d 70 6c 20 20 2d 20 54 68 65 20 74 65 6d 70  empl  - The temp
62a0: 6c 61 74 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d  late coming from
62b0: 20 74 68 65 20 63 75 73 74 6f 6d 20 74 61 67 20   the custom tag 
62c0: 64 65 66 69 6e 69 74 69 6f 6e 0a 20 20 20 2a 20  definition.   * 
62d0: 40 70 61 72 61 6d 20 20 20 7b 73 74 72 69 6e 67  @param   {string
62e0: 7d 20 5b 68 74 6d 6c 5d 20 2d 20 48 54 4d 4c 20  } [html] - HTML 
62f0: 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 63 6f 6d  content that com
6300: 65 73 20 66 72 6f 6d 20 74 68 65 20 44 4f 4d 20  es from the DOM 
6310: 65 6c 65 6d 65 6e 74 20 77 68 65 72 65 20 79 6f  element where yo
6320: 75 0a 20 20 20 2a 20 20 20 20 20 20 20 20 20 20  u.   *          
6330: 20 77 69 6c 6c 20 6d 6f 75 6e 74 20 74 68 65 20   will mount the 
6340: 74 61 67 2c 20 6d 6f 73 74 6c 79 20 74 68 65 20  tag, mostly the 
6350: 6f 72 69 67 69 6e 61 6c 20 74 61 67 20 69 6e 20  original tag in 
6360: 74 68 65 20 70 61 67 65 0a 20 20 20 2a 20 40 72  the page.   * @r
6370: 65 74 75 72 6e 73 20 7b 48 54 4d 4c 45 6c 65 6d  eturns {HTMLElem
6380: 65 6e 74 7d 20 44 4f 4d 20 65 6c 65 6d 65 6e 74  ent} DOM element
6390: 20 77 69 74 68 20 5f 74 65 6d 70 6c 5f 20 6d 65   with _templ_ me
63a0: 72 67 65 64 20 74 68 72 6f 75 67 68 20 60 59 49  rged through `YI
63b0: 45 4c 44 60 20 77 69 74 68 20 74 68 65 20 5f 68  ELD` with the _h
63c0: 74 6d 6c 5f 2e 0a 20 20 20 2a 2f 0a 20 20 66 75  tml_..   */.  fu
63d0: 6e 63 74 69 6f 6e 20 5f 6d 6b 64 6f 6d 28 74 65  nction _mkdom(te
63e0: 6d 70 6c 2c 20 68 74 6d 6c 29 20 7b 0a 20 20 20  mpl, html) {.   
63f0: 20 76 61 72 0a 20 20 20 20 20 20 6d 61 74 63 68   var.      match
6400: 20 20 20 3d 20 74 65 6d 70 6c 20 26 26 20 74 65     = templ && te
6410: 6d 70 6c 2e 6d 61 74 63 68 28 2f 5e 5c 73 2a 3c  mpl.match(/^\s*<
6420: 28 5b 2d 5c 77 5d 2b 29 2f 29 2c 0a 20 20 20 20  ([-\w]+)/),.    
6430: 20 20 74 61 67 4e 61 6d 65 20 3d 20 6d 61 74 63    tagName = matc
6440: 68 20 26 26 20 6d 61 74 63 68 5b 31 5d 2e 74 6f  h && match[1].to
6450: 4c 6f 77 65 72 43 61 73 65 28 29 2c 0a 20 20 20  LowerCase(),.   
6460: 20 20 20 65 6c 20 3d 20 6d 6b 45 6c 28 27 64 69     el = mkEl('di
6470: 76 27 2c 20 69 73 53 56 47 54 61 67 28 74 61 67  v', isSVGTag(tag
6480: 4e 61 6d 65 29 29 0a 0a 20 20 20 20 2f 2f 20 72  Name))..    // r
6490: 65 70 6c 61 63 65 20 61 6c 6c 20 74 68 65 20 79  eplace all the y
64a0: 69 65 6c 64 20 74 61 67 73 20 77 69 74 68 20 74  ield tags with t
64b0: 68 65 20 74 61 67 20 69 6e 6e 65 72 20 68 74 6d  he tag inner htm
64c0: 6c 0a 20 20 20 20 74 65 6d 70 6c 20 3d 20 72 65  l.    templ = re
64d0: 70 6c 61 63 65 59 69 65 6c 64 28 74 65 6d 70 6c  placeYield(templ
64e0: 2c 20 68 74 6d 6c 29 0a 0a 20 20 20 20 2f 2a 20  , html)..    /* 
64f0: 69 73 74 61 6e 62 75 6c 20 69 67 6e 6f 72 65 20  istanbul ignore 
6500: 6e 65 78 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  next */.    if (
6510: 74 62 6c 54 61 67 73 2e 74 65 73 74 28 74 61 67  tblTags.test(tag
6520: 4e 61 6d 65 29 29 0a 20 20 20 20 20 20 65 6c 20  Name)).      el 
6530: 3d 20 73 70 65 63 69 61 6c 54 61 67 73 28 65 6c  = specialTags(el
6540: 2c 20 74 65 6d 70 6c 2c 20 74 61 67 4e 61 6d 65  , templ, tagName
6550: 29 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  ).    else.     
6560: 20 73 65 74 49 6e 6e 65 72 48 54 4d 4c 28 65 6c   setInnerHTML(el
6570: 2c 20 74 65 6d 70 6c 29 0a 0a 20 20 20 20 65 6c  , templ)..    el
6580: 2e 73 74 75 62 20 3d 20 74 72 75 65 0a 0a 20 20  .stub = true..  
6590: 20 20 72 65 74 75 72 6e 20 65 6c 0a 20 20 7d 0a    return el.  }.
65a0: 0a 20 20 2f 2a 0a 20 20 20 20 43 72 65 61 74 65  .  /*.    Create
65b0: 73 20 74 68 65 20 72 6f 6f 74 20 65 6c 65 6d 65  s the root eleme
65c0: 6e 74 20 66 6f 72 20 74 61 62 6c 65 20 6f 72 20  nt for table or 
65d0: 73 65 6c 65 63 74 20 63 68 69 6c 64 20 65 6c 65  select child ele
65e0: 6d 65 6e 74 73 3a 0a 20 20 20 20 74 72 2f 74 68  ments:.    tr/th
65f0: 2f 74 64 2f 74 68 65 61 64 2f 74 66 6f 6f 74 2f  /td/thead/tfoot/
6600: 74 62 6f 64 79 2f 63 61 70 74 69 6f 6e 2f 63 6f  tbody/caption/co
6610: 6c 2f 63 6f 6c 67 72 6f 75 70 2f 6f 70 74 69 6f  l/colgroup/optio
6620: 6e 2f 6f 70 74 67 72 6f 75 70 0a 20 20 2a 2f 0a  n/optgroup.  */.
6630: 20 20 66 75 6e 63 74 69 6f 6e 20 73 70 65 63 69    function speci
6640: 61 6c 54 61 67 73 28 65 6c 2c 20 74 65 6d 70 6c  alTags(el, templ
6650: 2c 20 74 61 67 4e 61 6d 65 29 20 7b 0a 20 20 20  , tagName) {.   
6660: 20 76 61 72 0a 20 20 20 20 20 20 73 65 6c 65 63   var.      selec
6670: 74 20 3d 20 74 61 67 4e 61 6d 65 5b 30 5d 20 3d  t = tagName[0] =
6680: 3d 3d 20 27 6f 27 2c 0a 20 20 20 20 20 20 70 61  == 'o',.      pa
6690: 72 65 6e 74 20 3d 20 73 65 6c 65 63 74 20 3f 20  rent = select ? 
66a0: 27 73 65 6c 65 63 74 3e 27 20 3a 20 27 74 61 62  'select>' : 'tab
66b0: 6c 65 3e 27 0a 0a 20 20 20 20 2f 2f 20 74 72 69  le>'..    // tri
66c0: 6d 28 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  m() is important
66d0: 20 68 65 72 65 2c 20 74 68 69 73 20 65 6e 73 75   here, this ensu
66e0: 72 65 73 20 77 65 20 64 6f 6e 27 74 20 68 61 76  res we don't hav
66f0: 65 20 61 72 74 69 66 61 63 74 73 2c 0a 20 20 20  e artifacts,.   
6700: 20 2f 2f 20 73 6f 20 77 65 20 63 61 6e 20 63 68   // so we can ch
6710: 65 63 6b 20 69 66 20 77 65 20 68 61 76 65 20 6f  eck if we have o
6720: 6e 6c 79 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20  nly one element 
6730: 69 6e 73 69 64 65 20 74 68 65 20 70 61 72 65 6e  inside the paren
6740: 74 0a 20 20 20 20 65 6c 2e 69 6e 6e 65 72 48 54  t.    el.innerHT
6750: 4d 4c 20 3d 20 27 3c 27 20 2b 20 70 61 72 65 6e  ML = '<' + paren
6760: 74 20 2b 20 74 65 6d 70 6c 2e 74 72 69 6d 28 29  t + templ.trim()
6770: 20 2b 20 27 3c 2f 27 20 2b 20 70 61 72 65 6e 74   + '</' + parent
6780: 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20 65 6c  .    parent = el
6790: 2e 66 69 72 73 74 43 68 69 6c 64 0a 0a 20 20 20  .firstChild..   
67a0: 20 2f 2f 20 72 65 74 75 72 6e 73 20 74 68 65 20   // returns the 
67b0: 69 6d 6d 65 64 69 61 74 65 20 70 61 72 65 6e 74  immediate parent
67c0: 20 69 66 20 74 72 2f 74 68 2f 74 64 2f 63 6f 6c   if tr/th/td/col
67d0: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 65 6c 65   is the only ele
67e0: 6d 65 6e 74 2c 20 69 66 20 6e 6f 74 0a 20 20 20  ment, if not.   
67f0: 20 2f 2f 20 72 65 74 75 72 6e 73 20 74 68 65 20   // returns the 
6800: 77 68 6f 6c 65 20 74 72 65 65 2c 20 61 73 20 74  whole tree, as t
6810: 68 69 73 20 63 61 6e 20 69 6e 63 6c 75 64 65 20  his can include 
6820: 61 64 64 69 74 69 6f 6e 61 6c 20 65 6c 65 6d 65  additional eleme
6830: 6e 74 73 0a 20 20 20 20 69 66 20 28 73 65 6c 65  nts.    if (sele
6840: 63 74 29 20 7b 0a 20 20 20 20 20 20 70 61 72 65  ct) {.      pare
6850: 6e 74 2e 73 65 6c 65 63 74 65 64 49 6e 64 65 78  nt.selectedIndex
6860: 20 3d 20 2d 31 20 20 2f 2f 20 66 6f 72 20 49 45   = -1  // for IE
6870: 39 2c 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 2f  9, compatible w/
6880: 63 75 72 72 65 6e 74 20 72 69 6f 74 20 62 65 68  current riot beh
6890: 61 76 69 6f 72 0a 20 20 20 20 7d 20 65 6c 73 65  avior.    } else
68a0: 20 7b 0a 20 20 20 20 20 20 2f 2f 20 61 76 6f 69   {.      // avoi
68b0: 64 73 20 69 6e 73 65 72 74 69 6f 6e 20 6f 66 20  ds insertion of 
68c0: 63 6f 69 6e 74 61 69 6e 65 72 20 69 6e 73 69 64  cointainer insid
68d0: 65 20 63 6f 6e 74 61 69 6e 65 72 20 28 65 78 3a  e container (ex:
68e0: 20 74 62 6f 64 79 20 69 6e 73 69 64 65 20 74 62   tbody inside tb
68f0: 6f 64 79 29 0a 20 20 20 20 20 20 76 61 72 20 74  ody).      var t
6900: 6e 61 6d 65 20 3d 20 72 6f 6f 74 45 6c 73 5b 74  name = rootEls[t
6910: 61 67 4e 61 6d 65 5d 0a 20 20 20 20 20 20 69 66  agName].      if
6920: 20 28 74 6e 61 6d 65 20 26 26 20 70 61 72 65 6e   (tname && paren
6930: 74 2e 63 68 69 6c 64 45 6c 65 6d 65 6e 74 43 6f  t.childElementCo
6940: 75 6e 74 20 3d 3d 3d 20 31 29 20 70 61 72 65 6e  unt === 1) paren
6950: 74 20 3d 20 24 28 74 6e 61 6d 65 2c 20 70 61 72  t = $(tname, par
6960: 65 6e 74 29 0a 20 20 20 20 7d 0a 20 20 20 20 72  ent).    }.    r
6970: 65 74 75 72 6e 20 70 61 72 65 6e 74 0a 20 20 7d  eturn parent.  }
6980: 0a 0a 20 20 2f 2a 0a 20 20 20 20 52 65 70 6c 61  ..  /*.    Repla
6990: 63 65 20 74 68 65 20 79 69 65 6c 64 20 74 61 67  ce the yield tag
69a0: 20 66 72 6f 6d 20 61 6e 79 20 74 61 67 20 74 65   from any tag te
69b0: 6d 70 6c 61 74 65 20 77 69 74 68 20 74 68 65 20  mplate with the 
69c0: 69 6e 6e 65 72 48 54 4d 4c 20 6f 66 20 74 68 65  innerHTML of the
69d0: 0a 20 20 20 20 6f 72 69 67 69 6e 61 6c 20 74 61  .    original ta
69e0: 67 20 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20  g in the page.  
69f0: 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 20 72 65  */.  function re
6a00: 70 6c 61 63 65 59 69 65 6c 64 28 74 65 6d 70 6c  placeYield(templ
6a10: 2c 20 68 74 6d 6c 29 20 7b 0a 20 20 20 20 2f 2f  , html) {.    //
6a20: 20 64 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 6e   do nothing if n
6a30: 6f 20 79 69 65 6c 64 0a 20 20 20 20 69 66 20 28  o yield.    if (
6a40: 21 72 65 48 61 73 59 69 65 6c 64 2e 74 65 73 74  !reHasYield.test
6a50: 28 74 65 6d 70 6c 29 29 20 72 65 74 75 72 6e 20  (templ)) return 
6a60: 74 65 6d 70 6c 0a 0a 20 20 20 20 2f 2f 20 62 65  templ..    // be
6a70: 20 63 61 72 65 66 75 6c 20 77 69 74 68 20 23 31   careful with #1
6a80: 33 34 33 20 2d 20 73 74 72 69 6e 67 20 6f 6e 20  343 - string on 
6a90: 74 68 65 20 73 6f 75 72 63 65 20 68 61 76 69 6e  the source havin
6aa0: 67 20 60 24 31 60 0a 20 20 20 20 76 61 72 20 73  g `$1`.    var s
6ab0: 72 63 20 3d 20 7b 7d 0a 0a 20 20 20 20 68 74 6d  rc = {}..    htm
6ac0: 6c 20 3d 20 68 74 6d 6c 20 26 26 20 68 74 6d 6c  l = html && html
6ad0: 2e 72 65 70 6c 61 63 65 28 72 65 59 69 65 6c 64  .replace(reYield
6ae0: 53 72 63 2c 20 66 75 6e 63 74 69 6f 6e 20 28 5f  Src, function (_
6af0: 2c 20 72 65 66 2c 20 74 65 78 74 29 20 7b 0a 20  , ref, text) {. 
6b00: 20 20 20 20 20 73 72 63 5b 72 65 66 5d 20 3d 20       src[ref] = 
6b10: 73 72 63 5b 72 65 66 5d 20 7c 7c 20 74 65 78 74  src[ref] || text
6b20: 20 20 20 2f 2f 20 70 72 65 73 65 72 76 65 20 66     // preserve f
6b30: 69 72 73 74 20 64 65 66 69 6e 69 74 69 6f 6e 0a  irst definition.
6b40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 27 27 0a        return ''.
6b50: 20 20 20 20 7d 29 2e 74 72 69 6d 28 29 0a 0a 20      }).trim().. 
6b60: 20 20 20 72 65 74 75 72 6e 20 74 65 6d 70 6c 0a     return templ.
6b70: 20 20 20 20 20 20 2e 72 65 70 6c 61 63 65 28 72        .replace(r
6b80: 65 59 69 65 6c 64 44 65 73 74 2c 20 66 75 6e 63  eYieldDest, func
6b90: 74 69 6f 6e 20 28 5f 2c 20 72 65 66 2c 20 64 65  tion (_, ref, de
6ba0: 66 29 20 7b 20 20 2f 2f 20 79 69 65 6c 64 20 77  f) {  // yield w
6bb0: 69 74 68 20 66 72 6f 6d 20 2d 20 74 6f 20 61 74  ith from - to at
6bc0: 74 72 73 0a 20 20 20 20 20 20 20 20 72 65 74 75  trs.        retu
6bd0: 72 6e 20 73 72 63 5b 72 65 66 5d 20 7c 7c 20 64  rn src[ref] || d
6be0: 65 66 20 7c 7c 20 27 27 0a 20 20 20 20 20 20 7d  ef || ''.      }
6bf0: 29 0a 20 20 20 20 20 20 2e 72 65 70 6c 61 63 65  ).      .replace
6c00: 28 72 65 59 69 65 6c 64 41 6c 6c 2c 20 66 75 6e  (reYieldAll, fun
6c10: 63 74 69 6f 6e 20 28 5f 2c 20 64 65 66 29 20 7b  ction (_, def) {
6c20: 20 20 20 20 20 20 20 20 2f 2f 20 79 69 65 6c 64          // yield
6c30: 20 77 69 74 68 6f 75 74 20 61 6e 79 20 22 66 72   without any "fr
6c40: 6f 6d 22 0a 20 20 20 20 20 20 20 20 72 65 74 75  om".        retu
6c50: 72 6e 20 68 74 6d 6c 20 7c 7c 20 64 65 66 20 7c  rn html || def |
6c60: 7c 20 27 27 0a 20 20 20 20 20 20 7d 29 0a 20 20  | ''.      }).  
6c70: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 5f 6d 6b 64  }..  return _mkd
6c80: 6f 6d 0a 0a 7d 29 28 29 0a 0a 2f 2a 2a 0a 20 2a  om..})()../**. *
6c90: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 69 74 65   Convert the ite
6ca0: 6d 20 6c 6f 6f 70 65 64 20 69 6e 74 6f 20 61 6e  m looped into an
6cb0: 20 6f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20   object used to 
6cc0: 65 78 74 65 6e 64 20 74 68 65 20 63 68 69 6c 64  extend the child
6cd0: 20 74 61 67 20 70 72 6f 70 65 72 74 69 65 73 0a   tag properties.
6ce0: 20 2a 20 40 70 61 72 61 6d 20 20 20 7b 20 4f 62   * @param   { Ob
6cf0: 6a 65 63 74 20 7d 20 65 78 70 72 20 2d 20 6f 62  ject } expr - ob
6d00: 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ject containing 
6d10: 74 68 65 20 6b 65 79 73 20 75 73 65 64 20 74 6f  the keys used to
6d20: 20 65 78 74 65 6e 64 20 74 68 65 20 63 68 69 6c   extend the chil
6d30: 64 72 65 6e 20 74 61 67 73 0a 20 2a 20 40 70 61  dren tags. * @pa
6d40: 72 61 6d 20 20 20 7b 20 2a 20 7d 20 6b 65 79 20  ram   { * } key 
6d50: 2d 20 76 61 6c 75 65 20 74 6f 20 61 73 73 69 67  - value to assig
6d60: 6e 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a  n to the new obj
6d70: 65 63 74 20 72 65 74 75 72 6e 65 64 0a 20 2a 20  ect returned. * 
6d80: 40 70 61 72 61 6d 20 20 20 7b 20 2a 20 7d 20 76  @param   { * } v
6d90: 61 6c 20 2d 20 76 61 6c 75 65 20 63 6f 6e 74 61  al - value conta
6da0: 69 6e 69 6e 67 20 74 68 65 20 70 6f 73 69 74 69  ining the positi
6db0: 6f 6e 20 6f 66 20 74 68 65 20 69 74 65 6d 20 69  on of the item i
6dc0: 6e 20 74 68 65 20 61 72 72 61 79 0a 20 2a 20 40  n the array. * @
6dd0: 72 65 74 75 72 6e 73 20 7b 20 4f 62 6a 65 63 74  returns { Object
6de0: 20 7d 20 2d 20 6e 65 77 20 6f 62 6a 65 63 74 20   } - new object 
6df0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76  containing the v
6e00: 61 6c 75 65 73 20 6f 66 20 74 68 65 20 6f 72 69  alues of the ori
6e10: 67 69 6e 61 6c 20 69 74 65 6d 0a 20 2a 0a 20 2a  ginal item. *. *
6e20: 20 54 68 65 20 76 61 72 69 61 62 6c 65 73 20 27   The variables '
6e30: 6b 65 79 27 20 61 6e 64 20 27 76 61 6c 27 20 61  key' and 'val' a
6e40: 72 65 20 61 72 62 69 74 72 61 72 79 2e 0a 20 2a  re arbitrary.. *
6e50: 20 54 68 65 79 20 64 65 70 65 6e 64 20 6f 6e 20   They depend on 
6e60: 74 68 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 74  the collection t
6e70: 79 70 65 20 6c 6f 6f 70 65 64 20 28 41 72 72 61  ype looped (Arra
6e80: 79 2c 20 4f 62 6a 65 63 74 29 0a 20 2a 20 61 6e  y, Object). * an
6e90: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
6ea0: 69 6f 6e 20 75 73 65 64 20 6f 6e 20 74 68 65 20  ion used on the 
6eb0: 65 61 63 68 20 74 61 67 0a 20 2a 0a 20 2a 2f 0a  each tag. *. */.
6ec0: 66 75 6e 63 74 69 6f 6e 20 6d 6b 69 74 65 6d 28  function mkitem(
6ed0: 65 78 70 72 2c 20 6b 65 79 2c 20 76 61 6c 29 20  expr, key, val) 
6ee0: 7b 0a 20 20 76 61 72 20 69 74 65 6d 20 3d 20 7b  {.  var item = {
6ef0: 7d 0a 20 20 69 74 65 6d 5b 65 78 70 72 2e 6b 65  }.  item[expr.ke
6f00: 79 5d 20 3d 20 6b 65 79 0a 20 20 69 66 20 28 65  y] = key.  if (e
6f10: 78 70 72 2e 70 6f 73 29 20 69 74 65 6d 5b 65 78  xpr.pos) item[ex
6f20: 70 72 2e 70 6f 73 5d 20 3d 20 76 61 6c 0a 20 20  pr.pos] = val.  
6f30: 72 65 74 75 72 6e 20 69 74 65 6d 0a 7d 0a 0a 2f  return item.}../
6f40: 2a 2a 0a 20 2a 20 55 6e 6d 6f 75 6e 74 20 74 68  **. * Unmount th
6f50: 65 20 72 65 64 75 6e 64 61 6e 74 20 74 61 67 73  e redundant tags
6f60: 0a 20 2a 20 40 70 61 72 61 6d 20 20 20 7b 20 41  . * @param   { A
6f70: 72 72 61 79 20 7d 20 69 74 65 6d 73 20 2d 20 61  rray } items - a
6f80: 72 72 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rray containing 
6f90: 74 68 65 20 63 75 72 72 65 6e 74 20 69 74 65 6d  the current item
6fa0: 73 20 74 6f 20 6c 6f 6f 70 0a 20 2a 20 40 70 61  s to loop. * @pa
6fb0: 72 61 6d 20 20 20 7b 20 41 72 72 61 79 20 7d 20  ram   { Array } 
6fc0: 74 61 67 73 20 2d 20 61 72 72 61 79 20 63 6f 6e  tags - array con
6fd0: 74 61 69 6e 69 6e 67 20 61 6c 6c 20 74 68 65 20  taining all the 
6fe0: 63 68 69 6c 64 72 65 6e 20 74 61 67 73 0a 20 2a  children tags. *
6ff0: 2f 0a 66 75 6e 63 74 69 6f 6e 20 75 6e 6d 6f 75  /.function unmou
7000: 6e 74 52 65 64 75 6e 64 61 6e 74 28 69 74 65 6d  ntRedundant(item
7010: 73 2c 20 74 61 67 73 29 20 7b 0a 0a 20 20 76 61  s, tags) {..  va
7020: 72 20 69 20 3d 20 74 61 67 73 2e 6c 65 6e 67 74  r i = tags.lengt
7030: 68 2c 0a 20 20 20 20 6a 20 3d 20 69 74 65 6d 73  h,.    j = items
7040: 2e 6c 65 6e 67 74 68 2c 0a 20 20 20 20 74 0a 0a  .length,.    t..
7050: 20 20 77 68 69 6c 65 20 28 69 20 3e 20 6a 29 20    while (i > j) 
7060: 7b 0a 20 20 20 20 74 20 3d 20 74 61 67 73 5b 2d  {.    t = tags[-
7070: 2d 69 5d 0a 20 20 20 20 74 61 67 73 2e 73 70 6c  -i].    tags.spl
7080: 69 63 65 28 69 2c 20 31 29 0a 20 20 20 20 74 2e  ice(i, 1).    t.
7090: 75 6e 6d 6f 75 6e 74 28 29 0a 20 20 7d 0a 7d 0a  unmount().  }.}.
70a0: 0a 2f 2a 2a 0a 20 2a 20 4d 6f 76 65 20 74 68 65  ./**. * Move the
70b0: 20 6e 65 73 74 65 64 20 63 75 73 74 6f 6d 20 74   nested custom t
70c0: 61 67 73 20 69 6e 20 6e 6f 6e 20 63 75 73 74 6f  ags in non custo
70d0: 6d 20 6c 6f 6f 70 20 74 61 67 73 0a 20 2a 20 40  m loop tags. * @
70e0: 70 61 72 61 6d 20 20 20 7b 20 4f 62 6a 65 63 74  param   { Object
70f0: 20 7d 20 63 68 69 6c 64 20 2d 20 6e 6f 6e 20 63   } child - non c
7100: 75 73 74 6f 6d 20 6c 6f 6f 70 20 74 61 67 0a 20  ustom loop tag. 
7110: 2a 20 40 70 61 72 61 6d 20 20 20 7b 20 4e 75 6d  * @param   { Num
7120: 62 65 72 20 7d 20 69 20 2d 20 63 75 72 72 65 6e  ber } i - curren
7130: 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  t position of th
7140: 65 20 6c 6f 6f 70 20 74 61 67 0a 20 2a 2f 0a 66  e loop tag. */.f
7150: 75 6e 63 74 69 6f 6e 20 6d 6f 76 65 4e 65 73 74  unction moveNest
7160: 65 64 54 61 67 73 28 63 68 69 6c 64 2c 20 69 29  edTags(child, i)
7170: 20 7b 0a 20 20 4f 62 6a 65 63 74 2e 6b 65 79 73   {.  Object.keys
7180: 28 63 68 69 6c 64 2e 74 61 67 73 29 2e 66 6f 72  (child.tags).for
7190: 45 61 63 68 28 66 75 6e 63 74 69 6f 6e 28 74 61  Each(function(ta
71a0: 67 4e 61 6d 65 29 20 7b 0a 20 20 20 20 76 61 72  gName) {.    var
71b0: 20 74 61 67 20 3d 20 63 68 69 6c 64 2e 74 61 67   tag = child.tag
71c0: 73 5b 74 61 67 4e 61 6d 65 5d 0a 20 20 20 20 69  s[tagName].    i
71d0: 66 20 28 69 73 41 72 72 61 79 28 74 61 67 29 29  f (isArray(tag))
71e0: 0a 20 20 20 20 20 20 65 61 63 68 28 74 61 67 2c  .      each(tag,
71f0: 20 66 75 6e 63 74 69 6f 6e 20 28 74 29 20 7b 0a   function (t) {.
7200: 20 20 20 20 20 20 20 20 6d 6f 76 65 43 68 69 6c          moveChil
7210: 64 54 61 67 28 74 2c 20 74 61 67 4e 61 6d 65 2c  dTag(t, tagName,
7220: 20 69 29 0a 20 20 20 20 20 20 7d 29 0a 20 20 20   i).      }).   
7230: 20 65 6c 73 65 0a 20 20 20 20 20 20 6d 6f 76 65   else.      move
7240: 43 68 69 6c 64 54 61 67 28 74 61 67 2c 20 74 61  ChildTag(tag, ta
7250: 67 4e 61 6d 65 2c 20 69 29 0a 20 20 7d 29 0a 7d  gName, i).  }).}
7260: 0a 0a 2f 2a 2a 0a 20 2a 20 41 64 64 73 20 74 68  ../**. * Adds th
7270: 65 20 65 6c 65 6d 65 6e 74 73 20 66 6f 72 20 61  e elements for a
7280: 20 76 69 72 74 75 61 6c 20 74 61 67 0a 20 2a 20   virtual tag. * 
7290: 40 70 61 72 61 6d 20 7b 20 54 61 67 20 7d 20 74  @param { Tag } t
72a0: 61 67 20 2d 20 74 68 65 20 74 61 67 20 77 68 6f  ag - the tag who
72b0: 73 65 20 72 6f 6f 74 27 73 20 63 68 69 6c 64 72  se root's childr
72c0: 65 6e 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  en will be inser
72d0: 74 65 64 20 6f 72 20 61 70 70 65 6e 64 65 64 0a  ted or appended.
72e0: 20 2a 20 40 70 61 72 61 6d 20 7b 20 4e 6f 64 65   * @param { Node
72f0: 20 7d 20 73 72 63 20 2d 20 74 68 65 20 6e 6f 64   } src - the nod
7300: 65 20 74 68 61 74 20 77 69 6c 6c 20 64 6f 20 74  e that will do t
7310: 68 65 20 69 6e 73 65 72 74 69 6e 67 20 6f 72 20  he inserting or 
7320: 61 70 70 65 6e 64 69 6e 67 0a 20 2a 20 40 70 61  appending. * @pa
7330: 72 61 6d 20 7b 20 54 61 67 20 7d 20 74 61 72 67  ram { Tag } targ
7340: 65 74 20 2d 20 6f 6e 6c 79 20 69 66 20 69 6e 73  et - only if ins
7350: 65 72 74 69 6e 67 2c 20 69 6e 73 65 72 74 20 62  erting, insert b
7360: 65 66 6f 72 65 20 74 68 69 73 20 74 61 67 27 73  efore this tag's
7370: 20 66 69 72 73 74 20 63 68 69 6c 64 0a 20 2a 2f   first child. */
7380: 0a 66 75 6e 63 74 69 6f 6e 20 61 64 64 56 69 72  .function addVir
7390: 74 75 61 6c 28 74 61 67 2c 20 73 72 63 2c 20 74  tual(tag, src, t
73a0: 61 72 67 65 74 29 20 7b 0a 20 20 76 61 72 20 65  arget) {.  var e
73b0: 6c 20 3d 20 74 61 67 2e 5f 72 6f 6f 74 2c 20 73  l = tag._root, s
73c0: 69 62 0a 20 20 74 61 67 2e 5f 76 69 72 74 73 20  ib.  tag._virts 
73d0: 3d 20 5b 5d 0a 20 20 77 68 69 6c 65 20 28 65 6c  = [].  while (el
73e0: 29 20 7b 0a 20 20 20 20 73 69 62 20 3d 20 65 6c  ) {.    sib = el
73f0: 2e 6e 65 78 74 53 69 62 6c 69 6e 67 0a 20 20 20  .nextSibling.   
7400: 20 69 66 20 28 74 61 72 67 65 74 29 0a 20 20 20   if (target).   
7410: 20 20 20 73 72 63 2e 69 6e 73 65 72 74 42 65 66     src.insertBef
7420: 6f 72 65 28 65 6c 2c 20 74 61 72 67 65 74 2e 5f  ore(el, target._
7430: 72 6f 6f 74 29 0a 20 20 20 20 65 6c 73 65 0a 20  root).    else. 
7440: 20 20 20 20 20 73 72 63 2e 61 70 70 65 6e 64 43       src.appendC
7450: 68 69 6c 64 28 65 6c 29 0a 0a 20 20 20 20 74 61  hild(el)..    ta
7460: 67 2e 5f 76 69 72 74 73 2e 70 75 73 68 28 65 6c  g._virts.push(el
7470: 29 20 2f 2f 20 68 6f 6c 64 20 66 6f 72 20 75 6e  ) // hold for un
7480: 6d 6f 75 6e 74 69 6e 67 0a 20 20 20 20 65 6c 20  mounting.    el 
7490: 3d 20 73 69 62 0a 20 20 7d 0a 7d 0a 0a 2f 2a 2a  = sib.  }.}../**
74a0: 0a 20 2a 20 4d 6f 76 65 20 76 69 72 74 75 61 6c  . * Move virtual
74b0: 20 74 61 67 20 61 6e 64 20 61 6c 6c 20 63 68 69   tag and all chi
74c0: 6c 64 20 6e 6f 64 65 73 0a 20 2a 20 40 70 61 72  ld nodes. * @par
74d0: 61 6d 20 7b 20 54 61 67 20 7d 20 74 61 67 20 2d  am { Tag } tag -
74e0: 20 66 69 72 73 74 20 63 68 69 6c 64 20 72 65 66   first child ref
74f0: 65 72 65 6e 63 65 20 75 73 65 64 20 74 6f 20 73  erence used to s
7500: 74 61 72 74 20 6d 6f 76 65 0a 20 2a 20 40 70 61  tart move. * @pa
7510: 72 61 6d 20 7b 20 4e 6f 64 65 20 7d 20 73 72 63  ram { Node } src
7520: 20 20 2d 20 74 68 65 20 6e 6f 64 65 20 74 68 61    - the node tha
7530: 74 20 77 69 6c 6c 20 64 6f 20 74 68 65 20 69 6e  t will do the in
7540: 73 65 72 74 69 6e 67 0a 20 2a 20 40 70 61 72 61  serting. * @para
7550: 6d 20 7b 20 54 61 67 20 7d 20 74 61 72 67 65 74  m { Tag } target
7560: 20 2d 20 69 6e 73 65 72 74 20 62 65 66 6f 72 65   - insert before
7570: 20 74 68 69 73 20 74 61 67 27 73 20 66 69 72 73   this tag's firs
7580: 74 20 63 68 69 6c 64 0a 20 2a 20 40 70 61 72 61  t child. * @para
7590: 6d 20 7b 20 4e 75 6d 62 65 72 20 7d 20 6c 65 6e  m { Number } len
75a0: 20 2d 20 68 6f 77 20 6d 61 6e 79 20 63 68 69 6c   - how many chil
75b0: 64 20 6e 6f 64 65 73 20 74 6f 20 6d 6f 76 65 0a  d nodes to move.
75c0: 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 6d 6f 76   */.function mov
75d0: 65 56 69 72 74 75 61 6c 28 74 61 67 2c 20 73 72  eVirtual(tag, sr
75e0: 63 2c 20 74 61 72 67 65 74 2c 20 6c 65 6e 29 20  c, target, len) 
75f0: 7b 0a 20 20 76 61 72 20 65 6c 20 3d 20 74 61 67  {.  var el = tag
7600: 2e 5f 72 6f 6f 74 2c 20 73 69 62 2c 20 69 20 3d  ._root, sib, i =
7610: 20 30 0a 20 20 66 6f 72 20 28 3b 20 69 20 3c 20   0.  for (; i < 
7620: 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20  len; i++) {.    
7630: 73 69 62 20 3d 20 65 6c 2e 6e 65 78 74 53 69 62  sib = el.nextSib
7640: 6c 69 6e 67 0a 20 20 20 20 73 72 63 2e 69 6e 73  ling.    src.ins
7650: 65 72 74 42 65 66 6f 72 65 28 65 6c 2c 20 74 61  ertBefore(el, ta
7660: 72 67 65 74 2e 5f 72 6f 6f 74 29 0a 20 20 20 20  rget._root).    
7670: 65 6c 20 3d 20 73 69 62 0a 20 20 7d 0a 7d 0a 0a  el = sib.  }.}..
7680: 0a 2f 2a 2a 0a 20 2a 20 4d 61 6e 61 67 65 20 74  ./**. * Manage t
7690: 61 67 73 20 68 61 76 69 6e 67 20 74 68 65 20 27  ags having the '
76a0: 65 61 63 68 27 0a 20 2a 20 40 70 61 72 61 6d 20  each'. * @param 
76b0: 20 20 7b 20 4f 62 6a 65 63 74 20 7d 20 64 6f 6d    { Object } dom
76c0: 20 2d 20 44 4f 4d 20 6e 6f 64 65 20 77 65 20 6e   - DOM node we n
76d0: 65 65 64 20 74 6f 20 6c 6f 6f 70 0a 20 2a 20 40  eed to loop. * @
76e0: 70 61 72 61 6d 20 20 20 7b 20 54 61 67 20 7d 20  param   { Tag } 
76f0: 70 61 72 65 6e 74 20 2d 20 70 61 72 65 6e 74 20  parent - parent 
7700: 74 61 67 20 69 6e 73 74 61 6e 63 65 20 77 68 65  tag instance whe
7710: 72 65 20 74 68 65 20 64 6f 6d 20 6e 6f 64 65 20  re the dom node 
7720: 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 20 2a 20  is contained. * 
7730: 40 70 61 72 61 6d 20 20 20 7b 20 53 74 72 69 6e  @param   { Strin
7740: 67 20 7d 20 65 78 70 72 20 2d 20 73 74 72 69 6e  g } expr - strin
7750: 67 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  g contained in t
7760: 68 65 20 27 65 61 63 68 27 20 61 74 74 72 69 62  he 'each' attrib
7770: 75 74 65 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e  ute. */.function
7780: 20 5f 65 61 63 68 28 64 6f 6d 2c 20 70 61 72 65   _each(dom, pare
7790: 6e 74 2c 20 65 78 70 72 29 20 7b 0a 0a 20 20 2f  nt, expr) {..  /
77a0: 2f 20 72 65 6d 6f 76 65 20 74 68 65 20 65 61 63  / remove the eac
77b0: 68 20 70 72 6f 70 65 72 74 79 20 66 72 6f 6d 20  h property from 
77c0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 61 67  the original tag
77d0: 0a 20 20 72 65 6d 41 74 74 72 28 64 6f 6d 2c 20  .  remAttr(dom, 
77e0: 27 65 61 63 68 27 29 0a 0a 20 20 76 61 72 20 6d  'each')..  var m
77f0: 75 73 74 52 65 6f 72 64 65 72 20 3d 20 74 79 70  ustReorder = typ
7800: 65 6f 66 20 67 65 74 41 74 74 72 28 64 6f 6d 2c  eof getAttr(dom,
7810: 20 27 6e 6f 2d 72 65 6f 72 64 65 72 27 29 20 21   'no-reorder') !
7820: 3d 3d 20 54 5f 53 54 52 49 4e 47 20 7c 7c 20 72  == T_STRING || r
7830: 65 6d 41 74 74 72 28 64 6f 6d 2c 20 27 6e 6f 2d  emAttr(dom, 'no-
7840: 72 65 6f 72 64 65 72 27 29 2c 0a 20 20 20 20 74  reorder'),.    t
7850: 61 67 4e 61 6d 65 20 3d 20 67 65 74 54 61 67 4e  agName = getTagN
7860: 61 6d 65 28 64 6f 6d 29 2c 0a 20 20 20 20 69 6d  ame(dom),.    im
7870: 70 6c 20 3d 20 5f 5f 74 61 67 49 6d 70 6c 5b 74  pl = __tagImpl[t
7880: 61 67 4e 61 6d 65 5d 20 7c 7c 20 7b 20 74 6d 70  agName] || { tmp
7890: 6c 3a 20 67 65 74 4f 75 74 65 72 48 54 4d 4c 28  l: getOuterHTML(
78a0: 64 6f 6d 29 20 7d 2c 0a 20 20 20 20 75 73 65 52  dom) },.    useR
78b0: 6f 6f 74 20 3d 20 53 50 45 43 49 41 4c 5f 54 41  oot = SPECIAL_TA
78c0: 47 53 5f 52 45 47 45 58 2e 74 65 73 74 28 74 61  GS_REGEX.test(ta
78d0: 67 4e 61 6d 65 29 2c 0a 20 20 20 20 72 6f 6f 74  gName),.    root
78e0: 20 3d 20 64 6f 6d 2e 70 61 72 65 6e 74 4e 6f 64   = dom.parentNod
78f0: 65 2c 0a 20 20 20 20 72 65 66 20 3d 20 64 6f 63  e,.    ref = doc
7900: 75 6d 65 6e 74 2e 63 72 65 61 74 65 54 65 78 74  ument.createText
7910: 4e 6f 64 65 28 27 27 29 2c 0a 20 20 20 20 63 68  Node(''),.    ch
7920: 69 6c 64 20 3d 20 67 65 74 54 61 67 28 64 6f 6d  ild = getTag(dom
7930: 29 2c 0a 20 20 20 20 69 73 4f 70 74 69 6f 6e 20  ),.    isOption 
7940: 3d 20 74 61 67 4e 61 6d 65 2e 74 6f 4c 6f 77 65  = tagName.toLowe
7950: 72 43 61 73 65 28 29 20 3d 3d 3d 20 27 6f 70 74  rCase() === 'opt
7960: 69 6f 6e 27 2c 20 2f 2f 20 74 68 65 20 6f 70 74  ion', // the opt
7970: 69 6f 6e 20 74 61 67 73 20 6d 75 73 74 20 62 65  ion tags must be
7980: 20 74 72 65 61 74 65 64 20 64 69 66 66 65 72 65   treated differe
7990: 6e 74 6c 79 0a 20 20 20 20 74 61 67 73 20 3d 20  ntly.    tags = 
79a0: 5b 5d 2c 0a 20 20 20 20 6f 6c 64 49 74 65 6d 73  [],.    oldItems
79b0: 20 3d 20 5b 5d 2c 0a 20 20 20 20 68 61 73 4b 65   = [],.    hasKe
79c0: 79 73 2c 0a 20 20 20 20 69 73 56 69 72 74 75 61  ys,.    isVirtua
79d0: 6c 20 3d 20 64 6f 6d 2e 74 61 67 4e 61 6d 65 20  l = dom.tagName 
79e0: 3d 3d 20 27 56 49 52 54 55 41 4c 27 0a 0a 20 20  == 'VIRTUAL'..  
79f0: 2f 2f 20 70 61 72 73 65 20 74 68 65 20 65 61 63  // parse the eac
7a00: 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 65  h expression.  e
7a10: 78 70 72 20 3d 20 74 6d 70 6c 2e 6c 6f 6f 70 4b  xpr = tmpl.loopK
7a20: 65 79 73 28 65 78 70 72 29 0a 0a 20 20 2f 2f 20  eys(expr)..  // 
7a30: 69 6e 73 65 72 74 20 61 20 6d 61 72 6b 65 64 20  insert a marked 
7a40: 77 68 65 72 65 20 74 68 65 20 6c 6f 6f 70 20 74  where the loop t
7a50: 61 67 73 20 77 69 6c 6c 20 62 65 20 69 6e 6a 65  ags will be inje
7a60: 63 74 65 64 0a 20 20 72 6f 6f 74 2e 69 6e 73 65  cted.  root.inse
7a70: 72 74 42 65 66 6f 72 65 28 72 65 66 2c 20 64 6f  rtBefore(ref, do
7a80: 6d 29 0a 0a 20 20 2f 2f 20 63 6c 65 61 6e 20 74  m)..  // clean t
7a90: 65 6d 70 6c 61 74 65 20 63 6f 64 65 0a 20 20 70  emplate code.  p
7aa0: 61 72 65 6e 74 2e 6f 6e 65 28 27 62 65 66 6f 72  arent.one('befor
7ab0: 65 2d 6d 6f 75 6e 74 27 2c 20 66 75 6e 63 74 69  e-mount', functi
7ac0: 6f 6e 20 28 29 20 7b 0a 0a 20 20 20 20 2f 2f 20  on () {..    // 
7ad0: 72 65 6d 6f 76 65 20 74 68 65 20 6f 72 69 67 69  remove the origi
7ae0: 6e 61 6c 20 44 4f 4d 20 6e 6f 64 65 0a 20 20 20  nal DOM node.   
7af0: 20 64 6f 6d 2e 70 61 72 65 6e 74 4e 6f 64 65 2e   dom.parentNode.
7b00: 72 65 6d 6f 76 65 43 68 69 6c 64 28 64 6f 6d 29  removeChild(dom)
7b10: 0a 20 20 20 20 69 66 20 28 72 6f 6f 74 2e 73 74  .    if (root.st
7b20: 75 62 29 20 72 6f 6f 74 20 3d 20 70 61 72 65 6e  ub) root = paren
7b30: 74 2e 72 6f 6f 74 0a 0a 20 20 7d 29 2e 6f 6e 28  t.root..  }).on(
7b40: 27 75 70 64 61 74 65 27 2c 20 66 75 6e 63 74 69  'update', functi
7b50: 6f 6e 20 28 29 20 7b 0a 20 20 20 20 2f 2f 20 67  on () {.    // g
7b60: 65 74 20 74 68 65 20 6e 65 77 20 69 74 65 6d 73  et the new items
7b70: 20 63 6f 6c 6c 65 63 74 69 6f 6e 0a 20 20 20 20   collection.    
7b80: 76 61 72 20 69 74 65 6d 73 20 3d 20 74 6d 70 6c  var items = tmpl
7b90: 28 65 78 70 72 2e 76 61 6c 2c 20 70 61 72 65 6e  (expr.val, paren
7ba0: 74 29 2c 0a 20 20 20 20 20 20 2f 2f 20 63 72 65  t),.      // cre
7bb0: 61 74 65 20 61 20 66 72 61 67 6d 65 6e 74 20 74  ate a fragment t
7bc0: 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 44  o hold the new D
7bd0: 4f 4d 20 6e 6f 64 65 73 20 74 6f 20 69 6e 6a 65  OM nodes to inje
7be0: 63 74 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ct in the parent
7bf0: 20 74 61 67 0a 20 20 20 20 20 20 66 72 61 67 20   tag.      frag 
7c00: 3d 20 64 6f 63 75 6d 65 6e 74 2e 63 72 65 61 74  = document.creat
7c10: 65 44 6f 63 75 6d 65 6e 74 46 72 61 67 6d 65 6e  eDocumentFragmen
7c20: 74 28 29 0a 0a 20 20 20 20 2f 2f 20 6f 62 6a 65  t()..    // obje
7c30: 63 74 20 6c 6f 6f 70 2e 20 61 6e 79 20 63 68 61  ct loop. any cha
7c40: 6e 67 65 73 20 63 61 75 73 65 20 66 75 6c 6c 20  nges cause full 
7c50: 72 65 64 72 61 77 0a 20 20 20 20 69 66 20 28 21  redraw.    if (!
7c60: 69 73 41 72 72 61 79 28 69 74 65 6d 73 29 29 20  isArray(items)) 
7c70: 7b 0a 20 20 20 20 20 20 68 61 73 4b 65 79 73 20  {.      hasKeys 
7c80: 3d 20 69 74 65 6d 73 20 7c 7c 20 66 61 6c 73 65  = items || false
7c90: 0a 20 20 20 20 20 20 69 74 65 6d 73 20 3d 20 68  .      items = h
7ca0: 61 73 4b 65 79 73 20 3f 0a 20 20 20 20 20 20 20  asKeys ?.       
7cb0: 20 4f 62 6a 65 63 74 2e 6b 65 79 73 28 69 74 65   Object.keys(ite
7cc0: 6d 73 29 2e 6d 61 70 28 66 75 6e 63 74 69 6f 6e  ms).map(function
7cd0: 20 28 6b 65 79 29 20 7b 0a 20 20 20 20 20 20 20   (key) {.       
7ce0: 20 20 20 72 65 74 75 72 6e 20 6d 6b 69 74 65 6d     return mkitem
7cf0: 28 65 78 70 72 2c 20 6b 65 79 2c 20 69 74 65 6d  (expr, key, item
7d00: 73 5b 6b 65 79 5d 29 0a 20 20 20 20 20 20 20 20  s[key]).        
7d10: 7d 29 20 3a 20 5b 5d 0a 20 20 20 20 7d 0a 0a 20  }) : [].    }.. 
7d20: 20 20 20 2f 2f 20 6c 6f 6f 70 20 61 6c 6c 20 74     // loop all t
7d30: 68 65 20 6e 65 77 20 69 74 65 6d 73 0a 20 20 20  he new items.   
7d40: 20 76 61 72 20 69 20 3d 20 30 2c 0a 20 20 20 20   var i = 0,.    
7d50: 20 20 69 74 65 6d 73 4c 65 6e 67 74 68 20 3d 20    itemsLength = 
7d60: 69 74 65 6d 73 2e 6c 65 6e 67 74 68 0a 0a 20 20  items.length..  
7d70: 20 20 66 6f 72 20 28 3b 20 69 20 3c 20 69 74 65    for (; i < ite
7d80: 6d 73 4c 65 6e 67 74 68 3b 20 69 2b 2b 29 20 7b  msLength; i++) {
7d90: 0a 20 20 20 20 20 20 2f 2f 20 72 65 6f 72 64 65  .      // reorde
7da0: 72 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 69 74  r only if the it
7db0: 65 6d 73 20 61 72 65 20 6f 62 6a 65 63 74 73 0a  ems are objects.
7dc0: 20 20 20 20 20 20 76 61 72 0a 20 20 20 20 20 20        var.      
7dd0: 20 20 69 74 65 6d 20 3d 20 69 74 65 6d 73 5b 69    item = items[i
7de0: 5d 2c 0a 20 20 20 20 20 20 20 20 5f 6d 75 73 74  ],.        _must
7df0: 52 65 6f 72 64 65 72 20 3d 20 6d 75 73 74 52 65  Reorder = mustRe
7e00: 6f 72 64 65 72 20 26 26 20 74 79 70 65 6f 66 20  order && typeof 
7e10: 69 74 65 6d 20 3d 3d 20 54 5f 4f 42 4a 45 43 54  item == T_OBJECT
7e20: 20 26 26 20 21 68 61 73 4b 65 79 73 2c 0a 20 20   && !hasKeys,.  
7e30: 20 20 20 20 20 20 6f 6c 64 50 6f 73 20 3d 20 6f        oldPos = o
7e40: 6c 64 49 74 65 6d 73 2e 69 6e 64 65 78 4f 66 28  ldItems.indexOf(
7e50: 69 74 65 6d 29 2c 0a 20 20 20 20 20 20 20 20 70  item),.        p
7e60: 6f 73 20 3d 20 7e 6f 6c 64 50 6f 73 20 26 26 20  os = ~oldPos && 
7e70: 5f 6d 75 73 74 52 65 6f 72 64 65 72 20 3f 20 6f  _mustReorder ? o
7e80: 6c 64 50 6f 73 20 3a 20 69 2c 0a 20 20 20 20 20  ldPos : i,.     
7e90: 20 20 20 2f 2f 20 64 6f 65 73 20 61 20 74 61 67     // does a tag
7ea0: 20 65 78 69 73 74 20 69 6e 20 74 68 69 73 20 70   exist in this p
7eb0: 6f 73 69 74 69 6f 6e 3f 0a 20 20 20 20 20 20 20  osition?.       
7ec0: 20 74 61 67 20 3d 20 74 61 67 73 5b 70 6f 73 5d   tag = tags[pos]
7ed0: 0a 0a 20 20 20 20 20 20 69 74 65 6d 20 3d 20 21  ..      item = !
7ee0: 68 61 73 4b 65 79 73 20 26 26 20 65 78 70 72 2e  hasKeys && expr.
7ef0: 6b 65 79 20 3f 20 6d 6b 69 74 65 6d 28 65 78 70  key ? mkitem(exp
7f00: 72 2c 20 69 74 65 6d 2c 20 69 29 20 3a 20 69 74  r, item, i) : it
7f10: 65 6d 0a 0a 20 20 20 20 20 20 2f 2f 20 6e 65 77  em..      // new
7f20: 20 74 61 67 0a 20 20 20 20 20 20 69 66 20 28 0a   tag.      if (.
7f30: 20 20 20 20 20 20 20 20 21 5f 6d 75 73 74 52 65          !_mustRe
7f40: 6f 72 64 65 72 20 26 26 20 21 74 61 67 20 2f 2f  order && !tag //
7f50: 20 77 69 74 68 20 6e 6f 2d 72 65 6f 72 64 65 72   with no-reorder
7f60: 20 77 65 20 6a 75 73 74 20 75 70 64 61 74 65 20   we just update 
7f70: 74 68 65 20 6f 6c 64 20 74 61 67 73 0a 20 20 20  the old tags.   
7f80: 20 20 20 20 20 7c 7c 0a 20 20 20 20 20 20 20 20       ||.        
7f90: 5f 6d 75 73 74 52 65 6f 72 64 65 72 20 26 26 20  _mustReorder && 
7fa0: 21 7e 6f 6c 64 50 6f 73 20 7c 7c 20 21 74 61 67  !~oldPos || !tag
7fb0: 20 2f 2f 20 62 79 20 64 65 66 61 75 6c 74 20 77   // by default w
7fc0: 65 20 61 6c 77 61 79 73 20 74 72 79 20 74 6f 20  e always try to 
7fd0: 72 65 6f 72 64 65 72 20 74 68 65 20 44 4f 4d 20  reorder the DOM 
7fe0: 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 20 20 29  elements.      )
7ff0: 20 7b 0a 0a 20 20 20 20 20 20 20 20 74 61 67 20   {..        tag 
8000: 3d 20 6e 65 77 20 54 61 67 28 69 6d 70 6c 2c 20  = new Tag(impl, 
8010: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 72 65  {.          pare
8020: 6e 74 3a 20 70 61 72 65 6e 74 2c 0a 20 20 20 20  nt: parent,.    
8030: 20 20 20 20 20 20 69 73 4c 6f 6f 70 3a 20 74 72        isLoop: tr
8040: 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20 68 61  ue,.          ha
8050: 73 49 6d 70 6c 3a 20 21 21 5f 5f 74 61 67 49 6d  sImpl: !!__tagIm
8060: 70 6c 5b 74 61 67 4e 61 6d 65 5d 2c 0a 20 20 20  pl[tagName],.   
8070: 20 20 20 20 20 20 20 72 6f 6f 74 3a 20 75 73 65         root: use
8080: 52 6f 6f 74 20 3f 20 72 6f 6f 74 20 3a 20 64 6f  Root ? root : do
8090: 6d 2e 63 6c 6f 6e 65 4e 6f 64 65 28 29 2c 0a 20  m.cloneNode(),. 
80a0: 20 20 20 20 20 20 20 20 20 69 74 65 6d 3a 20 69           item: i
80b0: 74 65 6d 0a 20 20 20 20 20 20 20 20 7d 2c 20 64  tem.        }, d
80c0: 6f 6d 2e 69 6e 6e 65 72 48 54 4d 4c 29 0a 0a 20  om.innerHTML).. 
80d0: 20 20 20 20 20 20 20 74 61 67 2e 6d 6f 75 6e 74         tag.mount
80e0: 28 29 0a 0a 20 20 20 20 20 20 20 20 69 66 20 28  ()..        if (
80f0: 69 73 56 69 72 74 75 61 6c 29 20 74 61 67 2e 5f  isVirtual) tag._
8100: 72 6f 6f 74 20 3d 20 74 61 67 2e 72 6f 6f 74 2e  root = tag.root.
8110: 66 69 72 73 74 43 68 69 6c 64 20 2f 2f 20 73 61  firstChild // sa
8120: 76 65 20 72 65 66 65 72 65 6e 63 65 20 66 6f 72  ve reference for
8130: 20 66 75 72 74 68 65 72 20 6d 6f 76 65 73 20 6f   further moves o
8140: 72 20 69 6e 73 65 72 74 73 0a 20 20 20 20 20 20  r inserts.      
8150: 20 20 2f 2f 20 74 68 69 73 20 74 61 67 20 6d 75    // this tag mu
8160: 73 74 20 62 65 20 61 70 70 65 6e 64 65 64 0a 20  st be appended. 
8170: 20 20 20 20 20 20 20 69 66 20 28 69 20 3d 3d 20         if (i == 
8180: 74 61 67 73 2e 6c 65 6e 67 74 68 20 7c 7c 20 21  tags.length || !
8190: 74 61 67 73 5b 69 5d 29 20 7b 20 2f 2f 20 66 69  tags[i]) { // fi
81a0: 78 20 31 35 38 31 0a 20 20 20 20 20 20 20 20 20  x 1581.         
81b0: 20 69 66 20 28 69 73 56 69 72 74 75 61 6c 29 0a   if (isVirtual).
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 56              addV
81d0: 69 72 74 75 61 6c 28 74 61 67 2c 20 66 72 61 67  irtual(tag, frag
81e0: 29 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73 65  ).          else
81f0: 20 66 72 61 67 2e 61 70 70 65 6e 64 43 68 69 6c   frag.appendChil
8200: 64 28 74 61 67 2e 72 6f 6f 74 29 0a 20 20 20 20  d(tag.root).    
8210: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2f      }.        //
8220: 20 74 68 69 73 20 74 61 67 20 6d 75 73 74 20 62   this tag must b
8230: 65 20 69 6e 73 65 72 74 0a 20 20 20 20 20 20 20  e insert.       
8240: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
8250: 20 20 69 66 20 28 69 73 56 69 72 74 75 61 6c 29    if (isVirtual)
8260: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64  .            add
8270: 56 69 72 74 75 61 6c 28 74 61 67 2c 20 72 6f 6f  Virtual(tag, roo
8280: 74 2c 20 74 61 67 73 5b 69 5d 29 0a 20 20 20 20  t, tags[i]).    
8290: 20 20 20 20 20 20 65 6c 73 65 20 72 6f 6f 74 2e        else root.
82a0: 69 6e 73 65 72 74 42 65 66 6f 72 65 28 74 61 67  insertBefore(tag
82b0: 2e 72 6f 6f 74 2c 20 74 61 67 73 5b 69 5d 2e 72  .root, tags[i].r
82c0: 6f 6f 74 29 20 2f 2f 20 23 31 33 37 34 20 73 6f  oot) // #1374 so
82d0: 6d 65 20 62 72 6f 77 73 65 72 73 20 72 65 73 65  me browsers rese
82e0: 74 20 73 65 6c 65 63 74 65 64 20 68 65 72 65 0a  t selected here.
82f0: 20 20 20 20 20 20 20 20 20 20 6f 6c 64 49 74 65            oldIte
8300: 6d 73 2e 73 70 6c 69 63 65 28 69 2c 20 30 2c 20  ms.splice(i, 0, 
8310: 69 74 65 6d 29 0a 20 20 20 20 20 20 20 20 7d 0a  item).        }.
8320: 0a 20 20 20 20 20 20 20 20 74 61 67 73 2e 73 70  .        tags.sp
8330: 6c 69 63 65 28 69 2c 20 30 2c 20 74 61 67 29 0a  lice(i, 0, tag).
8340: 20 20 20 20 20 20 20 20 70 6f 73 20 3d 20 69 20          pos = i 
8350: 2f 2f 20 68 61 6e 64 6c 65 64 20 68 65 72 65 20  // handled here 
8360: 73 6f 20 6e 6f 20 6d 6f 76 65 0a 20 20 20 20 20  so no move.     
8370: 20 7d 20 65 6c 73 65 20 74 61 67 2e 75 70 64 61   } else tag.upda
8380: 74 65 28 69 74 65 6d 2c 20 74 72 75 65 29 0a 0a  te(item, true)..
8390: 20 20 20 20 20 20 2f 2f 20 72 65 6f 72 64 65 72        // reorder
83a0: 20 74 68 65 20 74 61 67 20 69 66 20 69 74 27 73   the tag if it's
83b0: 20 6e 6f 74 20 6c 6f 63 61 74 65 64 20 69 6e 20   not located in 
83c0: 69 74 73 20 70 72 65 76 69 6f 75 73 20 70 6f 73  its previous pos
83d0: 69 74 69 6f 6e 0a 20 20 20 20 20 20 69 66 20 28  ition.      if (
83e0: 0a 20 20 20 20 20 20 20 20 70 6f 73 20 21 3d 3d  .        pos !==
83f0: 20 69 20 26 26 20 5f 6d 75 73 74 52 65 6f 72 64   i && _mustReord
8400: 65 72 20 26 26 0a 20 20 20 20 20 20 20 20 74 61  er &&.        ta
8410: 67 73 5b 69 5d 20 2f 2f 20 66 69 78 20 31 35 38  gs[i] // fix 158
8420: 31 20 75 6e 61 62 6c 65 20 74 6f 20 72 65 70 72  1 unable to repr
8430: 6f 64 75 63 65 20 69 74 20 69 6e 20 61 20 74 65  oduce it in a te
8440: 73 74 21 0a 20 20 20 20 20 20 29 20 7b 0a 20 20  st!.      ) {.  
8450: 20 20 20 20 20 20 2f 2f 20 75 70 64 61 74 65 20        // update 
8460: 74 68 65 20 44 4f 4d 0a 20 20 20 20 20 20 20 20  the DOM.        
8470: 69 66 20 28 69 73 56 69 72 74 75 61 6c 29 0a 20  if (isVirtual). 
8480: 20 20 20 20 20 20 20 20 20 6d 6f 76 65 56 69 72           moveVir
8490: 74 75 61 6c 28 74 61 67 2c 20 72 6f 6f 74 2c 20  tual(tag, root, 
84a0: 74 61 67 73 5b 69 5d 2c 20 64 6f 6d 2e 63 68 69  tags[i], dom.chi
84b0: 6c 64 4e 6f 64 65 73 2e 6c 65 6e 67 74 68 29 0a  ldNodes.length).
84c0: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20          else if 
84d0: 28 74 61 67 73 5b 69 5d 2e 72 6f 6f 74 2e 70 61  (tags[i].root.pa
84e0: 72 65 6e 74 4e 6f 64 65 29 20 72 6f 6f 74 2e 69  rentNode) root.i
84f0: 6e 73 65 72 74 42 65 66 6f 72 65 28 74 61 67 2e  nsertBefore(tag.
8500: 72 6f 6f 74 2c 20 74 61 67 73 5b 69 5d 2e 72 6f  root, tags[i].ro
8510: 6f 74 29 0a 20 20 20 20 20 20 20 20 2f 2f 20 75  ot).        // u
8520: 70 64 61 74 65 20 74 68 65 20 70 6f 73 69 74 69  pdate the positi
8530: 6f 6e 20 61 74 74 72 69 62 75 74 65 20 69 66 20  on attribute if 
8540: 69 74 20 65 78 69 73 74 73 0a 20 20 20 20 20 20  it exists.      
8550: 20 20 69 66 20 28 65 78 70 72 2e 70 6f 73 29 0a    if (expr.pos).
8560: 20 20 20 20 20 20 20 20 20 20 74 61 67 5b 65 78            tag[ex
8570: 70 72 2e 70 6f 73 5d 20 3d 20 69 0a 20 20 20 20  pr.pos] = i.    
8580: 20 20 20 20 2f 2f 20 6d 6f 76 65 20 74 68 65 20      // move the 
8590: 6f 6c 64 20 74 61 67 20 69 6e 73 74 61 6e 63 65  old tag instance
85a0: 0a 20 20 20 20 20 20 20 20 74 61 67 73 2e 73 70  .        tags.sp
85b0: 6c 69 63 65 28 69 2c 20 30 2c 20 74 61 67 73 2e  lice(i, 0, tags.
85c0: 73 70 6c 69 63 65 28 70 6f 73 2c 20 31 29 5b 30  splice(pos, 1)[0
85d0: 5d 29 0a 20 20 20 20 20 20 20 20 2f 2f 20 6d 6f  ]).        // mo
85e0: 76 65 20 74 68 65 20 6f 6c 64 20 69 74 65 6d 0a  ve the old item.
85f0: 20 20 20 20 20 20 20 20 6f 6c 64 49 74 65 6d 73          oldItems
8600: 2e 73 70 6c 69 63 65 28 69 2c 20 30 2c 20 6f 6c  .splice(i, 0, ol
8610: 64 49 74 65 6d 73 2e 73 70 6c 69 63 65 28 70 6f  dItems.splice(po
8620: 73 2c 20 31 29 5b 30 5d 29 0a 20 20 20 20 20 20  s, 1)[0]).      
8630: 20 20 2f 2f 20 69 66 20 74 68 65 20 6c 6f 6f 70    // if the loop
8640: 20 74 61 67 73 20 61 72 65 20 6e 6f 74 20 63 75   tags are not cu
8650: 73 74 6f 6d 0a 20 20 20 20 20 20 20 20 2f 2f 20  stom.        // 
8660: 77 65 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20  we need to move 
8670: 61 6c 6c 20 74 68 65 69 72 20 63 75 73 74 6f 6d  all their custom
8680: 20 74 61 67 73 20 69 6e 74 6f 20 74 68 65 20 72   tags into the r
8690: 69 67 68 74 20 70 6f 73 69 74 69 6f 6e 0a 20 20  ight position.  
86a0: 20 20 20 20 20 20 69 66 20 28 21 63 68 69 6c 64        if (!child
86b0: 20 26 26 20 74 61 67 2e 74 61 67 73 29 20 6d 6f   && tag.tags) mo
86c0: 76 65 4e 65 73 74 65 64 54 61 67 73 28 74 61 67  veNestedTags(tag
86d0: 2c 20 69 29 0a 20 20 20 20 20 20 7d 0a 0a 20 20  , i).      }..  
86e0: 20 20 20 20 2f 2f 20 63 61 63 68 65 20 74 68 65      // cache the
86f0: 20 6f 72 69 67 69 6e 61 6c 20 69 74 65 6d 20 74   original item t
8700: 6f 20 75 73 65 20 69 74 20 69 6e 20 74 68 65 20  o use it in the 
8710: 65 76 65 6e 74 73 20 62 6f 75 6e 64 20 74 6f 20  events bound to 
8720: 74 68 69 73 20 6e 6f 64 65 0a 20 20 20 20 20 20  this node.      
8730: 2f 2f 20 61 6e 64 20 69 74 73 20 63 68 69 6c 64  // and its child
8740: 72 65 6e 0a 20 20 20 20 20 20 74 61 67 2e 5f 69  ren.      tag._i
8750: 74 65 6d 20 3d 20 69 74 65 6d 0a 20 20 20 20 20  tem = item.     
8760: 20 2f 2f 20 63 61 63 68 65 20 74 68 65 20 72 65   // cache the re
8770: 61 6c 20 70 61 72 65 6e 74 20 74 61 67 20 69 6e  al parent tag in
8780: 74 65 72 6e 61 6c 6c 79 0a 20 20 20 20 20 20 64  ternally.      d
8790: 65 66 69 6e 65 50 72 6f 70 65 72 74 79 28 74 61  efineProperty(ta
87a0: 67 2c 20 27 5f 70 61 72 65 6e 74 27 2c 20 70 61  g, '_parent', pa
87b0: 72 65 6e 74 29 0a 20 20 20 20 7d 0a 0a 20 20 20  rent).    }..   
87c0: 20 2f 2f 20 72 65 6d 6f 76 65 20 74 68 65 20 72   // remove the r
87d0: 65 64 75 6e 64 61 6e 74 20 74 61 67 73 0a 20 20  edundant tags.  
87e0: 20 20 75 6e 6d 6f 75 6e 74 52 65 64 75 6e 64 61    unmountRedunda
87f0: 6e 74 28 69 74 65 6d 73 2c 20 74 61 67 73 29 0a  nt(items, tags).
8800: 0a 20 20 20 20 2f 2f 20 69 6e 73 65 72 74 20 74  .    // insert t
8810: 68 65 20 6e 65 77 20 6e 6f 64 65 73 0a 20 20 20  he new nodes.   
8820: 20 72 6f 6f 74 2e 69 6e 73 65 72 74 42 65 66 6f   root.insertBefo
8830: 72 65 28 66 72 61 67 2c 20 72 65 66 29 0a 20 20  re(frag, ref).  
8840: 20 20 69 66 20 28 69 73 4f 70 74 69 6f 6e 29 20    if (isOption) 
8850: 7b 0a 0a 20 20 20 20 20 20 2f 2f 20 23 31 33 37  {..      // #137
8860: 34 20 46 69 72 65 46 6f 78 20 62 75 67 20 69 6e  4 FireFox bug in
8870: 20 3c 6f 70 74 69 6f 6e 20 73 65 6c 65 63 74 65   <option selecte
8880: 64 3d 7b 65 78 70 72 65 73 73 69 6f 6e 7d 3e 0a  d={expression}>.
8890: 20 20 20 20 20 20 69 66 20 28 46 49 52 45 46 4f        if (FIREFO
88a0: 58 20 26 26 20 21 72 6f 6f 74 2e 6d 75 6c 74 69  X && !root.multi
88b0: 70 6c 65 29 20 7b 0a 20 20 20 20 20 20 20 20 66  ple) {.        f
88c0: 6f 72 20 28 76 61 72 20 6e 20 3d 20 30 3b 20 6e  or (var n = 0; n
88d0: 20 3c 20 72 6f 6f 74 2e 6c 65 6e 67 74 68 3b 20   < root.length; 
88e0: 6e 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20  n++) {.         
88f0: 20 69 66 20 28 72 6f 6f 74 5b 6e 5d 2e 5f 5f 72   if (root[n].__r
8900: 69 6f 74 31 33 37 34 29 20 7b 0a 20 20 20 20 20  iot1374) {.     
8910: 20 20 20 20 20 20 20 72 6f 6f 74 2e 73 65 6c 65         root.sele
8920: 63 74 65 64 49 6e 64 65 78 20 3d 20 6e 20 20 2f  ctedIndex = n  /
8930: 2f 20 63 6c 65 61 72 20 6f 74 68 65 72 20 6f 70  / clear other op
8940: 74 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20  tions.          
8950: 20 20 64 65 6c 65 74 65 20 72 6f 6f 74 5b 6e 5d    delete root[n]
8960: 2e 5f 5f 72 69 6f 74 31 33 37 34 0a 20 20 20 20  .__riot1374.    
8970: 20 20 20 20 20 20 20 20 62 72 65 61 6b 0a 20 20          break.  
8980: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8990: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
89a0: 7d 0a 0a 20 20 20 20 2f 2f 20 73 65 74 20 74 68  }..    // set th
89b0: 65 20 27 74 61 67 73 27 20 70 72 6f 70 65 72 74  e 'tags' propert
89c0: 79 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  y of the parent 
89d0: 74 61 67 0a 20 20 20 20 2f 2f 20 69 66 20 63 68  tag.    // if ch
89e0: 69 6c 64 20 69 73 20 27 75 6e 64 65 66 69 6e 65  ild is 'undefine
89f0: 64 27 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  d' it means that
8a00: 20 77 65 20 64 6f 6e 27 74 20 6e 65 65 64 20 74   we don't need t
8a10: 6f 20 73 65 74 20 74 68 69 73 20 70 72 6f 70 65  o set this prope
8a20: 72 74 79 0a 20 20 20 20 2f 2f 20 66 6f 72 20 65  rty.    // for e
8a30: 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2f 2f 20 77  xample:.    // w
8a40: 65 20 64 6f 6e 27 74 20 6e 65 65 64 20 73 74 6f  e don't need sto
8a50: 72 65 20 74 68 65 20 60 6d 79 54 61 67 2e 74 61  re the `myTag.ta
8a60: 67 73 5b 27 64 69 76 27 5d 60 20 70 72 6f 70 65  gs['div']` prope
8a70: 72 74 79 20 69 66 20 77 65 20 61 72 65 20 6c 6f  rty if we are lo
8a80: 6f 70 69 6e 67 20 61 20 64 69 76 20 74 61 67 0a  oping a div tag.
8a90: 20 20 20 20 2f 2f 20 62 75 74 20 77 65 20 6e 65      // but we ne
8aa0: 65 64 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20  ed to track the 
8ab0: 60 6d 79 54 61 67 2e 74 61 67 73 5b 27 63 68 69  `myTag.tags['chi
8ac0: 6c 64 27 5d 60 20 70 72 6f 70 65 72 74 79 20 6c  ld']` property l
8ad0: 6f 6f 70 69 6e 67 20 61 20 63 75 73 74 6f 6d 20  ooping a custom 
8ae0: 63 68 69 6c 64 20 6e 6f 64 65 20 6e 61 6d 65 64  child node named
8af0: 20 60 63 68 69 6c 64 60 0a 20 20 20 20 69 66 20   `child`.    if 
8b00: 28 63 68 69 6c 64 29 20 70 61 72 65 6e 74 2e 74  (child) parent.t
8b10: 61 67 73 5b 74 61 67 4e 61 6d 65 5d 20 3d 20 74  ags[tagName] = t
8b20: 61 67 73 0a 0a 20 20 20 20 2f 2f 20 63 6c 6f 6e  ags..    // clon
8b30: 65 20 74 68 65 20 69 74 65 6d 73 20 61 72 72 61  e the items arra
8b40: 79 0a 20 20 20 20 6f 6c 64 49 74 65 6d 73 20 3d  y.    oldItems =
8b50: 20 69 74 65 6d 73 2e 73 6c 69 63 65 28 29 0a 0a   items.slice()..
8b60: 20 20 7d 29 0a 0a 7d 0a 2f 2a 2a 0a 20 2a 20 4f    })..}./**. * O
8b70: 62 6a 65 63 74 20 74 68 61 74 20 77 69 6c 6c 20  bject that will 
8b80: 62 65 20 75 73 65 64 20 74 6f 20 69 6e 6a 65 63  be used to injec
8b90: 74 20 61 6e 64 20 6d 61 6e 61 67 65 20 74 68 65  t and manage the
8ba0: 20 63 73 73 20 6f 66 20 65 76 65 72 79 20 74 61   css of every ta
8bb0: 67 20 69 6e 73 74 61 6e 63 65 0a 20 2a 2f 0a 76  g instance. */.v
8bc0: 61 72 20 73 74 79 6c 65 4d 61 6e 61 67 65 72 20  ar styleManager 
8bd0: 3d 20 28 66 75 6e 63 74 69 6f 6e 28 5f 72 69 6f  = (function(_rio
8be0: 74 29 20 7b 0a 0a 20 20 69 66 20 28 21 77 69 6e  t) {..  if (!win
8bf0: 64 6f 77 29 20 72 65 74 75 72 6e 20 7b 20 2f 2f  dow) return { //
8c00: 20 73 6b 69 70 20 69 6e 6a 65 63 74 69 6f 6e 20   skip injection 
8c10: 6f 6e 20 74 68 65 20 73 65 72 76 65 72 0a 20 20  on the server.  
8c20: 20 20 61 64 64 3a 20 66 75 6e 63 74 69 6f 6e 20    add: function 
8c30: 28 29 20 7b 7d 2c 0a 20 20 20 20 69 6e 6a 65 63  () {},.    injec
8c40: 74 3a 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b  t: function () {
8c50: 7d 0a 20 20 7d 0a 0a 20 20 76 61 72 20 73 74 79  }.  }..  var sty
8c60: 6c 65 4e 6f 64 65 20 3d 20 28 66 75 6e 63 74 69  leNode = (functi
8c70: 6f 6e 20 28 29 20 7b 0a 20 20 20 20 2f 2f 20 63  on () {.    // c
8c80: 72 65 61 74 65 20 61 20 6e 65 77 20 73 74 79 6c  reate a new styl
8c90: 65 20 65 6c 65 6d 65 6e 74 20 77 69 74 68 20 74  e element with t
8ca0: 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65 0a  he correct type.
8cb0: 20 20 20 20 76 61 72 20 6e 65 77 4e 6f 64 65 20      var newNode 
8cc0: 3d 20 6d 6b 45 6c 28 27 73 74 79 6c 65 27 29 0a  = mkEl('style').
8cd0: 20 20 20 20 73 65 74 41 74 74 72 28 6e 65 77 4e      setAttr(newN
8ce0: 6f 64 65 2c 20 27 74 79 70 65 27 2c 20 27 74 65  ode, 'type', 'te
8cf0: 78 74 2f 63 73 73 27 29 0a 0a 20 20 20 20 2f 2f  xt/css')..    //
8d00: 20 72 65 70 6c 61 63 65 20 61 6e 79 20 75 73 65   replace any use
8d10: 72 20 6e 6f 64 65 20 6f 72 20 69 6e 73 65 72 74  r node or insert
8d20: 20 74 68 65 20 6e 65 77 20 6f 6e 65 20 69 6e 74   the new one int
8d30: 6f 20 74 68 65 20 68 65 61 64 0a 20 20 20 20 76  o the head.    v
8d40: 61 72 20 75 73 65 72 4e 6f 64 65 20 3d 20 24 28  ar userNode = $(
8d50: 27 73 74 79 6c 65 5b 74 79 70 65 3d 72 69 6f 74  'style[type=riot
8d60: 5d 27 29 0a 20 20 20 20 69 66 20 28 75 73 65 72  ]').    if (user
8d70: 4e 6f 64 65 29 20 7b 0a 20 20 20 20 20 20 69 66  Node) {.      if
8d80: 20 28 75 73 65 72 4e 6f 64 65 2e 69 64 29 20 6e   (userNode.id) n
8d90: 65 77 4e 6f 64 65 2e 69 64 20 3d 20 75 73 65 72  ewNode.id = user
8da0: 4e 6f 64 65 2e 69 64 0a 20 20 20 20 20 20 75 73  Node.id.      us
8db0: 65 72 4e 6f 64 65 2e 70 61 72 65 6e 74 4e 6f 64  erNode.parentNod
8dc0: 65 2e 72 65 70 6c 61 63 65 43 68 69 6c 64 28 6e  e.replaceChild(n
8dd0: 65 77 4e 6f 64 65 2c 20 75 73 65 72 4e 6f 64 65  ewNode, userNode
8de0: 29 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ).    }.    else
8df0: 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65   document.getEle
8e00: 6d 65 6e 74 73 42 79 54 61 67 4e 61 6d 65 28 27  mentsByTagName('
8e10: 68 65 61 64 27 29 5b 30 5d 2e 61 70 70 65 6e 64  head')[0].append
8e20: 43 68 69 6c 64 28 6e 65 77 4e 6f 64 65 29 0a 0a  Child(newNode)..
8e30: 20 20 20 20 72 65 74 75 72 6e 20 6e 65 77 4e 6f      return newNo
8e40: 64 65 0a 20 20 7d 29 28 29 0a 0a 20 20 2f 2f 20  de.  })()..  // 
8e50: 43 72 65 61 74 65 20 63 61 63 68 65 20 61 6e 64  Create cache and
8e60: 20 73 68 6f 72 74 63 75 74 20 74 6f 20 74 68 65   shortcut to the
8e70: 20 63 6f 72 72 65 63 74 20 70 72 6f 70 65 72 74   correct propert
8e80: 79 0a 20 20 76 61 72 20 63 73 73 54 65 78 74 50  y.  var cssTextP
8e90: 72 6f 70 20 3d 20 73 74 79 6c 65 4e 6f 64 65 2e  rop = styleNode.
8ea0: 73 74 79 6c 65 53 68 65 65 74 2c 0a 20 20 20 20  styleSheet,.    
8eb0: 73 74 79 6c 65 73 54 6f 49 6e 6a 65 63 74 20 3d  stylesToInject =
8ec0: 20 27 27 0a 0a 20 20 2f 2f 20 45 78 70 6f 73 65   ''..  // Expose
8ed0: 20 74 68 65 20 73 74 79 6c 65 20 6e 6f 64 65 20   the style node 
8ee0: 69 6e 20 61 20 6e 6f 6e 2d 6d 6f 64 69 66 69 63  in a non-modific
8ef0: 61 62 6c 65 20 70 72 6f 70 65 72 74 79 0a 20 20  able property.  
8f00: 4f 62 6a 65 63 74 2e 64 65 66 69 6e 65 50 72 6f  Object.definePro
8f10: 70 65 72 74 79 28 5f 72 69 6f 74 2c 20 27 73 74  perty(_riot, 'st
8f20: 79 6c 65 4e 6f 64 65 27 2c 20 7b 0a 20 20 20 20  yleNode', {.    
8f30: 76 61 6c 75 65 3a 20 73 74 79 6c 65 4e 6f 64 65  value: styleNode
8f40: 2c 0a 20 20 20 20 77 72 69 74 61 62 6c 65 3a 20  ,.    writable: 
8f50: 74 72 75 65 0a 20 20 7d 29 0a 0a 20 20 2f 2a 2a  true.  })..  /**
8f60: 0a 20 20 20 2a 20 50 75 62 6c 69 63 20 61 70 69  .   * Public api
8f70: 0a 20 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  .   */.  return 
8f80: 7b 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a  {.    /**.     *
8f90: 20 53 61 76 65 20 61 20 74 61 67 20 73 74 79 6c   Save a tag styl
8fa0: 65 20 74 6f 20 62 65 20 6c 61 74 65 72 20 69 6e  e to be later in
8fb0: 6a 65 63 74 65 64 20 69 6e 74 6f 20 44 4f 4d 0a  jected into DOM.
8fc0: 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 20 20       * @param   
8fd0: 7b 20 53 74 72 69 6e 67 20 7d 20 63 73 73 20 5b  { String } css [
8fe0: 64 65 73 63 72 69 70 74 69 6f 6e 5d 0a 20 20 20  description].   
8ff0: 20 20 2a 2f 0a 20 20 20 20 61 64 64 3a 20 66 75    */.    add: fu
9000: 6e 63 74 69 6f 6e 28 63 73 73 29 20 7b 0a 20 20  nction(css) {.  
9010: 20 20 20 20 73 74 79 6c 65 73 54 6f 49 6e 6a 65      stylesToInje
9020: 63 74 20 2b 3d 20 63 73 73 0a 20 20 20 20 7d 2c  ct += css.    },
9030: 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20  .    /**.     * 
9040: 49 6e 6a 65 63 74 20 61 6c 6c 20 70 72 65 76 69  Inject all previ
9050: 6f 75 73 6c 79 20 73 61 76 65 64 20 74 61 67 20  ously saved tag 
9060: 73 74 79 6c 65 73 20 69 6e 74 6f 20 44 4f 4d 0a  styles into DOM.
9070: 20 20 20 20 20 2a 20 69 6e 6e 65 72 48 54 4d 4c       * innerHTML
9080: 20 73 65 65 6d 73 20 73 6c 6f 77 3a 20 68 74 74   seems slow: htt
9090: 70 3a 2f 2f 6a 73 70 65 72 66 2e 63 6f 6d 2f 72  p://jsperf.com/r
90a0: 69 6f 74 2d 69 6e 73 65 72 74 2d 73 74 79 6c 65  iot-insert-style
90b0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 6a  .     */.    inj
90c0: 65 63 74 3a 20 66 75 6e 63 74 69 6f 6e 28 29 20  ect: function() 
90d0: 7b 0a 20 20 20 20 20 20 69 66 20 28 73 74 79 6c  {.      if (styl
90e0: 65 73 54 6f 49 6e 6a 65 63 74 29 20 7b 0a 20 20  esToInject) {.  
90f0: 20 20 20 20 20 20 69 66 20 28 63 73 73 54 65 78        if (cssTex
9100: 74 50 72 6f 70 29 20 63 73 73 54 65 78 74 50 72  tProp) cssTextPr
9110: 6f 70 2e 63 73 73 54 65 78 74 20 2b 3d 20 73 74  op.cssText += st
9120: 79 6c 65 73 54 6f 49 6e 6a 65 63 74 0a 20 20 20  ylesToInject.   
9130: 20 20 20 20 20 65 6c 73 65 20 73 74 79 6c 65 4e       else styleN
9140: 6f 64 65 2e 69 6e 6e 65 72 48 54 4d 4c 20 2b 3d  ode.innerHTML +=
9150: 20 73 74 79 6c 65 73 54 6f 49 6e 6a 65 63 74 0a   stylesToInject.
9160: 20 20 20 20 20 20 20 20 73 74 79 6c 65 73 54 6f          stylesTo
9170: 49 6e 6a 65 63 74 20 3d 20 27 27 0a 20 20 20 20  Inject = ''.    
9180: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 7d    }.    }.  }..}
9190: 29 28 72 69 6f 74 29 0a 0a 0a 66 75 6e 63 74 69  )(riot)...functi
91a0: 6f 6e 20 70 61 72 73 65 4e 61 6d 65 64 45 6c 65  on parseNamedEle
91b0: 6d 65 6e 74 73 28 72 6f 6f 74 2c 20 74 61 67 2c  ments(root, tag,
91c0: 20 63 68 69 6c 64 54 61 67 73 2c 20 66 6f 72 63   childTags, forc
91d0: 65 50 61 72 73 69 6e 67 4e 61 6d 65 64 29 20 7b  eParsingNamed) {
91e0: 0a 0a 20 20 77 61 6c 6b 28 72 6f 6f 74 2c 20 66  ..  walk(root, f
91f0: 75 6e 63 74 69 6f 6e 28 64 6f 6d 29 20 7b 0a 20  unction(dom) {. 
9200: 20 20 20 69 66 20 28 64 6f 6d 2e 6e 6f 64 65 54     if (dom.nodeT
9210: 79 70 65 20 3d 3d 20 31 29 20 7b 0a 20 20 20 20  ype == 1) {.    
9220: 20 20 64 6f 6d 2e 69 73 4c 6f 6f 70 20 3d 20 64    dom.isLoop = d
9230: 6f 6d 2e 69 73 4c 6f 6f 70 20 7c 7c 0a 20 20 20  om.isLoop ||.   
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
9250: 64 6f 6d 2e 70 61 72 65 6e 74 4e 6f 64 65 20 26  dom.parentNode &
9260: 26 20 64 6f 6d 2e 70 61 72 65 6e 74 4e 6f 64 65  & dom.parentNode
9270: 2e 69 73 4c 6f 6f 70 20 7c 7c 20 67 65 74 41 74  .isLoop || getAt
9280: 74 72 28 64 6f 6d 2c 20 27 65 61 63 68 27 29 29  tr(dom, 'each'))
9290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
92a0: 20 20 20 20 20 3f 20 31 20 3a 20 30 0a 0a 20 20       ? 1 : 0..  
92b0: 20 20 20 20 2f 2f 20 63 75 73 74 6f 6d 20 63 68      // custom ch
92c0: 69 6c 64 20 74 61 67 0a 20 20 20 20 20 20 69 66  ild tag.      if
92d0: 20 28 63 68 69 6c 64 54 61 67 73 29 20 7b 0a 20   (childTags) {. 
92e0: 20 20 20 20 20 20 20 76 61 72 20 63 68 69 6c 64         var child
92f0: 20 3d 20 67 65 74 54 61 67 28 64 6f 6d 29 0a 0a   = getTag(dom)..
9300: 20 20 20 20 20 20 20 20 69 66 20 28 63 68 69 6c          if (chil
9310: 64 20 26 26 20 21 64 6f 6d 2e 69 73 4c 6f 6f 70  d && !dom.isLoop
9320: 29 0a 20 20 20 20 20 20 20 20 20 20 63 68 69 6c  ).          chil
9330: 64 54 61 67 73 2e 70 75 73 68 28 69 6e 69 74 43  dTags.push(initC
9340: 68 69 6c 64 54 61 67 28 63 68 69 6c 64 2c 20 7b  hildTag(child, {
9350: 72 6f 6f 74 3a 20 64 6f 6d 2c 20 70 61 72 65 6e  root: dom, paren
9360: 74 3a 20 74 61 67 7d 2c 20 64 6f 6d 2e 69 6e 6e  t: tag}, dom.inn
9370: 65 72 48 54 4d 4c 2c 20 74 61 67 29 29 0a 20 20  erHTML, tag)).  
9380: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 20      }..      if 
9390: 28 21 64 6f 6d 2e 69 73 4c 6f 6f 70 20 7c 7c 20  (!dom.isLoop || 
93a0: 66 6f 72 63 65 50 61 72 73 69 6e 67 4e 61 6d 65  forceParsingName
93b0: 64 29 0a 20 20 20 20 20 20 20 20 73 65 74 4e 61  d).        setNa
93c0: 6d 65 64 28 64 6f 6d 2c 20 74 61 67 2c 20 5b 5d  med(dom, tag, []
93d0: 29 0a 20 20 20 20 7d 0a 0a 20 20 7d 29 0a 0a 7d  ).    }..  })..}
93e0: 0a 0a 66 75 6e 63 74 69 6f 6e 20 70 61 72 73 65  ..function parse
93f0: 45 78 70 72 65 73 73 69 6f 6e 73 28 72 6f 6f 74  Expressions(root
9400: 2c 20 74 61 67 2c 20 65 78 70 72 65 73 73 69 6f  , tag, expressio
9410: 6e 73 29 20 7b 0a 0a 20 20 66 75 6e 63 74 69 6f  ns) {..  functio
9420: 6e 20 61 64 64 45 78 70 72 28 64 6f 6d 2c 20 76  n addExpr(dom, v
9430: 61 6c 2c 20 65 78 74 72 61 29 20 7b 0a 20 20 20  al, extra) {.   
9440: 20 69 66 20 28 74 6d 70 6c 2e 68 61 73 45 78 70   if (tmpl.hasExp
9450: 72 28 76 61 6c 29 29 20 7b 0a 20 20 20 20 20 20  r(val)) {.      
9460: 65 78 70 72 65 73 73 69 6f 6e 73 2e 70 75 73 68  expressions.push
9470: 28 65 78 74 65 6e 64 28 7b 20 64 6f 6d 3a 20 64  (extend({ dom: d
9480: 6f 6d 2c 20 65 78 70 72 3a 20 76 61 6c 20 7d 2c  om, expr: val },
9490: 20 65 78 74 72 61 29 29 0a 20 20 20 20 7d 0a 20   extra)).    }. 
94a0: 20 7d 0a 0a 20 20 77 61 6c 6b 28 72 6f 6f 74 2c   }..  walk(root,
94b0: 20 66 75 6e 63 74 69 6f 6e 28 64 6f 6d 29 20 7b   function(dom) {
94c0: 0a 20 20 20 20 76 61 72 20 74 79 70 65 20 3d 20  .    var type = 
94d0: 64 6f 6d 2e 6e 6f 64 65 54 79 70 65 2c 0a 20 20  dom.nodeType,.  
94e0: 20 20 20 20 61 74 74 72 0a 0a 20 20 20 20 2f 2f      attr..    //
94f0: 20 74 65 78 74 20 6e 6f 64 65 0a 20 20 20 20 69   text node.    i
9500: 66 20 28 74 79 70 65 20 3d 3d 20 33 20 26 26 20  f (type == 3 && 
9510: 64 6f 6d 2e 70 61 72 65 6e 74 4e 6f 64 65 2e 74  dom.parentNode.t
9520: 61 67 4e 61 6d 65 20 21 3d 20 27 53 54 59 4c 45  agName != 'STYLE
9530: 27 29 20 61 64 64 45 78 70 72 28 64 6f 6d 2c 20  ') addExpr(dom, 
9540: 64 6f 6d 2e 6e 6f 64 65 56 61 6c 75 65 29 0a 20  dom.nodeValue). 
9550: 20 20 20 69 66 20 28 74 79 70 65 20 21 3d 20 31     if (type != 1
9560: 29 20 72 65 74 75 72 6e 0a 0a 20 20 20 20 2f 2a  ) return..    /*
9570: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20   element */..   
9580: 20 2f 2f 20 6c 6f 6f 70 0a 20 20 20 20 61 74 74   // loop.    att
9590: 72 20 3d 20 67 65 74 41 74 74 72 28 64 6f 6d 2c  r = getAttr(dom,
95a0: 20 27 65 61 63 68 27 29 0a 0a 20 20 20 20 69 66   'each')..    if
95b0: 20 28 61 74 74 72 29 20 7b 20 5f 65 61 63 68 28   (attr) { _each(
95c0: 64 6f 6d 2c 20 74 61 67 2c 20 61 74 74 72 29 3b  dom, tag, attr);
95d0: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 20 7d 0a   return false }.
95e0: 0a 20 20 20 20 2f 2f 20 61 74 74 72 69 62 75 74  .    // attribut
95f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 20 20  e expressions.  
9600: 20 20 65 61 63 68 28 64 6f 6d 2e 61 74 74 72 69    each(dom.attri
9610: 62 75 74 65 73 2c 20 66 75 6e 63 74 69 6f 6e 28  butes, function(
9620: 61 74 74 72 29 20 7b 0a 20 20 20 20 20 20 76 61  attr) {.      va
9630: 72 20 6e 61 6d 65 20 3d 20 61 74 74 72 2e 6e 61  r name = attr.na
9640: 6d 65 2c 0a 20 20 20 20 20 20 20 20 62 6f 6f 6c  me,.        bool
9650: 20 3d 20 6e 61 6d 65 2e 73 70 6c 69 74 28 27 5f   = name.split('_
9660: 5f 27 29 5b 31 5d 0a 0a 20 20 20 20 20 20 61 64  _')[1]..      ad
9670: 64 45 78 70 72 28 64 6f 6d 2c 20 61 74 74 72 2e  dExpr(dom, attr.
9680: 76 61 6c 75 65 2c 20 7b 20 61 74 74 72 3a 20 62  value, { attr: b
9690: 6f 6f 6c 20 7c 7c 20 6e 61 6d 65 2c 20 62 6f 6f  ool || name, boo
96a0: 6c 3a 20 62 6f 6f 6c 20 7d 29 0a 20 20 20 20 20  l: bool }).     
96b0: 20 69 66 20 28 62 6f 6f 6c 29 20 7b 20 72 65 6d   if (bool) { rem
96c0: 41 74 74 72 28 64 6f 6d 2c 20 6e 61 6d 65 29 3b  Attr(dom, name);
96d0: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 20 7d 0a   return false }.
96e0: 0a 20 20 20 20 7d 29 0a 0a 20 20 20 20 2f 2f 20  .    })..    // 
96f0: 73 6b 69 70 20 63 75 73 74 6f 6d 20 74 61 67 73  skip custom tags
9700: 0a 20 20 20 20 69 66 20 28 67 65 74 54 61 67 28  .    if (getTag(
9710: 64 6f 6d 29 29 20 72 65 74 75 72 6e 20 66 61 6c  dom)) return fal
9720: 73 65 0a 0a 20 20 7d 29 0a 0a 7d 0a 66 75 6e 63  se..  })..}.func
9730: 74 69 6f 6e 20 54 61 67 28 69 6d 70 6c 2c 20 63  tion Tag(impl, c
9740: 6f 6e 66 2c 20 69 6e 6e 65 72 48 54 4d 4c 29 20  onf, innerHTML) 
9750: 7b 0a 0a 20 20 76 61 72 20 73 65 6c 66 20 3d 20  {..  var self = 
9760: 72 69 6f 74 2e 6f 62 73 65 72 76 61 62 6c 65 28  riot.observable(
9770: 74 68 69 73 29 2c 0a 20 20 20 20 6f 70 74 73 20  this),.    opts 
9780: 3d 20 69 6e 68 65 72 69 74 28 63 6f 6e 66 2e 6f  = inherit(conf.o
9790: 70 74 73 29 20 7c 7c 20 7b 7d 2c 0a 20 20 20 20  pts) || {},.    
97a0: 70 61 72 65 6e 74 20 3d 20 63 6f 6e 66 2e 70 61  parent = conf.pa
97b0: 72 65 6e 74 2c 0a 20 20 20 20 69 73 4c 6f 6f 70  rent,.    isLoop
97c0: 20 3d 20 63 6f 6e 66 2e 69 73 4c 6f 6f 70 2c 0a   = conf.isLoop,.
97d0: 20 20 20 20 68 61 73 49 6d 70 6c 20 3d 20 63 6f      hasImpl = co
97e0: 6e 66 2e 68 61 73 49 6d 70 6c 2c 0a 20 20 20 20  nf.hasImpl,.    
97f0: 69 74 65 6d 20 3d 20 63 6c 65 61 6e 55 70 44 61  item = cleanUpDa
9800: 74 61 28 63 6f 6e 66 2e 69 74 65 6d 29 2c 0a 20  ta(conf.item),. 
9810: 20 20 20 65 78 70 72 65 73 73 69 6f 6e 73 20 3d     expressions =
9820: 20 5b 5d 2c 0a 20 20 20 20 63 68 69 6c 64 54 61   [],.    childTa
9830: 67 73 20 3d 20 5b 5d 2c 0a 20 20 20 20 72 6f 6f  gs = [],.    roo
9840: 74 20 3d 20 63 6f 6e 66 2e 72 6f 6f 74 2c 0a 20  t = conf.root,. 
9850: 20 20 20 74 61 67 4e 61 6d 65 20 3d 20 72 6f 6f     tagName = roo
9860: 74 2e 74 61 67 4e 61 6d 65 2e 74 6f 4c 6f 77 65  t.tagName.toLowe
9870: 72 43 61 73 65 28 29 2c 0a 20 20 20 20 61 74 74  rCase(),.    att
9880: 72 20 3d 20 7b 7d 2c 0a 20 20 20 20 70 72 6f 70  r = {},.    prop
9890: 73 49 6e 53 79 6e 63 57 69 74 68 50 61 72 65 6e  sInSyncWithParen
98a0: 74 20 3d 20 5b 5d 2c 0a 20 20 20 20 64 6f 6d 0a  t = [],.    dom.
98b0: 0a 20 20 2f 2f 20 6f 6e 6c 79 20 63 61 6c 6c 20  .  // only call 
98c0: 75 6e 6d 6f 75 6e 74 20 69 66 20 77 65 20 68 61  unmount if we ha
98d0: 76 65 20 61 20 76 61 6c 69 64 20 5f 5f 74 61 67  ve a valid __tag
98e0: 49 6d 70 6c 20 28 68 61 73 20 6e 61 6d 65 20 70  Impl (has name p
98f0: 72 6f 70 65 72 74 79 29 0a 20 20 69 66 20 28 69  roperty).  if (i
9900: 6d 70 6c 2e 6e 61 6d 65 20 26 26 20 72 6f 6f 74  mpl.name && root
9910: 2e 5f 74 61 67 29 20 72 6f 6f 74 2e 5f 74 61 67  ._tag) root._tag
9920: 2e 75 6e 6d 6f 75 6e 74 28 74 72 75 65 29 0a 0a  .unmount(true)..
9930: 20 20 2f 2f 20 6e 6f 74 20 79 65 74 20 6d 6f 75    // not yet mou
9940: 6e 74 65 64 0a 20 20 74 68 69 73 2e 69 73 4d 6f  nted.  this.isMo
9950: 75 6e 74 65 64 20 3d 20 66 61 6c 73 65 0a 20 20  unted = false.  
9960: 72 6f 6f 74 2e 69 73 4c 6f 6f 70 20 3d 20 69 73  root.isLoop = is
9970: 4c 6f 6f 70 0a 0a 20 20 2f 2f 20 6b 65 65 70 20  Loop..  // keep 
9980: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
9990: 68 65 20 74 61 67 20 6a 75 73 74 20 63 72 65 61  he tag just crea
99a0: 74 65 64 0a 20 20 2f 2f 20 73 6f 20 77 65 20 77  ted.  // so we w
99b0: 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 6d  ill be able to m
99c0: 6f 75 6e 74 20 74 68 69 73 20 74 61 67 20 6d 75  ount this tag mu
99d0: 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20 72  ltiple times.  r
99e0: 6f 6f 74 2e 5f 74 61 67 20 3d 20 74 68 69 73 0a  oot._tag = this.
99f0: 0a 20 20 2f 2f 20 63 72 65 61 74 65 20 61 20 75  .  // create a u
9a00: 6e 69 71 75 65 20 69 64 20 74 6f 20 74 68 69 73  nique id to this
9a10: 20 74 61 67 0a 20 20 2f 2f 20 69 74 20 63 6f 75   tag.  // it cou
9a20: 6c 64 20 62 65 20 68 61 6e 64 79 20 74 6f 20 75  ld be handy to u
9a30: 73 65 20 69 74 20 61 6c 73 6f 20 74 6f 20 69 6d  se it also to im
9a40: 70 72 6f 76 65 20 74 68 65 20 76 69 72 74 75 61  prove the virtua
9a50: 6c 20 64 6f 6d 20 72 65 6e 64 65 72 69 6e 67 20  l dom rendering 
9a60: 73 70 65 65 64 0a 20 20 64 65 66 69 6e 65 50 72  speed.  definePr
9a70: 6f 70 65 72 74 79 28 74 68 69 73 2c 20 27 5f 72  operty(this, '_r
9a80: 69 6f 74 5f 69 64 27 2c 20 2b 2b 5f 5f 75 69 64  iot_id', ++__uid
9a90: 29 20 2f 2f 20 62 61 73 65 20 31 20 61 6c 6c 6f  ) // base 1 allo
9aa0: 77 73 20 74 65 73 74 20 21 74 2e 5f 72 69 6f 74  ws test !t._riot
9ab0: 5f 69 64 0a 0a 20 20 65 78 74 65 6e 64 28 74 68  _id..  extend(th
9ac0: 69 73 2c 20 7b 20 70 61 72 65 6e 74 3a 20 70 61  is, { parent: pa
9ad0: 72 65 6e 74 2c 20 72 6f 6f 74 3a 20 72 6f 6f 74  rent, root: root
9ae0: 2c 20 6f 70 74 73 3a 20 6f 70 74 73 7d 2c 20 69  , opts: opts}, i
9af0: 74 65 6d 29 0a 20 20 2f 2f 20 70 72 6f 74 65 63  tem).  // protec
9b00: 74 20 74 68 65 20 22 74 61 67 73 22 20 70 72 6f  t the "tags" pro
9b10: 70 65 72 74 79 20 66 72 6f 6d 20 62 65 69 6e 67  perty from being
9b20: 20 6f 76 65 72 72 69 64 64 65 6e 0a 20 20 64 65   overridden.  de
9b30: 66 69 6e 65 50 72 6f 70 65 72 74 79 28 74 68 69  fineProperty(thi
9b40: 73 2c 20 27 74 61 67 73 27 2c 20 7b 7d 29 0a 0a  s, 'tags', {})..
9b50: 20 20 2f 2f 20 67 72 61 62 20 61 74 74 72 69 62    // grab attrib
9b60: 75 74 65 73 0a 20 20 65 61 63 68 28 72 6f 6f 74  utes.  each(root
9b70: 2e 61 74 74 72 69 62 75 74 65 73 2c 20 66 75 6e  .attributes, fun
9b80: 63 74 69 6f 6e 28 65 6c 29 20 7b 0a 20 20 20 20  ction(el) {.    
9b90: 76 61 72 20 76 61 6c 20 3d 20 65 6c 2e 76 61 6c  var val = el.val
9ba0: 75 65 0a 20 20 20 20 2f 2f 20 72 65 6d 65 6d 62  ue.    // rememb
9bb0: 65 72 20 61 74 74 72 69 62 75 74 65 73 20 77 69  er attributes wi
9bc0: 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  th expressions o
9bd0: 6e 6c 79 0a 20 20 20 20 69 66 20 28 74 6d 70 6c  nly.    if (tmpl
9be0: 2e 68 61 73 45 78 70 72 28 76 61 6c 29 29 20 61  .hasExpr(val)) a
9bf0: 74 74 72 5b 65 6c 2e 6e 61 6d 65 5d 20 3d 20 76  ttr[el.name] = v
9c00: 61 6c 0a 20 20 7d 29 0a 0a 20 20 64 6f 6d 20 3d  al.  })..  dom =
9c10: 20 6d 6b 64 6f 6d 28 69 6d 70 6c 2e 74 6d 70 6c   mkdom(impl.tmpl
9c20: 2c 20 69 6e 6e 65 72 48 54 4d 4c 29 0a 0a 20 20  , innerHTML)..  
9c30: 2f 2f 20 6f 70 74 69 6f 6e 73 0a 20 20 66 75 6e  // options.  fun
9c40: 63 74 69 6f 6e 20 75 70 64 61 74 65 4f 70 74 73  ction updateOpts
9c50: 28 29 20 7b 0a 20 20 20 20 76 61 72 20 63 74 78  () {.    var ctx
9c60: 20 3d 20 68 61 73 49 6d 70 6c 20 26 26 20 69 73   = hasImpl && is
9c70: 4c 6f 6f 70 20 3f 20 73 65 6c 66 20 3a 20 70 61  Loop ? self : pa
9c80: 72 65 6e 74 20 7c 7c 20 73 65 6c 66 0a 0a 20 20  rent || self..  
9c90: 20 20 2f 2f 20 75 70 64 61 74 65 20 6f 70 74 73    // update opts
9ca0: 20 66 72 6f 6d 20 63 75 72 72 65 6e 74 20 44 4f   from current DO
9cb0: 4d 20 61 74 74 72 69 62 75 74 65 73 0a 20 20 20  M attributes.   
9cc0: 20 65 61 63 68 28 72 6f 6f 74 2e 61 74 74 72 69   each(root.attri
9cd0: 62 75 74 65 73 2c 20 66 75 6e 63 74 69 6f 6e 28  butes, function(
9ce0: 65 6c 29 20 7b 0a 20 20 20 20 20 20 76 61 72 20  el) {.      var 
9cf0: 76 61 6c 20 3d 20 65 6c 2e 76 61 6c 75 65 0a 20  val = el.value. 
9d00: 20 20 20 20 20 6f 70 74 73 5b 74 6f 43 61 6d 65       opts[toCame
9d10: 6c 28 65 6c 2e 6e 61 6d 65 29 5d 20 3d 20 74 6d  l(el.name)] = tm
9d20: 70 6c 2e 68 61 73 45 78 70 72 28 76 61 6c 29 20  pl.hasExpr(val) 
9d30: 3f 20 74 6d 70 6c 28 76 61 6c 2c 20 63 74 78 29  ? tmpl(val, ctx)
9d40: 20 3a 20 76 61 6c 0a 20 20 20 20 7d 29 0a 20 20   : val.    }).  
9d50: 20 20 2f 2f 20 72 65 63 6f 76 65 72 20 74 68 6f    // recover tho
9d60: 73 65 20 77 69 74 68 20 65 78 70 72 65 73 73 69  se with expressi
9d70: 6f 6e 73 0a 20 20 20 20 65 61 63 68 28 4f 62 6a  ons.    each(Obj
9d80: 65 63 74 2e 6b 65 79 73 28 61 74 74 72 29 2c 20  ect.keys(attr), 
9d90: 66 75 6e 63 74 69 6f 6e 28 6e 61 6d 65 29 20 7b  function(name) {
9da0: 0a 20 20 20 20 20 20 6f 70 74 73 5b 74 6f 43 61  .      opts[toCa
9db0: 6d 65 6c 28 6e 61 6d 65 29 5d 20 3d 20 74 6d 70  mel(name)] = tmp
9dc0: 6c 28 61 74 74 72 5b 6e 61 6d 65 5d 2c 20 63 74  l(attr[name], ct
9dd0: 78 29 0a 20 20 20 20 7d 29 0a 20 20 7d 0a 0a 20  x).    }).  }.. 
9de0: 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c   function normal
9df0: 69 7a 65 44 61 74 61 28 64 61 74 61 29 20 7b 0a  izeData(data) {.
9e00: 20 20 20 20 66 6f 72 20 28 76 61 72 20 6b 65 79      for (var key
9e10: 20 69 6e 20 69 74 65 6d 29 20 7b 0a 20 20 20 20   in item) {.    
9e20: 20 20 69 66 20 28 74 79 70 65 6f 66 20 73 65 6c    if (typeof sel
9e30: 66 5b 6b 65 79 5d 20 21 3d 3d 20 54 5f 55 4e 44  f[key] !== T_UND
9e40: 45 46 20 26 26 20 69 73 57 72 69 74 61 62 6c 65  EF && isWritable
9e50: 28 73 65 6c 66 2c 20 6b 65 79 29 29 0a 20 20 20  (self, key)).   
9e60: 20 20 20 20 20 73 65 6c 66 5b 6b 65 79 5d 20 3d       self[key] =
9e70: 20 64 61 74 61 5b 6b 65 79 5d 0a 20 20 20 20 7d   data[key].    }
9e80: 0a 20 20 7d 0a 0a 20 20 66 75 6e 63 74 69 6f 6e  .  }..  function
9e90: 20 69 6e 68 65 72 69 74 46 72 6f 6d 28 74 61 72   inheritFrom(tar
9ea0: 67 65 74 29 20 7b 0a 20 20 20 20 65 61 63 68 28  get) {.    each(
9eb0: 4f 62 6a 65 63 74 2e 6b 65 79 73 28 74 61 72 67  Object.keys(targ
9ec0: 65 74 29 2c 20 66 75 6e 63 74 69 6f 6e 28 6b 29  et), function(k)
9ed0: 20 7b 0a 20 20 20 20 20 20 2f 2f 20 73 6f 6d 65   {.      // some
9ee0: 20 70 72 6f 70 65 72 74 69 65 73 20 6d 75 73 74   properties must
9ef0: 20 62 65 20 61 6c 77 61 79 73 20 69 6e 20 73 79   be always in sy
9f00: 6e 63 20 77 69 74 68 20 74 68 65 20 70 61 72 65  nc with the pare
9f10: 6e 74 20 74 61 67 0a 20 20 20 20 20 20 76 61 72  nt tag.      var
9f20: 20 6d 75 73 74 53 79 6e 63 20 3d 20 21 52 45 53   mustSync = !RES
9f30: 45 52 56 45 44 5f 57 4f 52 44 53 5f 42 4c 41 43  ERVED_WORDS_BLAC
9f40: 4b 4c 49 53 54 2e 74 65 73 74 28 6b 29 20 26 26  KLIST.test(k) &&
9f50: 20 63 6f 6e 74 61 69 6e 73 28 70 72 6f 70 73 49   contains(propsI
9f60: 6e 53 79 6e 63 57 69 74 68 50 61 72 65 6e 74 2c  nSyncWithParent,
9f70: 20 6b 29 0a 0a 20 20 20 20 20 20 69 66 20 28 74   k)..      if (t
9f80: 79 70 65 6f 66 20 73 65 6c 66 5b 6b 5d 20 3d 3d  ypeof self[k] ==
9f90: 3d 20 54 5f 55 4e 44 45 46 20 7c 7c 20 6d 75 73  = T_UNDEF || mus
9fa0: 74 53 79 6e 63 29 20 7b 0a 20 20 20 20 20 20 20  tSync) {.       
9fb0: 20 2f 2f 20 74 72 61 63 6b 20 74 68 65 20 70 72   // track the pr
9fc0: 6f 70 65 72 74 79 20 74 6f 20 6b 65 65 70 20 69  operty to keep i
9fd0: 6e 20 73 79 6e 63 0a 20 20 20 20 20 20 20 20 2f  n sync.        /
9fe0: 2f 20 73 6f 20 77 65 20 63 61 6e 20 6b 65 65 70  / so we can keep
9ff0: 20 69 74 20 75 70 64 61 74 65 64 0a 20 20 20 20   it updated.    
a000: 20 20 20 20 69 66 20 28 21 6d 75 73 74 53 79 6e      if (!mustSyn
a010: 63 29 20 70 72 6f 70 73 49 6e 53 79 6e 63 57 69  c) propsInSyncWi
a020: 74 68 50 61 72 65 6e 74 2e 70 75 73 68 28 6b 29  thParent.push(k)
a030: 0a 20 20 20 20 20 20 20 20 73 65 6c 66 5b 6b 5d  .        self[k]
a040: 20 3d 20 74 61 72 67 65 74 5b 6b 5d 0a 20 20 20   = target[k].   
a050: 20 20 20 7d 0a 20 20 20 20 7d 29 0a 20 20 7d 0a     }.    }).  }.
a060: 0a 20 20 2f 2a 2a 0a 20 20 20 2a 20 55 70 64 61  .  /**.   * Upda
a070: 74 65 20 74 68 65 20 74 61 67 20 65 78 70 72 65  te the tag expre
a080: 73 73 69 6f 6e 73 20 61 6e 64 20 6f 70 74 69 6f  ssions and optio
a090: 6e 73 0a 20 20 20 2a 20 40 70 61 72 61 6d 20 20  ns.   * @param  
a0a0: 20 7b 20 2a 20 7d 20 20 64 61 74 61 20 2d 20 64   { * }  data - d
a0b0: 61 74 61 20 77 65 20 77 61 6e 74 20 74 6f 20 75  ata we want to u
a0c0: 73 65 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65  se to extend the
a0d0: 20 74 61 67 20 70 72 6f 70 65 72 74 69 65 73 0a   tag properties.
a0e0: 20 20 20 2a 20 40 70 61 72 61 6d 20 20 20 7b 20     * @param   { 
a0f0: 42 6f 6f 6c 65 61 6e 20 7d 20 69 73 49 6e 68 65  Boolean } isInhe
a100: 72 69 74 65 64 20 2d 20 69 73 20 74 68 69 73 20  rited - is this 
a110: 75 70 64 61 74 65 20 63 6f 6d 69 6e 67 20 66 72  update coming fr
a120: 6f 6d 20 61 20 70 61 72 65 6e 74 20 74 61 67 3f  om a parent tag?
a130: 0a 20 20 20 2a 20 40 72 65 74 75 72 6e 73 20 7b  .   * @returns {
a140: 20 73 65 6c 66 20 7d 0a 20 20 20 2a 2f 0a 20 20   self }.   */.  
a150: 64 65 66 69 6e 65 50 72 6f 70 65 72 74 79 28 74  defineProperty(t
a160: 68 69 73 2c 20 27 75 70 64 61 74 65 27 2c 20 66  his, 'update', f
a170: 75 6e 63 74 69 6f 6e 28 64 61 74 61 2c 20 69 73  unction(data, is
a180: 49 6e 68 65 72 69 74 65 64 29 20 7b 0a 0a 20 20  Inherited) {..  
a190: 20 20 2f 2f 20 6d 61 6b 65 20 73 75 72 65 20 74    // make sure t
a1a0: 68 65 20 64 61 74 61 20 70 61 73 73 65 64 20 77  he data passed w
a1b0: 69 6c 6c 20 6e 6f 74 20 6f 76 65 72 72 69 64 65  ill not override
a1c0: 0a 20 20 20 20 2f 2f 20 74 68 65 20 63 6f 6d 70  .    // the comp
a1d0: 6f 6e 65 6e 74 20 63 6f 72 65 20 6d 65 74 68 6f  onent core metho
a1e0: 64 73 0a 20 20 20 20 64 61 74 61 20 3d 20 63 6c  ds.    data = cl
a1f0: 65 61 6e 55 70 44 61 74 61 28 64 61 74 61 29 0a  eanUpData(data).
a200: 20 20 20 20 2f 2f 20 69 6e 68 65 72 69 74 20 70      // inherit p
a210: 72 6f 70 65 72 74 69 65 73 20 66 72 6f 6d 20 74  roperties from t
a220: 68 65 20 70 61 72 65 6e 74 20 69 6e 20 6c 6f 6f  he parent in loo
a230: 70 0a 20 20 20 20 69 66 20 28 69 73 4c 6f 6f 70  p.    if (isLoop
a240: 29 20 7b 0a 20 20 20 20 20 20 69 6e 68 65 72 69  ) {.      inheri
a250: 74 46 72 6f 6d 28 73 65 6c 66 2e 70 61 72 65 6e  tFrom(self.paren
a260: 74 29 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2f 20  t).    }.    // 
a270: 6e 6f 72 6d 61 6c 69 7a 65 20 74 68 65 20 74 61  normalize the ta
a280: 67 20 70 72 6f 70 65 72 74 69 65 73 20 69 6e 20  g properties in 
a290: 63 61 73 65 20 61 6e 20 69 74 65 6d 20 6f 62 6a  case an item obj
a2a0: 65 63 74 20 77 61 73 20 69 6e 69 74 69 61 6c 6c  ect was initiall
a2b0: 79 20 70 61 73 73 65 64 0a 20 20 20 20 69 66 20  y passed.    if 
a2c0: 28 64 61 74 61 20 26 26 20 69 73 4f 62 6a 65 63  (data && isObjec
a2d0: 74 28 69 74 65 6d 29 29 20 7b 0a 20 20 20 20 20  t(item)) {.     
a2e0: 20 6e 6f 72 6d 61 6c 69 7a 65 44 61 74 61 28 64   normalizeData(d
a2f0: 61 74 61 29 0a 20 20 20 20 20 20 69 74 65 6d 20  ata).      item 
a300: 3d 20 64 61 74 61 0a 20 20 20 20 7d 0a 20 20 20  = data.    }.   
a310: 20 65 78 74 65 6e 64 28 73 65 6c 66 2c 20 64 61   extend(self, da
a320: 74 61 29 0a 20 20 20 20 75 70 64 61 74 65 4f 70  ta).    updateOp
a330: 74 73 28 29 0a 20 20 20 20 73 65 6c 66 2e 74 72  ts().    self.tr
a340: 69 67 67 65 72 28 27 75 70 64 61 74 65 27 2c 20  igger('update', 
a350: 64 61 74 61 29 0a 20 20 20 20 75 70 64 61 74 65  data).    update
a360: 28 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 65  (expressions, se
a370: 6c 66 29 0a 0a 20 20 20 20 2f 2f 20 74 68 65 20  lf)..    // the 
a380: 75 70 64 61 74 65 64 20 65 76 65 6e 74 20 77 69  updated event wi
a390: 6c 6c 20 62 65 20 74 72 69 67 67 65 72 65 64 0a  ll be triggered.
a3a0: 20 20 20 20 2f 2f 20 6f 6e 63 65 20 74 68 65 20      // once the 
a3b0: 44 4f 4d 20 77 69 6c 6c 20 62 65 20 72 65 61 64  DOM will be read
a3c0: 79 20 61 6e 64 20 61 6c 6c 20 74 68 65 20 72 65  y and all the re
a3d0: 2d 66 6c 6f 77 73 20 61 72 65 20 63 6f 6d 70 6c  -flows are compl
a3e0: 65 74 65 64 0a 20 20 20 20 2f 2f 20 74 68 69 73  eted.    // this
a3f0: 20 69 73 20 75 73 65 66 75 6c 20 69 66 20 79 6f   is useful if yo
a400: 75 20 77 61 6e 74 20 74 6f 20 67 65 74 20 74 68  u want to get th
a410: 65 20 22 72 65 61 6c 22 20 72 6f 6f 74 20 70 72  e "real" root pr
a420: 6f 70 65 72 74 69 65 73 0a 20 20 20 20 2f 2f 20  operties.    // 
a430: 34 20 65 78 3a 20 72 6f 6f 74 2e 6f 66 66 73 65  4 ex: root.offse
a440: 74 57 69 64 74 68 20 2e 2e 2e 0a 20 20 20 20 69  tWidth ....    i
a450: 66 20 28 69 73 49 6e 68 65 72 69 74 65 64 20 26  f (isInherited &
a460: 26 20 73 65 6c 66 2e 70 61 72 65 6e 74 29 0a 20  & self.parent). 
a470: 20 20 20 20 20 2f 2f 20 63 6c 6f 73 65 73 20 23       // closes #
a480: 31 35 39 39 0a 20 20 20 20 20 20 73 65 6c 66 2e  1599.      self.
a490: 70 61 72 65 6e 74 2e 6f 6e 65 28 27 75 70 64 61  parent.one('upda
a4a0: 74 65 64 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29  ted', function()
a4b0: 20 7b 20 73 65 6c 66 2e 74 72 69 67 67 65 72 28   { self.trigger(
a4c0: 27 75 70 64 61 74 65 64 27 29 20 7d 29 0a 20 20  'updated') }).  
a4d0: 20 20 65 6c 73 65 20 72 41 46 28 66 75 6e 63 74    else rAF(funct
a4e0: 69 6f 6e 28 29 20 7b 20 73 65 6c 66 2e 74 72 69  ion() { self.tri
a4f0: 67 67 65 72 28 27 75 70 64 61 74 65 64 27 29 20  gger('updated') 
a500: 7d 29 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 74  })..    return t
a510: 68 69 73 0a 20 20 7d 29 0a 0a 20 20 64 65 66 69  his.  })..  defi
a520: 6e 65 50 72 6f 70 65 72 74 79 28 74 68 69 73 2c  neProperty(this,
a530: 20 27 6d 69 78 69 6e 27 2c 20 66 75 6e 63 74 69   'mixin', functi
a540: 6f 6e 28 29 20 7b 0a 20 20 20 20 65 61 63 68 28  on() {.    each(
a550: 61 72 67 75 6d 65 6e 74 73 2c 20 66 75 6e 63 74  arguments, funct
a560: 69 6f 6e 28 6d 69 78 29 20 7b 0a 20 20 20 20 20  ion(mix) {.     
a570: 20 76 61 72 20 69 6e 73 74 61 6e 63 65 2c 0a 20   var instance,. 
a580: 20 20 20 20 20 20 20 70 72 6f 70 73 20 3d 20 5b         props = [
a590: 5d 2c 0a 20 20 20 20 20 20 20 20 6f 62 6a 0a 0a  ],.        obj..
a5a0: 20 20 20 20 20 20 6d 69 78 20 3d 20 74 79 70 65        mix = type
a5b0: 6f 66 20 6d 69 78 20 3d 3d 3d 20 54 5f 53 54 52  of mix === T_STR
a5c0: 49 4e 47 20 3f 20 72 69 6f 74 2e 6d 69 78 69 6e  ING ? riot.mixin
a5d0: 28 6d 69 78 29 20 3a 20 6d 69 78 0a 0a 20 20 20  (mix) : mix..   
a5e0: 20 20 20 2f 2f 20 63 68 65 63 6b 20 69 66 20 74     // check if t
a5f0: 68 65 20 6d 69 78 69 6e 20 69 73 20 61 20 66 75  he mixin is a fu
a600: 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 69 66 20  nction.      if 
a610: 28 69 73 46 75 6e 63 74 69 6f 6e 28 6d 69 78 29  (isFunction(mix)
a620: 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 63  ) {.        // c
a630: 72 65 61 74 65 20 74 68 65 20 6e 65 77 20 6d 69  reate the new mi
a640: 78 69 6e 20 69 6e 73 74 61 6e 63 65 0a 20 20 20  xin instance.   
a650: 20 20 20 20 20 69 6e 73 74 61 6e 63 65 20 3d 20       instance = 
a660: 6e 65 77 20 6d 69 78 28 29 0a 20 20 20 20 20 20  new mix().      
a670: 7d 20 65 6c 73 65 20 69 6e 73 74 61 6e 63 65 20  } else instance 
a680: 3d 20 6d 69 78 0a 0a 20 20 20 20 20 20 2f 2f 20  = mix..      // 
a690: 62 75 69 6c 64 20 6d 75 6c 74 69 6c 65 76 65 6c  build multilevel
a6a0: 20 70 72 6f 74 6f 74 79 70 65 20 69 6e 68 65 72   prototype inher
a6b0: 69 74 61 6e 63 65 20 63 68 61 69 6e 20 70 72 6f  itance chain pro
a6c0: 70 65 72 74 79 20 6c 69 73 74 0a 20 20 20 20 20  perty list.     
a6d0: 20 64 6f 20 70 72 6f 70 73 20 3d 20 70 72 6f 70   do props = prop
a6e0: 73 2e 63 6f 6e 63 61 74 28 4f 62 6a 65 63 74 2e  s.concat(Object.
a6f0: 67 65 74 4f 77 6e 50 72 6f 70 65 72 74 79 4e 61  getOwnPropertyNa
a700: 6d 65 73 28 6f 62 6a 20 7c 7c 20 69 6e 73 74 61  mes(obj || insta
a710: 6e 63 65 29 29 0a 20 20 20 20 20 20 77 68 69 6c  nce)).      whil
a720: 65 20 28 6f 62 6a 20 3d 20 4f 62 6a 65 63 74 2e  e (obj = Object.
a730: 67 65 74 50 72 6f 74 6f 74 79 70 65 4f 66 28 6f  getPrototypeOf(o
a740: 62 6a 20 7c 7c 20 69 6e 73 74 61 6e 63 65 29 29  bj || instance))
a750: 0a 0a 20 20 20 20 20 20 2f 2f 20 6c 6f 6f 70 20  ..      // loop 
a760: 74 68 65 20 6b 65 79 73 20 69 6e 20 74 68 65 20  the keys in the 
a770: 66 75 6e 63 74 69 6f 6e 20 70 72 6f 74 6f 74 79  function prototy
a780: 70 65 20 6f 72 20 74 68 65 20 61 6c 6c 20 6f 62  pe or the all ob
a790: 6a 65 63 74 20 6b 65 79 73 0a 20 20 20 20 20 20  ject keys.      
a7a0: 65 61 63 68 28 70 72 6f 70 73 2c 20 66 75 6e 63  each(props, func
a7b0: 74 69 6f 6e 28 6b 65 79 29 20 7b 0a 20 20 20 20  tion(key) {.    
a7c0: 20 20 20 20 2f 2f 20 62 69 6e 64 20 6d 65 74 68      // bind meth
a7d0: 6f 64 73 20 74 6f 20 73 65 6c 66 0a 20 20 20 20  ods to self.    
a7e0: 20 20 20 20 2f 2f 20 61 6c 6c 6f 77 20 6d 69 78      // allow mix
a7f0: 69 6e 73 20 74 6f 20 6f 76 65 72 72 69 64 65 20  ins to override 
a800: 6f 74 68 65 72 20 70 72 6f 70 65 72 74 69 65 73  other properties
a810: 2f 70 61 72 65 6e 74 20 6d 69 78 69 6e 73 0a 20  /parent mixins. 
a820: 20 20 20 20 20 20 20 69 66 20 28 6b 65 79 20 21         if (key !
a830: 3d 20 27 69 6e 69 74 27 29 20 7b 0a 20 20 20 20  = 'init') {.    
a840: 20 20 20 20 20 20 2f 2f 20 63 68 65 63 6b 20 66        // check f
a850: 6f 72 20 67 65 74 74 65 72 73 2f 73 65 74 74 65  or getters/sette
a860: 72 73 0a 20 20 20 20 20 20 20 20 20 20 76 61 72  rs.          var
a870: 20 64 65 73 63 72 69 70 74 6f 72 20 3d 20 4f 62   descriptor = Ob
a880: 6a 65 63 74 2e 67 65 74 4f 77 6e 50 72 6f 70 65  ject.getOwnPrope
a890: 72 74 79 44 65 73 63 72 69 70 74 6f 72 28 69 6e  rtyDescriptor(in
a8a0: 73 74 61 6e 63 65 2c 20 6b 65 79 29 0a 20 20 20  stance, key).   
a8b0: 20 20 20 20 20 20 20 76 61 72 20 68 61 73 47 65         var hasGe
a8c0: 74 74 65 72 53 65 74 74 65 72 20 3d 20 64 65 73  tterSetter = des
a8d0: 63 72 69 70 74 6f 72 20 26 26 20 28 64 65 73 63  criptor && (desc
a8e0: 72 69 70 74 6f 72 2e 67 65 74 20 7c 7c 20 64 65  riptor.get || de
a8f0: 73 63 72 69 70 74 6f 72 2e 73 65 74 29 0a 0a 20  scriptor.set).. 
a900: 20 20 20 20 20 20 20 20 20 2f 2f 20 61 70 70 6c           // appl
a910: 79 20 6d 65 74 68 6f 64 20 6f 6e 6c 79 20 69 66  y method only if
a920: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   it does not alr
a930: 65 61 64 79 20 65 78 69 73 74 20 6f 6e 20 74 68  eady exist on th
a940: 65 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 20  e instance.     
a950: 20 20 20 20 20 69 66 20 28 21 73 65 6c 66 2e 68       if (!self.h
a960: 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28 6b 65  asOwnProperty(ke
a970: 79 29 20 26 26 20 68 61 73 47 65 74 74 65 72 53  y) && hasGetterS
a980: 65 74 74 65 72 29 20 7b 0a 20 20 20 20 20 20 20  etter) {.       
a990: 20 20 20 20 20 4f 62 6a 65 63 74 2e 64 65 66 69       Object.defi
a9a0: 6e 65 50 72 6f 70 65 72 74 79 28 73 65 6c 66 2c  neProperty(self,
a9b0: 20 6b 65 79 2c 20 64 65 73 63 72 69 70 74 6f 72   key, descriptor
a9c0: 29 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ).          } el
a9d0: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
a9e0: 20 73 65 6c 66 5b 6b 65 79 5d 20 3d 20 69 73 46   self[key] = isF
a9f0: 75 6e 63 74 69 6f 6e 28 69 6e 73 74 61 6e 63 65  unction(instance
aa00: 5b 6b 65 79 5d 29 20 3f 0a 20 20 20 20 20 20 20  [key]) ?.       
aa10: 20 20 20 20 20 20 20 69 6e 73 74 61 6e 63 65 5b         instance[
aa20: 6b 65 79 5d 2e 62 69 6e 64 28 73 65 6c 66 29 20  key].bind(self) 
aa30: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
aa40: 69 6e 73 74 61 6e 63 65 5b 6b 65 79 5d 0a 20 20  instance[key].  
aa50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
aa60: 20 20 7d 0a 20 20 20 20 20 20 7d 29 0a 0a 20 20    }.      })..  
aa70: 20 20 20 20 2f 2f 20 69 6e 69 74 20 6d 65 74 68      // init meth
aa80: 6f 64 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  od will be calle
aa90: 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  d automatically.
aaa0: 20 20 20 20 20 20 69 66 20 28 69 6e 73 74 61 6e        if (instan
aab0: 63 65 2e 69 6e 69 74 29 20 69 6e 73 74 61 6e 63  ce.init) instanc
aac0: 65 2e 69 6e 69 74 2e 62 69 6e 64 28 73 65 6c 66  e.init.bind(self
aad0: 29 28 29 0a 20 20 20 20 7d 29 0a 20 20 20 20 72  )().    }).    r
aae0: 65 74 75 72 6e 20 74 68 69 73 0a 20 20 7d 29 0a  eturn this.  }).
aaf0: 0a 20 20 64 65 66 69 6e 65 50 72 6f 70 65 72 74  .  definePropert
ab00: 79 28 74 68 69 73 2c 20 27 6d 6f 75 6e 74 27 2c  y(this, 'mount',
ab10: 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 0a 20   function() {.. 
ab20: 20 20 20 75 70 64 61 74 65 4f 70 74 73 28 29 0a     updateOpts().
ab30: 0a 20 20 20 20 2f 2f 20 61 64 64 20 67 6c 6f 62  .    // add glob
ab40: 61 6c 20 6d 69 78 69 6e 73 0a 20 20 20 20 76 61  al mixins.    va
ab50: 72 20 67 6c 6f 62 61 6c 4d 69 78 69 6e 20 3d 20  r globalMixin = 
ab60: 72 69 6f 74 2e 6d 69 78 69 6e 28 47 4c 4f 42 41  riot.mixin(GLOBA
ab70: 4c 5f 4d 49 58 49 4e 29 0a 0a 20 20 20 20 69 66  L_MIXIN)..    if
ab80: 20 28 67 6c 6f 62 61 6c 4d 69 78 69 6e 29 0a 20   (globalMixin). 
ab90: 20 20 20 20 20 66 6f 72 20 28 76 61 72 20 69 20       for (var i 
aba0: 69 6e 20 67 6c 6f 62 61 6c 4d 69 78 69 6e 29 0a  in globalMixin).
abb0: 20 20 20 20 20 20 20 20 69 66 20 28 67 6c 6f 62          if (glob
abc0: 61 6c 4d 69 78 69 6e 2e 68 61 73 4f 77 6e 50 72  alMixin.hasOwnPr
abd0: 6f 70 65 72 74 79 28 69 29 29 0a 20 20 20 20 20  operty(i)).     
abe0: 20 20 20 20 20 73 65 6c 66 2e 6d 69 78 69 6e 28       self.mixin(
abf0: 67 6c 6f 62 61 6c 4d 69 78 69 6e 5b 69 5d 29 0a  globalMixin[i]).
ac00: 0a 20 20 20 20 2f 2f 20 63 68 69 6c 64 72 65 6e  .    // children
ac10: 20 69 6e 20 6c 6f 6f 70 20 73 68 6f 75 6c 64 20   in loop should 
ac20: 69 6e 68 65 72 69 74 20 66 72 6f 6d 20 74 72 75  inherit from tru
ac30: 65 20 70 61 72 65 6e 74 0a 20 20 20 20 69 66 20  e parent.    if 
ac40: 28 73 65 6c 66 2e 5f 70 61 72 65 6e 74 29 20 7b  (self._parent) {
ac50: 0a 20 20 20 20 20 20 69 6e 68 65 72 69 74 46 72  .      inheritFr
ac60: 6f 6d 28 73 65 6c 66 2e 5f 70 61 72 65 6e 74 29  om(self._parent)
ac70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20 69  .    }..    // i
ac80: 6e 69 74 69 61 6c 69 61 74 69 6f 6e 0a 20 20 20  nitialiation.   
ac90: 20 69 66 20 28 69 6d 70 6c 2e 66 6e 29 20 69 6d   if (impl.fn) im
aca0: 70 6c 2e 66 6e 2e 63 61 6c 6c 28 73 65 6c 66 2c  pl.fn.call(self,
acb0: 20 6f 70 74 73 29 0a 0a 20 20 20 20 2f 2f 20 70   opts)..    // p
acc0: 61 72 73 65 20 6c 61 79 6f 75 74 20 61 66 74 65  arse layout afte
acd0: 72 20 69 6e 69 74 2e 20 66 6e 20 6d 61 79 20 63  r init. fn may c
ace0: 61 6c 63 75 6c 61 74 65 20 61 72 67 73 20 66 6f  alculate args fo
acf0: 72 20 6e 65 73 74 65 64 20 63 75 73 74 6f 6d 20  r nested custom 
ad00: 74 61 67 73 0a 20 20 20 20 70 61 72 73 65 45 78  tags.    parseEx
ad10: 70 72 65 73 73 69 6f 6e 73 28 64 6f 6d 2c 20 73  pressions(dom, s
ad20: 65 6c 66 2c 20 65 78 70 72 65 73 73 69 6f 6e 73  elf, expressions
ad30: 29 0a 0a 20 20 20 20 2f 2f 20 6d 6f 75 6e 74 20  )..    // mount 
ad40: 74 68 65 20 63 68 69 6c 64 20 74 61 67 73 0a 20  the child tags. 
ad50: 20 20 20 74 6f 67 67 6c 65 28 74 72 75 65 29 0a     toggle(true).
ad60: 0a 20 20 20 20 2f 2f 20 75 70 64 61 74 65 20 74  .    // update t
ad70: 68 65 20 72 6f 6f 74 20 61 64 64 69 6e 67 20 63  he root adding c
ad80: 75 73 74 6f 6d 20 61 74 74 72 69 62 75 74 65 73  ustom attributes
ad90: 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65   coming from the
ada0: 20 63 6f 6d 70 69 6c 65 72 0a 20 20 20 20 2f 2f   compiler.    //
adb0: 20 69 74 20 66 69 78 65 73 20 61 6c 73 6f 20 23   it fixes also #
adc0: 31 30 38 37 0a 20 20 20 20 69 66 20 28 69 6d 70  1087.    if (imp
add0: 6c 2e 61 74 74 72 73 29 0a 20 20 20 20 20 20 77  l.attrs).      w
ade0: 61 6c 6b 41 74 74 72 69 62 75 74 65 73 28 69 6d  alkAttributes(im
adf0: 70 6c 2e 61 74 74 72 73 2c 20 66 75 6e 63 74 69  pl.attrs, functi
ae00: 6f 6e 20 28 6b 2c 20 76 29 20 7b 20 73 65 74 41  on (k, v) { setA
ae10: 74 74 72 28 72 6f 6f 74 2c 20 6b 2c 20 76 29 20  ttr(root, k, v) 
ae20: 7d 29 0a 20 20 20 20 69 66 20 28 69 6d 70 6c 2e  }).    if (impl.
ae30: 61 74 74 72 73 20 7c 7c 20 68 61 73 49 6d 70 6c  attrs || hasImpl
ae40: 29 0a 20 20 20 20 20 20 70 61 72 73 65 45 78 70  ).      parseExp
ae50: 72 65 73 73 69 6f 6e 73 28 73 65 6c 66 2e 72 6f  ressions(self.ro
ae60: 6f 74 2c 20 73 65 6c 66 2c 20 65 78 70 72 65 73  ot, self, expres
ae70: 73 69 6f 6e 73 29 0a 0a 20 20 20 20 69 66 20 28  sions)..    if (
ae80: 21 73 65 6c 66 2e 70 61 72 65 6e 74 20 7c 7c 20  !self.parent || 
ae90: 69 73 4c 6f 6f 70 29 20 73 65 6c 66 2e 75 70 64  isLoop) self.upd
aea0: 61 74 65 28 69 74 65 6d 29 0a 0a 20 20 20 20 2f  ate(item)..    /
aeb0: 2f 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f  / internal use o
aec0: 6e 6c 79 2c 20 66 69 78 65 73 20 23 34 30 33 0a  nly, fixes #403.
aed0: 20 20 20 20 73 65 6c 66 2e 74 72 69 67 67 65 72      self.trigger
aee0: 28 27 62 65 66 6f 72 65 2d 6d 6f 75 6e 74 27 29  ('before-mount')
aef0: 0a 0a 20 20 20 20 69 66 20 28 69 73 4c 6f 6f 70  ..    if (isLoop
af00: 20 26 26 20 21 68 61 73 49 6d 70 6c 29 20 7b 0a   && !hasImpl) {.
af10: 20 20 20 20 20 20 2f 2f 20 75 70 64 61 74 65 20        // update 
af20: 74 68 65 20 72 6f 6f 74 20 61 74 74 72 69 62 75  the root attribu
af30: 74 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f 70 65  te for the loope
af40: 64 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 20  d elements.     
af50: 20 72 6f 6f 74 20 3d 20 64 6f 6d 2e 66 69 72 73   root = dom.firs
af60: 74 43 68 69 6c 64 0a 20 20 20 20 7d 20 65 6c 73  tChild.    } els
af70: 65 20 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 20  e {.      while 
af80: 28 64 6f 6d 2e 66 69 72 73 74 43 68 69 6c 64 29  (dom.firstChild)
af90: 20 72 6f 6f 74 2e 61 70 70 65 6e 64 43 68 69 6c   root.appendChil
afa0: 64 28 64 6f 6d 2e 66 69 72 73 74 43 68 69 6c 64  d(dom.firstChild
afb0: 29 0a 20 20 20 20 20 20 69 66 20 28 72 6f 6f 74  ).      if (root
afc0: 2e 73 74 75 62 29 20 72 6f 6f 74 20 3d 20 70 61  .stub) root = pa
afd0: 72 65 6e 74 2e 72 6f 6f 74 0a 20 20 20 20 7d 0a  rent.root.    }.
afe0: 0a 20 20 20 20 64 65 66 69 6e 65 50 72 6f 70 65  .    definePrope
aff0: 72 74 79 28 73 65 6c 66 2c 20 27 72 6f 6f 74 27  rty(self, 'root'
b000: 2c 20 72 6f 6f 74 29 0a 0a 20 20 20 20 2f 2f 20  , root)..    // 
b010: 70 61 72 73 65 20 74 68 65 20 6e 61 6d 65 64 20  parse the named 
b020: 64 6f 6d 20 6e 6f 64 65 73 20 69 6e 20 74 68 65  dom nodes in the
b030: 20 6c 6f 6f 70 65 64 20 63 68 69 6c 64 0a 20 20   looped child.  
b040: 20 20 2f 2f 20 61 64 64 69 6e 67 20 74 68 65 6d    // adding them
b050: 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 61   to the parent a
b060: 73 20 77 65 6c 6c 0a 20 20 20 20 69 66 20 28 69  s well.    if (i
b070: 73 4c 6f 6f 70 29 0a 20 20 20 20 20 20 70 61 72  sLoop).      par
b080: 73 65 4e 61 6d 65 64 45 6c 65 6d 65 6e 74 73 28  seNamedElements(
b090: 73 65 6c 66 2e 72 6f 6f 74 2c 20 73 65 6c 66 2e  self.root, self.
b0a0: 70 61 72 65 6e 74 2c 20 6e 75 6c 6c 2c 20 74 72  parent, null, tr
b0b0: 75 65 29 0a 0a 20 20 20 20 2f 2f 20 69 66 20 69  ue)..    // if i
b0c0: 74 27 73 20 6e 6f 74 20 61 20 63 68 69 6c 64 20  t's not a child 
b0d0: 74 61 67 20 77 65 20 63 61 6e 20 74 72 69 67 67  tag we can trigg
b0e0: 65 72 20 69 74 73 20 6d 6f 75 6e 74 20 65 76 65  er its mount eve
b0f0: 6e 74 0a 20 20 20 20 69 66 20 28 21 73 65 6c 66  nt.    if (!self
b100: 2e 70 61 72 65 6e 74 20 7c 7c 20 73 65 6c 66 2e  .parent || self.
b110: 70 61 72 65 6e 74 2e 69 73 4d 6f 75 6e 74 65 64  parent.isMounted
b120: 29 20 7b 0a 20 20 20 20 20 20 73 65 6c 66 2e 69  ) {.      self.i
b130: 73 4d 6f 75 6e 74 65 64 20 3d 20 74 72 75 65 0a  sMounted = true.
b140: 20 20 20 20 20 20 73 65 6c 66 2e 74 72 69 67 67        self.trigg
b150: 65 72 28 27 6d 6f 75 6e 74 27 29 0a 20 20 20 20  er('mount').    
b160: 7d 0a 20 20 20 20 2f 2f 20 6f 74 68 65 72 77 69  }.    // otherwi
b170: 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20 77 61  se we need to wa
b180: 69 74 20 74 68 61 74 20 74 68 65 20 70 61 72 65  it that the pare
b190: 6e 74 20 65 76 65 6e 74 20 67 65 74 73 20 74 72  nt event gets tr
b1a0: 69 67 67 65 72 65 64 0a 20 20 20 20 65 6c 73 65  iggered.    else
b1b0: 20 73 65 6c 66 2e 70 61 72 65 6e 74 2e 6f 6e 65   self.parent.one
b1c0: 28 27 6d 6f 75 6e 74 27 2c 20 66 75 6e 63 74 69  ('mount', functi
b1d0: 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20 2f 2f 20  on() {.      // 
b1e0: 61 76 6f 69 64 20 74 6f 20 74 72 69 67 67 65 72  avoid to trigger
b1f0: 20 74 68 65 20 60 6d 6f 75 6e 74 60 20 65 76 65   the `mount` eve
b200: 6e 74 20 66 6f 72 20 74 68 65 20 74 61 67 73 0a  nt for the tags.
b210: 20 20 20 20 20 20 2f 2f 20 6e 6f 74 20 76 69 73        // not vis
b220: 69 62 6c 65 20 69 6e 63 6c 75 64 65 64 20 69 6e  ible included in
b230: 20 61 6e 20 69 66 20 73 74 61 74 65 6d 65 6e 74   an if statement
b240: 0a 20 20 20 20 20 20 69 66 20 28 21 69 73 49 6e  .      if (!isIn
b250: 53 74 75 62 28 73 65 6c 66 2e 72 6f 6f 74 29 29  Stub(self.root))
b260: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e   {.        self.
b270: 70 61 72 65 6e 74 2e 69 73 4d 6f 75 6e 74 65 64  parent.isMounted
b280: 20 3d 20 73 65 6c 66 2e 69 73 4d 6f 75 6e 74 65   = self.isMounte
b290: 64 20 3d 20 74 72 75 65 0a 20 20 20 20 20 20 20  d = true.       
b2a0: 20 73 65 6c 66 2e 74 72 69 67 67 65 72 28 27 6d   self.trigger('m
b2b0: 6f 75 6e 74 27 29 0a 20 20 20 20 20 20 7d 0a 20  ount').      }. 
b2c0: 20 20 20 7d 29 0a 20 20 7d 29 0a 0a 0a 20 20 64     }).  })...  d
b2d0: 65 66 69 6e 65 50 72 6f 70 65 72 74 79 28 74 68  efineProperty(th
b2e0: 69 73 2c 20 27 75 6e 6d 6f 75 6e 74 27 2c 20 66  is, 'unmount', f
b2f0: 75 6e 63 74 69 6f 6e 28 6b 65 65 70 52 6f 6f 74  unction(keepRoot
b300: 54 61 67 29 20 7b 0a 20 20 20 20 76 61 72 20 65  Tag) {.    var e
b310: 6c 20 3d 20 72 6f 6f 74 2c 0a 20 20 20 20 20 20  l = root,.      
b320: 70 20 3d 20 65 6c 2e 70 61 72 65 6e 74 4e 6f 64  p = el.parentNod
b330: 65 2c 0a 20 20 20 20 20 20 70 74 61 67 2c 0a 20  e,.      ptag,. 
b340: 20 20 20 20 20 74 61 67 49 6e 64 65 78 20 3d 20       tagIndex = 
b350: 5f 5f 76 69 72 74 75 61 6c 44 6f 6d 2e 69 6e 64  __virtualDom.ind
b360: 65 78 4f 66 28 73 65 6c 66 29 0a 0a 20 20 20 20  exOf(self)..    
b370: 73 65 6c 66 2e 74 72 69 67 67 65 72 28 27 62 65  self.trigger('be
b380: 66 6f 72 65 2d 75 6e 6d 6f 75 6e 74 27 29 0a 0a  fore-unmount')..
b390: 20 20 20 20 2f 2f 20 72 65 6d 6f 76 65 20 74 68      // remove th
b3a0: 69 73 20 74 61 67 20 69 6e 73 74 61 6e 63 65 20  is tag instance 
b3b0: 66 72 6f 6d 20 74 68 65 20 67 6c 6f 62 61 6c 20  from the global 
b3c0: 76 69 72 74 75 61 6c 44 6f 6d 20 76 61 72 69 61  virtualDom varia
b3d0: 62 6c 65 0a 20 20 20 20 69 66 20 28 7e 74 61 67  ble.    if (~tag
b3e0: 49 6e 64 65 78 29 0a 20 20 20 20 20 20 5f 5f 76  Index).      __v
b3f0: 69 72 74 75 61 6c 44 6f 6d 2e 73 70 6c 69 63 65  irtualDom.splice
b400: 28 74 61 67 49 6e 64 65 78 2c 20 31 29 0a 0a 20  (tagIndex, 1).. 
b410: 20 20 20 69 66 20 28 70 29 20 7b 0a 0a 20 20 20     if (p) {..   
b420: 20 20 20 69 66 20 28 70 61 72 65 6e 74 29 20 7b     if (parent) {
b430: 0a 20 20 20 20 20 20 20 20 70 74 61 67 20 3d 20  .        ptag = 
b440: 67 65 74 49 6d 6d 65 64 69 61 74 65 43 75 73 74  getImmediateCust
b450: 6f 6d 50 61 72 65 6e 74 54 61 67 28 70 61 72 65  omParentTag(pare
b460: 6e 74 29 0a 20 20 20 20 20 20 20 20 2f 2f 20 72  nt).        // r
b470: 65 6d 6f 76 65 20 74 68 69 73 20 74 61 67 20 66  emove this tag f
b480: 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 74  rom the parent t
b490: 61 67 73 20 6f 62 6a 65 63 74 0a 20 20 20 20 20  ags object.     
b4a0: 20 20 20 2f 2f 20 69 66 20 74 68 65 72 65 20 61     // if there a
b4b0: 72 65 20 6d 75 6c 74 69 70 6c 65 20 6e 65 73 74  re multiple nest
b4c0: 65 64 20 74 61 67 73 20 77 69 74 68 20 73 61 6d  ed tags with sam
b4d0: 65 20 6e 61 6d 65 2e 2e 0a 20 20 20 20 20 20 20  e name...       
b4e0: 20 2f 2f 20 72 65 6d 6f 76 65 20 74 68 69 73 20   // remove this 
b4f0: 65 6c 65 6d 65 6e 74 20 66 6f 72 6d 20 74 68 65  element form the
b500: 20 61 72 72 61 79 0a 20 20 20 20 20 20 20 20 69   array.        i
b510: 66 20 28 69 73 41 72 72 61 79 28 70 74 61 67 2e  f (isArray(ptag.
b520: 74 61 67 73 5b 74 61 67 4e 61 6d 65 5d 29 29 0a  tags[tagName])).
b530: 20 20 20 20 20 20 20 20 20 20 65 61 63 68 28 70            each(p
b540: 74 61 67 2e 74 61 67 73 5b 74 61 67 4e 61 6d 65  tag.tags[tagName
b550: 5d 2c 20 66 75 6e 63 74 69 6f 6e 28 74 61 67 2c  ], function(tag,
b560: 20 69 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20   i) {.          
b570: 20 20 69 66 20 28 74 61 67 2e 5f 72 69 6f 74 5f    if (tag._riot_
b580: 69 64 20 3d 3d 20 73 65 6c 66 2e 5f 72 69 6f 74  id == self._riot
b590: 5f 69 64 29 0a 20 20 20 20 20 20 20 20 20 20 20  _id).           
b5a0: 20 20 20 70 74 61 67 2e 74 61 67 73 5b 74 61 67     ptag.tags[tag
b5b0: 4e 61 6d 65 5d 2e 73 70 6c 69 63 65 28 69 2c 20  Name].splice(i, 
b5c0: 31 29 0a 20 20 20 20 20 20 20 20 20 20 7d 29 0a  1).          }).
b5d0: 20 20 20 20 20 20 20 20 65 6c 73 65 0a 20 20 20          else.   
b5e0: 20 20 20 20 20 20 20 2f 2f 20 6f 74 68 65 72 77         // otherw
b5f0: 69 73 65 20 6a 75 73 74 20 64 65 6c 65 74 65 20  ise just delete 
b600: 74 68 65 20 74 61 67 20 69 6e 73 74 61 6e 63 65  the tag instance
b610: 0a 20 20 20 20 20 20 20 20 20 20 70 74 61 67 2e  .          ptag.
b620: 74 61 67 73 5b 74 61 67 4e 61 6d 65 5d 20 3d 20  tags[tagName] = 
b630: 75 6e 64 65 66 69 6e 65 64 0a 20 20 20 20 20 20  undefined.      
b640: 7d 0a 0a 20 20 20 20 20 20 65 6c 73 65 0a 20 20  }..      else.  
b650: 20 20 20 20 20 20 77 68 69 6c 65 20 28 65 6c 2e        while (el.
b660: 66 69 72 73 74 43 68 69 6c 64 29 20 65 6c 2e 72  firstChild) el.r
b670: 65 6d 6f 76 65 43 68 69 6c 64 28 65 6c 2e 66 69  emoveChild(el.fi
b680: 72 73 74 43 68 69 6c 64 29 0a 0a 20 20 20 20 20  rstChild)..     
b690: 20 69 66 20 28 21 6b 65 65 70 52 6f 6f 74 54 61   if (!keepRootTa
b6a0: 67 29 0a 20 20 20 20 20 20 20 20 70 2e 72 65 6d  g).        p.rem
b6b0: 6f 76 65 43 68 69 6c 64 28 65 6c 29 0a 20 20 20  oveChild(el).   
b6c0: 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20     else {.      
b6d0: 20 20 2f 2f 20 74 68 65 20 72 69 6f 74 2d 74 61    // the riot-ta
b6e0: 67 20 61 6e 64 20 74 68 65 20 64 61 74 61 2d 69  g and the data-i
b6f0: 73 20 61 74 74 72 69 62 75 74 65 73 20 61 72 65  s attributes are
b700: 6e 27 74 20 6e 65 65 64 65 64 20 61 6e 79 6d 6f  n't needed anymo
b710: 72 65 2c 20 72 65 6d 6f 76 65 20 74 68 65 6d 0a  re, remove them.
b720: 20 20 20 20 20 20 20 20 72 65 6d 41 74 74 72 28          remAttr(
b730: 70 2c 20 52 49 4f 54 5f 54 41 47 5f 49 53 29 0a  p, RIOT_TAG_IS).
b740: 20 20 20 20 20 20 20 20 72 65 6d 41 74 74 72 28          remAttr(
b750: 70 2c 20 52 49 4f 54 5f 54 41 47 29 20 2f 2f 20  p, RIOT_TAG) // 
b760: 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65 6d  this will be rem
b770: 6f 76 65 64 20 69 6e 20 72 69 6f 74 20 33 2e 30  oved in riot 3.0
b780: 2e 30 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .0.      }..    
b790: 7d 0a 0a 20 20 20 20 69 66 20 28 74 68 69 73 2e  }..    if (this.
b7a0: 5f 76 69 72 74 73 29 20 7b 0a 20 20 20 20 20 20  _virts) {.      
b7b0: 65 61 63 68 28 74 68 69 73 2e 5f 76 69 72 74 73  each(this._virts
b7c0: 2c 20 66 75 6e 63 74 69 6f 6e 28 76 29 20 7b 0a  , function(v) {.
b7d0: 20 20 20 20 20 20 20 20 69 66 20 28 76 2e 70 61          if (v.pa
b7e0: 72 65 6e 74 4e 6f 64 65 29 20 76 2e 70 61 72 65  rentNode) v.pare
b7f0: 6e 74 4e 6f 64 65 2e 72 65 6d 6f 76 65 43 68 69  ntNode.removeChi
b800: 6c 64 28 76 29 0a 20 20 20 20 20 20 7d 29 0a 20  ld(v).      }). 
b810: 20 20 20 7d 0a 0a 20 20 20 20 73 65 6c 66 2e 74     }..    self.t
b820: 72 69 67 67 65 72 28 27 75 6e 6d 6f 75 6e 74 27  rigger('unmount'
b830: 29 0a 20 20 20 20 74 6f 67 67 6c 65 28 29 0a 20  ).    toggle(). 
b840: 20 20 20 73 65 6c 66 2e 6f 66 66 28 27 2a 27 29     self.off('*')
b850: 0a 20 20 20 20 73 65 6c 66 2e 69 73 4d 6f 75 6e  .    self.isMoun
b860: 74 65 64 20 3d 20 66 61 6c 73 65 0a 20 20 20 20  ted = false.    
b870: 64 65 6c 65 74 65 20 72 6f 6f 74 2e 5f 74 61 67  delete root._tag
b880: 0a 0a 20 20 7d 29 0a 0a 20 20 2f 2f 20 70 72 6f  ..  })..  // pro
b890: 78 79 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62  xy function to b
b8a0: 69 6e 64 20 75 70 64 61 74 65 73 0a 20 20 2f 2f  ind updates.  //
b8b0: 20 64 69 73 70 61 74 63 68 65 64 20 66 72 6f 6d   dispatched from
b8c0: 20 61 20 70 61 72 65 6e 74 20 74 61 67 0a 20 20   a parent tag.  
b8d0: 66 75 6e 63 74 69 6f 6e 20 6f 6e 43 68 69 6c 64  function onChild
b8e0: 55 70 64 61 74 65 28 64 61 74 61 29 20 7b 20 73  Update(data) { s
b8f0: 65 6c 66 2e 75 70 64 61 74 65 28 64 61 74 61 2c  elf.update(data,
b900: 20 74 72 75 65 29 20 7d 0a 0a 20 20 66 75 6e 63   true) }..  func
b910: 74 69 6f 6e 20 74 6f 67 67 6c 65 28 69 73 4d 6f  tion toggle(isMo
b920: 75 6e 74 29 20 7b 0a 0a 20 20 20 20 2f 2f 20 6d  unt) {..    // m
b930: 6f 75 6e 74 2f 75 6e 6d 6f 75 6e 74 20 63 68 69  ount/unmount chi
b940: 6c 64 72 65 6e 0a 20 20 20 20 65 61 63 68 28 63  ldren.    each(c
b950: 68 69 6c 64 54 61 67 73 2c 20 66 75 6e 63 74 69  hildTags, functi
b960: 6f 6e 28 63 68 69 6c 64 29 20 7b 20 63 68 69 6c  on(child) { chil
b970: 64 5b 69 73 4d 6f 75 6e 74 20 3f 20 27 6d 6f 75  d[isMount ? 'mou
b980: 6e 74 27 20 3a 20 27 75 6e 6d 6f 75 6e 74 27 5d  nt' : 'unmount']
b990: 28 29 20 7d 29 0a 0a 20 20 20 20 2f 2f 20 6c 69  () })..    // li
b9a0: 73 74 65 6e 2f 75 6e 6c 69 73 74 65 6e 20 70 61  sten/unlisten pa
b9b0: 72 65 6e 74 20 28 65 76 65 6e 74 73 20 66 6c 6f  rent (events flo
b9c0: 77 20 6f 6e 65 20 77 61 79 20 66 72 6f 6d 20 70  w one way from p
b9d0: 61 72 65 6e 74 20 74 6f 20 63 68 69 6c 64 72 65  arent to childre
b9e0: 6e 29 0a 20 20 20 20 69 66 20 28 21 70 61 72 65  n).    if (!pare
b9f0: 6e 74 29 20 72 65 74 75 72 6e 0a 20 20 20 20 76  nt) return.    v
ba00: 61 72 20 65 76 74 20 3d 20 69 73 4d 6f 75 6e 74  ar evt = isMount
ba10: 20 3f 20 27 6f 6e 27 20 3a 20 27 6f 66 66 27 0a   ? 'on' : 'off'.
ba20: 0a 20 20 20 20 2f 2f 20 74 68 65 20 6c 6f 6f 70  .    // the loop
ba30: 20 74 61 67 73 20 77 69 6c 6c 20 62 65 20 61 6c   tags will be al
ba40: 77 61 79 73 20 69 6e 20 73 79 6e 63 20 77 69 74  ways in sync wit
ba50: 68 20 74 68 65 20 70 61 72 65 6e 74 20 61 75 74  h the parent aut
ba60: 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 20 20 69  omatically.    i
ba70: 66 20 28 69 73 4c 6f 6f 70 29 0a 20 20 20 20 20  f (isLoop).     
ba80: 20 70 61 72 65 6e 74 5b 65 76 74 5d 28 27 75 6e   parent[evt]('un
ba90: 6d 6f 75 6e 74 27 2c 20 73 65 6c 66 2e 75 6e 6d  mount', self.unm
baa0: 6f 75 6e 74 29 0a 20 20 20 20 65 6c 73 65 20 7b  ount).    else {
bab0: 0a 20 20 20 20 20 20 70 61 72 65 6e 74 5b 65 76  .      parent[ev
bac0: 74 5d 28 27 75 70 64 61 74 65 27 2c 20 6f 6e 43  t]('update', onC
bad0: 68 69 6c 64 55 70 64 61 74 65 29 5b 65 76 74 5d  hildUpdate)[evt]
bae0: 28 27 75 6e 6d 6f 75 6e 74 27 2c 20 73 65 6c 66  ('unmount', self
baf0: 2e 75 6e 6d 6f 75 6e 74 29 0a 20 20 20 20 7d 0a  .unmount).    }.
bb00: 20 20 7d 0a 0a 0a 20 20 2f 2f 20 6e 61 6d 65 64    }...  // named
bb10: 20 65 6c 65 6d 65 6e 74 73 20 61 76 61 69 6c 61   elements availa
bb20: 62 6c 65 20 66 6f 72 20 66 6e 0a 20 20 70 61 72  ble for fn.  par
bb30: 73 65 4e 61 6d 65 64 45 6c 65 6d 65 6e 74 73 28  seNamedElements(
bb40: 64 6f 6d 2c 20 74 68 69 73 2c 20 63 68 69 6c 64  dom, this, child
bb50: 54 61 67 73 29 0a 0a 7d 0a 2f 2a 2a 0a 20 2a 20  Tags)..}./**. * 
bb60: 41 74 74 61 63 68 20 61 6e 20 65 76 65 6e 74 20  Attach an event 
bb70: 74 6f 20 61 20 44 4f 4d 20 6e 6f 64 65 0a 20 2a  to a DOM node. *
bb80: 20 40 70 61 72 61 6d 20 7b 20 53 74 72 69 6e 67   @param { String
bb90: 20 7d 20 6e 61 6d 65 20 2d 20 65 76 65 6e 74 20   } name - event 
bba0: 6e 61 6d 65 0a 20 2a 20 40 70 61 72 61 6d 20 7b  name. * @param {
bbb0: 20 46 75 6e 63 74 69 6f 6e 20 7d 20 68 61 6e 64   Function } hand
bbc0: 6c 65 72 20 2d 20 65 76 65 6e 74 20 63 61 6c 6c  ler - event call
bbd0: 62 61 63 6b 0a 20 2a 20 40 70 61 72 61 6d 20 7b  back. * @param {
bbe0: 20 4f 62 6a 65 63 74 20 7d 20 64 6f 6d 20 2d 20   Object } dom - 
bbf0: 64 6f 6d 20 6e 6f 64 65 0a 20 2a 20 40 70 61 72  dom node. * @par
bc00: 61 6d 20 7b 20 54 61 67 20 7d 20 74 61 67 20 2d  am { Tag } tag -
bc10: 20 74 61 67 20 69 6e 73 74 61 6e 63 65 0a 20 2a   tag instance. *
bc20: 2f 0a 66 75 6e 63 74 69 6f 6e 20 73 65 74 45 76  /.function setEv
bc30: 65 6e 74 48 61 6e 64 6c 65 72 28 6e 61 6d 65 2c  entHandler(name,
bc40: 20 68 61 6e 64 6c 65 72 2c 20 64 6f 6d 2c 20 74   handler, dom, t
bc50: 61 67 29 20 7b 0a 0a 20 20 64 6f 6d 5b 6e 61 6d  ag) {..  dom[nam
bc60: 65 5d 20 3d 20 66 75 6e 63 74 69 6f 6e 28 65 29  e] = function(e)
bc70: 20 7b 0a 0a 20 20 20 20 76 61 72 20 70 74 61 67   {..    var ptag
bc80: 20 3d 20 74 61 67 2e 5f 70 61 72 65 6e 74 2c 0a   = tag._parent,.
bc90: 20 20 20 20 20 20 69 74 65 6d 20 3d 20 74 61 67        item = tag
bca0: 2e 5f 69 74 65 6d 2c 0a 20 20 20 20 20 20 65 6c  ._item,.      el
bcb0: 0a 0a 20 20 20 20 69 66 20 28 21 69 74 65 6d 29  ..    if (!item)
bcc0: 0a 20 20 20 20 20 20 77 68 69 6c 65 20 28 70 74  .      while (pt
bcd0: 61 67 20 26 26 20 21 69 74 65 6d 29 20 7b 0a 20  ag && !item) {. 
bce0: 20 20 20 20 20 20 20 69 74 65 6d 20 3d 20 70 74         item = pt
bcf0: 61 67 2e 5f 69 74 65 6d 0a 20 20 20 20 20 20 20  ag._item.       
bd00: 20 70 74 61 67 20 3d 20 70 74 61 67 2e 5f 70 61   ptag = ptag._pa
bd10: 72 65 6e 74 0a 20 20 20 20 20 20 7d 0a 0a 20 20  rent.      }..  
bd20: 20 20 2f 2f 20 63 72 6f 73 73 20 62 72 6f 77 73    // cross brows
bd30: 65 72 20 65 76 65 6e 74 20 66 69 78 0a 20 20 20  er event fix.   
bd40: 20 65 20 3d 20 65 20 7c 7c 20 77 69 6e 64 6f 77   e = e || window
bd50: 2e 65 76 65 6e 74 0a 0a 20 20 20 20 2f 2f 20 6f  .event..    // o
bd60: 76 65 72 72 69 64 65 20 74 68 65 20 65 76 65 6e  verride the even
bd70: 74 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20  t properties.   
bd80: 20 69 66 20 28 69 73 57 72 69 74 61 62 6c 65 28   if (isWritable(
bd90: 65 2c 20 27 63 75 72 72 65 6e 74 54 61 72 67 65  e, 'currentTarge
bda0: 74 27 29 29 20 65 2e 63 75 72 72 65 6e 74 54 61  t')) e.currentTa
bdb0: 72 67 65 74 20 3d 20 64 6f 6d 0a 20 20 20 20 69  rget = dom.    i
bdc0: 66 20 28 69 73 57 72 69 74 61 62 6c 65 28 65 2c  f (isWritable(e,
bdd0: 20 27 74 61 72 67 65 74 27 29 29 20 65 2e 74 61   'target')) e.ta
bde0: 72 67 65 74 20 3d 20 65 2e 73 72 63 45 6c 65 6d  rget = e.srcElem
bdf0: 65 6e 74 0a 20 20 20 20 69 66 20 28 69 73 57 72  ent.    if (isWr
be00: 69 74 61 62 6c 65 28 65 2c 20 27 77 68 69 63 68  itable(e, 'which
be10: 27 29 29 20 65 2e 77 68 69 63 68 20 3d 20 65 2e  ')) e.which = e.
be20: 63 68 61 72 43 6f 64 65 20 7c 7c 20 65 2e 6b 65  charCode || e.ke
be30: 79 43 6f 64 65 0a 0a 20 20 20 20 65 2e 69 74 65  yCode..    e.ite
be40: 6d 20 3d 20 69 74 65 6d 0a 0a 20 20 20 20 2f 2f  m = item..    //
be50: 20 70 72 65 76 65 6e 74 20 64 65 66 61 75 6c 74   prevent default
be60: 20 62 65 68 61 76 69 6f 75 72 20 28 62 79 20 64   behaviour (by d
be70: 65 66 61 75 6c 74 29 0a 20 20 20 20 69 66 20 28  efault).    if (
be80: 68 61 6e 64 6c 65 72 2e 63 61 6c 6c 28 74 61 67  handler.call(tag
be90: 2c 20 65 29 20 21 3d 3d 20 74 72 75 65 20 26 26  , e) !== true &&
bea0: 20 21 2f 72 61 64 69 6f 7c 63 68 65 63 6b 2f 2e   !/radio|check/.
beb0: 74 65 73 74 28 64 6f 6d 2e 74 79 70 65 29 29 20  test(dom.type)) 
bec0: 7b 0a 20 20 20 20 20 20 69 66 20 28 65 2e 70 72  {.      if (e.pr
bed0: 65 76 65 6e 74 44 65 66 61 75 6c 74 29 20 65 2e  eventDefault) e.
bee0: 70 72 65 76 65 6e 74 44 65 66 61 75 6c 74 28 29  preventDefault()
bef0: 0a 20 20 20 20 20 20 65 2e 72 65 74 75 72 6e 56  .      e.returnV
bf00: 61 6c 75 65 20 3d 20 66 61 6c 73 65 0a 20 20 20  alue = false.   
bf10: 20 7d 0a 0a 20 20 20 20 69 66 20 28 21 65 2e 70   }..    if (!e.p
bf20: 72 65 76 65 6e 74 55 70 64 61 74 65 29 20 7b 0a  reventUpdate) {.
bf30: 20 20 20 20 20 20 65 6c 20 3d 20 69 74 65 6d 20        el = item 
bf40: 3f 20 67 65 74 49 6d 6d 65 64 69 61 74 65 43 75  ? getImmediateCu
bf50: 73 74 6f 6d 50 61 72 65 6e 74 54 61 67 28 70 74  stomParentTag(pt
bf60: 61 67 29 20 3a 20 74 61 67 0a 20 20 20 20 20 20  ag) : tag.      
bf70: 65 6c 2e 75 70 64 61 74 65 28 29 0a 20 20 20 20  el.update().    
bf80: 7d 0a 0a 20 20 7d 0a 0a 7d 0a 0a 0a 2f 2a 2a 0a  }..  }..}.../**.
bf90: 20 2a 20 49 6e 73 65 72 74 20 61 20 44 4f 4d 20   * Insert a DOM 
bfa0: 6e 6f 64 65 20 72 65 70 6c 61 63 69 6e 67 20 61  node replacing a
bfb0: 6e 6f 74 68 65 72 20 6f 6e 65 20 28 75 73 65 64  nother one (used
bfc0: 20 62 79 20 69 66 2d 20 61 74 74 72 69 62 75 74   by if- attribut
bfd0: 65 29 0a 20 2a 20 40 70 61 72 61 6d 20 20 20 7b  e). * @param   {
bfe0: 20 4f 62 6a 65 63 74 20 7d 20 72 6f 6f 74 20 2d   Object } root -
bff0: 20 70 61 72 65 6e 74 20 6e 6f 64 65 0a 20 2a 20   parent node. * 
c000: 40 70 61 72 61 6d 20 20 20 7b 20 4f 62 6a 65 63  @param   { Objec
c010: 74 20 7d 20 6e 6f 64 65 20 2d 20 6e 6f 64 65 20  t } node - node 
c020: 72 65 70 6c 61 63 65 64 0a 20 2a 20 40 70 61 72  replaced. * @par
c030: 61 6d 20 20 20 7b 20 4f 62 6a 65 63 74 20 7d 20  am   { Object } 
c040: 62 65 66 6f 72 65 20 2d 20 6e 6f 64 65 20 61 64  before - node ad
c050: 64 65 64 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e  ded. */.function
c060: 20 69 6e 73 65 72 74 54 6f 28 72 6f 6f 74 2c 20   insertTo(root, 
c070: 6e 6f 64 65 2c 20 62 65 66 6f 72 65 29 20 7b 0a  node, before) {.
c080: 20 20 69 66 20 28 21 72 6f 6f 74 29 20 72 65 74    if (!root) ret
c090: 75 72 6e 0a 20 20 72 6f 6f 74 2e 69 6e 73 65 72  urn.  root.inser
c0a0: 74 42 65 66 6f 72 65 28 62 65 66 6f 72 65 2c 20  tBefore(before, 
c0b0: 6e 6f 64 65 29 0a 20 20 72 6f 6f 74 2e 72 65 6d  node).  root.rem
c0c0: 6f 76 65 43 68 69 6c 64 28 6e 6f 64 65 29 0a 7d  oveChild(node).}
c0d0: 0a 0a 2f 2a 2a 0a 20 2a 20 55 70 64 61 74 65 20  ../**. * Update 
c0e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
c0f0: 69 6e 20 61 20 54 61 67 20 69 6e 73 74 61 6e 63  in a Tag instanc
c100: 65 0a 20 2a 20 40 70 61 72 61 6d 20 20 20 7b 20  e. * @param   { 
c110: 41 72 72 61 79 20 7d 20 65 78 70 72 65 73 73 69  Array } expressi
c120: 6f 6e 73 20 2d 20 65 78 70 72 65 73 73 69 6f 6e  ons - expression
c130: 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 72 65   that must be re
c140: 20 65 76 61 6c 75 61 74 65 64 0a 20 2a 20 40 70   evaluated. * @p
c150: 61 72 61 6d 20 20 20 7b 20 54 61 67 20 7d 20 74  aram   { Tag } t
c160: 61 67 20 2d 20 74 61 67 20 69 6e 73 74 61 6e 63  ag - tag instanc
c170: 65 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 75  e. */.function u
c180: 70 64 61 74 65 28 65 78 70 72 65 73 73 69 6f 6e  pdate(expression
c190: 73 2c 20 74 61 67 29 20 7b 0a 0a 20 20 65 61 63  s, tag) {..  eac
c1a0: 68 28 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 66  h(expressions, f
c1b0: 75 6e 63 74 69 6f 6e 28 65 78 70 72 2c 20 69 29  unction(expr, i)
c1c0: 20 7b 0a 0a 20 20 20 20 76 61 72 20 64 6f 6d 20   {..    var dom 
c1d0: 3d 20 65 78 70 72 2e 64 6f 6d 2c 0a 20 20 20 20  = expr.dom,.    
c1e0: 20 20 61 74 74 72 4e 61 6d 65 20 3d 20 65 78 70    attrName = exp
c1f0: 72 2e 61 74 74 72 2c 0a 20 20 20 20 20 20 76 61  r.attr,.      va
c200: 6c 75 65 20 3d 20 74 6d 70 6c 28 65 78 70 72 2e  lue = tmpl(expr.
c210: 65 78 70 72 2c 20 74 61 67 29 2c 0a 20 20 20 20  expr, tag),.    
c220: 20 20 70 61 72 65 6e 74 20 3d 20 65 78 70 72 2e    parent = expr.
c230: 70 61 72 65 6e 74 20 7c 7c 20 65 78 70 72 2e 64  parent || expr.d
c240: 6f 6d 2e 70 61 72 65 6e 74 4e 6f 64 65 0a 0a 20  om.parentNode.. 
c250: 20 20 20 69 66 20 28 65 78 70 72 2e 62 6f 6f 6c     if (expr.bool
c260: 29 20 7b 0a 20 20 20 20 20 20 76 61 6c 75 65 20  ) {.      value 
c270: 3d 20 21 21 76 61 6c 75 65 0a 20 20 20 20 7d 20  = !!value.    } 
c280: 65 6c 73 65 20 69 66 20 28 76 61 6c 75 65 20 3d  else if (value =
c290: 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20  = null) {.      
c2a0: 76 61 6c 75 65 20 3d 20 27 27 0a 20 20 20 20 7d  value = ''.    }
c2b0: 0a 0a 20 20 20 20 2f 2f 20 23 31 36 33 38 3a 20  ..    // #1638: 
c2c0: 72 65 67 72 65 73 73 69 6f 6e 20 6f 66 20 23 31  regression of #1
c2d0: 36 31 32 2c 20 75 70 64 61 74 65 20 74 68 65 20  612, update the 
c2e0: 64 6f 6d 20 6f 6e 6c 79 20 69 66 20 74 68 65 20  dom only if the 
c2f0: 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 20 20 20  value of the.   
c300: 20 2f 2f 20 65 78 70 72 65 73 73 69 6f 6e 20 77   // expression w
c310: 61 73 20 63 68 61 6e 67 65 64 0a 20 20 20 20 69  as changed.    i
c320: 66 20 28 65 78 70 72 2e 76 61 6c 75 65 20 3d 3d  f (expr.value ==
c330: 3d 20 76 61 6c 75 65 29 20 7b 0a 20 20 20 20 20  = value) {.     
c340: 20 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 20 20   return.    }.  
c350: 20 20 65 78 70 72 2e 76 61 6c 75 65 20 3d 20 76    expr.value = v
c360: 61 6c 75 65 0a 0a 20 20 20 20 2f 2f 20 74 65 78  alue..    // tex
c370: 74 61 72 65 61 20 61 6e 64 20 74 65 78 74 20 6e  tarea and text n
c380: 6f 64 65 73 20 68 61 73 20 6e 6f 20 61 74 74 72  odes has no attr
c390: 69 62 75 74 65 20 6e 61 6d 65 0a 20 20 20 20 69  ibute name.    i
c3a0: 66 20 28 21 61 74 74 72 4e 61 6d 65 29 20 7b 0a  f (!attrName) {.
c3b0: 20 20 20 20 20 20 2f 2f 20 61 62 6f 75 74 20 23        // about #
c3c0: 38 31 35 20 77 2f 6f 20 72 65 70 6c 61 63 65 3a  815 w/o replace:
c3d0: 20 74 68 65 20 62 72 6f 77 73 65 72 20 63 6f 6e   the browser con
c3e0: 76 65 72 74 73 20 74 68 65 20 76 61 6c 75 65 20  verts the value 
c3f0: 74 6f 20 61 20 73 74 72 69 6e 67 2c 0a 20 20 20  to a string,.   
c400: 20 20 20 2f 2f 20 74 68 65 20 63 6f 6d 70 61 72     // the compar
c410: 69 73 6f 6e 20 62 79 20 22 3d 3d 22 20 64 6f 65  ison by "==" doe
c420: 73 20 74 6f 6f 2c 20 62 75 74 20 6e 6f 74 20 69  s too, but not i
c430: 6e 20 74 68 65 20 73 65 72 76 65 72 0a 20 20 20  n the server.   
c440: 20 20 20 76 61 6c 75 65 20 2b 3d 20 27 27 0a 20     value += ''. 
c450: 20 20 20 20 20 2f 2f 20 74 65 73 74 20 66 6f 72       // test for
c460: 20 70 61 72 65 6e 74 20 61 76 6f 69 64 73 20 65   parent avoids e
c470: 72 72 6f 72 20 77 69 74 68 20 69 6e 76 61 6c 69  rror with invali
c480: 64 20 61 73 73 69 67 6e 6d 65 6e 74 20 74 6f 20  d assignment to 
c490: 6e 6f 64 65 56 61 6c 75 65 0a 20 20 20 20 20 20  nodeValue.      
c4a0: 69 66 20 28 70 61 72 65 6e 74 29 20 7b 0a 20 20  if (parent) {.  
c4b0: 20 20 20 20 20 20 2f 2f 20 63 61 63 68 65 20 74        // cache t
c4c0: 68 65 20 70 61 72 65 6e 74 20 6e 6f 64 65 20 62  he parent node b
c4d0: 65 63 61 75 73 65 20 73 6f 6d 65 68 6f 77 20 69  ecause somehow i
c4e0: 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 6e 75  t will become nu
c4f0: 6c 6c 20 6f 6e 20 49 45 0a 20 20 20 20 20 20 20  ll on IE.       
c500: 20 2f 2f 20 6f 6e 20 74 68 65 20 6e 65 78 74 20   // on the next 
c510: 69 74 65 72 61 74 69 6f 6e 0a 20 20 20 20 20 20  iteration.      
c520: 20 20 65 78 70 72 2e 70 61 72 65 6e 74 20 3d 20    expr.parent = 
c530: 70 61 72 65 6e 74 0a 20 20 20 20 20 20 20 20 69  parent.        i
c540: 66 20 28 70 61 72 65 6e 74 2e 74 61 67 4e 61 6d  f (parent.tagNam
c550: 65 20 3d 3d 3d 20 27 54 45 58 54 41 52 45 41 27  e === 'TEXTAREA'
c560: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61  ) {.          pa
c570: 72 65 6e 74 2e 76 61 6c 75 65 20 3d 20 76 61 6c  rent.value = val
c580: 75 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ue              
c590: 20 20 20 20 20 20 2f 2f 20 23 31 31 31 33 0a 20        // #1113. 
c5a0: 20 20 20 20 20 20 20 20 20 69 66 20 28 21 49 45           if (!IE
c5b0: 5f 56 45 52 53 49 4f 4e 29 20 64 6f 6d 2e 6e 6f  _VERSION) dom.no
c5c0: 64 65 56 61 6c 75 65 20 3d 20 76 61 6c 75 65 20  deValue = value 
c5d0: 20 2f 2f 20 23 31 36 32 35 20 49 45 20 74 68 72   // #1625 IE thr
c5e0: 6f 77 73 20 68 65 72 65 2c 20 6e 6f 64 65 56 61  ows here, nodeVa
c5f0: 6c 75 65 0a 20 20 20 20 20 20 20 20 7d 20 20 20  lue.        }   
c600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c620: 20 20 20 20 20 20 2f 2f 20 77 69 6c 6c 20 62 65        // will be
c630: 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 27 75   available on 'u
c640: 70 64 61 74 65 64 27 0a 20 20 20 20 20 20 20 20  pdated'.        
c650: 65 6c 73 65 20 64 6f 6d 2e 6e 6f 64 65 56 61 6c  else dom.nodeVal
c660: 75 65 20 3d 20 76 61 6c 75 65 0a 20 20 20 20 20  ue = value.     
c670: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 0a   }.      return.
c680: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20 7e 7e      }..    // ~~
c690: 23 31 36 31 32 3a 20 6c 6f 6f 6b 20 66 6f 72 20  #1612: look for 
c6a0: 63 68 61 6e 67 65 73 20 69 6e 20 64 6f 6d 2e 76  changes in dom.v
c6b0: 61 6c 75 65 20 77 68 65 6e 20 75 70 64 61 74 69  alue when updati
c6c0: 6e 67 20 74 68 65 20 76 61 6c 75 65 7e 7e 0a 20  ng the value~~. 
c6d0: 20 20 20 69 66 20 28 61 74 74 72 4e 61 6d 65 20     if (attrName 
c6e0: 3d 3d 3d 20 27 76 61 6c 75 65 27 29 20 7b 0a 20  === 'value') {. 
c6f0: 20 20 20 20 20 69 66 20 28 64 6f 6d 2e 76 61 6c       if (dom.val
c700: 75 65 20 21 3d 3d 20 76 61 6c 75 65 29 20 7b 0a  ue !== value) {.
c710: 20 20 20 20 20 20 20 20 64 6f 6d 2e 76 61 6c 75          dom.valu
c720: 65 20 3d 20 76 61 6c 75 65 0a 20 20 20 20 20 20  e = value.      
c730: 20 20 73 65 74 41 74 74 72 28 64 6f 6d 2c 20 61    setAttr(dom, a
c740: 74 74 72 4e 61 6d 65 2c 20 76 61 6c 75 65 29 0a  ttrName, value).
c750: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
c760: 74 75 72 6e 0a 20 20 20 20 7d 20 65 6c 73 65 20  turn.    } else 
c770: 7b 0a 20 20 20 20 20 20 2f 2f 20 72 65 6d 6f 76  {.      // remov
c780: 65 20 6f 72 69 67 69 6e 61 6c 20 61 74 74 72 69  e original attri
c790: 62 75 74 65 0a 20 20 20 20 20 20 72 65 6d 41 74  bute.      remAt
c7a0: 74 72 28 64 6f 6d 2c 20 61 74 74 72 4e 61 6d 65  tr(dom, attrName
c7b0: 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20  ).    }..    // 
c7c0: 65 76 65 6e 74 20 68 61 6e 64 6c 65 72 0a 20 20  event handler.  
c7d0: 20 20 69 66 20 28 69 73 46 75 6e 63 74 69 6f 6e    if (isFunction
c7e0: 28 76 61 6c 75 65 29 29 20 7b 0a 20 20 20 20 20  (value)) {.     
c7f0: 20 73 65 74 45 76 65 6e 74 48 61 6e 64 6c 65 72   setEventHandler
c800: 28 61 74 74 72 4e 61 6d 65 2c 20 76 61 6c 75 65  (attrName, value
c810: 2c 20 64 6f 6d 2c 20 74 61 67 29 0a 0a 20 20 20  , dom, tag)..   
c820: 20 2f 2f 20 69 66 2d 20 63 6f 6e 64 69 74 69 6f   // if- conditio
c830: 6e 61 6c 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  nal.    } else i
c840: 66 20 28 61 74 74 72 4e 61 6d 65 20 3d 3d 20 27  f (attrName == '
c850: 69 66 27 29 20 7b 0a 20 20 20 20 20 20 76 61 72  if') {.      var
c860: 20 73 74 75 62 20 3d 20 65 78 70 72 2e 73 74 75   stub = expr.stu
c870: 62 2c 0a 20 20 20 20 20 20 20 20 61 64 64 20 3d  b,.        add =
c880: 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 20 69 6e   function() { in
c890: 73 65 72 74 54 6f 28 73 74 75 62 2e 70 61 72 65  sertTo(stub.pare
c8a0: 6e 74 4e 6f 64 65 2c 20 73 74 75 62 2c 20 64 6f  ntNode, stub, do
c8b0: 6d 29 20 7d 2c 0a 20 20 20 20 20 20 20 20 72 65  m) },.        re
c8c0: 6d 6f 76 65 20 3d 20 66 75 6e 63 74 69 6f 6e 28  move = function(
c8d0: 29 20 7b 20 69 6e 73 65 72 74 54 6f 28 64 6f 6d  ) { insertTo(dom
c8e0: 2e 70 61 72 65 6e 74 4e 6f 64 65 2c 20 64 6f 6d  .parentNode, dom
c8f0: 2c 20 73 74 75 62 29 20 7d 0a 0a 20 20 20 20 20  , stub) }..     
c900: 20 2f 2f 20 61 64 64 20 74 6f 20 44 4f 4d 0a 20   // add to DOM. 
c910: 20 20 20 20 20 69 66 20 28 76 61 6c 75 65 29 20       if (value) 
c920: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 73 74  {.        if (st
c930: 75 62 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ub) {.          
c940: 61 64 64 28 29 0a 20 20 20 20 20 20 20 20 20 20  add().          
c950: 64 6f 6d 2e 69 6e 53 74 75 62 20 3d 20 66 61 6c  dom.inStub = fal
c960: 73 65 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20  se.          // 
c970: 61 76 6f 69 64 20 74 6f 20 74 72 69 67 67 65 72  avoid to trigger
c980: 20 74 68 65 20 6d 6f 75 6e 74 20 65 76 65 6e 74   the mount event
c990: 20 69 66 20 74 68 65 20 74 61 67 73 20 69 73 20   if the tags is 
c9a0: 6e 6f 74 20 76 69 73 69 62 6c 65 20 79 65 74 0a  not visible yet.
c9b0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 6d 61 79            // may
c9c0: 62 65 20 77 65 20 63 61 6e 20 6f 70 74 69 6d 69  be we can optimi
c9d0: 7a 65 20 74 68 69 73 20 61 76 6f 69 64 69 6e 67  ze this avoiding
c9e0: 20 74 6f 20 6d 6f 75 6e 74 20 74 68 65 20 74 61   to mount the ta
c9f0: 67 20 61 74 20 61 6c 6c 0a 20 20 20 20 20 20 20  g at all.       
ca00: 20 20 20 69 66 20 28 21 69 73 49 6e 53 74 75 62     if (!isInStub
ca10: 28 64 6f 6d 29 29 20 7b 0a 20 20 20 20 20 20 20  (dom)) {.       
ca20: 20 20 20 20 20 77 61 6c 6b 28 64 6f 6d 2c 20 66       walk(dom, f
ca30: 75 6e 63 74 69 6f 6e 28 65 6c 29 20 7b 0a 20 20  unction(el) {.  
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
ca50: 65 6c 2e 5f 74 61 67 20 26 26 20 21 65 6c 2e 5f  el._tag && !el._
ca60: 74 61 67 2e 69 73 4d 6f 75 6e 74 65 64 29 0a 20  tag.isMounted). 
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
ca80: 6c 2e 5f 74 61 67 2e 69 73 4d 6f 75 6e 74 65 64  l._tag.isMounted
ca90: 20 3d 20 21 21 65 6c 2e 5f 74 61 67 2e 74 72 69   = !!el._tag.tri
caa0: 67 67 65 72 28 27 6d 6f 75 6e 74 27 29 0a 20 20  gger('mount').  
cab0: 20 20 20 20 20 20 20 20 20 20 7d 29 0a 20 20 20            }).   
cac0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cad0: 20 7d 0a 20 20 20 20 20 20 2f 2f 20 72 65 6d 6f   }.      // remo
cae0: 76 65 20 66 72 6f 6d 20 44 4f 4d 0a 20 20 20 20  ve from DOM.    
caf0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
cb00: 20 20 20 73 74 75 62 20 3d 20 65 78 70 72 2e 73     stub = expr.s
cb10: 74 75 62 20 3d 20 73 74 75 62 20 7c 7c 20 64 6f  tub = stub || do
cb20: 63 75 6d 65 6e 74 2e 63 72 65 61 74 65 54 65 78  cument.createTex
cb30: 74 4e 6f 64 65 28 27 27 29 0a 20 20 20 20 20 20  tNode('').      
cb40: 20 20 2f 2f 20 69 66 20 74 68 65 20 70 61 72 65    // if the pare
cb50: 6e 74 4e 6f 64 65 20 69 73 20 64 65 66 69 6e 65  ntNode is define
cb60: 64 20 77 65 20 63 61 6e 20 65 61 73 69 6c 79 20  d we can easily 
cb70: 72 65 70 6c 61 63 65 20 74 68 65 20 74 61 67 0a  replace the tag.
cb80: 20 20 20 20 20 20 20 20 69 66 20 28 64 6f 6d 2e          if (dom.
cb90: 70 61 72 65 6e 74 4e 6f 64 65 29 0a 20 20 20 20  parentNode).    
cba0: 20 20 20 20 20 20 72 65 6d 6f 76 65 28 29 0a 20        remove(). 
cbb0: 20 20 20 20 20 20 20 2f 2f 20 6f 74 68 65 72 77         // otherw
cbc0: 69 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20 77  ise we need to w
cbd0: 61 69 74 20 74 68 65 20 75 70 64 61 74 65 64 20  ait the updated 
cbe0: 65 76 65 6e 74 0a 20 20 20 20 20 20 20 20 65 6c  event.        el
cbf0: 73 65 20 28 74 61 67 2e 70 61 72 65 6e 74 20 7c  se (tag.parent |
cc00: 7c 20 74 61 67 29 2e 6f 6e 65 28 27 75 70 64 61  | tag).one('upda
cc10: 74 65 64 27 2c 20 72 65 6d 6f 76 65 29 0a 0a 20  ted', remove).. 
cc20: 20 20 20 20 20 20 20 64 6f 6d 2e 69 6e 53 74 75         dom.inStu
cc30: 62 20 3d 20 74 72 75 65 0a 20 20 20 20 20 20 7d  b = true.      }
cc40: 0a 20 20 20 20 2f 2f 20 73 68 6f 77 20 2f 20 68  .    // show / h
cc50: 69 64 65 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ide.    } else i
cc60: 66 20 28 61 74 74 72 4e 61 6d 65 20 3d 3d 3d 20  f (attrName === 
cc70: 27 73 68 6f 77 27 29 20 7b 0a 20 20 20 20 20 20  'show') {.      
cc80: 64 6f 6d 2e 73 74 79 6c 65 2e 64 69 73 70 6c 61  dom.style.displa
cc90: 79 20 3d 20 76 61 6c 75 65 20 3f 20 27 27 20 3a  y = value ? '' :
cca0: 20 27 6e 6f 6e 65 27 0a 0a 20 20 20 20 7d 20 65   'none'..    } e
ccb0: 6c 73 65 20 69 66 20 28 61 74 74 72 4e 61 6d 65  lse if (attrName
ccc0: 20 3d 3d 3d 20 27 68 69 64 65 27 29 20 7b 0a 20   === 'hide') {. 
ccd0: 20 20 20 20 20 64 6f 6d 2e 73 74 79 6c 65 2e 64       dom.style.d
cce0: 69 73 70 6c 61 79 20 3d 20 76 61 6c 75 65 20 3f  isplay = value ?
ccf0: 20 27 6e 6f 6e 65 27 20 3a 20 27 27 0a 0a 20 20   'none' : ''..  
cd00: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 65 78 70    } else if (exp
cd10: 72 2e 62 6f 6f 6c 29 20 7b 0a 20 20 20 20 20 20  r.bool) {.      
cd20: 64 6f 6d 5b 61 74 74 72 4e 61 6d 65 5d 20 3d 20  dom[attrName] = 
cd30: 76 61 6c 75 65 0a 20 20 20 20 20 20 69 66 20 28  value.      if (
cd40: 76 61 6c 75 65 29 20 73 65 74 41 74 74 72 28 64  value) setAttr(d
cd50: 6f 6d 2c 20 61 74 74 72 4e 61 6d 65 2c 20 61 74  om, attrName, at
cd60: 74 72 4e 61 6d 65 29 0a 20 20 20 20 20 20 69 66  trName).      if
cd70: 20 28 46 49 52 45 46 4f 58 20 26 26 20 61 74 74   (FIREFOX && att
cd80: 72 4e 61 6d 65 20 3d 3d 3d 20 27 73 65 6c 65 63  rName === 'selec
cd90: 74 65 64 27 20 26 26 20 64 6f 6d 2e 74 61 67 4e  ted' && dom.tagN
cda0: 61 6d 65 20 3d 3d 3d 20 27 4f 50 54 49 4f 4e 27  ame === 'OPTION'
cdb0: 29 20 7b 0a 20 20 20 20 20 20 20 20 64 6f 6d 2e  ) {.        dom.
cdc0: 5f 5f 72 69 6f 74 31 33 37 34 20 3d 20 76 61 6c  __riot1374 = val
cdd0: 75 65 20 20 20 2f 2f 20 23 31 33 37 34 0a 20 20  ue   // #1374.  
cde0: 20 20 20 20 7d 0a 0a 20 20 20 20 7d 20 65 6c 73      }..    } els
cdf0: 65 20 69 66 20 28 76 61 6c 75 65 20 3d 3d 3d 20  e if (value === 
ce00: 30 20 7c 7c 20 76 61 6c 75 65 20 26 26 20 74 79  0 || value && ty
ce10: 70 65 6f 66 20 76 61 6c 75 65 20 21 3d 3d 20 54  peof value !== T
ce20: 5f 4f 42 4a 45 43 54 29 20 7b 0a 20 20 20 20 20  _OBJECT) {.     
ce30: 20 2f 2f 20 3c 69 6d 67 20 73 72 63 3d 22 7b 20   // <img src="{ 
ce40: 65 78 70 72 20 7d 22 3e 0a 20 20 20 20 20 20 69  expr }">.      i
ce50: 66 20 28 73 74 61 72 74 73 57 69 74 68 28 61 74  f (startsWith(at
ce60: 74 72 4e 61 6d 65 2c 20 52 49 4f 54 5f 50 52 45  trName, RIOT_PRE
ce70: 46 49 58 29 20 26 26 20 61 74 74 72 4e 61 6d 65  FIX) && attrName
ce80: 20 21 3d 20 52 49 4f 54 5f 54 41 47 29 20 7b 0a   != RIOT_TAG) {.
ce90: 20 20 20 20 20 20 20 20 61 74 74 72 4e 61 6d 65          attrName
cea0: 20 3d 20 61 74 74 72 4e 61 6d 65 2e 73 6c 69 63   = attrName.slic
ceb0: 65 28 52 49 4f 54 5f 50 52 45 46 49 58 2e 6c 65  e(RIOT_PREFIX.le
cec0: 6e 67 74 68 29 0a 20 20 20 20 20 20 7d 0a 20 20  ngth).      }.  
ced0: 20 20 20 20 73 65 74 41 74 74 72 28 64 6f 6d 2c      setAttr(dom,
cee0: 20 61 74 74 72 4e 61 6d 65 2c 20 76 61 6c 75 65   attrName, value
cef0: 29 0a 20 20 20 20 7d 0a 0a 20 20 7d 29 0a 0a 7d  ).    }..  })..}
cf00: 0a 2f 2a 2a 0a 20 2a 20 53 70 65 63 69 61 6c 69  ./**. * Speciali
cf10: 7a 65 64 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  zed function for
cf20: 20 6c 6f 6f 70 69 6e 67 20 61 6e 20 61 72 72 61   looping an arra
cf30: 79 2d 6c 69 6b 65 20 63 6f 6c 6c 65 63 74 69 6f  y-like collectio
cf40: 6e 20 77 69 74 68 20 60 65 61 63 68 3d 7b 7d 60  n with `each={}`
cf50: 0a 20 2a 20 40 70 61 72 61 6d 20 20 20 7b 20 41  . * @param   { A
cf60: 72 72 61 79 20 7d 20 65 6c 73 20 2d 20 63 6f 6c  rray } els - col
cf70: 6c 65 63 74 69 6f 6e 20 6f 66 20 69 74 65 6d 73  lection of items
cf80: 0a 20 2a 20 40 70 61 72 61 6d 20 20 20 7b 46 75  . * @param   {Fu
cf90: 6e 63 74 69 6f 6e 7d 20 66 6e 20 2d 20 63 61 6c  nction} fn - cal
cfa0: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 0a 20  lback function. 
cfb0: 2a 20 40 72 65 74 75 72 6e 73 20 7b 20 41 72 72  * @returns { Arr
cfc0: 61 79 20 7d 20 74 68 65 20 61 72 72 61 79 20 6c  ay } the array l
cfd0: 6f 6f 70 65 64 0a 20 2a 2f 0a 66 75 6e 63 74 69  ooped. */.functi
cfe0: 6f 6e 20 65 61 63 68 28 65 6c 73 2c 20 66 6e 29  on each(els, fn)
cff0: 20 7b 0a 20 20 76 61 72 20 6c 65 6e 20 3d 20 65   {.  var len = e
d000: 6c 73 20 3f 20 65 6c 73 2e 6c 65 6e 67 74 68 20  ls ? els.length 
d010: 3a 20 30 0a 0a 20 20 66 6f 72 20 28 76 61 72 20  : 0..  for (var 
d020: 69 20 3d 20 30 2c 20 65 6c 3b 20 69 20 3c 20 6c  i = 0, el; i < l
d030: 65 6e 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20 65  en; i++) {.    e
d040: 6c 20 3d 20 65 6c 73 5b 69 5d 0a 20 20 20 20 2f  l = els[i].    /
d050: 2f 20 72 65 74 75 72 6e 20 66 61 6c 73 65 20 2d  / return false -
d060: 3e 20 63 75 72 72 65 6e 74 20 69 74 65 6d 20 77  > current item w
d070: 61 73 20 72 65 6d 6f 76 65 64 20 62 79 20 66 6e  as removed by fn
d080: 20 64 75 72 69 6e 67 20 74 68 65 20 6c 6f 6f 70   during the loop
d090: 0a 20 20 20 20 69 66 20 28 65 6c 20 21 3d 20 6e  .    if (el != n
d0a0: 75 6c 6c 20 26 26 20 66 6e 28 65 6c 2c 20 69 29  ull && fn(el, i)
d0b0: 20 3d 3d 3d 20 66 61 6c 73 65 29 20 69 2d 2d 0a   === false) i--.
d0c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 6c 73    }.  return els
d0d0: 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20 44 65 74 65 63  .}../**. * Detec
d0e0: 74 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  t if the argumen
d0f0: 74 20 70 61 73 73 65 64 20 69 73 20 61 20 66 75  t passed is a fu
d100: 6e 63 74 69 6f 6e 0a 20 2a 20 40 70 61 72 61 6d  nction. * @param
d110: 20 20 20 7b 20 2a 20 7d 20 76 20 2d 20 77 68 61     { * } v - wha
d120: 74 65 76 65 72 20 79 6f 75 20 77 61 6e 74 20 74  tever you want t
d130: 6f 20 70 61 73 73 20 74 6f 20 74 68 69 73 20 66  o pass to this f
d140: 75 6e 63 74 69 6f 6e 0a 20 2a 20 40 72 65 74 75  unction. * @retu
d150: 72 6e 73 20 7b 20 42 6f 6f 6c 65 61 6e 20 7d 20  rns { Boolean } 
d160: 2d 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 69  -. */.function i
d170: 73 46 75 6e 63 74 69 6f 6e 28 76 29 20 7b 0a 20  sFunction(v) {. 
d180: 20 72 65 74 75 72 6e 20 74 79 70 65 6f 66 20 76   return typeof v
d190: 20 3d 3d 3d 20 54 5f 46 55 4e 43 54 49 4f 4e 20   === T_FUNCTION 
d1a0: 7c 7c 20 66 61 6c 73 65 20 20 20 2f 2f 20 61 76  || false   // av
d1b0: 6f 69 64 20 49 45 20 70 72 6f 62 6c 65 6d 73 0a  oid IE problems.
d1c0: 7d 0a 0a 2f 2a 2a 0a 20 2a 20 47 65 74 20 74 68  }../**. * Get th
d1d0: 65 20 6f 75 74 65 72 20 68 74 6d 6c 20 6f 66 20  e outer html of 
d1e0: 61 6e 79 20 44 4f 4d 20 6e 6f 64 65 20 53 56 47  any DOM node SVG
d1f0: 73 20 69 6e 63 6c 75 64 65 64 0a 20 2a 20 40 70  s included. * @p
d200: 61 72 61 6d 20 20 20 7b 20 4f 62 6a 65 63 74 20  aram   { Object 
d210: 7d 20 65 6c 20 2d 20 44 4f 4d 20 6e 6f 64 65 20  } el - DOM node 
d220: 74 6f 20 70 61 72 73 65 0a 20 2a 20 40 72 65 74  to parse. * @ret
d230: 75 72 6e 73 20 7b 20 53 74 72 69 6e 67 20 7d 20  urns { String } 
d240: 65 6c 2e 6f 75 74 65 72 48 54 4d 4c 0a 20 2a 2f  el.outerHTML. */
d250: 0a 66 75 6e 63 74 69 6f 6e 20 67 65 74 4f 75 74  .function getOut
d260: 65 72 48 54 4d 4c 28 65 6c 29 20 7b 0a 20 20 69  erHTML(el) {.  i
d270: 66 20 28 65 6c 2e 6f 75 74 65 72 48 54 4d 4c 29  f (el.outerHTML)
d280: 20 72 65 74 75 72 6e 20 65 6c 2e 6f 75 74 65 72   return el.outer
d290: 48 54 4d 4c 0a 20 20 2f 2f 20 73 6f 6d 65 20 62  HTML.  // some b
d2a0: 72 6f 77 73 65 72 73 20 64 6f 20 6e 6f 74 20 73  rowsers do not s
d2b0: 75 70 70 6f 72 74 20 6f 75 74 65 72 48 54 4d 4c  upport outerHTML
d2c0: 20 6f 6e 20 74 68 65 20 53 56 47 73 20 74 61 67   on the SVGs tag
d2d0: 73 0a 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 76  s.  else {.    v
d2e0: 61 72 20 63 6f 6e 74 61 69 6e 65 72 20 3d 20 6d  ar container = m
d2f0: 6b 45 6c 28 27 64 69 76 27 29 0a 20 20 20 20 63  kEl('div').    c
d300: 6f 6e 74 61 69 6e 65 72 2e 61 70 70 65 6e 64 43  ontainer.appendC
d310: 68 69 6c 64 28 65 6c 2e 63 6c 6f 6e 65 4e 6f 64  hild(el.cloneNod
d320: 65 28 74 72 75 65 29 29 0a 20 20 20 20 72 65 74  e(true)).    ret
d330: 75 72 6e 20 63 6f 6e 74 61 69 6e 65 72 2e 69 6e  urn container.in
d340: 6e 65 72 48 54 4d 4c 0a 20 20 7d 0a 7d 0a 0a 2f  nerHTML.  }.}../
d350: 2a 2a 0a 20 2a 20 53 65 74 20 74 68 65 20 69 6e  **. * Set the in
d360: 6e 65 72 20 68 74 6d 6c 20 6f 66 20 61 6e 79 20  ner html of any 
d370: 44 4f 4d 20 6e 6f 64 65 20 53 56 47 73 20 69 6e  DOM node SVGs in
d380: 63 6c 75 64 65 64 0a 20 2a 20 40 70 61 72 61 6d  cluded. * @param
d390: 20 7b 20 4f 62 6a 65 63 74 20 7d 20 63 6f 6e 74   { Object } cont
d3a0: 61 69 6e 65 72 20 2d 20 44 4f 4d 20 6e 6f 64 65  ainer - DOM node
d3b0: 20 77 68 65 72 65 20 77 65 20 77 69 6c 6c 20 69   where we will i
d3c0: 6e 6a 65 63 74 20 74 68 65 20 6e 65 77 20 68 74  nject the new ht
d3d0: 6d 6c 0a 20 2a 20 40 70 61 72 61 6d 20 7b 20 53  ml. * @param { S
d3e0: 74 72 69 6e 67 20 7d 20 68 74 6d 6c 20 2d 20 68  tring } html - h
d3f0: 74 6d 6c 20 74 6f 20 69 6e 6a 65 63 74 0a 20 2a  tml to inject. *
d400: 2f 0a 66 75 6e 63 74 69 6f 6e 20 73 65 74 49 6e  /.function setIn
d410: 6e 65 72 48 54 4d 4c 28 63 6f 6e 74 61 69 6e 65  nerHTML(containe
d420: 72 2c 20 68 74 6d 6c 29 20 7b 0a 20 20 69 66 20  r, html) {.  if 
d430: 28 74 79 70 65 6f 66 20 63 6f 6e 74 61 69 6e 65  (typeof containe
d440: 72 2e 69 6e 6e 65 72 48 54 4d 4c 20 21 3d 20 54  r.innerHTML != T
d450: 5f 55 4e 44 45 46 29 20 63 6f 6e 74 61 69 6e 65  _UNDEF) containe
d460: 72 2e 69 6e 6e 65 72 48 54 4d 4c 20 3d 20 68 74  r.innerHTML = ht
d470: 6d 6c 0a 20 20 2f 2f 20 73 6f 6d 65 20 62 72 6f  ml.  // some bro
d480: 77 73 65 72 73 20 64 6f 20 6e 6f 74 20 73 75 70  wsers do not sup
d490: 70 6f 72 74 20 69 6e 6e 65 72 48 54 4d 4c 20 6f  port innerHTML o
d4a0: 6e 20 74 68 65 20 53 56 47 73 20 74 61 67 73 0a  n the SVGs tags.
d4b0: 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 76 61 72    else {.    var
d4c0: 20 64 6f 63 20 3d 20 6e 65 77 20 44 4f 4d 50 61   doc = new DOMPa
d4d0: 72 73 65 72 28 29 2e 70 61 72 73 65 46 72 6f 6d  rser().parseFrom
d4e0: 53 74 72 69 6e 67 28 68 74 6d 6c 2c 20 27 61 70  String(html, 'ap
d4f0: 70 6c 69 63 61 74 69 6f 6e 2f 78 6d 6c 27 29 0a  plication/xml').
d500: 20 20 20 20 63 6f 6e 74 61 69 6e 65 72 2e 61 70      container.ap
d510: 70 65 6e 64 43 68 69 6c 64 28 0a 20 20 20 20 20  pendChild(.     
d520: 20 63 6f 6e 74 61 69 6e 65 72 2e 6f 77 6e 65 72   container.owner
d530: 44 6f 63 75 6d 65 6e 74 2e 69 6d 70 6f 72 74 4e  Document.importN
d540: 6f 64 65 28 64 6f 63 2e 64 6f 63 75 6d 65 6e 74  ode(doc.document
d550: 45 6c 65 6d 65 6e 74 2c 20 74 72 75 65 29 0a 20  Element, true). 
d560: 20 20 20 29 0a 20 20 7d 0a 7d 0a 0a 2f 2a 2a 0a     ).  }.}../**.
d570: 20 2a 20 43 68 65 63 6b 73 20 77 65 74 68 65 72   * Checks wether
d580: 20 61 20 44 4f 4d 20 6e 6f 64 65 20 6d 75 73 74   a DOM node must
d590: 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 70   be considered p
d5a0: 61 72 74 20 6f 66 20 61 6e 20 73 76 67 20 64 6f  art of an svg do
d5b0: 63 75 6d 65 6e 74 0a 20 2a 20 40 70 61 72 61 6d  cument. * @param
d5c0: 20 20 20 7b 20 53 74 72 69 6e 67 20 7d 20 20 6e     { String }  n
d5d0: 61 6d 65 20 2d 20 74 61 67 20 6e 61 6d 65 0a 20  ame - tag name. 
d5e0: 2a 20 40 72 65 74 75 72 6e 73 20 7b 20 42 6f 6f  * @returns { Boo
d5f0: 6c 65 61 6e 20 7d 20 2d 0a 20 2a 2f 0a 66 75 6e  lean } -. */.fun
d600: 63 74 69 6f 6e 20 69 73 53 56 47 54 61 67 28 6e  ction isSVGTag(n
d610: 61 6d 65 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  ame) {.  return 
d620: 7e 53 56 47 5f 54 41 47 53 5f 4c 49 53 54 2e 69  ~SVG_TAGS_LIST.i
d630: 6e 64 65 78 4f 66 28 6e 61 6d 65 29 0a 7d 0a 0a  ndexOf(name).}..
d640: 2f 2a 2a 0a 20 2a 20 44 65 74 65 63 74 20 69 66  /**. * Detect if
d650: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 70 61   the argument pa
d660: 73 73 65 64 20 69 73 20 61 6e 20 6f 62 6a 65 63  ssed is an objec
d670: 74 2c 20 65 78 63 6c 75 64 65 20 6e 75 6c 6c 2e  t, exclude null.
d680: 0a 20 2a 20 4e 4f 54 45 3a 20 55 73 65 20 69 73  . * NOTE: Use is
d690: 4f 62 6a 65 63 74 28 78 29 20 26 26 20 21 69 73  Object(x) && !is
d6a0: 41 72 72 61 79 28 78 29 20 74 6f 20 65 78 63 6c  Array(x) to excl
d6b0: 75 64 65 73 20 61 72 72 61 79 73 2e 0a 20 2a 20  udes arrays.. * 
d6c0: 40 70 61 72 61 6d 20 20 20 7b 20 2a 20 7d 20 76  @param   { * } v
d6d0: 20 2d 20 77 68 61 74 65 76 65 72 20 79 6f 75 20   - whatever you 
d6e0: 77 61 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20  want to pass to 
d6f0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 2a  this function. *
d700: 20 40 72 65 74 75 72 6e 73 20 7b 20 42 6f 6f 6c   @returns { Bool
d710: 65 61 6e 20 7d 20 2d 0a 20 2a 2f 0a 66 75 6e 63  ean } -. */.func
d720: 74 69 6f 6e 20 69 73 4f 62 6a 65 63 74 28 76 29  tion isObject(v)
d730: 20 7b 0a 20 20 72 65 74 75 72 6e 20 76 20 26 26   {.  return v &&
d740: 20 74 79 70 65 6f 66 20 76 20 3d 3d 3d 20 54 5f   typeof v === T_
d750: 4f 42 4a 45 43 54 20 20 20 20 20 20 20 20 20 2f  OBJECT         /
d760: 2f 20 74 79 70 65 6f 66 20 6e 75 6c 6c 20 69 73  / typeof null is
d770: 20 27 6f 62 6a 65 63 74 27 0a 7d 0a 0a 2f 2a 2a   'object'.}../**
d780: 0a 20 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 44  . * Remove any D
d790: 4f 4d 20 61 74 74 72 69 62 75 74 65 20 66 72 6f  OM attribute fro
d7a0: 6d 20 61 20 6e 6f 64 65 0a 20 2a 20 40 70 61 72  m a node. * @par
d7b0: 61 6d 20 20 20 7b 20 4f 62 6a 65 63 74 20 7d 20  am   { Object } 
d7c0: 64 6f 6d 20 2d 20 44 4f 4d 20 6e 6f 64 65 20 77  dom - DOM node w
d7d0: 65 20 77 61 6e 74 20 74 6f 20 75 70 64 61 74 65  e want to update
d7e0: 0a 20 2a 20 40 70 61 72 61 6d 20 20 20 7b 20 53  . * @param   { S
d7f0: 74 72 69 6e 67 20 7d 20 6e 61 6d 65 20 2d 20 6e  tring } name - n
d800: 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 70 65  ame of the prope
d810: 72 74 79 20 77 65 20 77 61 6e 74 20 74 6f 20 72  rty we want to r
d820: 65 6d 6f 76 65 0a 20 2a 2f 0a 66 75 6e 63 74 69  emove. */.functi
d830: 6f 6e 20 72 65 6d 41 74 74 72 28 64 6f 6d 2c 20  on remAttr(dom, 
d840: 6e 61 6d 65 29 20 7b 0a 20 20 64 6f 6d 2e 72 65  name) {.  dom.re
d850: 6d 6f 76 65 41 74 74 72 69 62 75 74 65 28 6e 61  moveAttribute(na
d860: 6d 65 29 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20 43 6f  me).}../**. * Co
d870: 6e 76 65 72 74 20 61 20 73 74 72 69 6e 67 20 63  nvert a string c
d880: 6f 6e 74 61 69 6e 69 6e 67 20 64 61 73 68 65 73  ontaining dashes
d890: 20 74 6f 20 63 61 6d 65 6c 20 63 61 73 65 0a 20   to camel case. 
d8a0: 2a 20 40 70 61 72 61 6d 20 20 20 7b 20 53 74 72  * @param   { Str
d8b0: 69 6e 67 20 7d 20 73 74 72 69 6e 67 20 2d 20 69  ing } string - i
d8c0: 6e 70 75 74 20 73 74 72 69 6e 67 0a 20 2a 20 40  nput string. * @
d8d0: 72 65 74 75 72 6e 73 20 7b 20 53 74 72 69 6e 67  returns { String
d8e0: 20 7d 20 6d 79 2d 73 74 72 69 6e 67 20 2d 3e 20   } my-string -> 
d8f0: 6d 79 53 74 72 69 6e 67 0a 20 2a 2f 0a 66 75 6e  myString. */.fun
d900: 63 74 69 6f 6e 20 74 6f 43 61 6d 65 6c 28 73 74  ction toCamel(st
d910: 72 69 6e 67 29 20 7b 0a 20 20 72 65 74 75 72 6e  ring) {.  return
d920: 20 73 74 72 69 6e 67 2e 72 65 70 6c 61 63 65 28   string.replace(
d930: 2f 2d 28 5c 77 29 2f 67 2c 20 66 75 6e 63 74 69  /-(\w)/g, functi
d940: 6f 6e 28 5f 2c 20 63 29 20 7b 0a 20 20 20 20 72  on(_, c) {.    r
d950: 65 74 75 72 6e 20 63 2e 74 6f 55 70 70 65 72 43  eturn c.toUpperC
d960: 61 73 65 28 29 0a 20 20 7d 29 0a 7d 0a 0a 2f 2a  ase().  }).}../*
d970: 2a 0a 20 2a 20 47 65 74 20 74 68 65 20 76 61 6c  *. * Get the val
d980: 75 65 20 6f 66 20 61 6e 79 20 44 4f 4d 20 61 74  ue of any DOM at
d990: 74 72 69 62 75 74 65 20 6f 6e 20 61 20 6e 6f 64  tribute on a nod
d9a0: 65 0a 20 2a 20 40 70 61 72 61 6d 20 20 20 7b 20  e. * @param   { 
d9b0: 4f 62 6a 65 63 74 20 7d 20 64 6f 6d 20 2d 20 44  Object } dom - D
d9c0: 4f 4d 20 6e 6f 64 65 20 77 65 20 77 61 6e 74 20  OM node we want 
d9d0: 74 6f 20 70 61 72 73 65 0a 20 2a 20 40 70 61 72  to parse. * @par
d9e0: 61 6d 20 20 20 7b 20 53 74 72 69 6e 67 20 7d 20  am   { String } 
d9f0: 6e 61 6d 65 20 2d 20 6e 61 6d 65 20 6f 66 20 74  name - name of t
da00: 68 65 20 61 74 74 72 69 62 75 74 65 20 77 65 20  he attribute we 
da10: 77 61 6e 74 20 74 6f 20 67 65 74 0a 20 2a 20 40  want to get. * @
da20: 72 65 74 75 72 6e 73 20 7b 20 53 74 72 69 6e 67  returns { String
da30: 20 7c 20 75 6e 64 65 66 69 6e 65 64 20 7d 20 6e   | undefined } n
da40: 61 6d 65 20 6f 66 20 74 68 65 20 6e 6f 64 65 20  ame of the node 
da50: 61 74 74 72 69 62 75 74 65 20 77 68 65 74 68 65  attribute whethe
da60: 72 20 69 74 20 65 78 69 73 74 73 0a 20 2a 2f 0a  r it exists. */.
da70: 66 75 6e 63 74 69 6f 6e 20 67 65 74 41 74 74 72  function getAttr
da80: 28 64 6f 6d 2c 20 6e 61 6d 65 29 20 7b 0a 20 20  (dom, name) {.  
da90: 72 65 74 75 72 6e 20 64 6f 6d 2e 67 65 74 41 74  return dom.getAt
daa0: 74 72 69 62 75 74 65 28 6e 61 6d 65 29 0a 7d 0a  tribute(name).}.
dab0: 0a 2f 2a 2a 0a 20 2a 20 53 65 74 20 61 6e 79 20  ./**. * Set any 
dac0: 44 4f 4d 2f 53 56 47 20 61 74 74 72 69 62 75 74  DOM/SVG attribut
dad0: 65 0a 20 2a 20 40 70 61 72 61 6d 20 7b 20 4f 62  e. * @param { Ob
dae0: 6a 65 63 74 20 7d 20 64 6f 6d 20 2d 20 44 4f 4d  ject } dom - DOM
daf0: 20 6e 6f 64 65 20 77 65 20 77 61 6e 74 20 74 6f   node we want to
db00: 20 75 70 64 61 74 65 0a 20 2a 20 40 70 61 72 61   update. * @para
db10: 6d 20 7b 20 53 74 72 69 6e 67 20 7d 20 6e 61 6d  m { String } nam
db20: 65 20 2d 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  e - name of the 
db30: 70 72 6f 70 65 72 74 79 20 77 65 20 77 61 6e 74  property we want
db40: 20 74 6f 20 73 65 74 0a 20 2a 20 40 70 61 72 61   to set. * @para
db50: 6d 20 7b 20 53 74 72 69 6e 67 20 7d 20 76 61 6c  m { String } val
db60: 20 2d 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20   - value of the 
db70: 70 72 6f 70 65 72 74 79 20 77 65 20 77 61 6e 74  property we want
db80: 20 74 6f 20 73 65 74 0a 20 2a 2f 0a 66 75 6e 63   to set. */.func
db90: 74 69 6f 6e 20 73 65 74 41 74 74 72 28 64 6f 6d  tion setAttr(dom
dba0: 2c 20 6e 61 6d 65 2c 20 76 61 6c 29 20 7b 0a 20  , name, val) {. 
dbb0: 20 76 61 72 20 78 6c 69 6e 6b 20 3d 20 58 4c 49   var xlink = XLI
dbc0: 4e 4b 5f 52 45 47 45 58 2e 65 78 65 63 28 6e 61  NK_REGEX.exec(na
dbd0: 6d 65 29 0a 20 20 69 66 20 28 78 6c 69 6e 6b 20  me).  if (xlink 
dbe0: 26 26 20 78 6c 69 6e 6b 5b 31 5d 29 0a 20 20 20  && xlink[1]).   
dbf0: 20 64 6f 6d 2e 73 65 74 41 74 74 72 69 62 75 74   dom.setAttribut
dc00: 65 4e 53 28 58 4c 49 4e 4b 5f 4e 53 2c 20 78 6c  eNS(XLINK_NS, xl
dc10: 69 6e 6b 5b 31 5d 2c 20 76 61 6c 29 0a 20 20 65  ink[1], val).  e
dc20: 6c 73 65 0a 20 20 20 20 64 6f 6d 2e 73 65 74 41  lse.    dom.setA
dc30: 74 74 72 69 62 75 74 65 28 6e 61 6d 65 2c 20 76  ttribute(name, v
dc40: 61 6c 29 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20 44 65  al).}../**. * De
dc50: 74 65 63 74 20 74 68 65 20 74 61 67 20 69 6d 70  tect the tag imp
dc60: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 79 20 61  lementation by a
dc70: 20 44 4f 4d 20 6e 6f 64 65 0a 20 2a 20 40 70 61   DOM node. * @pa
dc80: 72 61 6d 20 20 20 7b 20 4f 62 6a 65 63 74 20 7d  ram   { Object }
dc90: 20 64 6f 6d 20 2d 20 44 4f 4d 20 6e 6f 64 65 20   dom - DOM node 
dca0: 77 65 20 6e 65 65 64 20 74 6f 20 70 61 72 73 65  we need to parse
dcb0: 20 74 6f 20 67 65 74 20 69 74 73 20 74 61 67 20   to get its tag 
dcc0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20  implementation. 
dcd0: 2a 20 40 72 65 74 75 72 6e 73 20 7b 20 4f 62 6a  * @returns { Obj
dce0: 65 63 74 20 7d 20 69 74 20 72 65 74 75 72 6e 73  ect } it returns
dcf0: 20 61 6e 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61   an object conta
dd00: 69 6e 69 6e 67 20 74 68 65 20 69 6d 70 6c 65 6d  ining the implem
dd10: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 63 75  entation of a cu
dd20: 73 74 6f 6d 20 74 61 67 20 28 74 65 6d 70 6c 61  stom tag (templa
dd30: 74 65 20 61 6e 64 20 62 6f 6f 74 20 66 75 6e 63  te and boot func
dd40: 74 69 6f 6e 29 0a 20 2a 2f 0a 66 75 6e 63 74 69  tion). */.functi
dd50: 6f 6e 20 67 65 74 54 61 67 28 64 6f 6d 29 20 7b  on getTag(dom) {
dd60: 0a 20 20 72 65 74 75 72 6e 20 64 6f 6d 2e 74 61  .  return dom.ta
dd70: 67 4e 61 6d 65 20 26 26 20 5f 5f 74 61 67 49 6d  gName && __tagIm
dd80: 70 6c 5b 67 65 74 41 74 74 72 28 64 6f 6d 2c 20  pl[getAttr(dom, 
dd90: 52 49 4f 54 5f 54 41 47 5f 49 53 29 20 7c 7c 0a  RIOT_TAG_IS) ||.
dda0: 20 20 20 20 67 65 74 41 74 74 72 28 64 6f 6d 2c      getAttr(dom,
ddb0: 20 52 49 4f 54 5f 54 41 47 29 20 7c 7c 20 64 6f   RIOT_TAG) || do
ddc0: 6d 2e 74 61 67 4e 61 6d 65 2e 74 6f 4c 6f 77 65  m.tagName.toLowe
ddd0: 72 43 61 73 65 28 29 5d 0a 7d 0a 2f 2a 2a 0a 20  rCase()].}./**. 
dde0: 2a 20 41 64 64 20 61 20 63 68 69 6c 64 20 74 61  * Add a child ta
ddf0: 67 20 74 6f 20 69 74 73 20 70 61 72 65 6e 74 20  g to its parent 
de00: 69 6e 74 6f 20 74 68 65 20 60 74 61 67 73 60 20  into the `tags` 
de10: 6f 62 6a 65 63 74 0a 20 2a 20 40 70 61 72 61 6d  object. * @param
de20: 20 20 20 7b 20 4f 62 6a 65 63 74 20 7d 20 74 61     { Object } ta
de30: 67 20 2d 20 63 68 69 6c 64 20 74 61 67 20 69 6e  g - child tag in
de40: 73 74 61 6e 63 65 0a 20 2a 20 40 70 61 72 61 6d  stance. * @param
de50: 20 20 20 7b 20 53 74 72 69 6e 67 20 7d 20 74 61     { String } ta
de60: 67 4e 61 6d 65 20 2d 20 6b 65 79 20 77 68 65 72  gName - key wher
de70: 65 20 74 68 65 20 6e 65 77 20 74 61 67 20 77 69  e the new tag wi
de80: 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a 20 2a 20  ll be stored. * 
de90: 40 70 61 72 61 6d 20 20 20 7b 20 4f 62 6a 65 63  @param   { Objec
dea0: 74 20 7d 20 70 61 72 65 6e 74 20 2d 20 74 61 67  t } parent - tag
deb0: 20 69 6e 73 74 61 6e 63 65 20 77 68 65 72 65 20   instance where 
dec0: 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 74 61  the new child ta
ded0: 67 20 77 69 6c 6c 20 62 65 20 69 6e 63 6c 75 64  g will be includ
dee0: 65 64 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20  ed. */.function 
def0: 61 64 64 43 68 69 6c 64 54 61 67 28 74 61 67 2c  addChildTag(tag,
df00: 20 74 61 67 4e 61 6d 65 2c 20 70 61 72 65 6e 74   tagName, parent
df10: 29 20 7b 0a 20 20 76 61 72 20 63 61 63 68 65 64  ) {.  var cached
df20: 54 61 67 20 3d 20 70 61 72 65 6e 74 2e 74 61 67  Tag = parent.tag
df30: 73 5b 74 61 67 4e 61 6d 65 5d 0a 0a 20 20 2f 2f  s[tagName]..  //
df40: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6d 75   if there are mu
df50: 6c 74 69 70 6c 65 20 63 68 69 6c 64 72 65 6e 20  ltiple children 
df60: 74 61 67 73 20 68 61 76 69 6e 67 20 74 68 65 20  tags having the 
df70: 73 61 6d 65 20 6e 61 6d 65 0a 20 20 69 66 20 28  same name.  if (
df80: 63 61 63 68 65 64 54 61 67 29 20 7b 0a 20 20 20  cachedTag) {.   
df90: 20 2f 2f 20 69 66 20 74 68 65 20 70 61 72 65 6e   // if the paren
dfa0: 74 20 74 61 67 73 20 70 72 6f 70 65 72 74 79 20  t tags property 
dfb0: 69 73 20 6e 6f 74 20 79 65 74 20 61 6e 20 61 72  is not yet an ar
dfc0: 72 61 79 0a 20 20 20 20 2f 2f 20 63 72 65 61 74  ray.    // creat
dfd0: 65 20 69 74 20 61 64 64 69 6e 67 20 74 68 65 20  e it adding the 
dfe0: 66 69 72 73 74 20 63 61 63 68 65 64 20 74 61 67  first cached tag
dff0: 0a 20 20 20 20 69 66 20 28 21 69 73 41 72 72 61  .    if (!isArra
e000: 79 28 63 61 63 68 65 64 54 61 67 29 29 0a 20 20  y(cachedTag)).  
e010: 20 20 20 20 2f 2f 20 64 6f 6e 27 74 20 61 64 64      // don't add
e020: 20 74 68 65 20 73 61 6d 65 20 74 61 67 20 74 77   the same tag tw
e030: 69 63 65 0a 20 20 20 20 20 20 69 66 20 28 63 61  ice.      if (ca
e040: 63 68 65 64 54 61 67 20 21 3d 3d 20 74 61 67 29  chedTag !== tag)
e050: 0a 20 20 20 20 20 20 20 20 70 61 72 65 6e 74 2e  .        parent.
e060: 74 61 67 73 5b 74 61 67 4e 61 6d 65 5d 20 3d 20  tags[tagName] = 
e070: 5b 63 61 63 68 65 64 54 61 67 5d 0a 20 20 20 20  [cachedTag].    
e080: 2f 2f 20 61 64 64 20 74 68 65 20 6e 65 77 20 6e  // add the new n
e090: 65 73 74 65 64 20 74 61 67 20 74 6f 20 74 68 65  ested tag to the
e0a0: 20 61 72 72 61 79 0a 20 20 20 20 69 66 20 28 21   array.    if (!
e0b0: 63 6f 6e 74 61 69 6e 73 28 70 61 72 65 6e 74 2e  contains(parent.
e0c0: 74 61 67 73 5b 74 61 67 4e 61 6d 65 5d 2c 20 74  tags[tagName], t
e0d0: 61 67 29 29 0a 20 20 20 20 20 20 70 61 72 65 6e  ag)).      paren
e0e0: 74 2e 74 61 67 73 5b 74 61 67 4e 61 6d 65 5d 2e  t.tags[tagName].
e0f0: 70 75 73 68 28 74 61 67 29 0a 20 20 7d 20 65 6c  push(tag).  } el
e100: 73 65 20 7b 0a 20 20 20 20 70 61 72 65 6e 74 2e  se {.    parent.
e110: 74 61 67 73 5b 74 61 67 4e 61 6d 65 5d 20 3d 20  tags[tagName] = 
e120: 74 61 67 0a 20 20 7d 0a 7d 0a 0a 2f 2a 2a 0a 20  tag.  }.}../**. 
e130: 2a 20 4d 6f 76 65 20 74 68 65 20 70 6f 73 69 74  * Move the posit
e140: 69 6f 6e 20 6f 66 20 61 20 63 75 73 74 6f 6d 20  ion of a custom 
e150: 74 61 67 20 69 6e 20 69 74 73 20 70 61 72 65 6e  tag in its paren
e160: 74 20 74 61 67 0a 20 2a 20 40 70 61 72 61 6d 20  t tag. * @param 
e170: 20 20 7b 20 4f 62 6a 65 63 74 20 7d 20 74 61 67    { Object } tag
e180: 20 2d 20 63 68 69 6c 64 20 74 61 67 20 69 6e 73   - child tag ins
e190: 74 61 6e 63 65 0a 20 2a 20 40 70 61 72 61 6d 20  tance. * @param 
e1a0: 20 20 7b 20 53 74 72 69 6e 67 20 7d 20 74 61 67    { String } tag
e1b0: 4e 61 6d 65 20 2d 20 6b 65 79 20 77 68 65 72 65  Name - key where
e1c0: 20 74 68 65 20 74 61 67 20 77 61 73 20 73 74 6f   the tag was sto
e1d0: 72 65 64 0a 20 2a 20 40 70 61 72 61 6d 20 20 20  red. * @param   
e1e0: 7b 20 4e 75 6d 62 65 72 20 7d 20 6e 65 77 50 6f  { Number } newPo
e1f0: 73 20 2d 20 69 6e 64 65 78 20 77 68 65 72 65 20  s - index where 
e200: 74 68 65 20 6e 65 77 20 74 61 67 20 77 69 6c 6c  the new tag will
e210: 20 62 65 20 73 74 6f 72 65 64 0a 20 2a 2f 0a 66   be stored. */.f
e220: 75 6e 63 74 69 6f 6e 20 6d 6f 76 65 43 68 69 6c  unction moveChil
e230: 64 54 61 67 28 74 61 67 2c 20 74 61 67 4e 61 6d  dTag(tag, tagNam
e240: 65 2c 20 6e 65 77 50 6f 73 29 20 7b 0a 20 20 76  e, newPos) {.  v
e250: 61 72 20 70 61 72 65 6e 74 20 3d 20 74 61 67 2e  ar parent = tag.
e260: 70 61 72 65 6e 74 2c 0a 20 20 20 20 74 61 67 73  parent,.    tags
e270: 0a 20 20 2f 2f 20 6e 6f 20 70 61 72 65 6e 74 20  .  // no parent 
e280: 6e 6f 20 6d 6f 76 65 0a 20 20 69 66 20 28 21 70  no move.  if (!p
e290: 61 72 65 6e 74 29 20 72 65 74 75 72 6e 0a 0a 20  arent) return.. 
e2a0: 20 74 61 67 73 20 3d 20 70 61 72 65 6e 74 2e 74   tags = parent.t
e2b0: 61 67 73 5b 74 61 67 4e 61 6d 65 5d 0a 0a 20 20  ags[tagName]..  
e2c0: 69 66 20 28 69 73 41 72 72 61 79 28 74 61 67 73  if (isArray(tags
e2d0: 29 29 0a 20 20 20 20 74 61 67 73 2e 73 70 6c 69  )).    tags.spli
e2e0: 63 65 28 6e 65 77 50 6f 73 2c 20 30 2c 20 74 61  ce(newPos, 0, ta
e2f0: 67 73 2e 73 70 6c 69 63 65 28 74 61 67 73 2e 69  gs.splice(tags.i
e300: 6e 64 65 78 4f 66 28 74 61 67 29 2c 20 31 29 5b  ndexOf(tag), 1)[
e310: 30 5d 29 0a 20 20 65 6c 73 65 20 61 64 64 43 68  0]).  else addCh
e320: 69 6c 64 54 61 67 28 74 61 67 2c 20 74 61 67 4e  ildTag(tag, tagN
e330: 61 6d 65 2c 20 70 61 72 65 6e 74 29 0a 7d 0a 0a  ame, parent).}..
e340: 2f 2a 2a 0a 20 2a 20 43 72 65 61 74 65 20 61 20  /**. * Create a 
e350: 6e 65 77 20 63 68 69 6c 64 20 74 61 67 20 69 6e  new child tag in
e360: 63 6c 75 64 69 6e 67 20 69 74 20 63 6f 72 72 65  cluding it corre
e370: 63 74 6c 79 20 69 6e 74 6f 20 69 74 73 20 70 61  ctly into its pa
e380: 72 65 6e 74 0a 20 2a 20 40 70 61 72 61 6d 20 20  rent. * @param  
e390: 20 7b 20 4f 62 6a 65 63 74 20 7d 20 63 68 69 6c   { Object } chil
e3a0: 64 20 2d 20 63 68 69 6c 64 20 74 61 67 20 69 6d  d - child tag im
e3b0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 2a 20  plementation. * 
e3c0: 40 70 61 72 61 6d 20 20 20 7b 20 4f 62 6a 65 63  @param   { Objec
e3d0: 74 20 7d 20 6f 70 74 73 20 2d 20 74 61 67 20 6f  t } opts - tag o
e3e0: 70 74 69 6f 6e 73 20 63 6f 6e 74 61 69 6e 69 6e  ptions containin
e3f0: 67 20 74 68 65 20 44 4f 4d 20 6e 6f 64 65 20 77  g the DOM node w
e400: 68 65 72 65 20 74 68 65 20 74 61 67 20 77 69 6c  here the tag wil
e410: 6c 20 62 65 20 6d 6f 75 6e 74 65 64 0a 20 2a 20  l be mounted. * 
e420: 40 70 61 72 61 6d 20 20 20 7b 20 53 74 72 69 6e  @param   { Strin
e430: 67 20 7d 20 69 6e 6e 65 72 48 54 4d 4c 20 2d 20  g } innerHTML - 
e440: 69 6e 6e 65 72 20 68 74 6d 6c 20 6f 66 20 74 68  inner html of th
e450: 65 20 63 68 69 6c 64 20 6e 6f 64 65 0a 20 2a 20  e child node. * 
e460: 40 70 61 72 61 6d 20 20 20 7b 20 4f 62 6a 65 63  @param   { Objec
e470: 74 20 7d 20 70 61 72 65 6e 74 20 2d 20 69 6e 73  t } parent - ins
e480: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 70 61 72  tance of the par
e490: 65 6e 74 20 74 61 67 20 69 6e 63 6c 75 64 69 6e  ent tag includin
e4a0: 67 20 74 68 65 20 63 68 69 6c 64 20 63 75 73 74  g the child cust
e4b0: 6f 6d 20 74 61 67 0a 20 2a 20 40 72 65 74 75 72  om tag. * @retur
e4c0: 6e 73 20 7b 20 4f 62 6a 65 63 74 20 7d 20 69 6e  ns { Object } in
e4d0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 6e 65  stance of the ne
e4e0: 77 20 63 68 69 6c 64 20 74 61 67 20 6a 75 73 74  w child tag just
e4f0: 20 63 72 65 61 74 65 64 0a 20 2a 2f 0a 66 75 6e   created. */.fun
e500: 63 74 69 6f 6e 20 69 6e 69 74 43 68 69 6c 64 54  ction initChildT
e510: 61 67 28 63 68 69 6c 64 2c 20 6f 70 74 73 2c 20  ag(child, opts, 
e520: 69 6e 6e 65 72 48 54 4d 4c 2c 20 70 61 72 65 6e  innerHTML, paren
e530: 74 29 20 7b 0a 20 20 76 61 72 20 74 61 67 20 3d  t) {.  var tag =
e540: 20 6e 65 77 20 54 61 67 28 63 68 69 6c 64 2c 20   new Tag(child, 
e550: 6f 70 74 73 2c 20 69 6e 6e 65 72 48 54 4d 4c 29  opts, innerHTML)
e560: 2c 0a 20 20 20 20 74 61 67 4e 61 6d 65 20 3d 20  ,.    tagName = 
e570: 67 65 74 54 61 67 4e 61 6d 65 28 6f 70 74 73 2e  getTagName(opts.
e580: 72 6f 6f 74 29 2c 0a 20 20 20 20 70 74 61 67 20  root),.    ptag 
e590: 3d 20 67 65 74 49 6d 6d 65 64 69 61 74 65 43 75  = getImmediateCu
e5a0: 73 74 6f 6d 50 61 72 65 6e 74 54 61 67 28 70 61  stomParentTag(pa
e5b0: 72 65 6e 74 29 0a 20 20 2f 2f 20 66 69 78 20 66  rent).  // fix f
e5c0: 6f 72 20 74 68 65 20 70 61 72 65 6e 74 20 61 74  or the parent at
e5d0: 74 72 69 62 75 74 65 20 69 6e 20 74 68 65 20 6c  tribute in the l
e5e0: 6f 6f 70 65 64 20 65 6c 65 6d 65 6e 74 73 0a 20  ooped elements. 
e5f0: 20 74 61 67 2e 70 61 72 65 6e 74 20 3d 20 70 74   tag.parent = pt
e600: 61 67 0a 20 20 2f 2f 20 73 74 6f 72 65 20 74 68  ag.  // store th
e610: 65 20 72 65 61 6c 20 70 61 72 65 6e 74 20 74 61  e real parent ta
e620: 67 0a 20 20 2f 2f 20 69 6e 20 73 6f 6d 65 20 63  g.  // in some c
e630: 61 73 65 73 20 74 68 69 73 20 63 6f 75 6c 64 20  ases this could 
e640: 62 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  be different fro
e650: 6d 20 74 68 65 20 63 75 73 74 6f 6d 20 70 61 72  m the custom par
e660: 65 6e 74 20 74 61 67 0a 20 20 2f 2f 20 66 6f 72  ent tag.  // for
e670: 20 65 78 61 6d 70 6c 65 20 69 6e 20 6e 65 73 74   example in nest
e680: 65 64 20 6c 6f 6f 70 73 0a 20 20 74 61 67 2e 5f  ed loops.  tag._
e690: 70 61 72 65 6e 74 20 3d 20 70 61 72 65 6e 74 0a  parent = parent.
e6a0: 0a 20 20 2f 2f 20 61 64 64 20 74 68 69 73 20 74  .  // add this t
e6b0: 61 67 20 74 6f 20 74 68 65 20 63 75 73 74 6f 6d  ag to the custom
e6c0: 20 70 61 72 65 6e 74 20 74 61 67 0a 20 20 61 64   parent tag.  ad
e6d0: 64 43 68 69 6c 64 54 61 67 28 74 61 67 2c 20 74  dChildTag(tag, t
e6e0: 61 67 4e 61 6d 65 2c 20 70 74 61 67 29 0a 20 20  agName, ptag).  
e6f0: 2f 2f 20 61 6e 64 20 61 6c 73 6f 20 74 6f 20 74  // and also to t
e700: 68 65 20 72 65 61 6c 20 70 61 72 65 6e 74 20 74  he real parent t
e710: 61 67 0a 20 20 69 66 20 28 70 74 61 67 20 21 3d  ag.  if (ptag !=
e720: 3d 20 70 61 72 65 6e 74 29 0a 20 20 20 20 61 64  = parent).    ad
e730: 64 43 68 69 6c 64 54 61 67 28 74 61 67 2c 20 74  dChildTag(tag, t
e740: 61 67 4e 61 6d 65 2c 20 70 61 72 65 6e 74 29 0a  agName, parent).
e750: 20 20 2f 2f 20 65 6d 70 74 79 20 74 68 65 20 63    // empty the c
e760: 68 69 6c 64 20 6e 6f 64 65 20 6f 6e 63 65 20 77  hild node once w
e770: 65 20 67 6f 74 20 69 74 73 20 74 65 6d 70 6c 61  e got its templa
e780: 74 65 0a 20 20 2f 2f 20 74 6f 20 61 76 6f 69 64  te.  // to avoid
e790: 20 74 68 61 74 20 69 74 73 20 63 68 69 6c 64 72   that its childr
e7a0: 65 6e 20 67 65 74 20 63 6f 6d 70 69 6c 65 64 20  en get compiled 
e7b0: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20  multiple times. 
e7c0: 20 6f 70 74 73 2e 72 6f 6f 74 2e 69 6e 6e 65 72   opts.root.inner
e7d0: 48 54 4d 4c 20 3d 20 27 27 0a 0a 20 20 72 65 74  HTML = ''..  ret
e7e0: 75 72 6e 20 74 61 67 0a 7d 0a 0a 2f 2a 2a 0a 20  urn tag.}../**. 
e7f0: 2a 20 4c 6f 6f 70 20 62 61 63 6b 77 61 72 64 20  * Loop backward 
e800: 61 6c 6c 20 74 68 65 20 70 61 72 65 6e 74 73 20  all the parents 
e810: 74 72 65 65 20 74 6f 20 64 65 74 65 63 74 20 74  tree to detect t
e820: 68 65 20 66 69 72 73 74 20 63 75 73 74 6f 6d 20  he first custom 
e830: 70 61 72 65 6e 74 20 74 61 67 0a 20 2a 20 40 70  parent tag. * @p
e840: 61 72 61 6d 20 20 20 7b 20 4f 62 6a 65 63 74 20  aram   { Object 
e850: 7d 20 74 61 67 20 2d 20 61 20 54 61 67 20 69 6e  } tag - a Tag in
e860: 73 74 61 6e 63 65 0a 20 2a 20 40 72 65 74 75 72  stance. * @retur
e870: 6e 73 20 7b 20 4f 62 6a 65 63 74 20 7d 20 74 68  ns { Object } th
e880: 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
e890: 65 20 66 69 72 73 74 20 63 75 73 74 6f 6d 20 70  e first custom p
e8a0: 61 72 65 6e 74 20 74 61 67 20 66 6f 75 6e 64 0a  arent tag found.
e8b0: 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 67 65 74   */.function get
e8c0: 49 6d 6d 65 64 69 61 74 65 43 75 73 74 6f 6d 50  ImmediateCustomP
e8d0: 61 72 65 6e 74 54 61 67 28 74 61 67 29 20 7b 0a  arentTag(tag) {.
e8e0: 20 20 76 61 72 20 70 74 61 67 20 3d 20 74 61 67    var ptag = tag
e8f0: 0a 20 20 77 68 69 6c 65 20 28 21 67 65 74 54 61  .  while (!getTa
e900: 67 28 70 74 61 67 2e 72 6f 6f 74 29 29 20 7b 0a  g(ptag.root)) {.
e910: 20 20 20 20 69 66 20 28 21 70 74 61 67 2e 70 61      if (!ptag.pa
e920: 72 65 6e 74 29 20 62 72 65 61 6b 0a 20 20 20 20  rent) break.    
e930: 70 74 61 67 20 3d 20 70 74 61 67 2e 70 61 72 65  ptag = ptag.pare
e940: 6e 74 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  nt.  }.  return 
e950: 70 74 61 67 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20 48  ptag.}../**. * H
e960: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 74  elper function t
e970: 6f 20 73 65 74 20 61 6e 20 69 6d 6d 75 74 61 62  o set an immutab
e980: 6c 65 20 70 72 6f 70 65 72 74 79 0a 20 2a 20 40  le property. * @
e990: 70 61 72 61 6d 20 20 20 7b 20 4f 62 6a 65 63 74  param   { Object
e9a0: 20 7d 20 65 6c 20 2d 20 6f 62 6a 65 63 74 20 77   } el - object w
e9b0: 68 65 72 65 20 74 68 65 20 6e 65 77 20 70 72 6f  here the new pro
e9c0: 70 65 72 74 79 20 77 69 6c 6c 20 62 65 20 73 65  perty will be se
e9d0: 74 0a 20 2a 20 40 70 61 72 61 6d 20 20 20 7b 20  t. * @param   { 
e9e0: 53 74 72 69 6e 67 20 7d 20 6b 65 79 20 2d 20 6f  String } key - o
e9f0: 62 6a 65 63 74 20 6b 65 79 20 77 68 65 72 65 20  bject key where 
ea00: 74 68 65 20 6e 65 77 20 70 72 6f 70 65 72 74 79  the new property
ea10: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a   will be stored.
ea20: 20 2a 20 40 70 61 72 61 6d 20 20 20 7b 20 2a 20   * @param   { * 
ea30: 7d 20 76 61 6c 75 65 20 2d 20 76 61 6c 75 65 20  } value - value 
ea40: 6f 66 20 74 68 65 20 6e 65 77 20 70 72 6f 70 65  of the new prope
ea50: 72 74 79 0a 2a 20 40 70 61 72 61 6d 20 20 20 7b  rty.* @param   {
ea60: 20 4f 62 6a 65 63 74 20 7d 20 6f 70 74 69 6f 6e   Object } option
ea70: 73 20 2d 20 73 65 74 20 74 68 65 20 70 72 6f 70  s - set the prop
ea80: 65 72 79 20 6f 76 65 72 72 69 64 69 6e 67 20 74  ery overriding t
ea90: 68 65 20 64 65 66 61 75 6c 74 20 6f 70 74 69 6f  he default optio
eaa0: 6e 73 0a 20 2a 20 40 72 65 74 75 72 6e 73 20 7b  ns. * @returns {
eab0: 20 4f 62 6a 65 63 74 20 7d 20 2d 20 74 68 65 20   Object } - the 
eac0: 69 6e 69 74 69 61 6c 20 6f 62 6a 65 63 74 0a 20  initial object. 
ead0: 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 64 65 66 69  */.function defi
eae0: 6e 65 50 72 6f 70 65 72 74 79 28 65 6c 2c 20 6b  neProperty(el, k
eaf0: 65 79 2c 20 76 61 6c 75 65 2c 20 6f 70 74 69 6f  ey, value, optio
eb00: 6e 73 29 20 7b 0a 20 20 4f 62 6a 65 63 74 2e 64  ns) {.  Object.d
eb10: 65 66 69 6e 65 50 72 6f 70 65 72 74 79 28 65 6c  efineProperty(el
eb20: 2c 20 6b 65 79 2c 20 65 78 74 65 6e 64 28 7b 0a  , key, extend({.
eb30: 20 20 20 20 76 61 6c 75 65 3a 20 76 61 6c 75 65      value: value
eb40: 2c 0a 20 20 20 20 65 6e 75 6d 65 72 61 62 6c 65  ,.    enumerable
eb50: 3a 20 66 61 6c 73 65 2c 0a 20 20 20 20 77 72 69  : false,.    wri
eb60: 74 61 62 6c 65 3a 20 66 61 6c 73 65 2c 0a 20 20  table: false,.  
eb70: 20 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 3a 20    configurable: 
eb80: 74 72 75 65 0a 20 20 7d 2c 20 6f 70 74 69 6f 6e  true.  }, option
eb90: 73 29 29 0a 20 20 72 65 74 75 72 6e 20 65 6c 0a  s)).  return el.
eba0: 7d 0a 0a 2f 2a 2a 0a 20 2a 20 47 65 74 20 74 68  }../**. * Get th
ebb0: 65 20 74 61 67 20 6e 61 6d 65 20 6f 66 20 61 6e  e tag name of an
ebc0: 79 20 44 4f 4d 20 6e 6f 64 65 0a 20 2a 20 40 70  y DOM node. * @p
ebd0: 61 72 61 6d 20 20 20 7b 20 4f 62 6a 65 63 74 20  aram   { Object 
ebe0: 7d 20 64 6f 6d 20 2d 20 44 4f 4d 20 6e 6f 64 65  } dom - DOM node
ebf0: 20 77 65 20 77 61 6e 74 20 74 6f 20 70 61 72 73   we want to pars
ec00: 65 0a 20 2a 20 40 72 65 74 75 72 6e 73 20 7b 20  e. * @returns { 
ec10: 53 74 72 69 6e 67 20 7d 20 6e 61 6d 65 20 74 6f  String } name to
ec20: 20 69 64 65 6e 74 69 66 79 20 74 68 69 73 20 64   identify this d
ec30: 6f 6d 20 6e 6f 64 65 20 69 6e 20 72 69 6f 74 0a  om node in riot.
ec40: 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 67 65 74   */.function get
ec50: 54 61 67 4e 61 6d 65 28 64 6f 6d 29 20 7b 0a 20  TagName(dom) {. 
ec60: 20 76 61 72 20 63 68 69 6c 64 20 3d 20 67 65 74   var child = get
ec70: 54 61 67 28 64 6f 6d 29 2c 0a 20 20 20 20 6e 61  Tag(dom),.    na
ec80: 6d 65 64 54 61 67 20 3d 20 67 65 74 41 74 74 72  medTag = getAttr
ec90: 28 64 6f 6d 2c 20 27 6e 61 6d 65 27 29 2c 0a 20  (dom, 'name'),. 
eca0: 20 20 20 74 61 67 4e 61 6d 65 20 3d 20 6e 61 6d     tagName = nam
ecb0: 65 64 54 61 67 20 26 26 20 21 74 6d 70 6c 2e 68  edTag && !tmpl.h
ecc0: 61 73 45 78 70 72 28 6e 61 6d 65 64 54 61 67 29  asExpr(namedTag)
ecd0: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
ece0: 20 20 20 6e 61 6d 65 64 54 61 67 20 3a 0a 20 20     namedTag :.  
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 69 6c              chil
ed00: 64 20 3f 20 63 68 69 6c 64 2e 6e 61 6d 65 20 3a  d ? child.name :
ed10: 20 64 6f 6d 2e 74 61 67 4e 61 6d 65 2e 74 6f 4c   dom.tagName.toL
ed20: 6f 77 65 72 43 61 73 65 28 29 0a 0a 20 20 72 65  owerCase()..  re
ed30: 74 75 72 6e 20 74 61 67 4e 61 6d 65 0a 7d 0a 0a  turn tagName.}..
ed40: 2f 2a 2a 0a 20 2a 20 45 78 74 65 6e 64 20 61 6e  /**. * Extend an
ed50: 79 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6f 74  y object with ot
ed60: 68 65 72 20 70 72 6f 70 65 72 74 69 65 73 0a 20  her properties. 
ed70: 2a 20 40 70 61 72 61 6d 20 20 20 7b 20 4f 62 6a  * @param   { Obj
ed80: 65 63 74 20 7d 20 73 72 63 20 2d 20 73 6f 75 72  ect } src - sour
ed90: 63 65 20 6f 62 6a 65 63 74 0a 20 2a 20 40 72 65  ce object. * @re
eda0: 74 75 72 6e 73 20 7b 20 4f 62 6a 65 63 74 20 7d  turns { Object }
edb0: 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 65   the resulting e
edc0: 78 74 65 6e 64 65 64 20 6f 62 6a 65 63 74 0a 20  xtended object. 
edd0: 2a 0a 20 2a 20 76 61 72 20 6f 62 6a 20 3d 20 7b  *. * var obj = {
ede0: 20 66 6f 6f 3a 20 27 62 61 7a 27 20 7d 0a 20 2a   foo: 'baz' }. *
edf0: 20 65 78 74 65 6e 64 28 6f 62 6a 2c 20 7b 62 61   extend(obj, {ba
ee00: 72 3a 20 27 62 61 72 27 2c 20 66 6f 6f 3a 20 27  r: 'bar', foo: '
ee10: 62 61 72 27 7d 29 0a 20 2a 20 63 6f 6e 73 6f 6c  bar'}). * consol
ee20: 65 2e 6c 6f 67 28 6f 62 6a 29 20 3d 3e 20 7b 62  e.log(obj) => {b
ee30: 61 72 3a 20 27 62 61 72 27 2c 20 66 6f 6f 3a 20  ar: 'bar', foo: 
ee40: 27 62 61 72 27 7d 0a 20 2a 0a 20 2a 2f 0a 66 75  'bar'}. *. */.fu
ee50: 6e 63 74 69 6f 6e 20 65 78 74 65 6e 64 28 73 72  nction extend(sr
ee60: 63 29 20 7b 0a 20 20 76 61 72 20 6f 62 6a 2c 20  c) {.  var obj, 
ee70: 61 72 67 73 20 3d 20 61 72 67 75 6d 65 6e 74 73  args = arguments
ee80: 0a 20 20 66 6f 72 20 28 76 61 72 20 69 20 3d 20  .  for (var i = 
ee90: 31 3b 20 69 20 3c 20 61 72 67 73 2e 6c 65 6e 67  1; i < args.leng
eea0: 74 68 3b 20 2b 2b 69 29 20 7b 0a 20 20 20 20 69  th; ++i) {.    i
eeb0: 66 20 28 6f 62 6a 20 3d 20 61 72 67 73 5b 69 5d  f (obj = args[i]
eec0: 29 20 7b 0a 20 20 20 20 20 20 66 6f 72 20 28 76  ) {.      for (v
eed0: 61 72 20 6b 65 79 20 69 6e 20 6f 62 6a 29 20 7b  ar key in obj) {
eee0: 0a 20 20 20 20 20 20 20 20 2f 2f 20 63 68 65 63  .        // chec
eef0: 6b 20 69 66 20 74 68 69 73 20 70 72 6f 70 65 72  k if this proper
ef00: 74 79 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65  ty of the source
ef10: 20 6f 62 6a 65 63 74 20 63 6f 75 6c 64 20 62 65   object could be
ef20: 20 6f 76 65 72 72 69 64 64 65 6e 0a 20 20 20 20   overridden.    
ef30: 20 20 20 20 69 66 20 28 69 73 57 72 69 74 61 62      if (isWritab
ef40: 6c 65 28 73 72 63 2c 20 6b 65 79 29 29 0a 20 20  le(src, key)).  
ef50: 20 20 20 20 20 20 20 20 73 72 63 5b 6b 65 79 5d          src[key]
ef60: 20 3d 20 6f 62 6a 5b 6b 65 79 5d 0a 20 20 20 20   = obj[key].    
ef70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
ef80: 72 65 74 75 72 6e 20 73 72 63 0a 7d 0a 0a 2f 2a  return src.}../*
ef90: 2a 0a 20 2a 20 43 68 65 63 6b 20 77 68 65 74 68  *. * Check wheth
efa0: 65 72 20 61 6e 20 61 72 72 61 79 20 63 6f 6e 74  er an array cont
efb0: 61 69 6e 73 20 61 6e 20 69 74 65 6d 0a 20 2a 20  ains an item. * 
efc0: 40 70 61 72 61 6d 20 20 20 7b 20 41 72 72 61 79  @param   { Array
efd0: 20 7d 20 61 72 72 20 2d 20 74 61 72 67 65 74 20   } arr - target 
efe0: 61 72 72 61 79 0a 20 2a 20 40 70 61 72 61 6d 20  array. * @param 
eff0: 20 20 7b 20 2a 20 7d 20 69 74 65 6d 20 2d 20 69    { * } item - i
f000: 74 65 6d 20 74 6f 20 74 65 73 74 0a 20 2a 20 40  tem to test. * @
f010: 72 65 74 75 72 6e 73 20 7b 20 42 6f 6f 6c 65 61  returns { Boolea
f020: 6e 20 7d 20 44 6f 65 73 20 27 61 72 72 27 20 63  n } Does 'arr' c
f030: 6f 6e 74 61 69 6e 20 27 69 74 65 6d 27 3f 0a 20  ontain 'item'?. 
f040: 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74  */.function cont
f050: 61 69 6e 73 28 61 72 72 2c 20 69 74 65 6d 29 20  ains(arr, item) 
f060: 7b 0a 20 20 72 65 74 75 72 6e 20 7e 61 72 72 2e  {.  return ~arr.
f070: 69 6e 64 65 78 4f 66 28 69 74 65 6d 29 0a 7d 0a  indexOf(item).}.
f080: 0a 2f 2a 2a 0a 20 2a 20 43 68 65 63 6b 20 77 68  ./**. * Check wh
f090: 65 74 68 65 72 20 61 6e 20 6f 62 6a 65 63 74 20  ether an object 
f0a0: 69 73 20 61 20 6b 69 6e 64 20 6f 66 20 61 72 72  is a kind of arr
f0b0: 61 79 0a 20 2a 20 40 70 61 72 61 6d 20 20 20 7b  ay. * @param   {
f0c0: 20 2a 20 7d 20 61 20 2d 20 61 6e 79 74 68 69 6e   * } a - anythin
f0d0: 67 0a 20 2a 20 40 72 65 74 75 72 6e 73 20 7b 42  g. * @returns {B
f0e0: 6f 6f 6c 65 61 6e 7d 20 69 73 20 27 61 27 20 61  oolean} is 'a' a
f0f0: 6e 20 61 72 72 61 79 3f 0a 20 2a 2f 0a 66 75 6e  n array?. */.fun
f100: 63 74 69 6f 6e 20 69 73 41 72 72 61 79 28 61 29  ction isArray(a)
f110: 20 7b 20 72 65 74 75 72 6e 20 41 72 72 61 79 2e   { return Array.
f120: 69 73 41 72 72 61 79 28 61 29 20 7c 7c 20 61 20  isArray(a) || a 
f130: 69 6e 73 74 61 6e 63 65 6f 66 20 41 72 72 61 79  instanceof Array
f140: 20 7d 0a 0a 2f 2a 2a 0a 20 2a 20 44 65 74 65 63   }../**. * Detec
f150: 74 20 77 68 65 74 68 65 72 20 61 20 70 72 6f 70  t whether a prop
f160: 65 72 74 79 20 6f 66 20 61 6e 20 6f 62 6a 65 63  erty of an objec
f170: 74 20 63 6f 75 6c 64 20 62 65 20 6f 76 65 72 72  t could be overr
f180: 69 64 64 65 6e 0a 20 2a 20 40 70 61 72 61 6d 20  idden. * @param 
f190: 20 20 7b 20 4f 62 6a 65 63 74 20 7d 20 20 6f 62    { Object }  ob
f1a0: 6a 20 2d 20 73 6f 75 72 63 65 20 6f 62 6a 65 63  j - source objec
f1b0: 74 0a 20 2a 20 40 70 61 72 61 6d 20 20 20 7b 20  t. * @param   { 
f1c0: 53 74 72 69 6e 67 20 7d 20 20 6b 65 79 20 2d 20  String }  key - 
f1d0: 6f 62 6a 65 63 74 20 70 72 6f 70 65 72 74 79 0a  object property.
f1e0: 20 2a 20 40 72 65 74 75 72 6e 73 20 7b 20 42 6f   * @returns { Bo
f1f0: 6f 6c 65 61 6e 20 7d 20 69 73 20 74 68 69 73 20  olean } is this 
f200: 70 72 6f 70 65 72 74 79 20 77 72 69 74 61 62 6c  property writabl
f210: 65 3f 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20  e?. */.function 
f220: 69 73 57 72 69 74 61 62 6c 65 28 6f 62 6a 2c 20  isWritable(obj, 
f230: 6b 65 79 29 20 7b 0a 20 20 76 61 72 20 70 72 6f  key) {.  var pro
f240: 70 73 20 3d 20 4f 62 6a 65 63 74 2e 67 65 74 4f  ps = Object.getO
f250: 77 6e 50 72 6f 70 65 72 74 79 44 65 73 63 72 69  wnPropertyDescri
f260: 70 74 6f 72 28 6f 62 6a 2c 20 6b 65 79 29 0a 20  ptor(obj, key). 
f270: 20 72 65 74 75 72 6e 20 74 79 70 65 6f 66 20 6f   return typeof o
f280: 62 6a 5b 6b 65 79 5d 20 3d 3d 3d 20 54 5f 55 4e  bj[key] === T_UN
f290: 44 45 46 20 7c 7c 20 70 72 6f 70 73 20 26 26 20  DEF || props && 
f2a0: 70 72 6f 70 73 2e 77 72 69 74 61 62 6c 65 0a 7d  props.writable.}
f2b0: 0a 0a 0a 2f 2a 2a 0a 20 2a 20 57 69 74 68 20 74  .../**. * With t
f2c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 20  his function we 
f2d0: 61 76 6f 69 64 20 74 68 61 74 20 74 68 65 20 69  avoid that the i
f2e0: 6e 74 65 72 6e 61 6c 20 54 61 67 20 6d 65 74 68  nternal Tag meth
f2f0: 6f 64 73 20 67 65 74 20 6f 76 65 72 72 69 64 64  ods get overridd
f300: 65 6e 0a 20 2a 20 40 70 61 72 61 6d 20 20 20 7b  en. * @param   {
f310: 20 4f 62 6a 65 63 74 20 7d 20 64 61 74 61 20 2d   Object } data -
f320: 20 6f 70 74 69 6f 6e 73 20 77 65 20 77 61 6e 74   options we want
f330: 20 74 6f 20 75 73 65 20 74 6f 20 65 78 74 65 6e   to use to exten
f340: 64 20 74 68 65 20 74 61 67 20 69 6e 73 74 61 6e  d the tag instan
f350: 63 65 0a 20 2a 20 40 72 65 74 75 72 6e 73 20 7b  ce. * @returns {
f360: 20 4f 62 6a 65 63 74 20 7d 20 63 6c 65 61 6e 20   Object } clean 
f370: 6f 62 6a 65 63 74 20 77 69 74 68 6f 75 74 20 63  object without c
f380: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 69  ontaining the ri
f390: 6f 74 20 69 6e 74 65 72 6e 61 6c 20 72 65 73 65  ot internal rese
f3a0: 72 76 65 64 20 77 6f 72 64 73 0a 20 2a 2f 0a 66  rved words. */.f
f3b0: 75 6e 63 74 69 6f 6e 20 63 6c 65 61 6e 55 70 44  unction cleanUpD
f3c0: 61 74 61 28 64 61 74 61 29 20 7b 0a 20 20 69 66  ata(data) {.  if
f3d0: 20 28 21 28 64 61 74 61 20 69 6e 73 74 61 6e 63   (!(data instanc
f3e0: 65 6f 66 20 54 61 67 29 20 26 26 20 21 28 64 61  eof Tag) && !(da
f3f0: 74 61 20 26 26 20 74 79 70 65 6f 66 20 64 61 74  ta && typeof dat
f400: 61 2e 74 72 69 67 67 65 72 20 3d 3d 20 54 5f 46  a.trigger == T_F
f410: 55 4e 43 54 49 4f 4e 29 29 0a 20 20 20 20 72 65  UNCTION)).    re
f420: 74 75 72 6e 20 64 61 74 61 0a 0a 20 20 76 61 72  turn data..  var
f430: 20 6f 20 3d 20 7b 7d 0a 20 20 66 6f 72 20 28 76   o = {}.  for (v
f440: 61 72 20 6b 65 79 20 69 6e 20 64 61 74 61 29 20  ar key in data) 
f450: 7b 0a 20 20 20 20 69 66 20 28 21 52 45 53 45 52  {.    if (!RESER
f460: 56 45 44 5f 57 4f 52 44 53 5f 42 4c 41 43 4b 4c  VED_WORDS_BLACKL
f470: 49 53 54 2e 74 65 73 74 28 6b 65 79 29 29 20 6f  IST.test(key)) o
f480: 5b 6b 65 79 5d 20 3d 20 64 61 74 61 5b 6b 65 79  [key] = data[key
f490: 5d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f  ].  }.  return o
f4a0: 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20 57 61 6c 6b 20  .}../**. * Walk 
f4b0: 64 6f 77 6e 20 72 65 63 75 72 73 69 76 65 6c 79  down recursively
f4c0: 20 61 6c 6c 20 74 68 65 20 63 68 69 6c 64 72 65   all the childre
f4d0: 6e 20 74 61 67 73 20 73 74 61 72 74 69 6e 67 20  n tags starting 
f4e0: 64 6f 6d 20 6e 6f 64 65 0a 20 2a 20 40 70 61 72  dom node. * @par
f4f0: 61 6d 20 20 20 7b 20 4f 62 6a 65 63 74 20 7d 20  am   { Object } 
f500: 20 20 64 6f 6d 20 2d 20 73 74 61 72 74 69 6e 67    dom - starting
f510: 20 6e 6f 64 65 20 77 68 65 72 65 20 77 65 20 77   node where we w
f520: 69 6c 6c 20 73 74 61 72 74 20 74 68 65 20 72 65  ill start the re
f530: 63 75 72 73 69 6f 6e 0a 20 2a 20 40 70 61 72 61  cursion. * @para
f540: 6d 20 20 20 7b 20 46 75 6e 63 74 69 6f 6e 20 7d  m   { Function }
f550: 20 66 6e 20 2d 20 63 61 6c 6c 62 61 63 6b 20 74   fn - callback t
f560: 6f 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20  o transform the 
f570: 63 68 69 6c 64 20 6e 6f 64 65 20 6a 75 73 74 20  child node just 
f580: 66 6f 75 6e 64 0a 20 2a 2f 0a 66 75 6e 63 74 69  found. */.functi
f590: 6f 6e 20 77 61 6c 6b 28 64 6f 6d 2c 20 66 6e 29  on walk(dom, fn)
f5a0: 20 7b 0a 20 20 69 66 20 28 64 6f 6d 29 20 7b 0a   {.  if (dom) {.
f5b0: 20 20 20 20 2f 2f 20 73 74 6f 70 20 74 68 65 20      // stop the 
f5c0: 72 65 63 75 72 73 69 6f 6e 0a 20 20 20 20 69 66  recursion.    if
f5d0: 20 28 66 6e 28 64 6f 6d 29 20 3d 3d 3d 20 66 61   (fn(dom) === fa
f5e0: 6c 73 65 29 20 72 65 74 75 72 6e 0a 20 20 20 20  lse) return.    
f5f0: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 64 6f 6d  else {.      dom
f600: 20 3d 20 64 6f 6d 2e 66 69 72 73 74 43 68 69 6c   = dom.firstChil
f610: 64 0a 0a 20 20 20 20 20 20 77 68 69 6c 65 20 28  d..      while (
f620: 64 6f 6d 29 20 7b 0a 20 20 20 20 20 20 20 20 77  dom) {.        w
f630: 61 6c 6b 28 64 6f 6d 2c 20 66 6e 29 0a 20 20 20  alk(dom, fn).   
f640: 20 20 20 20 20 64 6f 6d 20 3d 20 64 6f 6d 2e 6e       dom = dom.n
f650: 65 78 74 53 69 62 6c 69 6e 67 0a 20 20 20 20 20  extSibling.     
f660: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
f670: 2f 2a 2a 0a 20 2a 20 4d 69 6e 69 6d 69 7a 65 20  /**. * Minimize 
f680: 72 69 73 6b 3a 20 6f 6e 6c 79 20 7a 65 72 6f 20  risk: only zero 
f690: 6f 72 20 6f 6e 65 20 5f 73 70 61 63 65 5f 20 62  or one _space_ b
f6a0: 65 74 77 65 65 6e 20 61 74 74 72 20 26 20 76 61  etween attr & va
f6b0: 6c 75 65 0a 20 2a 20 40 70 61 72 61 6d 20 20 20  lue. * @param   
f6c0: 7b 20 53 74 72 69 6e 67 20 7d 20 20 20 68 74 6d  { String }   htm
f6d0: 6c 20 2d 20 68 74 6d 6c 20 73 74 72 69 6e 67 20  l - html string 
f6e0: 77 65 20 77 61 6e 74 20 74 6f 20 70 61 72 73 65  we want to parse
f6f0: 0a 20 2a 20 40 70 61 72 61 6d 20 20 20 7b 20 46  . * @param   { F
f700: 75 6e 63 74 69 6f 6e 20 7d 20 66 6e 20 2d 20 63  unction } fn - c
f710: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
f720: 20 74 6f 20 61 70 70 6c 79 20 6f 6e 20 61 6e 79   to apply on any
f730: 20 61 74 74 72 69 62 75 74 65 20 66 6f 75 6e 64   attribute found
f740: 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 77 61  . */.function wa
f750: 6c 6b 41 74 74 72 69 62 75 74 65 73 28 68 74 6d  lkAttributes(htm
f760: 6c 2c 20 66 6e 29 20 7b 0a 20 20 76 61 72 20 6d  l, fn) {.  var m
f770: 2c 0a 20 20 20 20 72 65 20 3d 20 2f 28 5b 2d 5c  ,.    re = /([-\
f780: 77 5d 2b 29 20 3f 3d 20 3f 28 3f 3a 22 28 5b 5e  w]+) ?= ?(?:"([^
f790: 22 5d 2a 29 7c 27 28 5b 5e 27 5d 2a 29 7c 28 7b  "]*)|'([^']*)|({
f7a0: 5b 5e 7d 5d 2a 7d 29 29 2f 67 0a 0a 20 20 77 68  [^}]*}))/g..  wh
f7b0: 69 6c 65 20 28 6d 20 3d 20 72 65 2e 65 78 65 63  ile (m = re.exec
f7c0: 28 68 74 6d 6c 29 29 20 7b 0a 20 20 20 20 66 6e  (html)) {.    fn
f7d0: 28 6d 5b 31 5d 2e 74 6f 4c 6f 77 65 72 43 61 73  (m[1].toLowerCas
f7e0: 65 28 29 2c 20 6d 5b 32 5d 20 7c 7c 20 6d 5b 33  e(), m[2] || m[3
f7f0: 5d 20 7c 7c 20 6d 5b 34 5d 29 0a 20 20 7d 0a 7d  ] || m[4]).  }.}
f800: 0a 0a 2f 2a 2a 0a 20 2a 20 43 68 65 63 6b 20 77  ../**. * Check w
f810: 68 65 74 68 65 72 20 61 20 44 4f 4d 20 6e 6f 64  hether a DOM nod
f820: 65 20 69 73 20 69 6e 20 73 74 75 62 20 6d 6f 64  e is in stub mod
f830: 65 2c 20 75 73 65 66 75 6c 20 66 6f 72 20 74 68  e, useful for th
f840: 65 20 72 69 6f 74 20 27 69 66 27 20 64 69 72 65  e riot 'if' dire
f850: 63 74 69 76 65 0a 20 2a 20 40 70 61 72 61 6d 20  ctive. * @param 
f860: 20 20 7b 20 4f 62 6a 65 63 74 20 7d 20 20 64 6f    { Object }  do
f870: 6d 20 2d 20 44 4f 4d 20 6e 6f 64 65 20 77 65 20  m - DOM node we 
f880: 77 61 6e 74 20 74 6f 20 70 61 72 73 65 0a 20 2a  want to parse. *
f890: 20 40 72 65 74 75 72 6e 73 20 7b 20 42 6f 6f 6c   @returns { Bool
f8a0: 65 61 6e 20 7d 20 2d 0a 20 2a 2f 0a 66 75 6e 63  ean } -. */.func
f8b0: 74 69 6f 6e 20 69 73 49 6e 53 74 75 62 28 64 6f  tion isInStub(do
f8c0: 6d 29 20 7b 0a 20 20 77 68 69 6c 65 20 28 64 6f  m) {.  while (do
f8d0: 6d 29 20 7b 0a 20 20 20 20 69 66 20 28 64 6f 6d  m) {.    if (dom
f8e0: 2e 69 6e 53 74 75 62 29 20 72 65 74 75 72 6e 20  .inStub) return 
f8f0: 74 72 75 65 0a 20 20 20 20 64 6f 6d 20 3d 20 64  true.    dom = d
f900: 6f 6d 2e 70 61 72 65 6e 74 4e 6f 64 65 0a 20 20  om.parentNode.  
f910: 7d 0a 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65  }.  return false
f920: 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20 43 72 65 61 74  .}../**. * Creat
f930: 65 20 61 20 67 65 6e 65 72 69 63 20 44 4f 4d 20  e a generic DOM 
f940: 6e 6f 64 65 0a 20 2a 20 40 70 61 72 61 6d 20 20  node. * @param  
f950: 20 7b 20 53 74 72 69 6e 67 20 7d 20 6e 61 6d 65   { String } name
f960: 20 2d 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 44   - name of the D
f970: 4f 4d 20 6e 6f 64 65 20 77 65 20 77 61 6e 74 20  OM node we want 
f980: 74 6f 20 63 72 65 61 74 65 0a 20 2a 20 40 70 61  to create. * @pa
f990: 72 61 6d 20 20 20 7b 20 42 6f 6f 6c 65 61 6e 20  ram   { Boolean 
f9a0: 7d 20 69 73 53 76 67 20 2d 20 73 68 6f 75 6c 64  } isSvg - should
f9b0: 20 77 65 20 75 73 65 20 61 20 53 56 47 20 61 73   we use a SVG as
f9c0: 20 70 61 72 65 6e 74 20 6e 6f 64 65 3f 0a 20 2a   parent node?. *
f9d0: 20 40 72 65 74 75 72 6e 73 20 7b 20 4f 62 6a 65   @returns { Obje
f9e0: 63 74 20 7d 20 44 4f 4d 20 6e 6f 64 65 20 6a 75  ct } DOM node ju
f9f0: 73 74 20 63 72 65 61 74 65 64 0a 20 2a 2f 0a 66  st created. */.f
fa00: 75 6e 63 74 69 6f 6e 20 6d 6b 45 6c 28 6e 61 6d  unction mkEl(nam
fa10: 65 2c 20 69 73 53 76 67 29 20 7b 0a 20 20 72 65  e, isSvg) {.  re
fa20: 74 75 72 6e 20 69 73 53 76 67 20 3f 0a 20 20 20  turn isSvg ?.   
fa30: 20 64 6f 63 75 6d 65 6e 74 2e 63 72 65 61 74 65   document.create
fa40: 45 6c 65 6d 65 6e 74 4e 53 28 27 68 74 74 70 3a  ElementNS('http:
fa50: 2f 2f 77 77 77 2e 77 33 2e 6f 72 67 2f 32 30 30  //www.w3.org/200
fa60: 30 2f 73 76 67 27 2c 20 27 73 76 67 27 29 20 3a  0/svg', 'svg') :
fa70: 0a 20 20 20 20 64 6f 63 75 6d 65 6e 74 2e 63 72  .    document.cr
fa80: 65 61 74 65 45 6c 65 6d 65 6e 74 28 6e 61 6d 65  eateElement(name
fa90: 29 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20 53 68 6f 72  ).}../**. * Shor
faa0: 74 65 72 20 61 6e 64 20 66 61 73 74 20 77 61 79  ter and fast way
fab0: 20 74 6f 20 73 65 6c 65 63 74 20 6d 75 6c 74 69   to select multi
fac0: 70 6c 65 20 6e 6f 64 65 73 20 69 6e 20 74 68 65  ple nodes in the
fad0: 20 44 4f 4d 0a 20 2a 20 40 70 61 72 61 6d 20 20   DOM. * @param  
fae0: 20 7b 20 53 74 72 69 6e 67 20 7d 20 73 65 6c 65   { String } sele
faf0: 63 74 6f 72 20 2d 20 44 4f 4d 20 73 65 6c 65 63  ctor - DOM selec
fb00: 74 6f 72 0a 20 2a 20 40 70 61 72 61 6d 20 20 20  tor. * @param   
fb10: 7b 20 4f 62 6a 65 63 74 20 7d 20 63 74 78 20 2d  { Object } ctx -
fb20: 20 44 4f 4d 20 6e 6f 64 65 20 77 68 65 72 65 20   DOM node where 
fb30: 74 68 65 20 74 61 72 67 65 74 73 20 6f 66 20 6f  the targets of o
fb40: 75 72 20 73 65 61 72 63 68 20 77 69 6c 6c 20 69  ur search will i
fb50: 73 20 6c 6f 63 61 74 65 64 0a 20 2a 20 40 72 65  s located. * @re
fb60: 74 75 72 6e 73 20 7b 20 4f 62 6a 65 63 74 20 7d  turns { Object }
fb70: 20 64 6f 6d 20 6e 6f 64 65 73 20 66 6f 75 6e 64   dom nodes found
fb80: 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 24 24  . */.function $$
fb90: 28 73 65 6c 65 63 74 6f 72 2c 20 63 74 78 29 20  (selector, ctx) 
fba0: 7b 0a 20 20 72 65 74 75 72 6e 20 28 63 74 78 20  {.  return (ctx 
fbb0: 7c 7c 20 64 6f 63 75 6d 65 6e 74 29 2e 71 75 65  || document).que
fbc0: 72 79 53 65 6c 65 63 74 6f 72 41 6c 6c 28 73 65  rySelectorAll(se
fbd0: 6c 65 63 74 6f 72 29 0a 7d 0a 0a 2f 2a 2a 0a 20  lector).}../**. 
fbe0: 2a 20 53 68 6f 72 74 65 72 20 61 6e 64 20 66 61  * Shorter and fa
fbf0: 73 74 20 77 61 79 20 74 6f 20 73 65 6c 65 63 74  st way to select
fc00: 20 61 20 73 69 6e 67 6c 65 20 6e 6f 64 65 20 69   a single node i
fc10: 6e 20 74 68 65 20 44 4f 4d 0a 20 2a 20 40 70 61  n the DOM. * @pa
fc20: 72 61 6d 20 20 20 7b 20 53 74 72 69 6e 67 20 7d  ram   { String }
fc30: 20 73 65 6c 65 63 74 6f 72 20 2d 20 75 6e 69 71   selector - uniq
fc40: 75 65 20 64 6f 6d 20 73 65 6c 65 63 74 6f 72 0a  ue dom selector.
fc50: 20 2a 20 40 70 61 72 61 6d 20 20 20 7b 20 4f 62   * @param   { Ob
fc60: 6a 65 63 74 20 7d 20 63 74 78 20 2d 20 44 4f 4d  ject } ctx - DOM
fc70: 20 6e 6f 64 65 20 77 68 65 72 65 20 74 68 65 20   node where the 
fc80: 74 61 72 67 65 74 20 6f 66 20 6f 75 72 20 73 65  target of our se
fc90: 61 72 63 68 20 77 69 6c 6c 20 69 73 20 6c 6f 63  arch will is loc
fca0: 61 74 65 64 0a 20 2a 20 40 72 65 74 75 72 6e 73  ated. * @returns
fcb0: 20 7b 20 4f 62 6a 65 63 74 20 7d 20 64 6f 6d 20   { Object } dom 
fcc0: 6e 6f 64 65 20 66 6f 75 6e 64 0a 20 2a 2f 0a 66  node found. */.f
fcd0: 75 6e 63 74 69 6f 6e 20 24 28 73 65 6c 65 63 74  unction $(select
fce0: 6f 72 2c 20 63 74 78 29 20 7b 0a 20 20 72 65 74  or, ctx) {.  ret
fcf0: 75 72 6e 20 28 63 74 78 20 7c 7c 20 64 6f 63 75  urn (ctx || docu
fd00: 6d 65 6e 74 29 2e 71 75 65 72 79 53 65 6c 65 63  ment).querySelec
fd10: 74 6f 72 28 73 65 6c 65 63 74 6f 72 29 0a 7d 0a  tor(selector).}.
fd20: 0a 2f 2a 2a 0a 20 2a 20 53 69 6d 70 6c 65 20 6f  ./**. * Simple o
fd30: 62 6a 65 63 74 20 70 72 6f 74 6f 74 79 70 61 6c  bject prototypal
fd40: 20 69 6e 68 65 72 69 74 61 6e 63 65 0a 20 2a 20   inheritance. * 
fd50: 40 70 61 72 61 6d 20 20 20 7b 20 4f 62 6a 65 63  @param   { Objec
fd60: 74 20 7d 20 70 61 72 65 6e 74 20 2d 20 70 61 72  t } parent - par
fd70: 65 6e 74 20 6f 62 6a 65 63 74 0a 20 2a 20 40 72  ent object. * @r
fd80: 65 74 75 72 6e 73 20 7b 20 4f 62 6a 65 63 74 20  eturns { Object 
fd90: 7d 20 63 68 69 6c 64 20 69 6e 73 74 61 6e 63 65  } child instance
fda0: 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 69 6e  . */.function in
fdb0: 68 65 72 69 74 28 70 61 72 65 6e 74 29 20 7b 0a  herit(parent) {.
fdc0: 20 20 66 75 6e 63 74 69 6f 6e 20 43 68 69 6c 64    function Child
fdd0: 28 29 20 7b 7d 0a 20 20 43 68 69 6c 64 2e 70 72  () {}.  Child.pr
fde0: 6f 74 6f 74 79 70 65 20 3d 20 70 61 72 65 6e 74  ototype = parent
fdf0: 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 20 43 68  .  return new Ch
fe00: 69 6c 64 28 29 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20  ild().}../**. * 
fe10: 47 65 74 20 74 68 65 20 6e 61 6d 65 20 70 72 6f  Get the name pro
fe20: 70 65 72 74 79 20 6e 65 65 64 65 64 20 74 6f 20  perty needed to 
fe30: 69 64 65 6e 74 69 66 79 20 61 20 44 4f 4d 20 6e  identify a DOM n
fe40: 6f 64 65 20 69 6e 20 72 69 6f 74 0a 20 2a 20 40  ode in riot. * @
fe50: 70 61 72 61 6d 20 20 20 7b 20 4f 62 6a 65 63 74  param   { Object
fe60: 20 7d 20 64 6f 6d 20 2d 20 44 4f 4d 20 6e 6f 64   } dom - DOM nod
fe70: 65 20 77 65 20 6e 65 65 64 20 74 6f 20 70 61 72  e we need to par
fe80: 73 65 0a 20 2a 20 40 72 65 74 75 72 6e 73 20 7b  se. * @returns {
fe90: 20 53 74 72 69 6e 67 20 7c 20 75 6e 64 65 66 69   String | undefi
fea0: 6e 65 64 20 7d 20 67 69 76 65 20 75 73 20 62 61  ned } give us ba
feb0: 63 6b 20 61 20 73 74 72 69 6e 67 20 74 6f 20 69  ck a string to i
fec0: 64 65 6e 74 69 66 79 20 74 68 69 73 20 64 6f 6d  dentify this dom
fed0: 20 6e 6f 64 65 0a 20 2a 2f 0a 66 75 6e 63 74 69   node. */.functi
fee0: 6f 6e 20 67 65 74 4e 61 6d 65 64 4b 65 79 28 64  on getNamedKey(d
fef0: 6f 6d 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 67  om) {.  return g
ff00: 65 74 41 74 74 72 28 64 6f 6d 2c 20 27 69 64 27  etAttr(dom, 'id'
ff10: 29 20 7c 7c 20 67 65 74 41 74 74 72 28 64 6f 6d  ) || getAttr(dom
ff20: 2c 20 27 6e 61 6d 65 27 29 0a 7d 0a 0a 2f 2a 2a  , 'name').}../**
ff30: 0a 20 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65  . * Set the name
ff40: 64 20 70 72 6f 70 65 72 74 69 65 73 20 6f 66 20  d properties of 
ff50: 61 20 74 61 67 20 65 6c 65 6d 65 6e 74 0a 20 2a  a tag element. *
ff60: 20 40 70 61 72 61 6d 20 7b 20 4f 62 6a 65 63 74   @param { Object
ff70: 20 7d 20 64 6f 6d 20 2d 20 44 4f 4d 20 6e 6f 64   } dom - DOM nod
ff80: 65 20 77 65 20 6e 65 65 64 20 74 6f 20 70 61 72  e we need to par
ff90: 73 65 0a 20 2a 20 40 70 61 72 61 6d 20 7b 20 4f  se. * @param { O
ffa0: 62 6a 65 63 74 20 7d 20 70 61 72 65 6e 74 20 2d  bject } parent -
ffb0: 20 74 61 67 20 69 6e 73 74 61 6e 63 65 20 77 68   tag instance wh
ffc0: 65 72 65 20 74 68 65 20 6e 61 6d 65 64 20 64 6f  ere the named do
ffd0: 6d 20 65 6c 65 6d 65 6e 74 20 77 69 6c 6c 20 62  m element will b
ffe0: 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 61 64 64  e eventually add
fff0: 65 64 0a 20 2a 20 40 70 61 72 61 6d 20 7b 20 41  ed. * @param { A
10000 72 72 61 79 20 7d 20 6b 65 79 73 20 2d 20 6c 69  rray } keys - li
10010 73 74 20 6f 66 20 61 6c 6c 20 74 68 65 20 74 61  st of all the ta
10020 67 20 69 6e 73 74 61 6e 63 65 20 70 72 6f 70 65  g instance prope
10030 72 74 69 65 73 0a 20 2a 2f 0a 66 75 6e 63 74 69  rties. */.functi
10040 6f 6e 20 73 65 74 4e 61 6d 65 64 28 64 6f 6d 2c  on setNamed(dom,
10050 20 70 61 72 65 6e 74 2c 20 6b 65 79 73 29 20 7b   parent, keys) {
10060 0a 20 20 2f 2f 20 67 65 74 20 74 68 65 20 6b 65  .  // get the ke
10070 79 20 76 61 6c 75 65 20 77 65 20 77 61 6e 74 20  y value we want 
10080 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 74 61  to add to the ta
10090 67 20 69 6e 73 74 61 6e 63 65 0a 20 20 76 61 72  g instance.  var
100a0 20 6b 65 79 20 3d 20 67 65 74 4e 61 6d 65 64 4b   key = getNamedK
100b0 65 79 28 64 6f 6d 29 2c 0a 20 20 20 20 69 73 41  ey(dom),.    isA
100c0 72 72 2c 0a 20 20 20 20 2f 2f 20 61 64 64 20 74  rr,.    // add t
100d0 68 65 20 6e 6f 64 65 20 64 65 74 65 63 74 65 64  he node detected
100e0 20 74 6f 20 61 20 74 61 67 20 69 6e 73 74 61 6e   to a tag instan
100f0 63 65 20 75 73 69 6e 67 20 74 68 65 20 6e 61 6d  ce using the nam
10100 65 64 20 70 72 6f 70 65 72 74 79 0a 20 20 20 20  ed property.    
10110 61 64 64 20 3d 20 66 75 6e 63 74 69 6f 6e 28 76  add = function(v
10120 61 6c 75 65 29 20 7b 0a 20 20 20 20 20 20 2f 2f  alue) {.      //
10130 20 61 76 6f 69 64 20 74 6f 20 6f 76 65 72 72 69   avoid to overri
10140 64 65 20 74 68 65 20 74 61 67 20 70 72 6f 70 65  de the tag prope
10150 72 74 69 65 73 20 61 6c 72 65 61 64 79 20 73 65  rties already se
10160 74 0a 20 20 20 20 20 20 69 66 20 28 63 6f 6e 74  t.      if (cont
10170 61 69 6e 73 28 6b 65 79 73 2c 20 6b 65 79 29 29  ains(keys, key))
10180 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20 2f 2f   return.      //
10190 20 63 68 65 63 6b 20 77 68 65 74 68 65 72 20 74   check whether t
101a0 68 69 73 20 76 61 6c 75 65 20 69 73 20 61 6e 20  his value is an 
101b0 61 72 72 61 79 0a 20 20 20 20 20 20 69 73 41 72  array.      isAr
101c0 72 20 3d 20 69 73 41 72 72 61 79 28 76 61 6c 75  r = isArray(valu
101d0 65 29 0a 20 20 20 20 20 20 2f 2f 20 69 66 20 74  e).      // if t
101e0 68 65 20 6b 65 79 20 77 61 73 20 6e 65 76 65 72  he key was never
101f0 20 73 65 74 0a 20 20 20 20 20 20 69 66 20 28 21   set.      if (!
10200 76 61 6c 75 65 29 0a 20 20 20 20 20 20 20 20 2f  value).        /
10210 2f 20 73 65 74 20 69 74 20 6f 6e 63 65 20 6f 6e  / set it once on
10220 20 74 68 65 20 74 61 67 20 69 6e 73 74 61 6e 63   the tag instanc
10230 65 0a 20 20 20 20 20 20 20 20 70 61 72 65 6e 74  e.        parent
10240 5b 6b 65 79 5d 20 3d 20 64 6f 6d 0a 20 20 20 20  [key] = dom.    
10250 20 20 2f 2f 20 69 66 20 69 74 20 77 61 73 20 61    // if it was a
10260 6e 20 61 72 72 61 79 20 61 6e 64 20 6e 6f 74 20  n array and not 
10270 79 65 74 20 73 65 74 0a 20 20 20 20 20 20 65 6c  yet set.      el
10280 73 65 20 69 66 20 28 21 69 73 41 72 72 20 7c 7c  se if (!isArr ||
10290 20 69 73 41 72 72 20 26 26 20 21 63 6f 6e 74 61   isArr && !conta
102a0 69 6e 73 28 76 61 6c 75 65 2c 20 64 6f 6d 29 29  ins(value, dom))
102b0 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 61 64   {.        // ad
102c0 64 20 74 68 65 20 64 6f 6d 20 6e 6f 64 65 20 69  d the dom node i
102d0 6e 74 6f 20 74 68 65 20 61 72 72 61 79 0a 20 20  nto the array.  
102e0 20 20 20 20 20 20 69 66 20 28 69 73 41 72 72 29        if (isArr)
102f0 0a 20 20 20 20 20 20 20 20 20 20 76 61 6c 75 65  .          value
10300 2e 70 75 73 68 28 64 6f 6d 29 0a 20 20 20 20 20  .push(dom).     
10310 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 20 20     else.        
10320 20 20 70 61 72 65 6e 74 5b 6b 65 79 5d 20 3d 20    parent[key] = 
10330 5b 76 61 6c 75 65 2c 20 64 6f 6d 5d 0a 20 20 20  [value, dom].   
10340 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 2f 2f     }.    }..  //
10350 20 73 6b 69 70 20 74 68 65 20 65 6c 65 6d 65 6e   skip the elemen
10360 74 73 20 77 69 74 68 20 6e 6f 20 6e 61 6d 65 64  ts with no named
10370 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 69 66   properties.  if
10380 20 28 21 6b 65 79 29 20 72 65 74 75 72 6e 0a 0a   (!key) return..
10390 20 20 2f 2f 20 63 68 65 63 6b 20 77 68 65 74 68    // check wheth
103a0 65 72 20 74 68 69 73 20 6b 65 79 20 68 61 73 20  er this key has 
103b0 62 65 65 6e 20 61 6c 72 65 61 64 79 20 65 76 61  been already eva
103c0 6c 75 61 74 65 64 0a 20 20 69 66 20 28 74 6d 70  luated.  if (tmp
103d0 6c 2e 68 61 73 45 78 70 72 28 6b 65 79 29 29 0a  l.hasExpr(key)).
103e0 20 20 20 20 2f 2f 20 77 61 69 74 20 74 68 65 20      // wait the 
103f0 66 69 72 73 74 20 75 70 64 61 74 65 64 20 65 76  first updated ev
10400 65 6e 74 20 6f 6e 6c 79 20 6f 6e 63 65 0a 20 20  ent only once.  
10410 20 20 70 61 72 65 6e 74 2e 6f 6e 65 28 27 6d 6f    parent.one('mo
10420 75 6e 74 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29  unt', function()
10430 20 7b 0a 20 20 20 20 20 20 6b 65 79 20 3d 20 67   {.      key = g
10440 65 74 4e 61 6d 65 64 4b 65 79 28 64 6f 6d 29 0a  etNamedKey(dom).
10450 20 20 20 20 20 20 61 64 64 28 70 61 72 65 6e 74        add(parent
10460 5b 6b 65 79 5d 29 0a 20 20 20 20 7d 29 0a 20 20  [key]).    }).  
10470 65 6c 73 65 0a 20 20 20 20 61 64 64 28 70 61 72  else.    add(par
10480 65 6e 74 5b 6b 65 79 5d 29 0a 0a 7d 0a 0a 2f 2a  ent[key])..}../*
10490 2a 0a 20 2a 20 46 61 73 74 65 72 20 53 74 72 69  *. * Faster Stri
104a0 6e 67 20 73 74 61 72 74 73 57 69 74 68 20 61 6c  ng startsWith al
104b0 74 65 72 6e 61 74 69 76 65 0a 20 2a 20 40 70 61  ternative. * @pa
104c0 72 61 6d 20 20 20 7b 20 53 74 72 69 6e 67 20 7d  ram   { String }
104d0 20 73 72 63 20 2d 20 73 6f 75 72 63 65 20 73 74   src - source st
104e0 72 69 6e 67 0a 20 2a 20 40 70 61 72 61 6d 20 20  ring. * @param  
104f0 20 7b 20 53 74 72 69 6e 67 20 7d 20 73 74 72 20   { String } str 
10500 2d 20 74 65 73 74 20 73 74 72 69 6e 67 0a 20 2a  - test string. *
10510 20 40 72 65 74 75 72 6e 73 20 7b 20 42 6f 6f 6c   @returns { Bool
10520 65 61 6e 20 7d 20 2d 0a 20 2a 2f 0a 66 75 6e 63  ean } -. */.func
10530 74 69 6f 6e 20 73 74 61 72 74 73 57 69 74 68 28  tion startsWith(
10540 73 72 63 2c 20 73 74 72 29 20 7b 0a 20 20 72 65  src, str) {.  re
10550 74 75 72 6e 20 73 72 63 2e 73 6c 69 63 65 28 30  turn src.slice(0
10560 2c 20 73 74 72 2e 6c 65 6e 67 74 68 29 20 3d 3d  , str.length) ==
10570 3d 20 73 74 72 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20  = str.}../**. * 
10580 72 65 71 75 65 73 74 41 6e 69 6d 61 74 69 6f 6e  requestAnimation
10590 46 72 61 6d 65 20 66 75 6e 63 74 69 6f 6e 0a 20  Frame function. 
105a0 2a 20 41 64 61 70 74 65 64 20 66 72 6f 6d 20 68  * Adapted from h
105b0 74 74 70 73 3a 2f 2f 67 69 73 74 2e 67 69 74 68  ttps://gist.gith
105c0 75 62 2e 63 6f 6d 2f 70 61 75 6c 69 72 69 73 68  ub.com/paulirish
105d0 2f 31 35 37 39 36 37 31 2c 20 6c 69 63 65 6e 73  /1579671, licens
105e0 65 20 4d 49 54 0a 20 2a 2f 0a 76 61 72 20 72 41  e MIT. */.var rA
105f0 46 20 3d 20 28 66 75 6e 63 74 69 6f 6e 20 28 77  F = (function (w
10600 29 20 7b 0a 20 20 76 61 72 20 72 61 66 20 3d 20  ) {.  var raf = 
10610 77 2e 72 65 71 75 65 73 74 41 6e 69 6d 61 74 69  w.requestAnimati
10620 6f 6e 46 72 61 6d 65 20 20 20 20 7c 7c 0a 20 20  onFrame    ||.  
10630 20 20 20 20 20 20 20 20 20 20 77 2e 6d 6f 7a 52            w.mozR
10640 65 71 75 65 73 74 41 6e 69 6d 61 74 69 6f 6e 46  equestAnimationF
10650 72 61 6d 65 20 7c 7c 20 77 2e 77 65 62 6b 69 74  rame || w.webkit
10660 52 65 71 75 65 73 74 41 6e 69 6d 61 74 69 6f 6e  RequestAnimation
10670 46 72 61 6d 65 0a 0a 20 20 69 66 20 28 21 72 61  Frame..  if (!ra
10680 66 20 7c 7c 20 2f 69 50 28 61 64 7c 68 6f 6e 65  f || /iP(ad|hone
10690 7c 6f 64 29 2e 2a 4f 53 20 36 2f 2e 74 65 73 74  |od).*OS 6/.test
106a0 28 77 2e 6e 61 76 69 67 61 74 6f 72 2e 75 73 65  (w.navigator.use
106b0 72 41 67 65 6e 74 29 29 20 7b 20 20 2f 2f 20 62  rAgent)) {  // b
106c0 75 67 67 79 20 69 4f 53 36 0a 20 20 20 20 76 61  uggy iOS6.    va
106d0 72 20 6c 61 73 74 54 69 6d 65 20 3d 20 30 0a 0a  r lastTime = 0..
106e0 20 20 20 20 72 61 66 20 3d 20 66 75 6e 63 74 69      raf = functi
106f0 6f 6e 20 28 63 62 29 20 7b 0a 20 20 20 20 20 20  on (cb) {.      
10700 76 61 72 20 6e 6f 77 74 69 6d 65 20 3d 20 44 61  var nowtime = Da
10710 74 65 2e 6e 6f 77 28 29 2c 20 74 69 6d 65 6f 75  te.now(), timeou
10720 74 20 3d 20 4d 61 74 68 2e 6d 61 78 28 31 36 20  t = Math.max(16 
10730 2d 20 28 6e 6f 77 74 69 6d 65 20 2d 20 6c 61 73  - (nowtime - las
10740 74 54 69 6d 65 29 2c 20 30 29 0a 20 20 20 20 20  tTime), 0).     
10750 20 73 65 74 54 69 6d 65 6f 75 74 28 66 75 6e 63   setTimeout(func
10760 74 69 6f 6e 20 28 29 20 7b 20 63 62 28 6c 61 73  tion () { cb(las
10770 74 54 69 6d 65 20 3d 20 6e 6f 77 74 69 6d 65 20  tTime = nowtime 
10780 2b 20 74 69 6d 65 6f 75 74 29 20 7d 2c 20 74 69  + timeout) }, ti
10790 6d 65 6f 75 74 29 0a 20 20 20 20 7d 0a 20 20 7d  meout).    }.  }
107a0 0a 20 20 72 65 74 75 72 6e 20 72 61 66 0a 0a 7d  .  return raf..}
107b0 29 28 77 69 6e 64 6f 77 20 7c 7c 20 7b 7d 29 0a  )(window || {}).
107c0 0a 2f 2a 2a 0a 20 2a 20 4d 6f 75 6e 74 20 61 20  ./**. * Mount a 
107d0 74 61 67 20 63 72 65 61 74 69 6e 67 20 6e 65 77  tag creating new
107e0 20 54 61 67 20 69 6e 73 74 61 6e 63 65 0a 20 2a   Tag instance. *
107f0 20 40 70 61 72 61 6d 20 20 20 7b 20 4f 62 6a 65   @param   { Obje
10800 63 74 20 7d 20 72 6f 6f 74 20 2d 20 64 6f 6d 20  ct } root - dom 
10810 6e 6f 64 65 20 77 68 65 72 65 20 74 68 65 20 74  node where the t
10820 61 67 20 77 69 6c 6c 20 62 65 20 6d 6f 75 6e 74  ag will be mount
10830 65 64 0a 20 2a 20 40 70 61 72 61 6d 20 20 20 7b  ed. * @param   {
10840 20 53 74 72 69 6e 67 20 7d 20 74 61 67 4e 61 6d   String } tagNam
10850 65 20 2d 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  e - name of the 
10860 72 69 6f 74 20 74 61 67 20 77 65 20 77 61 6e 74  riot tag we want
10870 20 74 6f 20 6d 6f 75 6e 74 0a 20 2a 20 40 70 61   to mount. * @pa
10880 72 61 6d 20 20 20 7b 20 4f 62 6a 65 63 74 20 7d  ram   { Object }
10890 20 6f 70 74 73 20 2d 20 6f 70 74 69 6f 6e 73 20   opts - options 
108a0 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 54  to pass to the T
108b0 61 67 20 69 6e 73 74 61 6e 63 65 0a 20 2a 20 40  ag instance. * @
108c0 72 65 74 75 72 6e 73 20 7b 20 54 61 67 20 7d 20  returns { Tag } 
108d0 61 20 6e 65 77 20 54 61 67 20 69 6e 73 74 61 6e  a new Tag instan
108e0 63 65 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20  ce. */.function 
108f0 6d 6f 75 6e 74 54 6f 28 72 6f 6f 74 2c 20 74 61  mountTo(root, ta
10900 67 4e 61 6d 65 2c 20 6f 70 74 73 29 20 7b 0a 20  gName, opts) {. 
10910 20 76 61 72 20 74 61 67 20 3d 20 5f 5f 74 61 67   var tag = __tag
10920 49 6d 70 6c 5b 74 61 67 4e 61 6d 65 5d 2c 0a 20  Impl[tagName],. 
10930 20 20 20 2f 2f 20 63 61 63 68 65 20 74 68 65 20     // cache the 
10940 69 6e 6e 65 72 20 48 54 4d 4c 20 74 6f 20 66 69  inner HTML to fi
10950 78 20 23 38 35 35 0a 20 20 20 20 69 6e 6e 65 72  x #855.    inner
10960 48 54 4d 4c 20 3d 20 72 6f 6f 74 2e 5f 69 6e 6e  HTML = root._inn
10970 65 72 48 54 4d 4c 20 3d 20 72 6f 6f 74 2e 5f 69  erHTML = root._i
10980 6e 6e 65 72 48 54 4d 4c 20 7c 7c 20 72 6f 6f 74  nnerHTML || root
10990 2e 69 6e 6e 65 72 48 54 4d 4c 0a 0a 20 20 2f 2f  .innerHTML..  //
109a0 20 63 6c 65 61 72 20 74 68 65 20 69 6e 6e 65 72   clear the inner
109b0 20 68 74 6d 6c 0a 20 20 72 6f 6f 74 2e 69 6e 6e   html.  root.inn
109c0 65 72 48 54 4d 4c 20 3d 20 27 27 0a 0a 20 20 69  erHTML = ''..  i
109d0 66 20 28 74 61 67 20 26 26 20 72 6f 6f 74 29 20  f (tag && root) 
109e0 74 61 67 20 3d 20 6e 65 77 20 54 61 67 28 74 61  tag = new Tag(ta
109f0 67 2c 20 7b 20 72 6f 6f 74 3a 20 72 6f 6f 74 2c  g, { root: root,
10a00 20 6f 70 74 73 3a 20 6f 70 74 73 20 7d 2c 20 69   opts: opts }, i
10a10 6e 6e 65 72 48 54 4d 4c 29 0a 0a 20 20 69 66 20  nnerHTML)..  if 
10a20 28 74 61 67 20 26 26 20 74 61 67 2e 6d 6f 75 6e  (tag && tag.moun
10a30 74 29 20 7b 0a 20 20 20 20 74 61 67 2e 6d 6f 75  t) {.    tag.mou
10a40 6e 74 28 29 0a 20 20 20 20 2f 2f 20 61 64 64 20  nt().    // add 
10a50 74 68 69 73 20 74 61 67 20 74 6f 20 74 68 65 20  this tag to the 
10a60 76 69 72 74 75 61 6c 44 6f 6d 20 76 61 72 69 61  virtualDom varia
10a70 62 6c 65 0a 20 20 20 20 69 66 20 28 21 63 6f 6e  ble.    if (!con
10a80 74 61 69 6e 73 28 5f 5f 76 69 72 74 75 61 6c 44  tains(__virtualD
10a90 6f 6d 2c 20 74 61 67 29 29 20 5f 5f 76 69 72 74  om, tag)) __virt
10aa0 75 61 6c 44 6f 6d 2e 70 75 73 68 28 74 61 67 29  ualDom.push(tag)
10ab0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 74  .  }..  return t
10ac0 61 67 0a 7d 0a 2f 2a 2a 0a 20 2a 20 52 69 6f 74  ag.}./**. * Riot
10ad0 20 70 75 62 6c 69 63 20 61 70 69 0a 20 2a 2f 0a   public api. */.
10ae0 0a 2f 2f 20 73 68 61 72 65 20 6d 65 74 68 6f 64  .// share method
10af0 73 20 66 6f 72 20 6f 74 68 65 72 20 72 69 6f 74  s for other riot
10b00 20 70 61 72 74 73 2c 20 65 2e 67 2e 20 63 6f 6d   parts, e.g. com
10b10 70 69 6c 65 72 0a 72 69 6f 74 2e 75 74 69 6c 20  piler.riot.util 
10b20 3d 20 7b 20 62 72 61 63 6b 65 74 73 3a 20 62 72  = { brackets: br
10b30 61 63 6b 65 74 73 2c 20 74 6d 70 6c 3a 20 74 6d  ackets, tmpl: tm
10b40 70 6c 20 7d 0a 0a 2f 2a 2a 0a 20 2a 20 43 72 65  pl }../**. * Cre
10b50 61 74 65 20 61 20 6d 69 78 69 6e 20 74 68 61 74  ate a mixin that
10b60 20 63 6f 75 6c 64 20 62 65 20 67 6c 6f 62 61 6c   could be global
10b70 6c 79 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  ly shared across
10b80 20 61 6c 6c 20 74 68 65 20 74 61 67 73 0a 20 2a   all the tags. *
10b90 2f 0a 72 69 6f 74 2e 6d 69 78 69 6e 20 3d 20 28  /.riot.mixin = (
10ba0 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 76  function() {.  v
10bb0 61 72 20 6d 69 78 69 6e 73 20 3d 20 7b 7d 2c 0a  ar mixins = {},.
10bc0 20 20 20 20 67 6c 6f 62 61 6c 73 20 3d 20 6d 69      globals = mi
10bd0 78 69 6e 73 5b 47 4c 4f 42 41 4c 5f 4d 49 58 49  xins[GLOBAL_MIXI
10be0 4e 5d 20 3d 20 7b 7d 2c 0a 20 20 20 20 5f 69 64  N] = {},.    _id
10bf0 20 3d 20 30 0a 0a 20 20 2f 2a 2a 0a 20 20 20 2a   = 0..  /**.   *
10c00 20 43 72 65 61 74 65 2f 52 65 74 75 72 6e 20 61   Create/Return a
10c10 20 6d 69 78 69 6e 20 62 79 20 69 74 73 20 6e 61   mixin by its na
10c20 6d 65 0a 20 20 20 2a 20 40 70 61 72 61 6d 20 20  me.   * @param  
10c30 20 7b 20 53 74 72 69 6e 67 20 7d 20 20 6e 61 6d   { String }  nam
10c40 65 20 2d 20 6d 69 78 69 6e 20 6e 61 6d 65 20 28  e - mixin name (
10c50 67 6c 6f 62 61 6c 20 6d 69 78 69 6e 20 69 66 20  global mixin if 
10c60 6f 62 6a 65 63 74 29 0a 20 20 20 2a 20 40 70 61  object).   * @pa
10c70 72 61 6d 20 20 20 7b 20 4f 62 6a 65 63 74 20 7d  ram   { Object }
10c80 20 20 6d 69 78 69 6e 20 2d 20 6d 69 78 69 6e 20    mixin - mixin 
10c90 6c 6f 67 69 63 0a 20 20 20 2a 20 40 70 61 72 61  logic.   * @para
10ca0 6d 20 20 20 7b 20 42 6f 6f 6c 65 61 6e 20 7d 20  m   { Boolean } 
10cb0 67 20 2d 20 69 73 20 67 6c 6f 62 61 6c 3f 0a 20  g - is global?. 
10cc0 20 20 2a 20 40 72 65 74 75 72 6e 73 20 7b 20 4f    * @returns { O
10cd0 62 6a 65 63 74 20 7d 20 20 74 68 65 20 6d 69 78  bject }  the mix
10ce0 69 6e 20 6c 6f 67 69 63 0a 20 20 20 2a 2f 0a 20  in logic.   */. 
10cf0 20 72 65 74 75 72 6e 20 66 75 6e 63 74 69 6f 6e   return function
10d00 28 6e 61 6d 65 2c 20 6d 69 78 69 6e 2c 20 67 29  (name, mixin, g)
10d10 20 7b 0a 20 20 20 20 2f 2f 20 55 6e 6e 61 6d 65   {.    // Unname
10d20 64 20 67 6c 6f 62 61 6c 0a 20 20 20 20 69 66 20  d global.    if 
10d30 28 69 73 4f 62 6a 65 63 74 28 6e 61 6d 65 29 29  (isObject(name))
10d40 20 7b 0a 20 20 20 20 20 20 72 69 6f 74 2e 6d 69   {.      riot.mi
10d50 78 69 6e 28 27 5f 5f 75 6e 6e 61 6d 65 64 5f 27  xin('__unnamed_'
10d60 2b 5f 69 64 2b 2b 2c 20 6e 61 6d 65 2c 20 74 72  +_id++, name, tr
10d70 75 65 29 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ue).      return
10d80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 76 61 72 20  .    }..    var 
10d90 73 74 6f 72 65 20 3d 20 67 20 3f 20 67 6c 6f 62  store = g ? glob
10da0 61 6c 73 20 3a 20 6d 69 78 69 6e 73 0a 0a 20 20  als : mixins..  
10db0 20 20 2f 2f 20 47 65 74 74 65 72 0a 20 20 20 20    // Getter.    
10dc0 69 66 20 28 21 6d 69 78 69 6e 29 20 7b 0a 20 20  if (!mixin) {.  
10dd0 20 20 20 20 69 66 20 28 74 79 70 65 6f 66 20 73      if (typeof s
10de0 74 6f 72 65 5b 6e 61 6d 65 5d 20 3d 3d 3d 20 54  tore[name] === T
10df0 5f 55 4e 44 45 46 29 20 7b 0a 20 20 20 20 20 20  _UNDEF) {.      
10e00 20 20 74 68 72 6f 77 20 6e 65 77 20 45 72 72 6f    throw new Erro
10e10 72 28 27 55 6e 72 65 67 69 73 74 65 72 65 64 20  r('Unregistered 
10e20 6d 69 78 69 6e 3a 20 27 20 2b 20 6e 61 6d 65 29  mixin: ' + name)
10e30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
10e40 65 74 75 72 6e 20 73 74 6f 72 65 5b 6e 61 6d 65  eturn store[name
10e50 5d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2f 20 53  ].    }.    // S
10e60 65 74 74 65 72 0a 20 20 20 20 69 66 20 28 69 73  etter.    if (is
10e70 46 75 6e 63 74 69 6f 6e 28 6d 69 78 69 6e 29 29  Function(mixin))
10e80 20 7b 0a 20 20 20 20 20 20 65 78 74 65 6e 64 28   {.      extend(
10e90 6d 69 78 69 6e 2e 70 72 6f 74 6f 74 79 70 65 2c  mixin.prototype,
10ea0 20 73 74 6f 72 65 5b 6e 61 6d 65 5d 20 7c 7c 20   store[name] || 
10eb0 7b 7d 29 0a 20 20 20 20 20 20 73 74 6f 72 65 5b  {}).      store[
10ec0 6e 61 6d 65 5d 20 3d 20 6d 69 78 69 6e 0a 20 20  name] = mixin.  
10ed0 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20    }.    else {. 
10ee0 20 20 20 20 20 73 74 6f 72 65 5b 6e 61 6d 65 5d       store[name]
10ef0 20 3d 20 65 78 74 65 6e 64 28 73 74 6f 72 65 5b   = extend(store[
10f00 6e 61 6d 65 5d 20 7c 7c 20 7b 7d 2c 20 6d 69 78  name] || {}, mix
10f10 69 6e 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 7d  in).    }.  }..}
10f20 29 28 29 0a 0a 2f 2a 2a 0a 20 2a 20 43 72 65 61  )()../**. * Crea
10f30 74 65 20 61 20 6e 65 77 20 72 69 6f 74 20 74 61  te a new riot ta
10f40 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
10f50 0a 20 2a 20 40 70 61 72 61 6d 20 20 20 7b 20 53  . * @param   { S
10f60 74 72 69 6e 67 20 7d 20 20 20 6e 61 6d 65 20 2d  tring }   name -
10f70 20 6e 61 6d 65 2f 69 64 20 6f 66 20 74 68 65 20   name/id of the 
10f80 6e 65 77 20 72 69 6f 74 20 74 61 67 0a 20 2a 20  new riot tag. * 
10f90 40 70 61 72 61 6d 20 20 20 7b 20 53 74 72 69 6e  @param   { Strin
10fa0 67 20 7d 20 20 20 68 74 6d 6c 20 2d 20 74 61 67  g }   html - tag
10fb0 20 74 65 6d 70 6c 61 74 65 0a 20 2a 20 40 70 61   template. * @pa
10fc0 72 61 6d 20 20 20 7b 20 53 74 72 69 6e 67 20 7d  ram   { String }
10fd0 20 20 20 63 73 73 20 2d 20 63 75 73 74 6f 6d 20     css - custom 
10fe0 74 61 67 20 63 73 73 0a 20 2a 20 40 70 61 72 61  tag css. * @para
10ff0 6d 20 20 20 7b 20 53 74 72 69 6e 67 20 7d 20 20  m   { String }  
11000 20 61 74 74 72 73 20 2d 20 72 6f 6f 74 20 74 61   attrs - root ta
11010 67 20 61 74 74 72 69 62 75 74 65 73 0a 20 2a 20  g attributes. * 
11020 40 70 61 72 61 6d 20 20 20 7b 20 46 75 6e 63 74  @param   { Funct
11030 69 6f 6e 20 7d 20 66 6e 20 2d 20 75 73 65 72 20  ion } fn - user 
11040 66 75 6e 63 74 69 6f 6e 0a 20 2a 20 40 72 65 74  function. * @ret
11050 75 72 6e 73 20 7b 20 53 74 72 69 6e 67 20 7d 20  urns { String } 
11060 6e 61 6d 65 2f 69 64 20 6f 66 20 74 68 65 20 74  name/id of the t
11070 61 67 20 6a 75 73 74 20 63 72 65 61 74 65 64 0a  ag just created.
11080 20 2a 2f 0a 72 69 6f 74 2e 74 61 67 20 3d 20 66   */.riot.tag = f
11090 75 6e 63 74 69 6f 6e 28 6e 61 6d 65 2c 20 68 74  unction(name, ht
110a0 6d 6c 2c 20 63 73 73 2c 20 61 74 74 72 73 2c 20  ml, css, attrs, 
110b0 66 6e 29 20 7b 0a 20 20 69 66 20 28 69 73 46 75  fn) {.  if (isFu
110c0 6e 63 74 69 6f 6e 28 61 74 74 72 73 29 29 20 7b  nction(attrs)) {
110d0 0a 20 20 20 20 66 6e 20 3d 20 61 74 74 72 73 0a  .    fn = attrs.
110e0 20 20 20 20 69 66 20 28 2f 5e 5b 5c 77 5c 2d 5d      if (/^[\w\-]
110f0 2b 5c 73 3f 3d 2f 2e 74 65 73 74 28 63 73 73 29  +\s?=/.test(css)
11100 29 20 7b 0a 20 20 20 20 20 20 61 74 74 72 73 20  ) {.      attrs 
11110 3d 20 63 73 73 0a 20 20 20 20 20 20 63 73 73 20  = css.      css 
11120 3d 20 27 27 0a 20 20 20 20 7d 20 65 6c 73 65 20  = ''.    } else 
11130 61 74 74 72 73 20 3d 20 27 27 0a 20 20 7d 0a 20  attrs = ''.  }. 
11140 20 69 66 20 28 63 73 73 29 20 7b 0a 20 20 20 20   if (css) {.    
11150 69 66 20 28 69 73 46 75 6e 63 74 69 6f 6e 28 63  if (isFunction(c
11160 73 73 29 29 20 66 6e 20 3d 20 63 73 73 0a 20 20  ss)) fn = css.  
11170 20 20 65 6c 73 65 20 73 74 79 6c 65 4d 61 6e 61    else styleMana
11180 67 65 72 2e 61 64 64 28 63 73 73 29 0a 20 20 7d  ger.add(css).  }
11190 0a 20 20 6e 61 6d 65 20 3d 20 6e 61 6d 65 2e 74  .  name = name.t
111a0 6f 4c 6f 77 65 72 43 61 73 65 28 29 0a 20 20 5f  oLowerCase().  _
111b0 5f 74 61 67 49 6d 70 6c 5b 6e 61 6d 65 5d 20 3d  _tagImpl[name] =
111c0 20 7b 20 6e 61 6d 65 3a 20 6e 61 6d 65 2c 20 74   { name: name, t
111d0 6d 70 6c 3a 20 68 74 6d 6c 2c 20 61 74 74 72 73  mpl: html, attrs
111e0 3a 20 61 74 74 72 73 2c 20 66 6e 3a 20 66 6e 20  : attrs, fn: fn 
111f0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 61 6d 65 0a  }.  return name.
11200 7d 0a 0a 2f 2a 2a 0a 20 2a 20 43 72 65 61 74 65  }../**. * Create
11210 20 61 20 6e 65 77 20 72 69 6f 74 20 74 61 67 20   a new riot tag 
11220 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 28  implementation (
11230 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 63  for use by the c
11240 6f 6d 70 69 6c 65 72 29 0a 20 2a 20 40 70 61 72  ompiler). * @par
11250 61 6d 20 20 20 7b 20 53 74 72 69 6e 67 20 7d 20  am   { String } 
11260 20 20 6e 61 6d 65 20 2d 20 6e 61 6d 65 2f 69 64    name - name/id
11270 20 6f 66 20 74 68 65 20 6e 65 77 20 72 69 6f 74   of the new riot
11280 20 74 61 67 0a 20 2a 20 40 70 61 72 61 6d 20 20   tag. * @param  
11290 20 7b 20 53 74 72 69 6e 67 20 7d 20 20 20 68 74   { String }   ht
112a0 6d 6c 20 2d 20 74 61 67 20 74 65 6d 70 6c 61 74  ml - tag templat
112b0 65 0a 20 2a 20 40 70 61 72 61 6d 20 20 20 7b 20  e. * @param   { 
112c0 53 74 72 69 6e 67 20 7d 20 20 20 63 73 73 20 2d  String }   css -
112d0 20 63 75 73 74 6f 6d 20 74 61 67 20 63 73 73 0a   custom tag css.
112e0 20 2a 20 40 70 61 72 61 6d 20 20 20 7b 20 53 74   * @param   { St
112f0 72 69 6e 67 20 7d 20 20 20 61 74 74 72 73 20 2d  ring }   attrs -
11300 20 72 6f 6f 74 20 74 61 67 20 61 74 74 72 69 62   root tag attrib
11310 75 74 65 73 0a 20 2a 20 40 70 61 72 61 6d 20 20  utes. * @param  
11320 20 7b 20 46 75 6e 63 74 69 6f 6e 20 7d 20 66 6e   { Function } fn
11330 20 2d 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e   - user function
11340 0a 20 2a 20 40 72 65 74 75 72 6e 73 20 7b 20 53  . * @returns { S
11350 74 72 69 6e 67 20 7d 20 6e 61 6d 65 2f 69 64 20  tring } name/id 
11360 6f 66 20 74 68 65 20 74 61 67 20 6a 75 73 74 20  of the tag just 
11370 63 72 65 61 74 65 64 0a 20 2a 2f 0a 72 69 6f 74  created. */.riot
11380 2e 74 61 67 32 20 3d 20 66 75 6e 63 74 69 6f 6e  .tag2 = function
11390 28 6e 61 6d 65 2c 20 68 74 6d 6c 2c 20 63 73 73  (name, html, css
113a0 2c 20 61 74 74 72 73 2c 20 66 6e 29 20 7b 0a 20  , attrs, fn) {. 
113b0 20 69 66 20 28 63 73 73 29 20 73 74 79 6c 65 4d   if (css) styleM
113c0 61 6e 61 67 65 72 2e 61 64 64 28 63 73 73 29 0a  anager.add(css).
113d0 20 20 2f 2f 69 66 20 28 62 70 61 69 72 29 20 72    //if (bpair) r
113e0 69 6f 74 2e 73 65 74 74 69 6e 67 73 2e 62 72 61  iot.settings.bra
113f0 63 6b 65 74 73 20 3d 20 62 70 61 69 72 0a 20 20  ckets = bpair.  
11400 5f 5f 74 61 67 49 6d 70 6c 5b 6e 61 6d 65 5d 20  __tagImpl[name] 
11410 3d 20 7b 20 6e 61 6d 65 3a 20 6e 61 6d 65 2c 20  = { name: name, 
11420 74 6d 70 6c 3a 20 68 74 6d 6c 2c 20 61 74 74 72  tmpl: html, attr
11430 73 3a 20 61 74 74 72 73 2c 20 66 6e 3a 20 66 6e  s: attrs, fn: fn
11440 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 61 6d 65   }.  return name
11450 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20 4d 6f 75 6e 74  .}../**. * Mount
11460 20 61 20 74 61 67 20 75 73 69 6e 67 20 61 20 73   a tag using a s
11470 70 65 63 69 66 69 63 20 74 61 67 20 69 6d 70 6c  pecific tag impl
11480 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 2a 20 40 70  ementation. * @p
11490 61 72 61 6d 20 20 20 7b 20 53 74 72 69 6e 67 20  aram   { String 
114a0 7d 20 73 65 6c 65 63 74 6f 72 20 2d 20 74 61 67  } selector - tag
114b0 20 44 4f 4d 20 73 65 6c 65 63 74 6f 72 0a 20 2a   DOM selector. *
114c0 20 40 70 61 72 61 6d 20 20 20 7b 20 53 74 72 69   @param   { Stri
114d0 6e 67 20 7d 20 74 61 67 4e 61 6d 65 20 2d 20 74  ng } tagName - t
114e0 61 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ag implementatio
114f0 6e 20 6e 61 6d 65 0a 20 2a 20 40 70 61 72 61 6d  n name. * @param
11500 20 20 20 7b 20 4f 62 6a 65 63 74 20 7d 20 6f 70     { Object } op
11510 74 73 20 2d 20 74 61 67 20 6c 6f 67 69 63 0a 20  ts - tag logic. 
11520 2a 20 40 72 65 74 75 72 6e 73 20 7b 20 41 72 72  * @returns { Arr
11530 61 79 20 7d 20 6e 65 77 20 74 61 67 73 20 69 6e  ay } new tags in
11540 73 74 61 6e 63 65 73 0a 20 2a 2f 0a 72 69 6f 74  stances. */.riot
11550 2e 6d 6f 75 6e 74 20 3d 20 66 75 6e 63 74 69 6f  .mount = functio
11560 6e 28 73 65 6c 65 63 74 6f 72 2c 20 74 61 67 4e  n(selector, tagN
11570 61 6d 65 2c 20 6f 70 74 73 29 20 7b 0a 0a 20 20  ame, opts) {..  
11580 76 61 72 20 65 6c 73 2c 0a 20 20 20 20 61 6c 6c  var els,.    all
11590 54 61 67 73 2c 0a 20 20 20 20 74 61 67 73 20 3d  Tags,.    tags =
115a0 20 5b 5d 0a 0a 20 20 2f 2f 20 68 65 6c 70 65 72   []..  // helper
115b0 20 66 75 6e 63 74 69 6f 6e 73 0a 0a 20 20 66 75   functions..  fu
115c0 6e 63 74 69 6f 6e 20 61 64 64 52 69 6f 74 54 61  nction addRiotTa
115d0 67 73 28 61 72 72 29 20 7b 0a 20 20 20 20 76 61  gs(arr) {.    va
115e0 72 20 6c 69 73 74 20 3d 20 27 27 0a 20 20 20 20  r list = ''.    
115f0 65 61 63 68 28 61 72 72 2c 20 66 75 6e 63 74 69  each(arr, functi
11600 6f 6e 20 28 65 29 20 7b 0a 20 20 20 20 20 20 69  on (e) {.      i
11610 66 20 28 21 2f 5b 5e 2d 5c 77 5d 2f 2e 74 65 73  f (!/[^-\w]/.tes
11620 74 28 65 29 29 20 7b 0a 20 20 20 20 20 20 20 20  t(e)) {.        
11630 65 20 3d 20 65 2e 74 72 69 6d 28 29 2e 74 6f 4c  e = e.trim().toL
11640 6f 77 65 72 43 61 73 65 28 29 0a 20 20 20 20 20  owerCase().     
11650 20 20 20 6c 69 73 74 20 2b 3d 20 27 2c 5b 27 20     list += ',[' 
11660 2b 20 52 49 4f 54 5f 54 41 47 5f 49 53 20 2b 20  + RIOT_TAG_IS + 
11670 27 3d 22 27 20 2b 20 65 20 2b 20 27 22 5d 2c 5b  '="' + e + '"],[
11680 27 20 2b 20 52 49 4f 54 5f 54 41 47 20 2b 20 27  ' + RIOT_TAG + '
11690 3d 22 27 20 2b 20 65 20 2b 20 27 22 5d 27 0a 20  ="' + e + '"]'. 
116a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 29 0a 20 20       }.    }).  
116b0 20 20 72 65 74 75 72 6e 20 6c 69 73 74 0a 20 20    return list.  
116c0 7d 0a 0a 20 20 66 75 6e 63 74 69 6f 6e 20 73 65  }..  function se
116d0 6c 65 63 74 41 6c 6c 54 61 67 73 28 29 20 7b 0a  lectAllTags() {.
116e0 20 20 20 20 76 61 72 20 6b 65 79 73 20 3d 20 4f      var keys = O
116f0 62 6a 65 63 74 2e 6b 65 79 73 28 5f 5f 74 61 67  bject.keys(__tag
11700 49 6d 70 6c 29 0a 20 20 20 20 72 65 74 75 72 6e  Impl).    return
11710 20 6b 65 79 73 20 2b 20 61 64 64 52 69 6f 74 54   keys + addRiotT
11720 61 67 73 28 6b 65 79 73 29 0a 20 20 7d 0a 0a 20  ags(keys).  }.. 
11730 20 66 75 6e 63 74 69 6f 6e 20 70 75 73 68 54 61   function pushTa
11740 67 73 28 72 6f 6f 74 29 20 7b 0a 20 20 20 20 69  gs(root) {.    i
11750 66 20 28 72 6f 6f 74 2e 74 61 67 4e 61 6d 65 29  f (root.tagName)
11760 20 7b 0a 20 20 20 20 20 20 76 61 72 20 72 69 6f   {.      var rio
11770 74 54 61 67 20 3d 20 67 65 74 41 74 74 72 28 72  tTag = getAttr(r
11780 6f 6f 74 2c 20 52 49 4f 54 5f 54 41 47 5f 49 53  oot, RIOT_TAG_IS
11790 29 20 7c 7c 20 67 65 74 41 74 74 72 28 72 6f 6f  ) || getAttr(roo
117a0 74 2c 20 52 49 4f 54 5f 54 41 47 29 0a 0a 20 20  t, RIOT_TAG)..  
117b0 20 20 20 20 2f 2f 20 68 61 76 65 20 74 61 67 4e      // have tagN
117c0 61 6d 65 3f 20 66 6f 72 63 65 20 72 69 6f 74 2d  ame? force riot-
117d0 74 61 67 20 74 6f 20 62 65 20 74 68 65 20 73 61  tag to be the sa
117e0 6d 65 0a 20 20 20 20 20 20 69 66 20 28 74 61 67  me.      if (tag
117f0 4e 61 6d 65 20 26 26 20 72 69 6f 74 54 61 67 20  Name && riotTag 
11800 21 3d 3d 20 74 61 67 4e 61 6d 65 29 20 7b 0a 20  !== tagName) {. 
11810 20 20 20 20 20 20 20 72 69 6f 74 54 61 67 20 3d         riotTag =
11820 20 74 61 67 4e 61 6d 65 0a 20 20 20 20 20 20 20   tagName.       
11830 20 73 65 74 41 74 74 72 28 72 6f 6f 74 2c 20 52   setAttr(root, R
11840 49 4f 54 5f 54 41 47 5f 49 53 2c 20 74 61 67 4e  IOT_TAG_IS, tagN
11850 61 6d 65 29 0a 20 20 20 20 20 20 20 20 73 65 74  ame).        set
11860 41 74 74 72 28 72 6f 6f 74 2c 20 52 49 4f 54 5f  Attr(root, RIOT_
11870 54 41 47 2c 20 74 61 67 4e 61 6d 65 29 20 2f 2f  TAG, tagName) //
11880 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65   this will be re
11890 6d 6f 76 65 64 20 69 6e 20 72 69 6f 74 20 33 2e  moved in riot 3.
118a0 30 2e 30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0.0.      }.    
118b0 20 20 76 61 72 20 74 61 67 20 3d 20 6d 6f 75 6e    var tag = moun
118c0 74 54 6f 28 72 6f 6f 74 2c 20 72 69 6f 74 54 61  tTo(root, riotTa
118d0 67 20 7c 7c 20 72 6f 6f 74 2e 74 61 67 4e 61 6d  g || root.tagNam
118e0 65 2e 74 6f 4c 6f 77 65 72 43 61 73 65 28 29 2c  e.toLowerCase(),
118f0 20 6f 70 74 73 29 0a 0a 20 20 20 20 20 20 69 66   opts)..      if
11900 20 28 74 61 67 29 20 74 61 67 73 2e 70 75 73 68   (tag) tags.push
11910 28 74 61 67 29 0a 20 20 20 20 7d 20 65 6c 73 65  (tag).    } else
11920 20 69 66 20 28 72 6f 6f 74 2e 6c 65 6e 67 74 68   if (root.length
11930 29 20 7b 0a 20 20 20 20 20 20 65 61 63 68 28 72  ) {.      each(r
11940 6f 6f 74 2c 20 70 75 73 68 54 61 67 73 29 20 20  oot, pushTags)  
11950 20 2f 2f 20 61 73 73 75 6d 65 20 6e 6f 64 65 4c   // assume nodeL
11960 69 73 74 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ist.    }.  }.. 
11970 20 2f 2f 20 2d 2d 2d 2d 2d 20 6d 6f 75 6e 74 20   // ----- mount 
11980 63 6f 64 65 20 2d 2d 2d 2d 2d 0a 0a 20 20 2f 2f  code -----..  //
11990 20 69 6e 6a 65 63 74 20 73 74 79 6c 65 73 20 69   inject styles i
119a0 6e 74 6f 20 44 4f 4d 0a 20 20 73 74 79 6c 65 4d  nto DOM.  styleM
119b0 61 6e 61 67 65 72 2e 69 6e 6a 65 63 74 28 29 0a  anager.inject().
119c0 0a 20 20 69 66 20 28 69 73 4f 62 6a 65 63 74 28  .  if (isObject(
119d0 74 61 67 4e 61 6d 65 29 29 20 7b 0a 20 20 20 20  tagName)) {.    
119e0 6f 70 74 73 20 3d 20 74 61 67 4e 61 6d 65 0a 20  opts = tagName. 
119f0 20 20 20 74 61 67 4e 61 6d 65 20 3d 20 30 0a 20     tagName = 0. 
11a00 20 7d 0a 0a 20 20 2f 2f 20 63 72 61 77 6c 20 74   }..  // crawl t
11a10 68 65 20 44 4f 4d 20 74 6f 20 66 69 6e 64 20 74  he DOM to find t
11a20 68 65 20 74 61 67 0a 20 20 69 66 20 28 74 79 70  he tag.  if (typ
11a30 65 6f 66 20 73 65 6c 65 63 74 6f 72 20 3d 3d 3d  eof selector ===
11a40 20 54 5f 53 54 52 49 4e 47 29 20 7b 0a 20 20 20   T_STRING) {.   
11a50 20 69 66 20 28 73 65 6c 65 63 74 6f 72 20 3d 3d   if (selector ==
11a60 3d 20 27 2a 27 29 0a 20 20 20 20 20 20 2f 2f 20  = '*').      // 
11a70 73 65 6c 65 63 74 20 61 6c 6c 20 74 68 65 20 74  select all the t
11a80 61 67 73 20 72 65 67 69 73 74 65 72 65 64 0a 20  ags registered. 
11a90 20 20 20 20 20 2f 2f 20 61 6e 64 20 61 6c 73 6f       // and also
11aa0 20 74 68 65 20 74 61 67 73 20 66 6f 75 6e 64 20   the tags found 
11ab0 77 69 74 68 20 74 68 65 20 72 69 6f 74 2d 74 61  with the riot-ta
11ac0 67 20 61 74 74 72 69 62 75 74 65 20 73 65 74 0a  g attribute set.
11ad0 20 20 20 20 20 20 73 65 6c 65 63 74 6f 72 20 3d        selector =
11ae0 20 61 6c 6c 54 61 67 73 20 3d 20 73 65 6c 65 63   allTags = selec
11af0 74 41 6c 6c 54 61 67 73 28 29 0a 20 20 20 20 65  tAllTags().    e
11b00 6c 73 65 0a 20 20 20 20 20 20 2f 2f 20 6f 72 20  lse.      // or 
11b10 6a 75 73 74 20 74 68 65 20 6f 6e 65 73 20 6e 61  just the ones na
11b20 6d 65 64 20 6c 69 6b 65 20 74 68 65 20 73 65 6c  med like the sel
11b30 65 63 74 6f 72 0a 20 20 20 20 20 20 73 65 6c 65  ector.      sele
11b40 63 74 6f 72 20 2b 3d 20 61 64 64 52 69 6f 74 54  ctor += addRiotT
11b50 61 67 73 28 73 65 6c 65 63 74 6f 72 2e 73 70 6c  ags(selector.spl
11b60 69 74 28 2f 2c 20 2a 2f 29 29 0a 0a 20 20 20 20  it(/, */))..    
11b70 2f 2f 20 6d 61 6b 65 20 73 75 72 65 20 74 6f 20  // make sure to 
11b80 70 61 73 73 20 61 6c 77 61 79 73 20 61 20 73 65  pass always a se
11b90 6c 65 63 74 6f 72 0a 20 20 20 20 2f 2f 20 74 6f  lector.    // to
11ba0 20 74 68 65 20 71 75 65 72 79 53 65 6c 65 63 74   the querySelect
11bb0 6f 72 41 6c 6c 20 66 75 6e 63 74 69 6f 6e 0a 20  orAll function. 
11bc0 20 20 20 65 6c 73 20 3d 20 73 65 6c 65 63 74 6f     els = selecto
11bd0 72 20 3f 20 24 24 28 73 65 6c 65 63 74 6f 72 29  r ? $$(selector)
11be0 20 3a 20 5b 5d 0a 20 20 7d 0a 20 20 65 6c 73 65   : [].  }.  else
11bf0 0a 20 20 20 20 2f 2f 20 70 72 6f 62 61 62 6c 79  .    // probably
11c00 20 79 6f 75 20 68 61 76 65 20 70 61 73 73 65 64   you have passed
11c10 20 61 6c 72 65 61 64 79 20 61 20 74 61 67 20 6f   already a tag o
11c20 72 20 61 20 4e 6f 64 65 4c 69 73 74 0a 20 20 20  r a NodeList.   
11c30 20 65 6c 73 20 3d 20 73 65 6c 65 63 74 6f 72 0a   els = selector.
11c40 0a 20 20 2f 2f 20 73 65 6c 65 63 74 20 61 6c 6c  .  // select all
11c50 20 74 68 65 20 72 65 67 69 73 74 65 72 65 64 20   the registered 
11c60 61 6e 64 20 6d 6f 75 6e 74 20 74 68 65 6d 20 69  and mount them i
11c70 6e 73 69 64 65 20 74 68 65 69 72 20 72 6f 6f 74  nside their root
11c80 20 65 6c 65 6d 65 6e 74 73 0a 20 20 69 66 20 28   elements.  if (
11c90 74 61 67 4e 61 6d 65 20 3d 3d 3d 20 27 2a 27 29  tagName === '*')
11ca0 20 7b 0a 20 20 20 20 2f 2f 20 67 65 74 20 61 6c   {.    // get al
11cb0 6c 20 63 75 73 74 6f 6d 20 74 61 67 73 0a 20 20  l custom tags.  
11cc0 20 20 74 61 67 4e 61 6d 65 20 3d 20 61 6c 6c 54    tagName = allT
11cd0 61 67 73 20 7c 7c 20 73 65 6c 65 63 74 41 6c 6c  ags || selectAll
11ce0 54 61 67 73 28 29 0a 20 20 20 20 2f 2f 20 69 66  Tags().    // if
11cf0 20 74 68 65 20 72 6f 6f 74 20 65 6c 73 20 69 74   the root els it
11d00 27 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65  's just a single
11d10 20 74 61 67 0a 20 20 20 20 69 66 20 28 65 6c 73   tag.    if (els
11d20 2e 74 61 67 4e 61 6d 65 29 0a 20 20 20 20 20 20  .tagName).      
11d30 65 6c 73 20 3d 20 24 24 28 74 61 67 4e 61 6d 65  els = $$(tagName
11d40 2c 20 65 6c 73 29 0a 20 20 20 20 65 6c 73 65 20  , els).    else 
11d50 7b 0a 20 20 20 20 20 20 2f 2f 20 73 65 6c 65 63  {.      // selec
11d60 74 20 61 6c 6c 20 74 68 65 20 63 68 69 6c 64 72  t all the childr
11d70 65 6e 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 64  en for all the d
11d80 69 66 66 65 72 65 6e 74 20 72 6f 6f 74 20 65 6c  ifferent root el
11d90 65 6d 65 6e 74 73 0a 20 20 20 20 20 20 76 61 72  ements.      var
11da0 20 6e 6f 64 65 4c 69 73 74 20 3d 20 5b 5d 0a 20   nodeList = []. 
11db0 20 20 20 20 20 65 61 63 68 28 65 6c 73 2c 20 66       each(els, f
11dc0 75 6e 63 74 69 6f 6e 20 28 5f 65 6c 29 20 7b 0a  unction (_el) {.
11dd0 20 20 20 20 20 20 20 20 6e 6f 64 65 4c 69 73 74          nodeList
11de0 2e 70 75 73 68 28 24 24 28 74 61 67 4e 61 6d 65  .push($$(tagName
11df0 2c 20 5f 65 6c 29 29 0a 20 20 20 20 20 20 7d 29  , _el)).      })
11e00 0a 20 20 20 20 20 20 65 6c 73 20 3d 20 6e 6f 64  .      els = nod
11e10 65 4c 69 73 74 0a 20 20 20 20 7d 0a 20 20 20 20  eList.    }.    
11e20 2f 2f 20 67 65 74 20 72 69 64 20 6f 66 20 74 68  // get rid of th
11e30 65 20 74 61 67 4e 61 6d 65 0a 20 20 20 20 74 61  e tagName.    ta
11e40 67 4e 61 6d 65 20 3d 20 30 0a 20 20 7d 0a 0a 20  gName = 0.  }.. 
11e50 20 70 75 73 68 54 61 67 73 28 65 6c 73 29 0a 0a   pushTags(els)..
11e60 20 20 72 65 74 75 72 6e 20 74 61 67 73 0a 7d 0a    return tags.}.
11e70 0a 2f 2a 2a 0a 20 2a 20 55 70 64 61 74 65 20 61  ./**. * Update a
11e80 6c 6c 20 74 68 65 20 74 61 67 73 20 69 6e 73 74  ll the tags inst
11e90 61 6e 63 65 73 20 63 72 65 61 74 65 64 0a 20 2a  ances created. *
11ea0 20 40 72 65 74 75 72 6e 73 20 7b 20 41 72 72 61   @returns { Arra
11eb0 79 20 7d 20 61 6c 6c 20 74 68 65 20 74 61 67 73  y } all the tags
11ec0 20 69 6e 73 74 61 6e 63 65 73 0a 20 2a 2f 0a 72   instances. */.r
11ed0 69 6f 74 2e 75 70 64 61 74 65 20 3d 20 66 75 6e  iot.update = fun
11ee0 63 74 69 6f 6e 28 29 20 7b 0a 20 20 72 65 74 75  ction() {.  retu
11ef0 72 6e 20 65 61 63 68 28 5f 5f 76 69 72 74 75 61  rn each(__virtua
11f00 6c 44 6f 6d 2c 20 66 75 6e 63 74 69 6f 6e 28 74  lDom, function(t
11f10 61 67 29 20 7b 0a 20 20 20 20 74 61 67 2e 75 70  ag) {.    tag.up
11f20 64 61 74 65 28 29 0a 20 20 7d 29 0a 7d 0a 0a 2f  date().  }).}../
11f30 2a 2a 0a 20 2a 20 45 78 70 6f 72 74 20 74 68 65  **. * Export the
11f40 20 56 69 72 74 75 61 6c 20 44 4f 4d 0a 20 2a 2f   Virtual DOM. */
11f50 0a 72 69 6f 74 2e 76 64 6f 6d 20 3d 20 5f 5f 76  .riot.vdom = __v
11f60 69 72 74 75 61 6c 44 6f 6d 0a 0a 2f 2a 2a 0a 20  irtualDom../**. 
11f70 2a 20 45 78 70 6f 72 74 20 74 68 65 20 54 61 67  * Export the Tag
11f80 20 63 6f 6e 73 74 72 75 63 74 6f 72 0a 20 2a 2f   constructor. */
11f90 0a 72 69 6f 74 2e 54 61 67 20 3d 20 54 61 67 0a  .riot.Tag = Tag.
11fa0 20 20 2f 2f 20 73 75 70 70 6f 72 74 20 43 6f 6d    // support Com
11fb0 6d 6f 6e 4a 53 2c 20 41 4d 44 20 26 20 62 72 6f  monJS, AMD & bro
11fc0 77 73 65 72 0a 20 20 2f 2a 20 69 73 74 61 6e 62  wser.  /* istanb
11fd0 75 6c 20 69 67 6e 6f 72 65 20 6e 65 78 74 20 2a  ul ignore next *
11fe0 2f 0a 20 20 69 66 20 28 74 79 70 65 6f 66 20 65  /.  if (typeof e
11ff0 78 70 6f 72 74 73 20 3d 3d 3d 20 54 5f 4f 42 4a  xports === T_OBJ
12000 45 43 54 29 0a 20 20 20 20 6d 6f 64 75 6c 65 2e  ECT).    module.
12010 65 78 70 6f 72 74 73 20 3d 20 72 69 6f 74 0a 20  exports = riot. 
12020 20 65 6c 73 65 20 69 66 20 28 74 79 70 65 6f 66   else if (typeof
12030 20 64 65 66 69 6e 65 20 3d 3d 3d 20 54 5f 46 55   define === T_FU
12040 4e 43 54 49 4f 4e 20 26 26 20 74 79 70 65 6f 66  NCTION && typeof
12050 20 64 65 66 69 6e 65 2e 61 6d 64 20 21 3d 3d 20   define.amd !== 
12060 54 5f 55 4e 44 45 46 29 0a 20 20 20 20 64 65 66  T_UNDEF).    def
12070 69 6e 65 28 66 75 6e 63 74 69 6f 6e 28 29 20 7b  ine(function() {
12080 20 72 65 74 75 72 6e 20 72 69 6f 74 20 7d 29 0a   return riot }).
12090 20 20 65 6c 73 65 0a 20 20 20 20 77 69 6e 64 6f    else.    windo
120a0 77 2e 72 69 6f 74 20 3d 20 72 69 6f 74 0a 0a 7d  w.riot = riot..}
120b0 29 28 74 79 70 65 6f 66 20 77 69 6e 64 6f 77 20  )(typeof window 
120c0 21 3d 20 27 75 6e 64 65 66 69 6e 65 64 27 20 3f  != 'undefined' ?
120d0 20 77 69 6e 64 6f 77 20 3a 20 76 6f 69 64 20 30   window : void 0
120e0 29 3b 0a                                         );.