{"version":3,"file":"ractive.min.js","sources":["../src/view/Fragment.js","../src/Ractive/prototype/reset.js","../src/Ractive/prototype/reverse.js","../src/Ractive/prototype/shift.js","../src/Ractive/prototype/sort.js","../src/Ractive/prototype/splice.js","../src/Ractive/prototype/unshift.js","../src/Ractive/prototype.js","../src/Ractive/static/styles.js","../src/extend/_extend.js","../src/Ractive.js","../src/view/items/component/Mapping.js","../src/view/items/element/specials/Option.js","../src/view/items/Partial.js","../src/model/specials/KeyModel.js","../src/view/RepeatedFragment.js","../src/view/items/Section.js","../src/view/items/element/specials/Select.js","../src/view/items/element/specials/Textarea.js","../src/view/items/Text.js","../src/config/visibility.js","../src/view/items/element/transitions/prefix.js","../src/view/items/element/transitions/createTransitions.js","../src/view/items/element/transitions/hyphenate.js","../src/view/items/element/Transition.js","../src/view/items/triple/insertHtml.js","../src/view/items/Triple.js","../src/view/items/createItem.js","../src/view/resolvers/ExpressionProxy.js","../src/view/items/element/Decorator.js","../src/view/items/Doctype.js","../src/view/items/element/binding/Binding.js","../src/view/items/element/binding/CheckboxBinding.js","../src/view/items/element/binding/getBindingGroup.js","../src/view/items/element/binding/CheckboxNameBinding.js","../src/view/items/element/binding/ContentEditableBinding.js","../src/view/items/element/binding/GenericBinding.js","../src/view/items/element/binding/FileBinding.js","../src/view/items/element/binding/MultipleSelectBinding.js","../src/view/items/element/binding/NumericBinding.js","../src/view/items/element/binding/RadioBinding.js","../src/view/items/element/binding/RadioNameBinding.js","../src/view/items/element/binding/SingleSelectBinding.js","../src/view/items/Element.js","../src/view/items/element/specials/Form.js","../src/view/items/element/ElementEvents.js","../src/view/items/component/RactiveEvent.js","../src/view/items/shared/EventDirective.js","../src/view/resolvers/ReferenceExpressionProxy.js","../src/view/items/shared/Mustache.js","../src/view/items/Interpolator.js","../src/view/items/element/specials/Input.js","../src/utils/parseJSON.js","../src/shared/Context.js","../src/Ractive/static/getContext.js","../src/utils/dom.js","../src/config/namespaces.js","../src/Ractive/prototype/observe/Observer.js","../src/Ractive/prototype/observe/Pattern.js","../src/Ractive/prototype/observe/Array.js","../src/Ractive/prototype/observeOnce.js","../src/Ractive/prototype/shared/trim.js","../src/Ractive/prototype/shared/notEmptyString.js","../src/Ractive/prototype/pop.js","../src/Ractive/prototype/push.js","../src/global/css.js","../src/Ractive/config/custom/adapt.js","../src/utils/cleanCss.js","../src/Ractive/config/custom/css/transform.js","../src/model/specials/CSSModel.js","../src/Ractive/config/custom/css/css.js","../src/Ractive/config/custom/data.js","../src/Ractive/config/custom/template.js","../src/Ractive/config/registries.js","../src/Ractive/config/config.js","../src/view/items/shared/Item.js","../src/view/helpers/specialAttrs.js","../src/view/items/element/attribute/getUpdateDelegate.js","../src/view/items/element/attribute/propertyNames.js","../src/view/items/element/ConditionalAttribute.js","../src/view/items/element/Attribute.js","../src/view/items/element/BindingFlag.js","../src/view/items/Comment.js","../src/model/specials/RactiveModel.js","../src/model/RootModel.js","../src/Ractive/construct.js","../src/view/items/Component.js","../src/model/ComputationChild.js","../src/model/Computation.js","../src/utils/log.js","../src/config/errors.js","../src/Ractive/static/interpolators.js","../src/shared/keypaths.js","../src/utils/bind.js","../src/model/ModelBase.js","../src/global/capture.js","../src/model/LinkModel.js","../src/shared/getFunction.js","../src/config/template.js","../src/parse/Parser.js","../src/config/types.js","../src/parse/converters/expressions/readTypeof.js","../src/parse/converters/mustache/readDelimiterChange.js","../src/parse/converters/expressions/primary/literal/readRegexpLiteral.js","../src/utils/escapeRegExp.js","../src/parse/converters/utils/getLowestIndex.js","../src/utils/html.js","../src/parse/converters/expressions/shared/errors.js","../src/parse/converters/expressions/primary/literal/readNumberLiteral.js","../src/parse/converters/expressions/primary/literal/stringLiteral/makeQuotedStringMatcher.js","../src/parse/converters/expressions/primary/literal/readStringLiteral.js","../src/parse/converters/expressions/primary/literal/readTemplateStringLiteral.js","../src/parse/converters/expressions/shared/patterns.js","../src/parse/converters/expressions/shared/readKey.js","../src/parse/converters/expressions/primary/readReference.js","../src/parse/converters/expressions/readLogicalOr.js","../src/parse/converters/element/readAttribute.js","../src/parse/converters/readMustache.js","../src/parse/converters/mustache/readAliases.js","../src/parse/converters/mustache/section/readInlineBlock.js","../src/parse/converters/mustache/handlebarsBlockCodes.js","../src/parse/converters/mustache/readSection.js","../src/parse/converters/readHtmlComment.js","../src/parse/utils/stripStandalones.js","../src/parse/utils/cleanup.js","../src/parse/converters/element/readClosingTag.js","../src/parse/converters/readElement.js","../src/parse/converters/readPartialDefinitionSection.js","../src/Ractive/shared.js","../src/parse/_parse.js","../src/Ractive/config/runtime-parser.js","../src/global/TransitionManager.js","../src/global/runloop.js","../src/shared/Ticker.js","../src/model/helpers/getPrefixer.js","../src/model/Model.js","../src/model/specials/SharedModel.js","../src/shared/getRactiveContext.js","../src/shared/set.js","../src/Ractive/prototype/shared/add.js","../src/Ractive/prototype/animate.js","../src/events/fireEvent.js","../src/events/Hook.js","../src/Ractive/prototype/shared/makeArrayMethod.js","../src/Ractive/prototype/teardown.js","../src/Ractive/helpers/subscribe.js","../src/view/items/shared/directiveArgs.js","../src/view/items/element/binding/handleDomEvent.js","../src/utils/getSelectedOptions.js","../src/view/items/element/binding/selectBinding.js","../src/view/items/shared/progressiveText.js","../src/view/resolvers/resolve.js","../src/view/items/partial/getPartialTemplate.js","../src/view/items/component/getComponentConstructor.js","../src/view/items/asyncProxy.js","../src/view/items/Await.js","../src/view/helpers/processItems.js","../src/Ractive/initialise.js","../src/Ractive/render.js","../src/Ractive/prototype/render.js","../src/Ractive/prototype/resetPartial.js","../src/Ractive/prototype/resetTemplate.js","../src/Ractive/prototype/set.js","../src/Ractive/prototype/subtract.js","../src/Ractive/prototype/toggle.js","../src/Ractive/prototype/toCSS.js","../src/Ractive/prototype/toHTML.js","../src/Ractive/prototype/toText.js","../src/Ractive/prototype/transition.js","../src/Ractive/prototype/unlink.js","../src/Ractive/prototype/unrender.js","../src/Ractive/prototype/updateModel.js","../src/Ractive/prototype/use.js","../src/Ractive/static/isInstance.js","../src/Ractive/static/styleGet.js","../src/Ractive/static/sharedSet.js","../src/Ractive/static/sharedGet.js","../src/Ractive/static/use.js","../src/extend/_macro.js","../src/Ractive/static/findPlugin.js","../src/polyfills/Object.assign.js","../src/utils/object.js","../src/utils/is.js","../src/polyfills/performance.now.js","../src/polyfills/array.find.js","../src/polyfills/node.contains.js","../src/config/environment.js","../src/polyfills/Promise.js","../src/polyfills/requestAnimationFrame.js","../src/Ractive/config/defaults.js","../src/Ractive/static/easing.js","../src/view/resolvers/resolveReference.js","../src/Ractive/prototype/add.js","../src/events/eventStack.js","../src/shared/anchors.js","../src/Ractive/prototype/attachChild.js","../src/Ractive/prototype/compute.js","../src/Ractive/prototype/detach.js","../src/Ractive/prototype/detachChild.js","../src/Ractive/prototype/find.js","../src/Ractive/prototype/findAll.js","../src/Ractive/prototype/findAllComponents.js","../src/Ractive/prototype/findComponent.js","../src/Ractive/prototype/findContainer.js","../src/Ractive/prototype/findParent.js","../src/view/items/shared/findElement.js","../src/shared/getNewIndices.js","../src/Ractive/prototype/update.js","../src/Ractive/prototype/fire.js","../src/Ractive/prototype/get.js","../src/Ractive/prototype/getLocalContext.js","../src/Ractive/prototype/getContext.js","../src/Ractive/prototype/insert.js","../src/Ractive/prototype/link.js","../src/Ractive/static/keypaths.js","../src/Ractive/prototype/observe.js","../src/Ractive/prototype/off.js","../src/Ractive/prototype/on.js","../src/Ractive/prototype/once.js","../src/Ractive/prototype/readLink.js","../src/utils/id.js","../src/Ractive/static/styleSet.js","../src/Ractive/config/wrapPrototypeMethod.js","../src/Ractive/config/deprecate.js","../src/utils/noop.js","../src/shared/registry.js","../src/shared/interpolate.js","../src/utils/array.js","../src/shared/methodCallers.js","../src/shared/rebind.js","../src/parse/utils/createFunction.js","../src/parse/converters/expressions/primary/literal/readBooleanLiteral.js","../src/parse/converters/expressions/primary/literal/objectLiteral/keyValuePair.js","../src/parse/converters/expressions/primary/literal/objectLiteral/keyValuePairs.js","../src/parse/converters/expressions/primary/literal/readObjectLiteral.js","../src/parse/converters/expressions/primary/literal/readArrayLiteral.js","../src/parse/converters/expressions/primary/readLiteral.js","../src/parse/converters/expressions/primary/readBracketedExpression.js","../src/parse/converters/expressions/readPrimary.js","../src/parse/converters/expressions/shared/readRefinement.js","../src/parse/converters/expressions/readMemberOrInvocation.js","../src/parse/converters/expressions/readConditional.js","../src/parse/converters/readExpression.js","../src/parse/converters/expressions/shared/readExpressionList.js","../src/parse/converters/readExpressionOrReference.js","../src/parse/utils/flattenExpression.js","../src/parse/utils/refineExpression.js","../src/parse/converters/mustache/readTriple.js","../src/parse/converters/mustache/readUnescaped.js","../src/parse/converters/mustache/readPartial.js","../src/parse/converters/mustache/readMustacheComment.js","../src/parse/converters/mustache/readInterpolator.js","../src/parse/converters/mustache/section/readClosing.js","../src/parse/utils/trimWhitespace.js","../src/utils/hyphenateCamel.js","../src/parse/converters/readText.js","../src/parse/converters/readTemplate.js","../src/parse/utils/insertExpressions.js","../src/Ractive/helpers/getComputationSignature.js"],"sourcesContent":["import { ELEMENT, YIELDER } from 'config/types';\nimport runloop from 'src/global/runloop';\nimport { findMap } from 'utils/array';\nimport { getContext, findParentWithContext } from 'shared/getRactiveContext';\nimport { shuffled, toEscapedString, toString } from 'shared/methodCallers';\nimport createItem from './items/createItem';\nimport processItems from './helpers/processItems';\nimport parseJSON from 'utils/parseJSON';\nimport { createDocumentFragment } from 'utils/dom';\nimport KeyModel from 'src/model/specials/KeyModel';\nimport resolve from './resolvers/resolve';\n\nfunction resolveAliases(aliases, fragment, dest = {}) {\n  for (let i = 0; i < aliases.length; i++) {\n    if (!dest[aliases[i].n]) {\n      const m = resolve(fragment, aliases[i].x);\n      dest[aliases[i].n] = m;\n      m.reference();\n    }\n  }\n\n  return dest;\n}\n\nexport default class Fragment {\n  constructor(options) {\n    this.owner = options.owner; // The item that owns this fragment - an element, section, partial, or attribute\n\n    this.isRoot = !options.owner.up;\n    this.parent = this.isRoot ? null : this.owner.up;\n    this.ractive = options.ractive || (this.isRoot ? options.owner : this.parent.ractive);\n\n    this.componentParent =\n      this.isRoot && this.ractive.component\n        ? this.ractive.component.up\n        : this.owner.containerFragment || null;\n    if (!this.isRoot || this.ractive.delegate) {\n      this.delegate = this.owner.containerFragment\n        ? this.owner.containerFragment && this.owner.containerFragment.delegate\n        : (this.componentParent && this.componentParent.delegate) ||\n          (this.parent && this.parent.delegate);\n    } else {\n      this.delegate = false;\n    }\n\n    this.context = null;\n    this.rendered = false;\n\n    // encapsulated styles should be inherited until they get applied by an element\n    if ('cssIds' in options) {\n      this.cssIds = options.cssIds && options.cssIds.length && options.cssIds;\n    } else {\n      this.cssIds = this.parent ? this.parent.cssIds : null;\n    }\n\n    this.dirty = false;\n    this.dirtyValue = true; // used for attribute values\n\n    this.template = options.template || [];\n    this.createItems();\n  }\n\n  bind(context) {\n    this.context = context;\n\n    if (this.owner.template.z) {\n      this.aliases = resolveAliases(\n        this.owner.template.z,\n        this.owner.containerFragment || this.parent\n      );\n    }\n\n    const len = this.items.length;\n    for (let i = 0; i < len; i++) this.items[i].bind();\n    this.bound = true;\n\n    // in rare cases, a forced resolution (or similar) will cause the\n    // fragment to be dirty before it's even finished binding. In those\n    // cases we update immediately\n    if (this.dirty) this.update();\n\n    return this;\n  }\n\n  bubble() {\n    this.dirtyValue = true;\n\n    if (!this.dirty) {\n      this.dirty = true;\n\n      if (this.isRoot) {\n        // TODO encapsulate 'is component root, but not overall root' check?\n        if (this.ractive.component) {\n          this.ractive.component.bubble();\n        } else if (this.bound) {\n          runloop.addFragment(this);\n        }\n      } else {\n        this.owner.bubble(this.index);\n      }\n    }\n  }\n\n  createItems() {\n    // this is a hot code path\n    const max = this.template.length;\n    this.items = [];\n    for (let i = 0; i < max; i++) {\n      this.items[i] = createItem({\n        up: this,\n        template: this.template[i],\n        index: i\n      });\n    }\n  }\n\n  destroyed() {\n    const len = this.items.length;\n    for (let i = 0; i < len; i++) this.items[i].destroyed();\n    if (this.pathModel) this.pathModel.destroyed();\n    if (this.rootModel) this.rootModel.destroyed();\n  }\n\n  detach() {\n    const docFrag = createDocumentFragment();\n    const xs = this.items;\n    const len = xs.length;\n    for (let i = 0; i < len; i++) {\n      docFrag.appendChild(xs[i].detach());\n    }\n    return docFrag;\n  }\n\n  find(selector, options) {\n    return findMap(this.items, i => i.find(selector, options));\n  }\n\n  findAll(selector, options) {\n    if (this.items) {\n      this.items.forEach(i => i.findAll && i.findAll(selector, options));\n    }\n  }\n\n  findComponent(name, options) {\n    return findMap(this.items, i => i.findComponent(name, options));\n  }\n\n  findAllComponents(name, options) {\n    if (this.items) {\n      this.items.forEach(i => i.findAllComponents && i.findAllComponents(name, options));\n    }\n  }\n\n  findContext() {\n    const base = findParentWithContext(this);\n    if (!base || !base.context) return this.ractive.viewmodel;\n    else return base.context;\n  }\n\n  findNextNode(item) {\n    // search for the next node going forward\n    if (item) {\n      let it;\n      for (let i = item.index + 1; i < this.items.length; i++) {\n        it = this.items[i];\n        if (!it || !it.firstNode) continue;\n\n        const node = it.firstNode(true);\n        if (node) return node;\n      }\n    }\n\n    // if this is the root fragment, and there are no more items,\n    // it means we're at the end...\n    if (this.isRoot) {\n      if (this.ractive.component) {\n        return this.ractive.component.up.findNextNode(this.ractive.component);\n      }\n\n      // TODO possible edge case with other content\n      // appended to this.ractive.el?\n      return null;\n    }\n\n    if (this.parent) return this.owner.findNextNode(this); // the argument is in case the parent is a RepeatedFragment\n  }\n\n  findParentNode() {\n    let fragment = this;\n\n    do {\n      if (fragment.owner.type === ELEMENT) {\n        return fragment.owner.node;\n      }\n\n      if (fragment.isRoot && !fragment.ractive.component) {\n        // TODO encapsulate check\n        return fragment.ractive.el;\n      }\n\n      if (fragment.owner.type === YIELDER) {\n        fragment = fragment.owner.containerFragment;\n      } else {\n        fragment = fragment.componentParent || fragment.parent; // TODO ugh\n      }\n    } while (fragment);\n\n    throw new Error('Could not find parent node'); // TODO link to issue tracker\n  }\n\n  firstNode(skipParent) {\n    const node = findMap(this.items, i => i.firstNode(true));\n    if (node) return node;\n    if (skipParent) return null;\n\n    return this.parent.findNextNode(this.owner);\n  }\n\n  getKey() {\n    return this.keyModel || (this.keyModel = new KeyModel(this.key));\n  }\n\n  getIndex() {\n    return this.idxModel || (this.idxModel = new KeyModel(this.index));\n  }\n\n  rebind(next) {\n    this.context = next;\n    if (this.rootModel) this.rootModel.context = this.context;\n    if (this.pathModel) this.pathModel.context = this.context;\n  }\n\n  rebound(update) {\n    if (this.owner.template.z) {\n      const aliases = this.aliases;\n      for (const k in aliases) {\n        if (aliases[k].rebound) aliases[k].rebound(update);\n        else {\n          aliases[k].unreference();\n          aliases[k] = 0;\n        }\n      }\n\n      resolveAliases(this.owner.template.z, this.owner.containerFragment || this.parent, aliases);\n    }\n\n    this.items.forEach(x => x.rebound(update));\n    if (update) {\n      if (this.rootModel) this.rootModel.applyValue(this.context.getKeypath(this.ractive.root));\n      if (this.pathModel) this.pathModel.applyValue(this.context.getKeypath());\n    }\n  }\n\n  render(target, occupants) {\n    if (this.rendered) throw new Error('Fragment is already rendered!');\n    this.rendered = true;\n\n    const xs = this.items;\n    const len = xs.length;\n    for (let i = 0; i < len; i++) {\n      xs[i].render(target, occupants);\n    }\n  }\n\n  resetTemplate(template) {\n    const wasBound = this.bound;\n    const wasRendered = this.rendered;\n\n    // TODO ensure transitions are disabled globally during reset\n\n    if (wasBound) {\n      if (wasRendered) this.unrender(true);\n      this.unbind();\n    }\n\n    this.template = template;\n    this.createItems();\n\n    if (wasBound) {\n      this.bind(this.context);\n\n      if (wasRendered) {\n        const parentNode = this.findParentNode();\n        const anchor = this.findNextNode();\n\n        if (anchor) {\n          const docFrag = createDocumentFragment();\n          this.render(docFrag);\n          parentNode.insertBefore(docFrag, anchor);\n        } else {\n          this.render(parentNode);\n        }\n      }\n    }\n  }\n\n  shuffled() {\n    this.items.forEach(shuffled);\n    if (this.rootModel) this.rootModel.applyValue(this.context.getKeypath(this.ractive.root));\n    if (this.pathModel) this.pathModel.applyValue(this.context.getKeypath());\n  }\n\n  toString(escape) {\n    return this.items.map(escape ? toEscapedString : toString).join('');\n  }\n\n  unbind(view) {\n    if (this.owner.template.z && !this.owner.yielder) {\n      for (const k in this.aliases) {\n        this.aliases[k].unreference();\n      }\n\n      this.aliases = {};\n    }\n\n    this.context = null;\n    const len = this.items.length;\n    for (let i = 0; i < len; i++) this.items[i].unbind(view);\n    this.bound = false;\n\n    return this;\n  }\n\n  unrender(shouldDestroy) {\n    const len = this.items.length;\n    for (let i = 0; i < len; i++) this.items[i].unrender(shouldDestroy);\n    this.rendered = false;\n  }\n\n  update() {\n    if (this.dirty) {\n      if (!this.updating) {\n        this.dirty = false;\n        this.updating = true;\n        const len = this.items.length;\n        for (let i = 0; i < len; i++) this.items[i].update();\n        this.updating = false;\n      } else if (this.isRoot) {\n        runloop.addFragmentToRoot(this);\n      }\n    }\n  }\n\n  valueOf() {\n    if (this.items.length === 1) {\n      return this.items[0].valueOf();\n    }\n\n    if (this.dirtyValue) {\n      const values = {};\n      const source = processItems(this.items, values, this.ractive._guid);\n      const parsed = parseJSON(source, values);\n\n      this.value = parsed ? parsed.value : this.toString();\n\n      this.dirtyValue = false;\n    }\n\n    return this.value;\n  }\n}\nFragment.prototype.getContext = getContext;\nFragment.prototype.getKeypath = getKeypath;\n\nexport function getKeypath(root) {\n  const base = findParentWithContext(this);\n  let model;\n  if (root) {\n    if (!this.rootModel) {\n      this.rootModel = new KeyModel(\n        this.context.getKeypath(this.ractive.root),\n        this.context,\n        this.ractive.root\n      );\n      model = this.rootModel;\n    } else return this.rootModel;\n  } else {\n    if (!this.pathModel) {\n      this.pathModel = new KeyModel(this.context.getKeypath(), this.context);\n      model = this.pathModel;\n    } else return this.pathModel;\n  }\n\n  if (base && base.context) base.getKeypath(root).registerChild(model);\n\n  return model;\n}\n","import runloop from 'src/global/runloop';\nimport config from '../config/config';\nimport hooks from '../../events/Hook';\nimport dataConfigurator from '../config/custom/data';\nimport { isObjectType } from 'utils/is';\n\nconst shouldRerender = ['template', 'partials', 'components', 'decorators', 'events'];\n\nexport default function Ractive$reset(data) {\n  data = data || {};\n\n  if (!isObjectType(data)) {\n    throw new Error('The reset method takes either no arguments, or an object containing new data');\n  }\n\n  // TEMP need to tidy this up\n  data = dataConfigurator.init(this.constructor, this, { data });\n\n  const promise = runloop.start();\n\n  // If the root object is wrapped, try and use the wrapper's reset value\n  const wrapper = this.viewmodel.wrapper;\n  if (wrapper && wrapper.reset) {\n    if (wrapper.reset(data) === false) {\n      // reset was rejected, we need to replace the object\n      this.viewmodel.set(data);\n    }\n  } else {\n    this.viewmodel.set(data);\n  }\n\n  // reset config items and track if need to rerender\n  const changes = config.reset(this);\n  let rerender;\n\n  let i = changes.length;\n  while (i--) {\n    if (shouldRerender.indexOf(changes[i]) > -1) {\n      rerender = true;\n      break;\n    }\n  }\n\n  if (rerender) {\n    hooks.unrender.fire(this);\n    this.fragment.resetTemplate(this.template);\n    hooks.render.fire(this);\n    hooks.complete.fire(this);\n  }\n\n  runloop.end();\n\n  hooks.reset.fire(this, data);\n\n  return promise;\n}\n","import makeArrayMethod from './shared/makeArrayMethod';\nexport default makeArrayMethod('reverse').path;\n","import makeArrayMethod from './shared/makeArrayMethod';\nexport default makeArrayMethod('shift').path;\n","import makeArrayMethod from './shared/makeArrayMethod';\nexport default makeArrayMethod('sort').path;\n","import makeArrayMethod from './shared/makeArrayMethod';\nexport default makeArrayMethod('splice').path;\n","import makeArrayMethod from './shared/makeArrayMethod';\nexport default makeArrayMethod('unshift').path;\n","import add from './prototype/add';\nimport animate from './prototype/animate';\nimport attachChild from './prototype/attachChild';\nimport compute from './prototype/compute';\nimport detach from './prototype/detach';\nimport detachChild from './prototype/detachChild';\nimport find from './prototype/find';\nimport findAll from './prototype/findAll';\nimport findAllComponents from './prototype/findAllComponents';\nimport findComponent from './prototype/findComponent';\nimport findContainer from './prototype/findContainer';\nimport findParent from './prototype/findParent';\nimport fire from './prototype/fire';\nimport get from './prototype/get';\nimport getLocalContext from './prototype/getLocalContext';\nimport getContext from './prototype/getContext';\nimport insert from './prototype/insert';\nimport link from './prototype/link';\nimport observe from './prototype/observe';\nimport observeOnce from './prototype/observeOnce';\nimport off from './prototype/off';\nimport on from './prototype/on';\nimport once from './prototype/once';\nimport pop from './prototype/pop';\nimport push from './prototype/push';\nimport readLink from './prototype/readLink';\nimport render from './prototype/render';\nimport reset from './prototype/reset';\nimport resetPartial from './prototype/resetPartial';\nimport resetTemplate from './prototype/resetTemplate';\nimport reverse from './prototype/reverse';\nimport set from './prototype/set';\nimport shift from './prototype/shift';\nimport sort from './prototype/sort';\nimport splice from './prototype/splice';\nimport subtract from './prototype/subtract';\nimport teardown from './prototype/teardown';\nimport toggle from './prototype/toggle';\nimport toCSS from './prototype/toCSS';\nimport toHTML from './prototype/toHTML';\nimport toText from './prototype/toText';\nimport transition from './prototype/transition';\nimport unlink from './prototype/unlink';\nimport unrender from './prototype/unrender';\nimport unshift from './prototype/unshift';\nimport update from './prototype/update';\nimport updateModel from './prototype/updateModel';\nimport use from './prototype/use';\n\nconst proto = {\n  add,\n  animate,\n  attachChild,\n  compute,\n  detach,\n  detachChild,\n  find,\n  findAll,\n  findAllComponents,\n  findComponent,\n  findContainer,\n  findParent,\n  fire,\n  get,\n  getLocalContext,\n  getContext,\n  insert,\n  link,\n  observe,\n  observeOnce,\n  off,\n  on,\n  once,\n  pop,\n  push,\n  readLink,\n  render,\n  reset,\n  resetPartial,\n  resetTemplate,\n  reverse,\n  set,\n  shift,\n  sort,\n  splice,\n  subtract,\n  teardown,\n  toggle,\n  toCSS,\n  toCss: toCSS,\n  toHTML,\n  toHtml: toHTML,\n  toText,\n  transition,\n  unlink,\n  unrender,\n  unshift,\n  update,\n  updateModel,\n  use\n};\n\nexport default proto;\n","import { isFunction } from 'utils/is';\nimport { addCSS, applyCSS } from 'src/global/css';\nimport { recomputeCSS } from './styleSet';\n\nconst styles = [];\n\nexport function addStyle(id, css) {\n  if (styles.find(s => s.id === id))\n    throw new Error(`Extra styles with the id '${id}' have already been added.`);\n  styles.push({ id, css });\n\n  if (!this.css) {\n    Object.defineProperty(this, 'css', { configurable: false, writable: false, value: buildCSS });\n  }\n\n  if (!this._cssDef) {\n    Object.defineProperty(this, '_cssDef', {\n      configurable: true,\n      writable: false,\n      value: {\n        transform: false,\n        id: 'Ractive.addStyle'\n      }\n    });\n\n    addCSS(this._cssDef);\n  }\n\n  recomputeCSS(this);\n  applyCSS(true);\n}\n\nfunction buildCSS(data) {\n  return styles\n    .map(s => `\\n/* ---- extra style ${s.id} */\\n` + (isFunction(s.css) ? s.css(data) : s.css))\n    .join('');\n}\n\nexport function hasStyle(id) {\n  return !!styles.find(s => s.id === id);\n}\n","import config from '../Ractive/config/config';\nimport dataConfigurator from '../Ractive/config/custom/data';\nimport construct from '../Ractive/construct';\nimport initialise from '../Ractive/initialise';\nimport Ractive from '../Ractive';\nimport isInstance from '../Ractive/static/isInstance';\nimport styleSet from '../Ractive/static/styleSet';\nimport styleGet from '../Ractive/static/styleGet';\nimport { addStyle, hasStyle } from '../Ractive/static/styles';\nimport sharedSet from '../Ractive/static/sharedSet';\nimport sharedGet from '../Ractive/static/sharedGet';\nimport use from '../Ractive/static/use';\nimport { create, defineProperties, toPairs, defineProperty } from 'utils/object';\nimport { isArray, isFunction } from 'utils/is';\n\nconst callsSuper = /super\\s*\\(|\\.call\\s*\\(\\s*this/;\n\nexport function extend(...options) {\n  if (!options.length) {\n    return extendOne(this);\n  } else {\n    return options.reduce(extendOne, this);\n  }\n}\n\nexport function extendWith(Class, options = {}) {\n  return extendOne(this, options, Class);\n}\n\nfunction extendOne(Parent, options = {}, Target) {\n  let proto;\n  let Child = isFunction(Target) && Target;\n\n  if (options.prototype instanceof Ractive) {\n    throw new Error(`Ractive no longer supports multiple inheritance.`);\n  }\n\n  if (Child) {\n    if (!(Child.prototype instanceof Parent)) {\n      throw new Error(\n        `Only classes that inherit the appropriate prototype may be used with extend`\n      );\n    }\n    if (!callsSuper.test(Child.toString())) {\n      throw new Error(`Only classes that call super in their constructor may be used with extend`);\n    }\n\n    proto = Child.prototype;\n  } else {\n    Child = function(options) {\n      if (!(this instanceof Child)) return new Child(options);\n      if (options && options.component === true) return;\n\n      construct(this, options || {});\n      initialise(this, options || {}, {});\n    };\n\n    proto = create(Parent.prototype);\n    proto.constructor = Child;\n\n    Child.prototype = proto;\n  }\n\n  // Static properties\n  defineProperties(Child, {\n    // alias prototype as defaults\n    defaults: { value: proto },\n\n    extend: { value: extend, writable: true, configurable: true },\n    extendWith: { value: extendWith, writable: true, configurable: true },\n    extensions: { value: [] },\n    use: { value: use },\n\n    isInstance: { value: isInstance },\n\n    Parent: { value: Parent },\n    Ractive: { value: Ractive },\n\n    styleGet: { value: styleGet.bind(Child), configurable: true },\n    styleSet: { value: styleSet.bind(Child), configurable: true }\n  });\n\n  // extend configuration\n  config.extend(Parent, proto, options, Child);\n\n  // store event and observer registries on the constructor when extending\n  Child._on = (Parent._on || []).concat(toPairs(options.on));\n  Child._observe = (Parent._observe || []).concat(toPairs(options.observe));\n\n  Parent.extensions.push(Child);\n\n  // attribute defs are not inherited, but they need to be stored\n  if (options.attributes) {\n    let attrs;\n\n    // allow an array of optional props or an object with arrays for optional and required props\n    if (isArray(options.attributes)) {\n      attrs = { optional: options.attributes, required: [] };\n    } else {\n      attrs = options.attributes;\n    }\n\n    // make sure the requisite keys actually store arrays\n    if (!isArray(attrs.required)) attrs.required = [];\n    if (!isArray(attrs.optional)) attrs.optional = [];\n\n    Child.attributes = attrs;\n  }\n\n  dataConfigurator.extend(Parent, proto, options, Child);\n\n  defineProperty(Child, 'helpers', { writable: true, value: proto.helpers });\n\n  if (isArray(options.use)) Child.use.apply(Child, options.use);\n\n  return Child;\n}\n\ndefineProperties(Ractive, {\n  sharedGet: { value: sharedGet },\n  sharedSet: { value: sharedSet },\n  styleGet: { configurable: true, value: styleGet.bind(Ractive) },\n  styleSet: { configurable: true, value: styleSet.bind(Ractive) },\n  addCSS: { configurable: false, value: addStyle.bind(Ractive) },\n  hasCSS: { configurable: false, value: hasStyle.bind(Ractive) }\n});\n","import './polyfills/Object.assign';\nimport './polyfills/array.find';\nimport './polyfills/node.contains';\nimport './polyfills/performance.now';\nimport './polyfills/Promise';\nimport './polyfills/requestAnimationFrame';\n\nimport defaults from './Ractive/config/defaults';\nimport easing from './Ractive/static/easing';\nimport interpolators from './Ractive/static/interpolators';\nimport { svg, win } from './config/environment';\nimport proto from './Ractive/prototype';\nimport { extend, extendWith } from './extend/_extend';\nimport macro from './extend/_macro';\nimport parse from './parse/_parse';\nimport getContext from './Ractive/static/getContext';\nimport isInstance from './Ractive/static/isInstance';\nimport use from './Ractive/static/use';\nimport construct from './Ractive/construct';\nimport initialise from './Ractive/initialise';\nimport { getCSS, splitTag } from './global/css';\nimport { escapeKey, unescapeKey, normalise } from './shared/keypaths';\nimport { joinKeys, splitKeypath } from './Ractive/static/keypaths';\nimport shared from './Ractive/shared';\nimport { findPlugin } from './Ractive/static/findPlugin';\nimport parseJSON from './utils/parseJSON';\nimport CSSModel from './model/specials/CSSModel';\nimport { data as sharedData } from './model/specials/SharedModel';\nimport { extern } from './shared/getRactiveContext';\nimport { warn } from 'utils/log';\n\nimport { batch } from './global/runloop';\n\nimport { assign, defineProperty, defineProperties } from 'utils/object';\n\nexport default function Ractive(options) {\n  if (!(this instanceof Ractive)) return new Ractive(options);\n  if (options && options.component) return;\n\n  construct(this, options || {});\n  initialise(this, options || {}, {});\n}\n\n// check to see if we're being asked to force Ractive as a global for some weird environments\nif (win && !win.Ractive) {\n  let opts = '';\n  const script =\n    document.currentScript ||\n    /* istanbul ignore next */ document.querySelector('script[data-ractive-options]');\n\n  if (script) opts = script.getAttribute('data-ractive-options') || '';\n\n  /* istanbul ignore next */\n  if (~opts.indexOf('ForceGlobal')) win.Ractive = Ractive;\n} else if (win) {\n  warn(`Ractive already appears to be loaded while loading BUILD_PLACEHOLDER_VERSION.`);\n}\n\nassign(Ractive.prototype, proto, defaults);\nRactive.prototype.constructor = Ractive;\n\n// alias prototype as `defaults`\nRactive.defaults = Ractive.prototype;\n\n// share defaults with the parser\nshared.defaults = Ractive.defaults;\nshared.Ractive = Ractive;\n\n// static properties\ndefineProperties(Ractive, {\n  // debug flag\n  DEBUG: { writable: true, value: true },\n  DEBUG_PROMISES: { writable: true, value: true },\n\n  // static methods:\n  extend: { value: extend },\n  extendWith: { value: extendWith },\n  escapeKey: { value: escapeKey },\n  evalObjectString: { value: parseJSON },\n  findPlugin: { value: findPlugin },\n  getContext: { value: getContext },\n  getCSS: { value: getCSS },\n  isInstance: { value: isInstance },\n  joinKeys: { value: joinKeys },\n  macro: { value: macro },\n  normaliseKeypath: { value: normalise },\n  parse: { value: parse },\n  splitKeypath: { value: splitKeypath },\n  // sharedSet and styleSet are in _extend because circular refs\n  unescapeKey: { value: unescapeKey },\n  use: { value: use },\n\n  // support\n  enhance: { writable: true, value: false },\n  svg: { value: svg },\n  tick: {\n    get() {\n      return batch && batch.promise;\n    }\n  },\n\n  // version\n  VERSION: { value: 'BUILD_PLACEHOLDER_VERSION' },\n\n  // plugins\n  adaptors: { writable: true, value: {} },\n  components: { writable: true, value: {} },\n  decorators: { writable: true, value: {} },\n  easing: { writable: true, value: easing },\n  events: { writable: true, value: {} },\n  extensions: { value: [] },\n  helpers: { writable: true, value: defaults.helpers },\n  interpolators: { writable: true, value: interpolators },\n  partials: { writable: true, value: {} },\n  transitions: { writable: true, value: {} },\n\n  // CSS variables\n  cssData: { configurable: true, value: {} },\n  perComponentStyleElements: { get: splitTag, set: splitTag },\n\n  // access to @shared without an instance\n  sharedData: { value: sharedData },\n\n  // for getting the source Ractive lib from a constructor\n  Ractive: { value: Ractive },\n\n  // to allow extending contexts\n  Context: { value: extern.Context.prototype }\n});\n\n// cssData must already be in place\ndefineProperty(Ractive, '_cssModel', {\n  configurable: true,\n  value: new CSSModel(Ractive)\n});\n\ndefineProperty(Ractive.prototype, 'rendered', {\n  get() {\n    return this.fragment && this.fragment.rendered;\n  }\n});\n","import { INTERPOLATOR } from '../../../config/types';\nimport Item from '../shared/Item';\nimport Fragment from '../../Fragment';\nimport findElement from '../shared/findElement';\nimport parseJSON from '../../../utils/parseJSON';\nimport resolve from '../../resolvers/resolve';\nimport runloop from '../../../global/runloop';\nimport { warnIfDebug } from 'utils/log';\nimport { splitKeypath } from 'shared/keypaths';\nimport { isArray, isObjectType, isString, isUndefined } from 'utils/is';\n\nexport default class Mapping extends Item {\n  constructor(options) {\n    super(options);\n\n    this.name = options.template.n;\n\n    this.owner = options.owner || options.up.owner || options.element || findElement(options.up);\n    this.element =\n      options.element || (this.owner.attributeByName ? this.owner : findElement(options.up));\n    this.up = this.element.up; // shared\n    this.ractive = this.up.ractive;\n\n    this.element.attributeByName[this.name] = this;\n\n    this.value = options.template.f;\n  }\n\n  bind() {\n    const template = this.template.f;\n    const viewmodel = this.element.instance.viewmodel;\n\n    if (template === 0) {\n      // empty attributes are `true`\n      viewmodel.joinKey(this.name).set(true);\n    } else if (isString(template)) {\n      const parsed = parseJSON(template);\n      viewmodel.joinKey(this.name).set(parsed ? parsed.value : template);\n    } else if (isArray(template)) {\n      createMapping(this, true);\n    }\n  }\n\n  rebound(update) {\n    if (this.boundFragment) this.boundFragment.rebound(update);\n    if (this.link) {\n      this.model = resolve(this.up, this.template.f[0]);\n      const model = this.element.instance.viewmodel.joinAll(splitKeypath(this.name));\n      model.link(this.model, this.name, { mapping: true });\n    }\n  }\n\n  render() {}\n\n  unbind(view) {\n    if (this.model) this.model.unregister(this);\n    if (this.boundFragment) this.boundFragment.unbind(view);\n\n    if (this.element.bound) {\n      if (this.link.target === this.model) this.link.owner.unlink();\n    }\n  }\n\n  unrender() {}\n\n  update() {\n    if (this.dirty) {\n      this.dirty = false;\n      if (this.boundFragment) this.boundFragment.update();\n    }\n  }\n}\n\nfunction createMapping(item) {\n  const template = item.template.f;\n  const viewmodel = item.element.instance.viewmodel;\n  const childData = viewmodel.value;\n\n  if (template.length === 1 && template[0].t === INTERPOLATOR) {\n    const model = resolve(item.up, template[0]);\n    const val = model.get(false);\n\n    // if the interpolator is not static\n    if (!template[0].s) {\n      item.model = model;\n      item.link = viewmodel.createLink(item.name, model, template[0].r, {\n        mapping: true\n      });\n\n      // initialize parent side of the mapping from child data\n      if (isUndefined(val) && !model.isReadonly && item.name in childData) {\n        model.set(childData[item.name]);\n      }\n    } else if (!isObjectType(val) || template[0].x) {\n      // copy non-object, non-computed vals through\n      viewmodel.joinKey(splitKeypath(item.name)).set(val);\n    } else {\n      // warn about trying to copy an object\n      warnIfDebug(`Cannot copy non-computed object value from static mapping '${item.name}'`);\n    }\n\n    // if the item isn't going to manage the model, give it a change to tear down if it's computed\n    if (model !== item.model) model.unregister();\n  } else {\n    item.boundFragment = new Fragment({\n      owner: item,\n      template\n    }).bind();\n\n    item.model = viewmodel.joinKey(splitKeypath(item.name));\n    item.model.set(item.boundFragment.valueOf());\n\n    // item is a *bit* of a hack\n    item.boundFragment.bubble = () => {\n      Fragment.prototype.bubble.call(item.boundFragment);\n      // defer this to avoid mucking around model deps if there happens to be an expression involved\n      runloop.scheduleTask(() => {\n        item.boundFragment.update();\n        item.model.set(item.boundFragment.valueOf());\n      });\n    };\n  }\n}\n","import { removeFromArray } from 'utils/array';\nimport Element from '../../Element';\nimport findElement from '../../shared/findElement';\nimport { isArray, isUndefined } from 'utils/is';\n\nexport default class Option extends Element {\n  constructor(options) {\n    const template = options.template;\n    if (!template.a) template.a = {};\n\n    // If the value attribute is missing, use the element's content,\n    // as long as it isn't disabled\n    if (isUndefined(template.a.value) && !('disabled' in template.a)) {\n      template.a.value = template.f || '';\n    }\n\n    super(options);\n\n    this.select = findElement(this.parent || this.up, false, 'select');\n  }\n\n  bind() {\n    if (!this.select) {\n      super.bind();\n      return;\n    }\n\n    // If the select has a value, it overrides the `selected` attribute on\n    // this option - so we delete the attribute\n    const selectedAttribute = this.attributeByName.selected;\n    if (selectedAttribute && this.select.getAttribute('value') !== undefined) {\n      const index = this.attributes.indexOf(selectedAttribute);\n      this.attributes.splice(index, 1);\n      delete this.attributeByName.selected;\n    }\n\n    super.bind();\n    this.select.options.push(this);\n  }\n\n  bubble() {\n    // if we're using content as value, may need to update here\n    const value = this.getAttribute('value');\n    if (this.node && this.node.value !== value) {\n      this.node._ractive.value = value;\n    }\n    super.bubble();\n  }\n\n  getAttribute(name) {\n    const attribute = this.attributeByName[name];\n    return attribute\n      ? attribute.getValue()\n      : name === 'value' && this.fragment\n      ? this.fragment.valueOf()\n      : undefined;\n  }\n\n  isSelected() {\n    const optionValue = this.getAttribute('value');\n\n    if (isUndefined(optionValue) || !this.select) {\n      return false;\n    }\n\n    const selectValue = this.select.getAttribute('value');\n\n    if (this.select.compare(selectValue, optionValue)) {\n      return true;\n    }\n\n    if (this.select.getAttribute('multiple') && isArray(selectValue)) {\n      let i = selectValue.length;\n      while (i--) {\n        if (this.select.compare(selectValue[i], optionValue)) {\n          return true;\n        }\n      }\n    }\n  }\n\n  render(target, occupants) {\n    super.render(target, occupants);\n\n    if (!this.attributeByName.value) {\n      this.node._ractive.value = this.getAttribute('value');\n    }\n  }\n\n  unbind(view) {\n    super.unbind(view);\n\n    if (this.select) {\n      removeFromArray(this.select.options, this);\n    }\n  }\n}\n","import { ELEMENT, PARTIAL, SECTION, SECTION_WITH, YIELDER } from 'config/types';\nimport { assign, create, hasOwn, keys } from 'utils/object';\nimport { isArray, isFunction, isObjectType, isString } from 'utils/is';\nimport noop from 'utils/noop';\nimport { MustacheContainer } from './shared/Mustache';\nimport Fragment from '../Fragment';\nimport getPartialTemplate from './partial/getPartialTemplate';\nimport { warnOnceIfDebug, warnIfDebug } from 'utils/log';\nimport parser from 'src/Ractive/config/runtime-parser';\nimport runloop from 'src/global/runloop';\nimport { applyCSS } from 'src/global/css';\nimport { splitKeypath } from 'shared/keypaths';\n\nexport default function Partial(options) {\n  MustacheContainer.call(this, options);\n\n  const tpl = options.template;\n\n  // yielder is a special form of partial that will later require special handling\n  if (tpl.t === YIELDER) {\n    this.yielder = 1;\n  } else if (tpl.t === ELEMENT) {\n    // this is a macro partial, complete with macro constructor\n    // leaving this as an element will confuse up-template searches\n    this.type = PARTIAL;\n    this.macro = options.macro;\n  }\n}\n\nconst proto = (Partial.prototype = create(MustacheContainer.prototype));\n\nassign(proto, {\n  constructor: Partial,\n\n  bind() {\n    const template = this.template;\n\n    if (this.yielder) {\n      // the container is the instance that owns this node\n      this.container = this.up.ractive;\n      this.component = this.container.component;\n      this.containerFragment = this.up;\n\n      // normal component\n      if (this.component) {\n        // yields skip the owning instance and go straight to the surrounding context\n        this.up = this.component.up;\n\n        // {{yield}} is equivalent to {{yield content}}\n        if (!template.r && !template.x && !template.rx) this.refName = 'content';\n      } else {\n        // plain-ish instance that may be attached to a parent later\n        this.fragment = new Fragment({\n          owner: this,\n          template: []\n        });\n        this.fragment.bind();\n        return;\n      }\n    }\n\n    // this is a macro/super partial\n    if (this.macro) {\n      this.fn = this.macro;\n    } else {\n      // this is a plain partial or yielder\n      if (!this.refName) this.refName = template.r;\n\n      // if the refName exists as a partial, this is a plain old partial reference where no model binding will happen\n      if (this.refName) {\n        partialFromValue(this, this.refName);\n      }\n\n      // this is a dynamic/inline partial\n      if (!this.partial && !this.fn) {\n        MustacheContainer.prototype.bind.call(this);\n        if (this.model) partialFromValue(this, this.model.get());\n      }\n    }\n\n    if (!this.partial && !this.fn) {\n      warnOnceIfDebug(`Could not find template for partial '${this.name}'`);\n    }\n\n    createFragment(this, this.partial || []);\n\n    // macro/super partial\n    if (this.fn) initMacro(this);\n\n    this.fragment.bind();\n  },\n\n  bubble() {\n    if (!this.dirty) {\n      this.dirty = true;\n\n      if (this.yielder) {\n        this.containerFragment.bubble();\n      } else {\n        this.up.bubble();\n      }\n    }\n  },\n\n  findNextNode() {\n    return (this.containerFragment || this.up).findNextNode(this);\n  },\n\n  handleChange() {\n    this.dirtyTemplate = true;\n    this.externalChange = true;\n    this.bubble();\n  },\n\n  rebound(update) {\n    if (this._attrs) {\n      keys(this._attrs).forEach(k => this._attrs[k].rebound(update));\n    }\n    MustacheContainer.prototype.rebound.call(this, update);\n  },\n\n  refreshAttrs() {\n    keys(this._attrs).forEach(k => {\n      this.handle.attributes[k] = !this._attrs[k].items.length || this._attrs[k].valueOf();\n    });\n  },\n\n  resetTemplate() {\n    if (this.fn && this.proxy) {\n      this.last = 0;\n      if (this.externalChange) {\n        if (isFunction(this.proxy.teardown)) this.proxy.teardown();\n        this.fn = this.proxy = null;\n      } else {\n        this.partial = this.fnTemplate;\n        return true;\n      }\n    }\n\n    this.partial = null;\n\n    if (this.refName) {\n      this.partial = getPartialTemplate(this.ractive, this.refName, this.up);\n    }\n\n    if (!this.partial && this.model) {\n      partialFromValue(this, this.model.get());\n    }\n\n    if (!this.fn) {\n      if (this.last && this.partial === this.last) return false;\n      else if (this.partial) {\n        this.last = this.partial;\n        contextifyTemplate(this);\n      }\n    }\n\n    this.unbindAttrs();\n\n    if (this.fn) {\n      initMacro(this);\n      if (isFunction(this.proxy.render)) runloop.scheduleTask(() => this.proxy.render());\n    } else if (!this.partial) {\n      warnOnceIfDebug(`Could not find template for partial '${this.name}'`);\n    }\n\n    return true;\n  },\n\n  render(target, occupants) {\n    if (this.fn && this.fn._cssDef && !this.fn._cssDef.applied) applyCSS();\n\n    this.fragment.render(target, occupants);\n\n    if (this.proxy && isFunction(this.proxy.render)) this.proxy.render();\n  },\n\n  unbind(view) {\n    this.fragment.unbind(view);\n\n    this.unbindAttrs(view);\n\n    MustacheContainer.prototype.unbind.call(this, view);\n  },\n\n  unbindAttrs(view) {\n    if (this._attrs) {\n      keys(this._attrs).forEach(k => {\n        this._attrs[k].unbind(view);\n      });\n    }\n  },\n\n  unrender(shouldDestroy) {\n    if (this.proxy && isFunction(this.proxy.teardown)) this.proxy.teardown();\n\n    this.fragment.unrender(shouldDestroy);\n  },\n\n  update() {\n    const proxy = this.proxy;\n    this.updating = 1;\n\n    if (this.dirtyAttrs) {\n      this.dirtyAttrs = false;\n      keys(this._attrs).forEach(k => this._attrs[k].update());\n      this.refreshAttrs();\n      if (isFunction(proxy.update)) proxy.update(this.handle.attributes);\n    }\n\n    if (this.dirtyTemplate) {\n      this.dirtyTemplate = false;\n      this.resetTemplate() && this.fragment.resetTemplate(this.partial || []);\n    }\n\n    if (this.dirty) {\n      this.dirty = false;\n      if (proxy && isFunction(proxy.invalidate)) proxy.invalidate();\n      this.fragment.update();\n    }\n\n    this.externalChange = false;\n    this.updating = 0;\n  }\n});\n\nfunction createFragment(self, partial) {\n  self.partial = self.last = partial;\n  contextifyTemplate(self);\n\n  const options = {\n    owner: self,\n    template: self.partial\n  };\n\n  if (self.yielder) options.ractive = self.container.parent;\n\n  if (self.fn) options.cssIds = self.fn._cssIds;\n\n  self.fragment = new Fragment(options);\n}\n\nfunction contextifyTemplate(self) {\n  if (self.template.c) {\n    self.partial = [{ t: SECTION, n: SECTION_WITH, f: self.partial }];\n    assign(self.partial[0], self.template.c);\n    if (self.yielder) self.partial[0].y = self;\n    else self.partial[0].z = self.template.z;\n  }\n}\n\nfunction partialFromValue(self, value, okToParse) {\n  let tpl = value;\n\n  if (isArray(tpl)) {\n    self.partial = tpl;\n  } else if (tpl && isObjectType(tpl)) {\n    if (isArray(tpl.t)) self.partial = tpl.t;\n    else if (isString(tpl.template))\n      self.partial = parsePartial(tpl.template, tpl.template, self.ractive).t;\n  } else if (isFunction(tpl) && tpl.styleSet) {\n    self.fn = tpl;\n    if (self.fragment) self.fragment.cssIds = tpl._cssIds;\n  } else if (tpl != null) {\n    tpl = getPartialTemplate(self.ractive, '' + tpl, self.containerFragment || self.up);\n    if (tpl) {\n      self.name = value;\n      if (tpl.styleSet) {\n        self.fn = tpl;\n        if (self.fragment) self.fragment.cssIds = tpl._cssIds;\n      } else self.partial = tpl;\n    } else if (okToParse) {\n      self.partial = parsePartial('' + value, '' + value, self.ractive).t;\n    } else {\n      self.name = value;\n    }\n  }\n\n  return self.partial;\n}\n\nfunction setTemplate(template) {\n  partialFromValue(this, template, true);\n\n  if (!this.initing) {\n    this.dirtyTemplate = true;\n    this.fnTemplate = this.partial;\n\n    if (this.updating) {\n      this.bubble();\n      runloop.promise();\n    } else {\n      const promise = runloop.start();\n\n      this.bubble();\n      runloop.end();\n\n      return promise;\n    }\n  }\n}\n\nfunction aliasLocal(ref, name) {\n  const aliases = this.fragment.aliases || (this.fragment.aliases = {});\n  if (!name) {\n    aliases[ref] = this._data;\n  } else {\n    aliases[name] = this._data.joinAll(splitKeypath(ref));\n  }\n}\n\nconst extras = 'extra-attributes';\n\nfunction initMacro(self) {\n  const fn = self.fn;\n  const fragment = self.fragment;\n\n  // defensively copy the template in case it changes\n  const template = (self.template = assign({}, self.template));\n  const handle = (self.handle = fragment.getContext({\n    proxy: self,\n    aliasLocal,\n    name: self.template.e || self.name,\n    attributes: {},\n    setTemplate: setTemplate.bind(self),\n    template,\n    macro: fn\n  }));\n\n  if (!template.p) template.p = {};\n  template.p = handle.partials = assign({}, template.p);\n  if (!hasOwn(template.p, 'content')) template.p.content = template.f || [];\n\n  if (isArray(fn.attributes)) {\n    self._attrs = {};\n\n    const invalidate = function() {\n      this.dirty = true;\n      self.dirtyAttrs = true;\n      self.bubble();\n    };\n\n    if (isArray(template.m)) {\n      const attrs = template.m;\n      template.p[extras] = template.m = attrs.filter(a => !~fn.attributes.indexOf(a.n));\n      attrs\n        .filter(a => ~fn.attributes.indexOf(a.n))\n        .forEach(a => {\n          const fragment = new Fragment({\n            template: a.f,\n            owner: self\n          });\n          fragment.bubble = invalidate;\n          fragment.findFirstNode = noop;\n          self._attrs[a.n] = fragment;\n        });\n    } else {\n      template.p[extras] = [];\n    }\n  } else {\n    template.p[extras] = template.m;\n  }\n\n  if (self._attrs) {\n    keys(self._attrs).forEach(k => {\n      self._attrs[k].bind();\n    });\n    self.refreshAttrs();\n  }\n\n  self.initing = 1;\n  self.proxy = fn.call(self.ractive, handle, handle.attributes) || {};\n  if (!self.partial) self.partial = [];\n  self.fnTemplate = self.partial;\n  self.initing = 0;\n\n  contextifyTemplate(self);\n  fragment.resetTemplate(self.partial);\n}\n\nfunction parsePartial(name, partial, ractive) {\n  let parsed;\n\n  try {\n    parsed = parser.parse(partial, parser.getParseOptions(ractive));\n  } catch (e) {\n    warnIfDebug(`Could not parse partial from expression '${name}'\\n${e.message}`);\n  }\n\n  return parsed || { t: [] };\n}\n","import { addToArray, removeFromArray } from 'utils/array';\nimport { unescapeKey } from 'shared/keypaths';\nimport { capture } from 'src/global/capture';\nimport { handleChange } from 'src/shared/methodCallers';\nimport noop from 'utils/noop';\n\nexport default class KeyModel {\n  constructor(value, context, instance) {\n    this.value = this.key = value;\n    this.context = context;\n    this.isReadonly = this.isKey = true;\n    this.deps = [];\n    this.links = [];\n    this.children = [];\n    this.instance = instance;\n  }\n\n  applyValue(value) {\n    if (value !== this.value) {\n      this.value = this.key = value;\n      this.deps.forEach(handleChange);\n      this.links.forEach(handleChange);\n      this.children.forEach(c => {\n        c.applyValue(c.context.getKeypath(c.instance));\n      });\n    }\n  }\n\n  destroyed() {\n    if (this.upstream) this.upstream.unregisterChild(this);\n  }\n\n  get(shouldCapture) {\n    if (shouldCapture) capture(this);\n    return unescapeKey(this.value);\n  }\n\n  getKeypath() {\n    return unescapeKey(this.value);\n  }\n\n  has() {\n    return false;\n  }\n\n  rebind(next, previous) {\n    let i = this.deps.length;\n    while (i--) this.deps[i].rebind(next, previous, false);\n\n    i = this.links.length;\n    while (i--) this.links[i].relinking(next, false);\n  }\n\n  register(dependant) {\n    this.deps.push(dependant);\n  }\n\n  registerChild(child) {\n    addToArray(this.children, child);\n    child.upstream = this;\n  }\n\n  registerLink(link) {\n    addToArray(this.links, link);\n  }\n\n  unregister(dependant) {\n    removeFromArray(this.deps, dependant);\n  }\n\n  unregisterChild(child) {\n    removeFromArray(this.children, child);\n  }\n\n  unregisterLink(link) {\n    removeFromArray(this.links, link);\n  }\n}\n\nKeyModel.prototype.reference = noop;\nKeyModel.prototype.unreference = noop;\n","import { createDocumentFragment } from 'utils/dom';\nimport { isArray, isObject, isObjectType, isUndefined } from 'utils/is';\nimport { findMap, buildNewIndices } from 'utils/array';\nimport { toEscapedString, toString, shuffled, update } from 'shared/methodCallers';\nimport Fragment, { getKeypath } from './Fragment';\nimport { ELEMENT } from 'config/types';\nimport { getContext } from 'shared/getRactiveContext';\nimport { keys } from 'utils/object';\nimport KeyModel from 'src/model/specials/KeyModel';\nimport { splitKeypath } from '../shared/keypaths';\nimport resolve from './resolvers/resolve';\n\nconst keypathString = /^\"(\\\\\"|[^\"])+\"$/;\n\nexport default class RepeatedFragment {\n  constructor(options) {\n    this.parent = options.owner.up;\n\n    // bit of a hack, so reference resolution works without another\n    // layer of indirection\n    this.up = this;\n    this.owner = options.owner;\n    this.ractive = this.parent.ractive;\n    this.delegate =\n      this.ractive.delegate !== false && (this.parent.delegate || findDelegate(this.parent));\n    // delegation disabled by directive\n    if (this.delegate && this.delegate.delegate === false) this.delegate = false;\n    // let the element know it's a delegate handler\n    if (this.delegate) this.delegate.delegate = this.delegate;\n\n    // encapsulated styles should be inherited until they get applied by an element\n    this.cssIds = 'cssIds' in options ? options.cssIds : this.parent ? this.parent.cssIds : null;\n\n    this.context = null;\n    this.rendered = false;\n    this.iterations = [];\n\n    this.template = options.template;\n\n    this.indexRef = options.indexRef;\n    this.keyRef = options.keyRef;\n\n    this.pendingNewIndices = null;\n    this.previousIterations = null;\n\n    // track array versus object so updates of type rest\n    this.isArray = false;\n  }\n\n  bind(context) {\n    this.context = context;\n    this.bound = true;\n    const value = context.get();\n\n    const aliases = (this.aliases = this.owner.template.z && this.owner.template.z.slice());\n\n    const shuffler = aliases && aliases.find(a => a.n === 'shuffle');\n    if (shuffler && shuffler.x && shuffler.x.x) {\n      if (shuffler.x.x.s === 'true') this.shuffler = true;\n      else if (keypathString.test(shuffler.x.x.s))\n        this.shuffler = splitKeypath(shuffler.x.x.s.slice(1, -1));\n    }\n\n    if (this.shuffler) this.values = shuffleValues(this, this.shuffler);\n\n    if (this.source) this.source.model.unbind(this.source);\n    const source = context.isComputed && aliases && aliases.find(a => a.n === 'source');\n    if (source && source.x && source.x.r) {\n      const model = resolve(this, source.x);\n      this.source = {\n        handleChange() {},\n        rebind(next) {\n          this.model.unregister(this);\n          this.model = next;\n          next.register(this);\n        }\n      };\n      this.source.model = model;\n      model.register(this.source);\n    }\n\n    // {{#each array}}...\n    if ((this.isArray = isArray(value))) {\n      // we can't use map, because of sparse arrays\n      this.iterations = [];\n      const max = (this.length = value.length);\n      for (let i = 0; i < max; i += 1) {\n        this.iterations[i] = this.createIteration(i, i);\n      }\n    } else if (isObject(value)) {\n      // {{#each object}}...\n      this.isArray = false;\n\n      // TODO this is a dreadful hack. There must be a neater way\n      if (this.indexRef) {\n        const refs = this.indexRef.split(',');\n        this.keyRef = refs[0];\n        this.indexRef = refs[1];\n      }\n\n      const ks = keys(value);\n      this.length = ks.length;\n\n      this.iterations = ks.map((key, index) => {\n        return this.createIteration(key, index);\n      });\n    }\n\n    return this;\n  }\n\n  bubble(index) {\n    if (!this.bubbled) this.bubbled = [];\n    this.bubbled.push(index);\n\n    if (!this.rebounding) this.owner.bubble();\n  }\n\n  createIteration(key, index) {\n    const fragment = new Fragment({\n      owner: this,\n      template: this.template\n    });\n\n    fragment.isIteration = true;\n    fragment.delegate = this.delegate;\n\n    if (this.aliases) fragment.aliases = {};\n    swizzleFragment(this, fragment, key, index);\n\n    return fragment.bind(fragment.context);\n  }\n\n  destroyed() {\n    const len = this.iterations.length;\n    for (let i = 0; i < len; i++) this.iterations[i].destroyed();\n    if (this.pathModel) this.pathModel.destroyed();\n    if (this.rootModel) this.rootModel.destroyed();\n  }\n\n  detach() {\n    const docFrag = createDocumentFragment();\n    this.iterations.forEach(fragment => docFrag.appendChild(fragment.detach()));\n    return docFrag;\n  }\n\n  find(selector, options) {\n    return findMap(this.iterations, i => i.find(selector, options));\n  }\n\n  findAll(selector, options) {\n    return this.iterations.forEach(i => i.findAll(selector, options));\n  }\n\n  findAllComponents(name, options) {\n    return this.iterations.forEach(i => i.findAllComponents(name, options));\n  }\n\n  findComponent(name, options) {\n    return findMap(this.iterations, i => i.findComponent(name, options));\n  }\n\n  findContext() {\n    return this.context;\n  }\n\n  findNextNode(iteration) {\n    if (iteration.index < this.iterations.length - 1) {\n      for (let i = iteration.index + 1; i < this.iterations.length; i++) {\n        const node = this.iterations[i].firstNode(true);\n        if (node) return node;\n      }\n    }\n\n    return this.owner.findNextNode();\n  }\n\n  firstNode(skipParent) {\n    return this.iterations[0] ? this.iterations[0].firstNode(skipParent) : null;\n  }\n\n  getLast() {\n    return this.lastModel || (this.lastModel = new KeyModel(this.length - 1));\n  }\n\n  rebind(next) {\n    this.context = next;\n    if (this.source) return;\n    if (next) {\n      this.iterations.forEach(fragment => {\n        swizzleFragment(this, fragment, fragment.key, fragment.index);\n      });\n    }\n  }\n\n  rebound(update) {\n    this.context = this.owner.model;\n    this.iterations.forEach((f, i) => {\n      f.context = contextFor(this, f, i);\n      f.rebound(update);\n    });\n  }\n\n  render(target, occupants) {\n    const xs = this.iterations;\n    if (xs) {\n      const len = xs.length;\n      for (let i = 0; i < len; i++) {\n        xs[i].render(target, occupants);\n      }\n    }\n\n    this.rendered = true;\n  }\n\n  shuffle(newIndices, merge) {\n    if (!this.pendingNewIndices) this.previousIterations = this.iterations.slice();\n\n    if (!this.pendingNewIndices) this.pendingNewIndices = [];\n\n    this.pendingNewIndices.push(newIndices);\n\n    const iterations = [];\n\n    newIndices.forEach((newIndex, oldIndex) => {\n      if (newIndex === -1) return;\n\n      const fragment = this.iterations[oldIndex];\n      iterations[newIndex] = fragment;\n\n      if (newIndex !== oldIndex && fragment) {\n        fragment.dirty = true;\n        if (merge) fragment.shouldRebind = 1;\n      }\n    });\n\n    this.iterations = iterations;\n\n    // if merging, we're in the midst of an update already\n    if (!merge) this.bubble();\n  }\n\n  shuffled() {\n    this.iterations.forEach(shuffled);\n  }\n\n  toString(escape) {\n    return this.iterations ? this.iterations.map(escape ? toEscapedString : toString).join('') : '';\n  }\n\n  unbind(view) {\n    this.bound = false;\n    if (this.source) this.source.model.unregister(this.source);\n    const iterations = this.pendingNewIndices ? this.previousIterations : this.iterations;\n    const len = iterations.length;\n    for (let i = 0; i < len; i++) iterations[i].unbind(view);\n    return this;\n  }\n\n  unrender(shouldDestroy) {\n    let len = this.iterations.length;\n    for (let i = 0; i < len; i++) this.iterations[i].unrender(shouldDestroy);\n    if (this.pendingNewIndices && this.previousIterations) {\n      len = this.previousIterations.length;\n      for (let i = 0; i < len; i++) this.previousIterations[i].unrender(shouldDestroy);\n    }\n    this.rendered = false;\n  }\n\n  update() {\n    if (this.pendingNewIndices) {\n      this.bubbled.length = 0;\n      this.updatePostShuffle();\n      return;\n    }\n\n    if (this.updating) return;\n    this.updating = true;\n\n    if (this.shuffler) {\n      const values = shuffleValues(this, this.shuffler);\n      const newIndices = buildNewIndices(this.values, values);\n      if (!newIndices.same) {\n        this.shuffle(newIndices, true);\n        this.updatePostShuffle();\n      } else {\n        this.iterations.forEach(update);\n      }\n    } else {\n      let len = this.iterations.length;\n      for (let i = 0; i < len; i++) {\n        const f = this.iterations[i];\n        f && f.idxModel && f.idxModel.applyValue(i);\n      }\n\n      const value = this.context.get();\n      const wasArray = this.isArray;\n\n      let toRemove;\n      let oldKeys;\n      let reset = true;\n      let i;\n\n      if ((this.isArray = isArray(value))) {\n        // if there's a source to map back to, make sure everything stays bound correctly\n        if (this.source) {\n          this.rebounding = 1;\n          const source = this.source.model.get();\n          this.iterations.forEach((f, c) => {\n            if (c < value.length && f.lastValue !== value[c] && ~(i = source.indexOf(value[c]))) {\n              swizzleFragment(this, f, c, c);\n              f.rebound(true);\n            }\n          });\n          this.rebounding = 0;\n        }\n\n        if (wasArray) {\n          reset = false;\n          if (this.iterations.length > value.length) {\n            toRemove = this.iterations.splice(value.length);\n          }\n        }\n      } else if (isObject(value) && !wasArray) {\n        reset = false;\n        toRemove = [];\n        oldKeys = {};\n        i = this.iterations.length;\n\n        while (i--) {\n          const fragment = this.iterations[i];\n          if (fragment.key in value) {\n            oldKeys[fragment.key] = true;\n          } else {\n            this.iterations.splice(i, 1);\n            toRemove.push(fragment);\n          }\n        }\n      }\n\n      const newLength = isArray(value) ? value.length : isObject(value) ? keys(value).length : 0;\n      this.length = newLength;\n      this.updateLast();\n\n      if (reset) {\n        toRemove = this.iterations;\n        this.iterations = [];\n      }\n\n      if (toRemove) {\n        len = toRemove.length;\n        for (let i = 0; i < len; i++) toRemove[i].unbind().unrender(true);\n      }\n\n      // update the remaining ones\n      if (!reset && this.isArray && this.bubbled && this.bubbled.length) {\n        const bubbled = this.bubbled;\n        this.bubbled = [];\n        len = bubbled.length;\n        for (let i = 0; i < len; i++)\n          this.iterations[bubbled[i]] && this.iterations[bubbled[i]].update();\n      } else {\n        len = this.iterations.length;\n        for (let i = 0; i < len; i++) this.iterations[i].update();\n      }\n\n      // add new iterations\n      let docFrag;\n      let fragment;\n\n      if (newLength > this.iterations.length) {\n        docFrag = this.rendered ? createDocumentFragment() : null;\n        i = this.iterations.length;\n\n        if (isArray(value)) {\n          while (i < value.length) {\n            fragment = this.createIteration(i, i);\n\n            this.iterations.push(fragment);\n            if (this.rendered) fragment.render(docFrag);\n\n            i += 1;\n          }\n        } else if (isObject(value)) {\n          // TODO this is a dreadful hack. There must be a neater way\n          if (this.indexRef && !this.keyRef) {\n            const refs = this.indexRef.split(',');\n            this.keyRef = refs[0];\n            this.indexRef = refs[1];\n          }\n\n          keys(value).forEach(key => {\n            if (!oldKeys || !(key in oldKeys)) {\n              fragment = this.createIteration(key, i);\n\n              this.iterations.push(fragment);\n              if (this.rendered) fragment.render(docFrag);\n\n              i += 1;\n            }\n          });\n        }\n\n        if (this.rendered) {\n          const parentNode = this.parent.findParentNode();\n          const anchor = this.parent.findNextNode(this.owner);\n\n          parentNode.insertBefore(docFrag, anchor);\n        }\n      }\n    }\n\n    this.updating = false;\n  }\n\n  updateLast() {\n    if (this.lastModel) this.lastModel.applyValue(this.length - 1);\n  }\n\n  updatePostShuffle() {\n    const newIndices = this.pendingNewIndices[0];\n    const parentNode = this.rendered ? this.parent.findParentNode() : null;\n    const nextNode = parentNode && this.owner.findNextNode();\n    const docFrag = parentNode ? createDocumentFragment() : null;\n\n    // map first shuffle through\n    this.pendingNewIndices.slice(1).forEach(indices => {\n      newIndices.forEach((newIndex, oldIndex) => {\n        newIndices[oldIndex] = indices[newIndex];\n      });\n    });\n\n    const len = (this.length = this.context.get().length);\n    const prev = this.previousIterations;\n    const iters = this.iterations;\n    const value = this.context.get();\n    const stash = {};\n    let idx, dest, pos, next, anchor, rebound;\n\n    const map = new Array(newIndices.length);\n    newIndices.forEach((e, i) => (map[e] = i));\n\n    this.updateLast();\n\n    idx = pos = 0;\n    while (idx < len) {\n      // if there's not an existing thing to shuffle, handle that\n      if (isUndefined(map[idx])) {\n        next = iters[idx] = this.createIteration(idx, idx);\n        if (parentNode) {\n          anchor = prev[pos];\n          anchor = (anchor && parentNode && anchor.firstNode()) || nextNode;\n\n          next.render(docFrag);\n          parentNode.insertBefore(docFrag, anchor);\n        }\n\n        idx++;\n      } else {\n        dest = newIndices[pos];\n\n        if (dest === -1) {\n          // if it needs to be dropped, drop it\n          prev[pos] && prev[pos].unbind().unrender(true);\n          prev[pos++] = 0;\n        } else if (dest > idx) {\n          // if it needs to move down, stash it\n          stash[dest] = prev[pos];\n          prev[pos++] = null;\n        } else {\n          // get the fragment that goes for this idx\n          iters[idx] = next = iters[idx] || stash[idx] || this.createIteration(idx, idx);\n\n          // if it's an existing fragment, swizzle\n          if (stash[idx] || pos !== idx) {\n            rebound = this.source && next.lastValue !== value[idx];\n            swizzleFragment(this, next, idx, idx);\n          }\n\n          // does next need to be moved?\n          if (parentNode && (stash[idx] || !prev[pos])) {\n            anchor = prev[pos + 1];\n            anchor = (anchor && parentNode && anchor.firstNode()) || nextNode;\n\n            if (stash[idx]) {\n              parentNode.insertBefore(next.detach(), anchor);\n            } else {\n              next.render(docFrag);\n              parentNode.insertBefore(docFrag, anchor);\n            }\n          }\n\n          prev[pos++] = 0;\n          idx++;\n        }\n\n        if (next && isObjectType(next)) {\n          if (next.shouldRebind || rebound) {\n            next.rebound(rebound);\n            next.shouldRebind = 0;\n          }\n          next.update();\n          next.shuffled();\n        }\n      }\n    }\n\n    // clean up any stragglers\n    const plen = prev.length;\n    for (let i = 0; i < plen; i++) prev[i] && prev[i].unbind().unrender(true);\n\n    if (this.shuffler) this.values = shuffleValues(this, this.shuffler);\n\n    this.pendingNewIndices = null;\n    this.previousIterations = null;\n  }\n}\n\nRepeatedFragment.prototype.getContext = getContext;\nRepeatedFragment.prototype.getKeypath = getKeypath;\n\n// find the topmost delegate\nfunction findDelegate(start) {\n  let frag = start;\n  let delegate, el;\n\n  out: while (frag) {\n    // find next element\n    el = 0;\n    while (!el && frag) {\n      if (frag.owner.type === ELEMENT) el = frag.owner;\n      if (frag.owner.ractive && frag.owner.ractive.delegate === false) break out;\n      frag = frag.parent || frag.componentParent;\n    }\n\n    if (el.delegate === false) break out;\n    delegate = el.delegate || el;\n\n    // find next repeated fragment\n    while (frag) {\n      if (frag.iterations) break;\n      if (frag.owner.ractive && frag.owner.ractive.delegate === false) break out;\n      frag = frag.parent || frag.componentParent;\n    }\n  }\n\n  return delegate;\n}\n\nfunction swizzleFragment(section, fragment, key, idx) {\n  const model = section.context ? contextFor(section, fragment, key) : undefined;\n\n  fragment.key = key;\n  fragment.index = idx;\n  fragment.context = model;\n  if (section.source) fragment.lastValue = model && model.get();\n\n  if (fragment.idxModel) fragment.idxModel.applyValue(idx);\n  if (fragment.keyModel) fragment.keyModel.applyValue(key);\n  if (fragment.pathModel) {\n    fragment.pathModel.context = model;\n    fragment.pathModel.applyValue(model.getKeypath());\n  }\n  if (fragment.rootModel) {\n    fragment.rootModel.context = model;\n    fragment.rootModel.applyValue(model.getKeypath(fragment.ractive.root));\n  }\n\n  // handle any aliases\n  const aliases = fragment.aliases;\n  section.aliases &&\n    section.aliases.forEach(a => {\n      if (a.x.r === '.') aliases[a.n] = model;\n      else if (a.x.r === '@index') aliases[a.n] = fragment.getIndex();\n      else if (a.x.r === '@key') aliases[a.n] = fragment.getKey();\n      else if (a.x.r === '@keypath') aliases[a.n] = fragment.getKeypath();\n      else if (a.x.r === '@rootpath') aliases[a.n] = fragment.getKeypath(true);\n    });\n}\n\nfunction shuffleValues(section, shuffler) {\n  const array = section.context.get() || [];\n  if (shuffler === true) {\n    return array.slice();\n  } else {\n    return array.map(v => shuffler.reduce((a, c) => a && a[c], v));\n  }\n}\n\nfunction contextFor(section, fragment, key) {\n  if (section.source) {\n    let idx;\n    const source = section.source.model.get();\n    if (source.indexOf && ~(idx = source.indexOf(section.context.joinKey(key).get())))\n      return section.source.model.joinKey(idx);\n  }\n\n  return section.context.joinKey(key);\n}\n","import {\n  ALIAS,\n  SECTION_EACH,\n  SECTION_IF,\n  SECTION_IF_WITH,\n  SECTION_UNLESS,\n  SECTION_WITH\n} from 'config/types';\nimport { createDocumentFragment } from 'utils/dom';\nimport { isArray, isObject, isObjectLike, isUndefined } from 'utils/is';\nimport { keep } from 'shared/set';\nimport runloop from 'src/global/runloop';\nimport Fragment from '../Fragment';\nimport RepeatedFragment from '../RepeatedFragment';\nimport { MustacheContainer } from './shared/Mustache';\nimport { keys } from 'utils/object';\nimport Context from 'src/shared/Context';\n\nfunction isEmpty(value) {\n  return (\n    !value ||\n    (isArray(value) && value.length === 0) ||\n    (isObject(value) && keys(value).length === 0)\n  );\n}\n\nfunction getType(value, hasIndexRef) {\n  if (hasIndexRef || isArray(value)) return SECTION_EACH;\n  if (isObjectLike(value)) return SECTION_IF_WITH;\n  if (isUndefined(value)) return null;\n  return SECTION_IF;\n}\n\nexport default class Section extends MustacheContainer {\n  constructor(options) {\n    super(options);\n\n    this.isAlias = options.template.t === ALIAS;\n    this.sectionType = options.template.n || (this.isAlias && SECTION_WITH) || null;\n    this.templateSectionType = this.sectionType;\n    this.subordinate = options.template.l === 1;\n    this.fragment = null;\n  }\n\n  bind() {\n    super.bind();\n\n    if (this.subordinate) {\n      this.sibling = this.up.items[this.up.items.indexOf(this) - 1];\n      this.sibling.nextSibling = this;\n    }\n\n    // if we managed to bind, we need to create children\n    if (this.model || this.isAlias) {\n      this.dirty = true;\n      this.update();\n    } else if (\n      this.sectionType &&\n      this.sectionType === SECTION_UNLESS &&\n      (!this.sibling || !this.sibling.isTruthy())\n    ) {\n      this.fragment = new Fragment({\n        owner: this,\n        template: this.template.f\n      }).bind();\n    }\n  }\n\n  bubble() {\n    if (!this.dirty && this.yield) {\n      this.dirty = true;\n      this.containerFragment.bubble();\n    } else super.bubble();\n  }\n\n  detach() {\n    const frag = this.fragment || this.detached;\n    return frag ? frag.detach() : super.detach();\n  }\n\n  findNextNode() {\n    return (this.containerFragment || this.up).findNextNode(this);\n  }\n\n  isTruthy() {\n    if (this.subordinate && this.sibling.isTruthy()) return true;\n    const value = !this.model ? undefined : this.model.isRoot ? this.model.value : this.model.get();\n    return !!value && (this.templateSectionType === SECTION_IF_WITH || !isEmpty(value));\n  }\n\n  rebind(next, previous, safe) {\n    if (super.rebind(next, previous, safe)) {\n      if (this.fragment && this.sectionType !== SECTION_IF && this.sectionType !== SECTION_UNLESS) {\n        this.fragment.rebind(next);\n      }\n    }\n  }\n\n  rebound(update) {\n    if (this.model) {\n      if (this.model.rebound) this.model.rebound(update);\n      else {\n        super.unbind();\n        super.bind();\n        if (\n          this.sectionType === SECTION_WITH ||\n          this.sectionType === SECTION_IF_WITH ||\n          this.sectionType === SECTION_EACH\n        ) {\n          if (this.fragment) this.fragment.rebind(this.model);\n        }\n\n        if (update) this.bubble();\n      }\n    }\n    if (this.fragment) this.fragment.rebound(update);\n  }\n\n  render(target, occupants) {\n    this.rendered = true;\n    if (this.fragment) this.fragment.render(target, occupants);\n  }\n\n  shuffle(newIndices) {\n    if (this.fragment && this.sectionType === SECTION_EACH) {\n      this.fragment.shuffle(newIndices);\n    }\n  }\n\n  unbind(view) {\n    super.unbind(view);\n    if (this.fragment) this.fragment.unbind(view);\n  }\n\n  unrender(shouldDestroy) {\n    if (this.rendered && this.fragment) this.fragment.unrender(shouldDestroy);\n    this.rendered = false;\n  }\n\n  update() {\n    if (!this.dirty) return;\n\n    if (this.fragment && this.sectionType !== SECTION_IF && this.sectionType !== SECTION_UNLESS) {\n      this.fragment.context = this.model;\n    }\n\n    if (!this.model && this.sectionType !== SECTION_UNLESS && !this.isAlias) return;\n\n    this.dirty = false;\n\n    const value = !this.model ? undefined : this.model.isRoot ? this.model.value : this.model.get();\n    const siblingFalsey = !this.subordinate || !this.sibling.isTruthy();\n    const lastType = this.sectionType;\n\n    if (this.yield && this.yield !== value) {\n      this.up = this.containerFragment;\n      this.container = null;\n      this.yield = null;\n      if (this.rendered) this.fragment.unbind().unrender(true);\n      this.fragment = null;\n    } else if (this.rendered && !this.yield && value instanceof Context) {\n      if (this.rendered && this.fragment) this.fragment.unbind().unrender(true);\n      this.fragment = null;\n    }\n\n    // watch for switching section types\n    if (this.sectionType === null || this.templateSectionType === null)\n      this.sectionType = getType(value, this.template.i);\n    if (lastType && lastType !== this.sectionType && this.fragment) {\n      if (this.rendered) {\n        this.fragment.unbind().unrender(true);\n      }\n\n      this.fragment = null;\n    }\n\n    let newFragment;\n\n    const fragmentShouldExist =\n      this.sectionType === SECTION_EACH || // each always gets a fragment, which may have no iterations\n      this.sectionType === SECTION_WITH || // with (partial context) always gets a fragment\n      (siblingFalsey &&\n        (this.sectionType === SECTION_UNLESS ? !this.isTruthy() : this.isTruthy())) || // if, unless, and if-with depend on siblings and the condition\n      this.isAlias;\n\n    if (fragmentShouldExist) {\n      if (!this.fragment) this.fragment = this.detached;\n\n      if (this.fragment) {\n        // check for detached fragment\n        if (this.detached) {\n          attach(this, this.fragment);\n          this.detached = false;\n          this.rendered = true;\n        }\n\n        if (!this.fragment.bound) this.fragment.bind(this.model);\n        this.fragment.update();\n      } else {\n        if (this.sectionType === SECTION_EACH) {\n          newFragment = new RepeatedFragment({\n            owner: this,\n            template: this.template.f,\n            indexRef: this.template.i\n          }).bind(this.model);\n        } else {\n          // only with and if-with provide context - if and unless do not\n          let context =\n            this.sectionType !== SECTION_IF && this.sectionType !== SECTION_UNLESS\n              ? this.model\n              : null;\n\n          if (value instanceof Context) {\n            this.yield = value;\n            this.containerFragment = this.up;\n            this.up = value.fragment;\n            this.container = value.ractive;\n            context = undefined;\n          }\n\n          newFragment = new Fragment({\n            owner: this,\n            template: this.template.f\n          }).bind(context);\n        }\n      }\n    } else {\n      if (this.fragment && this.rendered) {\n        if (keep !== true) {\n          this.fragment.unbind().unrender(true);\n        } else {\n          this.unrender(false);\n          this.detached = this.fragment;\n          runloop.promise().then(() => {\n            if (this.detached) this.detach();\n          });\n        }\n      } else if (this.fragment) {\n        this.fragment.unbind();\n      }\n\n      this.fragment = null;\n    }\n\n    if (newFragment) {\n      if (this.rendered) {\n        attach(this, newFragment);\n      }\n\n      this.fragment = newFragment;\n    }\n\n    if (this.nextSibling) {\n      this.nextSibling.dirty = true;\n      this.nextSibling.update();\n    }\n  }\n}\n\nfunction attach(section, fragment) {\n  const anchor = (section.containerFragment || section.up).findNextNode(section);\n\n  if (anchor) {\n    const docFrag = createDocumentFragment();\n    fragment.render(docFrag);\n\n    anchor.parentNode.insertBefore(docFrag, anchor);\n  } else {\n    fragment.render(section.up.findParentNode());\n  }\n}\n","import { toArray } from 'utils/array';\nimport getSelectedOptions from 'utils/getSelectedOptions';\nimport Element from '../../Element';\nimport { isArray, isFunction } from 'utils/is';\n\nexport default class Select extends Element {\n  constructor(options) {\n    super(options);\n    this.options = [];\n  }\n\n  foundNode(node) {\n    if (this.binding) {\n      const selectedOptions = getSelectedOptions(node);\n\n      if (selectedOptions.length > 0) {\n        this.selectedOptions = selectedOptions;\n      }\n    }\n  }\n\n  render(target, occupants) {\n    super.render(target, occupants);\n    this.sync();\n\n    const node = this.node;\n\n    let i = node.options.length;\n    while (i--) {\n      node.options[i].defaultSelected = node.options[i].selected;\n    }\n\n    this.rendered = true;\n  }\n\n  sync() {\n    const selectNode = this.node;\n\n    if (!selectNode) return;\n\n    const options = toArray(selectNode.options);\n\n    if (this.selectedOptions) {\n      options.forEach(o => {\n        if (this.selectedOptions.indexOf(o) >= 0) o.selected = true;\n        else o.selected = false;\n      });\n      this.binding.setFromNode(selectNode);\n      delete this.selectedOptions;\n      return;\n    }\n\n    const selectValue = this.getAttribute('value');\n    const isMultiple = this.getAttribute('multiple');\n    const array = isMultiple && isArray(selectValue);\n\n    // If the <select> has a specified value, that should override\n    // these options\n    if (selectValue !== undefined) {\n      let optionWasSelected;\n\n      options.forEach(o => {\n        const optionValue = o._ractive ? o._ractive.value : o.value;\n        const shouldSelect = isMultiple\n          ? array && this.valueContains(selectValue, optionValue)\n          : this.compare(selectValue, optionValue);\n\n        if (shouldSelect) {\n          optionWasSelected = true;\n        }\n\n        o.selected = shouldSelect;\n      });\n\n      if (!optionWasSelected && !isMultiple) {\n        if (this.binding) {\n          this.binding.forceUpdate();\n        }\n      }\n    } else if (this.binding && this.binding.forceUpdate) {\n      // Otherwise the value should be initialised according to which\n      // <option> element is selected, if twoway binding is in effect\n      this.binding.forceUpdate();\n    }\n  }\n  valueContains(selectValue, optionValue) {\n    let i = selectValue.length;\n    while (i--) {\n      if (this.compare(optionValue, selectValue[i])) return true;\n    }\n  }\n  compare(optionValue, selectValue) {\n    const comparator = this.getAttribute('value-comparator');\n    if (comparator) {\n      if (isFunction(comparator)) {\n        return comparator(selectValue, optionValue);\n      }\n      if (selectValue && optionValue) {\n        return selectValue[comparator] == optionValue[comparator];\n      }\n    }\n    return selectValue == optionValue;\n  }\n  update() {\n    const dirty = this.dirty;\n    super.update();\n    if (dirty) {\n      this.sync();\n    }\n  }\n}\n","import { ATTRIBUTE } from 'config/types';\nimport runloop from 'src/global/runloop';\nimport Input from './Input';\nimport { isBindable } from '../binding/selectBinding';\nimport createItem from '../../createItem';\nimport Fragment from '../../../Fragment';\n\nexport default class Textarea extends Input {\n  constructor(options) {\n    const template = options.template;\n\n    options.deferContent = true;\n\n    super(options);\n\n    // check for single interpolator binding\n    if (!this.attributeByName.value) {\n      if (template.f && isBindable({ template })) {\n        (this.attributes || (this.attributes = [])).push(\n          createItem({\n            owner: this,\n            template: { t: ATTRIBUTE, f: template.f, n: 'value' },\n            up: this.up\n          })\n        );\n      } else {\n        this.fragment = new Fragment({\n          owner: this,\n          cssIds: null,\n          template: template.f\n        });\n      }\n    }\n  }\n\n  bubble() {\n    if (!this.dirty) {\n      this.dirty = true;\n\n      if (this.rendered && !this.binding && this.fragment) {\n        runloop.scheduleTask(() => {\n          this.dirty = false;\n          this.node.value = this.fragment.toString();\n        });\n      }\n\n      this.up.bubble(); // default behaviour\n    }\n  }\n}\n","import { TEXT } from 'config/types';\nimport { escapeHtml } from 'utils/html';\nimport { detachNode } from 'utils/dom';\nimport noop from 'utils/noop';\nimport Item from './shared/Item';\nimport progressiveText from './shared/progressiveText';\nimport { inAttributes } from './element/ConditionalAttribute';\n\nexport default class Text extends Item {\n  constructor(options) {\n    super(options);\n    this.type = TEXT;\n  }\n\n  detach() {\n    return detachNode(this.node);\n  }\n\n  firstNode() {\n    return this.node;\n  }\n\n  render(target, occupants) {\n    if (inAttributes()) return;\n    this.rendered = true;\n\n    progressiveText(this, target, occupants, this.template);\n  }\n\n  toString(escape) {\n    return escape ? escapeHtml(this.template) : this.template;\n  }\n\n  unrender(shouldDestroy) {\n    if (this.rendered && shouldDestroy) this.detach();\n    this.rendered = false;\n  }\n\n  valueOf() {\n    return this.template;\n  }\n}\n\nconst proto = Text.prototype;\nproto.bind = proto.unbind = proto.update = noop;\n","import { win, doc, vendors } from './environment';\n\nexport let visible;\nlet hidden = 'hidden';\n\nif (doc) {\n  let prefix;\n\n  /* istanbul ignore next */\n  if (hidden in doc) {\n    prefix = '';\n  } else {\n    let i = vendors.length;\n    while (i--) {\n      const vendor = vendors[i];\n      hidden = vendor + 'Hidden';\n\n      if (hidden in doc) {\n        prefix = vendor;\n        break;\n      }\n    }\n  }\n\n  /* istanbul ignore else */\n  if (prefix !== undefined) {\n    doc.addEventListener(prefix + 'visibilitychange', onChange);\n    onChange();\n  } else {\n    // gah, we're in an old browser\n    if ('onfocusout' in doc) {\n      doc.addEventListener('focusout', onHide);\n      doc.addEventListener('focusin', onShow);\n    } else {\n      win.addEventListener('pagehide', onHide);\n      win.addEventListener('blur', onHide);\n\n      win.addEventListener('pageshow', onShow);\n      win.addEventListener('focus', onShow);\n    }\n\n    visible = true; // until proven otherwise. Not ideal but hey\n  }\n}\n\nfunction onChange() {\n  visible = !doc[hidden];\n}\n\n/* istanbul ignore next */\nfunction onHide() {\n  visible = false;\n}\n\n/* istanbul ignore next */\nfunction onShow() {\n  visible = true;\n}\n","import { isClient, vendors } from 'config/environment';\nimport { createElement } from 'utils/dom';\nimport hyphenateCamel from 'utils/hyphenateCamel';\n\nlet prefix;\n\n/* istanbul ignore next */\nif (!isClient) {\n  prefix = null;\n} else {\n  const prefixCache = {};\n  const testStyle = createElement('div').style;\n\n  // technically this also normalizes on hyphenated styles as well\n  prefix = function(prop) {\n    if (!prefixCache[prop]) {\n      const name = hyphenateCamel(prop);\n\n      if (testStyle[prop] !== undefined) {\n        prefixCache[prop] = name;\n      } else {\n        /* istanbul ignore next */\n        // test vendors...\n        let i = vendors.length;\n        while (i--) {\n          const vendor = `-${vendors[i]}-${name}`;\n          if (testStyle[vendor] !== undefined) {\n            prefixCache[prop] = vendor;\n            break;\n          }\n        }\n      }\n    }\n\n    return prefixCache[prop];\n  };\n}\n\nexport default prefix;\n","import { missingPlugin } from 'config/errors';\nimport { isClient } from 'config/environment';\nimport { warnIfDebug, warnOnceIfDebug } from 'utils/log';\nimport { createElement } from 'utils/dom';\nimport interpolate from 'shared/interpolate';\nimport Ticker from 'shared/Ticker';\nimport hyphenate from './hyphenate';\nimport { isFunction, isString } from 'utils/is';\n\nlet createTransitions;\n\nif (!isClient) {\n  createTransitions = null;\n} else {\n  const testStyle = createElement('div').style;\n  const linear = x => x;\n\n  const canUseCssTransitions = {};\n  const cannotUseCssTransitions = {};\n\n  // determine some facts about our environment\n  let TRANSITION;\n  let TRANSITIONEND;\n  let CSS_TRANSITIONS_ENABLED;\n  let TRANSITION_DURATION;\n  let TRANSITION_PROPERTY;\n  let TRANSITION_TIMING_FUNCTION;\n\n  if (testStyle.transition !== undefined) {\n    TRANSITION = 'transition';\n    TRANSITIONEND = 'transitionend';\n    CSS_TRANSITIONS_ENABLED = true;\n  } else if (testStyle.webkitTransition !== undefined) {\n    TRANSITION = 'webkitTransition';\n    TRANSITIONEND = 'webkitTransitionEnd';\n    CSS_TRANSITIONS_ENABLED = true;\n  } else {\n    CSS_TRANSITIONS_ENABLED = false;\n  }\n\n  if (TRANSITION) {\n    TRANSITION_DURATION = TRANSITION + 'Duration';\n    TRANSITION_PROPERTY = TRANSITION + 'Property';\n    TRANSITION_TIMING_FUNCTION = TRANSITION + 'TimingFunction';\n  }\n\n  createTransitions = function(t, to, options, changedProperties, resolve) {\n    // Wait a beat (otherwise the target styles will be applied immediately)\n    // TODO use a fastdom-style mechanism?\n    setTimeout(() => {\n      let jsTransitionsComplete;\n      let cssTransitionsComplete;\n      let cssTimeout; // eslint-disable-line prefer-const\n\n      function transitionDone() {\n        clearTimeout(cssTimeout);\n      }\n\n      function checkComplete() {\n        if (jsTransitionsComplete && cssTransitionsComplete) {\n          t.unregisterCompleteHandler(transitionDone);\n          // will changes to events and fire have an unexpected consequence here?\n          t.ractive.fire(t.name + ':end', t.node, t.isIntro);\n          resolve();\n        }\n      }\n\n      // this is used to keep track of which elements can use CSS to animate\n      // which properties\n      const hashPrefix = (t.node.namespaceURI || '') + t.node.tagName;\n\n      // need to reset transition properties\n      const style = t.node.style;\n      const previous = {\n        property: style[TRANSITION_PROPERTY],\n        timing: style[TRANSITION_TIMING_FUNCTION],\n        duration: style[TRANSITION_DURATION]\n      };\n\n      function transitionEndHandler(event) {\n        if (event.target !== t.node) return;\n        const index = changedProperties.indexOf(event.propertyName);\n\n        if (index !== -1) {\n          changedProperties.splice(index, 1);\n        }\n\n        if (changedProperties.length) {\n          // still transitioning...\n          return;\n        }\n\n        clearTimeout(cssTimeout);\n        cssTransitionsDone();\n      }\n\n      function cssTransitionsDone() {\n        style[TRANSITION_PROPERTY] = previous.property;\n        style[TRANSITION_TIMING_FUNCTION] = previous.duration;\n        style[TRANSITION_DURATION] = previous.timing;\n\n        t.node.removeEventListener(TRANSITIONEND, transitionEndHandler, false);\n\n        cssTransitionsComplete = true;\n        checkComplete();\n      }\n\n      t.node.addEventListener(TRANSITIONEND, transitionEndHandler, false);\n\n      // safety net in case transitionend never fires\n      cssTimeout = setTimeout(() => {\n        changedProperties = [];\n        cssTransitionsDone();\n      }, options.duration + (options.delay || 0) + 50);\n      t.registerCompleteHandler(transitionDone);\n\n      style[TRANSITION_PROPERTY] = changedProperties.join(',');\n      const easingName = hyphenate(options.easing || 'linear');\n      style[TRANSITION_TIMING_FUNCTION] = easingName;\n      const cssTiming = style[TRANSITION_TIMING_FUNCTION] === easingName;\n      style[TRANSITION_DURATION] = options.duration / 1000 + 's';\n\n      setTimeout(() => {\n        let i = changedProperties.length;\n        let hash;\n        let originalValue = null;\n        let index;\n        const propertiesToTransitionInJs = [];\n        let prop;\n        let suffix;\n        let interpolator;\n\n        while (i--) {\n          prop = changedProperties[i];\n          hash = hashPrefix + prop;\n\n          if (cssTiming && CSS_TRANSITIONS_ENABLED && !cannotUseCssTransitions[hash]) {\n            const initial = style[prop];\n            style[prop] = to[prop];\n\n            // If we're not sure if CSS transitions are supported for\n            // this tag/property combo, find out now\n            if (!(hash in canUseCssTransitions)) {\n              originalValue = t.getStyle(prop);\n\n              // if this property is transitionable in this browser,\n              // the current style will be different from the target style\n              canUseCssTransitions[hash] = t.getStyle(prop) != to[prop];\n              cannotUseCssTransitions[hash] = !canUseCssTransitions[hash];\n\n              // Reset, if we're going to use timers after all\n              if (cannotUseCssTransitions[hash]) {\n                style[prop] = initial;\n              }\n            }\n          }\n\n          if (!cssTiming || !CSS_TRANSITIONS_ENABLED || cannotUseCssTransitions[hash]) {\n            // we need to fall back to timer-based stuff\n            if (originalValue === null) originalValue = t.getStyle(prop);\n\n            // need to remove this from changedProperties, otherwise transitionEndHandler\n            // will get confused\n            index = changedProperties.indexOf(prop);\n            if (index === -1) {\n              warnIfDebug(\n                'Something very strange happened with transitions. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!',\n                { node: t.node }\n              );\n            } else {\n              changedProperties.splice(index, 1);\n            }\n\n            // TODO Determine whether this property is animatable at all\n\n            suffix = /[^\\d]*$/.exec(originalValue)[0];\n            interpolator = interpolate(parseFloat(originalValue), parseFloat(to[prop]));\n\n            // ...then kick off a timer-based transition\n            if (interpolator) {\n              propertiesToTransitionInJs.push({\n                name: prop,\n                interpolator,\n                suffix\n              });\n            } else {\n              style[prop] = to[prop];\n            }\n\n            originalValue = null;\n          }\n        }\n\n        // javascript transitions\n        if (propertiesToTransitionInJs.length) {\n          let easing;\n\n          if (isString(options.easing)) {\n            easing = t.ractive.easing[options.easing];\n\n            if (!easing) {\n              warnOnceIfDebug(missingPlugin(options.easing, 'easing'));\n              easing = linear;\n            }\n          } else if (isFunction(options.easing)) {\n            easing = options.easing;\n          } else {\n            easing = linear;\n          }\n\n          new Ticker({\n            duration: options.duration,\n            easing,\n            step(pos) {\n              let i = propertiesToTransitionInJs.length;\n              while (i--) {\n                const prop = propertiesToTransitionInJs[i];\n                style[prop.name] = prop.interpolator(pos) + prop.suffix;\n              }\n            },\n            complete() {\n              jsTransitionsComplete = true;\n              checkComplete();\n            }\n          });\n        } else {\n          jsTransitionsComplete = true;\n        }\n\n        if (changedProperties.length) {\n          style[TRANSITION_PROPERTY] = changedProperties.join(',');\n        } else {\n          style[TRANSITION_PROPERTY] = 'none';\n\n          // We need to cancel the transitionEndHandler, and deal with\n          // the fact that it will never fire\n          t.node.removeEventListener(TRANSITIONEND, transitionEndHandler, false);\n          cssTransitionsComplete = true;\n          checkComplete();\n        }\n      }, 0);\n    }, options.delay || 0);\n  };\n}\n\nexport default createTransitions;\n","import { vendors } from 'config/environment';\n\nconst vendorPattern = new RegExp('^(?:' + vendors.join('|') + ')([A-Z])');\n\nexport default function(str) {\n  /* istanbul ignore next */\n  if (!str) return ''; // edge case\n\n  /* istanbul ignore next */\n  if (vendorPattern.test(str)) str = '-' + str;\n\n  return str.replace(/[A-Z]/g, match => '-' + match.toLowerCase());\n}\n","import { win } from 'config/environment';\nimport { addToArray, removeFromArray } from 'utils/array';\nimport { isArray, isObject, isFunction, isNumber, isString, isUndefined } from 'utils/is';\nimport noop from 'utils/noop';\nimport { warnOnceIfDebug } from 'utils/log';\nimport { missingPlugin } from 'config/errors';\nimport { findInViewHierarchy } from 'shared/registry';\nimport { visible } from 'config/visibility';\nimport findElement from '../shared/findElement';\nimport prefix from './transitions/prefix';\nimport createTransitions from './transitions/createTransitions';\nimport { resolveArgs, setupArgsFn } from '../shared/directiveArgs';\nimport { assign, hasOwn, keys } from 'utils/object';\n\nconst getComputedStyle = win && win.getComputedStyle;\nconst resolved = Promise.resolve();\n\nconst names = {\n  t0: 'intro-outro',\n  t1: 'intro',\n  t2: 'outro'\n};\n\nexport default class Transition {\n  constructor(options) {\n    this.owner = options.owner || options.up.owner || findElement(options.up);\n    this.element = this.owner.attributeByName ? this.owner : findElement(options.up);\n    this.ractive = this.owner.ractive;\n    this.template = options.template;\n    this.up = options.up;\n    this.options = options;\n    this.onComplete = [];\n  }\n\n  animateStyle(style, value, options) {\n    if (arguments.length === 4) {\n      throw new Error(\n        't.animateStyle() returns a promise - use .then() instead of passing a callback'\n      );\n    }\n\n    // Special case - page isn't visible. Don't animate anything, because\n    // that way you'll never get CSS transitionend events\n    if (!visible) {\n      this.setStyle(style, value);\n      return resolved;\n    }\n\n    let to;\n\n    if (isString(style)) {\n      to = {};\n      to[style] = value;\n    } else {\n      to = style;\n\n      // shuffle arguments\n      options = value;\n    }\n\n    return new Promise(fulfil => {\n      // Edge case - if duration is zero, set style synchronously and complete\n      if (!options.duration) {\n        this.setStyle(to);\n        fulfil();\n        return;\n      }\n\n      // Get a list of the properties we're animating\n      const propertyNames = keys(to);\n      const changedProperties = [];\n\n      // Store the current styles\n      const computedStyle = getComputedStyle(this.node);\n\n      let i = propertyNames.length;\n      while (i--) {\n        const prop = propertyNames[i];\n        const name = prefix(prop);\n\n        const current = computedStyle[prefix(prop)];\n\n        // record the starting points\n        const init = this.node.style[name];\n        if (!(name in this.originals)) this.originals[name] = this.node.style[name];\n        this.node.style[name] = to[prop];\n        this.targets[name] = this.node.style[name];\n        this.node.style[name] = init;\n\n        // we need to know if we're actually changing anything\n        if (current != to[prop]) {\n          // use != instead of !==, so we can compare strings with numbers\n          changedProperties.push(name);\n\n          // if we happened to prefix, make sure there is a properly prefixed value\n          to[name] = to[prop];\n\n          // make the computed style explicit, so we can animate where\n          // e.g. height='auto'\n          this.node.style[name] = current;\n        }\n      }\n\n      // If we're not actually changing anything, the transitionend event\n      // will never fire! So we complete early\n      if (!changedProperties.length) {\n        fulfil();\n        return;\n      }\n\n      createTransitions(this, to, options, changedProperties, fulfil);\n    });\n  }\n\n  bind() {\n    const options = this.options;\n    const type = options.template && options.template.v;\n    if (type) {\n      if (type === 't0' || type === 't1') this.element.intro = this;\n      if (type === 't0' || type === 't2') this.element.outro = this;\n      this.eventName = names[type];\n    }\n\n    const ractive = this.owner.ractive;\n\n    this.name = options.name || options.template.n;\n\n    if (options.params) {\n      this.params = options.params;\n    }\n\n    if (isFunction(this.name)) {\n      this._fn = this.name;\n      this.name = this._fn.name;\n    } else {\n      this._fn = findInViewHierarchy('transitions', ractive, this.name);\n    }\n\n    if (!this._fn) {\n      warnOnceIfDebug(missingPlugin(this.name, 'transition'), { ractive });\n    }\n\n    setupArgsFn(this, options.template);\n  }\n\n  getParams() {\n    if (this.params) return this.params;\n\n    // get expression args if supplied\n    if (this.fn) {\n      const values = resolveArgs(this, this.template, this.up).map(model => {\n        if (!model) return undefined;\n\n        return model.get();\n      });\n      return this.fn.apply(this.ractive, values);\n    }\n  }\n\n  getStyle(props) {\n    const computedStyle = getComputedStyle(this.node);\n\n    if (isString(props)) {\n      return computedStyle[prefix(props)];\n    }\n\n    if (!isArray(props)) {\n      throw new Error(\n        'Transition$getStyle must be passed a string, or an array of strings representing CSS properties'\n      );\n    }\n\n    const styles = {};\n\n    let i = props.length;\n    while (i--) {\n      const prop = props[i];\n      let value = computedStyle[prefix(prop)];\n\n      if (value === '0px') value = 0;\n      styles[prop] = value;\n    }\n\n    return styles;\n  }\n\n  processParams(params, defaults) {\n    if (isNumber(params)) {\n      params = { duration: params };\n    } else if (isString(params)) {\n      if (params === 'slow') {\n        params = { duration: 600 };\n      } else if (params === 'fast') {\n        params = { duration: 200 };\n      } else {\n        params = { duration: 400 };\n      }\n    } else if (!params) {\n      params = {};\n    }\n\n    return assign({}, defaults, params);\n  }\n\n  registerCompleteHandler(fn) {\n    addToArray(this.onComplete, fn);\n  }\n\n  setStyle(style, value) {\n    if (isString(style)) {\n      const name = prefix(style);\n      if (!hasOwn(this.originals, name)) this.originals[name] = this.node.style[name];\n      this.node.style[name] = value;\n      this.targets[name] = this.node.style[name];\n    } else {\n      let prop;\n      for (prop in style) {\n        if (hasOwn(style, prop)) {\n          this.setStyle(prop, style[prop]);\n        }\n      }\n    }\n\n    return this;\n  }\n\n  shouldFire(type) {\n    if (!this.ractive.transitionsEnabled) return false;\n\n    // check for noIntro and noOutro cases, which only apply when the owner ractive is rendering and unrendering, respectively\n    if (type === 'intro' && this.ractive.rendering && nearestProp('noIntro', this.ractive, true))\n      return false;\n    if (type === 'outro' && this.ractive.unrendering && nearestProp('noOutro', this.ractive, false))\n      return false;\n\n    const params = this.getParams(); // this is an array, the params object should be the first member\n    // if there's not a parent element, this can't be nested, so roll on\n    if (!this.element.parent) return true;\n\n    // if there is a local param, it takes precedent\n    if (params && params[0] && isObject(params[0]) && 'nested' in params[0]) {\n      if (params[0].nested !== false) return true;\n    } else {\n      // use the nearest instance setting\n      // find the nearest instance that actually has a nested setting\n      if (nearestProp('nestedTransitions', this.ractive) !== false) return true;\n    }\n\n    // check to see if this is actually a nested transition\n    let el = this.element.parent;\n    while (el) {\n      if (el[type] && el[type].starting) return false;\n      el = el.parent;\n    }\n\n    return true;\n  }\n\n  start() {\n    const node = (this.node = this.element.node);\n    const originals = (this.originals = {}); //= node.getAttribute( 'style' );\n    const targets = (this.targets = {});\n\n    let completed;\n    const args = this.getParams();\n\n    // create t.complete() - we don't want this on the prototype,\n    // because we don't want `this` silliness when passing it as\n    // an argument\n    this.complete = noReset => {\n      this.starting = false;\n      if (completed) {\n        return;\n      }\n\n      this.onComplete.forEach(fn => fn());\n      if (!noReset && this.isIntro) {\n        for (const k in targets) {\n          if (node.style[k] === targets[k]) node.style[k] = originals[k];\n        }\n      }\n\n      this._manager.remove(this);\n\n      completed = true;\n    };\n\n    // If the transition function doesn't exist, abort\n    if (!this._fn) {\n      this.complete();\n      return;\n    }\n\n    const promise = this._fn.apply(this.ractive, [this].concat(args));\n    if (promise) promise.then(this.complete);\n  }\n\n  toString() {\n    return '';\n  }\n\n  unbind() {\n    if (!this.element.attributes || !this.element.attributes.unbinding) {\n      const type = this.options && this.options.template && this.options.template.v;\n      if (type === 't0' || type === 't1') this.element.intro = null;\n      if (type === 't0' || type === 't2') this.element.outro = null;\n    }\n  }\n\n  unregisterCompleteHandler(fn) {\n    removeFromArray(this.onComplete, fn);\n  }\n}\n\nconst proto = Transition.prototype;\nproto.destroyed = proto.firstNode = proto.rebound = proto.render = proto.unrender = proto.update = noop;\n\nfunction nearestProp(prop, ractive, rendering) {\n  let instance = ractive;\n  while (instance) {\n    if (\n      hasOwn(instance, prop) &&\n      (isUndefined(rendering) || rendering ? instance.rendering : instance.unrendering)\n    )\n      return instance[prop];\n    instance = instance.component && instance.component.ractive;\n  }\n\n  return ractive[prop];\n}\n","import { svg } from 'config/namespaces';\nimport { createElement } from 'utils/dom';\n\nconst elementCache = {};\n\nlet ieBug;\nlet ieBlacklist;\n\ntry {\n  createElement('table').innerHTML = 'foo';\n} catch (/* istanbul ignore next */ err) {\n  ieBug = true;\n\n  ieBlacklist = {\n    TABLE: ['<table class=\"x\">', '</table>'],\n    THEAD: ['<table><thead class=\"x\">', '</thead></table>'],\n    TBODY: ['<table><tbody class=\"x\">', '</tbody></table>'],\n    TR: ['<table><tr class=\"x\">', '</tr></table>'],\n    SELECT: ['<select class=\"x\">', '</select>']\n  };\n}\n\nexport default function(html, node) {\n  const nodes = [];\n\n  // render 0 and false\n  if (html == null || html === '') return nodes;\n\n  let container;\n  let wrapper;\n  let selectedOption;\n\n  /* istanbul ignore if */\n  if (ieBug && (wrapper = ieBlacklist[node.tagName])) {\n    container = element('DIV');\n    container.innerHTML = wrapper[0] + html + wrapper[1];\n    container = container.querySelector('.x');\n\n    if (container.tagName === 'SELECT') {\n      selectedOption = container.options[container.selectedIndex];\n    }\n  } else if (node.namespaceURI === svg) {\n    container = element('DIV');\n    container.innerHTML = '<svg class=\"x\">' + html + '</svg>';\n    container = container.querySelector('.x');\n  } else if (node.tagName === 'TEXTAREA') {\n    container = createElement('div');\n\n    if (typeof container.textContent !== 'undefined') {\n      container.textContent = html;\n    } else {\n      container.innerHTML = html;\n    }\n  } else {\n    container = element(node.tagName);\n    container.innerHTML = html;\n\n    if (container.tagName === 'SELECT') {\n      selectedOption = container.options[container.selectedIndex];\n    }\n  }\n\n  let child;\n  while ((child = container.firstChild)) {\n    nodes.push(child);\n    container.removeChild(child);\n  }\n\n  // This is really annoying. Extracting <option> nodes from the\n  // temporary container <select> causes the remaining ones to\n  // become selected. So now we have to deselect them. IE8, you\n  // amaze me. You really do\n  // ...and now Chrome too\n  let i;\n  if (node.tagName === 'SELECT') {\n    i = nodes.length;\n    while (i--) {\n      if (nodes[i] !== selectedOption) {\n        nodes[i].selected = false;\n      }\n    }\n  }\n\n  return nodes;\n}\n\nfunction element(tagName) {\n  return elementCache[tagName] || (elementCache[tagName] = createElement(tagName));\n}\n","import { createDocumentFragment, matches } from 'utils/dom';\nimport { detachNode } from 'utils/dom';\nimport { decodeCharacterReferences } from 'utils/html';\nimport runloop from 'src/global/runloop';\nimport Mustache from './shared/Mustache';\nimport insertHtml from './triple/insertHtml';\nimport { inAttribute } from './element/Attribute';\n\nexport default class Triple extends Mustache {\n  constructor(options) {\n    super(options);\n  }\n\n  detach() {\n    const docFrag = createDocumentFragment();\n    if (this.nodes) this.nodes.forEach(node => docFrag.appendChild(node));\n    return docFrag;\n  }\n\n  find(selector) {\n    const len = this.nodes.length;\n    let i;\n\n    for (i = 0; i < len; i += 1) {\n      const node = this.nodes[i];\n\n      if (node.nodeType !== 1) continue;\n\n      if (matches(node, selector)) return node;\n\n      const queryResult = node.querySelector(selector);\n      if (queryResult) return queryResult;\n    }\n\n    return null;\n  }\n\n  findAll(selector, options) {\n    const { result } = options;\n    const len = this.nodes.length;\n    let i;\n\n    for (i = 0; i < len; i += 1) {\n      const node = this.nodes[i];\n\n      if (node.nodeType !== 1) continue;\n\n      if (matches(node, selector)) result.push(node);\n\n      const queryAllResult = node.querySelectorAll(selector);\n      if (queryAllResult) {\n        result.push.apply(result, queryAllResult);\n      }\n    }\n  }\n\n  findComponent() {\n    return null;\n  }\n\n  firstNode() {\n    return this.rendered && this.nodes[0];\n  }\n\n  render(target, occupants, anchor) {\n    if (!this.nodes) {\n      const html = this.model ? this.model.get() : '';\n      this.nodes = insertHtml(html, target);\n    }\n\n    let nodes = this.nodes;\n\n    // progressive enhancement\n    if (occupants) {\n      let i = -1;\n      let next;\n\n      // start with the first node that should be rendered\n      while (occupants.length && (next = this.nodes[i + 1])) {\n        let n;\n        // look through the occupants until a matching node is found\n        while ((n = occupants.shift())) {\n          const t = n.nodeType;\n\n          if (\n            t === next.nodeType &&\n            ((t === 1 && n.outerHTML === next.outerHTML) ||\n              ((t === 3 || t === 8) && n.nodeValue === next.nodeValue))\n          ) {\n            this.nodes.splice(++i, 1, n); // replace the generated node with the existing one\n            break;\n          } else {\n            target.removeChild(n); // remove the non-matching existing node\n          }\n        }\n      }\n\n      if (i >= 0) {\n        // update the list of remaining nodes to attach, excluding any that were replaced by existing nodes\n        nodes = this.nodes.slice(i);\n      }\n\n      // update the anchor to be the next occupant\n      if (occupants.length) anchor = occupants[0];\n    }\n\n    // attach any remainging nodes to the parent\n    if (nodes.length) {\n      const frag = createDocumentFragment();\n      nodes.forEach(n => frag.appendChild(n));\n\n      if (anchor) {\n        target.insertBefore(frag, anchor);\n      } else {\n        target.appendChild(frag);\n      }\n    }\n\n    this.rendered = true;\n  }\n\n  toString() {\n    let value = this.model && this.model.get();\n    value = value != null ? '' + value : '';\n\n    return inAttribute() ? decodeCharacterReferences(value) : value;\n  }\n\n  unrender() {\n    if (this.nodes)\n      this.nodes.forEach(node => {\n        // defer detachment until all relevant outros are done\n        runloop.detachWhenReady({\n          node,\n          detach() {\n            detachNode(node);\n          }\n        });\n      });\n    this.rendered = false;\n    this.nodes = null;\n  }\n\n  update() {\n    if (this.rendered && this.dirty) {\n      this.dirty = false;\n\n      this.unrender();\n      this.render(this.up.findParentNode(), null, this.up.findNextNode(this));\n    } else {\n      // make sure to reset the dirty flag even if not rendered\n      this.dirty = false;\n    }\n  }\n}\n","import {\n  ALIAS,\n  ANCHOR,\n  AWAIT,\n  COMMENT,\n  COMPONENT,\n  DOCTYPE,\n  ELEMENT,\n  INTERPOLATOR,\n  PARTIAL,\n  SECTION,\n  TRIPLE,\n  YIELDER\n} from 'config/types';\nimport { ATTRIBUTE, BINDING_FLAG, DECORATOR, EVENT, TRANSITION } from 'config/types';\nimport Attribute from './element/Attribute';\nimport BindingFlag from './element/BindingFlag';\nimport Comment from './Comment';\nimport Component from './Component';\nimport Decorator from './element/Decorator';\nimport Doctype from './Doctype';\nimport Form from './element/specials/Form';\nimport Element from './Element';\nimport EventDirective from './shared/EventDirective';\nimport Interpolator from './Interpolator';\nimport Input from './element/specials/Input';\nimport Mapping from './component/Mapping';\nimport Option from './element/specials/Option';\nimport Partial from './Partial';\nimport Section from './Section';\nimport Select from './element/specials/Select';\nimport Textarea from './element/specials/Textarea';\nimport Text from './Text';\nimport Transition from './element/Transition';\nimport Triple from './Triple';\nimport getComponentConstructor from './component/getComponentConstructor';\nimport findElement from './shared/findElement';\nimport { findInstance } from 'shared/registry';\nimport asyncProxy from './asyncProxy';\nimport Await from './Await';\nimport { isString, isFunction } from 'utils/is';\n\nconst constructors = {};\nconstructors[ALIAS] = Section;\nconstructors[ANCHOR] = Component;\nconstructors[AWAIT] = Await;\nconstructors[DOCTYPE] = Doctype;\nconstructors[INTERPOLATOR] = Interpolator;\nconstructors[PARTIAL] = Partial;\nconstructors[SECTION] = Section;\nconstructors[TRIPLE] = Triple;\nconstructors[YIELDER] = Partial;\n\nconstructors[ATTRIBUTE] = Attribute;\nconstructors[BINDING_FLAG] = BindingFlag;\nconstructors[DECORATOR] = Decorator;\nconstructors[EVENT] = EventDirective;\nconstructors[TRANSITION] = Transition;\nconstructors[COMMENT] = Comment;\n\nconst specialElements = {\n  doctype: Doctype,\n  form: Form,\n  input: Input,\n  option: Option,\n  select: Select,\n  textarea: Textarea\n};\n\nexport default function createItem(options) {\n  if (isString(options.template)) {\n    return new Text(options);\n  }\n\n  let ctor;\n  let name;\n  const type = options.template.t;\n\n  if (type === ELEMENT) {\n    name = options.template.e;\n\n    // could be a macro partial\n    ctor = findInstance('partials', options.up.ractive, name);\n    if (ctor) {\n      ctor = ctor.partials[name];\n      if (ctor.styleSet) {\n        options.macro = ctor;\n        return new Partial(options);\n      }\n    }\n\n    // could be component or element\n    ctor = getComponentConstructor(options.up.ractive, name);\n    if (ctor) {\n      if (isFunction(ctor.then)) {\n        return asyncProxy(ctor, options);\n      } else if (isFunction(ctor)) {\n        return new Component(options, ctor);\n      }\n    }\n\n    ctor = specialElements[name.toLowerCase()] || Element;\n    return new ctor(options);\n  }\n\n  let Item;\n\n  // component mappings are a special case of attribute\n  if (type === ATTRIBUTE) {\n    let el = options.owner;\n    if (!el || (el.type !== ANCHOR && el.type !== COMPONENT && el.type !== ELEMENT)) {\n      el = findElement(options.up);\n    }\n    options.element = el;\n\n    Item = el.type === COMPONENT || el.type === ANCHOR ? Mapping : Attribute;\n  } else {\n    Item = constructors[type];\n  }\n\n  if (!Item) throw new Error(`Unrecognised item type ${type}`);\n\n  return new Item(options);\n}\n","import { removeFromArray } from 'utils/array';\nimport noop from 'utils/noop';\nimport { warnIfDebug } from 'utils/log';\nimport Model from 'src/model/Model';\nimport Computation from 'src/model/Computation';\nimport { startCapturing, stopCapturing } from 'src/global/capture';\nimport getFunction from 'shared/getFunction';\nimport { rebindMatch } from 'shared/rebind';\nimport resolveReference from './resolveReference';\n\nexport default class ExpressionProxy extends Model {\n  constructor(fragment, template) {\n    super(fragment.ractive.viewmodel, null);\n\n    this.fragment = fragment;\n    this.template = template;\n\n    this.isReadonly = true;\n    this.isComputed = true;\n    this.dirty = true;\n\n    this.fn =\n      fragment.ractive.allowExpressions === false\n        ? noop\n        : getFunction(template.s, template.r.length);\n\n    this.models = this.template.r.map(ref => {\n      return resolveReference(this.fragment, ref);\n    });\n    this.dependencies = [];\n\n    this.shuffle = undefined;\n\n    this.bubble();\n  }\n\n  bubble(actuallyChanged = true) {\n    // refresh the keypath\n    this.keypath = undefined;\n\n    if (actuallyChanged) {\n      this.handleChange();\n    }\n  }\n\n  getKeypath() {\n    if (!this.template) return '@undefined';\n    if (!this.keypath) {\n      this.keypath =\n        '@' +\n        this.template.s.replace(/_(\\d+)/g, (match, i) => {\n          if (i >= this.models.length) return match;\n\n          const model = this.models[i];\n          return model ? model.getKeypath() : '@undefined';\n        });\n    }\n\n    return this.keypath;\n  }\n\n  getValue() {\n    startCapturing();\n    let result;\n\n    try {\n      const params = this.models.map(m => (m ? m.get(true) : undefined));\n      result = this.fn.apply(this.fragment.ractive, params);\n    } catch (err) {\n      warnIfDebug(`Failed to compute ${this.getKeypath()}: ${err.message || err}`);\n    }\n\n    const dependencies = stopCapturing();\n    // remove missing deps\n    this.dependencies\n      .filter(d => !~dependencies.indexOf(d))\n      .forEach(d => {\n        d.unregister(this);\n        removeFromArray(this.dependencies, d);\n      });\n    // register new deps\n    dependencies\n      .filter(d => !~this.dependencies.indexOf(d))\n      .forEach(d => {\n        d.register(this);\n        this.dependencies.push(d);\n      });\n\n    return result;\n  }\n\n  notifyUpstream() {}\n\n  rebind(next, previous, safe) {\n    const idx = this.models.indexOf(previous);\n\n    if (~idx) {\n      next = rebindMatch(this.template.r[idx], next, previous);\n      if (next !== previous) {\n        previous.unregister(this);\n        this.models.splice(idx, 1, next);\n        if (next) next.addShuffleRegister(this, 'mark');\n      }\n    }\n    this.bubble(!safe);\n  }\n\n  rebound(update) {\n    this.models = this.template.r.map(ref => resolveReference(this.fragment, ref));\n    if (update) this.bubble(true);\n  }\n\n  retrieve() {\n    return this.get();\n  }\n\n  teardown() {\n    this.fragment = undefined;\n    if (this.dependencies) this.dependencies.forEach(d => d.unregister(this));\n    super.teardown();\n  }\n\n  unreference() {\n    super.unreference();\n    collect(this);\n  }\n\n  unregister(dep) {\n    super.unregister(dep);\n    collect(this);\n  }\n\n  unregisterLink(link) {\n    super.unregisterLink(link);\n    collect(this);\n  }\n}\n\nconst prototype = ExpressionProxy.prototype;\nconst computation = Computation.prototype;\nprototype.get = computation.get;\nprototype.handleChange = computation.handleChange;\nprototype.joinKey = computation.joinKey;\nprototype.mark = computation.mark;\nprototype.unbind = noop;\n\nfunction collect(model) {\n  if (!model.deps.length && !model.refs && !model.links.length) model.teardown();\n}\n","import { findInViewHierarchy } from 'shared/registry';\nimport { warnOnce } from 'utils/log';\nimport { missingPlugin } from 'config/errors';\nimport noop from 'utils/noop';\nimport runloop from 'src/global/runloop';\nimport findElement from '../shared/findElement';\nimport { setupArgsFn, teardownArgsFn } from '../shared/directiveArgs';\nimport Fragment from '../../Fragment';\nimport { localFragment } from 'src/shared/Context';\n\nconst missingDecorator = {\n  update: noop,\n  teardown: noop\n};\n\nexport default class Decorator {\n  constructor(options) {\n    this.owner = options.owner || options.up.owner || findElement(options.up);\n    this.element = this.owner.attributeByName ? this.owner : findElement(options.up);\n    this.up = options.up || this.owner.up;\n    this.ractive = this.up.ractive || this.owner.ractive;\n    const template = (this.template = options.template);\n\n    this.name = template.n;\n\n    this.node = null;\n    this.handle = null;\n\n    this.element.decorators.push(this);\n  }\n\n  bind() {\n    // if the owner is the elment, make sure the context includes the element\n    const frag = this.element === this.owner ? new Fragment({ owner: this.owner }) : this.up;\n    setupArgsFn(this, this.template, frag, { register: true });\n  }\n\n  bubble() {\n    if (!this.dirty) {\n      this.dirty = true;\n      // decorators may be owned directly by an element or by a fragment if conditional\n      this.owner.bubble();\n      this.up.bubble();\n    }\n  }\n\n  destroyed() {\n    if (this.handle) {\n      this.handle.teardown();\n      this.handle = null;\n    }\n    this.shouldDestroy = true;\n  }\n\n  handleChange() {\n    this.bubble();\n  }\n\n  rebound(update) {\n    if (this.model) this.model.rebound(update);\n  }\n\n  render() {\n    this.shouldDestroy = false;\n    if (this.handle) this.unrender();\n    const ractive = this.ractive;\n    runloop.scheduleTask(() => {\n      // bail if the host element has managed to become unrendered\n      if (!this.element.rendered) return;\n\n      const fn = findInViewHierarchy('decorators', ractive, this.name);\n\n      if (!fn) {\n        warnOnce(missingPlugin(this.name, 'decorator'));\n        this.handle = missingDecorator;\n        return;\n      }\n\n      this.node = this.element.node;\n\n      const args = this.model ? this.model.get() : [];\n      localFragment.f = this.up;\n      this.handle = fn.apply(ractive, [this.node].concat(args));\n      localFragment.f = null;\n\n      if (!this.handle || !this.handle.teardown) {\n        throw new Error(\n          `The '${this.name}' decorator must return an object with a teardown method`\n        );\n      }\n\n      // watch out for decorators that cause their host element to be unrendered\n      if (this.shouldDestroy) this.destroyed();\n    }, true);\n  }\n\n  shuffled() {\n    if (this.handle && this.handle.shuffled) this.handle.shuffled();\n  }\n\n  toString() {\n    return '';\n  }\n\n  unbind() {\n    teardownArgsFn(this, this.template);\n  }\n\n  unrender(shouldDestroy) {\n    if ((!shouldDestroy || this.element.rendered) && this.handle) {\n      this.handle.teardown();\n      this.handle = null;\n    }\n  }\n\n  update() {\n    const instance = this.handle;\n\n    if (!this.dirty) {\n      if (instance && instance.invalidate) {\n        runloop.scheduleTask(() => instance.invalidate(), true);\n      }\n      return;\n    }\n\n    this.dirty = false;\n\n    if (instance) {\n      if (!instance.update) {\n        this.unrender();\n        this.render();\n      } else {\n        const args = this.model ? this.model.get() : [];\n        instance.update.apply(this.ractive, args);\n      }\n    }\n  }\n}\n\nDecorator.prototype.firstNode = noop;\n","import noop from 'utils/noop';\nimport Item from './shared/Item';\n\nexport default class Doctype extends Item {\n  toString() {\n    return '<!DOCTYPE' + this.template.a + '>';\n  }\n}\n\nconst proto = Doctype.prototype;\nproto.bind = proto.render = proto.teardown = proto.unbind = proto.unrender = proto.update = noop;\n","import runloop from 'src/global/runloop';\nimport { warnOnceIfDebug } from 'utils/log';\nimport noop from 'utils/noop';\nimport findElement from '../../shared/findElement';\nimport { isUndefined } from 'utils/is';\n\nexport default class Binding {\n  constructor(element, name = 'value') {\n    this.element = element;\n    this.ractive = element.ractive;\n    this.attribute = element.attributeByName[name];\n\n    const interpolator = this.attribute.interpolator;\n    interpolator.twowayBinding = this;\n\n    const model = interpolator.model;\n\n    if (model.isReadonly && !model.setRoot) {\n      const keypath = model.getKeypath().replace(/^@/, '');\n      warnOnceIfDebug(\n        `Cannot use two-way binding on <${\n          element.name\n        }> element: ${keypath} is read-only. To suppress this warning use <${\n          element.name\n        } twoway='false'...>`,\n        { ractive: this.ractive }\n      );\n      return false;\n    }\n\n    this.attribute.isTwoway = true;\n    this.model = model;\n\n    // initialise value, if it's undefined\n    let value = model.get();\n    this.wasUndefined = isUndefined(value);\n\n    if (isUndefined(value) && this.getInitialValue) {\n      value = this.getInitialValue();\n      model.set(value);\n    }\n    this.lastVal(true, value);\n\n    const parentForm = findElement(this.element, false, 'form');\n    if (parentForm) {\n      this.resetValue = value;\n      parentForm.formBindings.push(this);\n    }\n  }\n\n  bind() {\n    this.model.registerTwowayBinding(this);\n  }\n\n  handleChange() {\n    const value = this.getValue();\n    if (this.lastVal() === value) return;\n\n    runloop.start();\n    this.attribute.locked = true;\n    this.model.set(value);\n    this.lastVal(true, value);\n\n    // if the value changes before observers fire, unlock to be updatable cause something weird and potentially freezy is up\n    if (this.model.get() !== value) this.attribute.locked = false;\n    else runloop.scheduleTask(() => (this.attribute.locked = false));\n\n    runloop.end();\n  }\n\n  lastVal(setting, value) {\n    if (setting) this.lastValue = value;\n    else return this.lastValue;\n  }\n\n  rebind(next, previous) {\n    if (this.model && this.model === previous) previous.unregisterTwowayBinding(this);\n    if (next) {\n      this.model = next;\n      runloop.scheduleTask(() => next.registerTwowayBinding(this));\n    }\n  }\n\n  rebound() {\n    if (this.model) this.model.unregisterTwowayBinding(this);\n    this.model = this.attribute.interpolator.model;\n    this.model && this.model.registerTwowayBinding(this);\n  }\n\n  render() {\n    this.node = this.element.node;\n    this.node._ractive.binding = this;\n    this.rendered = true; // TODO is this used anywhere?\n  }\n\n  setFromNode(node) {\n    this.model.set(node.value);\n  }\n\n  unbind() {\n    this.model && this.model.unregisterTwowayBinding(this);\n  }\n}\n\nBinding.prototype.unrender = noop;\n","import Binding from './Binding';\nimport handleDomEvent from './handleDomEvent';\n\nexport default class CheckboxBinding extends Binding {\n  constructor(element) {\n    super(element, 'checked');\n  }\n\n  render() {\n    super.render();\n\n    this.element.on('change', handleDomEvent);\n\n    if (this.node.attachEvent) {\n      this.element.on('click', handleDomEvent);\n    }\n  }\n\n  unrender() {\n    this.element.off('change', handleDomEvent);\n\n    if (this.node.attachEvent) {\n      this.element.off('click', handleDomEvent);\n    }\n  }\n\n  getInitialValue() {\n    return !!this.element.getAttribute('checked');\n  }\n\n  getValue() {\n    return this.node.checked;\n  }\n\n  setFromNode(node) {\n    this.model.set(node.checked);\n  }\n}\n","import { removeFromArray } from 'utils/array';\nimport Binding from './Binding';\n\nexport default function getBindingGroup(group, model, getValue) {\n  const hash = `${group}-bindingGroup`;\n  return model[hash] || (model[hash] = new BindingGroup(hash, model, getValue));\n}\n\nclass BindingGroup {\n  constructor(hash, model, getValue) {\n    this.model = model;\n    this.hash = hash;\n    this.getValue = () => {\n      this.value = getValue.call(this);\n      return this.value;\n    };\n\n    this.bindings = [];\n  }\n\n  add(binding) {\n    this.bindings.push(binding);\n  }\n\n  bind() {\n    this.value = this.model.get();\n    this.bindings.forEach(b => b.lastVal(true, this.value));\n    this.model.registerTwowayBinding(this);\n    this.bound = true;\n  }\n\n  remove(binding) {\n    removeFromArray(this.bindings, binding);\n    if (!this.bindings.length) {\n      this.unbind();\n    }\n  }\n\n  unbind() {\n    this.model.unregisterTwowayBinding(this);\n    this.bound = false;\n    delete this.model[this.hash];\n  }\n}\n\nBindingGroup.prototype.rebind = Binding.prototype.rebind;\n","import Binding from './Binding';\nimport getBindingGroup from './getBindingGroup';\nimport handleDomEvent from './handleDomEvent';\nimport { isArray } from 'utils/is';\n\nconst push = [].push;\n\nfunction getValue() {\n  const all = this.bindings\n    .filter(b => b.node && b.node.checked)\n    .map(b => b.element.getAttribute('value'));\n  const res = [];\n  all.forEach(v => {\n    if (!this.bindings[0].arrayContains(res, v)) res.push(v);\n  });\n  return res;\n}\n\nexport default class CheckboxNameBinding extends Binding {\n  constructor(element) {\n    super(element, 'name');\n\n    this.checkboxName = true; // so that ractive.updateModel() knows what to do with this\n\n    // Each input has a reference to an array containing it and its\n    // group, as two-way binding depends on being able to ascertain\n    // the status of all inputs within the group\n    this.group = getBindingGroup('checkboxes', this.model, getValue);\n    this.group.add(this);\n\n    if (this.noInitialValue) {\n      this.group.noInitialValue = true;\n    }\n\n    // If no initial value was set, and this input is checked, we\n    // update the model\n    if (this.group.noInitialValue && this.element.getAttribute('checked')) {\n      const existingValue = this.model.get();\n      const bindingValue = this.element.getAttribute('value');\n\n      if (!this.arrayContains(existingValue, bindingValue)) {\n        push.call(existingValue, bindingValue); // to avoid triggering runloop with array adaptor\n      }\n    }\n  }\n\n  bind() {\n    if (!this.group.bound) {\n      this.group.bind();\n    }\n  }\n\n  getInitialValue() {\n    // This only gets called once per group (of inputs that\n    // share a name), because it only gets called if there\n    // isn't an initial value. By the same token, we can make\n    // a note of that fact that there was no initial value,\n    // and populate it using any `checked` attributes that\n    // exist (which users should avoid, but which we should\n    // support anyway to avoid breaking expectations)\n    this.noInitialValue = true; // TODO are noInitialValue and wasUndefined the same thing?\n    return [];\n  }\n\n  getValue() {\n    return this.group.value;\n  }\n\n  handleChange() {\n    this.isChecked = this.element.node.checked;\n    const mval = this.model.get();\n    this.group.value = mval === undefined ? [] : mval.slice();\n    const value = this.element.getAttribute('value');\n    if (this.isChecked && !this.arrayContains(this.group.value, value)) {\n      this.group.value.push(value);\n    } else if (!this.isChecked && this.arrayContains(this.group.value, value)) {\n      this.removeFromArray(this.group.value, value);\n    }\n    // make sure super knows there's a change\n    this.lastValue = null;\n    super.handleChange();\n  }\n\n  render() {\n    super.render();\n\n    const node = this.node;\n\n    const existingValue = this.model.get();\n    const bindingValue = this.element.getAttribute('value');\n\n    if (isArray(existingValue)) {\n      this.isChecked = this.arrayContains(existingValue, bindingValue);\n    } else {\n      this.isChecked = this.element.compare(existingValue, bindingValue);\n    }\n    node.name = '{{' + this.model.getKeypath() + '}}';\n    node.checked = this.isChecked;\n\n    this.element.on('change', handleDomEvent);\n\n    // in case of IE emergency, bind to click event as well\n    if (this.node.attachEvent) {\n      this.element.on('click', handleDomEvent);\n    }\n  }\n\n  setFromNode(node) {\n    this.group.bindings.forEach(binding => (binding.wasUndefined = true));\n\n    if (node.checked) {\n      const valueSoFar = this.group.getValue();\n      valueSoFar.push(this.element.getAttribute('value'));\n\n      this.group.model.set(valueSoFar);\n    }\n  }\n\n  unbind() {\n    this.group.remove(this);\n  }\n\n  unrender() {\n    const el = this.element;\n\n    el.off('change', handleDomEvent);\n\n    if (this.node.attachEvent) {\n      el.off('click', handleDomEvent);\n    }\n  }\n\n  arrayContains(selectValue, optionValue) {\n    let i = selectValue.length;\n    while (i--) {\n      if (this.element.compare(optionValue, selectValue[i])) return true;\n    }\n    return false;\n  }\n\n  removeFromArray(array, item) {\n    if (!array) return;\n    let i = array.length;\n    while (i--) {\n      if (this.element.compare(item, array[i])) {\n        array.splice(i, 1);\n      }\n    }\n  }\n}\n","import Binding from './Binding';\nimport handleDomEvent from './handleDomEvent';\n\nexport default class ContentEditableBinding extends Binding {\n  getInitialValue() {\n    return this.element.fragment ? this.element.fragment.toString() : '';\n  }\n\n  getValue() {\n    return this.element.node.innerHTML;\n  }\n\n  render() {\n    super.render();\n\n    const el = this.element;\n\n    el.on('change', handleDomEvent);\n    el.on('blur', handleDomEvent);\n\n    if (!this.ractive.lazy) {\n      el.on('input', handleDomEvent);\n\n      if (this.node.attachEvent) {\n        el.on('keyup', handleDomEvent);\n      }\n    }\n  }\n\n  setFromNode(node) {\n    this.model.set(node.innerHTML);\n  }\n\n  unrender() {\n    const el = this.element;\n\n    el.off('blur', handleDomEvent);\n    el.off('change', handleDomEvent);\n    el.off('input', handleDomEvent);\n    el.off('keyup', handleDomEvent);\n  }\n}\n","import { isNumeric } from 'utils/is';\nimport Binding from './Binding';\nimport handleDomEvent from './handleDomEvent';\n\nfunction handleBlur() {\n  handleDomEvent.call(this);\n\n  const value = this._ractive.binding.model.get();\n  this.value = value == undefined ? '' : value;\n}\n\nfunction handleDelay(delay) {\n  let timeout;\n\n  return function() {\n    if (timeout) clearTimeout(timeout);\n\n    timeout = setTimeout(() => {\n      const binding = this._ractive.binding;\n      if (binding.rendered) handleDomEvent.call(this);\n      timeout = null;\n    }, delay);\n  };\n}\n\nexport default class GenericBinding extends Binding {\n  getInitialValue() {\n    return '';\n  }\n\n  getValue() {\n    return this.node.value;\n  }\n\n  render() {\n    super.render();\n\n    // any lazy setting for this element overrides the root\n    // if the value is a number, it's a timeout\n    let lazy = this.ractive.lazy;\n    let timeout = false;\n    const el = this.element;\n\n    if ('lazy' in this.element) {\n      lazy = this.element.lazy;\n    }\n\n    if (isNumeric(lazy)) {\n      timeout = +lazy;\n      lazy = false;\n    }\n\n    this.handler = timeout ? handleDelay(timeout) : handleDomEvent;\n\n    const node = this.node;\n\n    el.on('change', handleDomEvent);\n\n    if (node.type !== 'file') {\n      if (!lazy) {\n        el.on('input', this.handler);\n\n        // IE is a special snowflake\n        if (node.attachEvent) {\n          el.on('keyup', this.handler);\n        }\n      }\n\n      el.on('blur', handleBlur);\n    }\n  }\n\n  unrender() {\n    const el = this.element;\n    this.rendered = false;\n\n    el.off('change', handleDomEvent);\n    el.off('input', this.handler);\n    el.off('keyup', this.handler);\n    el.off('blur', handleBlur);\n  }\n}\n","import GenericBinding from './GenericBinding';\n\nexport default class FileBinding extends GenericBinding {\n  getInitialValue() {\n    /* istanbul ignore next */\n    return undefined;\n  }\n\n  getValue() {\n    /* istanbul ignore next */\n    return this.node.files;\n  }\n\n  render() {\n    /* istanbul ignore next */\n    this.element.lazy = false;\n    /* istanbul ignore next */\n    super.render();\n  }\n\n  setFromNode(node) {\n    /* istanbul ignore next */\n    this.model.set(node.files);\n  }\n}\n","import { arrayContentsMatch } from 'utils/array';\nimport getSelectedOptions from 'utils/getSelectedOptions';\nimport Binding from './Binding';\nimport handleDomEvent from './handleDomEvent';\nimport { isUndefined } from 'utils/is';\n\nexport default class MultipleSelectBinding extends Binding {\n  getInitialValue() {\n    return this.element.options\n      .filter(option => option.getAttribute('selected'))\n      .map(option => option.getAttribute('value'));\n  }\n\n  getValue() {\n    const options = this.element.node.options;\n    const len = options.length;\n\n    const selectedValues = [];\n\n    for (let i = 0; i < len; i += 1) {\n      const option = options[i];\n\n      if (option.selected) {\n        const optionValue = option._ractive ? option._ractive.value : option.value;\n        selectedValues.push(optionValue);\n      }\n    }\n\n    return selectedValues;\n  }\n\n  handleChange() {\n    const attribute = this.attribute;\n    const previousValue = attribute.getValue();\n\n    const value = this.getValue();\n\n    if (isUndefined(previousValue) || !arrayContentsMatch(value, previousValue)) {\n      super.handleChange();\n    }\n\n    return this;\n  }\n\n  render() {\n    super.render();\n\n    this.element.on('change', handleDomEvent);\n\n    if (isUndefined(this.model.get())) {\n      // get value from DOM, if possible\n      this.handleChange();\n    }\n  }\n\n  setFromNode(node) {\n    const selectedOptions = getSelectedOptions(node);\n    let i = selectedOptions.length;\n    const result = new Array(i);\n\n    while (i--) {\n      const option = selectedOptions[i];\n      result[i] = option._ractive ? option._ractive.value : option.value;\n    }\n\n    this.model.set(result);\n  }\n\n  unrender() {\n    this.element.off('change', handleDomEvent);\n  }\n}\n","import GenericBinding from './GenericBinding';\n\nexport default class NumericBinding extends GenericBinding {\n  getInitialValue() {\n    return undefined;\n  }\n\n  getValue() {\n    const value = parseFloat(this.node.value);\n    return isNaN(value) ? undefined : value;\n  }\n\n  setFromNode(node) {\n    const value = parseFloat(node.value);\n    if (!isNaN(value)) this.model.set(value);\n  }\n}\n","import runloop from 'src/global/runloop';\nimport { removeFromArray } from 'utils/array';\nimport Binding from './Binding';\nimport handleDomEvent from './handleDomEvent';\n\nconst siblings = {};\n\nfunction getSiblings(hash) {\n  return siblings[hash] || (siblings[hash] = []);\n}\n\nexport default class RadioBinding extends Binding {\n  constructor(element) {\n    super(element, 'checked');\n\n    this.siblings = getSiblings(this.ractive._guid + this.element.getAttribute('name'));\n    this.siblings.push(this);\n  }\n\n  getValue() {\n    return this.node.checked;\n  }\n\n  handleChange() {\n    runloop.start();\n\n    this.siblings.forEach(binding => {\n      binding.model.set(binding.getValue());\n    });\n\n    runloop.end();\n  }\n\n  render() {\n    super.render();\n\n    this.element.on('change', handleDomEvent);\n\n    if (this.node.attachEvent) {\n      this.element.on('click', handleDomEvent);\n    }\n  }\n\n  setFromNode(node) {\n    this.model.set(node.checked);\n  }\n\n  unbind() {\n    removeFromArray(this.siblings, this);\n  }\n\n  unrender() {\n    this.element.off('change', handleDomEvent);\n\n    if (this.node.attachEvent) {\n      this.element.off('click', handleDomEvent);\n    }\n  }\n}\n","import Binding from './Binding';\nimport getBindingGroup from './getBindingGroup';\nimport handleDomEvent from './handleDomEvent';\n\nfunction getValue() {\n  const checked = this.bindings.filter(b => b.node.checked);\n  if (checked.length > 0) {\n    return checked[0].element.getAttribute('value');\n  }\n}\n\nexport default class RadioNameBinding extends Binding {\n  constructor(element) {\n    super(element, 'name');\n\n    this.group = getBindingGroup('radioname', this.model, getValue);\n    this.group.add(this);\n\n    if (element.checked) {\n      this.group.value = this.getValue();\n    }\n\n    this.attribute.interpolator.pathChanged = () => this.updateName();\n  }\n\n  bind() {\n    if (!this.group.bound) {\n      this.group.bind();\n    }\n  }\n\n  getInitialValue() {\n    if (this.element.getAttribute('checked')) {\n      return this.element.getAttribute('value');\n    }\n  }\n\n  getValue() {\n    return this.element.getAttribute('value');\n  }\n\n  handleChange() {\n    // If this <input> is the one that's checked, then the value of its\n    // `name` model gets set to its value\n    if (this.node.checked) {\n      this.group.value = this.getValue();\n      super.handleChange();\n    }\n\n    this.updateName();\n  }\n\n  lastVal(setting, value) {\n    if (!this.group) return;\n    if (setting) this.group.lastValue = value;\n    else return this.group.lastValue;\n  }\n\n  rebind(next, previous) {\n    super.rebind(next, previous);\n    this.updateName();\n  }\n\n  rebound(update) {\n    super.rebound(update);\n    this.updateName();\n  }\n\n  render() {\n    super.render();\n\n    const node = this.node;\n\n    this.updateName();\n    node.checked = this.element.compare(this.model.get(), this.element.getAttribute('value'));\n\n    this.element.on('change', handleDomEvent);\n\n    if (node.attachEvent) {\n      this.element.on('click', handleDomEvent);\n    }\n  }\n\n  setFromNode(node) {\n    if (node.checked) {\n      this.group.model.set(this.element.getAttribute('value'));\n    }\n  }\n\n  unbind() {\n    this.group.remove(this);\n  }\n\n  unrender() {\n    const el = this.element;\n\n    el.off('change', handleDomEvent);\n\n    if (this.node.attachEvent) {\n      el.off('click', handleDomEvent);\n    }\n  }\n\n  updateName() {\n    if (this.node) this.node.name = `{{${this.model.getKeypath()}}}`;\n  }\n}\n","import runloop from 'src/global/runloop';\nimport getSelectedOptions from 'utils/getSelectedOptions';\nimport Binding from './Binding';\nimport handleDomEvent from './handleDomEvent';\n\nexport default class SingleSelectBinding extends Binding {\n  forceUpdate() {\n    const value = this.getValue();\n\n    if (value !== undefined) {\n      this.attribute.locked = true;\n      runloop.scheduleTask(() => (this.attribute.locked = false));\n      this.model.set(value);\n    }\n  }\n\n  getInitialValue() {\n    if (this.element.getAttribute('value') !== undefined) {\n      return;\n    }\n\n    const options = this.element.options;\n    const len = options.length;\n\n    if (!len) return;\n\n    let value;\n    let optionWasSelected;\n    let i = len;\n\n    // take the final selected option...\n    while (i--) {\n      const option = options[i];\n\n      if (option.getAttribute('selected')) {\n        if (!option.getAttribute('disabled')) {\n          value = option.getAttribute('value');\n        }\n\n        optionWasSelected = true;\n        break;\n      }\n    }\n\n    // or the first non-disabled option, if none are selected\n    if (!optionWasSelected) {\n      while (++i < len) {\n        if (!options[i].getAttribute('disabled')) {\n          value = options[i].getAttribute('value');\n          break;\n        }\n      }\n    }\n\n    // This is an optimisation (aka hack) that allows us to forgo some\n    // other more expensive work\n    // TODO does it still work? seems at odds with new architecture\n    if (value !== undefined) {\n      this.element.attributeByName.value.value = value;\n    }\n\n    return value;\n  }\n\n  getValue() {\n    const options = this.node.options;\n    const len = options.length;\n\n    let i;\n    for (i = 0; i < len; i += 1) {\n      const option = options[i];\n\n      if (options[i].selected && !options[i].disabled) {\n        return option._ractive ? option._ractive.value : option.value;\n      }\n    }\n  }\n\n  render() {\n    super.render();\n    this.element.on('change', handleDomEvent);\n  }\n\n  setFromNode(node) {\n    const option = getSelectedOptions(node)[0];\n    this.model.set(option._ractive ? option._ractive.value : option.value);\n  }\n\n  unrender() {\n    this.element.off('change', handleDomEvent);\n  }\n}\n","import { ATTRIBUTE, BINDING_FLAG, DECORATOR, DELEGATE_FLAG, EVENT, TRANSITION } from 'config/types';\nimport { win } from 'config/environment';\nimport { html, svg } from 'config/namespaces';\nimport { toArray, addToArray, removeFromArray } from 'utils/array';\nimport { escapeHtml, voidElements } from 'utils/html';\nimport { createElement, detachNode, matches, safeAttributeString } from 'utils/dom';\nimport runloop from 'src/global/runloop';\nimport Context from 'shared/Context';\nimport { destroyed, shuffled } from 'shared/methodCallers';\nimport { ContainerItem } from './shared/Item';\nimport Fragment from '../Fragment';\nimport ConditionalAttribute from './element/ConditionalAttribute';\nimport createItem from './createItem';\nimport findElement from './shared/findElement';\nimport selectBinding from './element/binding/selectBinding';\nimport { assign, create, defineProperty, keys } from 'utils/object';\nimport { isString } from 'utils/is';\n\nconst endsWithSemi = /;\\s*$/;\n\nexport default class Element extends ContainerItem {\n  constructor(options) {\n    super(options);\n\n    this.name = options.template.e.toLowerCase();\n\n    // find parent element\n    this.parent = findElement(this.up, false);\n\n    if (this.parent && this.parent.name === 'option') {\n      throw new Error(\n        `An <option> element cannot contain other elements (encountered <${this.name}>)`\n      );\n    }\n\n    this.decorators = [];\n\n    // create attributes\n    this.attributeByName = {};\n\n    let attrs;\n    let n, attr, val, cls, name, template, leftovers;\n\n    const m = this.template.m;\n    const len = (m && m.length) || 0;\n\n    for (let i = 0; i < len; i++) {\n      template = m[i];\n      if (template.g) {\n        (this.statics || (this.statics = {}))[template.n] = isString(template.f)\n          ? template.f\n          : template.n;\n      } else {\n        switch (template.t) {\n          case ATTRIBUTE:\n          case BINDING_FLAG:\n          case DECORATOR:\n          case EVENT:\n          case TRANSITION:\n            attr = createItem({\n              owner: this,\n              up: this.up,\n              template\n            });\n\n            n = template.n;\n\n            attrs = attrs || (attrs = this.attributes = []);\n\n            if (n === 'value') val = attr;\n            else if (n === 'name') name = attr;\n            else if (n === 'class') cls = attr;\n            else attrs.push(attr);\n\n            break;\n\n          case DELEGATE_FLAG:\n            this.delegate = false;\n            break;\n\n          default:\n            (leftovers || (leftovers = [])).push(template);\n            break;\n        }\n      }\n    }\n\n    if (val) attrs.push(val);\n    if (name) attrs.push(name);\n    if (cls) attrs.unshift(cls);\n\n    if (leftovers) {\n      (attrs || (this.attributes = [])).push(\n        new ConditionalAttribute({\n          owner: this,\n          up: this.up,\n          template: leftovers\n        })\n      );\n\n      // empty leftovers array\n      leftovers = [];\n    }\n\n    // create children\n    if (options.template.f && !options.deferContent) {\n      this.fragment = new Fragment({\n        template: options.template.f,\n        owner: this,\n        cssIds: null\n      });\n    }\n\n    this.binding = null; // filled in later\n  }\n\n  bind() {\n    const attrs = this.attributes;\n    if (attrs) {\n      attrs.binding = true;\n      const len = attrs.length;\n      for (let i = 0; i < len; i++) attrs[i].bind();\n      attrs.binding = false;\n    }\n\n    if (this.fragment) this.fragment.bind();\n\n    // create two-way binding if necessary\n    if (!this.binding) this.recreateTwowayBinding();\n    else this.binding.bind();\n  }\n\n  createTwowayBinding() {\n    if ('twoway' in this ? this.twoway : this.ractive.twoway) {\n      const Binding = selectBinding(this);\n      if (Binding) {\n        const binding = new Binding(this);\n        if (binding && binding.model) return binding;\n      }\n    }\n  }\n\n  destroyed() {\n    if (this.attributes) this.attributes.forEach(destroyed);\n    if (this.fragment) this.fragment.destroyed();\n  }\n\n  detach() {\n    // if this element is no longer rendered, the transitions are complete and the attributes can be torn down\n    if (!this.rendered) this.destroyed();\n\n    return detachNode(this.node);\n  }\n\n  find(selector, options) {\n    if (this.node && matches(this.node, selector)) return this.node;\n    if (this.fragment) {\n      return this.fragment.find(selector, options);\n    }\n  }\n\n  findAll(selector, options) {\n    const { result } = options;\n\n    if (matches(this.node, selector)) {\n      result.push(this.node);\n    }\n\n    if (this.fragment) {\n      this.fragment.findAll(selector, options);\n    }\n  }\n\n  findNextNode() {\n    return null;\n  }\n\n  firstNode() {\n    return this.node;\n  }\n\n  getAttribute(name) {\n    if (this.statics && name in this.statics) return this.statics[name];\n    const attribute = this.attributeByName[name];\n    return attribute ? attribute.getValue() : undefined;\n  }\n\n  getContext(...assigns) {\n    if (this.fragment) return this.fragment.getContext(...assigns);\n\n    if (!this.ctx) this.ctx = new Context(this.up, this);\n    assigns.unshift(create(this.ctx));\n    return assign.apply(null, assigns);\n  }\n\n  off(event, callback, capture = false) {\n    const delegate = this.up.delegate;\n    const ref = this.listeners && this.listeners[event];\n\n    if (!ref) return;\n    removeFromArray(ref, callback);\n\n    if (delegate) {\n      const listeners =\n        (delegate.listeners || (delegate.listeners = [])) &&\n        (delegate.listeners[event] || (delegate.listeners[event] = []));\n      if (listeners.refs && !--listeners.refs) delegate.off(event, delegateHandler, true);\n    } else if (this.rendered) {\n      const n = this.node;\n      const add = n.addEventListener;\n      const rem = n.removeEventListener;\n\n      if (!ref.length) {\n        rem.call(n, event, handler, capture);\n      } else if (ref.length && !ref.refs && capture) {\n        rem.call(n, event, handler, true);\n        add.call(n, event, handler, false);\n      }\n    }\n  }\n\n  on(event, callback, capture = false) {\n    const delegate = this.up.delegate;\n    const ref = (this.listeners || (this.listeners = {}))[event] || (this.listeners[event] = []);\n\n    if (delegate) {\n      const listeners =\n        ((delegate.listeners || (delegate.listeners = [])) && delegate.listeners[event]) ||\n        (delegate.listeners[event] = []);\n      if (!listeners.refs) {\n        listeners.refs = 0;\n        delegate.on(event, delegateHandler, true);\n        listeners.refs++;\n      } else {\n        listeners.refs++;\n      }\n    } else if (this.rendered) {\n      const n = this.node;\n      const add = n.addEventListener;\n      const rem = n.removeEventListener;\n\n      if (!ref.length) {\n        add.call(n, event, handler, capture);\n      } else if (ref.length && !ref.refs && capture) {\n        rem.call(n, event, handler, false);\n        add.call(n, event, handler, true);\n      }\n    }\n\n    addToArray(this.listeners[event], callback);\n  }\n\n  recreateTwowayBinding() {\n    if (this.binding) {\n      this.binding.unbind();\n      this.binding.unrender();\n    }\n\n    if ((this.binding = this.createTwowayBinding())) {\n      this.binding.bind();\n      if (this.rendered) this.binding.render();\n    }\n  }\n\n  rebound(update) {\n    super.rebound(update);\n    if (this.attributes) this.attributes.forEach(x => x.rebound(update));\n    if (this.binding) this.binding.rebound(update);\n  }\n\n  render(target, occupants) {\n    // TODO determine correct namespace\n    this.namespace = getNamespace(this);\n\n    let node;\n    let existing = false;\n\n    if (occupants) {\n      let n;\n      while ((n = occupants.shift())) {\n        if (\n          n.nodeName.toUpperCase() === this.template.e.toUpperCase() &&\n          n.namespaceURI === this.namespace\n        ) {\n          this.node = node = n;\n          existing = true;\n          break;\n        } else {\n          detachNode(n);\n        }\n      }\n    }\n\n    if (!existing && this.node) {\n      node = this.node;\n      target.appendChild(node);\n      existing = true;\n    }\n\n    if (!node) {\n      const name = this.template.e;\n      node = createElement(\n        this.namespace === html ? name.toLowerCase() : name,\n        this.namespace,\n        this.getAttribute('is')\n      );\n      this.node = node;\n    }\n\n    // tie the node to this vdom element\n    defineProperty(node, '_ractive', {\n      value: {\n        proxy: this\n      },\n      configurable: true\n    });\n\n    if (this.statics) {\n      keys(this.statics).forEach(k => {\n        node.setAttribute(k, this.statics[k]);\n      });\n    }\n\n    if (existing && this.foundNode) this.foundNode(node);\n\n    // register intro before rendering content so children can find the intro\n    const intro = this.intro;\n    if (intro && intro.shouldFire('intro')) {\n      intro.isIntro = true;\n      intro.isOutro = false;\n      runloop.registerTransition(intro);\n    }\n\n    if (this.fragment) {\n      const children = existing ? toArray(node.childNodes) : undefined;\n\n      this.fragment.render(node, children);\n\n      // clean up leftover children\n      if (children) {\n        children.forEach(detachNode);\n      }\n    }\n\n    if (existing) {\n      // store initial values for two-way binding\n      if (this.binding && this.binding.wasUndefined) this.binding.setFromNode(node);\n      // remove unused attributes\n      let i = node.attributes.length;\n      while (i--) {\n        const name = node.attributes[i].name;\n        if (!(name in this.attributeByName) && (!this.statics || !(name in this.statics)))\n          node.removeAttribute(name);\n      }\n    }\n\n    // Is this a top-level node of a component? If so, we may need to add\n    // a data-ractive-css attribute, for CSS encapsulation\n    if (this.up.cssIds) {\n      node.setAttribute('data-ractive-css', this.up.cssIds.map(x => `{${x}}`).join(' '));\n    }\n\n    if (this.attributes) {\n      const len = this.attributes.length;\n      for (let i = 0; i < len; i++) this.attributes[i].render();\n    }\n    if (this.binding) this.binding.render();\n\n    if (!this.up.delegate && this.listeners) {\n      const ls = this.listeners;\n      for (const k in ls) {\n        if (ls[k] && ls[k].length) this.node.addEventListener(k, handler, !!ls[k].refs);\n      }\n    }\n\n    if (!existing) {\n      target.appendChild(node);\n    }\n\n    this.rendered = true;\n  }\n\n  shuffled() {\n    super.shuffled();\n    this.decorators.forEach(shuffled);\n  }\n\n  toString() {\n    const tagName = this.template.e;\n\n    let attrs = (this.attributes && this.attributes.map(stringifyAttribute).join('')) || '';\n\n    if (this.statics)\n      keys(this.statics).forEach(\n        k =>\n          k !== 'class' &&\n          k !== 'style' &&\n          (attrs = ` ${k}=\"${safeAttributeString(this.statics[k])}\"` + attrs)\n      );\n\n    // Special case - selected options\n    if (this.name === 'option' && this.isSelected()) {\n      attrs += ' selected';\n    }\n\n    // Special case - two-way radio name bindings\n    if (this.name === 'input' && inputIsCheckedRadio(this)) {\n      attrs += ' checked';\n    }\n\n    // Special case style and class attributes and directives\n    let style = this.statics ? this.statics.style : undefined;\n    let cls = this.statics ? this.statics.class : undefined;\n    this.attributes &&\n      this.attributes.forEach(attr => {\n        if (attr.name === 'class') {\n          cls = (cls || '') + (cls ? ' ' : '') + safeAttributeString(attr.getString());\n        } else if (attr.name === 'style') {\n          style = (style || '') + (style ? ' ' : '') + safeAttributeString(attr.getString());\n          if (style && !endsWithSemi.test(style)) style += ';';\n        } else if (attr.style) {\n          style =\n            (style || '') +\n            (style ? ' ' : '') +\n            `${attr.style}: ${safeAttributeString(attr.getString())};`;\n        } else if (attr.inlineClass && attr.getValue()) {\n          cls = (cls || '') + (cls ? ' ' : '') + attr.inlineClass;\n        }\n      });\n    // put classes first, then inline style\n    if (style !== undefined) attrs = ' style' + (style ? `=\"${style}\"` : '') + attrs;\n    if (cls !== undefined) attrs = ' class' + (cls ? `=\"${cls}\"` : '') + attrs;\n\n    if (this.up.cssIds) {\n      attrs += ` data-ractive-css=\"${this.up.cssIds.map(x => `{${x}}`).join(' ')}\"`;\n    }\n\n    let str = `<${tagName}${attrs}>`;\n\n    if (voidElements[this.name.toLowerCase()]) return str;\n\n    // Special case - textarea\n    if (this.name === 'textarea' && this.getAttribute('value') !== undefined) {\n      str += escapeHtml(this.getAttribute('value'));\n    } else if (this.getAttribute('contenteditable') !== undefined) {\n      // Special case - contenteditable\n      str += this.getAttribute('value') || '';\n    }\n\n    if (this.fragment) {\n      str += this.fragment.toString(!/^(?:script|style)$/i.test(this.template.e)); // escape text unless script/style\n    }\n\n    str += `</${tagName}>`;\n    return str;\n  }\n\n  unbind(view) {\n    const attrs = this.attributes;\n    if (attrs) {\n      attrs.unbinding = true;\n      const len = attrs.length;\n      for (let i = 0; i < len; i++) attrs[i].unbind(view);\n      attrs.unbinding = false;\n    }\n\n    if (this.binding) this.binding.unbind(view);\n    if (this.fragment) this.fragment.unbind(view);\n  }\n\n  unrender(shouldDestroy) {\n    if (!this.rendered) return;\n    this.rendered = false;\n\n    // unrendering before intro completed? complete it now\n    // TODO should be an API for aborting transitions\n    const transition = this.intro;\n    if (transition && transition.complete) transition.complete();\n\n    // Detach as soon as we can\n    if (this.name === 'option') {\n      // <option> elements detach immediately, so that\n      // their parent <select> element syncs correctly, and\n      // since option elements can't have transitions anyway\n      this.detach();\n    } else if (shouldDestroy) {\n      runloop.detachWhenReady(this);\n    }\n\n    // outro transition\n    const outro = this.outro;\n    if (outro && outro.shouldFire('outro')) {\n      outro.isIntro = false;\n      outro.isOutro = true;\n      runloop.registerTransition(outro);\n    }\n\n    if (this.fragment) this.fragment.unrender();\n\n    if (this.binding) this.binding.unrender();\n  }\n\n  update() {\n    if (this.dirty) {\n      this.dirty = false;\n\n      const attrs = this.attributes;\n      if (attrs) {\n        const len = attrs.length;\n        for (let i = 0; i < len; i++) attrs[i].update();\n      }\n\n      if (this.fragment) this.fragment.update();\n    }\n  }\n}\n\nfunction inputIsCheckedRadio(element) {\n  const nameAttr = element.attributeByName.name;\n  return (\n    element.getAttribute('type') === 'radio' &&\n    (nameAttr || {}).interpolator &&\n    element.getAttribute('value') === nameAttr.interpolator.model.get()\n  );\n}\n\nfunction stringifyAttribute(attribute) {\n  const str = attribute.toString();\n  return str ? ' ' + str : '';\n}\n\nfunction getNamespace(element) {\n  // Use specified namespace...\n  const xmlns = element.getAttribute('xmlns');\n  if (xmlns) return xmlns;\n\n  // ...or SVG namespace, if this is an <svg> element\n  if (element.name === 'svg') return svg;\n\n  const parent = element.parent;\n\n  if (parent) {\n    // ...or HTML, if the parent is a <foreignObject>\n    if (parent.name === 'foreignobject') return html;\n\n    // ...or inherit from the parent node\n    return parent.node.namespaceURI;\n  }\n\n  return element.ractive.el.namespaceURI;\n}\n\nlet stop = false;\nfunction stopPropagation() {\n  stop = true;\n}\nlet immediate = false;\nfunction stopImmediatePropagation() {\n  immediate = true;\n}\nlet prevent = false;\nfunction preventDefault() {\n  prevent = true;\n}\n\nfunction delegateHandler(ev) {\n  const name = ev.type;\n  const end = ev.currentTarget;\n  const endEl = end._ractive && end._ractive.proxy;\n  let node = ev.target;\n  let bubble = true;\n  let listeners;\n  let prevented = false;\n\n  stop = immediate = prevent = false;\n  const oldStop = ev.stopPropagation;\n  const oldImmediate = ev.stopImmediatePropagation;\n  const oldPrevent = ev.preventDefault;\n  ev.stopPropagation = stopPropagation;\n  ev.stopImmediatePropagation = stopImmediatePropagation;\n  ev.preventDefault = preventDefault;\n\n  // starting with the origin node, walk up the DOM looking for ractive nodes with a matching event listener\n  while (bubble && node && node !== end) {\n    const proxy = node._ractive && node._ractive.proxy;\n    if (proxy && proxy.up.delegate === endEl && shouldFire(ev, node, end)) {\n      listeners = proxy.listeners && proxy.listeners[name];\n\n      if (listeners) {\n        const len = listeners.length;\n        for (let i = 0; i < len; i++) {\n          bubble = listeners[i].call(node, ev) !== false && bubble;\n          if (immediate) {\n            bubble = false;\n            break;\n          }\n          if (stop) bubble = false;\n          if (prevent && !prevented) {\n            prevented = true;\n            oldPrevent.call(ev);\n          }\n        }\n      }\n    }\n\n    node = node.parentNode || node.correspondingUseElement; // SVG with a <use> element in certain environments\n  }\n\n  if (bubble) bubble = !stop && !immediate;\n\n  if (stop) oldStop.call(ev);\n  if (immediate) oldImmediate.call(ev);\n\n  ev.stopPropagation = oldStop;\n  ev.stopImmediaitePropagation = oldImmediate;\n  ev.preventDefault = oldPrevent;\n\n  return bubble;\n}\n\nconst UIEvent = win !== null ? win.UIEvent : null;\nfunction shouldFire(event, start, end) {\n  if (UIEvent && event instanceof UIEvent) {\n    let node = start;\n    while (node && node !== end) {\n      if (node.disabled) return false;\n      node = node.parentNode || node.correspondingUseElement;\n    }\n  }\n\n  return true;\n}\n\nfunction handler(ev) {\n  const el = this._ractive.proxy;\n  let listeners;\n  if (el.listeners && (listeners = el.listeners[ev.type])) {\n    const len = listeners.length;\n    for (let i = 0; i < len; i++) listeners[i] && listeners[i].call(this, ev);\n  }\n}\n","import runloop from 'src/global/runloop';\nimport Element from '../../Element';\n\nexport default class Form extends Element {\n  constructor(options) {\n    super(options);\n    this.formBindings = [];\n  }\n\n  render(target, occupants) {\n    super.render(target, occupants);\n    this.on('reset', handleReset);\n  }\n\n  unrender(shouldDestroy) {\n    this.off('reset', handleReset);\n    super.unrender(shouldDestroy);\n  }\n}\n\nfunction handleReset() {\n  const element = this._ractive.proxy;\n\n  runloop.start();\n  element.formBindings.forEach(updateModel);\n  runloop.end();\n}\n\nfunction updateModel(binding) {\n  binding.model.set(binding.resetValue);\n}\n","import { fatal } from 'utils/log';\nimport runloop from 'src/global/runloop';\nimport { localFragment } from 'src/shared/Context';\n\nclass DOMEvent {\n  constructor(name, owner) {\n    if (name.indexOf('*') !== -1) {\n      fatal(\n        `Only component proxy-events may contain \"*\" wildcards, <${\n          owner.name\n        } on-${name}=\"...\"/> is not valid`\n      );\n    }\n\n    this.name = name;\n    this.owner = owner;\n    this.handler = null;\n  }\n\n  bind() {}\n\n  render(directive) {\n    const name = this.name;\n\n    const register = () => {\n      const node = this.owner.node;\n\n      this.owner.on(\n        name,\n        (this.handler = event => {\n          return directive.fire({\n            node,\n            original: event,\n            event,\n            name\n          });\n        })\n      );\n    };\n\n    if (name !== 'load') {\n      // schedule events so that they take place after twoway binding\n      runloop.scheduleTask(register, true);\n    } else {\n      // unless its a load event\n      register();\n    }\n  }\n\n  unbind() {}\n\n  unrender() {\n    if (this.handler) this.owner.off(this.name, this.handler);\n  }\n}\n\nclass CustomEvent {\n  constructor(eventPlugin, owner, name, args) {\n    this.eventPlugin = eventPlugin;\n    this.owner = owner;\n    this.name = name;\n    this.handler = null;\n    this.args = args;\n  }\n\n  bind() {}\n\n  render(directive) {\n    runloop.scheduleTask(() => {\n      const node = this.owner.node;\n\n      localFragment.f = directive.up;\n      this.handler = this.eventPlugin.apply(\n        this.owner.ractive,\n        [\n          node,\n          (event = {}) => {\n            if (event.original) event.event = event.original;\n            else event.original = event.event;\n\n            event.name = this.name;\n            event.node = event.node || node;\n            return directive.fire(event);\n          }\n        ].concat(this.args || [])\n      );\n      localFragment.f = null;\n    });\n  }\n\n  unbind() {}\n\n  unrender() {\n    if (this.handler) this.handler.teardown();\n    else runloop.scheduleTask(() => this.handler && this.handler.teardown());\n  }\n}\n\nexport { DOMEvent, CustomEvent };\n","import Context from '../../../shared/Context';\n\nexport default class RactiveEvent {\n  constructor(component, name) {\n    this.component = component;\n    this.name = name;\n    this.handler = null;\n  }\n\n  bind(directive) {\n    const ractive = this.component.instance;\n\n    this.handler = ractive.on(this.name, (...args) => {\n      // watch for reproxy\n      if (args[0] instanceof Context) {\n        const ctx = args.shift();\n        ctx.component = ractive;\n        directive.fire(ctx, args);\n      } else {\n        directive.fire({}, args);\n      }\n\n      // cancel bubbling\n      return false;\n    });\n  }\n\n  render() {}\n\n  unbind() {\n    this.handler.cancel();\n  }\n\n  unrender() {}\n}\n","import { ANCHOR, COMPONENT } from 'config/types';\nimport { warnIfDebug, warnOnceIfDebug } from 'utils/log';\nimport { addToArray, removeFromArray } from 'utils/array';\nimport noop from 'utils/noop';\nimport fireEvent from 'src/events/fireEvent';\nimport { splitKeypath } from 'shared/keypaths';\nimport { findInViewHierarchy } from 'shared/registry';\nimport findElement from './findElement';\nimport { DOMEvent, CustomEvent } from '../element/ElementEvents';\nimport RactiveEvent from '../component/RactiveEvent';\nimport { resolveArgs, setupArgsFn } from '../shared/directiveArgs';\nimport Context from 'src/shared/Context';\nimport { isArray, isString } from 'utils/is';\nimport getFunction from 'shared/getFunction';\nimport resolveReference from '../../resolvers/resolveReference';\n\nconst specialPattern = /^(event|arguments|@node|@event|@context)(\\..+)?$/;\nconst dollarArgsPattern = /^\\$(\\d+)(\\..+)?$/;\n\nexport default class EventDirective {\n  constructor(options) {\n    this.owner = options.owner || options.up.owner || findElement(options.up);\n    this.element = this.owner.attributeByName ? this.owner : findElement(options.up, true);\n    this.template = options.template;\n    this.up = options.up;\n    this.ractive = options.up.ractive;\n    this.events = [];\n  }\n\n  bind() {\n    // sometimes anchors will cause an unbind without unrender\n    if (this.events.length) {\n      this.events.forEach(e => e.unrender());\n      this.events = [];\n    }\n\n    if (this.element.type === COMPONENT || this.element.type === ANCHOR) {\n      this.template.n.forEach(n => {\n        this.events.push(new RactiveEvent(this.element, n));\n      });\n    } else {\n      let args;\n      if ((args = this.template.a)) {\n        const rs = args.r.map(r => {\n          const model = resolveReference(this.up, r);\n          return model ? model.get() : undefined;\n        });\n        try {\n          args = getFunction(args.s, rs.length).apply(null, rs);\n        } catch (err) {\n          args = null;\n          warnIfDebug(\n            `Failed to compute args for event on-${this.template.n.join('- ')}: ${err.message ||\n              err}`\n          );\n        }\n      }\n\n      this.template.n.forEach(n => {\n        const fn = findInViewHierarchy('events', this.ractive, n);\n        if (fn) {\n          this.events.push(new CustomEvent(fn, this.element, n, args));\n        } else {\n          this.events.push(new DOMEvent(n, this.element));\n        }\n      });\n    }\n\n    // method calls\n    this.models = null;\n\n    addToArray(this.element.events || (this.element.events = []), this);\n\n    setupArgsFn(this, this.template);\n    if (!this.fn) this.action = this.template.f;\n\n    this.events.forEach(e => e.bind(this));\n  }\n\n  destroyed() {\n    this.events.forEach(e => e.unrender());\n  }\n\n  fire(event, args = []) {\n    const context =\n      event instanceof Context && event.refire ? event : this.element.getContext(event);\n\n    if (this.fn) {\n      const values = [];\n\n      const models = resolveArgs(this, this.template, this.up, {\n        specialRef(ref) {\n          const specialMatch = specialPattern.exec(ref);\n          if (specialMatch) {\n            // on-click=\"foo(event.node)\"\n            return {\n              special: specialMatch[1],\n              keys: specialMatch[2] ? splitKeypath(specialMatch[2].substr(1)) : []\n            };\n          }\n\n          const dollarMatch = dollarArgsPattern.exec(ref);\n          if (dollarMatch) {\n            // on-click=\"foo($1)\"\n            return {\n              special: 'arguments',\n              keys: [dollarMatch[1] - 1].concat(\n                dollarMatch[2] ? splitKeypath(dollarMatch[2].substr(1)) : []\n              )\n            };\n          }\n        }\n      });\n\n      if (models) {\n        models.forEach(model => {\n          if (!model) return values.push(undefined);\n\n          if (model.special) {\n            const which = model.special;\n            let obj;\n\n            if (which === '@node') {\n              obj = this.element.node;\n            } else if (which === '@event') {\n              obj = event && event.event;\n            } else if (which === 'event') {\n              warnOnceIfDebug(\n                `The event reference available to event directives is deprecated and should be replaced with @context and @event`\n              );\n              obj = context;\n            } else if (which === '@context') {\n              obj = context;\n            } else {\n              obj = args;\n            }\n\n            const keys = model.keys.slice();\n\n            while (obj && keys.length) obj = obj[keys.shift()];\n            return values.push(obj);\n          }\n\n          if (model.wrapper) {\n            return values.push(model.wrapperValue);\n          }\n\n          values.push(model.get());\n        });\n      }\n\n      // make event available as `this.event`\n      const ractive = this.ractive;\n      const oldEvent = ractive.event;\n\n      ractive.event = context;\n      const returned = this.fn.apply(ractive, values);\n      let result = returned.pop();\n\n      // Auto prevent and stop if return is explicitly false\n      if (result === false) {\n        const original = event ? event.original : undefined;\n        if (original) {\n          original.preventDefault && original.preventDefault();\n          original.stopPropagation && original.stopPropagation();\n        } else {\n          warnOnceIfDebug(\n            `handler '${this.template.n.join(\n              ' '\n            )}' returned false, but there is no event available to cancel`\n          );\n        }\n      } else if (!returned.length && isArray(result) && isString(result[0])) {\n        // watch for proxy events\n        result = fireEvent(this.ractive, result.shift(), context, result);\n      }\n\n      ractive.event = oldEvent;\n\n      return result;\n    } else {\n      return fireEvent(this.ractive, this.action, context, args);\n    }\n  }\n\n  handleChange() {}\n\n  render() {\n    this.events.forEach(e => e.render(this));\n  }\n\n  toString() {\n    return '';\n  }\n\n  unbind(view) {\n    removeFromArray(this.element.events, this);\n    this.events.forEach(e => e.unbind(view));\n  }\n\n  unrender() {\n    this.events.forEach(e => e.unrender());\n  }\n}\n\nconst proto = EventDirective.prototype;\nproto.firstNode = proto.rebound = proto.update = noop;\n","import { fireShuffleTasks } from 'src/model/ModelBase';\nimport { REFERENCE } from 'config/types';\nimport { rebindMatch } from 'shared/rebind';\nimport { isArray, isString } from 'utils/is';\nimport { escapeKey } from 'shared/keypaths';\nimport ExpressionProxy from './ExpressionProxy';\nimport resolveReference from './resolveReference';\nimport resolve from './resolve';\n\nimport LinkModel, { Missing } from 'src/model/LinkModel';\n\nexport default class ReferenceExpressionProxy extends LinkModel {\n  constructor(fragment, template) {\n    super(null, null, null, '@undefined');\n    this.root = fragment.ractive.viewmodel;\n    this.template = template;\n    this.rootLink = true;\n    this.template = template;\n    this.fragment = fragment;\n\n    this.rebound();\n  }\n\n  getKeypath() {\n    return this.model ? this.model.getKeypath() : '@undefined';\n  }\n\n  rebound() {\n    const fragment = this.fragment;\n    const template = this.template;\n\n    let base = (this.base = resolve(fragment, template));\n    let idx;\n\n    if (this.proxy) {\n      teardown(this);\n    }\n\n    const proxy = (this.proxy = {\n      rebind: (next, previous) => {\n        if (previous === base) {\n          next = rebindMatch(template, next, previous);\n          if (next !== base) {\n            this.base = base = next;\n          }\n        } else if (~(idx = members.indexOf(previous))) {\n          next = rebindMatch(template.m[idx].n, next, previous);\n          if (next !== members[idx]) {\n            members.splice(idx, 1, next || Missing);\n          }\n        }\n\n        if (next !== previous) {\n          previous.unregister(proxy);\n          if (next) next.addShuffleTask(() => next.register(proxy));\n        }\n      },\n      handleChange: () => {\n        pathChanged();\n      }\n    });\n\n    base.register(proxy);\n\n    const members = (this.members = template.m.map(tpl => {\n      if (isString(tpl)) {\n        return { get: () => tpl };\n      }\n\n      let model;\n\n      if (tpl.t === REFERENCE) {\n        model = resolveReference(fragment, tpl.n);\n        model.register(proxy);\n\n        return model;\n      }\n\n      model = new ExpressionProxy(fragment, tpl);\n      model.register(proxy);\n      return model;\n    }));\n\n    const pathChanged = () => {\n      const model =\n        base &&\n        base.joinAll(\n          members.reduce((list, m) => {\n            const k = m.get();\n            if (isArray(k)) return list.concat(k);\n            else list.push(escapeKey(String(k)));\n            return list;\n          }, [])\n        );\n\n      if (model !== this.model) {\n        this.model = model;\n        this.relinking(model);\n        fireShuffleTasks();\n        refreshPathDeps(this);\n        this.fragment.shuffled();\n      }\n    };\n\n    pathChanged();\n  }\n\n  teardown() {\n    teardown(this);\n    super.teardown();\n  }\n\n  unreference() {\n    super.unreference();\n    if (!this.deps.length && !this.refs) this.teardown();\n  }\n\n  unregister(dep) {\n    super.unregister(dep);\n    if (!this.deps.length && !this.refs) this.teardown();\n  }\n}\n\nfunction teardown(proxy) {\n  if (proxy.base) proxy.base.unregister(proxy.proxy);\n  if (proxy.models) {\n    proxy.models.forEach(m => {\n      if (m.unregister) m.unregister(proxy);\n    });\n  }\n}\n\nfunction refreshPathDeps(proxy) {\n  let len = proxy.deps.length;\n  let i, v;\n\n  for (i = 0; i < len; i++) {\n    v = proxy.deps[i];\n    if (v.pathChanged) v.pathChanged();\n    if (v.fragment && v.fragment.pathModel) v.fragment.pathModel.applyValue(proxy.getKeypath());\n  }\n\n  len = proxy.children.length;\n  for (i = 0; i < len; i++) {\n    refreshPathDeps(proxy.children[i]);\n  }\n}\n\nconst eproto = ExpressionProxy.prototype;\nconst proto = ReferenceExpressionProxy.prototype;\n\nproto.unreference = eproto.unreference;\nproto.unregister = eproto.unregister;\nproto.unregisterLink = eproto.unregisterLink;\n","import { rebindMatch } from 'shared/rebind';\nimport Item, { ContainerItem } from './Item';\nimport resolve from '../../resolvers/resolve';\nimport { assign } from 'utils/object';\n\nexport default class Mustache extends Item {\n  constructor(options) {\n    super(options);\n\n    if (options.owner) this.parent = options.owner;\n\n    this.isStatic = !!options.template.s;\n\n    this.model = null;\n    this.dirty = false;\n  }\n\n  bind(pre) {\n    // yield mustaches and inner contexts should resolve in container context\n    const start = this.template.y\n      ? this.template.y.containerFragment\n      : this.containerFragment || this.up;\n    // try to find a model for this view\n    const model = pre || resolve(start, this.template);\n\n    if (model) {\n      const value = model.get();\n\n      if (this.isStatic) {\n        this.model = { get: () => value };\n        model.unreference();\n        return;\n      }\n\n      model.register(this);\n      this.model = model;\n    }\n  }\n\n  handleChange() {\n    this.bubble();\n  }\n\n  rebind(next, previous, safe) {\n    if (this.isStatic) return;\n\n    next = rebindMatch(this.template, next, previous, this.up);\n    if (next === this.model) return false;\n\n    if (this.model) {\n      this.model.unregister(this);\n    }\n    if (next) next.addShuffleRegister(this, 'mark');\n    this.model = next;\n    if (!safe) this.handleChange();\n    return true;\n  }\n\n  rebound(update) {\n    if (this.model) {\n      if (this.model.rebound) this.model.rebound(update);\n      else {\n        // check to see if the model actually changed...\n        // yield mustaches and inner contexts should resolve in container context\n        const start = this.template.y\n          ? this.template.y.containerFragment\n          : this.containerFragment || this.up;\n        // try to find a model for this view\n        const model = resolve(start, this.template);\n        if (model !== this.model) {\n          this.model.unregister(this);\n          this.bind(model);\n        }\n      }\n\n      if (update) this.bubble();\n    }\n    if (this.fragment) this.fragment.rebound(update);\n  }\n\n  unbind() {\n    if (!this.isStatic) {\n      this.model && this.model.unregister(this);\n      this.model = undefined;\n    }\n  }\n}\n\nexport function MustacheContainer(options) {\n  Mustache.call(this, options);\n}\n\nconst proto = (MustacheContainer.prototype = Object.create(ContainerItem.prototype));\n\nassign(proto, Mustache.prototype, { constructor: MustacheContainer });\n","import progressiveText from './shared/progressiveText';\nimport { escapeHtml } from 'utils/html';\nimport { safeToStringValue } from 'utils/dom';\nimport { detachNode } from 'utils/dom';\nimport Mustache from './shared/Mustache';\nimport { inAttributes } from './element/ConditionalAttribute';\n\nexport default class Interpolator extends Mustache {\n  bubble() {\n    if (this.owner) this.owner.bubble();\n    super.bubble();\n  }\n\n  detach() {\n    return detachNode(this.node);\n  }\n\n  firstNode() {\n    return this.node;\n  }\n\n  getString() {\n    return this.model ? safeToStringValue(this.model.get()) : '';\n  }\n\n  render(target, occupants) {\n    if (inAttributes()) return;\n    const value = (this.value = this.getString());\n\n    this.rendered = true;\n\n    progressiveText(this, target, occupants, value);\n  }\n\n  toString(escape) {\n    const string = this.getString();\n    return escape ? escapeHtml(string) : string;\n  }\n\n  unrender(shouldDestroy) {\n    if (shouldDestroy) this.detach();\n    this.rendered = false;\n  }\n\n  update() {\n    if (this.dirty) {\n      this.dirty = false;\n      if (this.rendered) {\n        const value = this.getString();\n        if (value !== this.value) this.node.data = this.value = value;\n      }\n    }\n  }\n\n  valueOf() {\n    return this.model ? this.model.get() : undefined;\n  }\n}\n","import Element from '../../Element';\nimport { isFunction } from 'utils/is';\n\nexport default class Input extends Element {\n  render(target, occupants) {\n    super.render(target, occupants);\n    this.node.defaultValue = this.node.value;\n  }\n  compare(value, attrValue) {\n    const comparator = this.getAttribute('value-comparator');\n    if (comparator) {\n      if (isFunction(comparator)) {\n        return comparator(value, attrValue);\n      }\n      if (value && attrValue) {\n        return value[comparator] == attrValue[comparator];\n      }\n    }\n    return value == attrValue;\n  }\n}\n","import Parser from 'parse/Parser';\nimport readStringLiteral from 'parse/converters/expressions/primary/literal/readStringLiteral';\nimport readKey from 'parse/converters/expressions/shared/readKey';\nimport { hasOwn, keys } from 'utils/object';\n\n// simple JSON parser, without the restrictions of JSON parse\n// (i.e. having to double-quote keys).\n//\n// If passed a hash of values as the second argument, ${placeholders}\n// will be replaced with those values\n\nconst specials = {\n  true: true,\n  false: false,\n  null: null,\n  undefined\n};\n\nconst specialsPattern = new RegExp('^(?:' + keys(specials).join('|') + ')');\nconst numberPattern = /^(?:[+-]?)(?:(?:(?:0|[1-9]\\d*)?\\.\\d+)|(?:(?:0|[1-9]\\d*)\\.)|(?:0|[1-9]\\d*))(?:[eE][+-]?\\d+)?/;\nconst placeholderPattern = /\\$\\{([^\\}]+)\\}/g;\nconst placeholderAtStartPattern = /^\\$\\{([^\\}]+)\\}/;\nconst onlyWhitespace = /^\\s*$/;\n\nconst JsonParser = Parser.extend({\n  init(str, options) {\n    this.values = options.values;\n    this.sp();\n  },\n\n  postProcess(result) {\n    if (result.length !== 1 || !onlyWhitespace.test(this.leftover)) {\n      return null;\n    }\n\n    return { value: result[0].v };\n  },\n\n  converters: [\n    function getPlaceholder(parser) {\n      if (!parser.values) return null;\n\n      const placeholder = parser.matchPattern(placeholderAtStartPattern);\n\n      if (placeholder && hasOwn(parser.values, placeholder)) {\n        return { v: parser.values[placeholder] };\n      }\n    },\n\n    function getSpecial(parser) {\n      const special = parser.matchPattern(specialsPattern);\n      if (special) return { v: specials[special] };\n    },\n\n    function getNumber(parser) {\n      const number = parser.matchPattern(numberPattern);\n      if (number) return { v: +number };\n    },\n\n    function getString(parser) {\n      const stringLiteral = readStringLiteral(parser);\n      const values = parser.values;\n\n      if (stringLiteral && values) {\n        return {\n          v: stringLiteral.v.replace(placeholderPattern, (match, $1) =>\n            $1 in values ? values[$1] : $1\n          )\n        };\n      }\n\n      return stringLiteral;\n    },\n\n    function getObject(parser) {\n      if (!parser.matchString('{')) return null;\n\n      const result = {};\n\n      parser.sp();\n\n      if (parser.matchString('}')) {\n        return { v: result };\n      }\n\n      let pair;\n      while ((pair = getKeyValuePair(parser))) {\n        result[pair.key] = pair.value;\n\n        parser.sp();\n\n        if (parser.matchString('}')) {\n          return { v: result };\n        }\n\n        if (!parser.matchString(',')) {\n          return null;\n        }\n      }\n\n      return null;\n    },\n\n    function getArray(parser) {\n      if (!parser.matchString('[')) return null;\n\n      const result = [];\n\n      parser.sp();\n\n      if (parser.matchString(']')) {\n        return { v: result };\n      }\n\n      let valueToken;\n      while ((valueToken = parser.read())) {\n        result.push(valueToken.v);\n\n        parser.sp();\n\n        if (parser.matchString(']')) {\n          return { v: result };\n        }\n\n        if (!parser.matchString(',')) {\n          return null;\n        }\n\n        parser.sp();\n      }\n\n      return null;\n    }\n  ]\n});\n\nfunction getKeyValuePair(parser) {\n  parser.sp();\n\n  const key = readKey(parser);\n\n  if (!key) return null;\n\n  const pair = { key };\n\n  parser.sp();\n  if (!parser.matchString(':')) {\n    return null;\n  }\n  parser.sp();\n\n  const valueToken = parser.read();\n\n  if (!valueToken) return null;\n\n  pair.value = valueToken.v;\n  return pair;\n}\n\nexport default function(str, values) {\n  const parser = new JsonParser(str, { values });\n  return parser.result;\n}\n","import resolveReference from 'src/view/resolvers/resolveReference';\nimport Model from 'src/model/Model';\nimport { isNumeric, isObject, isNumber, isObjectType, isString } from 'utils/is';\nimport runloop from 'src/global/runloop';\nimport findElement from 'src/view/items/shared/findElement';\nimport { set as sharedSet } from './set';\nimport makeArrayMethod from '../Ractive/prototype/shared/makeArrayMethod';\nimport { animate as protoAnimate } from '../Ractive/prototype/animate';\nimport { update as protoUpdate } from '../Ractive/prototype/update';\nimport getRactiveContext, { extern, findParentWithContext } from './getRactiveContext';\nimport { hasOwn } from 'utils/object';\nimport { ELEMENT } from 'config/types';\n\nconst modelPush = makeArrayMethod('push').model;\nconst modelPop = makeArrayMethod('pop').model;\nconst modelShift = makeArrayMethod('shift').model;\nconst modelUnshift = makeArrayMethod('unshift').model;\nconst modelSort = makeArrayMethod('sort').model;\nconst modelSplice = makeArrayMethod('splice').model;\nconst modelReverse = makeArrayMethod('reverse').model;\n\nexport const localFragment = {};\n\nclass ContextData extends Model {\n  constructor(options) {\n    super(null, null);\n\n    this.isRoot = true;\n    this.root = this;\n    this.value = {};\n    this.ractive = options.ractive;\n    this.adaptors = [];\n    this.context = options.context;\n  }\n\n  getKeypath() {\n    return '@context.data';\n  }\n\n  rebound() {}\n}\n\nexport default class Context {\n  constructor(fragment, element) {\n    this.fragment = fragment;\n    this.element = element || findElement(fragment);\n    this.node = this.element && this.element.node;\n    this.ractive = fragment.ractive;\n    this.root = this;\n  }\n\n  get decorators() {\n    const items = {};\n    if (!this.element) return items;\n    this.element.decorators.forEach(d => (items[d.name] = d.handle));\n    return items;\n  }\n\n  get _data() {\n    return (\n      this.model ||\n      (this.root.model = new ContextData({\n        ractive: this.ractive,\n        context: this.root\n      }))\n    );\n  }\n\n  // the usual mutation suspects\n  add(keypath, d, options) {\n    const num = isNumber(d) ? +d : 1;\n    const opts = isObjectType(d) ? d : options;\n    return sharedSet(\n      build(this, keypath, num).map(pair => {\n        const [model, val] = pair;\n        const value = model.get();\n        if (!isNumeric(val) || !isNumeric(value)) throw new Error('Cannot add non-numeric value');\n        return [model, value + val];\n      }),\n      opts\n    );\n  }\n\n  animate(keypath, value, options) {\n    const model = findModel(this, keypath).model;\n    return protoAnimate(this.ractive, model, value, options);\n  }\n\n  find(selector, opts) {\n    return this.fragment.find(selector, opts);\n  }\n\n  findAll(selector, opts) {\n    const result = [];\n    opts = opts || {};\n    opts.result = result;\n    this.fragment.findAll(selector, opts);\n    return result;\n  }\n\n  findAllComponents(selector, opts) {\n    const result = [];\n    opts = opts || {};\n    opts.result = result;\n    this.fragment.findAllComponents(selector, opts);\n    return result;\n  }\n\n  findComponent(selector, opts) {\n    return this.fragment.findComponent(selector, opts);\n  }\n\n  // get relative keypaths and values\n  get(keypath) {\n    if (!keypath) return this.fragment.findContext().get(true);\n\n    const { model } = findModel(this, keypath);\n\n    return model ? model.get(true) : undefined;\n  }\n\n  getParent(component) {\n    let fragment = this.fragment;\n\n    if (!fragment.parent && component) fragment = fragment.componentParent;\n    else {\n      if (fragment.context) fragment = findParentWithContext(fragment.parent);\n      else {\n        fragment = findParentWithContext(fragment.parent);\n        if (fragment) {\n          if (!fragment.parent && component) fragment = fragment.componentParent;\n          else fragment = findParentWithContext(fragment.parent);\n        }\n      }\n    }\n\n    if (!fragment || fragment === this.fragment) return;\n    else return fragment.getContext();\n  }\n\n  hasListener(name, bubble) {\n    // if the owner is a component, start there because the nearest element\n    // may exist outside of the immediate context (yield)\n    let el = this.fragment.owner.component\n      ? this.fragment.owner\n      : this.element || this.fragment.owner;\n    let base;\n\n    do {\n      base = el.component || el;\n      if (base.template.t === ELEMENT) {\n        if (findEvent(base, name)) return true;\n      }\n      el = el.up && el.up.owner;\n      if (el && el.component) el = el.component;\n    } while (el && bubble);\n  }\n\n  link(source, dest) {\n    const there = findModel(this, source).model;\n    const here = findModel(this, dest).model;\n    const promise = runloop.start();\n    here.link(there, source);\n    runloop.end();\n    return promise;\n  }\n\n  listen(event, handler) {\n    const el = this.element;\n    el.on(event, handler);\n    return {\n      cancel() {\n        el.off(event, handler);\n      }\n    };\n  }\n\n  observe(keypath, callback, options = {}) {\n    if (isObject(keypath)) options = callback || {};\n    options.fragment = this.fragment;\n    return this.ractive.observe(keypath, callback, options);\n  }\n\n  observeOnce(keypath, callback, options = {}) {\n    if (isObject(keypath)) options = callback || {};\n    options.fragment = this.fragment;\n    return this.ractive.observeOnce(keypath, callback, options);\n  }\n\n  pop(keypath) {\n    return modelPop(findModel(this, keypath).model, []);\n  }\n\n  push(keypath, ...values) {\n    return modelPush(findModel(this, keypath).model, values);\n  }\n\n  raise(name, event, ...args) {\n    let el = this.element;\n    let ev;\n\n    while (el) {\n      if (el.component) el = el.component;\n      ev = findEvent(el, name);\n      if (ev) {\n        return ev.fire(\n          ev.element.getContext(\n            event || {},\n            event && !('original' in event) ? { original: {} } : {}\n          ),\n          args\n        );\n      }\n\n      el = el.up && el.up.owner;\n    }\n  }\n\n  readLink(keypath, options) {\n    return this.ractive.readLink(this.resolve(keypath), options);\n  }\n\n  resolve(path, ractive) {\n    const { model, instance } = findModel(this, path);\n    return model ? model.getKeypath(ractive || instance) : path;\n  }\n\n  reverse(keypath) {\n    return modelReverse(findModel(this, keypath).model, []);\n  }\n\n  set(keypath, value, options) {\n    return sharedSet(build(this, keypath, value), options);\n  }\n\n  shift(keypath) {\n    return modelShift(findModel(this, keypath).model, []);\n  }\n\n  splice(keypath, index, drop, ...add) {\n    add.unshift(index, drop);\n    return modelSplice(findModel(this, keypath).model, add);\n  }\n\n  sort(keypath) {\n    return modelSort(findModel(this, keypath).model, []);\n  }\n\n  subtract(keypath, d, options) {\n    const num = isNumber(d) ? d : 1;\n    const opts = isObjectType(d) ? d : options;\n    return sharedSet(\n      build(this, keypath, num).map(pair => {\n        const [model, val] = pair;\n        const value = model.get();\n        if (!isNumeric(val) || !isNumeric(value)) throw new Error('Cannot add non-numeric value');\n        return [model, value - val];\n      }),\n      opts\n    );\n  }\n\n  toggle(keypath, options) {\n    const { model } = findModel(this, keypath);\n    return sharedSet([[model, !model.get()]], options);\n  }\n\n  unlink(dest) {\n    const here = findModel(this, dest).model;\n    const promise = runloop.start();\n    if (here.owner && here.owner._link) here.owner.unlink();\n    runloop.end();\n    return promise;\n  }\n\n  unlisten(event, handler) {\n    this.element.off(event, handler);\n  }\n\n  unshift(keypath, ...add) {\n    return modelUnshift(findModel(this, keypath).model, add);\n  }\n\n  update(keypath, options) {\n    return protoUpdate(this.ractive, findModel(this, keypath).model, options);\n  }\n\n  updateModel(keypath, cascade) {\n    const { model } = findModel(this, keypath);\n    const promise = runloop.start();\n    model.updateFromBindings(cascade);\n    runloop.end();\n    return promise;\n  }\n\n  // two-way binding related helpers\n  isBound() {\n    const { model } = this.getBindingModel(this);\n    return !!model;\n  }\n\n  getBindingPath(ractive) {\n    const { model, instance } = this.getBindingModel(this);\n    if (model) return model.getKeypath(ractive || instance);\n  }\n\n  getBinding() {\n    const { model } = this.getBindingModel(this);\n    if (model) return model.get(true);\n  }\n\n  getBindingModel(ctx) {\n    const el = ctx.element;\n    return { model: el.binding && el.binding.model, instance: el.up.ractive };\n  }\n\n  setBinding(value) {\n    const { model } = this.getBindingModel(this);\n    return sharedSet([[model, value]]);\n  }\n}\n\nContext.forRactive = getRactiveContext;\n// circular deps are fun\nextern.Context = Context;\n\n// TODO: at some point perhaps this could support relative * keypaths?\nfunction build(ctx, keypath, value) {\n  const sets = [];\n\n  // set multiple keypaths in one go\n  if (isObject(keypath)) {\n    for (const k in keypath) {\n      if (hasOwn(keypath, k)) {\n        sets.push([findModel(ctx, k).model, keypath[k]]);\n      }\n    }\n  } else {\n    // set a single keypath\n    sets.push([findModel(ctx, keypath).model, value]);\n  }\n\n  return sets;\n}\n\nfunction findModel(ctx, path) {\n  const frag = ctx.fragment;\n\n  if (!isString(path)) {\n    return { model: frag.findContext(), instance: path };\n  }\n\n  return { model: resolveReference(frag, path), instance: frag.ractive };\n}\n\nfunction findEvent(el, name) {\n  return el.events && el.events.find && el.events.find(e => ~e.template.n.indexOf(name));\n}\n","import { doc } from 'config/environment';\nimport getRactiveContext from 'shared/getRactiveContext';\nimport { isString } from 'utils/is';\n\nconst query = doc && doc.querySelector;\n\nexport default function getContext(node) {\n  if (isString(node) && query) {\n    node = query.call(document, node);\n  }\n\n  let instances;\n  if (node) {\n    if (node._ractive) {\n      return node._ractive.proxy.getContext();\n    } else if ((instances = node.__ractive_instances__)) {\n      if (instances.length === 1) return getRactiveContext(instances[0]);\n    } else return getContext(node.parentNode);\n  }\n}\n","import { isClient, svg, vendors, win, doc } from 'config/environment';\nimport { html } from 'config/namespaces';\nimport { isString, isNumber } from 'utils/is';\n\nlet createElement, matches, div, methodNames, unprefixed, prefixed, i, j, makeFunction;\n\nconst customStr = isClient && 'registerElement' in doc;\nfunction wrap(is) {\n  return customStr ? is : { is };\n}\n\n// Test for SVG support\nif (!svg) {\n  /* istanbul ignore next */\n  createElement = (type, ns, is) => {\n    if (ns && ns !== html) {\n      throw \"This browser does not support namespaces other than http://www.w3.org/1999/xhtml. The most likely cause of this error is that you're trying to render SVG in an older browser. See http://ractive.js.org/support/#svgs for more information\";\n    }\n\n    return is ? doc.createElement(type, wrap(is)) : doc.createElement(type);\n  };\n} else {\n  createElement = (type, ns, is) => {\n    if (!ns || ns === html) {\n      return is ? doc.createElement(type, wrap(is)) : doc.createElement(type);\n    }\n\n    return is ? doc.createElementNS(ns, type, wrap(is)) : doc.createElementNS(ns, type);\n  };\n}\n\nexport function createDocumentFragment() {\n  return doc.createDocumentFragment();\n}\n\nfunction getElement(input) {\n  let output;\n\n  if (!input || typeof input === 'boolean') {\n    return;\n  }\n\n  /* istanbul ignore next */\n  if (!win || !doc || !input) {\n    return null;\n  }\n\n  // We already have a DOM node - no work to do. (Duck typing alert!)\n  if (input.nodeType) {\n    return input;\n  }\n\n  // Get node from string\n  if (isString(input)) {\n    // try ID first\n    output = doc.getElementById(input);\n\n    // then as selector, if possible\n    if (!output && doc.querySelector) {\n      try {\n        output = doc.querySelector(input);\n      } catch (e) {\n        /* this space intentionally left blank */\n      }\n    }\n\n    // did it work?\n    if (output && output.nodeType) {\n      return output;\n    }\n  }\n\n  // If we've been given a collection (jQuery, Zepto etc), extract the first item\n  if (input[0] && input[0].nodeType) {\n    return input[0];\n  }\n\n  return null;\n}\n\nif (!isClient) {\n  matches = null;\n} else {\n  div = createElement('div');\n  methodNames = ['matches', 'matchesSelector'];\n\n  makeFunction = function(methodName) {\n    return function(node, selector) {\n      return node[methodName](selector);\n    };\n  };\n\n  i = methodNames.length;\n\n  while (i-- && !matches) {\n    unprefixed = methodNames[i];\n\n    if (div[unprefixed]) {\n      matches = makeFunction(unprefixed);\n    } else {\n      j = vendors.length;\n      while (j--) {\n        prefixed = vendors[i] + unprefixed.substr(0, 1).toUpperCase() + unprefixed.substring(1);\n\n        if (div[prefixed]) {\n          matches = makeFunction(prefixed);\n          break;\n        }\n      }\n    }\n  }\n\n  // IE8... and apparently phantom some?\n  /* istanbul ignore next */\n  if (!matches) {\n    matches = function(node, selector) {\n      let parentNode, i;\n\n      parentNode = node.parentNode;\n\n      if (!parentNode) {\n        // empty dummy <div>\n        div.innerHTML = '';\n\n        parentNode = div;\n        node = node.cloneNode();\n\n        div.appendChild(node);\n      }\n\n      const nodes = parentNode.querySelectorAll(selector);\n\n      i = nodes.length;\n      while (i--) {\n        if (nodes[i] === node) {\n          return true;\n        }\n      }\n\n      return false;\n    };\n  }\n}\n\nfunction detachNode(node) {\n  // stupid ie\n  // eslint-disable-next-line valid-typeof\n  if (node && typeof node.parentNode !== 'unknown' && node.parentNode) {\n    node.parentNode.removeChild(node);\n  }\n\n  return node;\n}\n\nfunction safeToStringValue(value) {\n  return value == null || (isNumber(value) && isNaN(value)) || !value.toString ? '' : '' + value;\n}\n\nfunction safeAttributeString(string) {\n  return safeToStringValue(string)\n    .replace(/&/g, '&amp;')\n    .replace(/\"/g, '&quot;')\n    .replace(/'/g, '&#39;');\n}\n\nexport { createElement, detachNode, getElement, matches, safeToStringValue, safeAttributeString };\n","export const html = 'http://www.w3.org/1999/xhtml';\nexport const mathml = 'http://www.w3.org/1998/Math/MathML';\nexport const svg = 'http://www.w3.org/2000/svg';\nexport const xlink = 'http://www.w3.org/1999/xlink';\nexport const xml = 'http://www.w3.org/XML/1998/namespace';\nexport const xmlns = 'http://www.w3.org/2000/xmlns';\n\nexport default { html, mathml, svg, xlink, xml, xmlns };\n","import { isEqual, isFunction } from 'utils/is';\nimport { removeFromArray } from 'utils/array';\nimport runloop from 'src/global/runloop';\nimport { rebindMatch } from 'shared/rebind';\nimport { create } from 'utils/object';\nimport { warnIfDebug } from 'utils/log';\n\nexport default class Observer {\n  constructor(ractive, model, callback, options) {\n    this.context = options.context || ractive;\n    this.callback = callback;\n    this.ractive = ractive;\n    this.keypath = options.keypath;\n    this.options = options;\n\n    if (model) this.resolved(model);\n\n    if (isFunction(options.old)) {\n      this.oldContext = create(ractive);\n      this.oldFn = options.old;\n    }\n\n    if (options.init !== false) {\n      this.dirty = true;\n      this.dispatch();\n    } else {\n      updateOld(this);\n    }\n\n    this.dirty = false;\n  }\n\n  cancel() {\n    this.cancelled = true;\n    if (this.model) {\n      this.model.unregister(this);\n    } else {\n      this.resolver.unbind();\n    }\n    removeFromArray(this.ractive._observers, this);\n  }\n\n  dispatch() {\n    if (!this.cancelled) {\n      try {\n        this.callback.call(this.context, this.newValue, this.oldValue, this.keypath);\n      } catch (err) {\n        warnIfDebug(\n          `Failed to execute observer callback for '${this.keypath}': ${err.message || err}`\n        );\n      }\n      updateOld(this, true);\n      this.dirty = false;\n    }\n  }\n\n  handleChange() {\n    if (!this.dirty) {\n      const newValue = this.model.get();\n      if (isEqual(newValue, this.oldValue)) return;\n\n      this.newValue = newValue;\n\n      if (this.options.strict && this.newValue === this.oldValue) return;\n\n      runloop.addObserver(this, this.options.defer);\n      this.dirty = true;\n\n      if (this.options.once) runloop.scheduleTask(() => this.cancel());\n    } else {\n      // make sure the newValue stays updated in case this observer gets touched multiple times in one loop\n      this.newValue = this.model.get();\n    }\n  }\n\n  rebind(next, previous) {\n    next = rebindMatch(this.keypath, next, previous);\n    if (next === this.model) return false;\n\n    if (this.model) this.model.unregister(this);\n    if (next) next.addShuffleTask(() => this.resolved(next));\n  }\n\n  resolved(model) {\n    this.model = model;\n\n    this.oldValue = undefined;\n    this.newValue = model.get();\n\n    model.register(this);\n  }\n}\n\nfunction updateOld(observer, fresh) {\n  const next = fresh\n    ? observer.model\n      ? observer.model.get()\n      : observer.newValue\n    : observer.newValue;\n  try {\n    observer.oldValue = observer.oldFn\n      ? observer.oldFn.call(observer.oldContext, undefined, next, observer.keypath)\n      : next;\n  } catch (err) {\n    warnIfDebug(\n      `Failed to execute observer oldValue callback for '${this.keypath}': ${err.message || err}`\n    );\n    observer.oldValue = next;\n  }\n}\n","import { escapeKey } from 'shared/keypaths';\nimport { removeFromArray } from 'utils/array';\nimport { isArray, isEqual } from 'utils/is';\nimport runloop from 'src/global/runloop';\nimport { create, keys } from 'utils/object';\nimport { warnIfDebug } from 'utils/log';\nimport { joinKeys } from 'src/Ractive/static/keypaths';\n\nconst star = /\\*+/g;\n\nexport default class PatternObserver {\n  constructor(ractive, baseModel, keys, callback, options) {\n    this.context = options.context || ractive;\n    this.ractive = ractive;\n    this.baseModel = baseModel;\n    this.keys = keys;\n    this.callback = callback;\n\n    const pattern = keys.join('\\\\.').replace(star, '(.+)');\n    const baseKeypath = (this.baseKeypath = baseModel.getKeypath(ractive));\n    this.pattern = new RegExp(`^${baseKeypath ? baseKeypath + '\\\\.' : ''}${pattern}$`);\n    this.recursive = keys.length === 1 && keys[0] === '**';\n    if (this.recursive) this.keys = ['*'];\n    if (options.old) {\n      this.oldContext = create(ractive);\n      this.oldFn = options.old;\n    }\n\n    this.oldValues = {};\n    this.newValues = {};\n\n    this.defer = options.defer;\n    this.once = options.once;\n    this.strict = options.strict;\n\n    this.dirty = false;\n    this.changed = [];\n    this.cache = [];\n    this.partial = false;\n    this.links = options.links;\n\n    const models = baseModel.findMatches(this.keys);\n\n    models.forEach(model => {\n      this.newValues[model.getKeypath(this.ractive)] = model.get();\n    });\n\n    if (options.init !== false) {\n      this.dispatch();\n    } else {\n      updateOld(this, this.newValues);\n    }\n\n    baseModel.registerPatternObserver(this);\n  }\n\n  cancel() {\n    this.baseModel.unregisterPatternObserver(this);\n    removeFromArray(this.ractive._observers, this);\n  }\n\n  dispatch() {\n    const newValues = this.newValues;\n    this.newValues = {};\n    keys(newValues).forEach(keypath => {\n      const newValue = newValues[keypath];\n      const oldValue = this.oldValues[keypath];\n\n      if (this.strict && newValue === oldValue) return;\n      if (isEqual(newValue, oldValue)) return;\n\n      let args = [newValue, oldValue, keypath];\n      if (keypath) {\n        const wildcards = this.pattern.exec(keypath);\n        if (wildcards) {\n          args = args.concat(wildcards.slice(1));\n        }\n      }\n\n      try {\n        this.callback.apply(this.context, args);\n      } catch (err) {\n        warnIfDebug(\n          `Failed to execute pattern observer callback for '${this.keypath}': ${err.message || err}`\n        );\n      }\n    });\n\n    updateOld(this, newValues, this.partial);\n\n    this.dirty = false;\n  }\n\n  notify(keys) {\n    const path = joinKeys(keys);\n    if (!~this.cache.indexOf(path)) {\n      this.cache.push(path);\n      this.changed.push(keys);\n    }\n  }\n\n  shuffle(newIndices) {\n    if (!isArray(this.baseModel.value)) return;\n\n    const max = this.baseModel.value.length;\n\n    for (let i = 0; i < newIndices.length; i++) {\n      if (newIndices[i] === -1 || newIndices[i] === i) continue;\n      this.changed.push([i]);\n    }\n\n    for (let i = newIndices.touchedFrom; i < max; i++) {\n      this.changed.push([i]);\n    }\n  }\n\n  handleChange() {\n    if (!this.dirty || this.changed.length) {\n      if (!this.dirty) this.newValues = {};\n\n      if (!this.changed.length) {\n        this.baseModel.findMatches(this.keys).forEach(model => {\n          const keypath = model.getKeypath(this.ractive);\n          this.newValues[keypath] = model.get();\n        });\n        this.partial = false;\n      } else {\n        let count = 0;\n\n        if (this.recursive) {\n          const changed = this.changed.slice();\n          this.changed.length = 0;\n          this.dirty = true;\n          changed.forEach(keys => {\n            const model = this.baseModel.joinAll(keys);\n            if (model.isLink && !this.links) return;\n            count++;\n            this.newValues[model.getKeypath(this.ractive)] = model.get();\n          });\n          this.dirty = false;\n        } else {\n          const ok = this.baseModel.isRoot\n            ? this.changed.map(keys => keys.map(escapeKey).join('.'))\n            : this.changed.map(keys => this.baseKeypath + '.' + keys.map(escapeKey).join('.'));\n\n          this.baseModel.findMatches(this.keys).forEach(model => {\n            const keypath = model.getKeypath(this.ractive);\n            const check = k => {\n              return (\n                (k.indexOf(keypath) === 0 &&\n                  (k.length === keypath.length || k[keypath.length] === '.')) ||\n                (keypath.indexOf(k) === 0 &&\n                  (k.length === keypath.length || keypath[k.length] === '.'))\n              );\n            };\n\n            // is this model on a changed keypath?\n            if (ok.filter(check).length) {\n              count++;\n              this.newValues[keypath] = model.get();\n            }\n          });\n        }\n\n        // no valid change triggered, so bail to avoid breakage\n        if (!count) return;\n\n        this.partial = true;\n      }\n\n      runloop.addObserver(this, this.defer);\n      this.dirty = true;\n      this.changed.length = 0;\n      this.cache = [];\n\n      if (this.once) this.cancel();\n    }\n  }\n}\n\nfunction updateOld(observer, vals, partial) {\n  const olds = observer.oldValues;\n\n  if (observer.oldFn) {\n    if (!partial) observer.oldValues = {};\n\n    keys(vals).forEach(k => {\n      const args = [olds[k], vals[k], k];\n      const parts = observer.pattern.exec(k);\n      if (parts) {\n        args.push.apply(args, parts.slice(1));\n      }\n      observer.oldValues[k] = observer.oldFn.apply(observer.oldContext, args);\n    });\n  } else {\n    if (partial) {\n      keys(vals).forEach(k => (olds[k] = vals[k]));\n    } else {\n      observer.oldValues = vals;\n    }\n  }\n}\n","import { removeFromArray } from 'utils/array';\nimport { isArray, isUndefined } from 'utils/is';\nimport runloop from 'src/global/runloop';\nimport { warnIfDebug } from 'utils/log';\n\nfunction negativeOne() {\n  return -1;\n}\n\nexport default class ArrayObserver {\n  constructor(ractive, model, callback, options) {\n    this.ractive = ractive;\n    this.model = model;\n    this.keypath = model.getKeypath();\n    this.callback = callback;\n    this.options = options;\n\n    this.pending = null;\n\n    model.register(this);\n\n    if (options.init !== false) {\n      this.sliced = [];\n      this.shuffle([]);\n      this.dispatch();\n    } else {\n      this.sliced = this.slice();\n    }\n  }\n\n  cancel() {\n    this.model.unregister(this);\n    removeFromArray(this.ractive._observers, this);\n  }\n\n  dispatch() {\n    try {\n      this.callback(this.pending);\n    } catch (err) {\n      warnIfDebug(\n        `Failed to execute array observer callback for '${this.keypath}': ${err.message || err}`\n      );\n    }\n    this.pending = null;\n    if (this.options.once) this.cancel();\n  }\n\n  handleChange(path) {\n    if (this.pending) {\n      // post-shuffle\n      runloop.addObserver(this, this.options.defer);\n    } else if (!path) {\n      // entire array changed\n      this.shuffle(this.sliced.map(negativeOne));\n      this.handleChange();\n    }\n  }\n\n  shuffle(newIndices) {\n    const newValue = this.slice();\n\n    const inserted = [];\n    const deleted = [];\n    let start;\n\n    const hadIndex = {};\n\n    newIndices.forEach((newIndex, oldIndex) => {\n      hadIndex[newIndex] = true;\n\n      if (newIndex !== oldIndex && isUndefined(start)) {\n        start = oldIndex;\n      }\n\n      if (newIndex === -1) {\n        deleted.push(this.sliced[oldIndex]);\n      }\n    });\n\n    if (isUndefined(start)) start = newIndices.length;\n\n    const len = newValue.length;\n    for (let i = 0; i < len; i += 1) {\n      if (!hadIndex[i]) inserted.push(newValue[i]);\n    }\n\n    this.pending = { inserted, deleted, start };\n    this.sliced = newValue;\n  }\n\n  slice() {\n    const value = this.model.get();\n    return isArray(value) ? value.slice() : [];\n  }\n}\n","import { isObject, isFunction } from 'utils/is';\nimport { assign } from 'utils/object';\n\nconst onceOptions = { init: false, once: true };\n\nexport default function observeOnce(keypath, callback, options) {\n  if (isObject(keypath) || isFunction(keypath)) {\n    options = assign(callback || {}, onceOptions);\n    return this.observe(keypath, options);\n  }\n\n  options = assign(options || {}, onceOptions);\n  return this.observe(keypath, callback, options);\n}\n","export default str => str.trim();\n","export default str => str !== '';\n","import makeArrayMethod from './shared/makeArrayMethod';\nexport default makeArrayMethod('pop').path;\n","import makeArrayMethod from './shared/makeArrayMethod';\nexport default makeArrayMethod('push').path;\n","import { doc } from '../config/environment';\nimport { isArray } from '../utils/is';\n\nconst PREFIX = '/* Ractive.js component styles */';\n\n// Holds current definitions of styles.\nconst styleDefinitions = [];\n\n// Flag to tell if we need to update the CSS\nlet isDirty = false;\n\n// These only make sense on the browser. See additional setup below.\nlet styleElement = null;\nlet useCssText = null;\n\n// flag to use multiple style tags\nlet _splitTag = false;\nexport function splitTag(v) {\n  return v === undefined ? _splitTag : (_splitTag = v);\n}\n\nexport function addCSS(styleDefinition) {\n  styleDefinitions.push(styleDefinition);\n  isDirty = true;\n}\n\nexport function applyCSS(force) {\n  const styleElement = style();\n\n  // Apply only seems to make sense when we're in the DOM. Server-side renders\n  // can call toCSS to get the updated CSS.\n  if (!styleElement || (!force && !isDirty)) return;\n\n  if (_splitTag) {\n    styleDefinitions.forEach(s => {\n      const el = getStyle(s.id);\n      if (el) {\n        const css = getCSS(s.id);\n        if (useCssText) {\n          el.styleSheet.cssText !== css && (el.styleSheet.cssText = css);\n        } else {\n          el.innerHTML !== css && (el.innerHTML = css);\n        }\n      }\n    });\n  } else {\n    if (useCssText) {\n      styleElement.styleSheet.cssText = getCSS(null);\n    } else {\n      styleElement.innerHTML = getCSS(null);\n    }\n  }\n\n  isDirty = false;\n}\n\nexport function getCSS(cssIds) {\n  if (cssIds && !isArray(cssIds)) cssIds = [cssIds];\n  const filteredStyleDefinitions = cssIds\n    ? styleDefinitions.filter(style => ~cssIds.indexOf(style.id))\n    : styleDefinitions;\n\n  filteredStyleDefinitions.forEach(d => (d.applied = true));\n\n  return filteredStyleDefinitions.reduce(\n    (styles, style) => `${styles ? `${styles}\\n\\n/* {${style.id}} */\\n${style.styles}` : ''}`,\n    PREFIX\n  );\n}\n\nfunction getStyle(id) {\n  return doc && (doc.querySelector(`[data-ractive-css=\"${id}\"]`) || makeStyle(id));\n}\n\nfunction makeStyle(id) {\n  if (doc) {\n    const el = doc.createElement('style');\n    el.type = 'text/css';\n    el.setAttribute('data-ractive-css', id || '');\n\n    doc.getElementsByTagName('head')[0].appendChild(el);\n\n    if (useCssText === null) useCssText = !!el.styleSheet;\n\n    return el;\n  }\n}\n\nfunction style() {\n  if (!styleElement) styleElement = makeStyle();\n\n  return styleElement;\n}\n","import { ensureArray, combine } from 'utils/array';\n\nexport default {\n  extend: (Parent, proto, options) => {\n    proto.adapt = combine(proto.adapt, ensureArray(options.adapt));\n  },\n\n  init() {}\n};\n","const remove = /\\/\\*(?:[\\s\\S]*?)\\*\\//g;\nconst escape = /url\\(\\s*(['\"])(?:\\\\[\\s\\S]|(?!\\1).)*\\1\\s*\\)|url\\((?:\\\\[\\s\\S]|[^)])*\\)|(['\"])(?:\\\\[\\s\\S]|(?!\\2).)*\\2/gi;\nconst value = /\\0(\\d+)/g;\n\n// Removes comments and strings from the given CSS to make it easier to parse.\n// Callback receives the cleaned CSS and a function which can be used to put\n// the removed strings back in place after parsing is done.\nexport default function(css, callback, additionalReplaceRules = []) {\n  const values = [];\n  const reconstruct = css => css.replace(value, (match, n) => values[n]);\n  css = css.replace(escape, match => `\\0${values.push(match) - 1}`).replace(remove, '');\n\n  additionalReplaceRules.forEach(pattern => {\n    css = css.replace(pattern, match => `\\0${values.push(match) - 1}`);\n  });\n\n  return callback(css, reconstruct);\n}\n","import cleanCss from 'utils/cleanCss';\n\nconst selectorsPattern = /(?:^|\\}|\\{|\\x01)\\s*([^\\{\\}\\0\\x01]+)\\s*(?=\\{)/g;\nconst importPattern = /@import\\s*\\([^)]*\\)\\s*;?/gi;\nconst importEndPattern = /\\x01/g;\nconst keyframesDeclarationPattern = /@keyframes\\s+[^\\{\\}]+\\s*\\{(?:[^{}]+|\\{[^{}]+})*}/gi;\nconst selectorUnitPattern = /((?:(?:\\[[^\\]]+\\])|(?:[^\\s\\+\\>~:]))+)((?:::?[^\\s\\+\\>\\~\\(:]+(?:\\([^\\)]+\\))?)*\\s*[\\s\\+\\>\\~]?)\\s*/g;\nconst excludePattern = /^(?:@|\\d+%)/;\nconst dataRvcGuidPattern = /\\[data-ractive-css~=\"\\{[a-z0-9-]+\\}\"]/g;\n\nfunction trim(str) {\n  return str.trim();\n}\n\nfunction extractString(unit) {\n  return unit.str;\n}\n\nfunction transformSelector(selector, parent) {\n  const selectorUnits = [];\n  let match;\n\n  while ((match = selectorUnitPattern.exec(selector))) {\n    selectorUnits.push({\n      str: match[0],\n      base: match[1],\n      modifiers: match[2]\n    });\n  }\n\n  // For each simple selector within the selector, we need to create a version\n  // that a) combines with the id, and b) is inside the id\n  const base = selectorUnits.map(extractString);\n\n  const transformed = [];\n  let i = selectorUnits.length;\n\n  while (i--) {\n    const appended = base.slice();\n\n    // Pseudo-selectors should go after the attribute selector\n    const unit = selectorUnits[i];\n    appended[i] = unit.base + parent + unit.modifiers || '';\n\n    const prepended = base.slice();\n    prepended[i] = parent + ' ' + prepended[i];\n\n    transformed.push(appended.join(' '), prepended.join(' '));\n  }\n\n  return transformed.join(', ');\n}\n\nexport default function transformCss(css, id) {\n  const dataAttr = `[data-ractive-css~=\"{${id}}\"]`;\n\n  let transformed;\n\n  if (dataRvcGuidPattern.test(css)) {\n    transformed = css.replace(dataRvcGuidPattern, dataAttr);\n  } else {\n    transformed = cleanCss(\n      css,\n      (css, reconstruct) => {\n        css = css\n          .replace(importPattern, '$&\\x01')\n          .replace(selectorsPattern, (match, $1) => {\n            // don't transform at-rules and keyframe declarations\n            if (excludePattern.test($1)) return match;\n\n            const selectors = $1.split(',').map(trim);\n            const transformed =\n              selectors.map(selector => transformSelector(selector, dataAttr)).join(', ') + ' ';\n\n            return match.replace($1, transformed);\n          })\n          .replace(importEndPattern, '');\n\n        return reconstruct(css);\n      },\n      [keyframesDeclarationPattern]\n    );\n  }\n\n  return transformed;\n}\n","import { SharedModel } from './SharedModel';\nimport { applyChanges } from '../../Ractive/static/styleSet';\n\nexport default class CSSModel extends SharedModel {\n  constructor(component) {\n    super(component.cssData, '@style');\n    this.component = component;\n  }\n\n  downstreamChanged(path, depth) {\n    if (this.locked) return;\n\n    const component = this.component;\n\n    component.extensions.forEach(e => {\n      const model = e._cssModel;\n      model.mark();\n      model.downstreamChanged(path, depth || 1);\n    });\n\n    if (!depth) {\n      applyChanges(component, true);\n    }\n  }\n}\n","import { addCSS, applyCSS } from 'src/global/css';\nimport transformCss from './transform';\nimport { uuid } from 'utils/id';\nimport { warnIfDebug } from 'utils/log';\nimport { getElement } from 'utils/dom';\nimport { splitKeypath } from 'shared/keypaths';\nimport CSSModel from 'src/model/specials/CSSModel';\nimport { assign, create, defineProperty } from 'utils/object';\nimport { isString, isFunction, isObjectType } from 'utils/is';\n\nconst hasCurly = /\\{/;\nexport default {\n  name: 'css',\n\n  // Called when creating a new component definition\n  extend: (Parent, proto, options, Child) => {\n    Child._cssIds = gatherIds(Parent);\n\n    defineProperty(Child, 'cssData', {\n      configurable: true,\n      value: assign(create(Parent.cssData), options.cssData || {})\n    });\n\n    defineProperty(Child, '_cssModel', {\n      configurable: true,\n      value: new CSSModel(Child)\n    });\n\n    if (options.css) initCSS(options, Child, proto);\n  },\n\n  // Called when creating a new component instance\n  init: (Parent, target, options) => {\n    if (!options.css) return;\n\n    warnIfDebug(`\nThe css option is currently not supported on a per-instance basis and will be discarded. Instead, we recommend instantiating from a component definition with a css option.\n\nconst Component = Ractive.extend({\n\t...\n\tcss: '/* your css */',\n\t...\n});\n\nconst componentInstance = new Component({ ... })\n\t\t`);\n  }\n};\n\nfunction gatherIds(start) {\n  let cmp = start;\n  const ids = [];\n\n  while (cmp) {\n    if (cmp.prototype.cssId) ids.push(cmp.prototype.cssId);\n    cmp = cmp.Parent;\n  }\n\n  return ids;\n}\n\nexport function evalCSS(component, css) {\n  if (isString(css)) return css;\n\n  const cssData = component.cssData;\n  const model = component._cssModel;\n  const data = function data(path) {\n    return model.joinAll(splitKeypath(path)).get();\n  };\n  data.__proto__ = cssData;\n\n  const result = css.call(component, data);\n  return isString(result) ? result : '';\n}\n\nexport function initCSS(options, target, proto) {\n  let css =\n    options.css === true\n      ? ''\n      : isString(options.css) && !hasCurly.test(options.css)\n      ? getElement(options.css) || options.css\n      : options.css;\n  let cssProp = css;\n\n  const id = options.cssId || uuid();\n\n  if (isObjectType(css)) {\n    css = 'textContent' in css ? css.textContent : css.innerHTML;\n    cssProp = css;\n  } else if (isFunction(css)) {\n    cssProp = css;\n    css = evalCSS(target, css);\n  }\n\n  const def = {\n    transform: 'noCSSTransform' in options ? !options.noCSSTransform : !options.noCssTransform\n  };\n\n  defineProperty(target, '_cssDef', { configurable: true, value: def });\n\n  defineProperty(target, 'css', {\n    get() {\n      return cssProp;\n    },\n    set(next) {\n      cssProp = next;\n      const css = evalCSS(target, cssProp);\n      const styles = def.styles;\n      def.styles = def.transform ? transformCss(css, id) : css;\n      if (def.applied && styles !== def.styles) applyCSS(true);\n    }\n  });\n\n  def.styles = def.transform ? transformCss(css, id) : css;\n  def.id = proto.cssId = id;\n  target._cssIds.push(id);\n\n  addCSS(target._cssDef);\n}\n","import { fatal, warnIfDebug, warnOnceIfDebug } from 'utils/log';\nimport { isArray, isObject, isFunction, isObjectType } from 'utils/is';\nimport bind from 'utils/bind';\n\nfunction validate(data) {\n  // Warn if userOptions.data is a non-POJO\n  if (data && data.constructor !== Object) {\n    if (isFunction(data)) {\n      // TODO do we need to support this in the new Ractive() case?\n    } else if (!isObjectType(data)) {\n      fatal(`data option must be an object or a function, \\`${data}\\` is not valid`);\n    } else {\n      warnIfDebug(\n        'If supplied, options.data should be a plain JavaScript object - using a non-POJO as the root object may work, but is discouraged'\n      );\n    }\n  }\n}\n\nexport default {\n  name: 'data',\n\n  extend: (Parent, proto, options) => {\n    let key;\n    let value;\n\n    // check for non-primitives, which could cause mutation-related bugs\n    if (options.data && isObject(options.data)) {\n      for (key in options.data) {\n        value = options.data[key];\n\n        if (value && isObjectType(value)) {\n          if (isObject(value) || isArray(value)) {\n            warnIfDebug(`Passing a \\`data\\` option with object and array properties to Ractive.extend() is discouraged, as mutating them is likely to cause bugs. Consider using a data function instead:\n\n  // this...\n  data: function () {\n    return {\n      myObject: {}\n    };\n  })\n\n  // instead of this:\n  data: {\n    myObject: {}\n  }`);\n          }\n        }\n      }\n    }\n\n    proto.data = combine(proto.data, options.data);\n  },\n\n  init: (Parent, ractive, options) => {\n    let result = combine(Parent.prototype.data, options.data);\n\n    if (isFunction(result)) result = result.call(ractive);\n\n    // bind functions to the ractive instance at the top level,\n    // unless it's a non-POJO (in which case alarm bells should ring)\n    if (result && result.constructor === Object) {\n      for (const prop in result) {\n        if (isFunction(result[prop])) {\n          const value = result[prop];\n          result[prop] = bind(value, ractive);\n          result[prop]._r_unbound = value;\n        }\n      }\n    }\n\n    return result || {};\n  },\n\n  reset(ractive) {\n    const result = this.init(ractive.constructor, ractive, ractive.viewmodel);\n    ractive.viewmodel.root.set(result);\n    return true;\n  }\n};\n\nfunction emptyData() {\n  return {};\n}\n\nfunction combine(parentValue, childValue) {\n  validate(childValue);\n\n  const parentIsFn = isFunction(parentValue);\n\n  // Very important, otherwise child instance can become\n  // the default data object on Ractive or a component.\n  // then ractive.set() ends up setting on the prototype!\n  if (!childValue && !parentIsFn) {\n    // this needs to be a function so that it can still inherit parent defaults\n    childValue = emptyData;\n  }\n\n  const childIsFn = isFunction(childValue);\n\n  // Fast path, where we just need to copy properties from\n  // parent to child\n  if (!parentIsFn && !childIsFn) {\n    return fromProperties(childValue, parentValue);\n  }\n\n  return function() {\n    const child = childIsFn ? callDataFunction(childValue, this) : childValue;\n    const parent = parentIsFn ? callDataFunction(parentValue, this) : parentValue;\n\n    return fromProperties(child, parent);\n  };\n}\n\nfunction callDataFunction(fn, context) {\n  const data = fn.call(context);\n\n  if (!data) return;\n\n  if (!isObjectType(data)) {\n    fatal('Data function must return an object');\n  }\n\n  if (data.constructor !== Object) {\n    warnOnceIfDebug(\n      'Data function returned something other than a plain JavaScript object. This might work, but is strongly discouraged'\n    );\n  }\n\n  return data;\n}\n\nfunction fromProperties(primary, secondary) {\n  if (primary && secondary) {\n    for (const key in secondary) {\n      if (!(key in primary)) {\n        primary[key] = secondary[key];\n      }\n    }\n\n    return primary;\n  }\n\n  return primary || secondary;\n}\n","import { TEMPLATE_VERSION } from 'config/template';\nimport { addFunctions } from 'shared/getFunction';\nimport parser from '../runtime-parser';\nimport { hasOwn } from 'utils/object';\nimport { isFunction, isNumber, isString } from 'utils/is';\n\nexport default {\n  name: 'template',\n\n  extend(Parent, proto, options) {\n    // only assign if exists\n    if ('template' in options) {\n      const template = options.template;\n\n      if (isFunction(template)) {\n        proto.template = template;\n      } else {\n        proto.template = parseTemplate(template, proto);\n      }\n    }\n  },\n\n  init(Parent, ractive, options) {\n    // TODO because of prototypal inheritance, we might just be able to use\n    // ractive.template, and not bother passing through the Parent object.\n    // At present that breaks the test mocks' expectations\n    let template = 'template' in options ? options.template : Parent.prototype.template;\n    template = template || { v: TEMPLATE_VERSION, t: [] };\n\n    if (isFunction(template)) {\n      const fn = template;\n      template = getDynamicTemplate(ractive, fn);\n\n      ractive._config.template = {\n        fn,\n        result: template\n      };\n    }\n\n    template = parseTemplate(template, ractive);\n\n    // TODO the naming of this is confusing - ractive.template refers to [...],\n    // but Component.prototype.template refers to {v:1,t:[],p:[]}...\n    // it's unnecessary, because the developer never needs to access\n    // ractive.template\n    ractive.template = template.t;\n\n    if (template.p) {\n      extendPartials(ractive.partials, template.p);\n    }\n  },\n\n  reset(ractive) {\n    const result = resetValue(ractive);\n\n    if (result) {\n      const parsed = parseTemplate(result, ractive);\n\n      ractive.template = parsed.t;\n      extendPartials(ractive.partials, parsed.p, true);\n\n      return true;\n    }\n  }\n};\n\nfunction resetValue(ractive) {\n  const initial = ractive._config.template;\n\n  // If this isn't a dynamic template, there's nothing to do\n  if (!initial || !initial.fn) {\n    return;\n  }\n\n  const result = getDynamicTemplate(ractive, initial.fn);\n\n  // TODO deep equality check to prevent unnecessary re-rendering\n  // in the case of already-parsed templates\n  if (result !== initial.result) {\n    initial.result = result;\n    return result;\n  }\n}\n\nfunction getDynamicTemplate(ractive, fn) {\n  return fn.call(ractive, {\n    fromId: parser.fromId,\n    isParsed: parser.isParsed,\n    parse(template, options = parser.getParseOptions(ractive)) {\n      return parser.parse(template, options);\n    }\n  });\n}\n\nfunction parseTemplate(template, ractive) {\n  if (isString(template)) {\n    // parse will validate and add expression functions\n    template = parseAsString(template, ractive);\n  } else {\n    // need to validate and add exp for already parsed template\n    validate(template);\n    addFunctions(template);\n  }\n\n  return template;\n}\n\nfunction parseAsString(template, ractive) {\n  // ID of an element containing the template?\n  if (template[0] === '#') {\n    template = parser.fromId(template);\n  }\n\n  return parser.parseFor(template, ractive);\n}\n\nfunction validate(template) {\n  // Check that the template even exists\n  if (template == undefined) {\n    throw new Error(`The template cannot be ${template}.`);\n  } else if (!isNumber(template.v)) {\n    // Check the parsed template has a version at all\n    throw new Error(\n      \"The template parser was passed a non-string template, but the template doesn't have a version.  Make sure you're passing in the template you think you are.\"\n    );\n  } else if (template.v !== TEMPLATE_VERSION) {\n    // Check we're using the correct version\n    throw new Error(\n      `Mismatched template version (expected ${TEMPLATE_VERSION}, got ${\n        template.v\n      }) Please ensure you are using the latest version of Ractive.js in your build process as well as in your app`\n    );\n  }\n}\n\nfunction extendPartials(existingPartials, newPartials, overwrite) {\n  if (!newPartials) return;\n\n  // TODO there's an ambiguity here - we need to overwrite in the `reset()`\n  // case, but not initially...\n\n  for (const key in newPartials) {\n    if (overwrite || !hasOwn(existingPartials, key)) {\n      existingPartials[key] = newPartials[key];\n    }\n  }\n}\n","import { assign, create, keys } from 'utils/object';\nimport { addFunctions } from 'shared/getFunction';\n\nconst registryNames = [\n  'adaptors',\n  'components',\n  'computed',\n  'decorators',\n  'easing',\n  'events',\n  'helpers',\n  'interpolators',\n  'partials',\n  'transitions'\n];\n\nconst registriesOnDefaults = ['computed', 'helpers'];\n\nclass Registry {\n  constructor(name, useDefaults) {\n    this.name = name;\n    this.useDefaults = useDefaults;\n  }\n\n  extend(Parent, proto, options) {\n    const parent = this.useDefaults ? Parent.defaults : Parent;\n    const target = this.useDefaults ? proto : proto.constructor;\n    this.configure(parent, target, options);\n  }\n\n  init() {\n    // noop\n  }\n\n  configure(Parent, target, options) {\n    const name = this.name;\n    const option = options[name];\n\n    const registry = create(Parent[name]);\n\n    assign(registry, option);\n\n    target[name] = registry;\n\n    if (name === 'partials' && target[name]) {\n      keys(target[name]).forEach(key => {\n        addFunctions(target[name][key]);\n      });\n    }\n  }\n\n  reset(ractive) {\n    const registry = ractive[this.name];\n    let changed = false;\n\n    keys(registry).forEach(key => {\n      const item = registry[key];\n\n      if (item._fn) {\n        if (item._fn.isOwner) {\n          registry[key] = item._fn;\n        } else {\n          delete registry[key];\n        }\n        changed = true;\n      }\n    });\n\n    return changed;\n  }\n}\n\nconst registries = registryNames.map(name => {\n  const putInDefaults = registriesOnDefaults.indexOf(name) > -1;\n  return new Registry(name, putInDefaults);\n});\n\nexport default registries;\n","import { warnIfDebug } from 'utils/log';\nimport adaptConfigurator from './custom/adapt';\nimport cssConfigurator from './custom/css/css';\nimport dataConfigurator from './custom/data';\nimport templateConfigurator from './custom/template';\nimport defaults from './defaults';\nimport registries from './registries';\nimport wrapPrototype from './wrapPrototypeMethod';\nimport deprecate from './deprecate';\nimport RactiveProto from '../prototype';\nimport { hasOwn, keys } from 'utils/object';\nimport { isFunction } from 'utils/is';\nimport hooks from 'src/events/Hook';\n\nconst config = {\n  extend: (Parent, proto, options, Child) => configure('extend', Parent, proto, options, Child),\n  init: (Parent, ractive, options) => configure('init', Parent, ractive, options),\n  reset: ractive => order.filter(c => c.reset && c.reset(ractive)).map(c => c.name)\n};\n\nconst custom = {\n  adapt: adaptConfigurator,\n  computed: config,\n  css: cssConfigurator,\n  data: dataConfigurator,\n  helpers: config,\n  template: templateConfigurator\n};\n\nconst defaultKeys = keys(defaults);\n\nconst isStandardKey = makeObj(defaultKeys.filter(key => !custom[key]));\n\n// blacklisted keys that we don't double extend\nconst isBlacklisted = makeObj(\n  defaultKeys.concat(registries.map(r => r.name), ['on', 'observe', 'attributes', 'cssData', 'use'])\n);\n\nconst order = [].concat(\n  defaultKeys.filter(key => !registries[key] && !custom[key]),\n  registries,\n  //custom.data,\n  custom.template,\n  custom.css\n);\n\nfunction configure(method, Parent, target, options, Child) {\n  deprecate(options);\n\n  for (const key in options) {\n    if (hasOwn(isStandardKey, key)) {\n      const value = options[key];\n\n      // warn the developer if they passed a function and ignore its value\n\n      // NOTE: we allow some functions on \"el\" because we duck type element lists\n      // and some libraries or ef'ed-up virtual browsers (phantomJS) return a\n      // function object as the result of querySelector methods\n      if (key !== 'el' && isFunction(value)) {\n        warnIfDebug(\n          `${key} is a Ractive option that does not expect a function and will be ignored`,\n          method === 'init' ? target : null\n        );\n      } else {\n        target[key] = value;\n      }\n    }\n  }\n\n  // disallow combination of `append` and `enhance`\n  if (target.append && target.enhance) {\n    throw new Error('Cannot use append and enhance at the same time');\n  }\n\n  registries.forEach(registry => {\n    registry[method](Parent, target, options, Child);\n  });\n\n  adaptConfigurator[method](Parent, target, options, Child);\n  templateConfigurator[method](Parent, target, options, Child);\n  cssConfigurator[method](Parent, target, options, Child);\n\n  extendOtherMethods(Parent.prototype, target, options);\n}\n\nconst _super = /\\b_super\\b/;\nfunction extendOtherMethods(parent, target, options) {\n  for (const key in options) {\n    if (!isBlacklisted[key] && hasOwn(options, key)) {\n      let member = options[key];\n\n      // if this is a method that overwrites a method, wrap it:\n      if (isFunction(member)) {\n        if (\n          (key in RactiveProto ||\n            (key.slice(0, 2) === 'on' && key.slice(2) in hooks && key in target)) &&\n          !_super.test(member.toString())\n        ) {\n          warnIfDebug(\n            `Overriding Ractive prototype function '${key}' without calling the '${_super}' method can be very dangerous.`\n          );\n        }\n        member = wrapPrototype(parent, key, member);\n      }\n\n      target[key] = member;\n    }\n  }\n}\n\nfunction makeObj(array) {\n  const obj = {};\n  array.forEach(x => (obj[x] = true));\n  return obj;\n}\n\nexport default config;\n","import { createDocumentFragment } from 'utils/dom';\nimport noop from 'utils/noop';\n\nexport default class Item {\n  constructor(options) {\n    this.up = options.up;\n    this.ractive = options.up.ractive;\n\n    this.template = options.template;\n    this.index = options.index;\n    this.type = options.template.t;\n\n    this.dirty = false;\n  }\n\n  bubble() {\n    if (!this.dirty) {\n      this.dirty = true;\n      this.up.bubble();\n    }\n  }\n\n  destroyed() {\n    if (this.fragment) this.fragment.destroyed();\n  }\n\n  find() {\n    return null;\n  }\n\n  findComponent() {\n    return null;\n  }\n\n  findNextNode() {\n    return this.up.findNextNode(this);\n  }\n\n  rebound(update) {\n    if (this.fragment) this.fragment.rebound(update);\n  }\n\n  shuffled() {\n    if (this.fragment) this.fragment.shuffled();\n  }\n\n  valueOf() {\n    return this.toString();\n  }\n}\n\nItem.prototype.findAll = noop;\nItem.prototype.findAllComponents = noop;\n\nexport class ContainerItem extends Item {\n  constructor(options) {\n    super(options);\n  }\n\n  detach() {\n    return this.fragment ? this.fragment.detach() : createDocumentFragment();\n  }\n\n  find(selector) {\n    if (this.fragment) {\n      return this.fragment.find(selector);\n    }\n  }\n\n  findAll(selector, options) {\n    if (this.fragment) {\n      this.fragment.findAll(selector, options);\n    }\n  }\n\n  findComponent(name) {\n    if (this.fragment) {\n      return this.fragment.findComponent(name);\n    }\n  }\n\n  findAllComponents(name, options) {\n    if (this.fragment) {\n      this.fragment.findAllComponents(name, options);\n    }\n  }\n\n  firstNode(skipParent) {\n    return this.fragment && this.fragment.firstNode(skipParent);\n  }\n\n  toString(escape) {\n    return this.fragment ? this.fragment.toString(escape) : '';\n  }\n}\n","import cleanCss from 'utils/cleanCss';\nimport { isString } from 'utils/is';\n\nconst space = /\\s+/;\n\nexport function readStyle(css) {\n  if (!isString(css)) return {};\n\n  return cleanCss(css, (css, reconstruct) => {\n    return css\n      .split(';')\n      .filter(rule => !!rule.trim())\n      .map(reconstruct)\n      .reduce((rules, rule) => {\n        const i = rule.indexOf(':');\n        const name = rule.substr(0, i).trim();\n        rules[name] = rule.substr(i + 1).trim();\n        return rules;\n      }, {});\n  });\n}\n\nexport function readClass(str) {\n  const list = str.split(space);\n\n  // remove any empty entries\n  let i = list.length;\n  while (i--) {\n    if (!list[i]) list.splice(i, 1);\n  }\n\n  return list;\n}\n","import { html } from 'config/namespaces';\nimport { safeToStringValue } from 'utils/dom';\nimport { arrayContains } from 'utils/array';\nimport noop from 'utils/noop';\nimport hyphenateCamel from 'utils/hyphenateCamel';\nimport { readStyle, readClass } from 'src/view/helpers/specialAttrs';\nimport { keys as objectKeys } from 'utils/object';\nimport { isArray, isString, isUndefined } from 'utils/is';\n\nconst textTypes = [\n  undefined,\n  'text',\n  'search',\n  'url',\n  'email',\n  'hidden',\n  'password',\n  'search',\n  'reset',\n  'submit'\n];\n\nexport default function getUpdateDelegate(attribute) {\n  const { element, name } = attribute;\n\n  if (name === 'value') {\n    if (attribute.interpolator) attribute.interpolator.bound = true;\n\n    // special case - selects\n    if (element.name === 'select' && name === 'value') {\n      return element.getAttribute('multiple') ? updateMultipleSelectValue : updateSelectValue;\n    }\n\n    if (element.name === 'textarea') return updateStringValue;\n\n    // special case - contenteditable\n    if (element.getAttribute('contenteditable') != null) return updateContentEditableValue;\n\n    // special case - <input>\n    if (element.name === 'input') {\n      const type = element.getAttribute('type');\n\n      // type='file' value='{{fileList}}'>\n      if (type === 'file') return noop; // read-only\n\n      // type='radio' name='{{twoway}}'\n      if (type === 'radio' && element.binding && element.binding.attribute.name === 'name')\n        return updateRadioValue;\n\n      if (~textTypes.indexOf(type)) return updateStringValue;\n    }\n\n    return updateValue;\n  }\n\n  const node = element.node;\n\n  // special case - <input type='radio' name='{{twoway}}' value='foo'>\n  if (attribute.isTwoway && name === 'name') {\n    if (node.type === 'radio') return updateRadioName;\n    if (node.type === 'checkbox') return updateCheckboxName;\n  }\n\n  if (name === 'style') return updateStyleAttribute;\n\n  if (name.indexOf('style-') === 0) return updateInlineStyle;\n\n  // special case - class names. IE fucks things up, again\n  if (name === 'class' && (!node.namespaceURI || node.namespaceURI === html))\n    return updateClassName;\n\n  if (name.indexOf('class-') === 0) return updateInlineClass;\n\n  if (attribute.isBoolean) {\n    const type = element.getAttribute('type');\n    if (attribute.interpolator && name === 'checked' && (type === 'checkbox' || type === 'radio'))\n      attribute.interpolator.bound = true;\n    return updateBoolean;\n  }\n\n  if (attribute.namespace && attribute.namespace !== attribute.node.namespaceURI)\n    return updateNamespacedAttribute;\n\n  return updateAttribute;\n}\n\nfunction updateMultipleSelectValue(reset) {\n  let value = this.getValue();\n\n  if (!isArray(value)) value = [value];\n\n  const options = this.node.options;\n  let i = options.length;\n\n  if (reset) {\n    while (i--) options[i].selected = false;\n  } else {\n    while (i--) {\n      const option = options[i];\n      const optionValue = option._ractive ? option._ractive.value : option.value; // options inserted via a triple don't have _ractive\n\n      option.selected = arrayContains(value, optionValue);\n    }\n  }\n}\n\nfunction updateSelectValue(reset) {\n  const value = this.getValue();\n\n  if (!this.locked) {\n    // TODO is locked still a thing?\n    this.node._ractive.value = value;\n\n    const options = this.node.options;\n    let i = options.length;\n    let wasSelected = false;\n\n    if (reset) {\n      while (i--) options[i].selected = false;\n    } else {\n      while (i--) {\n        const option = options[i];\n        const optionValue = option._ractive ? option._ractive.value : option.value; // options inserted via a triple don't have _ractive\n        if (option.disabled && option.selected) wasSelected = true;\n\n        if (optionValue == value) {\n          // double equals as we may be comparing numbers with strings\n          option.selected = true;\n          return;\n        }\n      }\n    }\n\n    if (!wasSelected) this.node.selectedIndex = -1;\n  }\n}\n\nfunction updateContentEditableValue(reset) {\n  const value = this.getValue();\n\n  if (!this.locked) {\n    if (reset) this.node.innerHTML = '';\n    else this.node.innerHTML = isUndefined(value) ? '' : value;\n  }\n}\n\nfunction updateRadioValue(reset) {\n  const node = this.node;\n  const wasChecked = node.checked;\n\n  const value = this.getValue();\n\n  if (reset) return (node.checked = false);\n\n  //node.value = this.element.getAttribute( 'value' );\n  node.value = this.node._ractive.value = value;\n  node.checked = this.element.compare(value, this.element.getAttribute('name'));\n\n  // This is a special case - if the input was checked, and the value\n  // changed so that it's no longer checked, the twoway binding is\n  // most likely out of date. To fix it we have to jump through some\n  // hoops... this is a little kludgy but it works\n  if (wasChecked && !node.checked && this.element.binding && this.element.binding.rendered) {\n    this.element.binding.group.model.set(this.element.binding.group.getValue());\n  }\n}\n\nfunction updateValue(reset) {\n  if (!this.locked) {\n    if (reset) {\n      this.node.removeAttribute('value');\n      this.node.value = this.node._ractive.value = null;\n    } else {\n      const value = this.getValue();\n\n      this.node.value = this.node._ractive.value = value;\n      this.node.setAttribute('value', safeToStringValue(value));\n    }\n  }\n}\n\nfunction updateStringValue(reset) {\n  if (!this.locked) {\n    if (reset) {\n      this.node._ractive.value = '';\n      this.node.removeAttribute('value');\n    } else {\n      const value = this.getValue();\n\n      this.node._ractive.value = value;\n\n      const safeValue = safeToStringValue(value);\n\n      // fixes #3281 – Safari moves caret position when setting an input value to the same value\n      if (this.node.value !== safeValue) {\n        this.node.value = safeValue;\n      }\n\n      this.node.setAttribute('value', safeValue);\n    }\n  }\n}\n\nfunction updateRadioName(reset) {\n  if (reset) this.node.checked = false;\n  else this.node.checked = this.element.compare(this.getValue(), this.element.binding.getValue());\n}\n\nfunction updateCheckboxName(reset) {\n  const { element, node } = this;\n  const binding = element.binding;\n\n  const value = this.getValue();\n  const valueAttribute = element.getAttribute('value');\n\n  if (reset) {\n    // TODO: WAT?\n  }\n\n  if (!isArray(value)) {\n    binding.isChecked = node.checked = element.compare(value, valueAttribute);\n  } else {\n    let i = value.length;\n    while (i--) {\n      if (element.compare(valueAttribute, value[i])) {\n        binding.isChecked = node.checked = true;\n        return;\n      }\n    }\n    binding.isChecked = node.checked = false;\n  }\n}\n\nfunction updateStyleAttribute(reset) {\n  const props = reset ? {} : readStyle(this.getValue() || '');\n  const style = this.node.style;\n  const keys = objectKeys(props);\n  const prev = this.previous || [];\n\n  let i = 0;\n  while (i < keys.length) {\n    if (keys[i] in style) {\n      const safe = props[keys[i]].replace('!important', '');\n      style.setProperty(keys[i], safe, safe.length !== props[keys[i]].length ? 'important' : '');\n    }\n    i++;\n  }\n\n  // remove now-missing attrs\n  i = prev.length;\n  while (i--) {\n    if (!~keys.indexOf(prev[i]) && prev[i] in style) style.setProperty(prev[i], '', '');\n  }\n\n  this.previous = keys;\n}\n\nfunction updateInlineStyle(reset) {\n  if (!this.style) {\n    this.style = hyphenateCamel(this.name.substr(6));\n  }\n\n  if (reset && this.node.style.getPropertyValue(this.style) !== this.last) return;\n\n  const value = reset ? '' : safeToStringValue(this.getValue());\n  const safe = value.replace('!important', '');\n  this.node.style.setProperty(this.style, safe, safe.length !== value.length ? 'important' : '');\n  this.last = this.node.style.getPropertyValue(this.style);\n}\n\nfunction updateClassName(reset) {\n  const value = reset ? [] : readClass(safeToStringValue(this.getValue()));\n\n  // watch out for weirdo svg elements\n  let cls = this.node.className;\n  cls = cls.baseVal !== undefined ? cls.baseVal : cls;\n\n  const attr = readClass(cls);\n  const prev = this.previous || [];\n\n  const className = value.concat(attr.filter(c => !~prev.indexOf(c))).join(' ');\n\n  if (className !== cls) {\n    if (!isString(this.node.className)) {\n      this.node.className.baseVal = className;\n    } else {\n      this.node.className = className;\n    }\n  }\n\n  this.previous = value;\n}\n\nfunction updateInlineClass(reset) {\n  const name = this.name.substr(6);\n\n  // watch out for weirdo svg elements\n  let cls = this.node.className;\n  cls = cls.baseVal !== undefined ? cls.baseVal : cls;\n\n  const attr = readClass(cls);\n  const value = reset ? false : this.getValue();\n\n  if (!this.inlineClass) this.inlineClass = name;\n\n  if (value && !~attr.indexOf(name)) attr.push(name);\n  else if (!value && ~attr.indexOf(name)) attr.splice(attr.indexOf(name), 1);\n\n  if (!isString(this.node.className)) {\n    this.node.className.baseVal = attr.join(' ');\n  } else {\n    this.node.className = attr.join(' ');\n  }\n}\n\nfunction updateBoolean(reset) {\n  // with two-way binding, only update if the change wasn't initiated by the user\n  // otherwise the cursor will often be sent to the wrong place\n  if (!this.locked) {\n    if (reset) {\n      if (this.useProperty) this.node[this.propertyName] = false;\n      this.node.removeAttribute(this.propertyName);\n    } else {\n      if (this.useProperty) {\n        this.node[this.propertyName] = this.getValue();\n      } else {\n        const val = this.getValue();\n        if (val) {\n          this.node.setAttribute(this.propertyName, isString(val) ? val : '');\n        } else {\n          this.node.removeAttribute(this.propertyName);\n        }\n      }\n    }\n  }\n}\n\nexport function updateAttribute(reset) {\n  if (reset) {\n    if (this.node.getAttribute(this.name) === this.value) {\n      this.node.removeAttribute(this.name);\n    }\n  } else {\n    this.value = safeToStringValue(this.getString());\n    this.node.setAttribute(this.name, this.value);\n  }\n}\n\nexport function updateNamespacedAttribute(reset) {\n  if (reset) {\n    if (\n      this.value ===\n      this.node.getAttributeNS(this.namespace, this.name.slice(this.name.indexOf(':') + 1))\n    ) {\n      this.node.removeAttributeNS(this.namespace, this.name.slice(this.name.indexOf(':') + 1));\n    }\n  } else {\n    this.value = safeToStringValue(this.getString());\n    this.node.setAttributeNS(\n      this.namespace,\n      this.name.slice(this.name.indexOf(':') + 1),\n      this.value\n    );\n  }\n}\n","export default {\n  'accept-charset': 'acceptCharset',\n  accesskey: 'accessKey',\n  bgcolor: 'bgColor',\n  class: 'className',\n  codebase: 'codeBase',\n  colspan: 'colSpan',\n  contenteditable: 'contentEditable',\n  datetime: 'dateTime',\n  dirname: 'dirName',\n  for: 'htmlFor',\n  'http-equiv': 'httpEquiv',\n  ismap: 'isMap',\n  maxlength: 'maxLength',\n  novalidate: 'noValidate',\n  pubdate: 'pubDate',\n  readonly: 'readOnly',\n  rowspan: 'rowSpan',\n  tabindex: 'tabIndex',\n  usemap: 'useMap'\n};\n","import { doc } from 'config/environment';\nimport { svg } from 'config/namespaces';\nimport { createElement } from 'utils/dom';\nimport { toArray } from 'utils/array';\nimport noop from 'utils/noop';\nimport Fragment from '../../Fragment';\nimport Item from '../shared/Item';\n\nconst div = doc ? createElement('div') : null;\n\nlet attributes = false;\nexport function inAttributes() {\n  return attributes;\n}\n\nexport default class ConditionalAttribute extends Item {\n  constructor(options) {\n    super(options);\n\n    this.attributes = [];\n\n    this.owner = options.owner;\n\n    this.fragment = new Fragment({\n      ractive: this.ractive,\n      owner: this,\n      template: this.template\n    });\n\n    // this fragment can't participate in node-y things\n    this.fragment.findNextNode = noop;\n\n    this.dirty = false;\n  }\n\n  bind() {\n    this.fragment.bind();\n  }\n\n  bubble() {\n    if (!this.dirty) {\n      this.dirty = true;\n      this.owner.bubble();\n    }\n  }\n\n  destroyed() {\n    this.unrender();\n  }\n\n  render() {\n    this.node = this.owner.node;\n    if (this.node) {\n      this.isSvg = this.node.namespaceURI === svg;\n    }\n\n    attributes = true;\n    if (!this.rendered) this.fragment.render();\n\n    this.rendered = true;\n    this.dirty = true; // TODO this seems hacky, but necessary for tests to pass in browser AND node.js\n    this.update();\n    attributes = false;\n  }\n\n  toString() {\n    return this.fragment.toString();\n  }\n\n  unbind(view) {\n    this.fragment.unbind(view);\n  }\n\n  unrender() {\n    this.rendered = false;\n    this.fragment.unrender();\n  }\n\n  update() {\n    let str;\n    let attrs;\n\n    if (this.dirty) {\n      this.dirty = false;\n\n      const current = attributes;\n      attributes = true;\n      this.fragment.update();\n\n      if (this.rendered && this.node) {\n        str = this.fragment.toString();\n\n        attrs = parseAttributes(str, this.isSvg);\n\n        // any attributes that previously existed but no longer do\n        // must be removed\n        this.attributes\n          .filter(a => notIn(attrs, a))\n          .forEach(a => {\n            this.node.removeAttribute(a.name);\n          });\n\n        attrs.forEach(a => {\n          this.node.setAttribute(a.name, a.value);\n        });\n\n        this.attributes = attrs;\n      }\n\n      attributes = current || false;\n    }\n  }\n}\n\nconst onlyWhitespace = /^\\s*$/;\nfunction parseAttributes(str, isSvg) {\n  if (onlyWhitespace.test(str)) return [];\n  const tagName = isSvg ? 'svg' : 'div';\n  return str\n    ? (div.innerHTML = `<${tagName} ${str}></${tagName}>`) && toArray(div.childNodes[0].attributes)\n    : [];\n}\n\nfunction notIn(haystack, needle) {\n  let i = haystack.length;\n\n  while (i--) {\n    if (haystack[i].name === needle.name) {\n      return false;\n    }\n  }\n\n  return true;\n}\n","import { INTERPOLATOR } from 'config/types';\nimport namespaces from 'config/namespaces';\nimport { safeAttributeString } from 'utils/dom';\nimport { booleanAttributes } from 'utils/html';\nimport hyphenateCamel from 'utils/hyphenateCamel';\nimport Fragment from '../../Fragment';\nimport Item from '../shared/Item';\nimport findElement from '../shared/findElement';\nimport getUpdateDelegate from './attribute/getUpdateDelegate';\nimport propertyNames from './attribute/propertyNames';\nimport { inAttributes } from './ConditionalAttribute';\nimport { isArray, isString, isUndefined } from 'utils/is';\n\nfunction lookupNamespace(node, prefix) {\n  const qualified = `xmlns:${prefix}`;\n\n  while (node) {\n    if (node.hasAttribute && node.hasAttribute(qualified)) return node.getAttribute(qualified);\n    node = node.parentNode;\n  }\n\n  return namespaces[prefix];\n}\n\nlet attribute = false;\nexport function inAttribute() {\n  return attribute;\n}\n\nexport default class Attribute extends Item {\n  constructor(options) {\n    super(options);\n\n    this.name = options.template.n;\n    this.namespace = null;\n\n    this.owner = options.owner || options.up.owner || options.element || findElement(options.up);\n    this.element =\n      options.element || (this.owner.attributeByName ? this.owner : findElement(options.up));\n    this.up = options.up; // shared\n    this.ractive = this.up.ractive;\n\n    this.rendered = false;\n    this.updateDelegate = null;\n    this.fragment = null;\n\n    this.element.attributeByName[this.name] = this;\n\n    if (!isArray(options.template.f)) {\n      this.value = options.template.f;\n      if (this.value === 0) {\n        this.value = '';\n      } else if (isUndefined(this.value)) {\n        this.value = true;\n      }\n      return;\n    } else {\n      this.fragment = new Fragment({\n        owner: this,\n        template: options.template.f\n      });\n    }\n\n    this.interpolator =\n      this.fragment &&\n      this.fragment.items.length === 1 &&\n      this.fragment.items[0].type === INTERPOLATOR &&\n      this.fragment.items[0];\n\n    if (this.interpolator) this.interpolator.owner = this;\n  }\n\n  bind() {\n    if (this.fragment) {\n      this.fragment.bind();\n    }\n  }\n\n  bubble() {\n    if (!this.dirty) {\n      this.up.bubble();\n      this.element.bubble();\n      this.dirty = true;\n    }\n  }\n\n  firstNode() {}\n\n  getString() {\n    attribute = true;\n    const value = this.fragment\n      ? this.fragment.toString()\n      : this.value != null\n      ? '' + this.value\n      : '';\n    attribute = false;\n    return value;\n  }\n\n  // TODO could getValue ever be called for a static attribute,\n  // or can we assume that this.fragment exists?\n  getValue() {\n    attribute = true;\n    const value = this.fragment\n      ? this.fragment.valueOf()\n      : booleanAttributes[this.name.toLowerCase()]\n      ? true\n      : this.value;\n    attribute = false;\n    return value;\n  }\n\n  render() {\n    const node = this.element.node;\n    this.node = node;\n\n    // should we use direct property access, or setAttribute?\n    if (!node.namespaceURI || node.namespaceURI === namespaces.html) {\n      this.propertyName = propertyNames[this.name] || this.name;\n\n      if (node[this.propertyName] !== undefined) {\n        this.useProperty = true;\n      }\n\n      // is attribute a boolean attribute or 'value'? If so we're better off doing e.g.\n      // node.selected = true rather than node.setAttribute( 'selected', '' )\n      if (booleanAttributes[this.name.toLowerCase()] || this.isTwoway) {\n        this.isBoolean = true;\n      }\n\n      if (this.propertyName === 'value') {\n        node._ractive.value = this.value;\n      }\n    }\n\n    if (node.namespaceURI) {\n      const index = this.name.indexOf(':');\n      if (index !== -1) {\n        this.namespace = lookupNamespace(node, this.name.slice(0, index));\n      } else {\n        this.namespace = node.namespaceURI;\n      }\n    }\n\n    this.rendered = true;\n    this.updateDelegate = getUpdateDelegate(this);\n    this.updateDelegate();\n  }\n\n  toString() {\n    if (inAttributes()) return '';\n    attribute = true;\n\n    const value = this.getValue();\n\n    // Special case - select and textarea values (should not be stringified)\n    if (\n      this.name === 'value' &&\n      (this.element.getAttribute('contenteditable') !== undefined ||\n        (this.element.name === 'select' || this.element.name === 'textarea'))\n    ) {\n      return;\n    }\n\n    // Special case – bound radio `name` attributes\n    if (\n      this.name === 'name' &&\n      this.element.name === 'input' &&\n      this.interpolator &&\n      this.element.getAttribute('type') === 'radio'\n    ) {\n      return `name=\"{{${this.interpolator.model.getKeypath()}}}\"`;\n    }\n\n    // Special case - style and class attributes and directives\n    if (\n      this.owner === this.element &&\n      (this.name === 'style' || this.name === 'class' || this.style || this.inlineClass)\n    ) {\n      return;\n    }\n\n    if (\n      !this.rendered &&\n      this.owner === this.element &&\n      (!this.name.indexOf('style-') || !this.name.indexOf('class-'))\n    ) {\n      if (!this.name.indexOf('style-')) {\n        this.style = hyphenateCamel(this.name.substr(6));\n      } else {\n        this.inlineClass = this.name.substr(6);\n      }\n\n      return;\n    }\n\n    if (booleanAttributes[this.name.toLowerCase()])\n      return value\n        ? isString(value)\n          ? `${this.name}=\"${safeAttributeString(value)}\"`\n          : this.name\n        : '';\n    if (value == null) return '';\n\n    const str = safeAttributeString(this.getString());\n    attribute = false;\n\n    return str ? `${this.name}=\"${str}\"` : this.name;\n  }\n\n  unbind(view) {\n    if (this.fragment) this.fragment.unbind(view);\n  }\n\n  unrender() {\n    this.updateDelegate(true);\n\n    this.rendered = false;\n  }\n\n  update() {\n    if (this.dirty) {\n      let binding;\n      this.dirty = false;\n      if (this.fragment) this.fragment.update();\n      if (this.rendered) this.updateDelegate();\n      if (this.isTwoway && !this.locked) {\n        this.interpolator.twowayBinding.lastVal(true, this.interpolator.model.get());\n      } else if (this.name === 'value' && (binding = this.element.binding)) {\n        // special case: name bound element with dynamic value\n        const attr = binding.attribute;\n        if (attr && !attr.dirty && attr.rendered) {\n          this.element.binding.attribute.updateDelegate();\n        }\n      }\n    }\n  }\n}\n","import { INTERPOLATOR, ELEMENT } from 'config/types';\nimport Item from '../shared/Item';\nimport Fragment from '../../Fragment';\nimport findElement from '../shared/findElement';\nimport { isArray } from 'utils/is';\n\nexport default class BindingFlag extends Item {\n  constructor(options) {\n    super(options);\n\n    this.owner = options.owner || options.up.owner || findElement(options.up);\n    this.element = this.owner.attributeByName ? this.owner : findElement(options.up);\n    this.flag = options.template.v === 'l' ? 'lazy' : 'twoway';\n    this.bubbler = this.owner === this.element ? this.element : this.up;\n\n    if (this.element.type === ELEMENT) {\n      if (isArray(options.template.f)) {\n        this.fragment = new Fragment({\n          owner: this,\n          template: options.template.f\n        });\n      }\n\n      this.interpolator =\n        this.fragment &&\n        this.fragment.items.length === 1 &&\n        this.fragment.items[0].type === INTERPOLATOR &&\n        this.fragment.items[0];\n    }\n  }\n\n  bind() {\n    if (this.fragment) this.fragment.bind();\n    set(this, this.getValue(), true);\n  }\n\n  bubble() {\n    if (!this.dirty) {\n      this.bubbler.bubble();\n      this.dirty = true;\n    }\n  }\n\n  getValue() {\n    if (this.fragment) return this.fragment.valueOf();\n    else if ('value' in this) return this.value;\n    else if ('f' in this.template) return this.template.f;\n    else return true;\n  }\n\n  render() {\n    set(this, this.getValue(), true);\n  }\n\n  toString() {\n    return '';\n  }\n\n  unbind(view) {\n    if (this.fragment) this.fragment.unbind(view);\n\n    delete this.element[this.flag];\n  }\n\n  unrender() {\n    if (this.element.rendered) this.element.recreateTwowayBinding();\n  }\n\n  update() {\n    if (this.dirty) {\n      this.dirty = false;\n      if (this.fragment) this.fragment.update();\n      set(this, this.getValue(), true);\n    }\n  }\n}\n\nfunction set(flag, value, update) {\n  if (value === 0) {\n    flag.value = true;\n  } else if (value === 'true') {\n    flag.value = true;\n  } else if (value === 'false' || value === '0') {\n    flag.value = false;\n  } else {\n    flag.value = value;\n  }\n\n  const current = flag.element[flag.flag];\n  flag.element[flag.flag] = flag.value;\n  if (update && !flag.element.attributes.binding && current !== flag.value) {\n    flag.element.recreateTwowayBinding();\n  }\n\n  return flag.value;\n}\n","import Item from './shared/Item';\nimport noop from 'utils/noop';\nimport { detachNode } from 'utils/dom';\nimport { doc } from 'config/environment';\nimport { assign, create } from 'utils/object';\n\nexport default function Comment(options) {\n  Item.call(this, options);\n}\n\nconst proto = create(Item.prototype);\n\nassign(proto, {\n  bind: noop,\n  unbind: noop,\n  update: noop,\n\n  detach() {\n    return detachNode(this.node);\n  },\n\n  firstNode() {\n    return this.node;\n  },\n\n  render(target) {\n    this.rendered = true;\n\n    this.node = doc.createComment(this.template.c);\n    target.appendChild(this.node);\n  },\n\n  toString() {\n    return `<!-- ${this.template.c} -->`;\n  },\n\n  unrender(shouldDestroy) {\n    if (this.rendered && shouldDestroy) this.detach();\n    this.rendered = false;\n  }\n});\n\nComment.prototype = proto;\n","import { SharedModel } from './SharedModel';\nimport { Missing } from '../LinkModel';\nimport { create } from 'utils/object';\n\nexport default class RactiveModel extends SharedModel {\n  constructor(ractive) {\n    super(ractive, '@this');\n    this.ractive = ractive;\n  }\n\n  joinKey(key) {\n    const model = super.joinKey(key);\n\n    if ((key === 'root' || key === 'parent') && !model.isLink) return initLink(model, key);\n    else if (key === 'data') return this.ractive.viewmodel;\n    else if (key === 'cssData') return this.ractive.constructor._cssModel;\n\n    return model;\n  }\n}\n\nfunction initLink(model, key) {\n  model.applyValue = function(value) {\n    this.parent.value[key] = value;\n    if (value && value.viewmodel) {\n      this.link(value.viewmodel.getRactiveModel(), key);\n      this._link.markedAll();\n    } else {\n      this.link(create(Missing), key);\n      this._link.markedAll();\n    }\n  };\n\n  if (key === 'root') {\n    const mark = model.mark;\n    model.mark = function(force) {\n      if (this._marking) return;\n      this._marking = true;\n      mark.apply(this, force);\n      this._marking = false;\n    };\n  }\n\n  model.applyValue(model.parent.ractive[key], key);\n  model._link.set = v => model.applyValue(v);\n  model._link.applyValue = v => model.applyValue(v);\n\n  return model._link;\n}\n","import { capture } from 'src/global/capture';\nimport Model from './Model';\nimport { handleChange, mark } from 'shared/methodCallers';\nimport RactiveModel from './specials/RactiveModel';\nimport SharedModel, { GlobalModel, SharedModel as SharedBase } from './specials/SharedModel';\nimport { splitKeypath, unescapeKey } from 'shared/keypaths';\nimport resolveReference from 'src/view/resolvers/resolveReference';\nimport noop from 'utils/noop';\n\nconst specialModels = {\n  '@this'(root) {\n    return root.getRactiveModel();\n  },\n  '@global'() {\n    return GlobalModel;\n  },\n  '@shared'() {\n    return SharedModel;\n  },\n  '@style'(root) {\n    return root.getRactiveModel().joinKey('cssData');\n  },\n  '@helpers'(root) {\n    return root.getHelpers();\n  }\n};\nspecialModels['@'] = specialModels['@this'];\n\nexport default class RootModel extends Model {\n  constructor(options) {\n    super(null, null);\n\n    this.isRoot = true;\n    this.root = this;\n    this.ractive = options.ractive; // TODO sever this link\n\n    this.value = options.data;\n    this.adaptors = options.adapt;\n    this.adapt();\n  }\n\n  attached(fragment) {\n    attachImplicits(this, fragment);\n  }\n\n  createLink(keypath, target, targetPath, options) {\n    const keys = splitKeypath(keypath);\n\n    let model = this;\n    while (keys.length) {\n      const key = keys.shift();\n      model = model.childByKey[key] || model.joinKey(key);\n    }\n\n    return model.link(target, targetPath, options);\n  }\n\n  detached() {\n    detachImplicits(this);\n  }\n\n  get(shouldCapture, options) {\n    if (shouldCapture) capture(this);\n\n    if (!options || options.virtual !== false) {\n      return this.getVirtual();\n    } else {\n      return this.value;\n    }\n  }\n\n  getHelpers() {\n    if (!this.helpers) this.helpers = new SharedBase(this.ractive.helpers, 'helpers', this.ractive);\n    return this.helpers;\n  }\n\n  getKeypath() {\n    return '';\n  }\n\n  getRactiveModel() {\n    return this.ractiveModel || (this.ractiveModel = new RactiveModel(this.ractive));\n  }\n\n  getValueChildren() {\n    const children = super.getValueChildren(this.value);\n\n    this.children.forEach(child => {\n      if (child._link) {\n        const idx = children.indexOf(child);\n        if (~idx) children.splice(idx, 1, child._link);\n        else children.push(child._link);\n      }\n    });\n\n    return children;\n  }\n\n  has(key) {\n    if (key[0] === '~' && key[1] === '/') key = key.slice(2);\n    if (specialModels[key] || key === '') return true;\n\n    if (super.has(key)) {\n      return true;\n    } else {\n      const unescapedKey = unescapeKey(key);\n\n      // mappings/links and computations\n      if (this.childByKey[unescapedKey] && this.childByKey[unescapedKey]._link) return true;\n    }\n  }\n\n  joinKey(key, opts) {\n    if (key[0] === '~' && key[1] === '/') key = key.slice(2);\n\n    if (key[0] === '@') {\n      const fn = specialModels[key];\n      if (fn) return fn(this);\n    } else {\n      return super.joinKey(key, opts);\n    }\n  }\n\n  set(value) {\n    // TODO wrapping root node is a baaaad idea. We should prevent this\n    const wrapper = this.wrapper;\n    if (wrapper) {\n      const shouldTeardown = !wrapper.reset || wrapper.reset(value) === false;\n\n      if (shouldTeardown) {\n        wrapper.teardown();\n        this.wrapper = null;\n        this.value = value;\n        this.adapt();\n      }\n    } else {\n      this.value = value;\n      this.adapt();\n    }\n\n    this.deps.forEach(handleChange);\n    this.children.forEach(mark);\n  }\n\n  retrieve() {\n    return this.wrapper ? this.wrapper.get() : this.value;\n  }\n\n  teardown() {\n    super.teardown();\n    this.ractiveModel && this.ractiveModel.teardown();\n  }\n}\nRootModel.prototype.update = noop;\n\nfunction attachImplicits(model, fragment) {\n  if (model._link && model._link.implicit && model._link.isDetached()) {\n    model.attach(fragment);\n  }\n\n  // look for virtual children to relink and cascade\n  for (const k in model.childByKey) {\n    if (model.value) {\n      if (k in model.value) {\n        attachImplicits(model.childByKey[k], fragment);\n      } else if (!model.childByKey[k]._link || model.childByKey[k]._link.isDetached()) {\n        const mdl = resolveReference(fragment, k);\n        if (mdl) {\n          model.childByKey[k].link(mdl, k, { implicit: true });\n        }\n      }\n    }\n  }\n}\n\nfunction detachImplicits(model) {\n  if (model._link && model._link.implicit) {\n    model.unlink();\n  }\n\n  for (const k in model.childByKey) {\n    detachImplicits(model.childByKey[k]);\n  }\n}\n","import { fatal, warnIfDebug, welcome } from 'utils/log';\nimport { missingPlugin } from 'config/errors';\nimport { ensureArray, combine } from 'utils/array';\nimport { findInViewHierarchy } from 'shared/registry';\nimport dataConfigurator from './config/custom/data';\nimport RootModel from 'src/model/RootModel';\nimport hooks from 'src/events/Hook';\nimport subscribe from './helpers/subscribe';\nimport Ractive from '../Ractive';\nimport { ATTRIBUTE, BINDING_FLAG, DECORATOR, INTERPOLATOR, TRANSITION } from 'config/types';\nimport { assign, create, hasOwn } from 'utils/object';\nimport { isArray, isString } from 'utils/is';\nimport { compute } from 'src/Ractive/prototype/compute';\nimport getRactiveContext from '../shared/getRactiveContext';\n\nconst registryNames = [\n  'adaptors',\n  'components',\n  'decorators',\n  'easing',\n  'events',\n  'interpolators',\n  'partials',\n  'transitions'\n];\n\nconst protoRegistries = ['computed', 'helpers'];\n\nlet uid = 0;\n\nexport default function construct(ractive, options) {\n  if (Ractive.DEBUG) welcome();\n\n  initialiseProperties(ractive);\n  handleAttributes(ractive);\n\n  // set up event subscribers\n  subscribe(ractive, options, 'on');\n\n  // if there's not a delegation setting, inherit from parent if it's not default\n  if (\n    !hasOwn(options, 'delegate') &&\n    ractive.parent &&\n    ractive.parent.delegate !== ractive.delegate\n  ) {\n    ractive.delegate = false;\n  }\n\n  // plugins that need to run at construct\n  if (isArray(options.use)) {\n    ractive.use.apply(ractive, options.use.filter(p => p.construct));\n  }\n\n  hooks.construct.fire(ractive, options);\n  if (options.onconstruct) options.onconstruct.call(ractive, getRactiveContext(ractive), options);\n\n  // Add registries\n  let i = registryNames.length;\n  while (i--) {\n    const name = registryNames[i];\n    ractive[name] = assign(create(ractive.constructor[name] || null), options[name]);\n  }\n\n  i = protoRegistries.length;\n  while (i--) {\n    const name = protoRegistries[i];\n    ractive[name] = assign(create(ractive.constructor.prototype[name]), options[name]);\n  }\n\n  if (ractive._attributePartial) {\n    ractive.partials['extra-attributes'] = ractive._attributePartial;\n    delete ractive._attributePartial;\n  }\n\n  // Create a viewmodel\n  const viewmodel = new RootModel({\n    adapt: getAdaptors(ractive, ractive.adapt, options),\n    data: dataConfigurator.init(ractive.constructor, ractive, options),\n    ractive\n  });\n\n  // once resolved, share the adaptors array between the root model and instance\n  ractive.adapt = viewmodel.adaptors;\n\n  ractive.viewmodel = viewmodel;\n\n  for (const k in ractive.computed) {\n    compute.call(ractive, k, ractive.computed[k]);\n  }\n}\n\nfunction getAdaptors(ractive, protoAdapt, options) {\n  protoAdapt = protoAdapt.map(lookup);\n  const adapt = ensureArray(options.adapt).map(lookup);\n\n  const srcs = [protoAdapt, adapt];\n  if (ractive.parent && !ractive.isolated) {\n    srcs.push(ractive.parent.viewmodel.adaptors);\n  }\n\n  return combine.apply(null, srcs);\n\n  function lookup(adaptor) {\n    if (isString(adaptor)) {\n      adaptor = findInViewHierarchy('adaptors', ractive, adaptor);\n\n      if (!adaptor) {\n        fatal(missingPlugin(adaptor, 'adaptor'));\n      }\n    }\n\n    return adaptor;\n  }\n}\n\nfunction initialiseProperties(ractive) {\n  // Generate a unique identifier, for places where you'd use a weak map if it\n  // existed\n  ractive._guid = 'r-' + uid++;\n\n  // events\n  ractive._subs = create(null);\n  ractive._nsSubs = 0;\n\n  // storage for item configuration from instantiation to reset,\n  // like dynamic functions or original values\n  ractive._config = {};\n\n  // events\n  ractive.event = null;\n  ractive._eventQueue = [];\n\n  // observers\n  ractive._observers = [];\n\n  // external children\n  ractive._children = [];\n  ractive._children.byName = {};\n  ractive.children = ractive._children;\n\n  if (!ractive.component) {\n    ractive.root = ractive;\n    ractive.parent = ractive.container = null; // TODO container still applicable?\n  }\n}\n\nfunction handleAttributes(ractive) {\n  const component = ractive.component;\n  const attributes = ractive.constructor.attributes;\n\n  if (attributes && component) {\n    const tpl = component.template;\n    const attrs = tpl.m ? tpl.m.slice() : [];\n\n    // grab all of the passed attribute names\n    const props = attrs.filter(a => a.t === ATTRIBUTE).map(a => a.n);\n\n    // warn about missing requireds\n    attributes.required.forEach(p => {\n      if (!~props.indexOf(p)) {\n        warnIfDebug(`Component '${component.name}' requires attribute '${p}' to be provided`);\n      }\n    });\n\n    // set up a partial containing non-property attributes\n    const all = attributes.optional.concat(attributes.required);\n    const partial = [];\n    let i = attrs.length;\n    while (i--) {\n      const a = attrs[i];\n      if (a.t === ATTRIBUTE && !~all.indexOf(a.n)) {\n        if (attributes.mapAll) {\n          // map the attribute if requested and make the extra attribute in the partial refer to the mapping\n          partial.unshift({\n            t: ATTRIBUTE,\n            n: a.n,\n            f: [{ t: INTERPOLATOR, r: `~/${a.n}` }]\n          });\n        } else {\n          // transfer the attribute to the extra attributes partal\n          partial.unshift(attrs.splice(i, 1)[0]);\n        }\n      } else if (\n        !attributes.mapAll &&\n        (a.t === DECORATOR || a.t === TRANSITION || a.t === BINDING_FLAG)\n      ) {\n        partial.unshift(attrs.splice(i, 1)[0]);\n      }\n    }\n\n    if (partial.length) component.template = { t: tpl.t, e: tpl.e, f: tpl.f, m: attrs, p: tpl.p };\n    ractive._attributePartial = partial;\n  }\n}\n","import runloop from 'src/global/runloop';\nimport { updateAnchors } from 'shared/anchors';\nimport { bind, render as callRender, unbind, unrender, update } from 'shared/methodCallers';\nimport { teardown } from 'src/Ractive/prototype/teardown';\nimport getRactiveContext from 'shared/getRactiveContext';\nimport { warnIfDebug } from 'utils/log';\nimport { createDocumentFragment } from 'utils/dom';\nimport {\n  ANCHOR,\n  ATTRIBUTE,\n  BINDING_FLAG,\n  COMPONENT,\n  DECORATOR,\n  EVENT,\n  TRANSITION,\n  YIELDER\n} from 'config/types';\nimport construct from 'src/Ractive/construct';\nimport initialise from 'src/Ractive/initialise';\nimport render from 'src/Ractive/render';\nimport Item from './shared/Item';\nimport ConditionalAttribute from './element/ConditionalAttribute';\nimport createItem from './createItem';\nimport parser from 'src/Ractive/config/runtime-parser';\nimport { assign, create } from 'utils/object';\nimport { isArray, isString } from 'utils/is';\n\nexport default class Component extends Item {\n  constructor(options, ComponentConstructor) {\n    super(options);\n    let template = options.template;\n    this.isAnchor = template.t === ANCHOR;\n    this.type = this.isAnchor ? ANCHOR : COMPONENT; // override ELEMENT from super\n    let attrs = template.m;\n\n    const partials = template.p || {};\n    if (!('content' in partials)) partials.content = template.f || [];\n    this._partials = partials; // TEMP\n\n    if (this.isAnchor) {\n      this.name = template.n;\n\n      this.addChild = addChild;\n      this.removeChild = removeChild;\n    } else {\n      const instance = new ComponentConstructor({ component: true });\n\n      this.instance = instance;\n      this.name = template.e;\n\n      if (instance.el || instance.target) {\n        warnIfDebug(\n          `The <${this.name}> component has a default '${\n            instance.el ? 'el' : 'target'\n          }' property; it has been disregarded`\n        );\n        instance.el = instance.target = null;\n      }\n\n      // find container\n      let fragment = options.up;\n      let container;\n      while (fragment) {\n        if (fragment.owner.type === YIELDER) {\n          container = fragment.owner.container;\n          break;\n        }\n\n        fragment = fragment.parent;\n      }\n\n      // add component-instance-specific properties\n      instance.parent = this.up.ractive;\n      instance.container = container || null;\n      instance.root = instance.parent.root;\n      instance.component = this;\n\n      construct(this.instance, { partials }, ComponentConstructor);\n\n      // these can be modified during construction\n      template = this.template;\n      attrs = template.m;\n\n      // allow components that are so inclined to add programmatic mappings\n      if (isArray(this.mappings)) {\n        attrs = (attrs || []).concat(this.mappings);\n      } else if (isString(this.mappings)) {\n        attrs = (attrs || []).concat(parser.parse(this.mappings, { attributes: true }).t);\n      }\n\n      // for hackability, this could be an open option\n      // for any ractive instance, but for now, just\n      // for components and just for ractive...\n      instance._inlinePartials = partials;\n    }\n\n    this.attributeByName = {};\n    this.attributes = [];\n\n    if (attrs) {\n      const leftovers = [];\n      attrs.forEach(template => {\n        switch (template.t) {\n          case ATTRIBUTE:\n          case EVENT:\n            this.attributes.push(\n              createItem({\n                owner: this,\n                up: this.up,\n                template\n              })\n            );\n            break;\n\n          case TRANSITION:\n          case BINDING_FLAG:\n          case DECORATOR:\n            break;\n\n          default:\n            leftovers.push(template);\n            break;\n        }\n      });\n\n      if (leftovers.length) {\n        this.attributes.push(\n          new ConditionalAttribute({\n            owner: this,\n            up: this.up,\n            template: leftovers\n          })\n        );\n      }\n    }\n\n    this.eventHandlers = [];\n  }\n\n  bind() {\n    if (!this.isAnchor) {\n      this.attributes.forEach(bind);\n      this.eventHandlers.forEach(bind);\n\n      initialise(\n        this.instance,\n        {\n          partials: this._partials\n        },\n        {\n          cssIds: this.up.cssIds\n        }\n      );\n\n      if (this.instance.target || this.instance.el) this.extern = true;\n\n      this.bound = true;\n    }\n  }\n\n  bubble() {\n    if (!this.dirty) {\n      this.dirty = true;\n      this.up.bubble();\n    }\n  }\n\n  destroyed() {\n    if (!this.isAnchor && this.instance.fragment) this.instance.fragment.destroyed();\n  }\n\n  detach() {\n    if (this.isAnchor) {\n      if (this.instance) return this.instance.fragment.detach();\n      return createDocumentFragment();\n    }\n\n    return this.instance.fragment.detach();\n  }\n\n  find(selector, options) {\n    if (this.instance) return this.instance.fragment.find(selector, options);\n  }\n\n  findAll(selector, options) {\n    if (this.instance) this.instance.fragment.findAll(selector, options);\n  }\n\n  findComponent(name, options) {\n    if (!name || this.name === name) return this.instance;\n\n    if (this.instance.fragment) {\n      return this.instance.fragment.findComponent(name, options);\n    }\n  }\n\n  findAllComponents(name, options) {\n    const { result } = options;\n\n    if (this.instance && (!name || this.name === name)) {\n      result.push(this.instance);\n    }\n\n    if (this.instance) this.instance.findAllComponents(name, options);\n  }\n\n  firstNode(skipParent) {\n    if (this.instance) return this.instance.fragment.firstNode(skipParent);\n  }\n\n  getContext(...assigns) {\n    assigns.unshift(this.instance);\n    return getRactiveContext.apply(null, assigns);\n  }\n\n  rebound(update) {\n    this.attributes.forEach(x => x.rebound(update));\n  }\n\n  render(target, occupants) {\n    if (this.isAnchor) {\n      this.rendered = true;\n      this.target = target;\n\n      if (!checking.length) {\n        checking.push(this.ractive);\n        if (occupants) {\n          this.occupants = occupants;\n          checkAnchors();\n          this.occupants = null;\n        } else {\n          runloop.scheduleTask(checkAnchors, true);\n        }\n      }\n    } else {\n      this.attributes.forEach(callRender);\n      this.eventHandlers.forEach(callRender);\n\n      if (this.extern) {\n        this.instance.delegate = false;\n        this.instance.render();\n      } else {\n        render(this.instance, target, null, occupants);\n      }\n\n      this.rendered = true;\n    }\n  }\n\n  shuffled() {\n    super.shuffled();\n    this.instance &&\n      !this.instance.isolated &&\n      this.instance.fragment &&\n      this.instance.fragment.shuffled();\n  }\n\n  toString() {\n    if (this.instance) return this.instance.toHTML();\n  }\n\n  unbind(view) {\n    if (!this.isAnchor) {\n      this.bound = false;\n\n      this.attributes.forEach(unbind);\n\n      if (view) this.instance.fragment.unbind();\n      else teardown(this.instance, () => runloop.promise());\n    }\n  }\n\n  unrender(shouldDestroy) {\n    this.shouldDestroy = shouldDestroy;\n\n    if (this.isAnchor) {\n      if (this.item) unrenderItem(this, this.item);\n      this.target = null;\n      if (!checking.length) {\n        checking.push(this.ractive);\n        runloop.scheduleTask(checkAnchors, true);\n      }\n    } else {\n      this.instance.unrender();\n      this.instance.el = this.instance.target = null;\n      this.attributes.forEach(unrender);\n      this.eventHandlers.forEach(unrender);\n    }\n\n    this.rendered = false;\n  }\n\n  update() {\n    this.dirty = false;\n    if (this.instance) {\n      this.instance.fragment.update();\n      this.attributes.forEach(update);\n      this.eventHandlers.forEach(update);\n    }\n  }\n}\n\nfunction addChild(meta) {\n  if (this.item) this.removeChild(this.item);\n\n  const child = meta.instance;\n  meta.anchor = this;\n\n  meta.up = this.up;\n  meta.name = meta.nameOption || this.name;\n  this.name = meta.name;\n\n  if (!child.isolated) child.viewmodel.attached(this.up);\n\n  // render as necessary\n  if (this.rendered) {\n    renderItem(this, meta);\n  }\n}\n\nfunction removeChild(meta) {\n  // unrender as necessary\n  if (this.item === meta) {\n    unrenderItem(this, meta);\n    this.name = this.template.n;\n  }\n}\n\nfunction renderItem(anchor, meta) {\n  if (!anchor.rendered) return;\n\n  meta.shouldDestroy = false;\n  meta.up = anchor.up;\n\n  anchor.item = meta;\n  anchor.instance = meta.instance;\n  const nextNode = anchor.up.findNextNode(anchor);\n\n  if (meta.instance.fragment.rendered) {\n    meta.instance.unrender();\n  }\n\n  meta.partials = meta.instance.partials;\n  meta.instance.partials = assign(create(meta.partials), meta.partials, anchor._partials);\n\n  meta.instance.fragment.unbind(true);\n  meta.instance.fragment.componentParent = anchor.up;\n  meta.instance.fragment.bind(meta.instance.viewmodel);\n\n  anchor.attributes.forEach(bind);\n  anchor.eventHandlers.forEach(bind);\n  anchor.attributes.forEach(callRender);\n  anchor.eventHandlers.forEach(callRender);\n\n  const target = anchor.up.findParentNode();\n  render(meta.instance, target, target.contains(nextNode) ? nextNode : null, anchor.occupants);\n\n  if (meta.lastBound !== anchor) {\n    meta.lastBound = anchor;\n  }\n}\n\nfunction unrenderItem(anchor, meta) {\n  if (!anchor.rendered) return;\n\n  meta.shouldDestroy = true;\n  meta.instance.unrender();\n\n  anchor.eventHandlers.forEach(unrender);\n  anchor.attributes.forEach(unrender);\n  anchor.eventHandlers.forEach(unbind);\n  anchor.attributes.forEach(unbind);\n\n  meta.instance.el = meta.instance.anchor = null;\n  meta.instance.fragment.componentParent = null;\n  meta.up = null;\n  meta.anchor = null;\n  anchor.item = null;\n  anchor.instance = null;\n}\n\nlet checking = [];\nexport function checkAnchors() {\n  const list = checking;\n  checking = [];\n\n  list.forEach(updateAnchors);\n}\n","import { capture } from 'src/global/capture';\nimport Model from './Model';\nimport { handleChange, mark, marked } from 'shared/methodCallers';\nimport { hasOwn } from 'utils/object';\nimport { isUndefined } from 'utils/is';\n\nexport default class ComputationChild extends Model {\n  constructor(parent, key) {\n    super(parent, key);\n\n    this.isReadonly = !this.root.ractive.syncComputedChildren;\n    this.dirty = true;\n    this.isComputed = true;\n  }\n\n  get setRoot() {\n    return this.parent.setRoot;\n  }\n\n  applyValue(value) {\n    super.applyValue(value);\n\n    if (!this.isReadonly) {\n      let source = this.parent;\n      // computed models don't have a shuffle method\n      while (source && source.shuffle) {\n        source = source.parent;\n      }\n\n      if (source) {\n        source.dependencies.forEach(mark);\n      }\n    }\n\n    if (this.setRoot) {\n      this.setRoot.set(this.setRoot.value);\n    }\n  }\n\n  get(shouldCapture, opts) {\n    if (shouldCapture) capture(this);\n\n    if (this.dirty) {\n      const parentValue = this.parent.get();\n      this.value = parentValue ? parentValue[this.key] : undefined;\n      if (this.wrapper) this.newWrapperValue = this.value;\n      this.adapt();\n    }\n\n    this.dirty = false;\n\n    return (opts && 'unwrap' in opts ? opts.unwrap !== false : shouldCapture) && this.wrapper\n      ? this.wrapperValue\n      : this.value;\n  }\n\n  handleChange() {\n    if (this.dirty) {\n      this.deps.forEach(handleChange);\n      return;\n    }\n\n    this.dirty = true;\n\n    if (this.boundValue) this.boundValue = null;\n\n    this.links.forEach(marked);\n    this.deps.forEach(handleChange);\n    this.children.forEach(handleChange);\n  }\n\n  joinKey(key) {\n    if (isUndefined(key) || key === '') return this;\n\n    if (!hasOwn(this.childByKey, key)) {\n      const child = new ComputationChild(this, key);\n      this.children.push(child);\n      this.childByKey[key] = child;\n    }\n\n    return this.childByKey[key];\n  }\n}\n","/* global console */\n/* eslint no-console:\"off\" */\n\nimport { capture, startCapturing, stopCapturing } from 'src/global/capture';\nimport { warnIfDebug } from 'utils/log';\nimport Model, { shared } from './Model';\nimport { maybeBind, noVirtual } from './ModelBase';\nimport ComputationChild from './ComputationChild';\nimport { hasConsole } from 'config/environment';\nimport { isEqual } from 'utils/is';\nimport runloop from 'src/global/runloop';\n\nexport default class Computation extends Model {\n  constructor(parent, signature, key) {\n    super(parent, key);\n\n    this.signature = signature;\n\n    this.isReadonly = !this.signature.setter;\n    this.isComputed = true;\n\n    this.dependencies = [];\n\n    this.children = [];\n    this.childByKey = {};\n\n    this.deps = [];\n\n    this.dirty = true;\n\n    // TODO: is there a less hackish way to do this?\n    this.shuffle = undefined;\n  }\n\n  get setRoot() {\n    if (this.signature.setter) return this;\n  }\n\n  get(shouldCapture, opts) {\n    if (shouldCapture) capture(this);\n\n    if (this.dirty) {\n      const old = this.value;\n      this.value = this.getValue();\n      // this may cause a view somewhere to update, so it must be in a runloop\n      if (!runloop.active()) {\n        runloop.start();\n        if (!isEqual(old, this.value)) this.notifyUpstream();\n        runloop.end();\n      } else {\n        if (!isEqual(old, this.value)) this.notifyUpstream();\n      }\n      if (this.wrapper) this.newWrapperValue = this.value;\n      this.adapt();\n      this.dirty = false;\n    }\n\n    // if capturing, this value needs to be unwrapped because it's for external use\n    return maybeBind(\n      this,\n      // if unwrap is supplied, it overrides capture\n      this.wrapper && (opts && 'unwrap' in opts ? opts.unwrap !== false : shouldCapture)\n        ? this.wrapperValue\n        : this.value,\n      !opts || opts.shouldBind !== false\n    );\n  }\n\n  getContext() {\n    return this.parent.isRoot ? this.root.ractive : this.parent.get(false, noVirtual);\n  }\n\n  getValue() {\n    startCapturing();\n    let result;\n\n    try {\n      result = this.signature.getter.call(this.root.ractive, this.getContext(), this.getKeypath());\n    } catch (err) {\n      warnIfDebug(`Failed to compute ${this.getKeypath()}: ${err.message || err}`);\n\n      // TODO this is all well and good in Chrome, but...\n      // ...also, should encapsulate this stuff better, and only\n      // show it if Ractive.DEBUG\n      if (hasConsole) {\n        if (console.groupCollapsed)\n          console.groupCollapsed(\n            '%cshow details',\n            'color: rgb(82, 140, 224); font-weight: normal; text-decoration: underline;'\n          );\n        const sig = this.signature;\n        console.error(\n          `${err.name}: ${err.message}\\n\\n${sig.getterString}${\n            sig.getterUseStack ? '\\n\\n' + err.stack : ''\n          }`\n        );\n        if (console.groupCollapsed) console.groupEnd();\n      }\n    }\n\n    const dependencies = stopCapturing();\n    if (this.parent.keypath && !~dependencies.indexOf(this.parent)) dependencies.push(this.parent);\n    this.setDependencies(dependencies);\n\n    return result;\n  }\n\n  mark() {\n    this.handleChange();\n  }\n\n  rebind(next, previous) {\n    // computations will grab all of their deps again automagically\n    if (next !== previous) this.handleChange();\n  }\n\n  set(value) {\n    if (this.isReadonly) {\n      throw new Error(`Cannot set read-only computed value '${this.key}'`);\n    }\n\n    this.signature.setter(value, this.getContext(), this.getKeypath());\n    this.mark();\n  }\n\n  setDependencies(dependencies) {\n    // unregister any soft dependencies we no longer have\n    let i = this.dependencies.length;\n    while (i--) {\n      const model = this.dependencies[i];\n      if (!~dependencies.indexOf(model)) model.unregister(this);\n    }\n\n    // and add any new ones\n    i = dependencies.length;\n    while (i--) {\n      const model = dependencies[i];\n      if (!~this.dependencies.indexOf(model)) model.register(this);\n    }\n\n    this.dependencies = dependencies;\n  }\n\n  teardown() {\n    let i = this.dependencies.length;\n    while (i--) {\n      if (this.dependencies[i]) this.dependencies[i].unregister(this);\n    }\n    if (this.parent.computed[this.key] === this) delete this.parent.computed[this.key];\n    super.teardown();\n  }\n}\n\nconst prototype = Computation.prototype;\nconst child = ComputationChild.prototype;\nprototype.handleChange = child.handleChange;\nprototype.joinKey = child.joinKey;\n\nshared.Computation = Computation;\n","/* global console */\n/* eslint no-console:\"off\" */\n\nimport { hasConsole } from '../config/environment';\nimport Ractive from '../Ractive';\nimport noop from './noop';\nimport { isObjectType } from 'utils/is';\n\nconst alreadyWarned = {};\nlet log, printWarning, welcome;\n\nif (hasConsole) {\n  const welcomeIntro = [\n    `%cRactive.js %cBUILD_PLACEHOLDER_VERSION %cin debug mode, %cmore...`,\n    'color: rgb(114, 157, 52); font-weight: normal;',\n    'color: rgb(85, 85, 85); font-weight: normal;',\n    'color: rgb(85, 85, 85); font-weight: normal;',\n    'color: rgb(82, 140, 224); font-weight: normal; text-decoration: underline;'\n  ];\n  const welcomeMessage = `You're running Ractive BUILD_PLACEHOLDER_VERSION in debug mode - messages will be printed to the console to help you fix problems and optimise your application.\n\nTo disable debug mode, add this line at the start of your app:\n  Ractive.DEBUG = false;\n\nTo disable debug mode when your app is minified, add this snippet:\n  Ractive.DEBUG = /unminified/.test(function(){/*unminified*/});\n\nGet help and support:\n  http://ractive.js.org\n  http://stackoverflow.com/questions/tagged/ractivejs\n  http://groups.google.com/forum/#!forum/ractive-js\n  http://twitter.com/ractivejs\n\nFound a bug? Raise an issue:\n  https://github.com/ractivejs/ractive/issues\n\n`;\n\n  welcome = () => {\n    if (Ractive.WELCOME_MESSAGE === false) {\n      welcome = noop;\n      return;\n    }\n    const message = 'WELCOME_MESSAGE' in Ractive ? Ractive.WELCOME_MESSAGE : welcomeMessage;\n    const hasGroup = !!console.groupCollapsed;\n    if (hasGroup) console.groupCollapsed.apply(console, welcomeIntro);\n    console.log(message);\n    if (hasGroup) {\n      console.groupEnd(welcomeIntro);\n    }\n\n    welcome = noop;\n  };\n\n  printWarning = (message, args) => {\n    welcome();\n\n    // extract information about the instance this message pertains to, if applicable\n    if (isObjectType(args[args.length - 1])) {\n      const options = args.pop();\n      const ractive = options ? options.ractive : null;\n\n      if (ractive) {\n        // if this is an instance of a component that we know the name of, add\n        // it to the message\n        let name;\n        if (ractive.component && (name = ractive.component.name)) {\n          message = `<${name}> ${message}`;\n        }\n\n        let node;\n        if (\n          (node =\n            options.node || (ractive.fragment && ractive.fragment.rendered && ractive.find('*')))\n        ) {\n          args.push(node);\n        }\n      }\n    }\n\n    console.warn.apply(\n      console,\n      ['%cRactive.js: %c' + message, 'color: rgb(114, 157, 52);', 'color: rgb(85, 85, 85);'].concat(\n        args\n      )\n    );\n  };\n\n  log = function() {\n    console.log.apply(console, arguments);\n  };\n} else {\n  printWarning = log = welcome = noop;\n}\n\nfunction format(message, args) {\n  return message.replace(/%s/g, () => args.shift());\n}\n\nfunction fatal(message, ...args) {\n  message = format(message, args);\n  throw new Error(message);\n}\n\nfunction logIfDebug() {\n  if (Ractive.DEBUG) {\n    log.apply(null, arguments);\n  }\n}\n\nfunction warn(message, ...args) {\n  message = format(message, args);\n  printWarning(message, args);\n}\n\nfunction warnOnce(message, ...args) {\n  message = format(message, args);\n\n  if (alreadyWarned[message]) {\n    return;\n  }\n\n  alreadyWarned[message] = true;\n  printWarning(message, args);\n}\n\nfunction warnIfDebug() {\n  if (Ractive.DEBUG) {\n    warn.apply(null, arguments);\n  }\n}\n\nfunction warnOnceIfDebug() {\n  if (Ractive.DEBUG) {\n    warnOnce.apply(null, arguments);\n  }\n}\n\nexport { fatal, log, logIfDebug, warn, warnOnce, warnIfDebug, warnOnceIfDebug, welcome };\n","// Error messages that are used (or could be) in multiple places\nexport const badArguments = 'Bad arguments';\nexport const noRegistryFunctionReturn =\n  'A function was specified for \"%s\" %s, but no %s was returned';\nexport const missingPlugin = (name, type) =>\n  `Missing \"${name}\" ${type} plugin. You may need to download a plugin via http://ractive.js.org/integrations/#${type}s`;\n","import { isArray, isObject, isNumeric } from 'utils/is';\nimport interpolate from 'shared/interpolate';\nimport { hasOwn } from 'utils/object';\n\nconst interpolators = {\n  number(from, to) {\n    if (!isNumeric(from) || !isNumeric(to)) {\n      return null;\n    }\n\n    from = +from;\n    to = +to;\n\n    const delta = to - from;\n\n    if (!delta) {\n      return function() {\n        return from;\n      };\n    }\n\n    return function(t) {\n      return from + t * delta;\n    };\n  },\n\n  array(from, to) {\n    let len, i;\n\n    if (!isArray(from) || !isArray(to)) {\n      return null;\n    }\n\n    const intermediate = [];\n    const interpolators = [];\n\n    i = len = Math.min(from.length, to.length);\n    while (i--) {\n      interpolators[i] = interpolate(from[i], to[i]);\n    }\n\n    // surplus values - don't interpolate, but don't exclude them either\n    for (i = len; i < from.length; i += 1) {\n      intermediate[i] = from[i];\n    }\n\n    for (i = len; i < to.length; i += 1) {\n      intermediate[i] = to[i];\n    }\n\n    return function(t) {\n      let i = len;\n\n      while (i--) {\n        intermediate[i] = interpolators[i](t);\n      }\n\n      return intermediate;\n    };\n  },\n\n  object(from, to) {\n    if (!isObject(from) || !isObject(to)) {\n      return null;\n    }\n\n    const properties = [];\n    const intermediate = {};\n    const interpolators = {};\n\n    for (const prop in from) {\n      if (hasOwn(from, prop)) {\n        if (hasOwn(to, prop)) {\n          properties.push(prop);\n          interpolators[prop] = interpolate(from[prop], to[prop]) || (() => to[prop]);\n        } else {\n          intermediate[prop] = from[prop];\n        }\n      }\n    }\n\n    for (const prop in to) {\n      if (hasOwn(to, prop) && !hasOwn(from, prop)) {\n        intermediate[prop] = to[prop];\n      }\n    }\n\n    const len = properties.length;\n\n    return function(t) {\n      let i = len;\n\n      while (i--) {\n        const prop = properties[i];\n\n        intermediate[prop] = interpolators[prop](t);\n      }\n\n      return intermediate;\n    };\n  }\n};\n\nexport default interpolators;\n","import { isString } from 'utils/is';\n\nconst refPattern = /\\[\\s*(\\*|[0-9]|[1-9][0-9]+)\\s*\\]/g;\nconst splitPattern = /([^\\\\](?:\\\\\\\\)*)\\./;\nconst escapeKeyPattern = /\\\\|\\./g;\nconst unescapeKeyPattern = /((?:\\\\)+)\\1|\\\\(\\.)/g;\n\nexport function escapeKey(key) {\n  if (isString(key)) {\n    return key.replace(escapeKeyPattern, '\\\\$&');\n  }\n\n  return key;\n}\n\nexport function normalise(ref) {\n  return ref ? ref.replace(refPattern, '.$1') : '';\n}\n\nexport function splitKeypath(keypath) {\n  const result = [];\n  let match;\n\n  keypath = normalise(keypath);\n\n  while ((match = splitPattern.exec(keypath))) {\n    const index = match.index + match[1].length;\n    result.push(keypath.substr(0, index));\n    keypath = keypath.substr(index + 1);\n  }\n\n  result.push(keypath);\n\n  return result;\n}\n\nexport function unescapeKey(key) {\n  if (isString(key)) {\n    return key.replace(unescapeKeyPattern, '$1$2');\n  }\n\n  return key;\n}\n","const fnBind = Function.prototype.bind;\n\nexport default function bind(fn, context) {\n  if (!/this/.test(fn.toString())) return fn;\n\n  const bound = fnBind.call(fn, context);\n  for (const prop in fn) bound[prop] = fn[prop];\n\n  return bound;\n}\n","import { escapeKey, unescapeKey } from 'shared/keypaths';\nimport { addToArray, removeFromArray } from 'utils/array';\nimport { isArray, isObject, isObjectLike, isFunction } from 'utils/is';\nimport bind from 'utils/bind';\nimport { create, keys as objectKeys } from 'utils/object';\n\nconst shuffleTasks = { early: [], mark: [] };\nconst registerQueue = { early: [], mark: [] };\nexport const noVirtual = { virtual: false };\n\nexport default class ModelBase {\n  constructor(parent) {\n    this.deps = [];\n\n    this.children = [];\n    this.childByKey = {};\n    this.links = [];\n\n    this.bindings = [];\n\n    if (parent) {\n      this.parent = parent;\n      this.root = parent.root;\n    }\n  }\n\n  addShuffleTask(task, stage = 'early') {\n    shuffleTasks[stage].push(task);\n  }\n  addShuffleRegister(item, stage = 'early') {\n    registerQueue[stage].push({ model: this, item });\n  }\n\n  downstreamChanged() {}\n\n  findMatches(keys) {\n    const len = keys.length;\n\n    let existingMatches = [this];\n    let matches;\n    let i;\n\n    for (i = 0; i < len; i += 1) {\n      const key = keys[i];\n\n      if (key === '*') {\n        matches = [];\n        existingMatches.forEach(model => {\n          matches.push.apply(matches, model.getValueChildren(model.get()));\n        });\n      } else {\n        matches = existingMatches.map(model => model.joinKey(key));\n      }\n\n      existingMatches = matches;\n    }\n\n    return matches;\n  }\n\n  getKeypath(ractive) {\n    if (ractive !== this.ractive && this._link) return this._link.target.getKeypath(ractive);\n\n    if (!this.keypath) {\n      const parent = this.parent && this.parent.getKeypath(ractive);\n      this.keypath = parent\n        ? `${this.parent.getKeypath(ractive)}.${escapeKey(this.key)}`\n        : escapeKey(this.key);\n    }\n\n    return this.keypath;\n  }\n\n  getValueChildren(value) {\n    let children;\n    if (isArray(value)) {\n      children = [];\n      if ('length' in this && this.length !== value.length) {\n        children.push(this.joinKey('length'));\n      }\n      value.forEach((m, i) => {\n        children.push(this.joinKey(i));\n      });\n    } else if (isObject(value) || isFunction(value)) {\n      children = objectKeys(value).map(key => this.joinKey(escapeKey(key)));\n    } else if (value != null) {\n      children = [];\n    }\n\n    const computed = this.computed;\n    if (computed) {\n      children.push.apply(children, objectKeys(computed).map(k => this.joinKey(k)));\n    }\n\n    return children;\n  }\n\n  getVirtual(shouldCapture) {\n    const value = this.get(shouldCapture, { virtual: false });\n    if (isObjectLike(value)) {\n      const result = isArray(value) ? [] : create(null);\n\n      let keys = objectKeys(value);\n      let i = keys.length;\n      while (i--) {\n        const child = this.childByKey[keys[i]];\n        if (!child) result[keys[i]] = value[keys[i]];\n        else if (child._link) result[keys[i]] = child._link.getVirtual();\n        else result[keys[i]] = child.getVirtual();\n      }\n\n      i = this.children.length;\n      while (i--) {\n        const child = this.children[i];\n        if (!(child.key in result) && child._link) {\n          result[child.key] = child._link.getVirtual();\n        }\n      }\n\n      if (this.computed) {\n        keys = objectKeys(this.computed);\n        i = keys.length;\n        while (i--) {\n          result[keys[i]] = this.computed[keys[i]].get();\n        }\n      }\n\n      return result;\n    } else return value;\n  }\n\n  has(key) {\n    if (this._link) return this._link.has(key);\n\n    const value = this.get(false, noVirtual);\n    if (!value) return false;\n\n    key = unescapeKey(key);\n    if ((isFunction(value) || isObject(value)) && key in value) return true;\n\n    let computed = this.computed;\n    if (computed && key in this.computed) return true;\n\n    computed = this.root.ractive && this.root.ractive.computed;\n    if (computed) {\n      objectKeys(computed).forEach(k => {\n        if (computed[k].pattern && computed[k].pattern.test(this.getKeypath())) return true;\n      });\n    }\n\n    return false;\n  }\n\n  joinAll(keys, opts) {\n    let model = this;\n    for (let i = 0; i < keys.length; i += 1) {\n      if (\n        opts &&\n        opts.lastLink === false &&\n        i + 1 === keys.length &&\n        model.childByKey[keys[i]] &&\n        model.childByKey[keys[i]]._link\n      )\n        return model.childByKey[keys[i]];\n      model = model.joinKey(keys[i], opts);\n    }\n\n    return model;\n  }\n\n  notifyUpstream(startPath) {\n    let parent = this.parent;\n    const path = startPath || [this.key];\n    while (parent) {\n      if (parent.patterns) parent.patterns.forEach(o => o.notify(path.slice()));\n      path.unshift(parent.key);\n      parent.links.forEach(l => l.notifiedUpstream(path, this.root));\n      parent.deps.forEach(d => d.handleChange(path));\n      parent.downstreamChanged(startPath);\n      parent = parent.parent;\n    }\n  }\n\n  rebind(next, previous, safe) {\n    if (this._link) {\n      this._link.rebind(next, previous, false);\n    }\n\n    if (next === this) return;\n\n    // tell the deps to move to the new target\n    let i = this.deps.length;\n    while (i--) {\n      if (this.deps[i].rebind) this.deps[i].rebind(next, previous, safe);\n    }\n\n    i = this.links.length;\n    while (i--) {\n      const link = this.links[i];\n      // only relink the root of the link tree\n      if (link.owner && link.owner._link) link.relinking(next, safe);\n    }\n\n    i = this.children.length;\n    while (i--) {\n      const child = this.children[i];\n      child.rebind(next ? next.joinKey(child.key) : undefined, child._link || child, safe);\n      if (this.dataModel) {\n        this.addShuffleTask(() => checkDataLink(this, this.retrieve()), 'early');\n      }\n    }\n\n    i = this.bindings.length;\n    while (i--) {\n      this.bindings[i].rebind(next, previous, safe);\n    }\n  }\n\n  reference() {\n    'refs' in this ? this.refs++ : (this.refs = 1);\n  }\n\n  register(dep) {\n    this.deps.push(dep);\n  }\n\n  registerLink(link) {\n    addToArray(this.links, link);\n  }\n\n  registerPatternObserver(observer) {\n    (this.patterns || (this.patterns = [])).push(observer);\n    this.register(observer);\n  }\n\n  registerTwowayBinding(binding) {\n    this.bindings.push(binding);\n  }\n\n  unreference() {\n    if ('refs' in this) this.refs--;\n  }\n\n  unregister(dep) {\n    removeFromArray(this.deps, dep);\n  }\n\n  unregisterLink(link) {\n    removeFromArray(this.links, link);\n  }\n\n  unregisterPatternObserver(observer) {\n    removeFromArray(this.patterns, observer);\n    this.unregister(observer);\n  }\n\n  unregisterTwowayBinding(binding) {\n    removeFromArray(this.bindings, binding);\n  }\n\n  updateFromBindings(cascade) {\n    let i = this.bindings.length;\n    while (i--) {\n      const value = this.bindings[i].getValue();\n      if (value !== this.value) this.set(value);\n    }\n\n    // check for one-way bindings if there are no two-ways\n    if (!this.bindings.length) {\n      const oneway = findBoundValue(this.deps);\n      if (oneway && oneway.value !== this.value) this.set(oneway.value);\n    }\n\n    if (cascade) {\n      this.children.forEach(updateFromBindings);\n      this.links.forEach(updateFromBindings);\n      if (this._link) this._link.updateFromBindings(cascade);\n    }\n  }\n}\n\n// TODO: this may be better handled by overriding `get` on models with a parent that isRoot\nexport function maybeBind(model, value, shouldBind) {\n  if (shouldBind && isFunction(value) && model.parent && model.parent.isRoot) {\n    if (!model.boundValue) {\n      model.boundValue = bind(value._r_unbound || value, model.parent.ractive);\n    }\n\n    return model.boundValue;\n  }\n\n  return value;\n}\n\nfunction updateFromBindings(model) {\n  model.updateFromBindings(true);\n}\n\nexport function findBoundValue(list) {\n  let i = list.length;\n  while (i--) {\n    if (list[i].bound) {\n      const owner = list[i].owner;\n      if (owner) {\n        const value = owner.name === 'checked' ? owner.node.checked : owner.node.value;\n        return { value };\n      }\n    }\n  }\n}\n\nexport function fireShuffleTasks(stage) {\n  if (!stage) {\n    fireShuffleTasks('early');\n    fireShuffleTasks('mark');\n  } else {\n    const tasks = shuffleTasks[stage];\n    shuffleTasks[stage] = [];\n    let i = tasks.length;\n    while (i--) tasks[i]();\n\n    const register = registerQueue[stage];\n    registerQueue[stage] = [];\n    i = register.length;\n    while (i--) register[i].model.register(register[i].item);\n  }\n}\n\nexport function shuffle(model, newIndices, link, unsafe) {\n  model.shuffling = true;\n\n  let upstream = model.source().length !== model.source().value.length;\n  let i = newIndices.length;\n  while (i--) {\n    const idx = newIndices[i];\n    // nothing is actually changing, so move in the index and roll on\n    if (i === idx) {\n      continue;\n    }\n\n    upstream = true;\n\n    // rebind the children on i to idx\n    if (i in model.childByKey)\n      model.childByKey[i].rebind(\n        !~idx ? undefined : model.joinKey(idx),\n        model.childByKey[i],\n        !unsafe\n      );\n  }\n\n  model.links.forEach(l => l.shuffle(newIndices));\n  if (!link) fireShuffleTasks('early');\n\n  i = model.deps.length;\n  while (i--) {\n    if (model.deps[i].shuffle) model.deps[i].shuffle(newIndices);\n  }\n\n  model[link ? 'marked' : 'mark']();\n  if (!link) fireShuffleTasks('mark');\n\n  if (upstream) model.notifyUpstream();\n\n  model.shuffling = false;\n}\n\nexport function checkDataLink(model, value) {\n  if (value !== model.dataModel) {\n    if (value && value.viewmodel && value.viewmodel.isRoot && model.childByKey.data) {\n      model.childByKey.data.link(value.viewmodel, 'data');\n      model.dataModel = value;\n    } else if (model.dataModel) {\n      model.childByKey.data.unlink();\n      model.dataModel = true;\n    }\n  }\n}\n","import { addToArray } from '../utils/array';\n\nconst stack = [];\nlet captureGroup;\n\nexport function startCapturing() {\n  stack.push((captureGroup = []));\n}\n\nexport function stopCapturing() {\n  const dependencies = stack.pop();\n  captureGroup = stack[stack.length - 1];\n  return dependencies;\n}\n\nexport function capture(model) {\n  if (captureGroup) {\n    addToArray(captureGroup, model);\n  }\n}\n","import ModelBase, { fireShuffleTasks, maybeBind, shuffle } from './ModelBase';\nimport { capture } from '../global/capture';\nimport { handleChange, marked, markedAll, teardown } from 'shared/methodCallers';\nimport { rebindMatch } from 'shared/rebind';\nimport resolveReference from 'src/view/resolvers/resolveReference';\nimport noop from 'utils/noop';\nimport { hasOwn } from 'utils/object';\nimport { isUndefined } from 'utils/is';\n\n// temporary placeholder target for detached implicit links\nexport const Missing = {\n  key: '@missing',\n  animate: noop,\n  applyValue: noop,\n  get: noop,\n  getKeypath() {\n    return this.key;\n  },\n  joinAll() {\n    return this;\n  },\n  joinKey() {\n    return this;\n  },\n  mark: noop,\n  registerLink: noop,\n  shufle: noop,\n  set: noop,\n  unregisterLink: noop\n};\nMissing.parent = Missing;\n\nexport default class LinkModel extends ModelBase {\n  constructor(parent, owner, target, key) {\n    super(parent);\n\n    this.owner = owner;\n    this.target = target;\n    this.key = isUndefined(key) ? owner.key : key;\n    if (owner && owner.isLink) this.sourcePath = `${owner.sourcePath}.${this.key}`;\n\n    if (target) target.registerLink(this);\n\n    if (parent) this.isReadonly = parent.isReadonly;\n\n    this.isLink = true;\n  }\n\n  animate(from, to, options, interpolator) {\n    return this.target.animate(from, to, options, interpolator);\n  }\n\n  applyValue(value) {\n    if (this.boundValue) this.boundValue = null;\n    this.target.applyValue(value);\n  }\n\n  attach(fragment) {\n    const model = resolveReference(fragment, this.key);\n    if (model) {\n      this.relinking(model, false);\n    } else {\n      // if there is no link available, move everything here to real models\n      this.owner.unlink();\n    }\n  }\n\n  detach() {\n    this.relinking(Missing, false);\n  }\n\n  get(shouldCapture, opts = {}) {\n    if (shouldCapture) {\n      capture(this);\n\n      // may need to tell the target to unwrap\n      opts.unwrap = 'unwrap' in opts ? opts.unwrap : true;\n    }\n\n    const bind = 'shouldBind' in opts ? opts.shouldBind : true;\n    opts.shouldBind = this.mapping && this.target.parent && this.target.parent.isRoot;\n\n    return maybeBind(this, this.target.get(false, opts), bind);\n  }\n\n  getKeypath(ractive) {\n    if (ractive && ractive !== this.root.ractive) return this.target.getKeypath(ractive);\n\n    return super.getKeypath(ractive);\n  }\n\n  handleChange() {\n    this.deps.forEach(handleChange);\n    this.links.forEach(handleChange);\n    this.notifyUpstream();\n  }\n\n  isDetached() {\n    return this.virtual && this.target === Missing;\n  }\n\n  joinKey(key) {\n    // TODO: handle nested links\n    if (isUndefined(key) || key === '') return this;\n\n    if (!hasOwn(this.childByKey, key)) {\n      const child = new LinkModel(this, this, this.target.joinKey(key), key);\n      this.children.push(child);\n      this.childByKey[key] = child;\n    }\n\n    return this.childByKey[key];\n  }\n\n  mark(force) {\n    this.target.mark(force);\n  }\n\n  marked() {\n    if (this.boundValue) this.boundValue = null;\n\n    this.links.forEach(marked);\n\n    this.deps.forEach(handleChange);\n  }\n\n  markedAll() {\n    this.children.forEach(markedAll);\n    this.marked();\n  }\n\n  notifiedUpstream(startPath, root) {\n    this.links.forEach(l => l.notifiedUpstream(startPath, this.root));\n    this.deps.forEach(handleChange);\n    if (startPath && this.rootLink) {\n      const parent = this.parent;\n      if (this.root !== root) {\n        const path = startPath.slice(1);\n        path.unshift(this.key);\n        this.notifyUpstream(path);\n      } else if (parent && parent !== this.target) {\n        const path = [parent.key, this.key];\n        parent.links.forEach(l => l.notifiedUpstream(path, parent.root));\n        parent.deps.forEach(d => d.handleChange(path));\n        parent.notifyUpstream(path);\n      }\n    }\n  }\n\n  relinked() {\n    this.target.registerLink(this);\n    this.children.forEach(c => c.relinked());\n  }\n\n  relinking(target, safe) {\n    if (this.rootLink && this.sourcePath)\n      target = rebindMatch(this.sourcePath, target, this.target);\n    if (!target || this.target === target) return;\n\n    this.target && this.target.unregisterLink(this);\n\n    this.target = target;\n    this.children.forEach(c => {\n      c.relinking(target.joinKey(c.key), safe);\n    });\n\n    if (!safe) this.keypath = undefined;\n\n    if (this.rootLink)\n      this.addShuffleTask(() => {\n        this.relinked();\n        if (!safe) {\n          this.markedAll();\n          this.notifyUpstream();\n        }\n      });\n  }\n\n  set(value) {\n    if (this.boundValue) this.boundValue = null;\n    this.target.set(value);\n  }\n\n  shuffle(newIndices) {\n    // watch for extra shuffles caused by a shuffle in a downstream link\n    if (this.shuffling) return;\n\n    // let the real model handle firing off shuffles\n    if (!this.target.shuffling) {\n      if (this.target.shuffle) {\n        this.target.shuffle(newIndices);\n      } else {\n        // the target is a computation, which can't shuffle\n        this.target.mark();\n      }\n    } else {\n      shuffle(this, newIndices, true);\n    }\n  }\n\n  source() {\n    if (this.target.source) return this.target.source();\n    else return this.target;\n  }\n\n  teardown() {\n    if (this._link) this._link.teardown();\n    this.target.unregisterLink(this);\n    this.children.forEach(teardown);\n  }\n}\n\nModelBase.prototype.link = function link(model, keypath, options) {\n  const lnk = this._link || new LinkModel(this.parent, this, model, this.key);\n  lnk.implicit = options && options.implicit;\n  lnk.mapping = options && options.mapping;\n  lnk.sourcePath = keypath;\n  lnk.rootLink = true;\n  if (this._link) this._link.relinking(model, false);\n  this._link = lnk;\n  this.rebind(lnk, this, false);\n  fireShuffleTasks();\n\n  lnk.markedAll();\n\n  this.notifyUpstream();\n  return lnk;\n};\n\nModelBase.prototype.unlink = function unlink() {\n  if (this._link) {\n    const ln = this._link;\n    this._link = undefined;\n    ln.rebind(this, ln, false);\n    fireShuffleTasks();\n    ln.teardown();\n    this.notifyUpstream();\n  }\n};\n","import { createFunction } from '../Ractive/config/runtime-parser';\nimport { create, keys } from 'utils/object';\n\nconst functions = create(null);\n\nexport default function getFunction(str, i) {\n  if (functions[str]) return functions[str];\n  return (functions[str] = createFunction(str, i));\n}\n\nexport function addFunctions(template) {\n  if (!template) return;\n\n  const exp = template.e;\n\n  if (!exp) return;\n\n  keys(exp).forEach(str => {\n    if (functions[str]) return;\n    functions[str] = exp[str];\n  });\n}\n","export const TEMPLATE_VERSION = 4;\n","import { warnIfDebug } from 'utils/log';\nimport { create, hasOwn } from 'utils/object';\n\nconst leadingWhitespace = /^\\s+/;\n\nconst ParseError = function(message) {\n  this.name = 'ParseError';\n  this.message = message;\n  try {\n    throw new Error(message);\n  } catch (e) {\n    this.stack = e.stack;\n  }\n};\n\nParseError.prototype = Error.prototype;\n\nconst Parser = function(str, options) {\n  let item;\n  let lineStart = 0;\n\n  this.str = str;\n  this.options = options || {};\n  this.pos = 0;\n\n  this.lines = this.str.split('\\n');\n  this.lineEnds = this.lines.map(line => {\n    const lineEnd = lineStart + line.length + 1; // +1 for the newline\n\n    lineStart = lineEnd;\n    return lineEnd;\n  }, 0);\n\n  // Custom init logic\n  if (this.init) this.init(str, options);\n\n  const items = [];\n\n  while (this.pos < this.str.length && (item = this.read())) {\n    items.push(item);\n  }\n\n  this.leftover = this.remaining();\n  this.result = this.postProcess ? this.postProcess(items, options) : items;\n};\n\nParser.prototype = {\n  read(converters) {\n    let i, item;\n\n    if (!converters) converters = this.converters;\n\n    const pos = this.pos;\n\n    const len = converters.length;\n    for (i = 0; i < len; i += 1) {\n      this.pos = pos; // reset for each attempt\n\n      if ((item = converters[i](this))) {\n        return item;\n      }\n    }\n\n    return null;\n  },\n\n  getContextMessage(pos, message) {\n    const [lineNum, columnNum] = this.getLinePos(pos);\n    if (this.options.contextLines === -1) {\n      return [lineNum, columnNum, `${message} at line ${lineNum} character ${columnNum}`];\n    }\n\n    const line = this.lines[lineNum - 1];\n\n    let contextUp = '';\n    let contextDown = '';\n    if (this.options.contextLines) {\n      const start =\n        lineNum - 1 - this.options.contextLines < 0 ? 0 : lineNum - 1 - this.options.contextLines;\n      contextUp = this.lines\n        .slice(start, lineNum - 1 - start)\n        .join('\\n')\n        .replace(/\\t/g, '  ');\n      contextDown = this.lines\n        .slice(lineNum, lineNum + this.options.contextLines)\n        .join('\\n')\n        .replace(/\\t/g, '  ');\n      if (contextUp) {\n        contextUp += '\\n';\n      }\n      if (contextDown) {\n        contextDown = '\\n' + contextDown;\n      }\n    }\n\n    let numTabs = 0;\n    const annotation =\n      contextUp +\n      line.replace(/\\t/g, (match, char) => {\n        if (char < columnNum) {\n          numTabs += 1;\n        }\n\n        return '  ';\n      }) +\n      '\\n' +\n      new Array(columnNum + numTabs).join(' ') +\n      '^----' +\n      contextDown;\n\n    return [\n      lineNum,\n      columnNum,\n      `${message} at line ${lineNum} character ${columnNum}:\\n${annotation}`\n    ];\n  },\n\n  getLinePos(char) {\n    let lineNum = 0;\n    let lineStart = 0;\n\n    while (char >= this.lineEnds[lineNum]) {\n      lineStart = this.lineEnds[lineNum];\n      lineNum += 1;\n    }\n\n    const columnNum = char - lineStart;\n    return [lineNum + 1, columnNum + 1, char]; // line/col should be one-based, not zero-based!\n  },\n\n  error(message) {\n    const [lineNum, columnNum, msg] = this.getContextMessage(this.pos, message);\n\n    const error = new ParseError(msg);\n\n    error.line = lineNum;\n    error.character = columnNum;\n    error.shortMessage = message;\n\n    throw error;\n  },\n\n  matchString(string) {\n    if (this.str.substr(this.pos, string.length) === string) {\n      this.pos += string.length;\n      return string;\n    }\n  },\n\n  matchPattern(pattern) {\n    let match;\n\n    if ((match = pattern.exec(this.remaining()))) {\n      this.pos += match[0].length;\n      return match[1] || match[0];\n    }\n  },\n\n  sp() {\n    this.matchPattern(leadingWhitespace);\n  },\n\n  remaining() {\n    return this.str.substring(this.pos);\n  },\n\n  nextChar() {\n    return this.str.charAt(this.pos);\n  },\n\n  warn(message) {\n    const msg = this.getContextMessage(this.pos, message)[2];\n\n    warnIfDebug(msg);\n  }\n};\n\nParser.extend = function(proto) {\n  const Parent = this;\n  const Child = function(str, options) {\n    Parser.call(this, str, options);\n  };\n\n  Child.prototype = create(Parent.prototype);\n\n  for (const key in proto) {\n    if (hasOwn(proto, key)) {\n      Child.prototype[key] = proto[key];\n    }\n  }\n\n  Child.extend = Parser.extend;\n  return Child;\n};\n\nexport default Parser;\n","export const TEXT = 1;\nexport const INTERPOLATOR = 2;\nexport const TRIPLE = 3;\nexport const SECTION = 4;\nexport const INVERTED = 5;\nexport const CLOSING = 6;\nexport const ELEMENT = 7;\nexport const PARTIAL = 8;\nexport const COMMENT = 9;\nexport const DELIMCHANGE = 10;\nexport const ANCHOR = 11;\nexport const ATTRIBUTE = 13;\nexport const CLOSING_TAG = 14;\nexport const COMPONENT = 15;\nexport const YIELDER = 16;\nexport const INLINE_PARTIAL = 17;\nexport const DOCTYPE = 18;\nexport const ALIAS = 19;\n\nexport const AWAIT = 55;\n\nexport const NUMBER_LITERAL = 20;\nexport const STRING_LITERAL = 21;\nexport const ARRAY_LITERAL = 22;\nexport const OBJECT_LITERAL = 23;\nexport const BOOLEAN_LITERAL = 24;\nexport const REGEXP_LITERAL = 25;\n\nexport const GLOBAL = 26;\nexport const KEY_VALUE_PAIR = 27;\n\nexport const REFERENCE = 30;\nexport const REFINEMENT = 31;\nexport const MEMBER = 32;\nexport const PREFIX_OPERATOR = 33;\nexport const BRACKETED = 34;\nexport const CONDITIONAL = 35;\nexport const INFIX_OPERATOR = 36;\n\nexport const INVOCATION = 40;\n\nexport const SECTION_IF = 50;\nexport const SECTION_UNLESS = 51;\nexport const SECTION_EACH = 52;\nexport const SECTION_WITH = 53;\nexport const SECTION_IF_WITH = 54;\n\nexport const ELSE = 60;\nexport const ELSEIF = 61;\nexport const THEN = 62;\nexport const CATCH = 63;\n\nexport const EVENT = 70;\nexport const DECORATOR = 71;\nexport const TRANSITION = 72;\nexport const BINDING_FLAG = 73;\nexport const DELEGATE_FLAG = 74;\n","import { PREFIX_OPERATOR } from 'config/types';\nimport { expectedExpression } from './shared/errors';\nimport readMemberOrInvocation from './readMemberOrInvocation';\nimport readExpression from '../readExpression';\n\nlet readTypeOf;\n\nconst makePrefixSequenceMatcher = function(symbol, fallthrough) {\n  return function(parser) {\n    let expression;\n\n    if ((expression = fallthrough(parser))) {\n      return expression;\n    }\n\n    if (!parser.matchString(symbol)) {\n      return null;\n    }\n\n    parser.sp();\n\n    expression = readExpression(parser);\n    if (!expression) {\n      parser.error(expectedExpression);\n    }\n\n    return {\n      s: symbol,\n      o: expression,\n      t: PREFIX_OPERATOR\n    };\n  };\n};\n\n// create all prefix sequence matchers, return readTypeOf\n(function() {\n  let i, len, matcher, fallthrough;\n\n  const prefixOperators = '! ~ + - typeof'.split(' ');\n\n  fallthrough = readMemberOrInvocation;\n  for (i = 0, len = prefixOperators.length; i < len; i += 1) {\n    matcher = makePrefixSequenceMatcher(prefixOperators[i], fallthrough);\n    fallthrough = matcher;\n  }\n\n  // typeof operator is higher precedence than multiplication, so provides the\n  // fallthrough for the multiplication sequence matcher we're about to create\n  // (we're skipping void and delete)\n  readTypeOf = fallthrough;\n})();\n\nexport default readTypeOf;\n","const delimiterChangePattern = /^[^\\s=]+/;\nconst whitespacePattern = /^\\s+/;\n\nexport default function readDelimiterChange(parser) {\n  if (!parser.matchString('=')) {\n    return null;\n  }\n\n  const start = parser.pos;\n\n  // allow whitespace before new opening delimiter\n  parser.sp();\n\n  const opening = parser.matchPattern(delimiterChangePattern);\n  if (!opening) {\n    parser.pos = start;\n    return null;\n  }\n\n  // allow whitespace (in fact, it's necessary...)\n  if (!parser.matchPattern(whitespacePattern)) {\n    return null;\n  }\n\n  const closing = parser.matchPattern(delimiterChangePattern);\n  if (!closing) {\n    parser.pos = start;\n    return null;\n  }\n\n  // allow whitespace before closing '='\n  parser.sp();\n\n  if (!parser.matchString('=')) {\n    parser.pos = start;\n    return null;\n  }\n\n  return [opening, closing];\n}\n","import { REGEXP_LITERAL } from '../../../../../config/types';\n\nconst regexpPattern = /^(\\/(?:[^\\n\\r\\u2028\\u2029/\\\\[]|\\\\.|\\[(?:[^\\n\\r\\u2028\\u2029\\]\\\\]|\\\\.)*])+\\/(?:([gimuy])(?![a-z]*\\2))*(?![a-zA-Z_$0-9]))/;\n\nexport default function readNumberLiteral(parser) {\n  let result;\n\n  if ((result = parser.matchPattern(regexpPattern))) {\n    return {\n      t: REGEXP_LITERAL,\n      v: result\n    };\n  }\n\n  return null;\n}\n","const pattern = /[-/\\\\^$*+?.()|[\\]{}]/g;\n\nexport default function escapeRegExp(str) {\n  return str.replace(pattern, '\\\\$&');\n}\n","import escapeRegExp from 'utils/escapeRegExp';\n\nconst regExpCache = {};\n\nexport default function(haystack, needles) {\n  return haystack.search(\n    regExpCache[needles.join()] ||\n      (regExpCache[needles.join()] = new RegExp(needles.map(escapeRegExp).join('|')))\n  );\n}\n","import { keys } from 'utils/object';\nimport { isFunction } from 'utils/is';\n\n// https://github.com/kangax/html-minifier/issues/63#issuecomment-37763316\n//export const booleanAttributes = /^(allowFullscreen|async|autofocus|autoplay|checked|compact|controls|declare|default|defaultChecked|defaultMuted|defaultSelected|defer|disabled|enabled|formNoValidate|hidden|indeterminate|inert|isMap|itemScope|loop|multiple|muted|noHref|noResize|noShade|noValidate|noWrap|open|pauseOnExit|readOnly|required|reversed|scoped|seamless|selected|sortable|translate|trueSpeed|typeMustMatch|visible)$/i;\nexport const booleanAttributes = {\n  allowfullscreen: 1,\n  async: 1,\n  autofocus: 1,\n  autoplay: 1,\n  checked: 1,\n  compact: 1,\n  controls: 1,\n  declare: 1,\n  default: 1,\n  defaultchecked: 1,\n  defaultmuted: 1,\n  defaultselected: 1,\n  defer: 1,\n  disabled: 1,\n  enabled: 1,\n  formnovalidate: 1,\n  hidden: 1,\n  indeterminate: 1,\n  inert: 1,\n  ismap: 1,\n  itemscope: 1,\n  loop: 1,\n  multiple: 1,\n  muted: 1,\n  nohref: 1,\n  noresize: 1,\n  noshade: 1,\n  novalidate: 1,\n  nowrap: 1,\n  open: 1,\n  pauseonexit: 1,\n  readonly: 1,\n  required: 1,\n  reversed: 1,\n  scoped: 1,\n  seamless: 1,\n  selected: 1,\n  sortable: 1,\n  translate: 1,\n  truespeed: 1,\n  typemustmatch: 1,\n  visible: 1\n};\nexport const voidElements = {\n  area: 1,\n  base: 1,\n  br: 1,\n  col: 1,\n  command: 1,\n  doctype: 1,\n  embed: 1,\n  hr: 1,\n  img: 1,\n  input: 1,\n  keygen: 1,\n  link: 1,\n  meta: 1,\n  param: 1,\n  source: 1,\n  track: 1,\n  wbr: 1\n};\n\nconst htmlEntities = {\n  quot: 34,\n  amp: 38,\n  apos: 39,\n  lt: 60,\n  gt: 62,\n  nbsp: 160,\n  iexcl: 161,\n  cent: 162,\n  pound: 163,\n  curren: 164,\n  yen: 165,\n  brvbar: 166,\n  sect: 167,\n  uml: 168,\n  copy: 169,\n  ordf: 170,\n  laquo: 171,\n  not: 172,\n  shy: 173,\n  reg: 174,\n  macr: 175,\n  deg: 176,\n  plusmn: 177,\n  sup2: 178,\n  sup3: 179,\n  acute: 180,\n  micro: 181,\n  para: 182,\n  middot: 183,\n  cedil: 184,\n  sup1: 185,\n  ordm: 186,\n  raquo: 187,\n  frac14: 188,\n  frac12: 189,\n  frac34: 190,\n  iquest: 191,\n  Agrave: 192,\n  Aacute: 193,\n  Acirc: 194,\n  Atilde: 195,\n  Auml: 196,\n  Aring: 197,\n  AElig: 198,\n  Ccedil: 199,\n  Egrave: 200,\n  Eacute: 201,\n  Ecirc: 202,\n  Euml: 203,\n  Igrave: 204,\n  Iacute: 205,\n  Icirc: 206,\n  Iuml: 207,\n  ETH: 208,\n  Ntilde: 209,\n  Ograve: 210,\n  Oacute: 211,\n  Ocirc: 212,\n  Otilde: 213,\n  Ouml: 214,\n  times: 215,\n  Oslash: 216,\n  Ugrave: 217,\n  Uacute: 218,\n  Ucirc: 219,\n  Uuml: 220,\n  Yacute: 221,\n  THORN: 222,\n  szlig: 223,\n  agrave: 224,\n  aacute: 225,\n  acirc: 226,\n  atilde: 227,\n  auml: 228,\n  aring: 229,\n  aelig: 230,\n  ccedil: 231,\n  egrave: 232,\n  eacute: 233,\n  ecirc: 234,\n  euml: 235,\n  igrave: 236,\n  iacute: 237,\n  icirc: 238,\n  iuml: 239,\n  eth: 240,\n  ntilde: 241,\n  ograve: 242,\n  oacute: 243,\n  ocirc: 244,\n  otilde: 245,\n  ouml: 246,\n  divide: 247,\n  oslash: 248,\n  ugrave: 249,\n  uacute: 250,\n  ucirc: 251,\n  uuml: 252,\n  yacute: 253,\n  thorn: 254,\n  yuml: 255,\n  OElig: 338,\n  oelig: 339,\n  Scaron: 352,\n  scaron: 353,\n  Yuml: 376,\n  fnof: 402,\n  circ: 710,\n  tilde: 732,\n  Alpha: 913,\n  Beta: 914,\n  Gamma: 915,\n  Delta: 916,\n  Epsilon: 917,\n  Zeta: 918,\n  Eta: 919,\n  Theta: 920,\n  Iota: 921,\n  Kappa: 922,\n  Lambda: 923,\n  Mu: 924,\n  Nu: 925,\n  Xi: 926,\n  Omicron: 927,\n  Pi: 928,\n  Rho: 929,\n  Sigma: 931,\n  Tau: 932,\n  Upsilon: 933,\n  Phi: 934,\n  Chi: 935,\n  Psi: 936,\n  Omega: 937,\n  alpha: 945,\n  beta: 946,\n  gamma: 947,\n  delta: 948,\n  epsilon: 949,\n  zeta: 950,\n  eta: 951,\n  theta: 952,\n  iota: 953,\n  kappa: 954,\n  lambda: 955,\n  mu: 956,\n  nu: 957,\n  xi: 958,\n  omicron: 959,\n  pi: 960,\n  rho: 961,\n  sigmaf: 962,\n  sigma: 963,\n  tau: 964,\n  upsilon: 965,\n  phi: 966,\n  chi: 967,\n  psi: 968,\n  omega: 969,\n  thetasym: 977,\n  upsih: 978,\n  piv: 982,\n  ensp: 8194,\n  emsp: 8195,\n  thinsp: 8201,\n  zwnj: 8204,\n  zwj: 8205,\n  lrm: 8206,\n  rlm: 8207,\n  ndash: 8211,\n  mdash: 8212,\n  lsquo: 8216,\n  rsquo: 8217,\n  sbquo: 8218,\n  ldquo: 8220,\n  rdquo: 8221,\n  bdquo: 8222,\n  dagger: 8224,\n  Dagger: 8225,\n  bull: 8226,\n  hellip: 8230,\n  permil: 8240,\n  prime: 8242,\n  Prime: 8243,\n  lsaquo: 8249,\n  rsaquo: 8250,\n  oline: 8254,\n  frasl: 8260,\n  euro: 8364,\n  image: 8465,\n  weierp: 8472,\n  real: 8476,\n  trade: 8482,\n  alefsym: 8501,\n  larr: 8592,\n  uarr: 8593,\n  rarr: 8594,\n  darr: 8595,\n  harr: 8596,\n  crarr: 8629,\n  lArr: 8656,\n  uArr: 8657,\n  rArr: 8658,\n  dArr: 8659,\n  hArr: 8660,\n  forall: 8704,\n  part: 8706,\n  exist: 8707,\n  empty: 8709,\n  nabla: 8711,\n  isin: 8712,\n  notin: 8713,\n  ni: 8715,\n  prod: 8719,\n  sum: 8721,\n  minus: 8722,\n  lowast: 8727,\n  radic: 8730,\n  prop: 8733,\n  infin: 8734,\n  ang: 8736,\n  and: 8743,\n  or: 8744,\n  cap: 8745,\n  cup: 8746,\n  int: 8747,\n  there4: 8756,\n  sim: 8764,\n  cong: 8773,\n  asymp: 8776,\n  ne: 8800,\n  equiv: 8801,\n  le: 8804,\n  ge: 8805,\n  sub: 8834,\n  sup: 8835,\n  nsub: 8836,\n  sube: 8838,\n  supe: 8839,\n  oplus: 8853,\n  otimes: 8855,\n  perp: 8869,\n  sdot: 8901,\n  lceil: 8968,\n  rceil: 8969,\n  lfloor: 8970,\n  rfloor: 8971,\n  lang: 9001,\n  rang: 9002,\n  loz: 9674,\n  spades: 9824,\n  clubs: 9827,\n  hearts: 9829,\n  diams: 9830\n};\nconst controlCharacters = [\n  8364,\n  129,\n  8218,\n  402,\n  8222,\n  8230,\n  8224,\n  8225,\n  710,\n  8240,\n  352,\n  8249,\n  338,\n  141,\n  381,\n  143,\n  144,\n  8216,\n  8217,\n  8220,\n  8221,\n  8226,\n  8211,\n  8212,\n  732,\n  8482,\n  353,\n  8250,\n  339,\n  157,\n  382,\n  376\n];\nconst entityPattern = new RegExp(\n  '&(#?(?:x[\\\\w\\\\d]+|\\\\d+|' + keys(htmlEntities).join('|') + '));?',\n  'g'\n);\nconst codePointSupport = isFunction(String.fromCodePoint);\nconst codeToChar = codePointSupport ? String.fromCodePoint : String.fromCharCode;\n\nexport function decodeCharacterReferences(html) {\n  return html.replace(entityPattern, (match, entity) => {\n    let code;\n\n    // Handle named entities\n    if (entity[0] !== '#') {\n      code = htmlEntities[entity];\n    } else if (entity[1] === 'x') {\n      code = parseInt(entity.substring(2), 16);\n    } else {\n      code = parseInt(entity.substring(1), 10);\n    }\n\n    if (!code) {\n      return match;\n    }\n\n    return codeToChar(validateCode(code));\n  });\n}\n\nconst lessThan = /</g;\nconst greaterThan = />/g;\nconst amp = /&/g;\nconst invalid = 65533;\n\nexport function escapeHtml(str) {\n  return str\n    .replace(amp, '&amp;')\n    .replace(lessThan, '&lt;')\n    .replace(greaterThan, '&gt;');\n}\n\n// some code points are verboten. If we were inserting HTML, the browser would replace the illegal\n// code points with alternatives in some cases - since we're bypassing that mechanism, we need\n// to replace them ourselves\n//\n// Source: http://en.wikipedia.org/wiki/Character_encodings_in_HTML#Illegal_characters\n/* istanbul ignore next */\nfunction validateCode(code) {\n  if (!code) {\n    return invalid;\n  }\n\n  // line feed becomes generic whitespace\n  if (code === 10) {\n    return 32;\n  }\n\n  // ASCII range. (Why someone would use HTML entities for ASCII characters I don't know, but...)\n  if (code < 128) {\n    return code;\n  }\n\n  // code points 128-159 are dealt with leniently by browsers, but they're incorrect. We need\n  // to correct the mistake or we'll end up with missing € signs and so on\n  if (code <= 159) {\n    return controlCharacters[code - 128];\n  }\n\n  // basic multilingual plane\n  if (code < 55296) {\n    return code;\n  }\n\n  // UTF-16 surrogate halves\n  if (code <= 57343) {\n    return invalid;\n  }\n\n  // rest of the basic multilingual plane\n  if (code <= 65535) {\n    return code;\n  } else if (!codePointSupport) {\n    return invalid;\n  }\n\n  // supplementary multilingual plane 0x10000 - 0x1ffff\n  if (code >= 65536 && code <= 131071) {\n    return code;\n  }\n\n  // supplementary ideographic plane 0x20000 - 0x2ffff\n  if (code >= 131072 && code <= 196607) {\n    return code;\n  }\n\n  return invalid;\n}\n","export const expectedExpression = 'Expected a JavaScript expression';\nexport const expectedParen = 'Expected closing paren';\n","import { NUMBER_LITERAL } from '../../../../../config/types';\n\n// bulletproof number regex from https://gist.github.com/Rich-Harris/7544330\nconst numberPattern = /^(?:[+-]?)0*(?:(?:(?:[1-9]\\d*)?\\.\\d+)|(?:(?:0|[1-9]\\d*)\\.)|(?:0|[1-9]\\d*))(?:[eE][+-]?\\d+)?/;\n\nexport default function readNumberLiteral(parser) {\n  let result;\n\n  if ((result = parser.matchPattern(numberPattern))) {\n    return {\n      t: NUMBER_LITERAL,\n      v: result\n    };\n  }\n\n  return null;\n}\n","// Match one or more characters until: \", ', \\, or EOL/EOF.\n// EOL/EOF is written as (?!.) (meaning there's no non-newline char next).\nconst stringMiddlePattern = /^(?=.)[^\"'\\\\]+?(?:(?!.)|(?=[\"'\\\\]))/;\n\n// Match one escape sequence, including the backslash.\nexport const escapeSequencePattern = /^\\\\(?:[`'\"\\\\bfnrt]|0(?![0-9])|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|(?=.)[^ux0-9])/;\n\n// Match one ES5 line continuation (backslash + line terminator).\nexport const lineContinuationPattern = /^\\\\(?:\\r\\n|[\\u000A\\u000D\\u2028\\u2029])/;\n\n// Helper for defining getDoubleQuotedString and getSingleQuotedString.\nexport default function(okQuote) {\n  return function(parser) {\n    let literal = '\"';\n    let done = false;\n    let next;\n\n    while (!done) {\n      next =\n        parser.matchPattern(stringMiddlePattern) ||\n        parser.matchPattern(escapeSequencePattern) ||\n        parser.matchString(okQuote);\n      if (next) {\n        if (next === `\"`) {\n          literal += `\\\\\"`;\n        } else if (next === `\\\\'`) {\n          literal += `'`;\n        } else {\n          literal += next;\n        }\n      } else {\n        next = parser.matchPattern(lineContinuationPattern);\n        if (next) {\n          // convert \\(newline-like) into a \\u escape, which is allowed in JSON\n          literal += '\\\\u' + ('000' + next.charCodeAt(1).toString(16)).slice(-4);\n        } else {\n          done = true;\n        }\n      }\n    }\n\n    literal += '\"';\n\n    // use JSON.parse to interpret escapes\n    return JSON.parse(literal);\n  };\n}\n","import { STRING_LITERAL } from '../../../../../config/types';\nimport makeQuotedStringMatcher from './stringLiteral/makeQuotedStringMatcher';\n\nconst singleMatcher = makeQuotedStringMatcher(`\"`);\nconst doubleMatcher = makeQuotedStringMatcher(`'`);\n\nexport default function(parser) {\n  const start = parser.pos;\n  const quote = parser.matchString(`'`) || parser.matchString(`\"`);\n\n  if (quote) {\n    const string = (quote === `'` ? singleMatcher : doubleMatcher)(parser);\n\n    if (!parser.matchString(quote)) {\n      parser.pos = start;\n      return null;\n    }\n\n    return {\n      t: STRING_LITERAL,\n      v: string\n    };\n  }\n\n  return null;\n}\n","import readExpression from '../../../readExpression';\nimport { STRING_LITERAL, BRACKETED, INFIX_OPERATOR } from '../../../../../config/types';\nimport {\n  escapeSequencePattern,\n  lineContinuationPattern\n} from './stringLiteral/makeQuotedStringMatcher';\n\n// Match one or more characters until: \", ', or \\\nconst stringMiddlePattern = /^[^`\"\\\\\\$]+?(?:(?=[`\"\\\\\\$]))/;\n\nconst escapes = /[\\r\\n\\t\\b\\f]/g;\nfunction getString(literal) {\n  return JSON.parse(`\"${literal.replace(escapes, escapeChar)}\"`);\n}\n\nfunction escapeChar(c) {\n  switch (c) {\n    case '\\n':\n      return '\\\\n';\n    case '\\r':\n      return '\\\\r';\n    case '\\t':\n      return '\\\\t';\n    case '\\b':\n      return '\\\\b';\n    case '\\f':\n      return '\\\\f';\n  }\n}\n\nexport default function readTemplateStringLiteral(parser) {\n  if (!parser.matchString('`')) return null;\n\n  let literal = '';\n  let done = false;\n  let next;\n  const parts = [];\n\n  while (!done) {\n    next =\n      parser.matchPattern(stringMiddlePattern) ||\n      parser.matchPattern(escapeSequencePattern) ||\n      parser.matchString('$') ||\n      parser.matchString('\"');\n    if (next) {\n      if (next === `\"`) {\n        literal += `\\\\\"`;\n      } else if (next === '\\\\`') {\n        literal += '`';\n      } else if (next === '$') {\n        if (parser.matchString('{')) {\n          parts.push({ t: STRING_LITERAL, v: getString(literal) });\n          literal = '';\n\n          parser.sp();\n          const expr = readExpression(parser);\n\n          if (!expr) parser.error('Expected valid expression');\n\n          parts.push({ t: BRACKETED, x: expr });\n\n          parser.sp();\n          if (!parser.matchString('}'))\n            parser.error(`Expected closing '}' after interpolated expression`);\n        } else {\n          literal += '$';\n        }\n      } else {\n        literal += next;\n      }\n    } else {\n      next = parser.matchPattern(lineContinuationPattern);\n      if (next) {\n        // convert \\(newline-like) into a \\u escape, which is allowed in JSON\n        literal += '\\\\u' + ('000' + next.charCodeAt(1).toString(16)).slice(-4);\n      } else {\n        done = true;\n      }\n    }\n  }\n\n  if (literal.length) parts.push({ t: STRING_LITERAL, v: getString(literal) });\n\n  if (!parser.matchString('`')) parser.error(\"Expected closing '`'\");\n\n  if (!parts.length) {\n    // empty string literal\n    return { t: STRING_LITERAL, v: '' };\n  } else if (parts.length === 1) {\n    return parts[0];\n  } else {\n    let result = parts.pop();\n    let part;\n\n    while ((part = parts.pop())) {\n      result = {\n        t: INFIX_OPERATOR,\n        s: '+',\n        o: [part, result]\n      };\n    }\n\n    return {\n      t: BRACKETED,\n      x: result\n    };\n  }\n}\n","export const name = /^[a-zA-Z_$][a-zA-Z_$0-9]*/;\nexport const spreadPattern = /^\\s*\\.{3}/;\nexport const legalReference = /^(?:[a-zA-Z$_0-9]|\\\\\\.)+(?:(?:\\.(?:[a-zA-Z$_0-9]|\\\\\\.)+)|(?:\\[[0-9]+\\]))*/;\nexport const relaxedName = /^[a-zA-Z_$][-\\/a-zA-Z_$0-9]*(?:\\.(?:[a-zA-Z_$][-\\/a-zA-Z_$0-9]*))*/;\n","import readStringLiteral from '../primary/literal/readStringLiteral';\nimport readNumberLiteral from '../primary/literal/readNumberLiteral';\nimport { name as namePattern } from './patterns';\n\nconst identifier = /^[a-zA-Z_$][a-zA-Z_$0-9]*$/;\n\n// http://mathiasbynens.be/notes/javascript-properties\n// can be any name, string literal, or number literal\nexport default function readKey(parser) {\n  let token;\n\n  if ((token = readStringLiteral(parser))) {\n    return identifier.test(token.v) ? token.v : '\"' + token.v.replace(/\"/g, '\\\\\"') + '\"';\n  }\n\n  if ((token = readNumberLiteral(parser))) {\n    return token.v;\n  }\n\n  if ((token = parser.matchPattern(namePattern))) {\n    return token;\n  }\n\n  return null;\n}\n","import { BRACKETED, GLOBAL, REFERENCE } from 'src/config/types';\nimport { normalise } from 'src/shared/keypaths';\nimport { legalReference, relaxedName } from '../shared/patterns';\n\n// if a reference is a browser global, we don't deference it later, so it needs special treatment\nconst globals = /^(?:Array|console|Date|RegExp|decodeURIComponent|decodeURI|encodeURIComponent|encodeURI|isFinite|isNaN|parseFloat|parseInt|JSON|Math|NaN|undefined|null|Object|Number|String|Boolean)\\b/;\n\n// keywords are not valid references, with the exception of `this`\nconst keywords = /^(?:break|case|catch|continue|debugger|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|var|void|while|with)$/;\n\nconst prefixPattern = /^(?:\\@\\.|\\@|~\\/|(?:\\^\\^\\/(?:\\^\\^\\/)*(?:\\.\\.\\/)*)|(?:\\.\\.\\/)+|\\.\\/(?:\\.\\.\\/)*|\\.)/;\nconst specials = /^(key|index|keypath|rootpath|this|global|shared|context|event|node|local|style|helpers|last|macro)/;\n\nexport default function readReference(parser) {\n  let prefix, name, global, reference, lastDotIndex;\n\n  const startPos = parser.pos;\n\n  prefix = parser.matchPattern(prefixPattern) || '';\n  name =\n    (!prefix && parser.relaxedNames && parser.matchPattern(relaxedName)) ||\n    parser.matchPattern(legalReference);\n  const actual = prefix.length + ((name && name.length) || 0);\n\n  if (prefix === '@.') {\n    prefix = '@';\n    if (name) name = 'this.' + name;\n    else name = 'this';\n  }\n\n  if (!name && prefix) {\n    name = prefix;\n    prefix = '';\n  }\n\n  if (!name) {\n    return null;\n  }\n\n  if (prefix === '@') {\n    if (!specials.test(name)) {\n      parser.error(`Unrecognized special reference @${name}`);\n    } else if ((!name.indexOf('event') || !name.indexOf('node')) && !parser.inEvent) {\n      parser.error(`@event and @node are only valid references within an event directive`);\n    } else if (!name.indexOf('context')) {\n      parser.pos = parser.pos - (name.length - 7);\n      return {\n        t: BRACKETED,\n        x: {\n          t: REFERENCE,\n          n: '@context'\n        }\n      };\n    }\n  }\n\n  // bug out if it's a keyword (exception for ancestor/restricted refs - see https://github.com/ractivejs/ractive/issues/1497)\n  if (!prefix && !parser.relaxedNames && keywords.test(name)) {\n    parser.pos = startPos;\n    return null;\n  }\n\n  // if this is a browser global, stop here\n  if (!prefix && globals.test(name)) {\n    global = globals.exec(name)[0];\n    parser.pos = startPos + global.length;\n\n    return {\n      t: GLOBAL,\n      v: global\n    };\n  }\n\n  reference = (prefix || '') + normalise(name);\n\n  if (parser.matchString('(')) {\n    // if this is a method invocation (as opposed to a function) we need\n    // to strip the method name from the reference combo, else the context\n    // will be wrong\n    // but only if the reference was actually a member and not a refinement\n    lastDotIndex = reference.lastIndexOf('.');\n    if (lastDotIndex !== -1 && name[name.length - 1] !== ']') {\n      if (lastDotIndex === 0) {\n        reference = '.';\n        parser.pos = startPos;\n      } else {\n        const refLength = reference.length;\n        reference = reference.substr(0, lastDotIndex);\n        parser.pos = startPos + (actual - (refLength - lastDotIndex));\n      }\n    } else {\n      parser.pos -= 1;\n    }\n  }\n\n  return {\n    t: REFERENCE,\n    n: reference.replace(/^this\\./, './').replace(/^this$/, '.')\n  };\n}\n","import { INFIX_OPERATOR } from 'config/types';\nimport readTypeof from './readTypeof';\n\nlet readLogicalOr;\n\nconst makeInfixSequenceMatcher = function(symbol, fallthrough) {\n  return function(parser) {\n    // > and / have to be quoted\n    if (parser.inUnquotedAttribute && (symbol === '>' || symbol === '/'))\n      return fallthrough(parser);\n\n    let start, left, right;\n\n    left = fallthrough(parser);\n    if (!left) {\n      return null;\n    }\n\n    // Loop to handle left-recursion in a case like `a * b * c` and produce\n    // left association, i.e. `(a * b) * c`.  The matcher can't call itself\n    // to parse `left` because that would be infinite regress.\n    while (true) {\n      start = parser.pos;\n\n      parser.sp();\n\n      if (!parser.matchString(symbol)) {\n        parser.pos = start;\n        return left;\n      }\n\n      // special case - in operator must not be followed by [a-zA-Z_$0-9]\n      if (symbol === 'in' && /[a-zA-Z_$0-9]/.test(parser.remaining().charAt(0))) {\n        parser.pos = start;\n        return left;\n      }\n\n      parser.sp();\n\n      // right operand must also consist of only higher-precedence operators\n      right = fallthrough(parser);\n      if (!right) {\n        parser.pos = start;\n        return left;\n      }\n\n      left = {\n        t: INFIX_OPERATOR,\n        s: symbol,\n        o: [left, right]\n      };\n\n      // Loop back around.  If we don't see another occurrence of the symbol,\n      // we'll return left.\n    }\n  };\n};\n\n// create all infix sequence matchers, and return readLogicalOr\n(function() {\n  let i, len, matcher, fallthrough;\n\n  // All the infix operators on order of precedence (source: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence)\n  // Each sequence matcher will initially fall through to its higher precedence\n  // neighbour, and only attempt to match if one of the higher precedence operators\n  // (or, ultimately, a literal, reference, or bracketed expression) already matched\n  const infixOperators = '* / % + - << >> >>> < <= > >= in instanceof == != === !== & ^ | && ||'.split(\n    ' '\n  );\n\n  // A typeof operator is higher precedence than multiplication\n  fallthrough = readTypeof;\n  for (i = 0, len = infixOperators.length; i < len; i += 1) {\n    matcher = makeInfixSequenceMatcher(infixOperators[i], fallthrough);\n    fallthrough = matcher;\n  }\n\n  // Logical OR is the fallthrough for the conditional matcher\n  readLogicalOr = fallthrough;\n})();\n\nexport default readLogicalOr;\n","import {\n  ARRAY_LITERAL,\n  ATTRIBUTE,\n  DECORATOR,\n  DELEGATE_FLAG,\n  BINDING_FLAG,\n  INTERPOLATOR,\n  TRANSITION,\n  EVENT\n} from '../../../config/types';\nimport getLowestIndex from '../utils/getLowestIndex';\nimport readMustache from '../readMustache';\nimport { decodeCharacterReferences } from 'src/utils/html';\nimport readExpressionList from '../expressions/shared/readExpressionList';\nimport readExpressionOrReference from '../readExpressionOrReference';\nimport flattenExpression from 'parse/utils/flattenExpression';\nimport refineExpression from 'parse/utils/refineExpression';\nimport { isString } from 'utils/is';\n\nconst attributeNamePattern = /^[^\\s\"'>\\/=(]+/;\nconst onPattern = /^on/;\nconst eventPattern = /^on-([a-zA-Z\\*\\.$_]((?:[a-zA-Z\\*\\.$_0-9\\-]|\\\\-)+))$/;\nconst reservedEventNames = /^(?:change|reset|teardown|update|construct|config|init|render|complete|unrender|detach|insert|destruct|attachchild|detachchild)$/;\nconst decoratorPattern = /^as-([a-z-A-Z][-a-zA-Z_0-9]*)$/;\nconst transitionPattern = /^([a-zA-Z](?:(?!-in-out)[-a-zA-Z_0-9])*)-(in|out|in-out)$/;\nconst boundPattern = /^((bind|class)-(([-a-zA-Z0-9_])+))$/;\nconst directives = {\n  lazy: { t: BINDING_FLAG, v: 'l' },\n  twoway: { t: BINDING_FLAG, v: 't' },\n  'no-delegation': { t: DELEGATE_FLAG }\n};\nconst unquotedAttributeValueTextPattern = /^[^\\s\"'=<>\\/`]+/;\nconst proxyEvent = /^[^\\s\"'=<>@\\[\\]()]*/;\nconst whitespace = /^\\s+/;\n\nconst slashes = /\\\\/g;\nfunction splitEvent(str) {\n  const result = [];\n  let s = 0;\n\n  for (let i = 0; i < str.length; i++) {\n    if (str[i] === '-' && str[i - 1] !== '\\\\') {\n      result.push(str.substring(s, i).replace(slashes, ''));\n      s = i + 1;\n    }\n  }\n\n  result.push(str.substring(s).replace(slashes, ''));\n\n  return result;\n}\n\nexport default function readAttribute(parser) {\n  let name, i, nearest, idx;\n\n  parser.sp();\n\n  name = parser.matchPattern(attributeNamePattern);\n  if (!name) {\n    return null;\n  }\n\n  // check for accidental delimiter consumption e.g. <tag bool{{>attrs}} />\n  nearest = name.length;\n  for (i = 0; i < parser.tags.length; i++) {\n    if (~(idx = name.indexOf(parser.tags[i].open))) {\n      if (idx < nearest) nearest = idx;\n    }\n  }\n  if (nearest < name.length) {\n    parser.pos -= name.length - nearest;\n    name = name.substr(0, nearest);\n    if (!name) return null;\n  }\n\n  return { n: name };\n}\n\nfunction readAttributeValue(parser) {\n  const start = parser.pos;\n\n  // next character must be `=`, `/`, `>` or whitespace\n  if (!/[=\\/>\\s]/.test(parser.nextChar())) {\n    parser.error('Expected `=`, `/`, `>` or whitespace');\n  }\n\n  parser.sp();\n\n  if (!parser.matchString('=')) {\n    parser.pos = start;\n    return null;\n  }\n\n  parser.sp();\n\n  const valueStart = parser.pos;\n  const startDepth = parser.sectionDepth;\n\n  const value =\n    readQuotedAttributeValue(parser, `'`) ||\n    readQuotedAttributeValue(parser, `\"`) ||\n    readUnquotedAttributeValue(parser);\n\n  if (value === null) {\n    parser.error('Expected valid attribute value');\n  }\n\n  if (parser.sectionDepth !== startDepth) {\n    parser.pos = valueStart;\n    parser.error(\n      'An attribute value must contain as many opening section tags as closing section tags'\n    );\n  }\n\n  if (!value.length) {\n    return '';\n  }\n\n  if (value.length === 1 && isString(value[0])) {\n    return decodeCharacterReferences(value[0]);\n  }\n\n  return value;\n}\n\nfunction readUnquotedAttributeValueToken(parser) {\n  let text, index;\n\n  const start = parser.pos;\n\n  text = parser.matchPattern(unquotedAttributeValueTextPattern);\n\n  if (!text) {\n    return null;\n  }\n\n  const haystack = text;\n  const needles = parser.tags.map(t => t.open); // TODO refactor... we do this in readText.js as well\n\n  if ((index = getLowestIndex(haystack, needles)) !== -1) {\n    text = text.substr(0, index);\n    parser.pos = start + text.length;\n  }\n\n  return text;\n}\n\nfunction readUnquotedAttributeValue(parser) {\n  parser.inAttribute = true;\n\n  const tokens = [];\n\n  let token = readMustache(parser) || readUnquotedAttributeValueToken(parser);\n  while (token) {\n    tokens.push(token);\n    token = readMustache(parser) || readUnquotedAttributeValueToken(parser);\n  }\n\n  if (!tokens.length) {\n    return null;\n  }\n\n  parser.inAttribute = false;\n  return tokens;\n}\n\nfunction readQuotedAttributeValue(parser, quoteMark) {\n  const start = parser.pos;\n\n  if (!parser.matchString(quoteMark)) {\n    return null;\n  }\n\n  parser.inAttribute = quoteMark;\n\n  const tokens = [];\n\n  let token = readMustache(parser) || readQuotedStringToken(parser, quoteMark);\n  while (token !== null) {\n    tokens.push(token);\n    token = readMustache(parser) || readQuotedStringToken(parser, quoteMark);\n  }\n\n  if (!parser.matchString(quoteMark)) {\n    parser.pos = start;\n    return null;\n  }\n\n  parser.inAttribute = false;\n\n  return tokens;\n}\n\nfunction readQuotedStringToken(parser, quoteMark) {\n  const haystack = parser.remaining();\n\n  const needles = parser.tags.map(t => t.open); // TODO refactor... we do this in readText.js as well\n  needles.push(quoteMark);\n\n  const index = getLowestIndex(haystack, needles);\n\n  if (index === -1) {\n    parser.error('Quoted attribute value must have a closing quote');\n  }\n\n  if (!index) {\n    return null;\n  }\n\n  parser.pos += index;\n  return haystack.substr(0, index);\n}\n\nexport function readAttributeOrDirective(parser) {\n  let match, directive;\n\n  const attribute = readAttribute(parser, false);\n\n  if (!attribute) return null;\n\n  // lazy, twoway\n  if ((directive = directives[attribute.n])) {\n    attribute.t = directive.t;\n    if (directive.v) attribute.v = directive.v;\n    delete attribute.n; // no name necessary\n    parser.sp();\n    if (parser.nextChar() === '=') attribute.f = readAttributeValue(parser);\n  } else if ((match = decoratorPattern.exec(attribute.n))) {\n    // decorators\n    attribute.n = match[1];\n    attribute.t = DECORATOR;\n    readArguments(parser, attribute);\n  } else if ((match = transitionPattern.exec(attribute.n))) {\n    // transitions\n    attribute.n = match[1];\n    attribute.t = TRANSITION;\n    readArguments(parser, attribute);\n    attribute.v = match[2] === 'in-out' ? 't0' : match[2] === 'in' ? 't1' : 't2';\n  } else if ((match = eventPattern.exec(attribute.n))) {\n    // on-click etc\n    attribute.n = splitEvent(match[1]);\n    attribute.t = EVENT;\n\n    if (parser.matchString('(')) {\n      attribute.a = flattenExpression({\n        t: ARRAY_LITERAL,\n        m: readExpressionList(parser)\n      });\n      if (!parser.matchString(')')) parser.error(`Expected closing ')'`);\n    }\n\n    parser.inEvent = true;\n\n    // check for a proxy event\n    if (!readProxyEvent(parser, attribute)) {\n      // otherwise, it's an expression\n      readArguments(parser, attribute, true);\n    } else if (reservedEventNames.test(attribute.f)) {\n      parser.pos -= attribute.f.length;\n      parser.error(\n        'Cannot use reserved event names (change, reset, teardown, update, construct, config, init, render, unrender, complete, detach, insert, destruct, attachchild, detachchild)'\n      );\n    }\n\n    parser.inEvent = false;\n  } else if ((match = boundPattern.exec(attribute.n))) {\n    // bound directives\n    const bind = match[2] === 'bind';\n    attribute.n = bind ? match[3] : match[1];\n    attribute.t = ATTRIBUTE;\n    readArguments(parser, attribute, false, true);\n\n    if (!attribute.f && bind) {\n      attribute.f = [{ t: INTERPOLATOR, r: match[3] }];\n    }\n  } else {\n    parser.sp();\n    const value = parser.nextChar() === '=' ? readAttributeValue(parser) : null;\n    attribute.f = value != null ? value : attribute.f;\n\n    if (parser.sanitizeEventAttributes && onPattern.test(attribute.n)) {\n      return { exclude: true };\n    } else {\n      attribute.f = attribute.f || (attribute.f === '' ? '' : 0);\n      attribute.t = ATTRIBUTE;\n    }\n  }\n\n  return attribute;\n}\n\nfunction readProxyEvent(parser, attribute) {\n  const start = parser.pos;\n  if (!parser.matchString('=')) parser.error(`Missing required directive arguments`);\n\n  const quote = parser.matchString(`'`) || parser.matchString(`\"`);\n  parser.sp();\n  const proxy = parser.matchPattern(proxyEvent);\n\n  if (proxy !== undefined) {\n    if (quote) {\n      parser.sp();\n      if (!parser.matchString(quote)) parser.pos = start;\n      else return (attribute.f = proxy) || true;\n    } else if (!parser.matchPattern(whitespace)) {\n      parser.pos = start;\n    } else {\n      return (attribute.f = proxy) || true;\n    }\n  } else {\n    parser.pos = start;\n  }\n}\n\nfunction readArguments(parser, attribute, required = false, single = false) {\n  parser.sp();\n  if (!parser.matchString('=')) {\n    if (required) parser.error(`Missing required directive arguments`);\n    return;\n  }\n  parser.sp();\n\n  const quote = parser.matchString('\"') || parser.matchString(\"'\");\n  const spread = parser.spreadArgs;\n  parser.spreadArgs = true;\n  parser.inUnquotedAttribute = !quote;\n  const expr = single\n    ? readExpressionOrReference(parser, [quote || ' ', '/', '>'])\n    : { m: readExpressionList(parser), t: ARRAY_LITERAL };\n  parser.inUnquotedAttribute = false;\n  parser.spreadArgs = spread;\n\n  if (quote) {\n    parser.sp();\n    if (parser.matchString(quote) !== quote) parser.error(`Expected matching quote '${quote}'`);\n  }\n\n  if (single) {\n    const interpolator = { t: INTERPOLATOR };\n    refineExpression(expr, interpolator);\n    attribute.f = [interpolator];\n  } else {\n    attribute.f = flattenExpression(expr);\n  }\n}\n","import { DELIMCHANGE } from 'config/types';\nimport readDelimiterChange from './mustache/readDelimiterChange';\nimport readRegexpLiteral from './expressions/primary/literal/readRegexpLiteral';\nimport { readAttributeOrDirective } from './element/readAttribute';\n\nconst delimiterChangeToken = { t: DELIMCHANGE, exclude: true };\n\nexport default function readMustache(parser) {\n  let mustache, i;\n\n  // If we're inside a <script> or <style> tag, and we're not\n  // interpolating, bug out\n  if (parser.interpolate[parser.inside] === false) {\n    return null;\n  }\n\n  for (i = 0; i < parser.tags.length; i += 1) {\n    if ((mustache = readMustacheOfType(parser, parser.tags[i]))) {\n      return mustache;\n    }\n  }\n\n  if (parser.inTag && !parser.inAttribute) {\n    mustache = readAttributeOrDirective(parser);\n    if (mustache) {\n      parser.sp();\n      return mustache;\n    }\n  }\n}\n\nfunction readMustacheOfType(parser, tag) {\n  let mustache, reader, i;\n\n  const start = parser.pos;\n\n  if (parser.matchString('\\\\' + tag.open)) {\n    if (start === 0 || parser.str[start - 1] !== '\\\\') {\n      return tag.open;\n    }\n  } else if (!parser.matchString(tag.open)) {\n    return null;\n  }\n\n  // delimiter change?\n  if ((mustache = readDelimiterChange(parser))) {\n    // find closing delimiter or abort...\n    if (!parser.matchString(tag.close)) {\n      return null;\n    }\n\n    // ...then make the switch\n    tag.open = mustache[0];\n    tag.close = mustache[1];\n    parser.sortMustacheTags();\n\n    return delimiterChangeToken;\n  }\n\n  parser.sp();\n\n  // illegal section closer\n  if (parser.matchString('/')) {\n    parser.pos -= 1;\n    const rewind = parser.pos;\n    if (!readRegexpLiteral(parser)) {\n      parser.pos = rewind - tag.close.length;\n      if (parser.inAttribute) {\n        parser.pos = start;\n        return null;\n      } else {\n        parser.error(\"Attempted to close a section that wasn't open\");\n      }\n    } else {\n      parser.pos = rewind;\n    }\n  }\n\n  for (i = 0; i < tag.readers.length; i += 1) {\n    reader = tag.readers[i];\n\n    if ((mustache = reader(parser, tag))) {\n      if (tag.isStatic) {\n        mustache.s = 1;\n      }\n\n      if (parser.includeLinePositions) {\n        mustache.q = parser.getLinePos(start);\n      }\n\n      return mustache;\n    }\n  }\n\n  parser.pos = start;\n  return null;\n}\n","import readExpression from '../readExpression';\nimport refineExpression from '../../utils/refineExpression';\n\nconst legalAlias = /^(?:[a-zA-Z$_0-9]|\\\\\\.)+(?:(?:(?:[a-zA-Z$_0-9]|\\\\\\.)+)|(?:\\[[0-9]+\\]))*/;\nconst asRE = /^as/i;\n\nexport function readAliases(parser) {\n  const aliases = [];\n  let alias;\n  const start = parser.pos;\n\n  parser.sp();\n\n  alias = readAlias(parser);\n\n  if (alias) {\n    alias.x = refineExpression(alias.x, {});\n    aliases.push(alias);\n\n    parser.sp();\n\n    while (parser.matchString(',')) {\n      alias = readAlias(parser);\n\n      if (!alias) {\n        parser.error('Expected another alias.');\n      }\n\n      alias.x = refineExpression(alias.x, {});\n      aliases.push(alias);\n\n      parser.sp();\n    }\n\n    return aliases;\n  }\n\n  parser.pos = start;\n  return null;\n}\n\nexport function readAlias(parser) {\n  const start = parser.pos;\n\n  parser.sp();\n\n  const expr = readExpression(parser, []);\n\n  if (!expr) {\n    parser.pos = start;\n    return null;\n  }\n\n  parser.sp();\n  parser.matchPattern(asRE);\n  parser.sp();\n\n  const alias = parser.matchPattern(legalAlias);\n\n  if (!alias) {\n    parser.pos = start;\n    return null;\n  }\n\n  return { n: alias, x: expr };\n}\n","import { CATCH, ELSE, ELSEIF, THEN } from 'config/types';\nimport readExpression from '../../readExpression';\nimport { name } from '../../expressions/shared/patterns';\n\nconst patterns = {\n  else: /^\\s*else\\s*/,\n  elseif: /^\\s*elseif\\s+/,\n  then: /^\\s*then\\s*/,\n  catch: /^\\s*catch\\s*/\n};\n\nconst types = {\n  else: ELSE,\n  elseif: ELSEIF,\n  then: THEN,\n  catch: CATCH\n};\n\nexport default function readInlineBlock(parser, tag, type) {\n  const start = parser.pos;\n\n  if (!parser.matchString(tag.open)) {\n    return null;\n  }\n\n  if (!parser.matchPattern(patterns[type])) {\n    parser.pos = start;\n    return null;\n  }\n\n  const res = { t: types[type] };\n\n  if (type === 'elseif') {\n    res.x = readExpression(parser);\n  } else if (type === 'catch' || type === 'then') {\n    const nm = parser.matchPattern(name);\n    if (nm) res.n = nm;\n  }\n\n  if (!parser.matchString(tag.close)) {\n    parser.error(`Expected closing delimiter '${tag.close}'`);\n  }\n\n  return res;\n}\n","import { SECTION_EACH, SECTION_IF, SECTION_IF_WITH, SECTION_UNLESS } from 'config/types';\n\nexport default {\n  each: SECTION_EACH,\n  if: SECTION_IF,\n  with: SECTION_IF_WITH,\n  unless: SECTION_UNLESS\n};\n","import {\n  ALIAS,\n  AWAIT,\n  CATCH,\n  ELSE,\n  ELSEIF,\n  SECTION,\n  SECTION_IF,\n  SECTION_UNLESS,\n  THEN\n} from 'config/types';\nimport { READERS } from 'parse/_parse';\nimport readClosing from './section/readClosing';\nimport readInlineBlock from './section/readInlineBlock';\nimport handlebarsBlockCodes from './handlebarsBlockCodes';\nimport readExpression from '../readExpression';\nimport refineExpression from 'parse/utils/refineExpression';\nimport { readAlias, readAliases } from './readAliases';\nimport { keys } from 'utils/object';\nimport { name } from '../expressions/shared/patterns';\n\nconst indexRefPattern = /^\\s*:\\s*([a-zA-Z_$][a-zA-Z_$0-9]*)/;\nconst keyIndexRefPattern = /^\\s*,\\s*([a-zA-Z_$][a-zA-Z_$0-9]*)/;\nconst handlebarsBlockPattern = new RegExp('^(' + keys(handlebarsBlockCodes).join('|') + ')\\\\b');\n\nexport default function readSection(parser, tag) {\n  let expression,\n    section,\n    child,\n    children,\n    hasElse,\n    block,\n    unlessBlock,\n    closed,\n    i,\n    expectedClose,\n    hasThen,\n    hasCatch,\n    inlineThen;\n  let aliasOnly = false;\n\n  const start = parser.pos;\n\n  if (parser.matchString('^')) {\n    // watch out for parent context refs - {{^^/^^/foo}}\n    if (parser.matchString('^/')) {\n      parser.pos = start;\n      return null;\n    }\n    section = { t: SECTION, f: [], n: SECTION_UNLESS };\n  } else if (parser.matchString('#')) {\n    section = { t: SECTION, f: [] };\n\n    if (parser.matchString('partial')) {\n      parser.pos = start - parser.standardDelimiters[0].length;\n      parser.error(\n        'Partial definitions can only be at the top level of the template, or immediately inside components'\n      );\n    }\n\n    if ((block = parser.matchString('await'))) {\n      expectedClose = block;\n      section.t = AWAIT;\n    } else if ((block = parser.matchPattern(handlebarsBlockPattern))) {\n      expectedClose = block;\n      section.n = handlebarsBlockCodes[block];\n    }\n  } else {\n    return null;\n  }\n\n  parser.sp();\n\n  if (block === 'with') {\n    const aliases = readAliases(parser);\n    if (aliases) {\n      aliasOnly = true;\n      section.z = aliases;\n      section.t = ALIAS;\n    }\n  } else if (block === 'each') {\n    const alias = readAlias(parser);\n    if (alias) {\n      section.z = [{ n: alias.n, x: { r: '.' } }];\n      expression = alias.x;\n    }\n  }\n\n  if (!aliasOnly) {\n    if (!expression) expression = readExpression(parser);\n\n    if (!expression) {\n      parser.error('Expected expression');\n    }\n\n    // extra each aliases\n    if (block === 'each' && parser.matchString(',')) {\n      const aliases = readAliases(parser);\n      if (aliases) {\n        if (section.z) aliases.unshift(section.z[0]);\n        section.z = aliases;\n      }\n    }\n\n    // optional index and key references\n    if ((block === 'each' || !block) && (i = parser.matchPattern(indexRefPattern))) {\n      let extra;\n\n      if ((extra = parser.matchPattern(keyIndexRefPattern))) {\n        section.i = i + ',' + extra;\n      } else {\n        section.i = i;\n      }\n    } else if (block === 'await' && parser.matchString('then')) {\n      parser.sp();\n      hasThen = true;\n      inlineThen = parser.matchPattern(name);\n      if (!inlineThen) inlineThen = true;\n    }\n\n    if (!block && expression.n) {\n      expectedClose = expression.n;\n    }\n  }\n\n  parser.sp();\n\n  if (parser.matchString('-')) section.w = 1;\n\n  if (!parser.matchString(tag.close)) {\n    parser.error(`Expected closing delimiter '${tag.close}'`);\n  }\n\n  parser.sectionDepth += 1;\n  children = section.f;\n\n  let pos;\n  do {\n    pos = parser.pos;\n    if ((child = readClosing(parser, tag))) {\n      if (expectedClose && child.r !== expectedClose) {\n        if (!block) {\n          if (child.r)\n            parser.warn(\n              `Expected ${tag.open}/${expectedClose}${tag.close} but found ${tag.open}/${child.r}${\n                tag.close\n              }`\n            );\n        } else {\n          parser.pos = pos;\n          parser.error(`Expected ${tag.open}/${expectedClose}${tag.close}`);\n        }\n      }\n\n      parser.sectionDepth -= 1;\n      closed = true;\n    } else if (\n      !aliasOnly &&\n      ((child = readInlineBlock(parser, tag, 'elseif')) ||\n        (child = readInlineBlock(parser, tag, 'else')) ||\n        (block === 'await' &&\n          ((child = readInlineBlock(parser, tag, 'then')) ||\n            (child = readInlineBlock(parser, tag, 'catch')))))\n    ) {\n      if (section.n === SECTION_UNLESS) {\n        parser.error('{{else}} not allowed in {{#unless}}');\n      }\n\n      if (hasElse) {\n        if (child.t === ELSE) {\n          parser.error('there can only be one {{else}} block, at the end of a section');\n        } else if (child.t === ELSEIF) {\n          parser.error('illegal {{elseif...}} after {{else}}');\n        }\n      }\n\n      if (!unlessBlock && (inlineThen || !hasThen) && !hasCatch) {\n        if (block === 'await') {\n          const s = { f: children };\n          section.f = [s];\n          if (inlineThen) {\n            s.t = THEN;\n            inlineThen !== true && (s.n = inlineThen);\n          } else {\n            s.t = SECTION;\n          }\n        } else {\n          unlessBlock = [];\n        }\n      }\n\n      const mustache = {\n        t: SECTION,\n        f: (children = [])\n      };\n\n      if (child.t === ELSE) {\n        if (block === 'await') {\n          section.f.push(mustache);\n          mustache.t = ELSE;\n        } else {\n          mustache.n = SECTION_UNLESS;\n          unlessBlock.push(mustache);\n        }\n        hasElse = true;\n      } else if (child.t === ELSEIF) {\n        mustache.n = SECTION_IF;\n        refineExpression(child.x, mustache);\n        unlessBlock.push(mustache);\n      } else if (child.t === THEN) {\n        if (hasElse) parser.error('{{then}} block must appear before any {{else}} block');\n        if (hasCatch) parser.error('{{then}} block must appear before any {{catch}} block');\n        if (hasThen) parser.error('there can only be one {{then}} block per {{#await}}');\n        mustache.t = THEN;\n        hasThen = true;\n        child.n && (mustache.n = child.n);\n        section.f.push(mustache);\n      } else if (child.t === CATCH) {\n        if (hasElse) parser.error('{{catch}} block must appear before any {{else}} block');\n        if (hasCatch) parser.error('there can only be one {{catch}} block per {{#await}}');\n        mustache.t = CATCH;\n        hasCatch = true;\n        mustache.n = child.n;\n        section.f.push(mustache);\n      }\n    } else {\n      child = parser.read(READERS);\n\n      if (!child) {\n        break;\n      }\n\n      children.push(child);\n    }\n  } while (!closed);\n\n  if (unlessBlock) {\n    section.l = unlessBlock;\n  }\n\n  if (!aliasOnly) {\n    refineExpression(expression, section);\n  }\n\n  if (block === 'await' && (inlineThen || !hasThen) && !hasCatch && !hasElse) {\n    const s = { f: section.f };\n    section.f = [s];\n    if (inlineThen) {\n      s.t = THEN;\n      inlineThen !== true && (s.n = inlineThen);\n    } else {\n      s.t = SECTION;\n    }\n  }\n\n  // TODO if a section is empty it should be discarded. Don't do\n  // that here though - we need to clean everything up first, as\n  // it may contain removeable whitespace. As a temporary measure,\n  // to pass the existing tests, remove empty `f` arrays\n  if (!section.f.length) {\n    delete section.f;\n  }\n\n  return section;\n}\n","import { COMMENT } from 'config/types';\n\nconst OPEN_COMMENT = '<!--';\nconst CLOSE_COMMENT = '-->';\n\nexport default function readHtmlComment(parser) {\n  const start = parser.pos;\n\n  if (parser.textOnlyMode || !parser.matchString(OPEN_COMMENT)) {\n    return null;\n  }\n\n  const remaining = parser.remaining();\n  const endIndex = remaining.indexOf(CLOSE_COMMENT);\n\n  if (endIndex === -1) {\n    parser.error(\"Illegal HTML - expected closing comment sequence ('-->')\");\n  }\n\n  const content = remaining.substr(0, endIndex);\n  parser.pos += endIndex + 3;\n\n  const comment = {\n    t: COMMENT,\n    c: content\n  };\n\n  if (parser.includeLinePositions) {\n    comment.q = parser.getLinePos(start);\n  }\n\n  return comment;\n}\n","import { COMMENT, DELIMCHANGE, SECTION, INVERTED } from 'config/types';\nimport { lastItem } from 'utils/array';\nimport { isString } from 'utils/is';\n\nconst leadingLinebreak = /^[ \\t\\f\\r\\n]*\\r?\\n/;\nconst trailingLinebreak = /\\r?\\n[ \\t\\f\\r\\n]*$/;\n\nexport default function(items, preserveStandaloneSections) {\n  let i, current, backOne, backTwo, lastSectionItem;\n\n  for (i = 1; i < items.length; i += 1) {\n    current = items[i];\n    backOne = items[i - 1];\n    backTwo = items[i - 2];\n\n    // if we're at the end of a [text][comment][text] sequence...\n    if (isString(current) && isComment(backOne) && isString(backTwo)) {\n      // ... and the comment is a standalone (i.e. line breaks either side)...\n      if (trailingLinebreak.test(backTwo) && leadingLinebreak.test(current)) {\n        // ... then we want to remove the whitespace after the first line break\n        items[i - 2] = backTwo.replace(trailingLinebreak, '\\n');\n\n        // and the leading line break of the second text token\n        items[i] = current.replace(leadingLinebreak, '');\n      }\n    }\n\n    if (!preserveStandaloneSections) {\n      // if the current item is a section, and it is preceded by a linebreak, and\n      // its first item is a linebreak...\n      if (isSection(current) && isString(backOne)) {\n        if (\n          trailingLinebreak.test(backOne) &&\n          isString(current.f[0]) &&\n          leadingLinebreak.test(current.f[0])\n        ) {\n          items[i - 1] = backOne.replace(trailingLinebreak, '\\n');\n          current.f[0] = current.f[0].replace(leadingLinebreak, '');\n        }\n      }\n\n      // if the last item was a section, and it is followed by a linebreak, and\n      // its last item is a linebreak...\n      if (isString(current) && isSection(backOne)) {\n        lastSectionItem = lastItem(backOne.f);\n\n        if (\n          isString(lastSectionItem) &&\n          trailingLinebreak.test(lastSectionItem) &&\n          leadingLinebreak.test(current)\n        ) {\n          backOne.f[backOne.f.length - 1] = lastSectionItem.replace(trailingLinebreak, '\\n');\n          items[i] = current.replace(leadingLinebreak, '');\n        }\n      }\n    }\n  }\n\n  return items;\n}\n\nfunction isComment(item) {\n  return item.t === COMMENT || item.t === DELIMCHANGE;\n}\n\nfunction isSection(item) {\n  return (item.t === SECTION || item.t === INVERTED) && item.f;\n}\n","import { COMMENT, ELEMENT } from 'config/types';\nimport stripStandalones from './stripStandalones';\nimport trimWhitespace from './trimWhitespace';\nimport { isString } from 'utils/is';\n\nconst contiguousWhitespace = /[ \\t\\f\\r\\n]+/g;\nconst leadingWhitespace = /^[ \\t\\f\\r\\n]+/;\nconst trailingWhitespace = /[ \\t\\f\\r\\n]+$/;\nconst leadingNewLine = /^(?:\\r\\n|\\r|\\n)/;\nconst trailingNewLine = /(?:\\r\\n|\\r|\\n)$/;\nconst trailingIndent = /(\\n)?[ \\t]*$/;\nconst leadingLine = /[ \\t]*\\n/;\n\nexport default function cleanup(\n  items,\n  stripComments,\n  preserveWhitespace,\n  removeLeadingWhitespace,\n  removeTrailingWhitespace,\n  whiteSpaceElements,\n  preserveStandaloneSections\n) {\n  if (isString(items)) return;\n\n  let i,\n    item,\n    previousItem,\n    nextItem,\n    preserveWhitespaceInsideFragment,\n    removeLeadingWhitespaceInsideFragment,\n    removeTrailingWhitespaceInsideFragment;\n\n  // First pass - remove standalones and comments etc\n  stripStandalones(items, preserveStandaloneSections);\n\n  i = items.length;\n  while (i--) {\n    item = items[i];\n\n    // Remove delimiter changes, unsafe elements etc\n    if (item.exclude) {\n      items.splice(i, 1);\n    } else if (stripComments && item.t === COMMENT) {\n      // Remove comments, unless we want to keep them\n      items.splice(i, 1);\n    }\n  }\n\n  // If necessary, remove leading and trailing whitespace\n  trimWhitespace(\n    items,\n    removeLeadingWhitespace ? leadingWhitespace : null,\n    removeTrailingWhitespace ? trailingWhitespace : null\n  );\n\n  i = items.length;\n  while (i--) {\n    item = items[i];\n    removeLeadingWhitespaceInsideFragment = removeTrailingWhitespaceInsideFragment = false;\n\n    if (item.w) {\n      const prev = items[i - 1];\n      let hitLast = true;\n      if (typeof prev === 'string') items[i - 1] = prev.replace(trailingIndent, '$1');\n      if (item.f) {\n        if (typeof item.f[0] === 'string') item.f[0] = item.f[0].replace(leadingLine, '');\n        const last = item.f.length - 1;\n        if (typeof item.f[last] === 'string') {\n          item.f[last] = item.f[last].replace(trailingIndent, (_m, str) => {\n            hitLast = str;\n            return str || '';\n          });\n        }\n      }\n      const next = items[i + 1];\n      if (hitLast && typeof next === 'string') items[i + 1] = next.replace(leadingLine, '');\n    }\n\n    // Recurse\n    if (item.f) {\n      const isPreserveWhitespaceElement =\n        item.t === ELEMENT &&\n        (whiteSpaceElements[item.e.toLowerCase()] || whiteSpaceElements[item.e]);\n      preserveWhitespaceInsideFragment = preserveWhitespace || isPreserveWhitespaceElement;\n\n      if (!preserveWhitespace && isPreserveWhitespaceElement) {\n        trimWhitespace(item.f, leadingNewLine, trailingNewLine);\n      }\n\n      if (!preserveWhitespaceInsideFragment) {\n        previousItem = items[i - 1];\n        nextItem = items[i + 1];\n\n        // if the previous item was a text item with trailing whitespace,\n        // remove leading whitespace inside the fragment\n        if (!previousItem || (isString(previousItem) && trailingWhitespace.test(previousItem))) {\n          removeLeadingWhitespaceInsideFragment = true;\n        }\n\n        // and vice versa\n        if (!nextItem || (isString(nextItem) && leadingWhitespace.test(nextItem))) {\n          removeTrailingWhitespaceInsideFragment = true;\n        }\n      }\n\n      cleanup(\n        item.f,\n        stripComments,\n        preserveWhitespaceInsideFragment,\n        removeLeadingWhitespaceInsideFragment,\n        removeTrailingWhitespaceInsideFragment,\n        whiteSpaceElements\n      );\n    }\n\n    // Split if-else blocks into two (an if, and an unless)\n    if (item.l) {\n      if (item.w) item.l.forEach(l => (l.w = 1));\n      cleanup(\n        item.l,\n        stripComments,\n        preserveWhitespace,\n        removeLeadingWhitespaceInsideFragment,\n        removeTrailingWhitespaceInsideFragment,\n        whiteSpaceElements\n      );\n\n      item.l.forEach(s => (s.l = 1));\n      item.l.unshift(i + 1, 0);\n      items.splice.apply(items, item.l);\n      delete item.l; // TODO would be nice if there was a way around this\n    }\n\n    // Clean up conditional attributes\n    if (item.m) {\n      cleanup(\n        item.m,\n        stripComments,\n        preserveWhitespace,\n        removeLeadingWhitespaceInsideFragment,\n        removeTrailingWhitespaceInsideFragment,\n        whiteSpaceElements\n      );\n      if (item.m.length < 1) delete item.m;\n    }\n\n    delete item.w;\n  }\n\n  // final pass - fuse text nodes together\n  i = items.length;\n  while (i--) {\n    if (isString(items[i])) {\n      if (isString(items[i + 1])) {\n        items[i] = items[i] + items[i + 1];\n        items.splice(i + 1, 1);\n      }\n\n      if (!preserveWhitespace) {\n        items[i] = items[i].replace(contiguousWhitespace, ' ');\n      }\n\n      if (items[i] === '') {\n        items.splice(i, 1);\n      }\n    }\n  }\n}\n","import { CLOSING_TAG } from 'src/config/types';\n\nconst closingTagPattern = /^([a-zA-Z]{1,}:?[a-zA-Z0-9\\-]*)\\s*\\>/;\n\nexport default function readClosingTag(parser) {\n  let tag;\n\n  const start = parser.pos;\n\n  // are we looking at a closing tag?\n  if (!parser.matchString('</')) {\n    return null;\n  }\n\n  if ((tag = parser.matchPattern(closingTagPattern))) {\n    if (parser.inside && tag !== parser.inside) {\n      parser.pos = start;\n      return null;\n    }\n\n    return {\n      t: CLOSING_TAG,\n      e: tag\n    };\n  }\n\n  // We have an illegal closing tag, report it\n  parser.pos -= 2;\n  parser.error('Illegal closing tag');\n}\n","import { ANCHOR, DOCTYPE, ELEMENT, ATTRIBUTE } from 'config/types';\nimport { voidElements } from 'utils/html';\nimport { READERS, PARTIAL_READERS } from '../_parse';\nimport cleanup from 'parse/utils/cleanup';\nimport readMustache from './readMustache';\nimport readClosingTag from './element/readClosingTag';\nimport readClosing from './mustache/section/readClosing';\nimport { create } from 'utils/object';\nimport { isString } from 'utils/is';\nimport hyphenateCamel from 'utils/hyphenateCamel';\n\nconst tagNamePattern = /^[a-zA-Z]{1,}:?[a-zA-Z0-9\\-]*/;\nconst anchorPattern = /^[a-zA-Z_$][-a-zA-Z0-9_$]*/;\nconst validTagNameFollower = /^[\\s\\n\\/>]/;\nconst semiEnd = /;\\s*$/;\nconst exclude = { exclude: true };\n\n// based on http://developers.whatwg.org/syntax.html#syntax-tag-omission\nconst disallowedContents = {\n  li: ['li'],\n  dt: ['dt', 'dd'],\n  dd: ['dt', 'dd'],\n  p: 'address article aside blockquote div dl fieldset footer form h1 h2 h3 h4 h5 h6 header hgroup hr main menu nav ol p pre section table ul'.split(\n    ' '\n  ),\n  rt: ['rt', 'rp'],\n  rp: ['rt', 'rp'],\n  optgroup: ['optgroup'],\n  option: ['option', 'optgroup'],\n  thead: ['tbody', 'tfoot'],\n  tbody: ['tbody', 'tfoot'],\n  tfoot: ['tbody'],\n  tr: ['tr', 'tbody'],\n  td: ['td', 'th', 'tr'],\n  th: ['td', 'th', 'tr']\n};\n\nexport default readElement;\n\nfunction readElement(parser) {\n  let attribute,\n    selfClosing,\n    children,\n    partials,\n    hasPartials,\n    child,\n    closed,\n    pos,\n    remaining,\n    closingTag,\n    anchor;\n\n  const start = parser.pos;\n\n  if (parser.inside || parser.inAttribute || parser.textOnlyMode) {\n    return null;\n  }\n\n  if (!parser.matchString('<')) {\n    return null;\n  }\n\n  // if this is a closing tag, abort straight away\n  if (parser.nextChar() === '/') {\n    return null;\n  }\n\n  const element = {};\n  if (parser.includeLinePositions) {\n    element.q = parser.getLinePos(start);\n  }\n\n  // check for doctype decl\n  if (parser.matchString('!')) {\n    element.t = DOCTYPE;\n    if (!parser.matchPattern(/^doctype/i)) {\n      parser.error('Expected DOCTYPE declaration');\n    }\n\n    element.a = parser.matchPattern(/^(.+?)>/);\n    return element;\n  } else if ((anchor = parser.matchString('#'))) {\n    // check for anchor\n    parser.sp();\n    element.t = ANCHOR;\n    element.n = parser.matchPattern(anchorPattern);\n  } else {\n    // otherwise, it's an element/component\n    element.t = ELEMENT;\n\n    // element name\n    element.e = parser.matchPattern(tagNamePattern);\n    if (!element.e) {\n      return null;\n    }\n  }\n\n  // next character must be whitespace, closing solidus or '>'\n  if (!validTagNameFollower.test(parser.nextChar())) {\n    parser.error('Illegal tag name');\n  }\n\n  parser.sp();\n\n  parser.inTag = true;\n\n  // directives and attributes\n  while ((attribute = readMustache(parser))) {\n    if (attribute !== false) {\n      if (!element.m) element.m = [];\n      element.m.push(attribute);\n    }\n\n    parser.sp();\n  }\n\n  parser.inTag = false;\n\n  // allow whitespace before closing solidus\n  parser.sp();\n\n  // self-closing solidus?\n  if (parser.matchString('/')) {\n    selfClosing = true;\n  }\n\n  // closing angle bracket\n  if (!parser.matchString('>')) {\n    return null;\n  }\n\n  const lowerCaseName = (element.e || element.n).toLowerCase();\n  const preserveWhitespace = parser.preserveWhitespace;\n\n  if (!selfClosing && (anchor || !voidElements[element.e.toLowerCase()])) {\n    if (!anchor) {\n      parser.elementStack.push(lowerCaseName);\n\n      // Special case - if we open a script element, further tags should\n      // be ignored unless they're a closing script element\n      if (lowerCaseName in parser.interpolate) {\n        parser.inside = lowerCaseName;\n      }\n    }\n\n    children = [];\n    partials = create(null);\n\n    do {\n      pos = parser.pos;\n      remaining = parser.remaining();\n\n      if (!remaining) {\n        // if this happens to be a script tag and there's no content left, it's because\n        // a closing script tag can't appear in a script\n        if (parser.inside === 'script') {\n          closed = true;\n          break;\n        }\n\n        parser.error(\n          `Missing end ${parser.elementStack.length > 1 ? 'tags' : 'tag'} (${parser.elementStack\n            .reverse()\n            .map(x => `</${x}>`)\n            .join('')})`\n        );\n      }\n\n      // if for example we're in an <li> element, and we see another\n      // <li> tag, close the first so they become siblings\n      if (!anchor && !canContain(lowerCaseName, remaining)) {\n        closed = true;\n      } else if (!anchor && (closingTag = readClosingTag(parser))) {\n        // closing tag\n        closed = true;\n\n        const closingTagName = closingTag.e.toLowerCase();\n\n        // if this *isn't* the closing tag for the current element...\n        if (closingTagName !== lowerCaseName) {\n          // rewind parser\n          parser.pos = pos;\n\n          // if it doesn't close a parent tag, error\n          if (!~parser.elementStack.indexOf(closingTagName)) {\n            let errorMessage = 'Unexpected closing tag';\n\n            // add additional help for void elements, since component names\n            // might clash with them\n            if (voidElements[closingTagName.toLowerCase()]) {\n              errorMessage += ` (<${closingTagName}> is a void element - it cannot contain children)`;\n            }\n\n            parser.error(errorMessage);\n          }\n        }\n      } else if (anchor && readAnchorClose(parser, element.n)) {\n        closed = true;\n      } else {\n        // implicit close by closing section tag. TODO clean this up\n        const tag = {\n          open: parser.standardDelimiters[0],\n          close: parser.standardDelimiters[1]\n        };\n        if (readClosing(parser, tag) || readInline(parser, tag)) {\n          closed = true;\n          parser.pos = pos;\n        } else if ((child = parser.read(PARTIAL_READERS))) {\n          if (partials[child.n]) {\n            parser.pos = pos;\n            parser.error('Duplicate partial definition');\n          }\n\n          cleanup(\n            child.f,\n            parser.stripComments,\n            preserveWhitespace,\n            !preserveWhitespace,\n            !preserveWhitespace,\n            parser.whiteSpaceElements\n          );\n\n          partials[child.n] = child.f;\n          hasPartials = true;\n        } else {\n          if ((child = parser.read(READERS))) {\n            children.push(child);\n          } else {\n            closed = true;\n          }\n        }\n      }\n    } while (!closed);\n\n    if (children.length) {\n      element.f = children;\n    }\n\n    if (hasPartials) {\n      element.p = partials;\n    }\n\n    parser.elementStack.pop();\n  }\n\n  parser.inside = null;\n\n  if (parser.sanitizeElements && parser.sanitizeElements.indexOf(lowerCaseName) !== -1) {\n    return exclude;\n  }\n\n  if (\n    element.m &&\n    lowerCaseName !== 'input' &&\n    lowerCaseName !== 'select' &&\n    lowerCaseName !== 'textarea' &&\n    lowerCaseName !== 'option'\n  ) {\n    const attrs = element.m;\n    let classes, styles, cls, style;\n    let i = 0;\n    let a;\n    while (i < attrs.length) {\n      a = attrs[i];\n\n      if (a.t !== ATTRIBUTE) {\n        i++;\n        continue;\n      }\n\n      if (a.n.indexOf('class-') === 0 && !a.f) {\n        // static class directives\n        (classes || (classes = [])).push(a.n.slice(6));\n        attrs.splice(i, 1);\n      } else if (a.n.indexOf('style-') === 0 && isString(a.f)) {\n        // static style directives\n        (styles || (styles = [])).push(`${hyphenateCamel(a.n.slice(6))}: ${a.f};`);\n        attrs.splice(i, 1);\n      } else if (a.n === 'class' && isString(a.f)) {\n        // static class attrs\n        (classes || (classes = [])).push(a.f);\n        attrs.splice(i, 1);\n      } else if (a.n === 'style' && isString(a.f)) {\n        // static style attrs\n        (styles || (styles = [])).push(a.f + (semiEnd.test(a.f) ? '' : ';'));\n        attrs.splice(i, 1);\n      } else if (a.n === 'class') {\n        cls = a;\n        i++;\n      } else if (a.n === 'style') {\n        style = a;\n        i++;\n      } else if (\n        !~a.n.indexOf(':') &&\n        a.n !== 'value' &&\n        a.n !== 'contenteditable' &&\n        isString(a.f)\n      ) {\n        a.g = 1;\n        i++;\n      } else {\n        i++;\n      }\n    }\n\n    if (classes) {\n      if (!cls || !isString(cls.f))\n        attrs.unshift({ t: ATTRIBUTE, n: 'class', f: classes.join(' '), g: 1 });\n      else cls.f += ' ' + classes.join(' ');\n    } else if (cls && isString(cls.f)) cls.g = 1;\n\n    if (styles) {\n      if (!style || !isString(style.f))\n        attrs.unshift({ t: ATTRIBUTE, n: 'style', f: styles.join(' '), g: 1 });\n      else style.f += '; ' + styles.join(' ');\n    } else if (style && isString(style.f)) style.g = 1;\n  }\n\n  return element;\n}\n\nfunction canContain(name, remaining) {\n  const match = /^<([a-zA-Z][a-zA-Z0-9]*)/.exec(remaining);\n  const disallowed = disallowedContents[name];\n\n  if (!match || !disallowed) {\n    return true;\n  }\n\n  return !~disallowed.indexOf(match[1].toLowerCase());\n}\n\nfunction readAnchorClose(parser, name) {\n  const pos = parser.pos;\n  if (!parser.matchString('</')) {\n    return null;\n  }\n\n  parser.matchString('#');\n  parser.sp();\n\n  if (!parser.matchString(name)) {\n    parser.pos = pos;\n    return null;\n  }\n\n  parser.sp();\n\n  if (!parser.matchString('>')) {\n    parser.pos = pos;\n    return null;\n  }\n\n  return true;\n}\n\nconst inlines = /^\\s*(elseif|else|then|catch)\\s*/;\nfunction readInline(parser, tag) {\n  const pos = parser.pos;\n  if (!parser.matchString(tag.open)) return;\n  if (parser.matchPattern(inlines)) {\n    return true;\n  } else {\n    parser.pos = pos;\n  }\n}\n","import { INLINE_PARTIAL } from 'config/types';\nimport { READERS } from '../_parse';\nimport readClosing from './mustache/section/readClosing';\n\nconst partialDefinitionSectionPattern = /^\\s*#\\s*partial\\s+/;\n\nexport default function readPartialDefinitionSection(parser) {\n  let child, closed;\n\n  const start = parser.pos;\n\n  const delimiters = parser.standardDelimiters;\n\n  if (!parser.matchString(delimiters[0])) {\n    return null;\n  }\n\n  if (!parser.matchPattern(partialDefinitionSectionPattern)) {\n    parser.pos = start;\n    return null;\n  }\n\n  const name = parser.matchPattern(/^[a-zA-Z_$][a-zA-Z_$0-9\\-\\/]*/);\n\n  if (!name) {\n    parser.error('expected legal partial name');\n  }\n\n  parser.sp();\n  if (!parser.matchString(delimiters[1])) {\n    parser.error(`Expected closing delimiter '${delimiters[1]}'`);\n  }\n\n  const content = [];\n\n  const [open, close] = delimiters;\n\n  do {\n    if ((child = readClosing(parser, { open, close }))) {\n      if (child.r !== 'partial') {\n        parser.error(`Expected ${open}/partial${close}`);\n      }\n\n      closed = true;\n    } else {\n      child = parser.read(READERS);\n\n      if (!child) {\n        parser.error(`Expected ${open}/partial${close}`);\n      }\n\n      content.push(child);\n    }\n  } while (!closed);\n\n  return {\n    t: INLINE_PARTIAL,\n    n: name,\n    f: content\n  };\n}\n","export default {};\n","import { TEMPLATE_VERSION } from 'config/template';\nimport Parser from './Parser';\nimport readMustache from './converters/readMustache';\nimport readTriple from './converters/mustache/readTriple';\nimport readUnescaped from './converters/mustache/readUnescaped';\nimport readPartial from './converters/mustache/readPartial';\nimport readMustacheComment from './converters/mustache/readMustacheComment';\nimport readInterpolator from './converters/mustache/readInterpolator';\nimport readSection from './converters/mustache/readSection';\nimport readHtmlComment from './converters/readHtmlComment';\nimport readElement from './converters/readElement';\nimport readText from './converters/readText';\nimport readPartialDefinitionSection from './converters/readPartialDefinitionSection';\nimport readTemplate from './converters/readTemplate';\nimport readExpression from './converters/readExpression';\nimport { fromExpression } from './utils/createFunction';\nimport cleanup from './utils/cleanup';\nimport insertExpressions from './utils/insertExpressions';\nimport flattenExpression from './utils/flattenExpression';\nimport shared from '../Ractive/shared';\nimport { assign, keys } from 'utils/object';\nimport { isObjectType } from 'utils/is';\n\n// See https://github.com/ractivejs/template-spec for information\n// about the Ractive template specification\n\nconst STANDARD_READERS = [\n  readPartial,\n  readUnescaped,\n  readSection,\n  readInterpolator,\n  readMustacheComment\n];\nconst TRIPLE_READERS = [readTriple];\n\nexport const READERS = [readMustache, readHtmlComment, readElement, readText];\nexport const PARTIAL_READERS = [readPartialDefinitionSection];\n\nconst preserveWhitespaceElements = { pre: 1, script: 1, style: 1, textarea: 1 };\n\nconst defaultInterpolate = { textarea: true, script: true, style: true, template: true };\n\nconst StandardParser = Parser.extend({\n  init(str, options) {\n    const tripleDelimiters = options.tripleDelimiters || shared.defaults.tripleDelimiters;\n    const staticDelimiters = options.staticDelimiters || shared.defaults.staticDelimiters;\n    const staticTripleDelimiters =\n      options.staticTripleDelimiters || shared.defaults.staticTripleDelimiters;\n\n    this.standardDelimiters = options.delimiters || shared.defaults.delimiters;\n\n    this.tags = [\n      {\n        isStatic: false,\n        isTriple: false,\n        open: this.standardDelimiters[0],\n        close: this.standardDelimiters[1],\n        readers: STANDARD_READERS\n      },\n      {\n        isStatic: false,\n        isTriple: true,\n        open: tripleDelimiters[0],\n        close: tripleDelimiters[1],\n        readers: TRIPLE_READERS\n      },\n      {\n        isStatic: true,\n        isTriple: false,\n        open: staticDelimiters[0],\n        close: staticDelimiters[1],\n        readers: STANDARD_READERS\n      },\n      {\n        isStatic: true,\n        isTriple: true,\n        open: staticTripleDelimiters[0],\n        close: staticTripleDelimiters[1],\n        readers: TRIPLE_READERS\n      }\n    ];\n\n    this.contextLines = options.contextLines || shared.defaults.contextLines;\n\n    this.sortMustacheTags();\n\n    this.sectionDepth = 0;\n    this.elementStack = [];\n\n    this.interpolate = assign(\n      {},\n      defaultInterpolate,\n      shared.defaults.interpolate,\n      options.interpolate\n    );\n\n    if (options.sanitize === true) {\n      options.sanitize = {\n        // blacklist from https://code.google.com/p/google-caja/source/browse/trunk/src/com/google/caja/lang/html/html4-elements-whitelist.json\n        elements: 'applet base basefont body frame frameset head html isindex link meta noframes noscript object param script style title'.split(\n          ' '\n        ),\n        eventAttributes: true\n      };\n    }\n\n    this.stripComments = options.stripComments !== false;\n    this.preserveWhitespace = isObjectType(options.preserveWhitespace)\n      ? false\n      : options.preserveWhitespace;\n    this.sanitizeElements = options.sanitize && options.sanitize.elements;\n    this.sanitizeEventAttributes = options.sanitize && options.sanitize.eventAttributes;\n    this.includeLinePositions = options.includeLinePositions;\n    this.textOnlyMode = options.textOnlyMode;\n    this.csp = options.csp;\n    this.allowExpressions = options.allowExpressions;\n\n    this.preserveStandaloneSections = this.preserveWhitespace && options.preserveStandaloneSections;\n\n    if (options.expression) this.converters = [readExpression];\n\n    if (options.attributes) this.inTag = true;\n\n    // special whitespace handling requested for certain elements\n    this.whiteSpaceElements = assign({}, options.preserveWhitespace, preserveWhitespaceElements);\n  },\n\n  postProcess(result, options) {\n    const [parserResult] = result;\n\n    if (options.expression) {\n      const expr = flattenExpression(parserResult);\n      expr.e = fromExpression(expr.s, expr.r.length);\n      return expr;\n    } else {\n      // special case - empty string\n      if (!result.length) {\n        return { t: [], v: TEMPLATE_VERSION };\n      }\n\n      if (this.sectionDepth > 0) {\n        this.error('A section was left open');\n      }\n\n      cleanup(\n        parserResult.t,\n        this.stripComments,\n        this.preserveWhitespace,\n        !this.preserveWhitespace,\n        !this.preserveWhitespace,\n        this.whiteSpaceElements,\n        this.preserveStandaloneSections\n      );\n\n      if (this.csp !== false) {\n        const expr = {};\n\n        insertExpressions(parserResult.t, expr);\n        insertExpressions(parserResult.p || {}, expr);\n\n        if (keys(expr).length) parserResult.e = expr;\n      }\n\n      return parserResult;\n    }\n  },\n\n  converters: [readTemplate],\n\n  sortMustacheTags() {\n    // Sort in order of descending opening delimiter length (longer first),\n    // to protect against opening delimiters being substrings of each other\n    this.tags.sort((a, b) => {\n      return b.open.length - a.open.length;\n    });\n  }\n});\n\nexport default function parse(template, options) {\n  return new StandardParser(template, options || {}).result;\n}\n","import { fromExpression } from 'parse/utils/createFunction';\nimport { doc } from 'config/environment';\nimport { fatal } from 'utils/log';\nimport { addFunctions } from 'shared/getFunction';\nimport parse from 'parse/_parse';\nimport { isString } from 'utils/is';\n\nconst parseOptions = [\n  'delimiters',\n  'tripleDelimiters',\n  'staticDelimiters',\n  'staticTripleDelimiters',\n  'csp',\n  'interpolate',\n  'preserveWhitespace',\n  'preserveStandaloneSections',\n  'sanitize',\n  'stripComments',\n  'contextLines',\n  'allowExpressions',\n  'attributes'\n];\n\nconst TEMPLATE_INSTRUCTIONS = `Either preparse or use a ractive runtime source that includes the parser. `;\n\nconst COMPUTATION_INSTRUCTIONS = `Either include a version of Ractive that can parse or convert your computation strings to functions.`;\n\nfunction throwNoParse(method, error, instructions) {\n  if (!method) {\n    fatal(`Missing Ractive.parse - cannot parse ${error}. ${instructions}`);\n  }\n}\n\nexport function createFunction(body, length) {\n  throwNoParse(fromExpression, 'new expression function', TEMPLATE_INSTRUCTIONS);\n  return fromExpression(body, length);\n}\n\nexport function createFunctionFromString(str, bindTo) {\n  throwNoParse(parse, 'compution string \"${str}\"', COMPUTATION_INSTRUCTIONS);\n  const tpl = parse(str, { expression: true });\n  return function() {\n    return tpl.e.apply(bindTo, tpl.r.map(r => bindTo.get(r)));\n  };\n}\n\nconst parser = {\n  fromId(id, options) {\n    if (!doc) {\n      if (options && options.noThrow) {\n        return;\n      }\n      throw new Error(`Cannot retrieve template #${id} as Ractive is not running in a browser.`);\n    }\n\n    if (id) id = id.replace(/^#/, '');\n\n    let template;\n\n    if (!(template = doc.getElementById(id))) {\n      if (options && options.noThrow) {\n        return;\n      }\n      throw new Error(`Could not find template element with id #${id}`);\n    }\n\n    if (template.tagName.toUpperCase() !== 'SCRIPT') {\n      if (options && options.noThrow) {\n        return;\n      }\n      throw new Error(`Template element with id #${id}, must be a <script> element`);\n    }\n\n    return 'textContent' in template ? template.textContent : template.innerHTML;\n  },\n\n  isParsed(template) {\n    return !isString(template);\n  },\n\n  getParseOptions(ractive) {\n    // Could be Ractive or a Component\n    if (ractive.defaults) {\n      ractive = ractive.defaults;\n    }\n\n    return parseOptions.reduce((val, key) => {\n      val[key] = ractive[key];\n      return val;\n    }, {});\n  },\n\n  parse(template, options) {\n    throwNoParse(parse, 'template', TEMPLATE_INSTRUCTIONS);\n    const parsed = parse(template, options);\n    addFunctions(parsed);\n    return parsed;\n  },\n\n  parseFor(template, ractive) {\n    return this.parse(template, this.getParseOptions(ractive));\n  }\n};\n\nexport default parser;\n","import { removeFromArray } from 'utils/array';\nimport { isFunction } from 'utils/is';\n\nlet id = 0;\n\nexport default class TransitionManager {\n  constructor(callback, parent) {\n    this.callback = callback;\n    this.parent = parent;\n\n    this.intros = [];\n    this.outros = [];\n\n    this.children = [];\n    this.totalChildren = this.outroChildren = 0;\n\n    this.detachQueue = [];\n    this.outrosComplete = false;\n\n    this.id = id++;\n\n    if (parent) {\n      parent.addChild(this);\n    }\n  }\n\n  add(transition) {\n    const list = transition.isIntro ? this.intros : this.outros;\n    transition.starting = true;\n    list.push(transition);\n  }\n\n  addChild(child) {\n    this.children.push(child);\n\n    this.totalChildren += 1;\n    this.outroChildren += 1;\n  }\n\n  checkStart() {\n    if (this.parent && this.parent.started) this.start();\n  }\n\n  decrementOutros() {\n    this.outroChildren -= 1;\n    check(this);\n  }\n\n  decrementTotal() {\n    this.totalChildren -= 1;\n    check(this);\n  }\n\n  detachNodes() {\n    let len = this.detachQueue.length;\n    for (let i = 0; i < len; i++) this.detachQueue[i].detach();\n    len = this.children.length;\n    for (let i = 0; i < len; i++) this.children[i].detachNodes();\n    this.detachQueue = [];\n  }\n\n  ready() {\n    if (this.detachQueue.length) detachImmediate(this);\n  }\n\n  remove(transition) {\n    const list = transition.isIntro ? this.intros : this.outros;\n    removeFromArray(list, transition);\n    check(this);\n  }\n\n  start() {\n    this.started = true;\n    this.children.forEach(c => c.start());\n    this.intros.concat(this.outros).forEach(t => t.start());\n    check(this);\n  }\n}\n\nfunction check(tm) {\n  if (!tm.started || tm.outros.length || tm.outroChildren) return;\n\n  // If all outros are complete, and we haven't already done this,\n  // we notify the parent if there is one, otherwise\n  // start detaching nodes\n  if (!tm.outrosComplete) {\n    tm.outrosComplete = true;\n\n    if (tm.parent) tm.parent.decrementOutros(tm);\n\n    if (allOutrosComplete(tm)) {\n      tm.detachNodes();\n    }\n  }\n\n  // Once everything is done, we can notify parent transition\n  // manager and call the callback\n  if (!tm.intros.length && !tm.totalChildren) {\n    if (isFunction(tm.callback)) {\n      tm.callback();\n    }\n\n    if (tm.parent && !tm.notifiedTotal) {\n      tm.notifiedTotal = true;\n      tm.parent.decrementTotal();\n    }\n  }\n}\n\nfunction allOutrosComplete(manager) {\n  return !manager || (manager.outrosComplete && allOutrosComplete(manager.parent));\n}\n\n// check through the detach queue to see if a node is up or downstream from a\n// transition and if not, go ahead and detach it\nfunction detachImmediate(manager) {\n  const queue = manager.detachQueue;\n  const outros = collectAllOutros(manager);\n\n  if (!outros.length) {\n    manager.detachNodes();\n  } else {\n    let i = queue.length;\n    let j = 0;\n    let node, trans;\n    const nqueue = (manager.detachQueue = []);\n\n    start: while (i--) {\n      node = queue[i].node;\n      j = outros.length;\n      while (j--) {\n        trans = outros[j].element.node;\n        // check to see if the node is, contains, or is contained by the transitioning node\n        if (trans === node || trans.contains(node) || node.contains(trans)) {\n          nqueue.push(queue[i]);\n          continue start;\n        }\n      }\n\n      // no match, we can drop it\n      queue[i].detach();\n    }\n  }\n}\n\nfunction collectAllOutros(manager, _list) {\n  let list = _list;\n\n  // if there's no list, we're starting at the root to build one\n  if (!list) {\n    list = [];\n    let parent = manager;\n    while (parent.parent) parent = parent.parent;\n    return collectAllOutros(parent, list);\n  } else {\n    // grab all outros from child managers\n    let i = manager.children.length;\n    while (i--) {\n      list = collectAllOutros(manager.children[i], list);\n    }\n\n    // grab any from this manager if there are any\n    if (manager.outros.length) list = list.concat(manager.outros);\n\n    return list;\n  }\n}\n","import { addToArray } from 'utils/array';\nimport TransitionManager from './TransitionManager';\n\nexport let batch;\n\nconst runloop = {\n  active() {\n    return !!batch;\n  },\n\n  start() {\n    let fulfilPromise;\n    const promise = new Promise(f => (fulfilPromise = f));\n\n    batch = {\n      previousBatch: batch,\n      transitionManager: new TransitionManager(fulfilPromise, batch && batch.transitionManager),\n      fragments: [],\n      tasks: [],\n      immediateObservers: [],\n      deferredObservers: [],\n      promise\n    };\n\n    return promise;\n  },\n\n  end() {\n    flushChanges();\n\n    if (!batch.previousBatch) batch.transitionManager.start();\n    else batch.transitionManager.checkStart();\n\n    batch = batch.previousBatch;\n  },\n\n  addFragment(fragment) {\n    addToArray(batch.fragments, fragment);\n  },\n\n  // TODO: come up with a better way to handle fragments that trigger their own update\n  addFragmentToRoot(fragment) {\n    if (!batch) return;\n\n    let b = batch;\n    while (b.previousBatch) {\n      b = b.previousBatch;\n    }\n\n    addToArray(b.fragments, fragment);\n  },\n\n  addObserver(observer, defer) {\n    if (!batch) {\n      observer.dispatch();\n    } else {\n      addToArray(defer ? batch.deferredObservers : batch.immediateObservers, observer);\n    }\n  },\n\n  registerTransition(transition) {\n    transition._manager = batch.transitionManager;\n    batch.transitionManager.add(transition);\n  },\n\n  // synchronise node detachments with transition ends\n  detachWhenReady(thing) {\n    batch.transitionManager.detachQueue.push(thing);\n  },\n\n  scheduleTask(task, postRender) {\n    let _batch;\n\n    if (!batch) {\n      task();\n    } else {\n      _batch = batch;\n      while (postRender && _batch.previousBatch) {\n        // this can't happen until the DOM has been fully updated\n        // otherwise in some situations (with components inside elements)\n        // transitions and decorators will initialise prematurely\n        _batch = _batch.previousBatch;\n      }\n\n      _batch.tasks.push(task);\n    }\n  },\n\n  promise() {\n    if (!batch) return Promise.resolve();\n\n    let target = batch;\n    while (target.previousBatch) {\n      target = target.previousBatch;\n    }\n\n    return target.promise || Promise.resolve();\n  }\n};\n\nexport default runloop;\n\nfunction dispatch(observer) {\n  observer.dispatch();\n}\n\nfunction flushChanges() {\n  let which = batch.immediateObservers;\n  batch.immediateObservers = [];\n  which.forEach(dispatch);\n\n  // Now that changes have been fully propagated, we can update the DOM\n  // and complete other tasks\n  let i = batch.fragments.length;\n  let fragment;\n\n  which = batch.fragments;\n  batch.fragments = [];\n\n  while (i--) {\n    fragment = which[i];\n    fragment.update();\n  }\n\n  batch.transitionManager.ready();\n\n  which = batch.deferredObservers;\n  batch.deferredObservers = [];\n  which.forEach(dispatch);\n\n  const tasks = batch.tasks;\n  batch.tasks = [];\n\n  for (i = 0; i < tasks.length; i += 1) {\n    tasks[i]();\n  }\n\n  // If updating the view caused some model blowback - e.g. a triple\n  // containing <option> elements caused the binding on the <select>\n  // to update - then we start over\n  if (\n    batch.fragments.length ||\n    batch.immediateObservers.length ||\n    batch.deferredObservers.length ||\n    batch.tasks.length\n  )\n    return flushChanges();\n}\n","import runloop from 'src/global/runloop';\n\n// TODO what happens if a transition is aborted?\n\nconst tickers = [];\nlet running = false;\n\nfunction tick() {\n  runloop.start();\n\n  const now = performance.now();\n\n  let i;\n  let ticker;\n\n  for (i = 0; i < tickers.length; i += 1) {\n    ticker = tickers[i];\n\n    if (!ticker.tick(now)) {\n      // ticker is complete, remove it from the stack, and decrement i so we don't miss one\n      tickers.splice(i--, 1);\n    }\n  }\n\n  runloop.end();\n\n  if (tickers.length) {\n    requestAnimationFrame(tick);\n  } else {\n    running = false;\n  }\n}\n\nexport default class Ticker {\n  constructor(options) {\n    this.duration = options.duration;\n    this.step = options.step;\n    this.complete = options.complete;\n    this.easing = options.easing;\n\n    this.start = performance.now();\n    this.end = this.start + this.duration;\n\n    this.running = true;\n\n    tickers.push(this);\n    if (!running) requestAnimationFrame(tick);\n  }\n\n  tick(now) {\n    if (!this.running) return false;\n\n    if (now > this.end) {\n      if (this.step) this.step(1);\n      if (this.complete) this.complete(1);\n\n      return false;\n    }\n\n    const elapsed = now - this.start;\n    const eased = this.easing(elapsed / this.duration);\n\n    if (this.step) this.step(eased);\n\n    return true;\n  }\n\n  stop() {\n    if (this.abort) this.abort();\n    this.running = false;\n  }\n}\n","import { hasOwn } from 'utils/object';\nimport { isString, isObjectType } from 'utils/is';\n\nconst prefixers = {};\n\n// TODO this is legacy. sooner we can replace the old adaptor API the better\n/* istanbul ignore next */\nfunction prefixKeypath(obj, prefix) {\n  const prefixed = {};\n\n  if (!prefix) {\n    return obj;\n  }\n\n  prefix += '.';\n\n  for (const key in obj) {\n    if (hasOwn(obj, key)) {\n      prefixed[prefix + key] = obj[key];\n    }\n  }\n\n  return prefixed;\n}\n\nexport default function getPrefixer(rootKeypath) {\n  let rootDot;\n\n  if (!prefixers[rootKeypath]) {\n    rootDot = rootKeypath ? rootKeypath + '.' : '';\n\n    /* istanbul ignore next */\n    prefixers[rootKeypath] = function(relativeKeypath, value) {\n      let obj;\n\n      if (isString(relativeKeypath)) {\n        obj = {};\n        obj[rootDot + relativeKeypath] = value;\n        return obj;\n      }\n\n      if (isObjectType(relativeKeypath)) {\n        // 'relativeKeypath' is in fact a hash, not a keypath\n        return rootDot ? prefixKeypath(relativeKeypath, rootKeypath) : relativeKeypath;\n      }\n    };\n  }\n\n  return prefixers[rootKeypath];\n}\n","import ModelBase, { checkDataLink, maybeBind, shuffle } from './ModelBase';\nimport LinkModel from './LinkModel'; // eslint-disable-line no-unused-vars\nimport getComputationSignature from 'src/Ractive/helpers/getComputationSignature';\nimport { capture } from 'src/global/capture';\nimport { isArray, isEqual, isNumeric, isObjectLike, isUndefined } from 'utils/is';\nimport { handleChange, mark, markForce, marked, teardown } from 'shared/methodCallers';\nimport Ticker from 'shared/Ticker';\nimport getPrefixer from './helpers/getPrefixer';\nimport { unescapeKey } from 'shared/keypaths';\nimport { warnIfDebug } from 'utils/log';\nimport { hasOwn, keys } from 'utils/object';\nimport { buildNewIndices } from 'utils/array';\n\nexport const shared = {};\n\nexport default class Model extends ModelBase {\n  constructor(parent, key) {\n    super(parent);\n\n    this.ticker = null;\n\n    if (parent) {\n      this.key = unescapeKey(key);\n      this.isReadonly = parent.isReadonly;\n\n      if (parent.value) {\n        this.value = parent.value[this.key];\n        if (isArray(this.value)) this.length = this.value.length;\n        this.adapt();\n      }\n    }\n  }\n\n  adapt() {\n    const adaptors = this.root.adaptors;\n    const len = adaptors.length;\n\n    this.rewrap = false;\n\n    // Exit early if no adaptors\n    if (len === 0) return;\n\n    const value = this.wrapper\n      ? 'newWrapperValue' in this\n        ? this.newWrapperValue\n        : this.wrapperValue\n      : this.value;\n\n    // TODO remove this legacy nonsense\n    const ractive = this.root.ractive;\n    const keypath = this.getKeypath();\n\n    // tear previous adaptor down if present\n    if (this.wrapper) {\n      const shouldTeardown =\n        this.wrapperValue === value\n          ? false\n          : !this.wrapper.reset || this.wrapper.reset(value) === false;\n\n      if (shouldTeardown) {\n        this.wrapper.teardown();\n        delete this.wrapper;\n        delete this.wrapperValue;\n        delete this.newWrapperValue;\n\n        // don't branch for undefined values\n        if (this.value !== undefined) {\n          const parentValue = this.parent.value || this.parent.createBranch(this.key);\n          if (parentValue[this.key] !== value) parentValue[this.key] = value;\n          this.value = value;\n        }\n      } else {\n        delete this.newWrapperValue;\n        this.value = this.wrapper.get();\n        return;\n      }\n    }\n\n    let i;\n\n    for (i = 0; i < len; i += 1) {\n      const adaptor = adaptors[i];\n      if (adaptor.filter(value, keypath, ractive)) {\n        this.wrapper = adaptor.wrap(ractive, value, keypath, getPrefixer(keypath));\n        this.wrapperValue = value;\n        this.wrapper.__model = this; // massive temporary hack to enable array adaptor\n\n        this.value = this.wrapper.get();\n\n        break;\n      }\n    }\n  }\n\n  animate(from, to, options, interpolator) {\n    if (this.ticker) this.ticker.stop();\n\n    let fulfilPromise;\n    const promise = new Promise(fulfil => (fulfilPromise = fulfil));\n\n    this.ticker = new Ticker({\n      duration: options.duration,\n      easing: options.easing,\n      step: t => {\n        const value = interpolator(t);\n        this.applyValue(value);\n        if (options.step) options.step(t, value);\n      },\n      complete: () => {\n        this.applyValue(to);\n        if (options.complete) options.complete(to);\n\n        this.ticker = null;\n        fulfilPromise(to);\n      }\n    });\n\n    promise.stop = this.ticker.stop;\n    return promise;\n  }\n\n  applyValue(value, notify = true) {\n    if (isEqual(value, this.value)) return;\n    if (this.boundValue) this.boundValue = null;\n\n    if (this.parent.wrapper && this.parent.wrapper.set) {\n      this.parent.wrapper.set(this.key, value);\n      this.parent.value = this.parent.wrapper.get();\n\n      this.value = this.parent.value[this.key];\n      if (this.wrapper) this.newWrapperValue = this.value;\n      this.adapt();\n    } else if (this.wrapper) {\n      this.newWrapperValue = value;\n      this.adapt();\n    } else {\n      const parentValue = this.parent.value || this.parent.createBranch(this.key);\n      if (isObjectLike(parentValue)) {\n        parentValue[this.key] = value;\n      } else {\n        warnIfDebug(`Attempted to set a property of a non-object '${this.getKeypath()}'`);\n        return;\n      }\n\n      this.value = value;\n      this.adapt();\n    }\n\n    if (this.dataModel || (value && value.viewmodel && value.viewmodel.isRoot)) {\n      checkDataLink(this, value);\n    }\n\n    // keep track of array stuff\n    if (isArray(value)) {\n      this.length = value.length;\n      this.isArray = true;\n    } else {\n      this.isArray = false;\n    }\n\n    // notify dependants\n    this.links.forEach(handleChange);\n    this.children.forEach(mark);\n    this.deps.forEach(handleChange);\n\n    if (notify) this.notifyUpstream();\n\n    if (this.parent.isArray) {\n      if (this.key === 'length') this.parent.length = value;\n      else this.parent.joinKey('length').mark();\n    }\n  }\n\n  compute(key, computed) {\n    const registry = this.computed || (this.computed = {});\n\n    if (registry[key]) {\n      registry[key].signature = getComputationSignature(this.root.ractive, key, computed);\n      registry[key].mark();\n    } else {\n      registry[key] = new shared.Computation(\n        this,\n        getComputationSignature(this.root.ractive, key, computed),\n        key\n      );\n    }\n\n    return registry[key];\n  }\n\n  createBranch(key) {\n    const branch = isNumeric(key) ? [] : {};\n    this.applyValue(branch, false);\n\n    return branch;\n  }\n\n  get(shouldCapture, opts) {\n    if (this._link) return this._link.get(shouldCapture, opts);\n    if (shouldCapture) capture(this);\n    // if capturing, this value needs to be unwrapped because it's for external use\n    if (opts && opts.virtual) return this.getVirtual(false);\n    return maybeBind(\n      this,\n      (opts && 'unwrap' in opts ? opts.unwrap !== false : shouldCapture) && this.wrapper\n        ? this.wrapperValue\n        : this.value,\n      !opts || opts.shouldBind !== false\n    );\n  }\n\n  joinKey(key, opts) {\n    if (this._link) {\n      if (opts && opts.lastLink !== false && (isUndefined(key) || key === '')) return this;\n      return this._link.joinKey(key);\n    }\n\n    if (isUndefined(key) || key === '') return this;\n\n    let child;\n    if (hasOwn(this.childByKey, key)) child = this.childByKey[key];\n    else child = this.computed && this.computed[key];\n\n    if (!child) {\n      let computed;\n      if (this.isRoot && this.ractive && (computed = this.ractive.computed[key])) {\n        child = this.compute(key, computed);\n      } else if (!this.isRoot && this.root.ractive) {\n        const registry = this.root.ractive.computed;\n        for (const k in registry) {\n          computed = registry[k];\n          if (computed.pattern && computed.pattern.test(this.getKeypath() + '.' + key)) {\n            child = this.compute(key, computed);\n          }\n        }\n      }\n    }\n\n    if (!child) {\n      child = new Model(this, key);\n      this.children.push(child);\n      this.childByKey[key] = child;\n\n      if (key === 'data') {\n        const val = this.retrieve();\n        if (val && val.viewmodel && val.viewmodel.isRoot) {\n          child.link(val.viewmodel, 'data');\n          this.dataModel = val;\n        }\n      }\n    }\n\n    if (child._link && (!opts || opts.lastLink !== false)) return child._link;\n\n    return child;\n  }\n\n  mark(force) {\n    if (this._link) return this._link.mark(force);\n\n    const old = this.value;\n    const value = this.retrieve();\n\n    if (this.dataModel || (value && value.viewmodel && value.viewmodel.isRoot)) {\n      checkDataLink(this, value);\n    }\n\n    if (force || !isEqual(value, old)) {\n      this.value = value;\n      if (this.boundValue) this.boundValue = null;\n\n      // make sure the wrapper stays in sync\n      if (old !== value || this.rewrap) {\n        if (this.wrapper) this.newWrapperValue = value;\n        this.adapt();\n      }\n\n      // keep track of array stuff\n      if (isArray(value)) {\n        this.length = value.length;\n        this.isArray = true;\n      } else {\n        this.isArray = false;\n      }\n\n      this.children.forEach(force ? markForce : mark);\n      this.links.forEach(marked);\n\n      this.deps.forEach(handleChange);\n    }\n  }\n\n  merge(array, comparator) {\n    const newIndices = buildNewIndices(\n      this.value === array ? recreateArray(this) : this.value,\n      array,\n      comparator\n    );\n    this.parent.value[this.key] = array;\n    this.shuffle(newIndices, true);\n  }\n\n  retrieve() {\n    return this.parent.value ? this.parent.value[this.key] : undefined;\n  }\n\n  set(value) {\n    if (this.ticker) this.ticker.stop();\n    this.applyValue(value);\n  }\n\n  shuffle(newIndices, unsafe) {\n    shuffle(this, newIndices, false, unsafe);\n  }\n\n  source() {\n    return this;\n  }\n\n  teardown() {\n    if (this._link) {\n      this._link.teardown();\n      this._link = null;\n    }\n    this.children.forEach(teardown);\n    if (this.wrapper) this.wrapper.teardown();\n    if (this.computed) keys(this.computed).forEach(k => this.computed[k].teardown());\n  }\n}\n\nfunction recreateArray(model) {\n  const array = [];\n\n  for (let i = 0; i < model.length; i++) {\n    array[i] = (model.childByKey[i] || {}).value;\n  }\n\n  return array;\n}\n","/* global global */\nimport Model from '../Model';\nimport { base } from 'config/environment';\n\nexport const data = {};\n\nexport class SharedModel extends Model {\n  constructor(value, name, ractive) {\n    super(null, `@${name}`);\n    this.key = `@${name}`;\n    this.value = value;\n    this.isRoot = true;\n    this.root = this;\n    this.adaptors = [];\n    this.ractive = ractive;\n  }\n\n  getKeypath() {\n    return this.key;\n  }\n\n  retrieve() {\n    return this.value;\n  }\n}\n\nexport default new SharedModel(data, 'shared');\n\nexport const GlobalModel = new SharedModel(base, 'global');\n","import noop from 'utils/noop';\nimport { assign, create } from 'utils/object';\n\nexport const extern = {};\n\nexport default function getRactiveContext(ractive, ...assigns) {\n  const fragment =\n    ractive.fragment ||\n    ractive._fakeFragment ||\n    (ractive._fakeFragment = new FakeFragment(ractive));\n  return fragment.getContext.apply(fragment, assigns);\n}\n\nexport function getContext(...assigns) {\n  if (!this.ctx) this.ctx = new extern.Context(this);\n  assigns.unshift(create(this.ctx));\n  return assign.apply(null, assigns);\n}\n\nexport class FakeFragment {\n  constructor(ractive) {\n    this.ractive = ractive;\n  }\n\n  findContext() {\n    return this.ractive.viewmodel;\n  }\n}\nconst proto = FakeFragment.prototype;\nproto.getContext = getContext;\nproto.find = proto.findComponent = proto.findAll = proto.findAllComponents = noop;\n\nexport function findParentWithContext(fragment) {\n  let frag = fragment;\n  while (frag && !frag.context) frag = frag.parent;\n  if (!frag) return fragment && fragment.ractive.fragment;\n  else return frag;\n}\n","import {\n  isArray,\n  isDate,\n  isObject,\n  isObjectType,\n  isFunction,\n  isString,\n  isUndefined\n} from 'utils/is';\nimport { warnIfDebug } from 'utils/log';\nimport resolveReference from 'src/view/resolvers/resolveReference';\nimport runloop from '../global/runloop';\nimport { splitKeypath } from './keypaths';\nimport { FakeFragment } from './getRactiveContext';\nimport { hasOwn } from 'utils/object';\n\nexport let keep = false;\n\nexport function set(pairs, options) {\n  const k = keep;\n\n  const deep = options && options.deep;\n  const shuffle = options && options.shuffle;\n  const promise = runloop.start();\n  if (options && 'keep' in options) keep = options.keep;\n\n  let i = pairs.length;\n  while (i--) {\n    const model = pairs[i][0];\n    const value = pairs[i][1];\n    const keypath = pairs[i][2];\n\n    if (!model) {\n      runloop.end();\n      throw new Error(`Failed to set invalid keypath '${keypath}'`);\n    }\n\n    if (deep) deepSet(model, value);\n    else if (shuffle) {\n      let array = value;\n      const target = model.get();\n      // shuffle target array with itself\n      if (!array) array = target;\n\n      // if there's not an array there yet, go ahead and set\n      if (isUndefined(target)) {\n        model.set(array);\n      } else {\n        if (!isArray(target) || !isArray(array)) {\n          runloop.end();\n          throw new Error('You cannot merge an array with a non-array');\n        }\n\n        const comparator = getComparator(shuffle);\n        model.merge(array, comparator);\n      }\n    } else model.set(value);\n  }\n\n  runloop.end();\n\n  keep = k;\n\n  if (pairs.length === 1) return promise.then(() => pairs[0][1]);\n  else return promise;\n}\n\nconst star = /\\*/;\nexport function gather(ractive, keypath, base, isolated) {\n  if (!base && (keypath[0] === '.' || keypath[1] === '^')) {\n    warnIfDebug(\n      `Attempted to set a relative keypath from a non-relative context. You can use a context object to set relative keypaths.`\n    );\n    return [];\n  }\n\n  const keys = splitKeypath(keypath);\n  const model = base || ractive.viewmodel;\n\n  if (star.test(keypath)) {\n    return model.findMatches(keys);\n  } else {\n    if (model === ractive.viewmodel) {\n      // allow implicit mappings\n      if (\n        ractive.component &&\n        !ractive.isolated &&\n        !model.has(keys[0]) &&\n        keypath[0] !== '@' &&\n        keypath[0] &&\n        !isolated\n      ) {\n        return [resolveReference(ractive.fragment || new FakeFragment(ractive), keypath)];\n      } else {\n        return [model.joinAll(keys)];\n      }\n    } else {\n      return [model.joinAll(keys)];\n    }\n  }\n}\n\nexport function build(ractive, keypath, value, isolated) {\n  const sets = [];\n\n  // set multiple keypaths in one go\n  if (isObject(keypath)) {\n    for (const k in keypath) {\n      if (hasOwn(keypath, k)) {\n        sets.push.apply(sets, gather(ractive, k, null, isolated).map(m => [m, keypath[k], k]));\n      }\n    }\n  } else {\n    // set a single keypath\n    sets.push.apply(sets, gather(ractive, keypath, null, isolated).map(m => [m, value, keypath]));\n  }\n\n  return sets;\n}\n\nconst deepOpts = { virtual: false };\nfunction deepSet(model, value) {\n  const dest = model.get(false, deepOpts);\n\n  // if dest doesn't exist, just set it\n  if (dest == null || !isObjectType(value) || isDate(value)) return model.set(value);\n  if (!isObjectType(dest)) return model.set(value);\n\n  for (const k in value) {\n    if (hasOwn(value, k)) {\n      deepSet(model.joinKey(k), value[k]);\n    }\n  }\n}\n\nconst comparators = {};\nfunction getComparator(option) {\n  if (option === true) return null; // use existing arrays\n  if (isFunction(option)) return option;\n\n  if (isString(option)) {\n    return comparators[option] || (comparators[option] = thing => thing[option]);\n  }\n\n  throw new Error('If supplied, options.compare must be a string, function, or true'); // TODO link to docs\n}\n","import { isNumeric, isString } from 'utils/is';\nimport { build, set } from 'shared/set';\n\nconst errorMessage = 'Cannot add to a non-numeric value';\n\nexport default function add(ractive, keypath, d, options) {\n  if (!isString(keypath) || !isNumeric(d)) {\n    throw new Error('Bad arguments');\n  }\n\n  const sets = build(ractive, keypath, d, options && options.isolated);\n\n  return set(\n    sets.map(pair => {\n      const [model, add] = pair;\n      const value = model.get();\n      if (!isNumeric(add) || !isNumeric(value)) throw new Error(errorMessage);\n      return [model, value + add];\n    })\n  );\n}\n","import runloop from 'src/global/runloop';\nimport easing from 'src/Ractive/static/easing';\nimport interpolate from 'shared/interpolate';\nimport { isEqual, isFunction, isObjectType } from 'utils/is';\nimport noop from 'utils/noop';\nimport { splitKeypath } from 'shared/keypaths';\nimport { defineProperty, keys as objectKeys } from 'utils/object';\n\nfunction immediate(value) {\n  const result = Promise.resolve(value);\n  defineProperty(result, 'stop', { value: noop });\n  return result;\n}\n\nconst linear = easing.linear;\n\nfunction getOptions(options, instance) {\n  options = options || {};\n\n  let easing;\n  if (options.easing) {\n    easing = isFunction(options.easing) ? options.easing : instance.easing[options.easing];\n  }\n\n  return {\n    easing: easing || linear,\n    duration: 'duration' in options ? options.duration : 400,\n    complete: options.complete || noop,\n    step: options.step || noop,\n    interpolator: options.interpolator\n  };\n}\n\nexport function animate(ractive, model, to, options) {\n  options = getOptions(options, ractive);\n  const from = model.get();\n\n  // don't bother animating values that stay the same\n  if (isEqual(from, to)) {\n    options.complete(options.to);\n    return immediate(to);\n  }\n\n  const interpolator = interpolate(from, to, ractive, options.interpolator);\n\n  // if we can't interpolate the value, set it immediately\n  if (!interpolator) {\n    runloop.start();\n    model.set(to);\n    runloop.end();\n\n    return immediate(to);\n  }\n\n  return model.animate(from, to, options, interpolator);\n}\n\nexport default function Ractive$animate(keypath, to, options) {\n  if (isObjectType(keypath)) {\n    const keys = objectKeys(keypath);\n\n    throw new Error(`ractive.animate(...) no longer supports objects. Instead of ractive.animate({\n  ${keys.map(key => `'${key}': ${keypath[key]}`).join('\\n  ')}\n}, {...}), do\n\n${keys.map(key => `ractive.animate('${key}', ${keypath[key]}, {...});`).join('\\n')}\n`);\n  }\n\n  return animate(this, this.viewmodel.joinAll(splitKeypath(keypath)), to, options);\n}\n","import { enqueue, dequeue } from './eventStack';\n\nconst initStars = {};\nconst bubbleStars = {};\n\n// cartesian product of name parts and stars\n// adjusted appropriately for special cases\nfunction variants(name, initial) {\n  const map = initial ? initStars : bubbleStars;\n  if (map[name]) return map[name];\n\n  const parts = name.split('.');\n  const result = [];\n  let base = false;\n\n  // initial events the implicit namespace of 'this'\n  if (initial) {\n    parts.unshift('this');\n    base = true;\n  }\n\n  // use max - 1 bits as a bitmap to pick a part or a *\n  // need to skip the full star case if the namespace is synthetic\n  const max = Math.pow(2, parts.length) - (initial ? 1 : 0);\n  for (let i = 0; i < max; i++) {\n    const join = [];\n    for (let j = 0; j < parts.length; j++) {\n      join.push(1 & (i >> j) ? '*' : parts[j]);\n    }\n    result.unshift(join.join('.'));\n  }\n\n  if (base) {\n    // include non-this-namespaced versions\n    if (parts.length > 2) {\n      result.push.apply(result, variants(name, false));\n    } else {\n      result.push('*');\n      result.push(name);\n    }\n  }\n\n  map[name] = result;\n  return result;\n}\n\nexport default function fireEvent(ractive, eventName, context, args = []) {\n  if (!eventName) {\n    return;\n  }\n\n  context.name = eventName;\n  args.unshift(context);\n\n  const eventNames = ractive._nsSubs ? variants(eventName, true) : ['*', eventName];\n\n  return fireEventAs(ractive, eventNames, context, args, true);\n}\n\nfunction fireEventAs(ractive, eventNames, context, args, initialFire = false) {\n  let bubble = true;\n\n  if (initialFire || ractive._nsSubs) {\n    enqueue(ractive, context);\n\n    let i = eventNames.length;\n    while (i--) {\n      if (eventNames[i] in ractive._subs) {\n        bubble = notifySubscribers(ractive, ractive._subs[eventNames[i]], context, args) && bubble;\n      }\n    }\n\n    dequeue(ractive);\n  }\n\n  if (ractive.parent && bubble) {\n    if (initialFire && ractive.component) {\n      const fullName = ractive.component.name + '.' + eventNames[eventNames.length - 1];\n      eventNames = variants(fullName, false);\n\n      if (context && !context.component) {\n        context.component = ractive;\n      }\n    }\n\n    bubble = fireEventAs(ractive.parent, eventNames, context, args);\n  }\n\n  return bubble;\n}\n\nfunction notifySubscribers(ractive, subscribers, context, args) {\n  let originalEvent = null;\n  let stopEvent = false;\n\n  // subscribers can be modified inflight, e.g. \"once\" functionality\n  // so we need to copy to make sure everyone gets called\n  subscribers = subscribers.slice();\n\n  for (let i = 0, len = subscribers.length; i < len; i += 1) {\n    if (!subscribers[i].off && subscribers[i].handler.apply(ractive, args) === false) {\n      stopEvent = true;\n    }\n  }\n\n  if (context && stopEvent && (originalEvent = context.event)) {\n    originalEvent.preventDefault && originalEvent.preventDefault();\n    originalEvent.stopPropagation && originalEvent.stopPropagation();\n  }\n\n  return !stopEvent;\n}\n","import fireEvent from './fireEvent';\nimport getRactiveContext from '../shared/getRactiveContext';\n\nexport class Hook {\n  constructor(event) {\n    this.event = event;\n    this.method = 'on' + event;\n  }\n\n  fire(ractive, arg) {\n    const context = getRactiveContext(ractive);\n    const method = this.method;\n\n    if (ractive[method]) {\n      arg ? ractive[method](context, arg) : ractive[method](context);\n    }\n\n    fireEvent(ractive, this.event, context, arg ? [arg, ractive] : [ractive]);\n  }\n}\n\nfunction getChildQueue(queue, ractive) {\n  return queue[ractive._guid] || (queue[ractive._guid] = []);\n}\n\nfunction fire(hookQueue, ractive) {\n  const childQueue = getChildQueue(hookQueue.queue, ractive);\n\n  hookQueue.hook.fire(ractive);\n\n  // queue is \"live\" because components can end up being\n  // added while hooks fire on parents that modify data values.\n  while (childQueue.length) {\n    fire(hookQueue, childQueue.shift());\n  }\n\n  delete hookQueue.queue[ractive._guid];\n}\n\nexport class HookQueue {\n  constructor(event) {\n    this.hook = new Hook(event);\n    this.inProcess = {};\n    this.queue = {};\n  }\n\n  begin(ractive) {\n    this.inProcess[ractive._guid] = true;\n  }\n\n  end(ractive) {\n    const parent = ractive.parent;\n\n    // If this is *isn't* a child of a component that's in process,\n    // it should call methods or fire at this point\n    if (!parent || !this.inProcess[parent._guid]) {\n      fire(this, ractive);\n    } else {\n      // elsewise, handoff to parent to fire when ready\n      getChildQueue(this.queue, parent).push(ractive);\n    }\n\n    delete this.inProcess[ractive._guid];\n  }\n}\n\nconst hooks = {};\n[\n  'construct',\n  'config',\n  'attachchild',\n  'detach',\n  'detachchild',\n  'insert',\n  'complete',\n  'reset',\n  'render',\n  'unrendering',\n  'unrender',\n  'teardown',\n  'destruct',\n  'update'\n].forEach(hook => {\n  hooks[hook] = new Hook(hook);\n});\nhooks.init = new HookQueue('init');\n\nexport default hooks;\n","import { splitKeypath } from 'shared/keypaths';\nimport runloop from 'src/global/runloop';\nimport getNewIndices from 'shared/getNewIndices';\nimport { isArray, isUndefined } from 'utils/is';\n\nconst arrayProto = Array.prototype;\n\nexport default function(methodName) {\n  function path(keypath, ...args) {\n    return model(this.viewmodel.joinAll(splitKeypath(keypath)), args);\n  }\n\n  function model(mdl, args) {\n    let array = mdl.get();\n\n    if (!isArray(array)) {\n      if (isUndefined(array)) {\n        array = [];\n        const result = arrayProto[methodName].apply(array, args);\n        const promise = runloop.start().then(() => result);\n        mdl.set(array);\n        runloop.end();\n        return promise;\n      } else {\n        throw new Error(\n          `shuffle array method ${methodName} called on non-array at ${mdl.getKeypath()}`\n        );\n      }\n    }\n\n    const newIndices = getNewIndices(array.length, methodName, args);\n    const result = arrayProto[methodName].apply(array, args);\n\n    const promise = runloop.start().then(() => result);\n    promise.result = result;\n\n    if (newIndices) {\n      if (mdl.shuffle) {\n        mdl.shuffle(newIndices);\n      } else {\n        // it's a computation, which don't have a shuffle, so just invalidate\n        mdl.mark();\n      }\n    } else {\n      mdl.set(result);\n    }\n\n    runloop.end();\n\n    return promise;\n  }\n\n  return { path, model };\n}\n","import hooks from 'src/events/Hook';\nimport { removeFromArray } from 'utils/array';\nimport { cancel } from 'shared/methodCallers';\nimport { warnIfDebug } from 'utils/log';\n\n// Teardown. This goes through the root fragment and all its children, removing observers\n// and generally cleaning up after itself\n\nexport default function Ractive$teardown() {\n  if (this.torndown) {\n    warnIfDebug('ractive.teardown() was called on a Ractive instance that was already torn down');\n    return Promise.resolve();\n  }\n\n  this.shouldDestroy = true;\n  return teardown(this, () => (this.fragment.rendered ? this.unrender() : Promise.resolve()));\n}\n\nexport function teardown(instance, getPromise) {\n  instance.torndown = true;\n  instance.fragment.unbind();\n  instance._observers.slice().forEach(cancel);\n\n  if (instance.el && instance.el.__ractive_instances__) {\n    removeFromArray(instance.el.__ractive_instances__, instance);\n  }\n\n  const promise = getPromise();\n\n  hooks.teardown.fire(instance);\n\n  promise.then(() => {\n    hooks.destruct.fire(instance);\n    instance.viewmodel.teardown();\n  });\n\n  return promise;\n}\n","import { create, toPairs } from 'utils/object';\nimport { isFunction, isObjectType } from 'utils/is';\n\nexport default function subscribe(instance, options, type) {\n  const subs = (instance.constructor[`_${type}`] || []).concat(toPairs(options[type] || []));\n  const single = type === 'on' ? 'once' : `${type}Once`;\n\n  subs.forEach(([target, config]) => {\n    if (isFunction(config)) {\n      instance[type](target, config);\n    } else if (isObjectType(config) && isFunction(config.handler)) {\n      instance[config.once ? single : type](target, config.handler, create(config));\n    }\n  });\n}\n","import getFunction from 'shared/getFunction';\nimport ExpressionProxy from 'src/view/resolvers/ExpressionProxy';\nimport resolveReference from '../../resolvers/resolveReference';\n\nexport function setupArgsFn(item, template, fragment, opts = {}) {\n  if (template && template.f && template.f.s) {\n    if (opts.register) {\n      item.model = new ExpressionProxy(fragment, template.f);\n      item.model.register(item);\n    } else {\n      item.fn = getFunction(template.f.s, template.f.r.length);\n    }\n  }\n}\n\nexport function resolveArgs(item, template, fragment, opts = {}) {\n  return template.f.r.map((ref, i) => {\n    let model;\n\n    if (opts.specialRef && (model = opts.specialRef(ref, i))) return model;\n\n    model = resolveReference(fragment, ref);\n\n    return model;\n  });\n}\n\nexport function teardownArgsFn(item) {\n  if (item.model) item.model.unregister(item);\n}\n","// This is the handler for DOM events that would lead to a change in the model\n// (i.e. change, sometimes, input, and occasionally click and keyup)\nexport default function handleDomEvent() {\n  this._ractive.binding.handleChange();\n}\n","import { toArray } from './array';\n\nexport default function getSelectedOptions(select) {\n  /* istanbul ignore next */\n  return select.selectedOptions\n    ? toArray(select.selectedOptions)\n    : select.options\n    ? toArray(select.options).filter(option => option.selected)\n    : [];\n}\n","import { INTERPOLATOR, TRIPLE } from 'config/types';\nimport { warnIfDebug } from 'utils/log';\nimport CheckboxBinding from './CheckboxBinding';\nimport CheckboxNameBinding from './CheckboxNameBinding';\nimport ContentEditableBinding from './ContentEditableBinding';\nimport FileBinding from './FileBinding';\nimport GenericBinding from './GenericBinding';\nimport MultipleSelectBinding from './MultipleSelectBinding';\nimport NumericBinding from './NumericBinding';\nimport RadioBinding from './RadioBinding';\nimport RadioNameBinding from './RadioNameBinding';\nimport SingleSelectBinding from './SingleSelectBinding';\n\nexport function isBindable(attribute) {\n  // The fragment must be a single non-string fragment\n  if (\n    !attribute ||\n    !attribute.template.f ||\n    attribute.template.f.length !== 1 ||\n    attribute.template.f[0].s\n  )\n    return false;\n\n  // A binding is an interpolator `{{ }}`, yey.\n  if (attribute.template.f[0].t === INTERPOLATOR) return true;\n\n  // The above is probably the only true case. For the rest, show an appropriate\n  // warning before returning false.\n\n  // You can't bind a triple curly. HTML values on an attribute makes no sense.\n  if (attribute.template.f[0].t === TRIPLE)\n    warnIfDebug('It is not possible create a binding using a triple mustache.');\n\n  return false;\n}\n\nexport default function selectBinding(element) {\n  const name = element.name;\n  const attributes = element.attributeByName;\n  if (name !== 'input' && name !== 'textarea' && name !== 'select' && !attributes.contenteditable)\n    return;\n  const isBindableByValue = isBindable(attributes.value);\n  const isBindableByContentEditable = isBindable(attributes.contenteditable);\n  const isContentEditable = element.getAttribute('contenteditable');\n\n  // contenteditable\n  // Bind if the contenteditable is true or a binding that may become true.\n  if ((isContentEditable || isBindableByContentEditable) && isBindableByValue)\n    return ContentEditableBinding;\n\n  // <input>\n  if (name === 'input') {\n    const type = element.getAttribute('type');\n\n    if (type === 'radio') {\n      const isBindableByName = isBindable(attributes.name);\n      const isBindableByChecked = isBindable(attributes.checked);\n\n      // For radios we can either bind the name or checked, but not both.\n      // Name binding is handed instead.\n      if (isBindableByName && isBindableByChecked) {\n        warnIfDebug(\n          'A radio input can have two-way binding on its name attribute, or its checked attribute - not both',\n          { ractive: element.root }\n        );\n        return RadioNameBinding;\n      }\n\n      if (isBindableByName) return RadioNameBinding;\n\n      if (isBindableByChecked) return RadioBinding;\n\n      // Dead end. Unknown binding on radio input.\n      return null;\n    }\n\n    if (type === 'checkbox') {\n      const isBindableByName = isBindable(attributes.name);\n      const isBindableByChecked = isBindable(attributes.checked);\n\n      // A checkbox with bindings for both name and checked. Checked treated as\n      // the checkbox value, name is treated as a regular binding.\n      //\n      // See https://github.com/ractivejs/ractive/issues/1749\n      if (isBindableByName && isBindableByChecked) return CheckboxBinding;\n\n      if (isBindableByName) return CheckboxNameBinding;\n\n      if (isBindableByChecked) return CheckboxBinding;\n\n      // Dead end. Unknown binding on checkbox input.\n      return null;\n    }\n\n    if (type === 'file' && isBindableByValue) return FileBinding;\n\n    if (type === 'number' && isBindableByValue) return NumericBinding;\n\n    if (type === 'range' && isBindableByValue) return NumericBinding;\n\n    // Some input of unknown type (browser usually falls back to text).\n    if (isBindableByValue) return GenericBinding;\n\n    // Dead end. Some unknown input and an unbindable.\n    return null;\n  }\n\n  // <select>\n  if (name === 'select' && isBindableByValue) {\n    return element.getAttribute('multiple') ? MultipleSelectBinding : SingleSelectBinding;\n  }\n\n  // <textarea>\n  if (name === 'textarea' && isBindableByValue) return GenericBinding;\n\n  // Dead end. Some unbindable element.\n  return null;\n}\n","import { doc } from 'config/environment';\n\nexport default function progressiveText(item, target, occupants, text) {\n  if (occupants) {\n    let n = occupants[0];\n    if (n && n.nodeType === 3) {\n      const idx = n.nodeValue.indexOf(text);\n      occupants.shift();\n\n      if (idx === 0) {\n        if (n.nodeValue.length !== text.length) {\n          occupants.unshift(n.splitText(text.length));\n        }\n      } else {\n        n.nodeValue = text;\n      }\n    } else {\n      n = item.node = doc.createTextNode(text);\n      if (occupants[0]) {\n        target.insertBefore(n, occupants[0]);\n      } else {\n        target.appendChild(n);\n      }\n    }\n\n    item.node = n;\n  } else {\n    if (!item.node) item.node = doc.createTextNode(text);\n    target.appendChild(item.node);\n  }\n}\n","import resolveReference from './resolveReference';\nimport ExpressionProxy from './ExpressionProxy';\nimport ReferenceExpressionProxy from './ReferenceExpressionProxy';\n\nexport default function resolve(fragment, template) {\n  if (template.r) {\n    return resolveReference(fragment, template.r);\n  } else if (template.x) {\n    return new ExpressionProxy(fragment, template.x);\n  } else if (template.rx) {\n    return new ReferenceExpressionProxy(fragment, template.rx);\n  }\n}\n","import { noRegistryFunctionReturn } from 'config/errors';\nimport { warnIfDebug } from 'utils/log';\nimport { fillGaps, hasOwn } from 'utils/object';\nimport parser from 'src/Ractive/config/runtime-parser';\nimport { findInstance } from 'shared/registry';\nimport { isArray, isFunction } from 'utils/is';\nimport { addFunctions } from 'shared/getFunction';\n\nexport default function getPartialTemplate(ractive, name, up) {\n  // If the partial in instance or view heirarchy instances, great\n  let partial = getPartialFromRegistry(ractive, name, up || {});\n  if (partial) return partial;\n\n  // Does it exist on the page as a script tag?\n  partial = parser.fromId(name, { noThrow: true });\n  if (partial) {\n    // parse and register to this ractive instance\n    const parsed = parser.parseFor(partial, ractive);\n\n    // register extra partials on the ractive instance if they don't already exist\n    if (parsed.p) fillGaps(ractive.partials, parsed.p);\n\n    // register (and return main partial if there are others in the template)\n    return (ractive.partials[name] = parsed.t);\n  }\n}\n\nfunction getPartialFromRegistry(ractive, name, up) {\n  // if there was an instance up-hierarchy, cool\n  let partial = findParentPartial(name, up.owner);\n  if (partial) return partial;\n\n  // find first instance in the ractive or view hierarchy that has this partial\n  const instance = findInstance('partials', ractive, name);\n\n  if (!instance) {\n    return;\n  }\n\n  partial = instance.partials[name];\n\n  // partial is a function?\n  let fn;\n  if (isFunction(partial)) {\n    fn = partial;\n    // super partial\n    if (fn.styleSet) return fn;\n\n    fn = partial.bind(instance);\n    fn.isOwner = hasOwn(instance.partials, name);\n    partial = fn.call(ractive, parser);\n  }\n\n  if (!partial && partial !== '') {\n    warnIfDebug(noRegistryFunctionReturn, name, 'partial', 'partial', {\n      ractive\n    });\n    return;\n  }\n\n  // If this was added manually to the registry,\n  // but hasn't been parsed, parse it now\n  if (!parser.isParsed(partial)) {\n    // use the parseOptions of the ractive instance on which it was found\n    const parsed = parser.parseFor(partial, instance);\n\n    // Partials cannot contain nested partials!\n    // TODO add a test for this\n    if (parsed.p) {\n      warnIfDebug('Partials ({{>%s}}) cannot contain nested inline partials', name, { ractive });\n    }\n\n    // if fn, use instance to store result, otherwise needs to go\n    // in the correct point in prototype chain on instance or constructor\n    const target = fn ? instance : findOwner(instance, name);\n\n    // may be a template with partials, which need to be registered and main template extracted\n    target.partials[name] = partial = parsed.t;\n  }\n\n  // store for reset\n  if (fn) partial._fn = fn;\n\n  // if the partial is a pre-parsed template object, import any expressions and update the registry\n  if (partial.v) {\n    addFunctions(partial);\n    return (instance.partials[name] = partial.t);\n  } else {\n    return partial;\n  }\n}\n\nfunction findOwner(ractive, key) {\n  return hasOwn(ractive.partials, key) ? ractive : findConstructor(ractive.constructor, key);\n}\n\nfunction findConstructor(constructor, key) {\n  if (!constructor) {\n    return;\n  }\n  return hasOwn(constructor.partials, key) ? constructor : findConstructor(constructor.Parent, key);\n}\n\nfunction findParentPartial(name, parent) {\n  if (parent) {\n    if (\n      parent.template &&\n      parent.template.p &&\n      !isArray(parent.template.p) &&\n      hasOwn(parent.template.p, name)\n    ) {\n      return parent.template.p[name];\n    } else if (parent.up && parent.up.owner) {\n      return findParentPartial(name, parent.up.owner);\n    }\n  }\n}\n","import { noRegistryFunctionReturn } from 'config/errors';\nimport { warnIfDebug } from 'utils/log';\nimport { findInstance } from 'shared/registry';\nimport { hasOwn } from 'utils/object';\nimport { isFunction, isString } from 'utils/is';\n\n// finds the component constructor in the registry or view hierarchy registries\nexport default function getComponentConstructor(ractive, name) {\n  const instance = findInstance('components', ractive, name);\n  let Component;\n\n  if (instance) {\n    Component = instance.components[name];\n\n    if (Component && !Component.isInstance) {\n      if (Component.default && Component.default.isInstance) Component = Component.default;\n      else if (!Component.then && isFunction(Component)) {\n        // function option, execute and store for reset\n        const fn = Component.bind(instance);\n        fn.isOwner = hasOwn(instance.components, name);\n        Component = fn();\n\n        if (!Component) {\n          warnIfDebug(noRegistryFunctionReturn, name, 'component', 'component', {\n            ractive\n          });\n          return;\n        }\n\n        if (isString(Component)) {\n          // allow string lookup\n          Component = getComponentConstructor(ractive, Component);\n        }\n\n        Component._fn = fn;\n        instance.components[name] = Component;\n      }\n    }\n  }\n\n  return Component;\n}\n","import Partial from './Partial';\nimport { ELEMENT } from 'config/types';\nimport { assign } from 'utils/object';\n\nexport default function asyncProxy(promise, options) {\n  const partials = options.template.p || {};\n  const name = options.template.e;\n\n  const opts = assign({}, options, {\n    template: { t: ELEMENT, e: name },\n    macro(handle) {\n      handle.setTemplate(partials['async-loading'] || []);\n      promise.then(\n        cmp => {\n          options.up.ractive.components[name] = cmp;\n          if (partials['async-loaded']) {\n            handle.partials.component = [options.template];\n            handle.setTemplate(partials['async-loaded']);\n          } else {\n            handle.setTemplate([options.template]);\n          }\n        },\n        err => {\n          if (partials['async-failed']) {\n            handle.aliasLocal('error', 'error');\n            handle.set('@local.error', err);\n            handle.setTemplate(partials['async-failed']);\n          } else {\n            handle.setTemplate([]);\n          }\n        }\n      );\n    }\n  });\n  return new Partial(opts);\n}\n","import { ATTRIBUTE, CATCH, ELEMENT, ELSE, INTERPOLATOR, SECTION, THEN } from 'src/config/types';\nimport Partial from './Partial';\nimport { assign } from 'utils/object';\nimport { isFunction, isUndefined } from 'utils/is';\n\nfunction extract(tpl, type, name) {\n  const p = tpl.f.find(s => s.t === type);\n  if (p) {\n    if (p.n)\n      return [\n        {\n          t: 19,\n          n: 54,\n          f: p.f || [],\n          z: [{ n: p.n, x: { r: `__await.${name}` } }]\n        }\n      ];\n    else return p.f || [];\n  } else return [];\n}\n\nexport default function Await(options) {\n  const tpl = options.template;\n\n  const success = extract(tpl, THEN, 'value');\n  const error = extract(tpl, CATCH, 'error');\n  const pending = extract(tpl, SECTION);\n  const undef = extract(tpl, ELSE);\n\n  const opts = assign({}, options, {\n    template: {\n      t: ELEMENT,\n      m: [\n        {\n          t: ATTRIBUTE,\n          n: 'for',\n          f: [{ t: INTERPOLATOR, r: tpl.r, rx: tpl.rx, x: tpl.x }]\n        }\n      ]\n    },\n    macro(handle, attrs) {\n      handle.aliasLocal('__await');\n\n      function update(attrs) {\n        if (attrs.for && isFunction(attrs.for.then)) {\n          handle.setTemplate(pending);\n\n          attrs.for.then(\n            v => {\n              handle.set('@local.value', v);\n              handle.setTemplate(success);\n            },\n            e => {\n              handle.set('@local.error', e);\n              handle.setTemplate(error);\n            }\n          );\n        } else if (isUndefined(attrs.for)) {\n          handle.setTemplate(undef);\n        } else {\n          handle.set('@local.value', attrs.for);\n          handle.setTemplate(success);\n        }\n      }\n\n      update(attrs);\n\n      return {\n        update\n      };\n    }\n  });\n\n  opts.macro.attributes = ['for'];\n\n  return new Partial(opts);\n}\n","import { TEXT } from 'config/types';\n\n// TODO all this code needs to die\nexport default function processItems(items, values, guid, counter = 0) {\n  return items\n    .map(item => {\n      if (item.type === TEXT) {\n        return item.template;\n      }\n\n      if (item.fragment) {\n        if (item.fragment.iterations) {\n          return item.fragment.iterations\n            .map(fragment => {\n              return processItems(fragment.items, values, guid, counter);\n            })\n            .join('');\n        } else {\n          return processItems(item.fragment.items, values, guid, counter);\n        }\n      }\n\n      const placeholderId = `${guid}-${counter++}`;\n      const model = item.model || item.newModel;\n\n      values[placeholderId] = model\n        ? model.wrapper\n          ? model.wrapperValue\n          : model.get()\n        : undefined;\n\n      return '${' + placeholderId + '}';\n    })\n    .join('');\n}\n","import { logIfDebug, warnIfDebug, warnOnceIfDebug } from 'utils/log';\nimport { getElement } from 'utils/dom';\nimport { isArray } from 'utils/is';\nimport config from './config/config';\nimport Fragment from 'src/view/Fragment';\nimport hooks from 'src/events/Hook';\nimport Ractive from '../Ractive';\nimport subscribe from './helpers/subscribe';\n\nexport default function initialise(ractive, userOptions, options) {\n  // initialize settable computeds\n  const computed = ractive.viewmodel.computed;\n  if (computed) {\n    for (const k in computed) {\n      if (k in ractive.viewmodel.value && computed[k] && !computed[k].isReadonly) {\n        computed[k].set(ractive.viewmodel.value[k]);\n      }\n    }\n  }\n\n  // init config from Parent and options\n  config.init(ractive.constructor, ractive, userOptions);\n\n  // call any passed in plugins\n  if (isArray(userOptions.use))\n    ractive.use.apply(ractive, userOptions.use.filter(p => !p.construct));\n\n  hooks.config.fire(ractive);\n\n  hooks.init.begin(ractive);\n\n  const fragment = (ractive.fragment = createFragment(ractive, options));\n  if (fragment) fragment.bind(ractive.viewmodel);\n\n  hooks.init.end(ractive);\n\n  // general config done, set up observers\n  subscribe(ractive, userOptions, 'observe');\n\n  if (fragment) {\n    // render automatically ( if `el` is specified )\n    const el = (ractive.el = ractive.target = getElement(ractive.el || ractive.target));\n    if (el && !ractive.component) {\n      const promise = ractive.render(el, ractive.append);\n\n      if (Ractive.DEBUG_PROMISES) {\n        promise.catch(err => {\n          warnOnceIfDebug(\n            'Promise debugging is enabled, to help solve errors that happen asynchronously. Some browsers will log unhandled promise rejections, in which case you can safely disable promise debugging:\\n  Ractive.DEBUG_PROMISES = false;'\n          );\n          warnIfDebug('An error happened during rendering', { ractive });\n          logIfDebug(err);\n\n          throw err;\n        });\n      }\n    }\n  }\n}\n\nexport function createFragment(ractive, options = {}) {\n  if (ractive.template) {\n    const cssIds = [].concat(ractive.constructor._cssIds || [], options.cssIds || []);\n\n    return new Fragment({\n      owner: ractive,\n      template: ractive.template,\n      cssIds\n    });\n  }\n}\n","import { doc } from 'config/environment';\nimport { applyCSS } from 'src/global/css';\nimport hooks from 'src/events/Hook';\nimport { getElement } from 'utils/dom';\nimport runloop from 'src/global/runloop';\nimport { createFragment } from './initialise';\n\nexport default function render(ractive, target, anchor, occupants) {\n  // set a flag to let any transitions know that this instance is currently rendering\n  ractive.rendering = true;\n\n  const promise = runloop.start();\n  runloop.scheduleTask(() => hooks.render.fire(ractive), true);\n\n  if (ractive.fragment.rendered) {\n    throw new Error(\n      'You cannot call ractive.render() on an already rendered instance! Call ractive.unrender() first'\n    );\n  }\n\n  if (ractive.destroyed) {\n    ractive.destroyed = false;\n    ractive.fragment = createFragment(ractive).bind(ractive.viewmodel);\n  }\n\n  anchor = getElement(anchor) || ractive.anchor;\n\n  ractive.el = ractive.target = target;\n  ractive.anchor = anchor;\n\n  // ensure encapsulated CSS is up-to-date\n  if (ractive.cssId) applyCSS();\n\n  if (target) {\n    (target.__ractive_instances__ || (target.__ractive_instances__ = [])).push(ractive);\n\n    if (anchor) {\n      const docFrag = doc.createDocumentFragment();\n      ractive.fragment.render(docFrag);\n      target.insertBefore(docFrag, anchor);\n    } else {\n      ractive.fragment.render(target, occupants);\n    }\n  }\n\n  runloop.end();\n  ractive.rendering = false;\n\n  return promise.then(() => {\n    if (ractive.torndown) return;\n\n    hooks.complete.fire(ractive);\n  });\n}\n","import { getElement } from 'utils/dom';\nimport { toArray } from 'utils/array';\nimport { warnIfDebug } from 'utils/log';\nimport render from '../render';\nimport { teardown } from 'shared/methodCallers';\n\nexport default function Ractive$render(target, anchor) {\n  if (this.torndown) {\n    warnIfDebug('ractive.render() was called on a Ractive instance that was already torn down');\n    return Promise.resolve();\n  }\n\n  target = getElement(target) || this.el;\n\n  if (!this.append && target) {\n    // Teardown any existing instances *before* trying to set up the new one -\n    // avoids certain weird bugs\n    const others = target.__ractive_instances__;\n    if (others) others.forEach(teardown);\n\n    // make sure we are the only occupants\n    if (!this.enhance) {\n      target.innerHTML = ''; // TODO is this quicker than removeChild? Initial research inconclusive\n    }\n  }\n\n  const occupants = this.enhance ? toArray(target.childNodes) : null;\n  const promise = render(this, target, anchor, occupants);\n\n  if (occupants) {\n    while (occupants.length) target.removeChild(occupants.pop());\n  }\n\n  return promise;\n}\n","import runloop from 'src/global/runloop';\nimport { PARTIAL, COMPONENT, ELEMENT } from 'config/types';\nimport { isArray } from 'utils/is';\nimport { handleChange } from 'shared/methodCallers';\n\nfunction collect(source, name, attr, dest) {\n  source.forEach(item => {\n    // queue to rerender if the item is a partial and the current name matches\n    if (item.type === PARTIAL && (item.refName === name || item.name === name)) {\n      item.inAttribute = attr;\n      dest.push(item);\n      return; // go no further\n    }\n\n    // if it has a fragment, process its items\n    if (item.fragment) {\n      collect(item.fragment.iterations || item.fragment.items, name, attr, dest);\n    } else if (isArray(item.items)) {\n      // or if it is itself a fragment, process its items\n      collect(item.items, name, attr, dest);\n    } else if (item.type === COMPONENT && item.instance) {\n      // or if it is a component, step in and process its items\n      // ...unless the partial is shadowed\n      if (item.instance.partials[name]) return;\n      collect(item.instance.fragment.items, name, attr, dest);\n    }\n\n    // if the item is an element, process its attributes too\n    if (item.type === ELEMENT) {\n      if (isArray(item.attributes)) {\n        collect(item.attributes, name, true, dest);\n      }\n    }\n  });\n}\n\nexport default function(name, partial) {\n  const collection = [];\n  collect(this.fragment.items, name, false, collection);\n\n  const promise = runloop.start();\n\n  this.partials[name] = partial;\n  collection.forEach(handleChange);\n\n  runloop.end();\n\n  return promise;\n}\n","import { createDocumentFragment } from 'utils/dom';\nimport Fragment from 'src/view/Fragment';\nimport runloop from 'src/global/runloop';\nimport { default as templateConfigurator } from '../config/custom/template';\n\n// TODO should resetTemplate be asynchronous? i.e. should it be a case\n// of outro, update template, intro? I reckon probably not, since that\n// could be achieved with unrender-resetTemplate-render. Also, it should\n// conceptually be similar to resetPartial, which couldn't be async\n\nexport default function Ractive$resetTemplate(template) {\n  templateConfigurator.init(null, this, { template });\n\n  const transitionsEnabled = this.transitionsEnabled;\n  this.transitionsEnabled = false;\n\n  // Is this is a component, we need to set the `shouldDestroy`\n  // flag, otherwise it will assume by default that a parent node\n  // will be detached, and therefore it doesn't need to bother\n  // detaching its own nodes\n  const component = this.component;\n  if (component) component.shouldDestroy = true;\n  this.unrender();\n  if (component) component.shouldDestroy = false;\n\n  const promise = runloop.start();\n\n  // remove existing fragment and create new one\n  this.fragment.unbind().unrender(true);\n\n  this.fragment = new Fragment({\n    template: this.template,\n    root: this,\n    owner: this\n  });\n\n  const docFrag = createDocumentFragment();\n  this.fragment.bind(this.viewmodel).render(docFrag);\n\n  // if this is a component, its el may not be valid, so find a\n  // target based on the component container\n  if (component && !component.external) {\n    this.fragment.findParentNode().insertBefore(docFrag, component.findNextNode());\n  } else {\n    this.el.insertBefore(docFrag, this.anchor);\n  }\n\n  runloop.end();\n\n  this.transitionsEnabled = transitionsEnabled;\n\n  return promise;\n}\n","import { build, set } from 'shared/set';\nimport { isObjectType } from 'utils/is';\n\nexport default function Ractive$set(keypath, value, options) {\n  const ractive = this;\n\n  const opts = isObjectType(keypath) ? value : options;\n\n  return set(build(ractive, keypath, value, opts && opts.isolated), opts);\n}\n","import add from './shared/add';\nimport { isNumber, isObjectType } from 'utils/is';\n\nexport default function Ractive$subtract(keypath, d, options) {\n  const num = isNumber(d) ? -d : -1;\n  const opts = isObjectType(d) ? d : options;\n  return add(this, keypath, num, opts);\n}\n","import { badArguments } from 'config/errors';\nimport { gather, set } from 'shared/set';\nimport { isString } from 'utils/is';\n\nexport default function Ractive$toggle(keypath, options) {\n  if (!isString(keypath)) {\n    throw new TypeError(badArguments);\n  }\n\n  return set(\n    gather(this, keypath, null, options && options.isolated).map(m => [m, !m.get()]),\n    options\n  );\n}\n","import { getCSS } from 'src/global/css';\nimport { keys } from 'utils/object';\n\nexport default function Ractive$toCSS() {\n  const cssIds = [this.cssId, ...this.findAllComponents().map(c => c.cssId)];\n  const uniqueCssIds = keys(cssIds.reduce((ids, id) => ((ids[id] = true), ids), {}));\n  return getCSS(uniqueCssIds);\n}\n","export default function Ractive$toHTML() {\n  return this.fragment.toString(true);\n}\n","export default function toText() {\n  return this.fragment.toString(false);\n}\n","import runloop from 'src/global/runloop';\nimport Transition from '../../view/items/element/Transition';\nimport { fatal } from 'utils/log';\nimport { isObject } from 'utils/is';\n\nexport default function Ractive$transition(name, node, params) {\n  if (node instanceof HTMLElement) {\n    // good to go\n  } else if (isObject(node)) {\n    // omitted, use event node\n    params = node;\n  }\n\n  // if we allow query selector, then it won't work\n  // simple params like \"fast\"\n\n  // else if ( typeof node === 'string' ) {\n  // \t// query selector\n  // \tnode = this.find( node )\n  // }\n\n  node = node || this.event.node;\n\n  if (!node || !node._ractive) {\n    fatal(`No node was supplied for transition ${name}`);\n  }\n\n  params = params || {};\n  const owner = node._ractive.proxy;\n  const transition = new Transition({ owner, up: owner.up, name, params });\n  transition.bind();\n\n  const promise = runloop.start();\n  runloop.registerTransition(transition);\n  runloop.end();\n\n  promise.then(() => transition.unbind());\n  return promise;\n}\n","import { splitKeypath } from 'shared/keypaths';\nimport runloop from 'src/global/runloop';\n\nexport default function unlink(here) {\n  const promise = runloop.start();\n  this.viewmodel.joinAll(splitKeypath(here), { lastLink: false }).unlink();\n  runloop.end();\n  return promise;\n}\n","import hooks from 'src/events/Hook';\nimport { warnIfDebug } from 'utils/log';\nimport { removeFromArray } from 'utils/array';\nimport runloop from 'src/global/runloop';\n\nexport default function Ractive$unrender() {\n  if (!this.fragment.rendered) {\n    warnIfDebug('ractive.unrender() was called on a Ractive instance that was not rendered');\n    return Promise.resolve();\n  }\n\n  this.unrendering = true;\n  const promise = runloop.start();\n\n  hooks.unrendering.fire(this);\n\n  // If this is a component, and the component isn't marked for destruction,\n  // don't detach nodes from the DOM unnecessarily\n  const shouldDestroy =\n    !this.component ||\n    (this.component.anchor || {}).shouldDestroy ||\n    this.component.shouldDestroy ||\n    this.shouldDestroy;\n  this.fragment.unrender(shouldDestroy);\n  if (shouldDestroy) this.destroyed = true;\n\n  removeFromArray(this.el.__ractive_instances__, this);\n\n  hooks.unrender.fire(this);\n\n  runloop.end();\n  this.unrendering = false;\n\n  return promise;\n}\n","import { splitKeypath } from 'shared/keypaths';\nimport runloop from 'src/global/runloop';\n\nexport default function Ractive$updateModel(keypath, cascade) {\n  const promise = runloop.start();\n\n  if (!keypath) {\n    this.viewmodel.updateFromBindings(true);\n  } else {\n    this.viewmodel.joinAll(splitKeypath(keypath)).updateFromBindings(cascade !== false);\n  }\n\n  runloop.end();\n\n  return promise;\n}\n","export default function use(...plugins) {\n  plugins.forEach(p => {\n    p({\n      proto: this,\n      Ractive: this.constructor.Ractive,\n      instance: this\n    });\n  });\n  return this;\n}\n","export default function isInstance(object) {\n  return object && object instanceof this;\n}\n","import { splitKeypath } from 'shared/keypaths';\n\nexport default function styleGet(keypath, opts) {\n  return this._cssModel.joinAll(splitKeypath(keypath)).get(true, opts);\n}\n","import { build, set } from '../../shared/set';\nimport SharedModel from '../../model/specials/SharedModel';\nimport { isObjectType } from 'utils/is';\n\nexport default function sharedSet(keypath, value, options) {\n  const opts = isObjectType(keypath) ? value : options;\n  const model = SharedModel;\n\n  return set(build({ viewmodel: model }, keypath, value, true), opts);\n}\n","import SharedModel from '../../model/specials/SharedModel';\nimport { splitKeypath } from 'shared/keypaths';\n\nexport default function sharedGet(keypath, opts) {\n  return SharedModel.joinAll(splitKeypath(keypath)).get(true, opts);\n}\n","import { isFunction } from 'utils/is';\n\nexport default function use(...plugins) {\n  plugins.forEach(p => {\n    isFunction(p) &&\n      p({\n        proto: this.prototype,\n        Ractive: this.Ractive,\n        instance: this\n      });\n  });\n  return this;\n}\n","import styleGet from '../Ractive/static/styleGet';\nimport styleSet from '../Ractive/static/styleSet';\nimport CSSModel from 'src/model/specials/CSSModel';\nimport { assign, create, defineProperties, defineProperty } from 'utils/object';\nimport { isFunction } from 'utils/is';\n\nimport { initCSS } from 'src/Ractive/config/custom/css/css';\n\nexport default function macro(fn, opts) {\n  if (!isFunction(fn)) throw new Error(`The macro must be a function`);\n\n  assign(fn, opts);\n\n  defineProperties(fn, {\n    extensions: { value: [] },\n    _cssIds: { value: [] },\n    cssData: { value: assign(create(this.cssData), fn.cssData || {}) },\n\n    styleGet: { value: styleGet.bind(fn) },\n    styleSet: { value: styleSet.bind(fn) }\n  });\n\n  defineProperty(fn, '_cssModel', { value: new CSSModel(fn) });\n\n  if (fn.css) initCSS(fn, fn, fn);\n\n  this.extensions.push(fn);\n\n  return fn;\n}\n","import { findInViewHierarchy } from 'shared/registry';\n\nexport function findPlugin(name, type, instance) {\n  return findInViewHierarchy(type, instance, name);\n}\n","/* istanbul ignore if */\nif (!Object.assign) {\n  Object.assign = function(target, ...sources) {\n    if (target == null) throw new TypeError('Cannot convert undefined or null to object');\n\n    const to = Object(target);\n    const sourcesLength = sources.length;\n\n    for (let index = 0; index < sourcesLength; index++) {\n      const nextSource = sources[index];\n      for (const nextKey in nextSource) {\n        if (!Object.prototype.hasOwnProperty.call(nextSource, nextKey)) continue;\n        to[nextKey] = nextSource[nextKey];\n      }\n    }\n\n    return to;\n  };\n}\n","export function hasOwn(obj, prop) {\n  return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nexport function fillGaps(target, ...sources) {\n  for (let i = 0; i < sources.length; i++) {\n    const source = sources[i];\n    for (const key in source) {\n      // Source can be a prototype-less object.\n      if (key in target || !hasOwn(source, key)) continue;\n      target[key] = source[key];\n    }\n  }\n\n  return target;\n}\n\nexport function toPairs(obj = {}) {\n  const pairs = [];\n  for (const key in obj) {\n    // Source can be a prototype-less object.\n    if (!hasOwn(obj, key)) continue;\n    pairs.push([key, obj[key]]);\n  }\n  return pairs;\n}\n\nconst obj = Object;\n\nexport const assign = obj.assign;\n\nexport const create = obj.create;\n\nexport const defineProperty = obj.defineProperty;\n\nexport const defineProperties = obj.defineProperties;\n\nexport const keys = obj.keys;\n","const toString = Object.prototype.toString;\nconst arrayLikePattern = /^\\[object (?:Array|FileList)\\]$/;\n\nexport function isArrayLike(obj) {\n  return arrayLikePattern.test(toString.call(obj));\n}\n\nexport const isArray = Array.isArray;\n\nexport function isEqual(a, b) {\n  if (a === null && b === null) {\n    return true;\n  }\n\n  if (isObjectType(a) || isObjectType(b)) {\n    return false;\n  }\n\n  return a === b;\n}\n\n// http://stackoverflow.com/questions/18082/validate-numbers-in-javascript-isnumeric\nexport function isNumeric(thing) {\n  return !isNaN(parseFloat(thing)) && isFinite(thing);\n}\n\nexport function isObject(thing) {\n  return thing && toString.call(thing) === '[object Object]';\n}\n\nexport function isObjectLike(thing) {\n  return !!(thing && (isObjectType(thing) || isFunction(thing))) && !isDate(thing);\n}\n\nexport function isDate(thing) {\n  return thing instanceof Date;\n}\n\nexport function isObjectType(thing) {\n  return typeof thing === 'object';\n}\n\nexport function isFunction(thing) {\n  return typeof thing === 'function';\n}\n\nexport function isString(thing) {\n  return typeof thing === 'string';\n}\n\nexport function isNumber(thing) {\n  return typeof thing === 'number';\n}\n\nexport function isUndefined(thing) {\n  return thing === undefined;\n}\n","/* istanbul ignore if */\nif (typeof window !== 'undefined' && window.performance && !window.performance.now) {\n  window.performance = window.performance || {};\n\n  const nowOffset = Date.now();\n\n  window.performance.now = function() {\n    return Date.now() - nowOffset;\n  };\n}\n","import { hasOwn, defineProperty } from 'utils/object';\nimport { isFunction, isUndefined } from 'utils/is';\n\n/* istanbul ignore if */\nif (!Array.prototype.find) {\n  defineProperty(Array.prototype, 'find', {\n    value(callback, thisArg) {\n      if (this === null || isUndefined(this))\n        throw new TypeError('Array.prototype.find called on null or undefined');\n\n      if (!isFunction(callback)) throw new TypeError(`${callback} is not a function`);\n\n      const array = Object(this);\n      const arrayLength = array.length >>> 0;\n\n      for (let index = 0; index < arrayLength; index++) {\n        if (!hasOwn(array, index)) continue;\n        if (!callback.call(thisArg, array[index], index, array)) continue;\n        return array[index];\n      }\n\n      return undefined;\n    },\n    configurable: true,\n    writable: true\n  });\n}\n","// NOTE: Node doesn't exist in IE8. Nothing can be done.\n/* istanbul ignore if */\nif (\n  typeof window !== 'undefined' &&\n  window.Node &&\n  window.Node.prototype &&\n  !window.Node.prototype.contains\n) {\n  Node.prototype.contains = function(node) {\n    if (!node) throw new TypeError('node required');\n\n    do {\n      if (this === node) return true;\n    } while ((node = node && node.parentNode));\n\n    return false;\n  };\n}\n","/* eslint no-console:\"off\" */\nimport { isFunction } from 'utils/is';\n\nconst win = typeof window !== 'undefined' ? window : null;\nconst doc = win ? document : null;\nconst isClient = !!doc;\nconst base = typeof global !== 'undefined' ? global : win;\nconst hasConsole =\n  typeof console !== 'undefined' && isFunction(console.warn) && isFunction(console.warn.apply);\n\nconst svg = doc\n  ? doc.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#BasicStructure', '1.1')\n  : false;\n\nconst vendors = ['o', 'ms', 'moz', 'webkit'];\n\nexport { win, doc, isClient, hasConsole, svg, vendors, base };\n","import { isFunction, isObjectType } from 'utils/is';\nimport { base } from 'config/environment';\n\n/* istanbul ignore if */\nif (!base.Promise) {\n  const PENDING = {};\n  const FULFILLED = {};\n  const REJECTED = {};\n\n  const Promise = (base.Promise = function(callback) {\n    const fulfilledHandlers = [];\n    const rejectedHandlers = [];\n    let state = PENDING;\n    let result;\n    let dispatchHandlers;\n\n    const makeResolver = newState => {\n      return function(value) {\n        if (state !== PENDING) return;\n        result = value;\n        state = newState;\n        dispatchHandlers = makeDispatcher(\n          state === FULFILLED ? fulfilledHandlers : rejectedHandlers,\n          result\n        );\n        wait(dispatchHandlers);\n      };\n    };\n\n    const fulfill = makeResolver(FULFILLED);\n    const reject = makeResolver(REJECTED);\n\n    try {\n      callback(fulfill, reject);\n    } catch (err) {\n      reject(err);\n    }\n\n    return {\n      // `then()` returns a Promise - 2.2.7\n      then(onFulfilled, onRejected) {\n        const promise2 = new Promise((fulfill, reject) => {\n          const processResolutionHandler = (handler, handlers, forward) => {\n            if (isFunction(handler)) {\n              handlers.push(p1result => {\n                try {\n                  resolve(promise2, handler(p1result), fulfill, reject);\n                } catch (err) {\n                  reject(err);\n                }\n              });\n            } else {\n              handlers.push(forward);\n            }\n          };\n\n          processResolutionHandler(onFulfilled, fulfilledHandlers, fulfill);\n          processResolutionHandler(onRejected, rejectedHandlers, reject);\n\n          if (state !== PENDING) {\n            wait(dispatchHandlers);\n          }\n        });\n        return promise2;\n      },\n      catch(onRejected) {\n        return this.then(null, onRejected);\n      },\n      finally(callback) {\n        return this.then(\n          v => {\n            callback();\n            return v;\n          },\n          e => {\n            callback();\n            throw e;\n          }\n        );\n      }\n    };\n  });\n\n  Promise.all = function(promises) {\n    return new Promise((fulfill, reject) => {\n      const result = [];\n      let pending;\n      let i;\n\n      if (!promises.length) {\n        fulfill(result);\n        return;\n      }\n\n      const processPromise = (promise, i) => {\n        if (promise && isFunction(promise.then)) {\n          promise.then(value => {\n            result[i] = value;\n            --pending || fulfill(result);\n          }, reject);\n        } else {\n          result[i] = promise;\n          --pending || fulfill(result);\n        }\n      };\n\n      pending = i = promises.length;\n\n      while (i--) {\n        processPromise(promises[i], i);\n      }\n    });\n  };\n\n  Promise.race = function(promises) {\n    return new Promise((fulfill, reject) => {\n      let pending = true;\n      function ok(v) {\n        if (!pending) return;\n        pending = false;\n        fulfill(v);\n      }\n      function fail(e) {\n        if (!pending) return;\n        pending = false;\n        reject(e);\n      }\n      for (let i = 0; i < promises.length; i++) {\n        if (promises[i] && isFunction(promises[i].then)) {\n          promises[i].then(ok, fail);\n        }\n      }\n    });\n  };\n\n  Promise.resolve = function(value) {\n    if (value && isFunction(value.then)) return value;\n    return new Promise(fulfill => {\n      fulfill(value);\n    });\n  };\n\n  Promise.reject = function(reason) {\n    if (reason && isFunction(reason.then)) return reason;\n    return new Promise((fulfill, reject) => {\n      reject(reason);\n    });\n  };\n\n  // TODO use MutationObservers or something to simulate setImmediate\n  const wait = function(callback) {\n    setTimeout(callback, 0);\n  };\n\n  const makeDispatcher = function(handlers, result) {\n    return function() {\n      for (let handler; (handler = handlers.shift()); ) {\n        handler(result);\n      }\n    };\n  };\n\n  const resolve = function(promise, x, fulfil, reject) {\n    let then;\n    if (x === promise) {\n      throw new TypeError(`A promise's fulfillment handler cannot return the same promise`);\n    }\n    if (x instanceof Promise) {\n      x.then(fulfil, reject);\n    } else if (x && (isObjectType(x) || isFunction(x))) {\n      try {\n        then = x.then;\n      } catch (e) {\n        reject(e);\n        return;\n      }\n      if (isFunction(then)) {\n        let called;\n\n        const resolvePromise = function(y) {\n          if (called) return;\n          called = true;\n          resolve(promise, y, fulfil, reject);\n        };\n        const rejectPromise = function(r) {\n          if (called) return;\n          called = true;\n          reject(r);\n        };\n\n        try {\n          then.call(x, resolvePromise, rejectPromise);\n        } catch (e) {\n          if (!called) {\n            reject(e);\n            called = true;\n            return;\n          }\n        }\n      } else {\n        fulfil(x);\n      }\n    } else {\n      fulfil(x);\n    }\n  };\n}\n","/* istanbul ignore if */\nif (\n  typeof window !== 'undefined' &&\n  !(window.requestAnimationFrame && window.cancelAnimationFrame)\n) {\n  let lastTime = 0;\n  window.requestAnimationFrame = function(callback) {\n    const currentTime = Date.now();\n    const timeToNextCall = Math.max(0, 16 - (currentTime - lastTime));\n    const id = window.setTimeout(() => {\n      callback(currentTime + timeToNextCall);\n    }, timeToNextCall);\n    lastTime = currentTime + timeToNextCall;\n    return id;\n  };\n  window.cancelAnimationFrame = function(id) {\n    clearTimeout(id);\n  };\n}\n","import { create } from 'utils/object';\n\nexport default {\n  // render placement:\n  el: void 0,\n  append: false,\n  delegate: true,\n  enhance: false,\n\n  // template:\n  template: null,\n\n  // parse:\n  allowExpressions: true,\n  delimiters: ['{{', '}}'],\n  tripleDelimiters: ['{{{', '}}}'],\n  staticDelimiters: ['[[', ']]'],\n  staticTripleDelimiters: ['[[[', ']]]'],\n  csp: true,\n  interpolate: false,\n  preserveWhitespace: false,\n  preserveStandaloneSections: false,\n  sanitize: false,\n  stripComments: true,\n  contextLines: 0,\n\n  // data & binding:\n  data: create(null),\n  helpers: create(null),\n  computed: create(null),\n  syncComputedChildren: false,\n  resolveInstanceMembers: false,\n  warnAboutAmbiguity: false,\n  adapt: [],\n  isolated: true,\n  twoway: true,\n  lazy: false,\n\n  // transitions:\n  noIntro: false,\n  noOutro: false,\n  transitionsEnabled: true,\n  complete: void 0,\n  nestedTransitions: true,\n\n  // css:\n  css: null,\n  noCSSTransform: false\n};\n","// These are a subset of the easing equations found at\n// https://raw.github.com/danro/easing-js - license info\n// follows:\n\n// --------------------------------------------------\n// easing.js v0.5.4\n// Generic set of easing functions with AMD support\n// https://github.com/danro/easing-js\n// This code may be freely distributed under the MIT license\n// http://danro.mit-license.org/\n// --------------------------------------------------\n// All functions adapted from Thomas Fuchs & Jeremy Kahn\n// Easing Equations (c) 2003 Robert Penner, BSD license\n// https://raw.github.com/danro/easing-js/master/LICENSE\n// --------------------------------------------------\n\n// In that library, the functions named easeIn, easeOut, and\n// easeInOut below are named easeInCubic, easeOutCubic, and\n// (you guessed it) easeInOutCubic.\n//\n// You can add additional easing functions to this list, and they\n// will be globally available.\n\nexport default {\n  linear(pos) {\n    return pos;\n  },\n  easeIn(pos) {\n    /* istanbul ignore next */\n    return Math.pow(pos, 3);\n  },\n  easeOut(pos) {\n    return Math.pow(pos - 1, 3) + 1;\n  },\n  easeInOut(pos) {\n    /* istanbul ignore next */\n    if ((pos /= 0.5) < 1) {\n      return 0.5 * Math.pow(pos, 3);\n    }\n    /* istanbul ignore next */\n    return 0.5 * (Math.pow(pos - 2, 3) + 2);\n  }\n};\n","import { splitKeypath } from 'shared/keypaths';\nimport SharedModel, {\n  GlobalModel,\n  SharedModel as ContextModel\n} from 'src/model/specials/SharedModel';\nimport { warnIfDebug } from 'utils/log';\nimport { hasOwn } from 'utils/object';\nimport { isFunction } from 'utils/is';\n\nfunction findContext(fragment) {\n  let frag = fragment;\n  while (frag && !frag.context && !frag.aliases) frag = frag.parent;\n  return frag;\n}\n\nexport default function resolveReference(fragment, ref) {\n  const initialFragment = fragment;\n  // current context ref\n  if (ref === '.') return fragment.findContext();\n\n  // ancestor references\n  if (ref[0] === '~') return fragment.ractive.viewmodel.joinAll(splitKeypath(ref.slice(2)));\n\n  // scoped references\n  if (ref[0] === '.' || ref[0] === '^') {\n    let frag = fragment;\n    const parts = ref.split('/');\n    const explicitContext = parts[0] === '^^';\n\n    // find nearest context node\n    while (frag && !frag.context) {\n      frag = up(frag);\n    }\n    let context = frag && frag.context;\n\n    // walk up the context chain\n    while (frag && parts[0] === '^^') {\n      parts.shift();\n\n      // the current fragment should always be a context,\n      // and if it happens to be an iteration, jump above the each block\n      if (frag.isIteration) {\n        frag = frag.parent.parent;\n      } else {\n        // otherwise jump above the current fragment\n        frag = up(frag);\n      }\n\n      // walk to the next contexted fragment\n      while (frag && !frag.context) {\n        frag = up(frag);\n      }\n      context = frag && frag.context;\n    }\n\n    if (!context && explicitContext) {\n      throw new Error(\n        `Invalid context parent reference ('${ref}'). There is not context at that level.`\n      );\n    }\n\n    // walk up the context path\n    while (parts[0] === '.' || parts[0] === '..') {\n      const part = parts.shift();\n\n      if (part === '..') {\n        context = context.parent;\n      }\n    }\n\n    ref = parts.join('/');\n\n    // special case - `{{.foo}}` means the same as `{{./foo}}`\n    if (ref[0] === '.') ref = ref.slice(1);\n    return context.joinAll(splitKeypath(ref));\n  }\n\n  const keys = splitKeypath(ref);\n  if (!keys.length) return;\n  const base = keys.shift();\n\n  // special refs\n  if (base[0] === '@') {\n    // shorthand from outside the template\n    // @this referring to local ractive instance\n    if (base === '@this' || base === '@') {\n      return fragment.ractive.viewmodel.getRactiveModel().joinAll(keys);\n    } else if (base === '@index' || base === '@key') {\n      // @index or @key referring to the nearest repeating index or key\n      if (keys.length) badReference(base);\n      const repeater = findIter(fragment);\n      return repeater && repeater[`get${base[1] === 'i' ? 'Index' : 'Key'}`]();\n    } else if (base === '@last') {\n      const repeater = findIter(fragment);\n      return repeater && repeater.parent.getLast();\n    } else if (base === '@global') {\n      // @global referring to window or global\n      return GlobalModel.joinAll(keys);\n    } else if (base === '@shared') {\n      // @global referring to window or global\n      return SharedModel.joinAll(keys);\n    } else if (base === '@keypath' || base === '@rootpath') {\n      // @keypath or @rootpath, the current keypath string\n      const root = ref[1] === 'r' ? fragment.ractive.root : null;\n      let f = fragment;\n\n      while (\n        f &&\n        (!f.context || (f.isRoot && f.ractive.component && (root || !f.ractive.isolated)))\n      ) {\n        f = f.isRoot ? f.componentParent : f.parent;\n      }\n\n      return f.getKeypath(root);\n    } else if (base === '@context') {\n      return new ContextModel(fragment.getContext(), 'context').joinAll(keys);\n    } else if (base === '@local') {\n      // @context-local data\n      return fragment.getContext()._data.joinAll(keys);\n    } else if (base === '@style') {\n      // @style shared model\n      return fragment.ractive.constructor._cssModel.joinAll(keys);\n    } else if (base === '@helpers') {\n      // @helpers instance model\n      return fragment.ractive.viewmodel.getHelpers().joinAll(keys);\n    } else if (base === '@macro') {\n      const handle = findMacro(fragment);\n      if (handle) return new ContextModel(handle, 'macro').joinAll(keys);\n      else return;\n    } else {\n      // nope\n      throw new Error(`Invalid special reference '${base}'`);\n    }\n  }\n\n  // helpers\n  if (base && !keys.length) {\n    const helpers = fragment.ractive.viewmodel.getHelpers();\n    if (helpers.has(base)) return helpers.joinKey(base);\n  }\n\n  let context = findContext(fragment);\n\n  // check immediate context for a match\n  if (context) {\n    if (context.context) {\n      context = context.context;\n    } else {\n      // alias block, so get next full context for later\n      context = fragment.findContext();\n    }\n  } else {\n    context = fragment.findContext();\n  }\n\n  // walk up the fragment hierarchy looking for a matching ref, alias, or key in a context\n  let createMapping = false;\n  const shouldWarn = fragment.ractive.warnAboutAmbiguity;\n  let crossed = 0;\n  let model;\n\n  while (fragment) {\n    // repeated fragments\n    if (fragment.isIteration) {\n      if (base === fragment.parent.keyRef) {\n        model = fragment.getKey();\n      } else if (base === fragment.parent.indexRef) {\n        model = fragment.getIndex();\n      }\n\n      if (model && keys.length) badReference(base);\n    }\n\n    // alias node or iteration\n    if (!model && fragment.aliases && hasOwn(fragment.aliases, base)) {\n      model = fragment.aliases[base];\n    }\n\n    // check fragment context to see if it has the key we need\n    if (!model && fragment.context && fragment.context.has(base)) {\n      model = fragment.context.joinKey(base);\n\n      // this is an implicit mapping\n      if (createMapping) {\n        if (shouldWarn)\n          warnIfDebug(\n            `'${ref}' resolved but is ambiguous and will create a mapping to a parent component.`\n          );\n      } else if (shouldWarn && crossed) warnIfDebug(`'${ref}' resolved but is ambiguous.`);\n    }\n\n    if (model) {\n      if (createMapping) {\n        model = initialFragment.ractive.viewmodel.createLink(base, model, base, { implicit: true });\n      }\n\n      if (keys.length > 0 && isFunction(model.joinAll)) {\n        model = model.joinAll(keys);\n      }\n\n      return model;\n    }\n\n    // don't consider alias blocks when checking for ambiguity\n    if (fragment.context && !fragment.aliases) crossed = 1;\n\n    if (\n      !fragment.ractive.isolated &&\n      !(fragment.owner && fragment.owner.containerFragment) &&\n      (fragment.componentParent || (!fragment.parent && fragment.ractive.component))\n    ) {\n      // ascend through component boundary\n      fragment = fragment.componentParent || fragment.ractive.component.up;\n      createMapping = true;\n    } else {\n      fragment = fragment.parent;\n    }\n  }\n\n  // if enabled, check the instance for a match\n  const instance = initialFragment.ractive;\n  if (instance.resolveInstanceMembers && base !== 'data' && base in instance) {\n    return instance.viewmodel\n      .getRactiveModel()\n      .joinKey(base)\n      .joinAll(keys);\n  }\n\n  if (shouldWarn) {\n    warnIfDebug(`'${ref}' is ambiguous and did not resolve.`);\n  }\n\n  // didn't find anything, so go ahead and create the key on the local model\n  return context.joinKey(base).joinAll(keys);\n}\n\nfunction up(fragment) {\n  return (\n    fragment &&\n    ((!fragment.ractive.isolated &&\n      !(fragment.owner && fragment.owner.containerFragment) &&\n      (fragment.componentParent || (!fragment.parent && fragment.ractive.component))) ||\n      fragment.parent)\n  );\n}\n\nfunction findIter(start) {\n  let fragment = start;\n  let next;\n  while (!fragment.isIteration && (next = up(fragment))) {\n    fragment = next;\n  }\n\n  return fragment.isIteration && fragment;\n}\n\nfunction findMacro(start) {\n  let fragment = start;\n  while (fragment) {\n    if (fragment.owner.handle) return fragment.owner.handle;\n    fragment = up(fragment);\n  }\n}\n\nfunction badReference(key) {\n  throw new Error(`An index or key reference (${key}) cannot have child properties`);\n}\n","import add from './shared/add';\nimport { isNumber, isObjectType } from 'utils/is';\n\nexport default function Ractive$add(keypath, d, options) {\n  const num = isNumber(d) ? d : 1;\n  const opts = isObjectType(d) ? d : options;\n  return add(this, keypath, num, opts);\n}\n","export function enqueue(ractive, event) {\n  if (ractive.event) {\n    ractive._eventQueue.push(ractive.event);\n  }\n\n  ractive.event = event;\n}\n\nexport function dequeue(ractive) {\n  if (ractive._eventQueue.length) {\n    ractive.event = ractive._eventQueue.pop();\n  } else {\n    ractive.event = null;\n  }\n}\n","export function findAnchors(fragment, name = null) {\n  const res = [];\n\n  findAnchorsIn(fragment, name, res, fragment.ractive);\n\n  return res;\n}\n\nfunction findAnchorsIn(item, name, result, instance) {\n  if (item.isAnchor) {\n    if (!name || item.name === name) {\n      result.push(item);\n    }\n  } else if (item.items) {\n    item.items.forEach(i => findAnchorsIn(i, name, result, instance));\n  } else if (item.iterations) {\n    item.iterations.forEach(i => findAnchorsIn(i, name, result, instance));\n  } else if (item.fragment && (!item.component || item.fragment.ractive === instance)) {\n    findAnchorsIn(item.fragment, name, result, instance);\n  } else if (item.instance && item.instance.fragment) {\n    const anchors = [];\n    findAnchorsIn(item.instance.fragment, name, anchors, instance);\n    anchors.forEach(a => a.ractive === instance && result.push(a));\n  }\n}\n\nexport function updateAnchors(instance, name = null) {\n  const anchors = findAnchors(instance.fragment, name);\n  const idxs = {};\n  const children = instance._children.byName;\n\n  anchors.forEach(a => {\n    const name = a.name;\n    if (!(name in idxs)) idxs[name] = 0;\n    const idx = idxs[name];\n    const child = (children[name] || [])[idx];\n\n    if (child && child.lastBound !== a) {\n      if (child.lastBound) child.lastBound.removeChild(child);\n      a.addChild(child);\n    }\n\n    idxs[name]++;\n  });\n}\n\nexport function unrenderChild(meta) {\n  if (meta.instance.fragment.rendered) {\n    meta.shouldDestroy = true;\n    meta.instance.unrender();\n  }\n  meta.instance.el = null;\n}\n","import hooks from 'src/events/Hook';\nimport runloop from 'src/global/runloop';\nimport { unrenderChild, updateAnchors } from 'shared/anchors';\n\nexport default function attachChild(child, options = {}) {\n  const children = this._children;\n  let idx;\n\n  if (child.parent && child.parent !== this)\n    throw new Error(\n      `Instance ${child._guid} is already attached to a different instance ${\n        child.parent._guid\n      }. Please detach it from the other instance using detachChild first.`\n    );\n  else if (child.parent)\n    throw new Error(`Instance ${child._guid} is already attached to this instance.`);\n\n  const meta = {\n    instance: child,\n    ractive: this,\n    name: options.name || child.constructor.name || 'Ractive',\n    target: options.target || false,\n    bubble,\n    findNextNode\n  };\n  meta.nameOption = options.name;\n\n  // child is managing itself\n  if (!meta.target) {\n    meta.up = this.fragment;\n    meta.external = true;\n  } else {\n    let list;\n    if (!(list = children.byName[meta.target])) {\n      list = [];\n      this.set(`@this.children.byName.${meta.target}`, list);\n    }\n    idx = options.prepend ? 0 : options.insertAt !== undefined ? options.insertAt : list.length;\n  }\n\n  child.parent = this;\n  child.root = this.root;\n  child.component = meta;\n  children.push(meta);\n\n  const promise = runloop.start();\n\n  const rm = child.viewmodel.getRactiveModel();\n  rm.joinKey('parent', { lastLink: false }).link(this.viewmodel.getRactiveModel());\n  rm.joinKey('root', { lastLink: false }).link(this.root.viewmodel.getRactiveModel());\n\n  hooks.attachchild.fire(child);\n\n  if (meta.target) {\n    unrenderChild(meta);\n    this.splice(`@this.children.byName.${meta.target}`, idx, 0, meta);\n    updateAnchors(this, meta.target);\n  } else {\n    if (!child.isolated) child.viewmodel.attached(this.fragment);\n  }\n\n  runloop.end();\n\n  promise.ractive = child;\n  return promise.then(() => child);\n}\n\nfunction bubble() {\n  runloop.addFragment(this.instance.fragment);\n}\n\nfunction findNextNode() {\n  if (this.anchor) return this.anchor.findNextNode();\n}\n","import { splitKeypath } from 'shared/keypaths';\nimport { isString, isFunction } from 'utils/is';\nimport runloop from 'src/global/runloop';\nimport { fireShuffleTasks } from 'src/model/ModelBase';\n\nexport function compute(path, computed) {\n  this.computed[path] = computed;\n  if (isString(computed) || isFunction(computed))\n    computed = this.computed[path] = { get: computed };\n\n  const keys = splitKeypath(path);\n  if (!~path.indexOf('*')) {\n    const last = keys.pop();\n    return this.viewmodel.joinAll(keys).compute(last, computed);\n  } else {\n    computed.pattern = new RegExp(\n      '^' +\n        keys\n          .map(k => k.replace(/\\*\\*/g, '(.+)').replace(/\\*/g, '((?:\\\\\\\\.|[^\\\\.])+)'))\n          .join('\\\\.') +\n        '$'\n    );\n  }\n}\n\nexport default function Ractive$compute(path, computed) {\n  const promise = runloop.start();\n  const comp = compute.call(this, path, computed);\n\n  if (comp) {\n    const keys = splitKeypath(path);\n    if (keys.length === 1 && !comp.isReadonly) {\n      comp.set(this.viewmodel.value[keys[0]]);\n    }\n\n    const first = keys.reduce((a, c) => a && a.childByKey[c], this.viewmodel);\n    if (first) {\n      first.rebind(comp, first, false);\n      if (first.parent) delete first.parent.childByKey[first.key];\n      fireShuffleTasks();\n    }\n  }\n\n  runloop.end();\n\n  return promise;\n}\n","import hooks from 'src/events/Hook';\nimport { removeFromArray } from 'utils/array';\n\nexport default function Ractive$detach() {\n  if (this.isDetached) {\n    return this.el;\n  }\n\n  if (this.el) {\n    removeFromArray(this.el.__ractive_instances__, this);\n  }\n\n  this.el = this.fragment.detach();\n  this.isDetached = true;\n\n  hooks.detach.fire(this);\n  return this.el;\n}\n","import hooks from 'src/events/Hook';\nimport runloop from 'src/global/runloop';\nimport { updateAnchors } from 'shared/anchors';\n\nexport default function detachChild(child) {\n  const children = this._children;\n  let meta, index;\n\n  let i = children.length;\n  while (i--) {\n    if (children[i].instance === child) {\n      index = i;\n      meta = children[i];\n      break;\n    }\n  }\n\n  if (!meta || child.parent !== this)\n    throw new Error(`Instance ${child._guid} is not attached to this instance.`);\n\n  const promise = runloop.start();\n\n  if (meta.anchor) meta.anchor.removeChild(meta);\n  if (!child.isolated) child.viewmodel.detached();\n\n  children.splice(index, 1);\n  if (meta.target) {\n    this.splice(\n      `@this.children.byName.${meta.target}`,\n      children.byName[meta.target].indexOf(meta),\n      1\n    );\n    updateAnchors(this, meta.target);\n  }\n  const rm = child.viewmodel.getRactiveModel();\n  rm.joinKey('parent', { lastLink: false }).unlink();\n  rm.joinKey('root', { lastLink: false }).link(rm);\n  child.root = child;\n  child.parent = null;\n  child.component = null;\n\n  hooks.detachchild.fire(child);\n\n  runloop.end();\n\n  promise.ractive = child;\n  return promise.then(() => child);\n}\n","export default function Ractive$find(selector, options = {}) {\n  if (!this.rendered)\n    throw new Error(\n      `Cannot call ractive.find('${selector}') unless instance is rendered to the DOM`\n    );\n\n  let node = this.fragment.find(selector, options);\n  if (node) return node;\n\n  if (options.remote) {\n    for (let i = 0; i < this._children.length; i++) {\n      if (!this._children[i].instance.fragment.rendered) continue;\n      node = this._children[i].instance.find(selector, options);\n      if (node) return node;\n    }\n  }\n}\n","import { isArray } from 'utils/is';\n\nexport default function Ractive$findAll(selector, options = {}) {\n  if (!this.rendered)\n    throw new Error(\n      `Cannot call ractive.findAll('${selector}', ...) unless instance is rendered to the DOM`\n    );\n\n  if (!isArray(options.result)) options.result = [];\n\n  this.fragment.findAll(selector, options);\n\n  if (options.remote) {\n    // seach non-fragment children\n    this._children.forEach(c => {\n      if (!c.target && c.instance.fragment && c.instance.fragment.rendered) {\n        c.instance.findAll(selector, options);\n      }\n    });\n  }\n\n  return options.result;\n}\n","import { isArray, isObjectType } from 'utils/is';\n\nexport default function Ractive$findAllComponents(selector, options) {\n  if (!options && isObjectType(selector)) {\n    options = selector;\n    selector = '';\n  }\n\n  options = options || {};\n\n  if (!isArray(options.result)) options.result = [];\n\n  this.fragment.findAllComponents(selector, options);\n\n  if (options.remote) {\n    // search non-fragment children\n    this._children.forEach(c => {\n      if (!c.target && c.instance.fragment && c.instance.fragment.rendered) {\n        if (!selector || c.name === selector) {\n          options.result.push(c.instance);\n        }\n\n        c.instance.findAllComponents(selector, options);\n      }\n    });\n  }\n\n  return options.result;\n}\n","import { isObjectType } from 'utils/is';\n\nexport default function Ractive$findComponent(selector, options = {}) {\n  if (isObjectType(selector)) {\n    options = selector;\n    selector = '';\n  }\n\n  let child = this.fragment.findComponent(selector, options);\n  if (child) return child;\n\n  if (options.remote) {\n    if (!selector && this._children.length) return this._children[0].instance;\n    for (let i = 0; i < this._children.length; i++) {\n      // skip children that are or should be in an anchor\n      if (this._children[i].target) continue;\n      if (this._children[i].name === selector) return this._children[i].instance;\n      child = this._children[i].instance.findComponent(selector, options);\n      if (child) return child;\n    }\n  }\n}\n","export default function Ractive$findContainer(selector) {\n  if (this.container) {\n    if (this.container.component && this.container.component.name === selector) {\n      return this.container;\n    } else {\n      return this.container.findContainer(selector);\n    }\n  }\n\n  return null;\n}\n","export default function Ractive$findParent(selector) {\n  if (this.parent) {\n    if (this.parent.component && this.parent.component.name === selector) {\n      return this.parent;\n    } else {\n      return this.parent.findParent(selector);\n    }\n  }\n\n  return null;\n}\n","import { ANCHOR, COMPONENT, ELEMENT } from 'config/types';\n\nexport default function findElement(start, orComponent = true, name) {\n  while (\n    start &&\n    (start.type !== ELEMENT || (name && start.name !== name)) &&\n    (!orComponent || (start.type !== COMPONENT && start.type !== ANCHOR))\n  ) {\n    // start is a fragment - look at the owner\n    if (start.owner) start = start.owner;\n    else if (start.component || start.yield)\n      // start is a component or yielder - look at the container\n      start = start.containerFragment || start.component.up;\n    else if (start.parent)\n      // start is an item - look at the parent\n      start = start.parent;\n    else if (start.up)\n      // start is an item without a parent - look at the parent fragment\n      start = start.up;\n    else start = undefined;\n  }\n\n  return start;\n}\n","import { isNumber, isUndefined } from 'utils/is';\n\n// This function takes an array, the name of a mutator method, and the\n// arguments to call that mutator method with, and returns an array that\n// maps the old indices to their new indices.\n\n// So if you had something like this...\n//\n//     array = [ 'a', 'b', 'c', 'd' ];\n//     array.push( 'e' );\n//\n// ...you'd get `[ 0, 1, 2, 3 ]` - in other words, none of the old indices\n// have changed. If you then did this...\n//\n//     array.unshift( 'z' );\n//\n// ...the indices would be `[ 1, 2, 3, 4, 5 ]` - every item has been moved\n// one higher to make room for the 'z'. If you removed an item, the new index\n// would be -1...\n//\n//     array.splice( 2, 2 );\n//\n// ...this would result in [ 0, 1, -1, -1, 2, 3 ].\n//\n// This information is used to enable fast, non-destructive shuffling of list\n// sections when you do e.g. `ractive.splice( 'items', 2, 2 );\n\nexport default function getNewIndices(length, methodName, args) {\n  const newIndices = [];\n\n  const spliceArguments = getSpliceEquivalent(length, methodName, args);\n\n  if (!spliceArguments) {\n    return null; // TODO support reverse and sort?\n  }\n\n  const balance = spliceArguments.length - 2 - spliceArguments[1];\n\n  const removeStart = Math.min(length, spliceArguments[0]);\n  const removeEnd = removeStart + spliceArguments[1];\n  newIndices.startIndex = removeStart;\n\n  let i;\n  for (i = 0; i < removeStart; i += 1) {\n    newIndices.push(i);\n  }\n\n  for (; i < removeEnd; i += 1) {\n    newIndices.push(-1);\n  }\n\n  for (; i < length; i += 1) {\n    newIndices.push(i + balance);\n  }\n\n  // there is a net shift for the rest of the array starting with index + balance\n  if (balance !== 0) {\n    newIndices.touchedFrom = spliceArguments[0];\n  } else {\n    newIndices.touchedFrom = length;\n  }\n\n  return newIndices;\n}\n\n// The pop, push, shift an unshift methods can all be represented\n// as an equivalent splice\nfunction getSpliceEquivalent(length, methodName, args) {\n  switch (methodName) {\n    case 'splice':\n      if (args[0] !== undefined && args[0] < 0) {\n        args[0] = length + Math.max(args[0], -length);\n      }\n\n      if (isUndefined(args[0])) args[0] = 0;\n\n      while (args.length < 2) {\n        args.push(length - args[0]);\n      }\n\n      if (!isNumber(args[1])) {\n        args[1] = length - args[0];\n      }\n\n      // ensure we only remove elements that exist\n      args[1] = Math.min(args[1], length - args[0]);\n\n      return args;\n\n    case 'sort':\n    case 'reverse':\n      return null;\n\n    case 'pop':\n      if (length) {\n        return [length - 1, 1];\n      }\n      return [0, 0];\n\n    case 'push':\n      return [length, 0].concat(args);\n\n    case 'shift':\n      return [0, length ? 1 : 0];\n\n    case 'unshift':\n      return [0, 0].concat(args);\n  }\n}\n","import hooks from 'src/events/Hook';\nimport runloop from 'src/global/runloop';\nimport { splitKeypath } from 'shared/keypaths';\nimport { isString } from 'utils/is';\n\nexport function update(ractive, model, options) {\n  // if the parent is wrapped, the adaptor will need to be updated before\n  // updating on this keypath\n  if (model.parent && model.parent.wrapper) {\n    model.parent.adapt();\n  }\n\n  const promise = runloop.start();\n\n  model.mark(options && options.force);\n\n  // notify upstream of changes\n  model.notifyUpstream();\n\n  runloop.end();\n\n  hooks.update.fire(ractive, model);\n\n  return promise;\n}\n\nexport default function Ractive$update(keypath, options) {\n  let opts, path;\n\n  if (isString(keypath)) {\n    path = splitKeypath(keypath);\n    opts = options;\n  } else {\n    opts = keypath;\n  }\n\n  return update(this, path ? this.viewmodel.joinAll(path) : this.viewmodel, opts);\n}\n","import fireEvent from 'src/events/fireEvent';\nimport Context from 'shared/Context';\nimport { assign, create } from 'utils/object';\nimport { isObjectType } from 'utils/is';\n\nexport default function Ractive$fire(eventName, ...args) {\n  let ctx;\n\n  // watch for reproxy\n  if (args[0] instanceof Context) {\n    const proto = args.shift();\n    ctx = create(proto);\n    assign(ctx, proto);\n  } else if (isObjectType(args[0]) && (args[0] === null || args[0].constructor === Object)) {\n    ctx = Context.forRactive(this, args.shift());\n  } else {\n    ctx = Context.forRactive(this);\n  }\n\n  return fireEvent(this, eventName, ctx, args);\n}\n","import { splitKeypath } from 'shared/keypaths';\nimport resolveReference from 'src/view/resolvers/resolveReference';\nimport { FakeFragment } from 'shared/getRactiveContext';\nimport { isString } from 'utils/is';\n\nexport default function Ractive$get(keypath, opts) {\n  if (!isString(keypath)) return this.viewmodel.get(true, keypath);\n\n  const keys = splitKeypath(keypath);\n  const key = keys[0];\n\n  let model;\n\n  if (!this.viewmodel.has(key)) {\n    // if this is an inline component, we may need to create\n    // an implicit mapping\n    if (this.component && !this.isolated) {\n      model = resolveReference(this.fragment || new FakeFragment(this), key);\n    }\n  }\n\n  model = this.viewmodel.joinAll(keys);\n  return model.get(true, opts);\n}\n","import { localFragment } from '../../shared/Context';\nexport default function getLocalContext() {\n  if (localFragment.f) return localFragment.f.getContext();\n}\n","import staticContext from '../static/getContext';\nimport getRactiveContext from 'src/shared/getRactiveContext';\nimport { isString } from 'utils/is';\n\nexport default function getContext(node, options) {\n  if (!node) return getRactiveContext(this);\n\n  if (isString(node)) {\n    node = this.find(node, options);\n  }\n\n  return staticContext(node);\n}\n","import hooks from 'src/events/Hook';\nimport { getElement } from 'utils/dom';\n\nexport default function Ractive$insert(target, anchor) {\n  if (!this.fragment.rendered) {\n    // TODO create, and link to, documentation explaining this\n    throw new Error(\n      'The API has changed - you must call `ractive.render(target[, anchor])` to render your Ractive instance. Once rendered you can use `ractive.insert()`.'\n    );\n  }\n\n  target = getElement(target);\n  anchor = getElement(anchor) || null;\n\n  if (!target) {\n    throw new Error('You must specify a valid target to insert into');\n  }\n\n  target.insertBefore(this.detach(), anchor);\n  this.el = target;\n\n  (target.__ractive_instances__ || (target.__ractive_instances__ = [])).push(this);\n  this.isDetached = false;\n\n  fireInsertHook(this);\n}\n\nfunction fireInsertHook(ractive) {\n  hooks.insert.fire(ractive);\n\n  ractive.findAllComponents('*').forEach(child => {\n    fireInsertHook(child.instance);\n  });\n}\n","import { splitKeypath } from 'shared/keypaths';\nimport resolveReference from 'src/view/resolvers/resolveReference';\nimport runloop from 'src/global/runloop';\n\nexport default function link(there, here, options) {\n  let model;\n  const target = (options && (options.ractive || options.instance)) || this;\n\n  // may need to allow a mapping to resolve implicitly\n  const sourcePath = splitKeypath(there);\n  if (!target.viewmodel.has(sourcePath[0]) && target.component) {\n    model = resolveReference(target.component.up, sourcePath[0]);\n    model = model.joinAll(sourcePath.slice(1));\n  }\n\n  const src = model || target.viewmodel.joinAll(sourcePath);\n  const dest = this.viewmodel.joinAll(splitKeypath(here), { lastLink: false });\n\n  if (isUpstream(src, dest) || isUpstream(dest, src)) {\n    throw new Error('A keypath cannot be linked to itself.');\n  }\n\n  const promise = runloop.start();\n\n  dest.link(src, (options && options.keypath) || there);\n\n  runloop.end();\n\n  return promise;\n}\n\nfunction isUpstream(check, start) {\n  let model = start;\n  while (model) {\n    if (model === check || model.owner === check) return true;\n    model = model.target || model.parent;\n  }\n}\n","import { escapeKey, splitKeypath as splitKeypathI, unescapeKey } from 'shared/keypaths';\n\nexport function joinKeys(...keys) {\n  return keys.map(escapeKey).join('.');\n}\n\nexport function splitKeypath(keypath) {\n  return splitKeypathI(keypath).map(unescapeKey);\n}\n","import { isObject, isFunction } from 'utils/is';\nimport { warnOnceIfDebug } from 'utils/log';\nimport { splitKeypath } from 'shared/keypaths';\nimport resolveReference from 'src/view/resolvers/resolveReference';\nimport Observer from './observe/Observer';\nimport PatternObserver from './observe/Pattern';\nimport ArrayObserver from './observe/Array';\nimport { keys } from 'utils/object';\n\nexport default function observe(keypath, callback, options) {\n  const observers = [];\n  let map;\n  let opts;\n\n  if (isObject(keypath)) {\n    map = keypath;\n    opts = callback || {};\n  } else {\n    if (isFunction(keypath)) {\n      map = { '': keypath };\n      opts = callback || {};\n    } else {\n      map = {};\n      map[keypath] = callback;\n      opts = options || {};\n    }\n  }\n\n  let silent = false;\n  keys(map).forEach(keypath => {\n    const callback = map[keypath];\n    const caller = function(...args) {\n      if (silent) return;\n      return callback.apply(this, args);\n    };\n\n    let keypaths = keypath.split(' ');\n    if (keypaths.length > 1) keypaths = keypaths.filter(k => k);\n\n    keypaths.forEach(keypath => {\n      opts.keypath = keypath;\n      const observer = createObserver(this, keypath, caller, opts);\n      if (observer) observers.push(observer);\n    });\n  });\n\n  // add observers to the Ractive instance, so they can be\n  // cancelled on ractive.teardown()\n  this._observers.push.apply(this._observers, observers);\n\n  return {\n    cancel: () => observers.forEach(o => o.cancel()),\n    isSilenced: () => silent,\n    silence: () => (silent = true),\n    resume: () => (silent = false)\n  };\n}\n\nfunction createObserver(ractive, keypath, callback, options) {\n  const keys = splitKeypath(keypath);\n  let wildcardIndex = keys.indexOf('*');\n  if (!~wildcardIndex) wildcardIndex = keys.indexOf('**');\n\n  options.fragment = options.fragment || ractive.fragment;\n\n  let model;\n  if (!options.fragment) {\n    model = ractive.viewmodel.joinKey(keys[0]);\n  } else {\n    // .*.whatever relative wildcard is a special case because splitkeypath doesn't handle the leading .\n    if (~keys[0].indexOf('.*')) {\n      model = options.fragment.findContext();\n      wildcardIndex = 0;\n      keys[0] = keys[0].slice(1);\n    } else {\n      model =\n        wildcardIndex === 0\n          ? options.fragment.findContext()\n          : resolveReference(options.fragment, keys[0]);\n    }\n  }\n\n  // the model may not exist key\n  if (!model) model = ractive.viewmodel.joinKey(keys[0]);\n\n  if (!~wildcardIndex) {\n    model = model.joinAll(keys.slice(1));\n    if (options.array) {\n      return new ArrayObserver(ractive, model, callback, options);\n    } else {\n      return new Observer(ractive, model, callback, options);\n    }\n  } else {\n    const double = keys.indexOf('**');\n    if (~double) {\n      if (double + 1 !== keys.length || ~keys.indexOf('*')) {\n        warnOnceIfDebug(\n          `Recursive observers may only specify a single '**' at the end of the path.`\n        );\n        return;\n      }\n    }\n\n    model = model.joinAll(keys.slice(1, wildcardIndex));\n\n    return new PatternObserver(ractive, model, keys.slice(wildcardIndex), callback, options);\n  }\n}\n","import { removeFromArray } from 'utils/array';\nimport trim from './shared/trim';\nimport notEmptyString from './shared/notEmptyString';\n\nexport default function Ractive$off(eventName, callback) {\n  // if no event is specified, remove _all_ event listeners\n  if (!eventName) {\n    this._subs = {};\n  } else {\n    // Handle multiple space-separated event names\n    const eventNames = eventName\n      .split(' ')\n      .map(trim)\n      .filter(notEmptyString);\n\n    eventNames.forEach(event => {\n      const subs = this._subs[event];\n      // if given a specific callback to remove, remove only it\n      if (subs && callback) {\n        const entry = subs.find(s => s.callback === callback);\n        if (entry) {\n          removeFromArray(subs, entry);\n          entry.off = true;\n\n          if (event.indexOf('.')) this._nsSubs--;\n        }\n      } else if (subs) {\n        // otherwise, remove all listeners for this event\n        if (event.indexOf('.')) this._nsSubs -= subs.length;\n        subs.length = 0;\n      }\n    });\n  }\n\n  return this;\n}\n","import trim from './shared/trim';\nimport notEmptyString from './shared/notEmptyString';\nimport { hasOwn } from 'utils/object';\nimport { isObjectType, isString } from 'utils/is';\n\nexport default function Ractive$on(eventName, callback) {\n  // eventName may already be a map\n  const map = isObjectType(eventName) ? eventName : {};\n  // or it may be a string along with a callback\n  if (isString(eventName)) map[eventName] = callback;\n\n  let silent = false;\n  const events = [];\n\n  for (const k in map) {\n    const callback = map[k];\n    const caller = function(...args) {\n      if (!silent) return callback.apply(this, args);\n    };\n    const entry = {\n      callback,\n      handler: caller\n    };\n\n    if (hasOwn(map, k)) {\n      const names = k\n        .split(' ')\n        .map(trim)\n        .filter(notEmptyString);\n      names.forEach(n => {\n        (this._subs[n] || (this._subs[n] = [])).push(entry);\n        if (n.indexOf('.')) this._nsSubs++;\n        events.push([n, entry]);\n      });\n    }\n  }\n\n  return {\n    cancel: () => events.forEach(e => this.off(e[0], e[1].callback)),\n    isSilenced: () => silent,\n    silence: () => (silent = true),\n    resume: () => (silent = false)\n  };\n}\n","export default function Ractive$once(eventName, handler) {\n  const listener = this.on(eventName, function() {\n    handler.apply(this, arguments);\n    listener.cancel();\n  });\n\n  // so we can still do listener.cancel() manually\n  return listener;\n}\n","import { splitKeypath } from 'shared/keypaths';\n\nexport default function readLink(keypath, options = {}) {\n  const path = splitKeypath(keypath);\n\n  if (this.viewmodel.has(path[0])) {\n    let model = this.viewmodel.joinAll(path);\n\n    if (!model.isLink) return;\n\n    while ((model = model.target) && options.canonical !== false) {\n      if (!model.isLink) break;\n    }\n\n    if (model) return { ractive: model.root.ractive, keypath: model.getKeypath() };\n  }\n}\n","function s4() {\n  return Math.floor((1 + Math.random()) * 0x10000)\n    .toString(16)\n    .substring(1);\n}\n\nexport function uuid() {\n  return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n}\n","import { applyCSS } from '../../global/css';\nimport transformCSS from '../config/custom/css/transform';\nimport { evalCSS } from '../config/custom/css/css';\nimport { build, set } from '../../shared/set';\nimport runloop from '../../global/runloop';\nimport { isObjectType, isFunction } from 'utils/is';\n\nexport default function setCSSData(keypath, value, options) {\n  const opts = isObjectType(keypath) ? value : options;\n  const model = this._cssModel;\n\n  model.locked = true;\n  const promise = set(build({ viewmodel: model }, keypath, value, true), opts);\n  model.locked = false;\n\n  const cascade = runloop.start();\n  this.extensions.forEach(e => {\n    const model = e._cssModel;\n    model.mark();\n    model.downstreamChanged('', 1);\n  });\n  runloop.end();\n\n  applyChanges(this, !opts || opts.apply !== false);\n\n  return promise.then(() => cascade);\n}\n\nexport function applyChanges(component, apply) {\n  const local = recomputeCSS(component);\n  const child = component.extensions\n    .map(e => applyChanges(e, false))\n    .reduce((a, c) => c || a, false);\n\n  if (apply && (local || child)) {\n    const def = component._cssDef;\n    if (!def || (def && def.applied)) applyCSS(true);\n  }\n\n  return local || child;\n}\n\nexport function recomputeCSS(component) {\n  const css = component.css;\n\n  if (!isFunction(css)) return;\n\n  const def = component._cssDef;\n  const result = evalCSS(component, css);\n  const styles = def.transform ? transformCSS(result, def.id) : result;\n\n  if (def.styles === styles) return;\n\n  def.styles = styles;\n\n  return true;\n}\n","import noop from 'utils/noop';\nimport { isFunction } from 'utils/is';\n\nexport default function wrap(parent, name, method) {\n  if (!/_super/.test(method)) return method;\n\n  function wrapper() {\n    const superMethod = getSuperMethod(wrapper._parent, name);\n    const hasSuper = '_super' in this;\n    const oldSuper = this._super;\n\n    this._super = superMethod;\n\n    const result = method.apply(this, arguments);\n\n    if (hasSuper) {\n      this._super = oldSuper;\n    } else {\n      delete this._super;\n    }\n\n    return result;\n  }\n\n  wrapper._parent = parent;\n  wrapper._method = method;\n\n  return wrapper;\n}\n\nfunction getSuperMethod(parent, name) {\n  if (name in parent) {\n    const value = parent[name];\n\n    return isFunction(value) ? value : () => value;\n  }\n\n  return noop;\n}\n","import { warnIfDebug } from 'utils/log';\nimport { isArray } from 'utils/is';\n\nfunction getMessage(deprecated, correct, isError) {\n  return (\n    `options.${deprecated} has been deprecated in favour of options.${correct}.` +\n    (isError ? ` You cannot specify both options, please use options.${correct}.` : '')\n  );\n}\n\nfunction deprecateOption(options, deprecatedOption, correct) {\n  if (deprecatedOption in options) {\n    if (!(correct in options)) {\n      warnIfDebug(getMessage(deprecatedOption, correct));\n      options[correct] = options[deprecatedOption];\n    } else {\n      throw new Error(getMessage(deprecatedOption, correct, true));\n    }\n  }\n}\n\nexport default function deprecate(options) {\n  deprecateOption(options, 'beforeInit', 'onconstruct');\n  deprecateOption(options, 'init', 'onrender');\n  deprecateOption(options, 'complete', 'oncomplete');\n  deprecateOption(options, 'eventDefinitions', 'events');\n\n  // Using extend with Component instead of options,\n  // like Human.extend( Spider ) means adaptors as a registry\n  // gets copied to options. So we have to check if actually an array\n  if (isArray(options.adaptors)) {\n    deprecateOption(options, 'adaptors', 'adapt');\n  }\n}\n","export default function() {}\n","export function findInViewHierarchy(registryName, ractive, name) {\n  const instance = findInstance(registryName, ractive, name);\n  return instance ? instance[registryName][name] : null;\n}\n\nexport function findInstance(registryName, ractive, name) {\n  while (ractive) {\n    if (name in ractive[registryName]) {\n      return ractive;\n    }\n\n    if (ractive.isolated) {\n      return null;\n    }\n\n    ractive = ractive.parent;\n  }\n}\n","import { fatal } from 'utils/log';\nimport { missingPlugin } from 'config/errors';\nimport interpolators from '../Ractive/static/interpolators';\nimport { findInViewHierarchy } from './registry';\n\nexport default function interpolate(from, to, ractive, type) {\n  if (from === to) return null;\n\n  if (type) {\n    const interpol = findInViewHierarchy('interpolators', ractive, type);\n    if (interpol) return interpol(from, to) || null;\n\n    fatal(missingPlugin(type, 'interpolator'));\n  }\n\n  return (\n    interpolators.number(from, to) ||\n    interpolators.array(from, to) ||\n    interpolators.object(from, to) ||\n    null\n  );\n}\n","import { isArray, isString, isUndefined } from './is';\n\nexport function addToArray(array, value) {\n  const index = array.indexOf(value);\n\n  if (index === -1) {\n    array.push(value);\n  }\n}\n\nexport function arrayContains(array, value) {\n  for (let i = 0, c = array.length; i < c; i++) {\n    if (array[i] == value) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nexport function arrayContentsMatch(a, b) {\n  let i;\n\n  if (!isArray(a) || !isArray(b)) {\n    return false;\n  }\n\n  if (a.length !== b.length) {\n    return false;\n  }\n\n  i = a.length;\n  while (i--) {\n    if (a[i] !== b[i]) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nexport function ensureArray(x) {\n  if (isString(x)) {\n    return [x];\n  }\n\n  if (isUndefined(x)) {\n    return [];\n  }\n\n  return x;\n}\n\nexport function lastItem(array) {\n  return array[array.length - 1];\n}\n\nexport function removeFromArray(array, member) {\n  if (!array) {\n    return;\n  }\n\n  const index = array.indexOf(member);\n\n  if (index !== -1) {\n    array.splice(index, 1);\n  }\n}\n\nexport function combine(...arrays) {\n  const res = arrays.concat.apply([], arrays);\n  let i = res.length;\n  while (i--) {\n    const idx = res.indexOf(res[i]);\n    if (~idx && idx < i) res.splice(i, 1);\n  }\n\n  return res;\n}\n\nexport function toArray(arrayLike) {\n  const array = [];\n  let i = arrayLike.length;\n  while (i--) {\n    array[i] = arrayLike[i];\n  }\n\n  return array;\n}\n\nexport function findMap(array, fn) {\n  const len = array.length;\n  for (let i = 0; i < len; i++) {\n    const result = fn(array[i]);\n    if (result) return result;\n  }\n}\n\nexport function buildNewIndices(one, two, comparator) {\n  let oldArray = one;\n  let newArray = two;\n  if (comparator) {\n    oldArray = oldArray.map(comparator);\n    newArray = newArray.map(comparator);\n  }\n\n  const oldLength = oldArray.length;\n\n  const usedIndices = {};\n  let firstUnusedIndex = 0;\n\n  const result = oldArray.map(item => {\n    let index;\n    let start = firstUnusedIndex;\n\n    do {\n      index = newArray.indexOf(item, start);\n\n      if (index === -1) {\n        return -1;\n      }\n\n      start = index + 1;\n    } while (usedIndices[index] === true && start < oldLength);\n\n    // keep track of the first unused index, so we don't search\n    // the whole of newArray for each item in oldArray unnecessarily\n    if (index === firstUnusedIndex) {\n      firstUnusedIndex += 1;\n    }\n    // allow next instance of next \"equal\" to be found item\n    usedIndices[index] = true;\n    return index;\n  });\n\n  const len = (result.oldLen = oldArray.length);\n  result.newLen = newArray.length;\n\n  if (len === result.newLen) {\n    let i = 0;\n    for (i; i < len; i++) {\n      if (result[i] !== i) break;\n    }\n\n    if (i === len) result.same = true;\n  }\n\n  return result;\n}\n","export function bind(x) {\n  x.bind();\n}\nexport function cancel(x) {\n  x.cancel();\n}\nexport function destroyed(x) {\n  x.destroyed();\n}\nexport function handleChange(x) {\n  x.handleChange();\n}\nexport function mark(x) {\n  x.mark();\n}\nexport function markForce(x) {\n  x.mark(true);\n}\nexport function marked(x) {\n  x.marked();\n}\nexport function markedAll(x) {\n  x.markedAll();\n}\nexport function render(x) {\n  x.render();\n}\nexport function shuffled(x) {\n  x.shuffled();\n}\nexport function teardown(x) {\n  x.teardown();\n}\nexport function unbind(x) {\n  x.unbind();\n}\nexport function unrender(x) {\n  x.unrender();\n}\nexport function unrenderAndDestroy(x) {\n  x.unrender(true);\n}\nexport function update(x) {\n  x.update();\n}\nexport function toString(x) {\n  return x.toString();\n}\nexport function toEscapedString(x) {\n  return x.toString(true);\n}\n","import { splitKeypath } from './keypaths';\nimport { isString } from 'utils/is';\n\n// this is the dry method of checking to see if a rebind applies to\n// a particular keypath because in some cases, a dep may be bound\n// directly to a particular keypath e.g. foo.bars.0.baz and need\n// to avoid getting kicked to foo.bars.1.baz if foo.bars is unshifted\nexport function rebindMatch(template, next, previous, fragment) {\n  const keypath = template.r || template;\n\n  // no valid keypath, go with next\n  if (!keypath || !isString(keypath)) return next;\n\n  // completely contextual ref, go with next\n  if (\n    keypath === '.' ||\n    keypath[0] === '@' ||\n    (next || previous).isKey ||\n    (next || previous).isKeypath\n  )\n    return next;\n\n  const parts = keypath.split('/');\n  let keys = splitKeypath(parts[parts.length - 1]);\n  const last = keys[keys.length - 1];\n\n  // check the keypath against the model keypath to see if it matches\n  let model = next || previous;\n\n  // check to see if this was an alias\n  if (model && keys.length === 1 && last !== model.key && fragment) {\n    keys = findAlias(last, fragment) || keys;\n  }\n\n  let i = keys.length;\n  let match = true;\n  let shuffling = false;\n\n  while (model && i--) {\n    if (model.shuffling) shuffling = true;\n    // non-strict comparison to account for indices in keypaths\n    if (keys[i] != model.key) match = false;\n    model = model.parent;\n  }\n\n  // next is undefined, but keypath is shuffling and previous matches\n  if (!next && match && shuffling) return previous;\n  else if (next && !match && shuffling)\n    // next is defined, but doesn't match the keypath\n    return previous;\n  else return next;\n}\n\nfunction findAlias(name, fragment) {\n  while (fragment) {\n    const z = fragment.aliases;\n    if (z && z[name]) {\n      const aliases = (fragment.owner.iterations ? fragment.owner : fragment).owner.template.z;\n      for (let i = 0; i < aliases.length; i++) {\n        if (aliases[i].n === name) {\n          const alias = aliases[i].x;\n          if (!alias.r) return false;\n          const parts = alias.r.split('/');\n          return splitKeypath(parts[parts.length - 1]);\n        }\n      }\n      return;\n    }\n\n    fragment = fragment.componentParent || fragment.parent;\n  }\n}\n","export function fromExpression(body, length = 0) {\n  const args = new Array(length);\n\n  while (length--) {\n    args[length] = `_${length}`;\n  }\n\n  // Functions created directly with new Function() look like this:\n  //     function anonymous (_0 /**/) { return _0*2 }\n  //\n  // With this workaround, we get a little more compact:\n  //     function (_0){return _0*2}\n  return new Function([], `return function (${args.join(',')}){return(${body});};`)();\n}\n","import { BOOLEAN_LITERAL } from '../../../../../config/types';\n\nexport default function readBooleanLiteral(parser) {\n  const remaining = parser.remaining();\n\n  if (remaining.substr(0, 4) === 'true') {\n    parser.pos += 4;\n    return {\n      t: BOOLEAN_LITERAL,\n      v: 'true'\n    };\n  }\n\n  if (remaining.substr(0, 5) === 'false') {\n    parser.pos += 5;\n    return {\n      t: BOOLEAN_LITERAL,\n      v: 'false'\n    };\n  }\n\n  return null;\n}\n","import { KEY_VALUE_PAIR, REFERENCE } from 'src/config/types';\nimport readKey from '../../../shared/readKey';\nimport readExpression from '../../../../readExpression';\nimport { name as namePattern, spreadPattern } from '../../../shared/patterns';\n\nexport default function readKeyValuePair(parser) {\n  let spread;\n  const start = parser.pos;\n\n  // allow whitespace between '{' and key\n  parser.sp();\n\n  const refKey = parser.nextChar() !== \"'\" && parser.nextChar() !== '\"';\n  if (refKey) spread = parser.matchPattern(spreadPattern);\n\n  const key = spread ? readExpression(parser) : readKey(parser);\n  if (key === null) {\n    parser.pos = start;\n    return null;\n  }\n\n  // allow whitespace between key and ':'\n  parser.sp();\n\n  // es2015 shorthand property\n  if (refKey && (parser.nextChar() === ',' || parser.nextChar() === '}')) {\n    if (!spread && !namePattern.test(key)) {\n      parser.error(`Expected a valid reference, but found '${key}' instead.`);\n    }\n\n    const pair = {\n      t: KEY_VALUE_PAIR,\n      k: key,\n      v: {\n        t: REFERENCE,\n        n: key\n      }\n    };\n\n    if (spread) {\n      pair.p = true;\n    }\n\n    return pair;\n  }\n\n  // next character must be ':'\n  if (!parser.matchString(':')) {\n    parser.pos = start;\n    return null;\n  }\n\n  // allow whitespace between ':' and value\n  parser.sp();\n\n  // next expression must be a, well... expression\n  const value = readExpression(parser);\n  if (value === null) {\n    parser.pos = start;\n    return null;\n  }\n\n  return {\n    t: KEY_VALUE_PAIR,\n    k: key,\n    v: value\n  };\n}\n","import getKeyValuePair from './keyValuePair';\n\nexport default function readKeyValuePairs(parser) {\n  const start = parser.pos;\n\n  const pair = getKeyValuePair(parser);\n  if (pair === null) {\n    return null;\n  }\n\n  const pairs = [pair];\n\n  if (parser.matchString(',')) {\n    const keyValuePairs = readKeyValuePairs(parser);\n\n    if (!keyValuePairs) {\n      parser.pos = start;\n      return null;\n    }\n\n    return pairs.concat(keyValuePairs);\n  }\n\n  return pairs;\n}\n","import { OBJECT_LITERAL } from '../../../../../config/types';\nimport readKeyValuePairs from './objectLiteral/keyValuePairs';\n\nexport default function(parser) {\n  const start = parser.pos;\n\n  // allow whitespace\n  parser.sp();\n\n  if (!parser.matchString('{')) {\n    parser.pos = start;\n    return null;\n  }\n\n  const keyValuePairs = readKeyValuePairs(parser);\n\n  // allow whitespace between final value and '}'\n  parser.sp();\n\n  if (!parser.matchString('}')) {\n    parser.pos = start;\n    return null;\n  }\n\n  return {\n    t: OBJECT_LITERAL,\n    m: keyValuePairs\n  };\n}\n","import { ARRAY_LITERAL } from 'src/config/types';\nimport readExpressionList from '../../shared/readExpressionList';\n\nexport default function(parser) {\n  const start = parser.pos;\n\n  // allow whitespace before '['\n  parser.sp();\n\n  if (!parser.matchString('[')) {\n    parser.pos = start;\n    return null;\n  }\n\n  const expressionList = readExpressionList(parser, true);\n\n  if (!parser.matchString(']')) {\n    parser.pos = start;\n    return null;\n  }\n\n  return {\n    t: ARRAY_LITERAL,\n    m: expressionList\n  };\n}\n","import readNumberLiteral from './literal/readNumberLiteral';\nimport readBooleanLiteral from './literal/readBooleanLiteral';\nimport readStringLiteral from './literal/readStringLiteral';\nimport readTemplateStringLiteral from './literal/readTemplateStringLiteral';\nimport readObjectLiteral from './literal/readObjectLiteral';\nimport readArrayLiteral from './literal/readArrayLiteral';\nimport readRegexpLiteral from './literal/readRegexpLiteral';\n\nexport default function readLiteral(parser) {\n  return (\n    readNumberLiteral(parser) ||\n    readBooleanLiteral(parser) ||\n    readStringLiteral(parser) ||\n    readTemplateStringLiteral(parser) ||\n    readObjectLiteral(parser) ||\n    readArrayLiteral(parser) ||\n    readRegexpLiteral(parser)\n  );\n}\n","import { BRACKETED } from 'src/config/types';\nimport { expectedExpression, expectedParen } from '../shared/errors';\nimport readExpression from '../../readExpression';\n\nexport default function readBracketedExpression(parser) {\n  if (!parser.matchString('(')) return null;\n\n  parser.sp();\n\n  const expr = readExpression(parser);\n\n  if (!expr) parser.error(expectedExpression);\n\n  parser.sp();\n\n  if (!parser.matchString(')')) parser.error(expectedParen);\n\n  return {\n    t: BRACKETED,\n    x: expr\n  };\n}\n","import readLiteral from './primary/readLiteral';\nimport readReference from './primary/readReference';\nimport readBracketedExpression from './primary/readBracketedExpression';\n\nexport default function(parser) {\n  return readLiteral(parser) || readReference(parser) || readBracketedExpression(parser);\n}\n","import { REFINEMENT } from 'config/types';\nimport { expectedExpression } from './errors';\nimport { name as namePattern } from './patterns';\nimport readExpression from '../../readExpression';\n\nexport default function readRefinement(parser) {\n  // some things call for strict refinement (partial names), meaning no space between reference and refinement\n  if (!parser.strictRefinement) {\n    parser.sp();\n  }\n\n  // \".\" name\n  if (parser.matchString('.')) {\n    parser.sp();\n\n    const name = parser.matchPattern(namePattern);\n    if (name) {\n      return {\n        t: REFINEMENT,\n        n: name\n      };\n    }\n\n    parser.error('Expected a property name');\n  }\n\n  // \"[\" expression \"]\"\n  if (parser.matchString('[')) {\n    parser.sp();\n\n    const expr = readExpression(parser);\n    if (!expr) parser.error(expectedExpression);\n\n    parser.sp();\n\n    if (!parser.matchString(']')) parser.error(`Expected ']'`);\n\n    return {\n      t: REFINEMENT,\n      x: expr\n    };\n  }\n\n  return null;\n}\n","import { MEMBER, INVOCATION } from 'config/types';\nimport readPrimary from './readPrimary';\nimport readExpressionList from './shared/readExpressionList';\nimport readRefinement from './shared/readRefinement';\nimport { expectedParen } from './shared/errors';\n\nexport default function(parser) {\n  let expression = readPrimary(parser);\n\n  if (!expression) return null;\n\n  while (expression) {\n    const refinement = readRefinement(parser);\n    if (refinement) {\n      expression = {\n        t: MEMBER,\n        x: expression,\n        r: refinement\n      };\n    } else if (parser.matchString('(')) {\n      parser.sp();\n      const expressionList = readExpressionList(parser, true);\n\n      parser.sp();\n\n      if (!parser.matchString(')')) {\n        parser.error(expectedParen);\n      }\n\n      expression = {\n        t: INVOCATION,\n        x: expression\n      };\n\n      if (expressionList) expression.o = expressionList;\n    } else {\n      break;\n    }\n  }\n\n  return expression;\n}\n","import { CONDITIONAL } from 'config/types';\nimport readLogicalOr from './readLogicalOr';\nimport { expectedExpression } from './shared/errors';\nimport readExpression from '../readExpression';\n\n// The conditional operator is the lowest precedence operator, so we start here\nexport default function getConditional(parser) {\n  const expression = readLogicalOr(parser);\n  if (!expression) {\n    return null;\n  }\n\n  const start = parser.pos;\n\n  parser.sp();\n\n  if (!parser.matchString('?')) {\n    parser.pos = start;\n    return expression;\n  }\n\n  parser.sp();\n\n  const ifTrue = readExpression(parser);\n  if (!ifTrue) {\n    parser.error(expectedExpression);\n  }\n\n  parser.sp();\n\n  if (!parser.matchString(':')) {\n    parser.error('Expected \":\"');\n  }\n\n  parser.sp();\n\n  const ifFalse = readExpression(parser);\n  if (!ifFalse) {\n    parser.error(expectedExpression);\n  }\n\n  return {\n    t: CONDITIONAL,\n    o: [expression, ifTrue, ifFalse]\n  };\n}\n","import readConditional from './expressions/readConditional';\nimport readReference from './expressions/primary/readReference';\n\nexport default function readExpression(parser) {\n  // if eval is false, no expressions\n  if (parser.allowExpressions === false) {\n    const ref = readReference(parser);\n    parser.sp();\n    return ref;\n  }\n\n  // The conditional operator is the lowest precedence operator (except yield,\n  // assignment operators, and commas, none of which are supported), so we\n  // start there. If it doesn't match, it 'falls through' to progressively\n  // higher precedence operators, until it eventually matches (or fails to\n  // match) a 'primary' - a literal or a reference. This way, the abstract syntax\n  // tree has everything in its proper place, i.e. 2 + 3 * 4 === 14, not 20.\n  return readConditional(parser);\n}\n","import { expectedExpression } from './errors';\nimport readExpression from '../../readExpression';\nimport { spreadPattern } from './patterns';\n\nexport default function readExpressionList(parser, spread) {\n  let isSpread;\n  const expressions = [];\n\n  const pos = parser.pos;\n\n  do {\n    parser.sp();\n\n    if (spread) {\n      isSpread = parser.matchPattern(spreadPattern);\n    }\n\n    const expr = readExpression(parser);\n\n    if (expr === null && expressions.length) {\n      parser.error(expectedExpression);\n    } else if (expr === null) {\n      parser.pos = pos;\n      return null;\n    }\n\n    if (isSpread) {\n      expr.p = true;\n    }\n\n    expressions.push(expr);\n\n    parser.sp();\n  } while (parser.matchString(','));\n\n  return expressions;\n}\n","import { REFERENCE } from 'config/types';\nimport readExpression from './readExpression';\nimport readReference from './expressions/primary/readReference';\n\nexport default function readExpressionOrReference(parser, expectedFollowers) {\n  const start = parser.pos;\n  const expression = readExpression(parser);\n\n  if (!expression) {\n    // valid reference but invalid expression e.g. `{{new}}`?\n    const ref = parser.matchPattern(/^(\\w+)/);\n    if (ref) {\n      return {\n        t: REFERENCE,\n        n: ref\n      };\n    }\n\n    return null;\n  }\n\n  for (let i = 0; i < expectedFollowers.length; i += 1) {\n    if (parser.remaining().substr(0, expectedFollowers[i].length) === expectedFollowers[i]) {\n      return expression;\n    }\n  }\n\n  parser.pos = start;\n  return readReference(parser);\n}\n","import {\n  REFERENCE,\n  BOOLEAN_LITERAL,\n  GLOBAL,\n  NUMBER_LITERAL,\n  REGEXP_LITERAL,\n  STRING_LITERAL,\n  ARRAY_LITERAL,\n  OBJECT_LITERAL,\n  KEY_VALUE_PAIR,\n  PREFIX_OPERATOR,\n  INFIX_OPERATOR,\n  INVOCATION,\n  BRACKETED,\n  MEMBER,\n  REFINEMENT,\n  CONDITIONAL\n} from 'config/types';\nimport { isObject, isString } from 'utils/is';\n\nexport default function flattenExpression(expression) {\n  let refs;\n  let count = 0;\n\n  extractRefs(expression, (refs = []));\n  const stringified = stringify(expression);\n\n  return {\n    r: refs,\n    s: getVars(stringified)\n  };\n\n  function getVars(expr) {\n    const vars = [];\n    for (let i = count - 1; i >= 0; i--) {\n      vars.push(`x$${i}`);\n    }\n    return vars.length ? `(function(){var ${vars.join(',')};return(${expr});})()` : expr;\n  }\n\n  function stringify(node) {\n    if (isString(node)) {\n      return node;\n    }\n\n    switch (node.t) {\n      case BOOLEAN_LITERAL:\n      case GLOBAL:\n      case NUMBER_LITERAL:\n      case REGEXP_LITERAL:\n        return node.v;\n\n      case STRING_LITERAL:\n        return JSON.stringify(String(node.v));\n\n      case ARRAY_LITERAL:\n        if (node.m && hasSpread(node.m)) {\n          return `[].concat(${makeSpread(node.m, '[', ']', stringify)})`;\n        } else {\n          return '[' + (node.m ? node.m.map(stringify).join(',') : '') + ']';\n        }\n\n      case OBJECT_LITERAL:\n        if (node.m && hasSpread(node.m)) {\n          return `Object.assign({},${makeSpread(node.m, '{', '}', stringifyPair)})`;\n        } else {\n          return '{' + (node.m ? node.m.map(n => `${n.k}:${stringify(n.v)}`).join(',') : '') + '}';\n        }\n\n      case PREFIX_OPERATOR:\n        return (node.s === 'typeof' ? 'typeof ' : node.s) + stringify(node.o);\n\n      case INFIX_OPERATOR:\n        return (\n          stringify(node.o[0]) +\n          (node.s.substr(0, 2) === 'in' ? ' ' + node.s + ' ' : node.s) +\n          stringify(node.o[1])\n        );\n\n      case INVOCATION:\n        if (node.o && hasSpread(node.o)) {\n          const id = count++;\n          return `(x$${id}=${stringify(node.x)}).apply(x$${id},${stringify({\n            t: ARRAY_LITERAL,\n            m: node.o\n          })})`;\n        } else {\n          return stringify(node.x) + '(' + (node.o ? node.o.map(stringify).join(',') : '') + ')';\n        }\n\n      case BRACKETED:\n        return '(' + stringify(node.x) + ')';\n\n      case MEMBER:\n        return stringify(node.x) + stringify(node.r);\n\n      case REFINEMENT:\n        return node.n ? '.' + node.n : '[' + stringify(node.x) + ']';\n\n      case CONDITIONAL:\n        return stringify(node.o[0]) + '?' + stringify(node.o[1]) + ':' + stringify(node.o[2]);\n\n      case REFERENCE:\n        return '_' + refs.indexOf(node.n);\n\n      default:\n        throw new Error('Expected legal JavaScript');\n    }\n  }\n\n  function stringifyPair(node) {\n    return node.p ? stringify(node.k) : `${node.k}:${stringify(node.v)}`;\n  }\n\n  function makeSpread(list, open, close, fn) {\n    const out = list.reduce(\n      (a, c) => {\n        if (c.p) {\n          a.str += `${a.open ? close + ',' : a.str.length ? ',' : ''}${fn(c)}`;\n        } else {\n          a.str += `${!a.str.length ? open : !a.open ? ',' + open : ','}${fn(c)}`;\n        }\n        a.open = !c.p;\n        return a;\n      },\n      { open: false, str: '' }\n    );\n    if (out.open) out.str += close;\n    return out.str;\n  }\n}\n\nfunction hasSpread(list) {\n  for (let i = 0; i < list.length; i++) {\n    if (list[i].p) return true;\n  }\n\n  return false;\n}\n\n// TODO maybe refactor this?\nfunction extractRefs(node, refs) {\n  if (node.t === REFERENCE && isString(node.n)) {\n    if (!~refs.indexOf(node.n)) {\n      refs.unshift(node.n);\n    }\n  }\n\n  const list = node.o || node.m;\n  if (list) {\n    if (isObject(list)) {\n      extractRefs(list, refs);\n    } else {\n      let i = list.length;\n      while (i--) {\n        extractRefs(list[i], refs);\n      }\n    }\n  }\n\n  if (node.k && node.t === KEY_VALUE_PAIR && !isString(node.k)) {\n    extractRefs(node.k, refs);\n  }\n\n  if (node.x) {\n    extractRefs(node.x, refs);\n  }\n\n  if (node.r) {\n    extractRefs(node.r, refs);\n  }\n\n  if (node.v) {\n    extractRefs(node.v, refs);\n  }\n}\n","import { REFERENCE, BRACKETED, MEMBER, REFINEMENT } from 'config/types';\nimport flattenExpression from './flattenExpression';\n\nexport default function refineExpression(expression, mustache) {\n  let referenceExpression;\n\n  if (expression) {\n    while (expression.t === BRACKETED && expression.x) {\n      expression = expression.x;\n    }\n\n    if (expression.t === REFERENCE) {\n      const n = expression.n;\n      if (!~n.indexOf('@context')) {\n        mustache.r = expression.n;\n      } else {\n        mustache.x = flattenExpression(expression);\n      }\n    } else {\n      if ((referenceExpression = getReferenceExpression(expression))) {\n        mustache.rx = referenceExpression;\n      } else {\n        mustache.x = flattenExpression(expression);\n      }\n    }\n\n    return mustache;\n  }\n}\n\n// TODO refactor this! it's bewildering\nfunction getReferenceExpression(expression) {\n  const members = [];\n  let refinement;\n\n  while (expression.t === MEMBER && expression.r.t === REFINEMENT) {\n    refinement = expression.r;\n\n    if (refinement.x) {\n      if (refinement.x.t === REFERENCE) {\n        members.unshift(refinement.x);\n      } else {\n        members.unshift(flattenExpression(refinement.x));\n      }\n    } else {\n      members.unshift(refinement.n);\n    }\n\n    expression = expression.x;\n  }\n\n  if (expression.t !== REFERENCE) {\n    return null;\n  }\n\n  return {\n    r: expression.n,\n    m: members\n  };\n}\n","import { TRIPLE } from 'config/types';\nimport readExpression from '../readExpression';\nimport refineExpression from 'parse/utils/refineExpression';\n\nexport default function readTriple(parser, tag) {\n  const expression = readExpression(parser);\n\n  if (!expression) {\n    return null;\n  }\n\n  if (!parser.matchString(tag.close)) {\n    parser.error(`Expected closing delimiter '${tag.close}'`);\n  }\n\n  const triple = { t: TRIPLE };\n  refineExpression(expression, triple); // TODO handle this differently - it's mysterious\n\n  return triple;\n}\n","import { TRIPLE } from 'config/types';\nimport readExpression from '../readExpression';\nimport refineExpression from 'parse/utils/refineExpression';\n\nexport default function readUnescaped(parser, tag) {\n  if (!parser.matchString('&')) {\n    return null;\n  }\n\n  parser.sp();\n\n  const expression = readExpression(parser);\n\n  if (!expression) {\n    return null;\n  }\n\n  if (!parser.matchString(tag.close)) {\n    parser.error(`Expected closing delimiter '${tag.close}'`);\n  }\n\n  const triple = { t: TRIPLE };\n  refineExpression(expression, triple); // TODO handle this differently - it's mysterious\n\n  return triple;\n}\n","import { PARTIAL, YIELDER } from 'src/config/types';\nimport readExpression from '../readExpression';\nimport refineExpression from 'parse/utils/refineExpression';\nimport { readAliases } from './readAliases';\n\nexport default function readPartial(parser, tag) {\n  const type = parser.matchString('>') || parser.matchString('yield');\n  const partial = { t: type === '>' ? PARTIAL : YIELDER };\n  let aliases;\n\n  if (!type) return null;\n\n  parser.sp();\n\n  if (type === '>' || !(aliases = parser.matchString('with'))) {\n    // Partial names can include hyphens, so we can't use readExpression\n    // blindly. Instead, we use the `relaxedNames` flag to indicate that\n    // `foo-bar` should be read as a single name, rather than 'subtract\n    // bar from foo'\n    parser.relaxedNames = parser.strictRefinement = true;\n    const expression = readExpression(parser);\n    parser.relaxedNames = parser.strictRefinement = false;\n\n    if (!expression && type === '>') return null;\n\n    if (expression) {\n      refineExpression(expression, partial); // TODO...\n      parser.sp();\n      if (type !== '>') aliases = parser.matchString('with');\n    }\n  }\n\n  parser.sp();\n\n  // check for alias context e.g. `{{>foo bar as bat, bip as bop}}`\n  if (aliases || type === '>') {\n    aliases = readAliases(parser);\n    if (aliases && aliases.length) {\n      partial.z = aliases;\n    } else {\n      // otherwise check for literal context e.g. `{{>foo bar}}` then\n      // turn it into `{{#with bar}}{{>foo}}{{/with}}`\n      const context = readExpression(parser);\n      if (context) {\n        partial.c = {};\n        refineExpression(context, partial.c);\n      }\n\n      // allow aliases after context\n      if (parser.matchString(',')) {\n        aliases = readAliases(parser);\n        if (aliases && aliases.length) {\n          partial.z = aliases;\n        }\n      }\n    }\n\n    if (type !== '>' && (!partial.c && !partial.z)) {\n      // {{yield with}} requires some aliases\n      parser.error(`Expected a context or one or more aliases`);\n    }\n  }\n\n  parser.sp();\n\n  if (!parser.matchString(tag.close)) {\n    parser.error(`Expected closing delimiter '${tag.close}'`);\n  }\n\n  return partial;\n}\n","import { COMMENT } from 'src/config/types';\n\nexport default function readComment(parser, tag) {\n  if (!parser.matchString('!')) {\n    return null;\n  }\n\n  const index = parser.remaining().indexOf(tag.close);\n\n  if (index !== -1) {\n    parser.pos += index + tag.close.length;\n    return { t: COMMENT };\n  }\n}\n","import { INTERPOLATOR } from 'config/types';\nimport readExpressionOrReference from '../readExpressionOrReference';\nimport refineExpression from 'parse/utils/refineExpression';\n\nexport default function readInterpolator(parser, tag) {\n  let expression, err;\n\n  const start = parser.pos;\n\n  // TODO would be good for perf if we could do away with the try-catch\n  try {\n    expression = readExpressionOrReference(parser, [tag.close]);\n  } catch (e) {\n    err = e;\n  }\n\n  if (!expression) {\n    if (parser.str.charAt(start) === '!') {\n      // special case - comment\n      parser.pos = start;\n      return null;\n    }\n\n    if (err) {\n      throw err;\n    }\n  }\n\n  if (!parser.matchString(tag.close)) {\n    parser.error(`Expected closing delimiter '${tag.close}' after reference`);\n\n    if (!expression) {\n      // special case - comment\n      if (parser.nextChar() === '!') {\n        return null;\n      }\n\n      parser.error(`Expected expression or legal reference`);\n    }\n  }\n\n  const interpolator = { t: INTERPOLATOR };\n  refineExpression(expression, interpolator); // TODO handle this differently - it's mysterious\n\n  return interpolator;\n}\n","import { CLOSING } from 'config/types';\n\nexport default function readClosing(parser, tag) {\n  const start = parser.pos;\n\n  if (!parser.matchString(tag.open)) {\n    return null;\n  }\n\n  parser.sp();\n\n  if (!parser.matchString('/')) {\n    parser.pos = start;\n    return null;\n  }\n\n  parser.sp();\n\n  const remaining = parser.remaining();\n  const index = remaining.indexOf(tag.close);\n\n  if (index !== -1) {\n    const closing = {\n      t: CLOSING,\n      r: remaining.substr(0, index).split(' ')[0]\n    };\n\n    parser.pos += index;\n\n    if (!parser.matchString(tag.close)) {\n      parser.error(`Expected closing delimiter '${tag.close}'`);\n    }\n\n    return closing;\n  }\n\n  parser.pos = start;\n  return null;\n}\n","import { lastItem } from 'utils/array';\nimport { isString } from 'utils/is';\n\nexport default function(items, leadingPattern, trailingPattern) {\n  let item;\n\n  if (leadingPattern) {\n    item = items[0];\n    if (isString(item)) {\n      item = item.replace(leadingPattern, '');\n\n      if (!item) {\n        items.shift();\n      } else {\n        items[0] = item;\n      }\n    }\n  }\n\n  if (trailingPattern) {\n    item = lastItem(items);\n    if (isString(item)) {\n      item = item.replace(trailingPattern, '');\n\n      if (!item) {\n        items.pop();\n      } else {\n        items[items.length - 1] = item;\n      }\n    }\n  }\n}\n","export default function(camelCaseStr) {\n  return camelCaseStr.replace(/([A-Z])/g, (match, $1) => {\n    return '-' + $1.toLowerCase();\n  });\n}\n","import getLowestIndex from './utils/getLowestIndex';\nimport { decodeCharacterReferences } from 'utils/html';\n\nexport default function readText(parser) {\n  let index, disallowed, barrier;\n\n  const remaining = parser.remaining();\n\n  if (parser.textOnlyMode) {\n    disallowed = parser.tags.map(t => t.open);\n    disallowed = disallowed.concat(parser.tags.map(t => '\\\\' + t.open));\n\n    index = getLowestIndex(remaining, disallowed);\n  } else {\n    barrier = parser.inside ? '</' + parser.inside : '<';\n\n    if (parser.inside && !parser.interpolate[parser.inside]) {\n      index = remaining.indexOf(barrier);\n    } else {\n      disallowed = parser.tags.map(t => t.open);\n      disallowed = disallowed.concat(parser.tags.map(t => '\\\\' + t.open));\n\n      // http://developers.whatwg.org/syntax.html#syntax-attributes\n      if (parser.inAttribute === true) {\n        // we're inside an unquoted attribute value\n        disallowed.push(`\"`, `'`, `=`, `<`, `>`, '`');\n      } else if (parser.inAttribute) {\n        // quoted attribute value\n        disallowed.push(parser.inAttribute);\n      } else {\n        disallowed.push(barrier);\n      }\n\n      index = getLowestIndex(remaining, disallowed);\n    }\n  }\n\n  if (!index) {\n    return null;\n  }\n\n  if (index === -1) {\n    index = remaining.length;\n  }\n\n  parser.pos += index;\n\n  if ((parser.inside && parser.inside !== 'textarea') || parser.textOnlyMode) {\n    return remaining.substr(0, index);\n  } else {\n    return decodeCharacterReferences(remaining.substr(0, index));\n  }\n}\n","import { TEMPLATE_VERSION } from 'config/template';\nimport { READERS, PARTIAL_READERS } from 'parse/_parse';\nimport cleanup from 'parse/utils/cleanup';\nimport { create } from 'utils/object';\n\nexport default function readTemplate(parser) {\n  const fragment = [];\n  const partials = create(null);\n  let hasPartials = false;\n\n  const preserveWhitespace = parser.preserveWhitespace;\n\n  while (parser.pos < parser.str.length) {\n    const pos = parser.pos;\n    let item, partial;\n\n    if ((partial = parser.read(PARTIAL_READERS))) {\n      if (partials[partial.n]) {\n        parser.pos = pos;\n        parser.error('Duplicated partial definition');\n      }\n\n      cleanup(\n        partial.f,\n        parser.stripComments,\n        preserveWhitespace,\n        !preserveWhitespace,\n        !preserveWhitespace,\n        parser.whiteSpaceElements\n      );\n\n      partials[partial.n] = partial.f;\n      hasPartials = true;\n    } else if ((item = parser.read(READERS))) {\n      fragment.push(item);\n    } else {\n      parser.error('Unexpected template content');\n    }\n  }\n\n  const result = {\n    v: TEMPLATE_VERSION,\n    t: fragment\n  };\n\n  if (hasPartials) {\n    result.p = partials;\n  }\n\n  return result;\n}\n","import { fromExpression } from './createFunction';\nimport { isArray, isObject } from 'utils/is';\nimport { keys } from 'utils/object';\n\nexport default function insertExpressions(obj, expr) {\n  keys(obj).forEach(key => {\n    if (isExpression(key, obj)) return addTo(obj, expr);\n\n    const ref = obj[key];\n    if (hasChildren(ref)) insertExpressions(ref, expr);\n  });\n}\n\nfunction isExpression(key, obj) {\n  return key === 's' && isArray(obj.r);\n}\n\nfunction addTo(obj, expr) {\n  const { s, r } = obj;\n  if (!expr[s]) expr[s] = fromExpression(s, r.length);\n}\n\nfunction hasChildren(ref) {\n  return isArray(ref) || isObject(ref);\n}\n","import { fatal } from 'utils/log';\nimport bind from 'utils/bind';\nimport { createFunctionFromString } from '../config/runtime-parser';\nimport { isFunction, isString, isObjectType } from 'utils/is';\n\nexport default function getComputationSignature(ractive, key, signature) {\n  let getter;\n  let setter;\n\n  // useful for debugging\n  let getterString;\n  let getterUseStack;\n  let setterString;\n\n  if (isFunction(signature)) {\n    getter = bind(signature, ractive);\n    getterString = signature.toString();\n    getterUseStack = true;\n  }\n\n  if (isString(signature)) {\n    getter = createFunctionFromString(signature, ractive);\n    getterString = signature;\n  }\n\n  if (isObjectType(signature)) {\n    if (isString(signature.get)) {\n      getter = createFunctionFromString(signature.get, ractive);\n      getterString = signature.get;\n    } else if (isFunction(signature.get)) {\n      getter = bind(signature.get, ractive);\n      getterString = signature.get.toString();\n      getterUseStack = true;\n    } else {\n      fatal('`%s` computation must have a `get()` method', key);\n    }\n\n    if (isFunction(signature.set)) {\n      setter = bind(signature.set, ractive);\n      setterString = signature.set.toString();\n    }\n  }\n\n  return {\n    getter,\n    setter,\n    getterString,\n    setterString,\n    getterUseStack\n  };\n}\n"],"names":["Fragment__proto__","getKey","this","keyModel","KeyModel","key","getIndex","idxModel","index","rebind","next","context","rootModel","pathModel","rebound","update","owner","template","z","aliases","const","k","unreference","resolveAliases","containerFragment","parent","items","forEach","x","applyValue","getKeypath","ractive","root","render","target","occupants","rendered","Error","let","xs","len","length","i","resetTemplate","wasBound","bound","wasRendered","unrender","unbind","createItems","bind","parentNode","findParentNode","anchor","findNextNode","docFrag","createDocumentFragment","insertBefore","shuffled","toString","escape","map","toEscapedString","join","view","yielder","this$1","shouldDestroy","dirty","updating","isRoot","runloop","addFragmentToRoot","valueOf","dirtyValue","values","source","processItems","_guid","parsed","parseJSON","value","Fragment","prototype","getContext","shouldRerender","reverse","makeArrayMethod","path","shift","sort","splice","unshift","proto","add","animate","attachChild","compute","detach","detachChild","find","findAll","findAllComponents","findComponent","findContainer","findParent","fire","get","getLocalContext","insert","link","observe","observeOnce","off","on","once","pop","push","readLink","reset","resetPartial","set","subtract","teardown","toggle","toCSS","toCss","toHTML","toHtml","toText","transition","unlink","updateModel","use","styles","callsSuper","defineProperties","Ractive","sharedGet","sharedSet","styleGet","configurable","styleSet","addCSS","addStyle","hasCSS","hasStyle","win","opts","script","document","currentScript","querySelector","getAttribute","indexOf","warn","assign","defaults","constructor","shared","DEBUG","writable","DEBUG_PROMISES","extend","extendWith","escapeKey","evalObjectString","findPlugin","getCSS","isInstance","joinKeys","macro","normaliseKeypath","normalise","parse","splitKeypath","unescapeKey","enhance","svg","tick","batch","promise","VERSION","adaptors","components","decorators","easing","events","extensions","helpers","interpolators","partials","transitions","cssData","perComponentStyleElements","splitTag","sharedData","Context","extern","defineProperty","CSSModel","fragment","options","up","element","findElement","attributeByName","name","f","Mapping__proto__","Mapping","viewmodel","instance","joinKey","isString","isArray","createMapping","boundFragment","model","resolve","joinAll","mapping","unregister","Item","Option","Element","a","isUndefined","super","select","Option__proto__","selectedAttribute","selected","undefined","attributes","bubble","node","_ractive","attribute","getValue","isSelected","optionValue","selectValue","compare","removeFromArray","Partial","create","MustacheContainer","container","component","r","rx","refName","fn","partialFromValue","partial","call","warnOnceIfDebug","createFragment","initMacro","handleChange","dirtyTemplate","externalChange","_attrs","keys","refreshAttrs","handle","proxy","last","fnTemplate","isFunction","getPartialTemplate","contextifyTemplate","unbindAttrs","scheduleTask","_cssDef","applied","applyCSS","dirtyAttrs","invalidate","extras","isReadonly","isKey","deps","links","children","KeyModel__proto__","c","destroyed","upstream","unregisterChild","shouldCapture","capture","has","previous","relinking","register","dependant","registerChild","child","addToArray","registerLink","unregisterLink","reference","noop","keypathString","RepeatedFragment","delegate","findDelegate","cssIds","iterations","indexRef","keyRef","pendingNewIndices","previousIterations","RepeatedFragment__proto__","slice","shuffler","n","s","test","shuffleValues","isComputed","max","createIteration","isObject","refs","split","ks","bubbled","rebounding","isIteration","swizzleFragment","appendChild","selector","findMap","findContext","iteration","firstNode","skipParent","getLast","lastModel","contextFor","shuffle","newIndices","merge","newIndex","oldIndex","shouldRebind","updatePostShuffle","buildNewIndices","same","toRemove","oldKeys","wasArray","lastValue","i$1","newLength","updateLast","fragment$1","nextNode","indices","idx","dest","pos","prev","iters","stash","Array","e","isObjectType","plen","Section","isAlias","t","ALIAS","sectionType","SECTION_WITH","templateSectionType","subordinate","l","Section__proto__","sibling","nextSibling","SECTION_UNLESS","isTruthy","frag","detached","SECTION_IF_WITH","isEmpty","safe","SECTION_IF","SECTION_EACH","siblingFalsey","lastType","getType","newFragment","fragmentShouldExist","attach","keep","then","Select","Select__proto__","foundNode","binding","selectedOptions","getSelectedOptions","sync","defaultSelected","selectNode","toArray","o","setFromNode","isMultiple","array","optionWasSelected","shouldSelect","valueContains","forceUpdate","comparator","Textarea","Input","deferContent","isBindable","createItem","ATTRIBUTE","Textarea__proto__","Text","type","TEXT","Text__proto__","detachNode","inAttributes","progressiveText","escapeHtml","visible","hidden","doc","prefix","vendors","vendor","addEventListener","onChange","onHide","onShow","isClient","prefixCache","testStyle","createElement","style","prop","hyphenateCamel","createTransitions","prefix$1","vendorPattern","RegExp","TRANSITION","TRANSITIONEND","CSS_TRANSITIONS_ENABLED","TRANSITION_DURATION","TRANSITION_PROPERTY","TRANSITION_TIMING_FUNCTION","linear","canUseCssTransitions","cannotUseCssTransitions","webkitTransition","to","changedProperties","setTimeout","transitionDone","clearTimeout","cssTimeout","checkComplete","jsTransitionsComplete","cssTransitionsComplete","unregisterCompleteHandler","isIntro","transitionEndHandler","event","propertyName","cssTransitionsDone","property","duration","timing","removeEventListener","hashPrefix","namespaceURI","tagName","delay","registerCompleteHandler","easingName","hyphenate","cssTiming","hash","suffix","interpolator","originalValue","propertiesToTransitionInJs","initial","getStyle","warnIfDebug","exec","interpolate","parseFloat","missingPlugin","Ticker","step","complete","createTransitions$1","getComputedStyle","resolved","Promise","names","t0","t1","t2","Transition","onComplete","Transition__proto__","animateStyle","arguments","setStyle","fulfil","propertyNames","computedStyle","current","init","originals","targets","v","intro","outro","eventName","params","_fn","findInViewHierarchy","setupArgsFn","getParams","resolveArgs","apply","props","processParams","isNumber","hasOwn","shouldFire","transitionsEnabled","rendering","nearestProp","unrendering","nested","el","starting","start","completed","args","noReset","_manager","remove","concat","unbinding","ieBug","ieBlacklist","elementCache","innerHTML","err","TABLE","THEAD","TBODY","TR","SELECT","Triple","Mustache","Triple__proto__","nodes","nodeType","matches","queryResult","result","queryAllResult","querySelectorAll","html","insertHtml","outerHTML","nodeValue","removeChild","inAttribute","decodeCharacterReferences","detachWhenReady","constructors","ANCHOR","Component","AWAIT","Await","DOCTYPE","Doctype","INTERPOLATOR","Interpolator","PARTIAL","SECTION","TRIPLE","YIELDER","Attribute","BINDING_FLAG","BindingFlag","DECORATOR","Decorator","EVENT","EventDirective","COMMENT","Comment","specialElements","doctype","form","Form","input","option","textarea","componentParent","addFragment","base","findParentWithContext","item","it","ELEMENT","ExpressionProxy__proto__","ExpressionProxy","actuallyChanged","keypath","replace","match","models","startCapturing","m","message","dependencies","stopCapturing","filter","d","notifyUpstream","rebindMatch","addShuffleRegister","ref","resolveReference","retrieve","collect","dep","Model","computation","Computation","mark","missingDecorator","Decorator__proto__","warnOnce","localFragment","teardownArgsFn","Doctype__proto__","Binding","twowayBinding","setRoot","isTwoway","wasUndefined","getInitialValue","lastVal","parentForm","resetValue","formBindings","Binding__proto__","registerTwowayBinding","locked","end","setting","unregisterTwowayBinding","CheckboxBinding","CheckboxBinding__proto__","handleDomEvent","attachEvent","checked","BindingGroup","bindings","BindingGroup__proto__","b","CheckboxNameBinding","checkboxName","group","getBindingGroup","noInitialValue","existingValue","bindingValue","arrayContains","CheckboxNameBinding__proto__","isChecked","mval","valueSoFar","ContentEditableBinding","ContentEditableBinding__proto__","lazy","GenericBinding","GenericBinding__proto__","timeout","isNumeric","handler","handleDelay","handleBlur","FileBinding","FileBinding__proto__","files","MultipleSelectBinding","MultipleSelectBinding__proto__","selectedValues","previousValue","arrayContentsMatch","NumericBinding","NumericBinding__proto__","isNaN","siblings","RadioBinding","getSiblings","RadioBinding__proto__","RadioNameBinding","pathChanged","updateName","RadioNameBinding__proto__","SingleSelectBinding","SingleSelectBinding__proto__","disabled","endsWithSemi","ContainerItem","toLowerCase","attrs","attr","val","cls","leftovers","g","statics","DELEGATE_FLAG","ConditionalAttribute","Element__proto__","recreateTwowayBinding","createTwowayBinding","twoway","selectBinding","assigns","ctx","callback","listeners","delegateHandler","rem","namespace","getNamespace","existing","nodeName","toUpperCase","setAttribute","isOutro","registerTransition","childNodes","removeAttribute","ls","stringifyAttribute","safeAttributeString","inputIsCheckedRadio","getString","inlineClass","str","voidElements","stop","immediate","prevent","UIEvent","Form__proto__","handleReset","DOMEvent","fatal","DOMEvent__proto__","directive","original","CustomEvent","eventPlugin","CustomEvent__proto__","RactiveEvent","RactiveEvent__proto__","cancel","specialPattern","dollarArgsPattern","EventDirective__proto__","COMPONENT","rs","getFunction","action","refire","specialRef","specialMatch","special","substr","dollarMatch","obj","which","wrapper","wrapperValue","oldEvent","returned","preventDefault","stopPropagation","fireEvent","ReferenceExpressionProxy","LinkModel","rootLink","ReferenceExpressionProxy__proto__","members","Missing","addShuffleTask","tpl","REFERENCE","reduce","list","String","fireShuffleTasks","refreshPathDeps","eproto","isStatic","Mustache__proto__","pre","y","Object","Interpolator__proto__","safeToStringValue","string","data","Input__proto__","defaultValue","attrValue","specials","true","false","null","specialsPattern","numberPattern","placeholderPattern","placeholderAtStartPattern","onlyWhitespace","JsonParser","Parser","sp","postProcess","leftover","converters","parser","placeholder","matchPattern","number","stringLiteral","readStringLiteral","$1","matchString","pair","getKeyValuePair","valueToken","read","Context__proto__","findModel","protoAnimate","getParent","hasListener","findEvent","there","here","listen","modelPop","modelPush","raise","ev","modelReverse","build","modelShift","drop","modelSplice","modelSort","num","_link","unlisten","modelUnshift","protoUpdate","cascade","updateFromBindings","isBound","getBindingModel","getBindingPath","getBinding","setBinding","prototypeAccessors","forRactive","getRactiveContext","div","methodNames","unprefixed","prefixed","j","makeFunction","query","mathml","xlink","xml","xmlns","namespaces","customStr","ns","is","createElementNS","wrap","methodName","substring","cloneNode","Observer","old","oldContext","oldFn","dispatch","updateOld","Observer__proto__","cancelled","resolver","_observers","newValue","oldValue","isEqual","strict","addObserver","defer","star","PatternObserver","baseModel","pattern","baseKeypath","recursive","oldValues","newValues","changed","cache","findMatches","registerPatternObserver","PatternObserver__proto__","unregisterPatternObserver","wildcards","notify","touchedFrom","count","isLink","ok","check","ArrayObserver","pending","sliced","ArrayObserver__proto__","negativeOne","inserted","deleted","hadIndex","onceOptions","trim","notEmptyString","PREFIX","styleDefinitions","isDirty","styleElement","useCssText","_splitTag","adaptConfigurator","Parent","adapt","combine","ensureArray","selectorsPattern","importPattern","importEndPattern","keyframesDeclarationPattern","selectorUnitPattern","excludePattern","dataRvcGuidPattern","SharedModel","CSSModel__proto__","downstreamChanged","depth","_cssModel","applyChanges","hasCurly","cssConfigurator","Child","_cssIds","gatherIds","css","initCSS","dataConfigurator","_r_unbound","templateConfigurator","parseTemplate","TEMPLATE_VERSION","getDynamicTemplate","_config","p","extendPartials","registryNames","registriesOnDefaults","Registry","useDefaults","Registry__proto__","configure","registry","addFunctions","isOwner","registries","putInDefaults","config","order","custom","computed","defaultKeys","isStandardKey","makeObj","isBlacklisted","_super","Item__proto__","ContainerItem__proto__","space","textTypes","accept-charset","accesskey","bgcolor","class","codebase","colspan","contenteditable","datetime","dirname","for","http-equiv","ismap","maxlength","novalidate","pubdate","readonly","rowspan","tabindex","usemap","ConditionalAttribute__proto__","isSvg","parseAttributes","notIn","updateDelegate","Attribute__proto__","booleanAttributes","useProperty","isBoolean","lookupNamespace","getUpdateDelegate","flag","bubbler","BindingFlag__proto__","createComment","RactiveModel","RactiveModel__proto__","initLink","specialModels","@this","getRactiveModel","@global","GlobalModel","@shared","@style","@helpers","getHelpers","RootModel","RootModel__proto__","attached","attachImplicits","createLink","targetPath","childByKey","detachImplicits","virtual","getVirtual","SharedBase","ractiveModel","getValueChildren","unescapedKey","shouldTeardown","protoRegistries","uid","ComponentConstructor","isAnchor","content","_partials","addChild","construct","mappings","_inlinePartials","eventHandlers","Component__proto__","initialise","checking","checkAnchors","callRender","isolated","unrenderItem","ComputationChild","syncComputedChildren","prototypeAccessors$1","ComputationChild__proto__","parentValue","newWrapperValue","unwrap","boundValue","marked","signature","setter","prototypeAccessors$2","Computation__proto__","active","maybeBind","shouldBind","noVirtual","getter","hasConsole","console","groupCollapsed","sig","error","getterUseStack","stack","groupEnd","setDependencies","allowExpressions","welcome","WELCOME_MESSAGE","welcomeMessage","hasGroup","welcomeIntro","log","printWarning","badArguments","noRegistryFunctionReturn","from","delta","intermediate","Math","min","object","properties","loop","refPattern","splitPattern","escapeKeyPattern","unescapeKeyPattern","fnBind","Function","shuffleTasks","early","registerQueue","ModelBase","ModelBase__proto__","task","stage","existingMatches","objectKeys","isObjectLike","lastLink","startPath","patterns","notifiedUpstream","dataModel","checkDataLink","observer","oneway","findBoundValue","captureGroup","shufle","sourcePath","LinkModel__proto__","isDetached","force","markedAll","relinked","shuffling","lnk","implicit","ln","functions","leadingWhitespace","ParseError","lineStart","lines","lineEnds","line","lineEnd","remaining","getContextMessage","getLinePos","lineNum","columnNum","contextLines","contextUp","contextDown","numTabs","annotation","char","msg","character","shortMessage","nextChar","charAt","readTypeOf","INVERTED","CLOSING","DELIMCHANGE","CLOSING_TAG","INLINE_PARTIAL","NUMBER_LITERAL","STRING_LITERAL","ARRAY_LITERAL","OBJECT_LITERAL","BOOLEAN_LITERAL","REGEXP_LITERAL","GLOBAL","KEY_VALUE_PAIR","REFINEMENT","MEMBER","PREFIX_OPERATOR","BRACKETED","CONDITIONAL","INFIX_OPERATOR","INVOCATION","ELSE","ELSEIF","THEN","CATCH","delimiterChangePattern","whitespacePattern","regexpPattern","regExpCache","allowfullscreen","async","autofocus","autoplay","compact","controls","declare","default","defaultchecked","defaultmuted","defaultselected","enabled","formnovalidate","indeterminate","inert","itemscope","multiple","muted","nohref","noresize","noshade","nowrap","open","pauseonexit","required","reversed","scoped","seamless","sortable","translate","truespeed","typemustmatch","area","br","col","command","embed","hr","img","keygen","meta","param","track","wbr","htmlEntities","quot","amp","apos","lt","gt","nbsp","iexcl","cent","pound","curren","yen","brvbar","sect","uml","copy","ordf","laquo","not","shy","reg","macr","deg","plusmn","sup2","sup3","acute","micro","para","middot","cedil","sup1","ordm","raquo","frac14","frac12","frac34","iquest","Agrave","Aacute","Acirc","Atilde","Auml","Aring","AElig","Ccedil","Egrave","Eacute","Ecirc","Euml","Igrave","Iacute","Icirc","Iuml","ETH","Ntilde","Ograve","Oacute","Ocirc","Otilde","Ouml","times","Oslash","Ugrave","Uacute","Ucirc","Uuml","Yacute","THORN","szlig","agrave","aacute","acirc","atilde","auml","aring","aelig","ccedil","egrave","eacute","ecirc","euml","igrave","iacute","icirc","iuml","eth","ntilde","ograve","oacute","ocirc","otilde","ouml","divide","oslash","ugrave","uacute","ucirc","uuml","yacute","thorn","yuml","OElig","oelig","Scaron","scaron","Yuml","fnof","circ","tilde","Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega","alpha","beta","gamma","epsilon","zeta","eta","theta","iota","kappa","lambda","mu","nu","xi","omicron","pi","rho","sigmaf","sigma","tau","upsilon","phi","chi","psi","omega","thetasym","upsih","piv","ensp","emsp","thinsp","zwnj","zwj","lrm","rlm","ndash","mdash","lsquo","rsquo","sbquo","ldquo","rdquo","bdquo","dagger","Dagger","bull","hellip","permil","prime","Prime","lsaquo","rsaquo","oline","frasl","euro","image","weierp","real","trade","alefsym","larr","uarr","rarr","darr","harr","crarr","lArr","uArr","rArr","dArr","hArr","forall","part","exist","empty","nabla","isin","notin","ni","prod","sum","minus","lowast","radic","infin","ang","and","or","cap","cup","int","there4","sim","cong","asymp","ne","equiv","le","ge","sub","sup","nsub","sube","supe","oplus","otimes","perp","sdot","lceil","rceil","lfloor","rfloor","lang","rang","loz","spades","clubs","hearts","diams","controlCharacters","entityPattern","codePointSupport","fromCodePoint","codeToChar","fromCharCode","lessThan","greaterThan","invalid","expectedExpression","expectedParen","stringMiddlePattern","escapeSequencePattern","lineContinuationPattern","singleMatcher","makeQuotedStringMatcher","doubleMatcher","escapes","spreadPattern","legalReference","relaxedName","identifier","globals","keywords","prefixPattern","makePrefixSequenceMatcher","symbol","fallthrough","expression","readExpression","matcher","prefixOperators","readMemberOrInvocation","readLogicalOr","readTypeof","makeInfixSequenceMatcher","inUnquotedAttribute","left","right","infixOperators","readLogicalOr$1","attributeNamePattern","onPattern","eventPattern","reservedEventNames","decoratorPattern","transitionPattern","boundPattern","directives","no-delegation","unquotedAttributeValueTextPattern","proxyEvent","whitespace","slashes","delimiterChangeToken","exclude","legalAlias","asRE","else","elseif","catch","types","handlebarsBlockCodes","each","if","with","unless","indexRefPattern","keyIndexRefPattern","handlebarsBlockPattern","OPEN_COMMENT","CLOSE_COMMENT","leadingLinebreak","trailingLinebreak","contiguousWhitespace","trailingWhitespace","leadingNewLine","trailingNewLine","trailingIndent","leadingLine","closingTagPattern","tagNamePattern","anchorPattern","validTagNameFollower","semiEnd","disallowedContents","li","dt","dd","rt","rp","optgroup","thead","tbody","tfoot","tr","td","th","inlines","partialDefinitionSectionPattern","STANDARD_READERS","readPartial","readUnescaped","readSection","readInterpolator","readMustacheComment","TRIPLE_READERS","readTriple","READERS","readMustache","readHtmlComment","readElement","readText","PARTIAL_READERS","readPartialDefinitionSection","preserveWhitespaceElements","defaultInterpolate","StandardParser","tripleDelimiters","staticDelimiters","staticTripleDelimiters","standardDelimiters","delimiters","tags","isTriple","close","readers","sortMustacheTags","sectionDepth","elementStack","sanitize","elements","eventAttributes","stripComments","preserveWhitespace","sanitizeElements","sanitizeEventAttributes","includeLinePositions","textOnlyMode","csp","preserveStandaloneSections","inTag","whiteSpaceElements","parserResult","expr","flattenExpression","fromExpression","cleanup","insertExpressions","readTemplate","parseOptions","TEMPLATE_INSTRUCTIONS","COMPUTATION_INSTRUCTIONS","fromId","id","noThrow","getElementById","textContent","isParsed","getParseOptions","throwNoParse","parseFor","TransitionManager","intros","outros","totalChildren","outroChildren","detachQueue","outrosComplete","TransitionManager__proto__","checkStart","started","decrementOutros","decrementTotal","detachNodes","ready","detachImmediate","fulfilPromise","previousBatch","transitionManager","fragments","tasks","immediateObservers","deferredObservers","flushChanges","thing","postRender","_batch","tickers","running","performance","now","requestAnimationFrame","Ticker__proto__","elapsed","eased","abort","prefixers","ticker","Model__proto__","rewrap","createBranch","adaptor","getPrefixer","__model","getComputationSignature","branch","markForce","recreateArray","unsafe","SharedModel__proto__","SharedModel$1","FakeFragment","deepOpts","comparators","errorMessage","initStars","bubbleStars","Hook","method","arg","HookQueue","hook","inProcess","queue","HookQueue__proto__","begin","getChildQueue","hooks","arrayProto","ContextData","ContextData__proto__","_data","qualified","hasAttribute","Ractive$teardown","torndown","getPromise","__ractive_instances__","destruct","_marking","mdl","subscribe","subs","toPairs","single","initialiseProperties","handleAttributes","onconstruct","_attributePartial","getAdaptors","protoAdapt","lookup","srcs","_subs","_nsSubs","_eventQueue","_children","byName","all","optional","mapAll","nameOption","renderItem","contains","lastBound","updateAnchors","res","isBindableByValue","isBindableByContentEditable","isContentEditable","isBindableByName","isBindableByChecked","nameAttr","stopImmediatePropagation","currentTarget","endEl","prevented","oldStop","oldImmediate","oldPrevent","correspondingUseElement","stopImmediaitePropagation","text","splitText","createTextNode","readKey","childData","getPartialFromRegistry","fillGaps","findParentPartial","findInstance","findOwner","findConstructor","self","okToParse","parsePartial","setTemplate","initing","aliasLocal","findFirstNode","out","section","hasIndexRef","selectedOption","selectedIndex","firstChild","getComponentConstructor","asyncProxy","cmp","extract","success","undef","ctor","guid","counter","placeholderId","newModel","userOptions","getElement","append","logIfDebug","cssId","Ractive$render","others","Ractive$reset","rerender","changes","collection","Ractive$resetTemplate","external","Ractive$set","Ractive$subtract","Ractive$toggle","TypeError","gather","Ractive$toCSS","uniqueCssIds","ids","Ractive$toHTML","Ractive$transition","HTMLElement","Ractive$unrender","Ractive$updateModel","plugins","buildCSS","transform","recomputeCSS","extendOne","Class","Target","_on","_observe","sourcesLength","sources","nextSource","nextKey","hasOwnProperty","thisArg","arrayLength","window","Node","nowOffset","Date","global","implementation","hasFeature","PENDING","FULFILLED","REJECTED","dispatchHandlers","fulfilledHandlers","rejectedHandlers","state","makeResolver","newState","makeDispatcher","wait","fulfill","reject","onFulfilled","onRejected","promise2","processResolutionHandler","handlers","forward","p1result","finally","promises","processPromise","race","fail","reason","called","resolvePromise","rejectPromise","cancelAnimationFrame","lastTime","currentTime","timeToNextCall","resolveInstanceMembers","warnAboutAmbiguity","noIntro","noOutro","nestedTransitions","noCSSTransform","easeIn","pow","easeOut","easeInOut","alreadyWarned","initialFragment","parts","explicitContext","badReference","repeater","findIter","ContextModel","findMacro","shouldWarn","crossed","_fakeFragment","pairs","deep","deepSet","getComparator","sets","isDate","Ractive$add","getOptions","Ractive$animate","enqueue","dequeue","variants","eventNames","fireEventAs","initialFire","notifySubscribers","fullName","subscribers","originalEvent","stopEvent","hookQueue","childQueue","findAnchors","findAnchorsIn","anchors","idxs","unrenderChild","prepend","insertAt","rm","attachchild","Ractive$compute","comp","first","Ractive$detach","detachchild","Ractive$find","remote","Ractive$findAll","Ractive$findAllComponents","Ractive$findComponent","Ractive$findContainer","Ractive$findParent","orComponent","getNewIndices","spliceArguments","getSpliceEquivalent","balance","removeStart","removeEnd","startIndex","Ractive$update","Ractive$fire","Ractive$get","instances","staticContext","output","Ractive$insert","fireInsertHook","src","isUpstream","fresh","splitKeypathI","vals","olds","observers","silent","caller","keypaths","createObserver","isSilenced","silence","resume","wildcardIndex","double","Ractive$off","entry","Ractive$on","Ractive$once","listener","canonical","styleDefinition","styleSheet","cssText","filteredStyleDefinitions","makeStyle","getElementsByTagName","cleanCss","additionalReplaceRules","reconstruct","extractString","unit","transformSelector","selectorUnits","modifiers","transformed","appended","prepended","transformCss","dataAttr","selectors","s4","floor","random","uuid","setCSSData","local","def","evalCSS","transformCSS","__proto__","cssProp","noCssTransform","validate","emptyData","childValue","parentIsFn","childIsFn","callDataFunction","fromProperties","primary","secondary","parseAsString","existingPartials","newPartials","overwrite","superMethod","getSuperMethod","_parent","hasSuper","oldSuper","_method","getMessage","deprecated","correct","isError","deprecateOption","deprecatedOption","deprecate","extendOtherMethods","member","RactiveProto","wrapPrototype","readStyle","rule","rules","readClass","updateMultipleSelectValue","updateSelectValue","updateStringValue","updateContentEditableValue","updateRadioValue","updateValue","updateRadioName","updateCheckboxName","updateStyleAttribute","updateInlineStyle","updateClassName","updateInlineClass","updateBoolean","updateNamespacedAttribute","updateAttribute","wasSelected","wasChecked","safeValue","valueAttribute","setProperty","getPropertyValue","className","baseVal","getAttributeNS","removeAttributeNS","setAttributeNS","haystack","needle","isFinite","format","registryName","interpol","lastItem","arrays","arrayLike","one","two","oldArray","newArray","oldLength","usedIndices","firstUnusedIndex","oldLen","newLen","isKeypath","findAlias","alias","body","createFunction","exp","readDelimiterChange","opening","closing","readNumberLiteral","escapeRegExp","getLowestIndex","needles","search","entity","code","parseInt","validateCode","readBooleanLiteral","okQuote","literal","done","charCodeAt","JSON","quote","escapeChar","readTemplateStringLiteral","token","namePattern","readKeyValuePair","spread","refKey","readKeyValuePairs","keyValuePairs","readObjectLiteral","readArrayLiteral","expressionList","readExpressionList","readLiteral","readRegexpLiteral","readReference","lastDotIndex","startPos","relaxedNames","actual","inEvent","lastIndexOf","refLength","readBracketedExpression","readPrimary","readRefinement","strictRefinement","refinement","getConditional","ifTrue","ifFalse","readConditional","isSpread","expressions","readExpressionOrReference","expectedFollowers","getVars","vars","stringify","hasSpread","makeSpread","stringifyPair","extractRefs","stringified","refineExpression","mustache","referenceExpression","getReferenceExpression","splitEvent","readAttribute","nearest","readAttributeValue","valueStart","startDepth","readQuotedAttributeValue","readUnquotedAttributeValue","readUnquotedAttributeValueToken","tokens","quoteMark","readQuotedStringToken","readAttributeOrDirective","readArguments","readProxyEvent","spreadArgs","inside","readMustacheOfType","tag","reader","rewind","q","triple","readAliases","readAlias","readComment","readClosing","readInlineBlock","nm","hasElse","block","unlessBlock","closed","expectedClose","hasThen","hasCatch","inlineThen","aliasOnly","extra","w","endIndex","comment","stripStandalones","backOne","backTwo","lastSectionItem","isComment","isSection","trimWhitespace","leadingPattern","trailingPattern","removeLeadingWhitespace","removeTrailingWhitespace","previousItem","nextItem","preserveWhitespaceInsideFragment","removeLeadingWhitespaceInsideFragment","removeTrailingWhitespaceInsideFragment","hitLast","_m","isPreserveWhitespaceElement","readClosingTag","camelCaseStr","selfClosing","hasPartials","closingTag","lowerCaseName","canContain","closingTagName","readAnchorClose","readInline","classes","disallowed","barrier","isExpression","addTo","hasChildren","instructions","createFunctionFromString","bindTo","getterString","setterString","tm","allOutrosComplete","notifiedTotal","manager","collectAllOutros","trans","nqueue","_list","prefixKeypath","rootKeypath","rootDot","relativeKeypath"],"mappings":"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"}