{"version":3,"file":"polymer.js","sources":["../../polymer-gestures/src/scope.js","../../polymer-gestures/src/targetfind.js","../../polymer-gestures/src/touch-action.js","../../polymer-gestures/src/eventFactory.js","../../polymer-gestures/src/pointermap.js","../../polymer-gestures/src/dispatcher.js","../../polymer-gestures/src/installer.js","../../polymer-gestures/src/mouse.js","../../polymer-gestures/src/touch.js","../../polymer-gestures/src/ms.js","../../polymer-gestures/src/pointer.js","../../polymer-gestures/src/platform-events.js","../../polymer-gestures/src/track.js","../../polymer-gestures/src/hold.js","../../polymer-gestures/src/tap.js","../../polymer-expressions/third_party/esprima/esprima.js","../../polymer-expressions/src/polymer-expressions.js","polymer-versioned.js","../src/boot.js","../src/lib/lang.js","../src/lib/job.js","../src/lib/dom.js","../src/lib/super.js","../src/lib/deserialize.js","../src/api.js","../src/instance/utils.js","../src/instance/events.js","../src/instance/attributes.js","../src/instance/properties.js","../src/instance/mdv.js","../src/instance/base.js","../src/instance/styles.js","../src/declaration/polymer.js","../src/declaration/path.js","../src/declaration/styles.js","../src/declaration/events.js","../src/declaration/properties.js","../src/declaration/attributes.js","../src/declaration/mdv.js","../src/declaration/prototype.js","../src/declaration/queue.js","../src/declaration/import.js","../src/declaration/polymer-element.js","../src/lib/auto-binding.js"],"names":["window","PolymerGestures","hasSDPolyfill","Boolean","ShadowDOMPolyfill","wrap","wrapIfNeeded","a","scope","HAS_FULL_PATH","pathTest","document","createElement","createShadowRoot","sr","s","appendChild","addEventListener","ev","path","stopPropagation","CustomEvent","bubbles","head","dispatchEvent","parentNode","removeChild","target","shadow","inEl","shadowRoot","webkitShadowRoot","canTarget","elementFromPoint","targetingShadow","this","olderShadow","os","olderShadowRoot","se","querySelector","allShadows","element","shadows","push","searchRoot","inRoot","x","y","t","owner","nodeType","Node","DOCUMENT_NODE","DOCUMENT_FRAGMENT_NODE","findTarget","inEvent","clientX","clientY","findScrollAxis","n","i","length","_scrollType","currentTarget","host","LCA","b","contains","adepth","depth","bdepth","d","walk","u","deepContains","common","insideNode","node","rect","getBoundingClientRect","left","right","top","bottom","targetFinding","bind","shadowSelector","v","selector","rule","attrib2css","selectors","styles","hasTouchAction","style","touchAction","hasShadowRoot","forEach","r","String","map","el","textContent","MOUSE_PROPS","MOUSE_DEFAULTS","NOP_FACTORY","eventFactory","preventTap","makeBaseEvent","inType","inDict","e","createEvent","initEvent","cancelable","makeGestureEvent","Object","create","k","keys","makePointerEvent","p","buttons","pressure","pointerId","width","height","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","_source","PointerMap","USE_MAP","m","Map","pointers","POINTERS_FN","values","prototype","size","set","inId","indexOf","has","delete","splice","get","clear","callback","thisArg","call","CLONE_PROPS","CLONE_DEFAULTS","HAS_SVG_INSTANCE","SVGElementInstance","dispatcher","pointermap","eventMap","eventSources","eventSourceList","gestures","gestureQueue","registerSource","name","source","newEvents","events","registerGesture","register","es","l","unregister","down","fireEvent","move","type","fillGestureQueue","up","cancel","tapPrevented","eventHandler","_handledByPG","fn","listen","addEvent","unlisten","removeEvent","eventName","addEventListener_","boundHandler","removeEventListener_","removeEventListener","makeEvent","preventDefault","_target","cloneEvent","eventCopy","correspondingUseElement","clone","gestureTrigger","g","j","requestAnimationFrame","boundGestureTrigger","root","Installer","add","remove","changed","binder","addCallback","removeCallback","changedCallback","MO","observer","mutationWatcher","Array","toArray","slice","filter","MutationObserver","WebKitMutationObserver","SELECTOR","OBSERVER_INIT","subtree","childList","attributes","attributeOldValue","attributeFilter","watchSubtree","observe","enableOnSubtree","readyState","installOnLoad","installNewSubtree","findElements","addElement","querySelectorAll","removeElement","elementChanged","oldValue","concatLists","accum","list","concat","isElement","ELEMENT_NODE","flattenMutationTree","inNodes","tree","reduce","mutations","mutationHandler","added","addedNodes","removed","removedNodes","console","warn","DEDUP_DIST","WHICH_TO_BUTTONS","HAS_BUTTONS","MouseEvent","mouseEvents","POINTER_ID","POINTER_TYPE","lastTouches","isEventSimulatedFromTouch","lts","dx","Math","abs","dy","prepareEvent","which","mousedown","mouseup","mousemove","relatedTarget","cleanupMouse","INSTALLER","DEDUP_TIMEOUT","CLICK_COUNT_TIMEOUT","HYSTERESIS","ATTRIB","CAN_USE_GLOBAL","touchEvents","elementAdded","getAttribute","st","touchActionToScrollType","elementRemoved","undefined","oldSt","scrollTypes","EMITTER","XSCROLLER","YSCROLLER","SCROLLER","exec","firstTouch","isPrimaryTouch","inTouch","identifier","setPrimaryTouch","firstXY","X","Y","scrolling","cancelResetClickCount","removePrimaryPointer","inPointer","resetClickCount","clickCount","resetId","setTimeout","clearTimeout","typeToButtons","ret","touch","id","currentTouchEvent","fastPath","touchToPointer","cte","detail","webkitRadiusX","radiusX","webkitRadiusY","radiusY","webkitForce","force","self","processTouches","inFunction","tl","changedTouches","_cancel","cleanUpPointer","shouldScroll","scrollAxis","oa","da","doa","findTouch","inTL","vacuumTouches","touches","value","key","touchstart","dedupSynthMouse","touchmove","dd","sqrt","touchcancel","touchend","lt","HAS_BITMAP_TYPE","MSPointerEvent","MSPOINTER_TYPE_MOUSE","msEvents","POINTER_TYPES","cleanup","MSPointerDown","MSPointerMove","MSPointerUp","MSPointerCancel","pointerEvents","pointerdown","pointermove","pointerup","pointercancel","PointerEvent","navigator","msPointerEnabled","ontouchstart","track","WIGGLE_THRESHOLD","clampDir","inDelta","calcPositionDelta","inA","inB","pageX","pageY","fireTrack","inTrackingData","downEvent","lastMoveEvent","xDirection","yDirection","ddx","ddy","screenX","screenY","trackInfo","downTarget","tracking","hold","HOLD_DELAY","heldPointer","holdJob","pulse","Date","now","timeStamp","held","fireHold","clearInterval","setInterval","inHoldTime","holdTime","tap","shouldTap","downState","start","altKey","ctrlKey","metaKey","shiftKey","global","assert","condition","message","Error","isDecimalDigit","ch","isWhiteSpace","fromCharCode","isLineTerminator","isIdentifierStart","isIdentifierPart","isKeyword","skipWhitespace","index","charCodeAt","getIdentifier","scanIdentifier","Token","Identifier","Keyword","NullLiteral","BooleanLiteral","range","scanPunctuator","code2","ch2","code","ch1","Punctuator","throwError","Messages","UnexpectedToken","scanNumericLiteral","number","NumericLiteral","parseFloat","scanStringLiteral","quote","str","octal","StringLiteral","isIdentifierName","token","advance","EOF","lex","lookahead","peek","pos","messageFormat","error","args","arguments","msg","replace","whole","description","throwUnexpected","expect","match","matchKeyword","keyword","parseArrayInitialiser","elements","parseExpression","delegate","createArrayExpression","parseObjectPropertyKey","createLiteral","createIdentifier","parseObjectProperty","createProperty","parseObjectInitialiser","properties","createObjectExpression","parseGroupExpression","expr","parsePrimaryExpression","createThisExpression","parseArguments","parseNonComputedProperty","parseNonComputedMember","parseComputedMember","parseLeftHandSideExpression","property","createMemberExpression","createCallExpression","parseUnaryExpression","parsePostfixExpression","createUnaryExpression","binaryPrecedence","prec","parseBinaryExpression","stack","operator","pop","createBinaryExpression","parseConditionalExpression","consequent","alternate","createConditionalExpression","parseFilter","createFilter","parseFilters","parseTopLevel","Syntax","parseInExpression","parseAsExpression","createTopLevel","createAsExpression","indexName","createInExpression","parse","inDelegate","state","labelSet","TokenName","ArrayExpression","BinaryExpression","CallExpression","ConditionalExpression","EmptyStatement","ExpressionStatement","Literal","LabeledStatement","LogicalExpression","MemberExpression","ObjectExpression","Program","Property","ThisExpression","UnaryExpression","UnknownLabel","Redeclaration","esprima","prepareBinding","expressionText","filterRegistry","expression","getExpression","scopeIdent","tagName","ex","model","oneTime","binding","getBinding","polymerExpressionScopeIdent_","indexIdent","polymerExpressionIndexIdent_","expressionParseCache","ASTDelegate","Expression","valueFn_","IdentPath","Path","object","accessor","computed","dynamicDeps","simplePath","getFn","Filter","notImplemented","arg","valueFn","filters","deps","currentPath","ConstantObservable","value_","convertStylePropertyName","c","toLowerCase","findScope","prop","parentScopeName","hasOwnProperty","isLiteralExpression","pathString","isNaN","Number","PolymerExpressions","addPath","getValueFrom","setValue","newValue","setValueFrom",{"end":{"file":"../../polymer-expressions/src/polymer-expressions.js","comments_before":[],"nlb":false,"endpos":3539,"pos":3531,"col":8,"line":117,"value":"fullPath","type":"name"},"start":{"file":"../../polymer-expressions/src/polymer-expressions.js","comments_before":[],"nlb":false,"endpos":3539,"pos":3531,"col":8,"line":117,"value":"fullPath","type":"name"},"name":"fullPath"},"fullPath","fullPath_","parts","context","propName","transform","toModelDirection","initialArgs","toModel","toDOM","apply","unaryOperators","+","-","!","binaryOperators","*","/","%","<",">","<=",">=","==","!=","===","!==","&&","||","op","argument","test","ident","arr","kind","obj","open","discardChanges","deliver","close","firstTime","firstValue","startReset","getValue","finishReset","setValueFn","CompoundObserver","ObserverTransform","count","random","toString","styleObject","join","tokenList","tokens","prepareInstancePositionChanged","template","templateInstance","valid","PathObserver","prepareInstanceModel","scopeName","parentScope","createScopeObject","__proto__","defineProperty","configurable","writable","Polymer","version","extend","api","getOwnPropertyNames","pd","getOwnPropertyDescriptor","nom","job","wait","stop","Job","go","inContext","boundComplete","complete","h","handle","cancelAnimationFrame","registry","HTMLElement","tag","getPrototypeForTag","getPrototypeOf","originalStopPropagation","Event","cancelBubble","$super","arrayOfArgs","caller","_super","nameInThis","memoizeSuper","n$","method","proto","nextSuper","super","deserializeValue","currentValue","inferredType","typeHandlers","string","date","boolean","parseInt","JSON","function","declaration","instance","publish","apis","utils","async","timeout","Platform","flush","cancelAsync","fire","onNode","event","asyncFire","classFollows","anew","old","className","classList","injectBoundHTML","html","innerHTML","fragment","instanceTemplate","nop","nob","asyncMethod","log","logFlags","EVENT_PREFIX","addHostListeners","eventDelegates","localName","methodName","getEventHandler","dispatchMethod","group","groupEnd","copyInstanceAttributes","a$","_instanceAttributes","hasAttribute","setAttribute","takeAttributes","_publishLC","attributeToProperty","propertyForAttribute","search","bindPattern","stringValue","serializeValue","reflectPropertyToAttribute","serializedValue","removeAttribute","areSameValue","numberIsNaN","resolveBindingValue","updateRecord","createPropertyObserver","_observeNames","o","_propertyObserver","registerObserver","observeArrayValue","openPropertyObserver","notifyPropertyChanges","newValues","oldValues","paths","called","ov","nv","invokeMethod","deliverChanges","propertyChanged_","reflect","callbackName","isArray","closeNamedObserver","ArrayObserver","registerNamedObserver","emitPropertyChangeRecord","Observer","hasObjectObserve","notifier","notifier_","getNotifier","notify","bindToAccessor","observable","resolveFn","privateName","privateObservable","resolvedValue","createComputedProperties","_computedNames","syntax","bindProperty","_observers","closeObservers","observers","o$","_namedObservers","closeNamedObservers","mdv","bindingDelegate","dom","createInstance","bindings_","enableBindingsReflection","path_","_recordBinding","mixinSuper","bindFinished","makeElementReady","asyncUnbindAll","_unbound","unbind","_unbindAllJob","unbindAll","cancelUnbindAll","mustachePattern","isBase","PolymerBase","base","created","ready","createdCallback","prepareElement","ownerDocument","isStagingDocument","_elementPrepared","shadowRoots","_readied","parseDeclarations","attachedCallback","attached","enteredView","hasBeenAttached","domReady","detachedCallback","preventDispose","detached","leftView","enteredViewCallback","leftViewCallback","enteredDocumentCallback","leftDocumentCallback","parseDeclaration","elementElement","fetchTemplate","shadowFromTemplate","shadowRootReady","lightFromTemplate","refNode","eventController","insertBefore","marshalNodeReferences","$","attributeChangedCallback","attributeChanged","onMutation","listener","disconnect","constructor","Base","shimCssText","cssText","is","ShadowCSS","makeScopeSelector","STYLE_SCOPE_ATTRIBUTE","STYLE_CONTROLLER_SCOPE","installControllerStyles","findStyleScope","scopeHasNamedStyle","cssTextForScope","installScopeCssText","installScopeStyle","cssTextToScopeStyle","applyStyleToScope","_scopeStyles","script","_currentScript","getRegisteredPrototype","registerPrototype","notifyPrototype","waitingForPrototype","client","waitPrototype","registerWhenReady","prototypesByName","declarations","deliverDeclarations","resolveElementPaths","urlResolver","resolveDom","addResolvePathApi","assetPath","URL","baseURI","resolvePath","urlPath","href","importRuleForSheet","sheet","baseUrl","createStyleElement","attr","firstElementChild","s$","nextElementSibling","cssTextFromSheet","__resource","matchesSelector","inSelector","matches","STYLE_SELECTOR","STYLE_LOADABLE_MATCH","SHEET_SELECTOR","STYLE_GLOBAL_SCOPE","SCOPE_ATTR","loadStyles","content","templateContent","convertSheetsToStyles","findLoadableStyles","templateUrl","styleResolver","copySheetAttributes","replaceChild","link","loadables","installSheets","cacheSheets","cacheStyles","installLocalSheets","installGlobalStyles","sheets","findNodes","firstChild","matcher","nodes","array","templateNodes","styleForScope","scopeDescriptor","webkitMatchesSelector","mozMatchesSelector","mixedCaseEventTypes","parseHostEvents","delegates","addAttributeDelegates","hasEventPrefix","removeEventPrefix","trim","prefixLength","findController","controller","prepareEventBinding","eventType","bindingValue","handler","inferObservers","explodeObservers","exploded","ni","names","split","optimizePropertyMaps","_publishNames","publishProperties","requireProperties","lowerCaseMap","propertyDescriptors","propertyDescriptor","reflects","reflectHintForDescriptor","valueForDescriptor","createPropertyAccessor","createPropertyAccessors","ATTRIBUTES_ATTRIBUTE","ATTRIBUTES_REGEX","inheritAttributesObjects","inheritObject","publishAttributes","hasValue","accumulateInstanceAttributes","clonable","isInstanceAttribute","blackList","extends","noscript","assetpath","cache-csstext","installBindingDelegate","ensurePrototypeTraversal","ancestor","extendeeName","buildPrototype","publishConstructor","extension","generateBasePrototype","desugarBeforeChaining","chainPrototypes","desugarAfterChaining","inheritMetaData","chained","chainObject","extendee","shimStyling","registerCallback","symbol","ctor","extnds","findBasePrototype","ensureBaseApi","memoizedBases","extended","mixinMethod","info","typeExtension","findTypeExtension","registerElement","inherited","queueForElement","mainQueue","importQueue","nextQueued","whenPolymerReady","queue","waitToReady","CustomElements","HTMLImports","whenImportsReady","addReadyCallback","check","shouldAdd","flushQueue","__check","__go","useNative","readied","addToFlushQueue","shift","nextElement","canReady","isEmpty","upgradeDocumentTree","flushReadyCallbacks","readyCallbacks","importElements","elementOrFragment","importUrls","urls","url","frag","createDocumentFragment","rel","import","isRegistered","isCustomTag","init","loadResources","registered","waitingForQueue","waitingForResources","_register","handleNoScript","_needsResources","body","makeSyntax"],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.PolymerGestures = {\n  hasSDPolyfill: Boolean(window.ShadowDOMPolyfill)\n};\nPolymerGestures.wrap = PolymerGestures.hasSDPolyfill ? ShadowDOMPolyfill.wrapIfNeeded : function(a){ return a; };\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var HAS_FULL_PATH = false;\n\n  // test for full event path support\n  var pathTest = document.createElement('meta');\n  if (!scope.hasSDPolyfill && pathTest.createShadowRoot) {\n    var sr = pathTest.createShadowRoot();\n    var s = document.createElement('span');\n    sr.appendChild(s);\n    pathTest.addEventListener('testpath', function(ev) {\n      if (ev.path) {\n        // if the span is in the event path, then path[0] is the real source for all events\n        HAS_FULL_PATH = ev.path[0] === s;\n      }\n      ev.stopPropagation();\n    });\n    var ev = new CustomEvent('testpath', {bubbles: true});\n    // must add node to DOM to trigger event listener\n    document.head.appendChild(pathTest);\n    s.dispatchEvent(ev);\n    pathTest.parentNode.removeChild(pathTest);\n    sr = s = null;\n  }\n  pathTest = null;\n\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      var t, st, sr, os;\n      if (inRoot) {\n        t = inRoot.elementFromPoint(x, y);\n        if (t) {\n          // found element, check if it has a ShadowRoot\n          sr = this.targetingShadow(t);\n        } else if (inRoot !== document) {\n          // check for sibling roots\n          sr = this.olderShadow(inRoot);\n        }\n        // search other roots, fall back to light dom element\n        return this.searchRoot(sr, x, y) || t;\n      }\n    },\n    owner: function(element) {\n      if (!element) {\n        return document;\n      }\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      if (HAS_FULL_PATH && inEvent.path) {\n        return inEvent.path[0];\n      }\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    },\n    findScrollAxis: function(inEvent) {\n      var n;\n      if (HAS_FULL_PATH && inEvent.path) {\n        var path = inEvent.path;\n        for (var i = 0; i < path.length; i++) {\n          n = path[i];\n          if (n._scrollType) {\n            return n._scrollType;\n          }\n        }\n      } else {\n        n = scope.wrap(inEvent.currentTarget);\n        while(n) {\n          if (n._scrollType) {\n            return n._scrollType;\n          }\n          n = n.parentNode || n.host;\n        }\n      }\n    },\n    LCA: function(a, b) {\n      if (a === b) {\n        return a;\n      }\n      if (a && !b) {\n        return a;\n      }\n      if (b && !a) {\n        return b;\n      }\n      if (!b && !a) {\n        return document;\n      }\n      // fast case, a is a direct descendant of b or vice versa\n      if (a.contains && a.contains(b)) {\n        return a;\n      }\n      if (b.contains && b.contains(a)) {\n        return b;\n      }\n      var adepth = this.depth(a);\n      var bdepth = this.depth(b);\n      var d = adepth - bdepth;\n      if (d >= 0) {\n        a = this.walk(a, d);\n      } else {\n        b = this.walk(b, -d);\n      }\n      while (a && b && a !== b) {\n        a = a.parentNode || a.host;\n        b = b.parentNode || b.host;\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n","/*\n *\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n  function shadowSelector(v) {\n    return 'body /deep/ ' + selector(v);\n  }\n  function selector(v) {\n    return '[touch-action=\"' + v + '\"]';\n  }\n  function rule(v) {\n    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}';\n  }\n  var attrib2css = [\n    'none',\n    'auto',\n    'pan-x',\n    'pan-y',\n    {\n      rule: 'pan-x pan-y',\n      selectors: [\n        'pan-x pan-y',\n        'pan-y pan-x'\n      ]\n    },\n    'manipulation'\n  ];\n  var styles = '';\n  // only install stylesheet if the browser has touch action support\n  var head = document.head;\n  var hasTouchAction = typeof document.head.style.touchAction === 'string';\n  // only add shadow selectors if shadowdom is supported\n  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;\n\n  if (hasTouchAction) {\n    attrib2css.forEach(function(r) {\n      if (String(r) === r) {\n        styles += selector(r) + rule(r) + '\\n';\n        if (hasShadowRoot) {\n          styles += shadowSelector(r) + rule(r) + '\\n';\n        }\n      } else {\n        styles += r.selectors.map(selector) + rule(r.rule) + '\\n';\n        if (hasShadowRoot) {\n          styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\\n';\n        }\n      }\n    });\n\n    var el = document.createElement('style');\n    el.textContent = styles;\n    document.head.appendChild(el);\n  }\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This is the constructor for new PointerEvents.\n *\n * New Pointer Events must be given a type, and an optional dictionary of\n * initialization properties.\n *\n * Due to certain platform requirements, events returned from the constructor\n * identify as MouseEvents.\n *\n * @constructor\n * @param {String} inType The type of the event to create.\n * @param {Object} [inDict] An optional dictionary of initial event properties.\n * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.\n */\n(function(scope) {\n\n  var MOUSE_PROPS = [\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    'pageX',\n    'pageY'\n  ];\n\n  var MOUSE_DEFAULTS = [\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    0,\n    0\n  ];\n\n  var NOP_FACTORY = function(){ return function(){}; };\n\n  var eventFactory = {\n    // TODO(dfreedm): this is overridden by tap recognizer, needs review\n    preventTap: NOP_FACTORY,\n    makeBaseEvent: function(inType, inDict) {\n      var e = document.createEvent('Event');\n      e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);\n      e.preventTap = eventFactory.preventTap(e);\n      return e;\n    },\n    makeGestureEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      for (var i = 0, keys = Object.keys(inDict), k; i < keys.length; i++) {\n        k = keys[i];\n        e[k] = inDict[k];\n      }\n      return e;\n    },\n    makePointerEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      // define inherited MouseEvent properties\n      for(var i = 0, p; i < MOUSE_PROPS.length; i++) {\n        p = MOUSE_PROPS[i];\n        e[p] = inDict[p] || MOUSE_DEFAULTS[i];\n      }\n      e.buttons = inDict.buttons || 0;\n\n      // Spec requires that pointers without pressure specified use 0.5 for down\n      // state and 0 for up state.\n      var pressure = 0;\n      if (inDict.pressure) {\n        pressure = inDict.pressure;\n      } else {\n        pressure = e.buttons ? 0.5 : 0;\n      }\n\n      // add x/y properties aliased to clientX/Y\n      e.x = e.clientX;\n      e.y = e.clientY;\n\n      // define the properties of the PointerEvent interface\n      e.pointerId = inDict.pointerId || 0;\n      e.width = inDict.width || 0;\n      e.height = inDict.height || 0;\n      e.pressure = pressure;\n      e.tiltX = inDict.tiltX || 0;\n      e.tiltY = inDict.tiltY || 0;\n      e.pointerType = inDict.pointerType || '';\n      e.hwTimestamp = inDict.hwTimestamp || 0;\n      e.isPrimary = inDict.isPrimary || false;\n      e._source = inDict._source || '';\n      return e;\n    }\n  };\n\n  scope.eventFactory = eventFactory;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module implements an map of pointer states\n */\n(function(scope) {\n  var USE_MAP = window.Map && window.Map.prototype.forEach;\n  var POINTERS_FN = function(){ return this.size; };\n  function PointerMap() {\n    if (USE_MAP) {\n      var m = new Map();\n      m.pointers = POINTERS_FN;\n      return m;\n    } else {\n      this.keys = [];\n      this.values = [];\n    }\n  }\n\n  PointerMap.prototype = {\n    set: function(inId, inEvent) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.values[i] = inEvent;\n      } else {\n        this.keys.push(inId);\n        this.values.push(inEvent);\n      }\n    },\n    has: function(inId) {\n      return this.keys.indexOf(inId) > -1;\n    },\n    'delete': function(inId) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.keys.splice(i, 1);\n        this.values.splice(i, 1);\n      }\n    },\n    get: function(inId) {\n      var i = this.keys.indexOf(inId);\n      return this.values[i];\n    },\n    clear: function() {\n      this.keys.length = 0;\n      this.values.length = 0;\n    },\n    // return value, key, map\n    forEach: function(callback, thisArg) {\n      this.values.forEach(function(v, i) {\n        callback.call(thisArg, v, this.keys[i], this);\n      }, this);\n    },\n    pointers: function() {\n      return this.keys.length;\n    }\n  };\n\n  scope.PointerMap = PointerMap;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which',\n    'pageX',\n    'pageY',\n    'timeStamp',\n    // gesture addons\n    'preventTap',\n    'tapPrevented',\n    '_source'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    function(){},\n    false\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  var eventFactory = scope.eventFactory;\n\n  var hasSDPolyfill = scope.hasSDPolyfill;\n  var wrap = scope.wrap;\n\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    pointermap: new scope.PointerMap(),\n    eventMap: Object.create(null),\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: Object.create(null),\n    eventSourceList: [],\n    gestures: [],\n    gestureQueue: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    registerGesture: function(name, source) {\n      this.gestures.push(source);\n    },\n    register: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    // EVENTS\n    down: function(inEvent) {\n      this.fireEvent('down', inEvent);\n    },\n    move: function(inEvent) {\n      // pipe move events into gesture queue directly\n      inEvent.type = 'move';\n      this.fillGestureQueue(inEvent);\n    },\n    up: function(inEvent) {\n      this.fireEvent('up', inEvent);\n    },\n    cancel: function(inEvent) {\n      inEvent.tapPrevented = true;\n      this.fireEvent('up', inEvent);\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of events from\n      // platform events. This can happen when two elements in different scopes\n      // are set up to create pointer events, which is relevant to Shadow DOM.\n      if (inEvent._handledByPG) {\n        return;\n      }\n      var type = inEvent.type;\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      inEvent._handledByPG = true;\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.addEvent(target, e);\n      }\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.removeEvent(target, e);\n      }\n    },\n    addEvent: function(target, eventName) {\n      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (hasSDPolyfill) {\n        target.addEventListener_(eventName, this.boundHandler);\n      } else {\n        target.addEventListener(eventName, this.boundHandler);\n      }\n    },\n    removeEvent: function(target, eventName) {\n      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (hasSDPolyfill) {\n        target.removeEventListener_(eventName, this.boundHandler);\n      } else {\n        target.removeEventListener(eventName, this.boundHandler);\n      }\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      var e = eventFactory.makePointerEvent(inType, inEvent);\n      e.preventDefault = inEvent.preventDefault;\n      e.tapPrevented = inEvent.tapPrevented;\n      e._target = e._target || inEvent.target;\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = Object.create(null), p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (p === 'target' || p === 'relatedTarget') {\n          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n          eventCopy[p] = wrap(eventCopy[p]);\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = inEvent.preventDefault;\n      return eventCopy;\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: function(inEvent) {\n      var t = inEvent._target;\n      if (t) {\n        t.dispatchEvent(inEvent);\n        // clone the event for the gesture system to process\n        // clone after dispatch to pick up gesture prevention code\n        var clone = this.cloneEvent(inEvent);\n        clone.target = t;\n        this.fillGestureQueue(clone);\n      }\n    },\n    gestureTrigger: function() {\n      // process the gesture queue\n      for (var i = 0, e; i < this.gestureQueue.length; i++) {\n        e = this.gestureQueue[i];\n        for (var j = 0, g, fn; j < this.gestures.length; j++) {\n          g = this.gestures[j];\n          fn = g[e.type];\n          if (fn) {\n            fn.call(g, e);\n          }\n        }\n      }\n      this.gestureQueue.length = 0;\n    },\n    fillGestureQueue: function(ev) {\n      // only trigger the gesture queue once\n      if (!this.gestureQueue.length) {\n        requestAnimationFrame(this.boundGestureTrigger);\n      }\n      this.gestureQueue.push(ev);\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n  scope.register = function(root) {\n    dispatcher.register(root);\n  };\n  scope.unregister = dispatcher.unregister.bind(dispatcher);\n  scope.wrap = wrap;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module uses Mutation Observers to dynamically adjust which nodes will\n * generate Pointer Events.\n *\n * All nodes that wish to generate Pointer Events must have the attribute\n * `touch-action` set to `none`.\n */\n(function(scope) {\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n  var map = Array.prototype.map.call.bind(Array.prototype.map);\n  var toArray = Array.prototype.slice.call.bind(Array.prototype.slice);\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n  var MO = window.MutationObserver || window.WebKitMutationObserver;\n  var SELECTOR = '[touch-action]';\n  var OBSERVER_INIT = {\n    subtree: true,\n    childList: true,\n    attributes: true,\n    attributeOldValue: true,\n    attributeFilter: ['touch-action']\n  };\n\n  function Installer(add, remove, changed, binder) {\n    this.addCallback = add.bind(binder);\n    this.removeCallback = remove.bind(binder);\n    this.changedCallback = changed.bind(binder);\n    if (MO) {\n      this.observer = new MO(this.mutationWatcher.bind(this));\n    }\n  }\n\n  Installer.prototype = {\n    watchSubtree: function(target) {\n      // Only watch scopes that can target find, as these are top-level.\n      // Otherwise we can see duplicate additions and removals that add noise.\n      //\n      // TODO(dfreedman): For some instances with ShadowDOMPolyfill, we can see\n      // a removal without an insertion when a node is redistributed among\n      // shadows. Since it all ends up correct in the document, watching only\n      // the document will yield the correct mutations to watch.\n      if (scope.targetFinding.canTarget(target)) {\n        this.observer.observe(target, OBSERVER_INIT);\n      }\n    },\n    enableOnSubtree: function(target) {\n      this.watchSubtree(target);\n      if (target === document && document.readyState !== 'complete') {\n        this.installOnLoad();\n      } else {\n        this.installNewSubtree(target);\n      }\n    },\n    installNewSubtree: function(target) {\n      forEach(this.findElements(target), this.addElement, this);\n    },\n    findElements: function(target) {\n      if (target.querySelectorAll) {\n        return target.querySelectorAll(SELECTOR);\n      }\n      return [];\n    },\n    removeElement: function(el) {\n      this.removeCallback(el);\n    },\n    addElement: function(el) {\n      this.addCallback(el);\n    },\n    elementChanged: function(el, oldValue) {\n      this.changedCallback(el, oldValue);\n    },\n    concatLists: function(accum, list) {\n      return accum.concat(toArray(list));\n    },\n    // register all touch-action = none nodes on document load\n    installOnLoad: function() {\n      document.addEventListener('readystatechange', function() {\n        if (document.readyState === 'complete') {\n          this.installNewSubtree(document);\n        }\n      }.bind(this));\n    },\n    isElement: function(n) {\n      return n.nodeType === Node.ELEMENT_NODE;\n    },\n    flattenMutationTree: function(inNodes) {\n      // find children with touch-action\n      var tree = map(inNodes, this.findElements, this);\n      // make sure the added nodes are accounted for\n      tree.push(filter(inNodes, this.isElement));\n      // flatten the list\n      return tree.reduce(this.concatLists, []);\n    },\n    mutationWatcher: function(mutations) {\n      mutations.forEach(this.mutationHandler, this);\n    },\n    mutationHandler: function(m) {\n      if (m.type === 'childList') {\n        var added = this.flattenMutationTree(m.addedNodes);\n        added.forEach(this.addElement, this);\n        var removed = this.flattenMutationTree(m.removedNodes);\n        removed.forEach(this.removeElement, this);\n      } else if (m.type === 'attributes') {\n        this.elementChanged(m.target, m.oldValue);\n      }\n    }\n  };\n\n  if (!MO) {\n    Installer.prototype.watchSubtree = function(){\n      console.warn('PolymerGestures: MutationObservers not found, touch-action will not be dynamically detected');\n    };\n  }\n\n  scope.Installer = Installer;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function (scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  // radius around touchend that swallows mouse events\n  var DEDUP_DIST = 25;\n\n  var WHICH_TO_BUTTONS = [0, 1, 4, 2];\n\n  var HAS_BUTTONS = false;\n  try {\n    HAS_BUTTONS = new MouseEvent('test', {buttons: 1}).buttons === 1;\n  } catch (e) {}\n\n  // handler block for native mouse events\n  var mouseEvents = {\n    POINTER_ID: 1,\n    POINTER_TYPE: 'mouse',\n    events: [\n      'mousedown',\n      'mousemove',\n      'mouseup'\n    ],\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'mouse';\n      if (!HAS_BUTTONS) {\n        e.buttons = WHICH_TO_BUTTONS[e.which] || 0;\n      }\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\n        // TODO(dfreedman) workaround for some elements not sending mouseup\n        // http://crbug/149091\n        if (p) {\n          this.mouseup(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        e.target = scope.wrap(scope.findTarget(inEvent));\n        pointermap.set(this.POINTER_ID, e.target);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.move(e);\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.up(e);\n        this.cleanupMouse();\n      }\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);\n  var pointermap = dispatcher.pointermap;\n  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);\n  // This should be long enough to ignore compat mouse events made by touch\n  var DEDUP_TIMEOUT = 2500;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var HYSTERESIS = 20;\n  var ATTRIB = 'touch-action';\n  var INSTALLER;\n  // maybe one day...\n  // var CAN_USE_GLOBAL = ATTRIB in document.head.style;\n  var CAN_USE_GLOBAL = false;\n\n  // handler block for native touch events\n  var touchEvents = {\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    register: function(target) {\n      if (CAN_USE_GLOBAL) {\n        dispatcher.listen(target, this.events);\n      } else {\n        INSTALLER.enableOnSubtree(target);\n      }\n    },\n    unregister: function(target) {\n      if (CAN_USE_GLOBAL) {\n        dispatcher.unlisten(target, this.events);\n      } else {\n        // TODO(dfreedman): is it worth it to disconnect the MO?\n      }\n    },\n    elementAdded: function(el) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      if (st) {\n        el._scrollType = st;\n        dispatcher.listen(el, this.events);\n        // set touch-action on shadows as well\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n          dispatcher.listen(s, this.events);\n        }, this);\n      }\n    },\n    elementRemoved: function(el) {\n      el._scrollType = undefined;\n      dispatcher.unlisten(el, this.events);\n      // remove touch-action from shadow\n      allShadows(el).forEach(function(s) {\n        s._scrollType = undefined;\n        dispatcher.unlisten(s, this.events);\n      }, this);\n    },\n    elementChanged: function(el, oldValue) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      var oldSt = this.touchActionToScrollType(oldValue);\n      // simply update scrollType if listeners are already established\n      if (st && oldSt) {\n        el._scrollType = st;\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n        }, this);\n      } else if (oldSt) {\n        this.elementRemoved(el);\n      } else if (st) {\n        this.elementAdded(el);\n      }\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto|manipulation$/\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === 'none') {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else if (st.SCROLLER.exec(t)) {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.scrolling = null;\n        this.cancelResetClickCount();\n      }\n    },\n    removePrimaryPointer: function(inPointer) {\n      if (inPointer.isPrimary) {\n        this.firstTouch = null;\n        this.firstXY = null;\n        this.resetClickCount();\n      }\n    },\n    clickCount: 0,\n    resetId: null,\n    resetClickCount: function() {\n      var fn = function() {\n        this.clickCount = 0;\n        this.resetId = null;\n      }.bind(this);\n      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);\n    },\n    cancelResetClickCount: function() {\n      if (this.resetId) {\n        clearTimeout(this.resetId);\n      }\n    },\n    typeToButtons: function(type) {\n      var ret = 0;\n      if (type === 'touchstart' || type === 'touchmove') {\n        ret = 1;\n      }\n      return ret;\n    },\n    findTarget: function(touch, id) {\n      if (this.currentTouchEvent.type === 'touchstart') {\n        if (this.isPrimaryTouch(touch)) {\n          var fastPath = {\n            clientX: touch.clientX,\n            clientY: touch.clientY,\n            path: this.currentTouchEvent.path,\n            target: scope.wrap(this.currentTouchEvent.target)\n          };\n          return scope.findTarget(fastPath);\n        } else {\n          return scope.findTarget(touch);\n        }\n      }\n      // reuse target we found in touchstart\n      return pointermap.get(id);\n    },\n    touchToPointer: function(inTouch) {\n      var cte = this.currentTouchEvent;\n      var e = dispatcher.cloneEvent(inTouch);\n      // Spec specifies that pointerId 1 is reserved for Mouse.\n      // Touch identifiers can start at 0.\n      // Add 2 to the touch identifier for compatibility.\n      var id = e.pointerId = inTouch.identifier + 2;\n      e.target = scope.wrap(this.findTarget(inTouch, id));\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.buttons = this.typeToButtons(cte.type);\n      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;\n      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;\n      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;\n      e.isPrimary = this.isPrimaryTouch(inTouch);\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'touch';\n      // forward touch preventDefaults\n      var self = this;\n      e.preventDefault = function() {\n        self.scrolling = false;\n        self.firstXY = null;\n        cte.preventDefault();\n      };\n      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      this.currentTouchEvent = inEvent;\n      for (var i = 0, t, p; i < tl.length; i++) {\n        t = tl[i];\n        p = this.touchToPointer(t);\n        if (inEvent.type === 'touchstart') {\n          pointermap.set(p.pointerId, p.target);\n        }\n        if (pointermap.has(p.pointerId)) {\n          inFunction.call(this, p);\n        }\n        if (inEvent.type === 'touchend' || inEvent._cancel) {\n          this.cleanUpPointer(p);\n        }\n      }\n    },\n    // For single axis scrollers, determines whether the element should emit\n    // pointer events or behave as a scroller\n    shouldScroll: function(inEvent) {\n      if (this.firstXY) {\n        var ret;\n        var scrollAxis = scope.targetFinding.findScrollAxis(inEvent);\n        if (scrollAxis === 'none') {\n          // this element is a touch-action: none, should never scroll\n          ret = false;\n        } else if (scrollAxis === 'XY') {\n          // this element should always scroll\n          ret = true;\n        } else {\n          var t = inEvent.changedTouches[0];\n          // check the intended scroll axis, and other axis\n          var a = scrollAxis;\n          var oa = scrollAxis === 'Y' ? 'X' : 'Y';\n          var da = Math.abs(t['client' + a] - this.firstXY[a]);\n          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);\n          // if delta in the scroll axis > delta other axis, scroll instead of\n          // making events\n          ret = da >= doa;\n        }\n        return ret;\n      }\n    },\n    findTouch: function(inTL, inId) {\n      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {\n        if (t.identifier === inId) {\n          return true;\n        }\n      }\n    },\n    // In some instances, a touchstart can happen without a touchend. This\n    // leaves the pointermap in a broken state.\n    // Therefore, on every touchstart, we remove the touches that did not fire a\n    // touchend event.\n    // To keep state globally consistent, we fire a\n    // pointercancel for this \"abandoned\" touch\n    vacuumTouches: function(inEvent) {\n      var tl = inEvent.touches;\n      // pointermap.pointers() should be < tl.length here, as the touchstart has not\n      // been processed yet.\n      if (pointermap.pointers() >= tl.length) {\n        var d = [];\n        pointermap.forEach(function(value, key) {\n          // Never remove pointerId == 1, which is mouse.\n          // Touch identifiers are 2 smaller than their pointerId, which is the\n          // index in pointermap.\n          if (key !== 1 && !this.findTouch(tl, key - 2)) {\n            var p = value;\n            d.push(p);\n          }\n        }, this);\n        d.forEach(function(p) {\n          this.cancel(p);\n          pointermap.delete(p.pointerId);\n        });\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.down);\n      }\n    },\n    down: function(inPointer) {\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (CAN_USE_GLOBAL) {\n        this.processTouches(inEvent, this.move);\n      } else {\n        if (!this.scrolling) {\n          if (this.scrolling === null && this.shouldScroll(inEvent)) {\n            this.scrolling = true;\n          } else {\n            this.scrolling = false;\n            inEvent.preventDefault();\n            this.processTouches(inEvent, this.move);\n          }\n        } else if (this.firstXY) {\n          var t = inEvent.changedTouches[0];\n          var dx = t.clientX - this.firstXY.X;\n          var dy = t.clientY - this.firstXY.Y;\n          var dd = Math.sqrt(dx * dx + dy * dy);\n          if (dd >= HYSTERESIS) {\n            this.touchcancel(inEvent);\n            this.scrolling = true;\n            this.firstXY = null;\n          }\n        }\n      }\n    },\n    move: function(inPointer) {\n      dispatcher.move(inPointer);\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.up);\n    },\n    up: function(inPointer) {\n      inPointer.relatedTarget = scope.wrap(scope.findTarget(inPointer));\n      dispatcher.up(inPointer);\n    },\n    cancel: function(inPointer) {\n      dispatcher.cancel(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      inEvent._cancel = true;\n      this.processTouches(inEvent, this.cancel);\n    },\n    cleanUpPointer: function(inPointer) {\n      pointermap['delete'](inPointer.pointerId);\n      this.removePrimaryPointer(inPointer);\n    },\n    // prevent synth mouse events from creating pointer events\n    dedupSynthMouse: function(inEvent) {\n      var lts = scope.mouseEvents.lastTouches;\n      var t = inEvent.changedTouches[0];\n      // only the primary finger will synth mouse events\n      if (this.isPrimaryTouch(t)) {\n        // remember x/y of last touch\n        var lt = {x: t.clientX, y: t.clientY};\n        lts.push(lt);\n        var fn = (function(lts, lt){\n          var i = lts.indexOf(lt);\n          if (i > -1) {\n            lts.splice(i, 1);\n          }\n        }).bind(null, lts, lt);\n        setTimeout(fn, DEDUP_TIMEOUT);\n      }\n    }\n  };\n\n  if (!CAN_USE_GLOBAL) {\n    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);\n  }\n\n  scope.touchEvents = touchEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerCancel',\n    ],\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      e = dispatcher.cloneEvent(inEvent);\n      if (HAS_BITMAP_TYPE) {\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      e._source = 'ms';\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.wrap(scope.findTarget(inEvent));\n      pointermap.set(inEvent.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var pointerEvents = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e._source = 'pointer';\n      return e;\n    },\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    pointerdown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.wrap(scope.findTarget(inEvent));\n      pointermap.set(e.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    pointermove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    pointerup: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n\n  if (window.PointerEvent) {\n    dispatcher.registerSource('pointer', scope.pointerEvents);\n  } else if (window.navigator.msPointerEnabled) {\n    dispatcher.registerSource('ms', scope.msEvents);\n  } else {\n    dispatcher.registerSource('mouse', scope.mouseEvents);\n    if (window.ontouchstart !== undefined) {\n      dispatcher.registerSource('touch', scope.touchEvents);\n    }\n  }\n\n  dispatcher.register(document);\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event denotes the beginning of a series of tracking events.\n *\n * @module PointerGestures\n * @submodule Events\n * @class trackstart\n */\n/**\n * Pixels moved in the x direction since trackstart.\n * @type Number\n * @property dx\n */\n/**\n * Pixes moved in the y direction since trackstart.\n * @type Number\n * @property dy\n */\n/**\n * Pixels moved in the x direction since the last track.\n * @type Number\n * @property ddx\n */\n/**\n * Pixles moved in the y direction since the last track.\n * @type Number\n * @property ddy\n */\n/**\n * The clientX position of the track gesture.\n * @type Number\n * @property clientX\n */\n/**\n * The clientY position of the track gesture.\n * @type Number\n * @property clientY\n */\n/**\n * The pageX position of the track gesture.\n * @type Number\n * @property pageX\n */\n/**\n * The pageY position of the track gesture.\n * @type Number\n * @property pageY\n */\n/**\n * The screenX position of the track gesture.\n * @type Number\n * @property screenX\n */\n/**\n * The screenY position of the track gesture.\n * @type Number\n * @property screenY\n */\n/**\n * The last x axis direction of the pointer.\n * @type Number\n * @property xDirection\n */\n/**\n * The last y axis direction of the pointer.\n * @type Number\n * @property yDirection\n */\n/**\n * A shared object between all tracking events.\n * @type Object\n * @property trackInfo\n */\n/**\n * The element currently under the pointer.\n * @type Element\n * @property relatedTarget\n */\n/**\n * The type of pointer that make the track gesture.\n * @type String\n * @property pointerType\n */\n/**\n *\n * This event fires for all pointer movement being tracked.\n *\n * @class track\n * @extends trackstart\n */\n/**\n * This event fires when the pointer is no longer being tracked.\n *\n * @class trackend\n * @extends trackstart\n */\n\n (function(scope) {\n   var dispatcher = scope.dispatcher;\n   var eventFactory = scope.eventFactory;\n   var pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'down',\n       'move',\n       'up',\n     ],\n     WIGGLE_THRESHOLD: 4,\n     clampDir: function(inDelta) {\n       return inDelta > 0 ? 1 : -1;\n     },\n     calcPositionDelta: function(inA, inB) {\n       var x = 0, y = 0;\n       if (inA && inB) {\n         x = inB.pageX - inA.pageX;\n         y = inB.pageY - inA.pageY;\n       }\n       return {x: x, y: y};\n     },\n     fireTrack: function(inType, inEvent, inTrackingData) {\n       var t = inTrackingData;\n       var d = this.calcPositionDelta(t.downEvent, inEvent);\n       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);\n       if (dd.x) {\n         t.xDirection = this.clampDir(dd.x);\n       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       }\n       var e = eventFactory.makeGestureEvent(inType, {\n         bubbles: true,\n         cancelable: true,\n         dx: d.x,\n         dy: d.y,\n         ddx: dd.x,\n         ddy: dd.y,\n         x: inEvent.x,\n         y: inEvent.y,\n         clientX: inEvent.clientX,\n         clientY: inEvent.clientY,\n         pageX: inEvent.pageX,\n         pageY: inEvent.pageY,\n         screenX: inEvent.screenX,\n         screenY: inEvent.screenY,\n         xDirection: t.xDirection,\n         yDirection: t.yDirection,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.relatedTarget,\n         pointerType: inEvent.pointerType,\n         pointerId: inEvent.pointerId,\n         _source: 'track'\n       });\n       t.downTarget.dispatchEvent(e);\n     },\n     down: function(inEvent) {\n       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {\n         var p = {\n           downEvent: inEvent,\n           downTarget: inEvent.target,\n           trackInfo: {},\n           lastMoveEvent: null,\n           xDirection: 0,\n           yDirection: 0,\n           tracking: false\n         };\n         pointermap.set(inEvent.pointerId, p);\n       }\n     },\n     move: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (!p.tracking) {\n           var d = this.calcPositionDelta(p.downEvent, inEvent);\n           var move = d.x * d.x + d.y * d.y;\n           // start tracking only if finger moves more than WIGGLE_THRESHOLD\n           if (move > this.WIGGLE_THRESHOLD) {\n             p.tracking = true;\n             this.fireTrack('trackstart', p.downEvent, p);\n             this.fireTrack('track', inEvent, p);\n           }\n         } else {\n           this.fireTrack('track', inEvent, p);\n         }\n         p.lastMoveEvent = inEvent;\n       }\n     },\n     up: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (p.tracking) {\n           this.fireTrack('trackend', inEvent, p);\n         }\n         pointermap.delete(inEvent.pointerId);\n       }\n     }\n   };\n   dispatcher.registerGesture('track', track);\n })(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer is held down for 200ms.\n *\n * @module PointerGestures\n * @submodule Events\n * @class hold\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * Screen X axis position of the held pointer\n * @type Number\n * @property clientX\n */\n/**\n * Screen Y axis position of the held pointer\n * @type Number\n * @property clientY\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * This event is fired every 200ms while a pointer is held down.\n *\n * @class holdpulse\n * @extends hold\n */\n/**\n * Milliseconds pointer has been held down.\n * @type Number\n * @property holdTime\n */\n/**\n * This event is fired when a held pointer is released or moved.\n *\n * @class release\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var hold = {\n    // wait at least HOLD_DELAY ms between hold and pulse events\n    HOLD_DELAY: 200,\n    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold\n    WIGGLE_THRESHOLD: 16,\n    events: [\n      'down',\n      'move',\n      'up',\n    ],\n    heldPointer: null,\n    holdJob: null,\n    pulse: function() {\n      var hold = Date.now() - this.heldPointer.timeStamp;\n      var type = this.held ? 'holdpulse' : 'hold';\n      this.fireHold(type, hold);\n      this.held = true;\n    },\n    cancel: function() {\n      clearInterval(this.holdJob);\n      if (this.held) {\n        this.fireHold('release');\n      }\n      this.held = false;\n      this.heldPointer = null;\n      this.target = null;\n      this.holdJob = null;\n    },\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !this.heldPointer) {\n        this.heldPointer = inEvent;\n        this.target = inEvent.target;\n        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);\n      }\n    },\n    up: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        this.cancel();\n      }\n    },\n    move: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        var x = inEvent.clientX - this.heldPointer.clientX;\n        var y = inEvent.clientY - this.heldPointer.clientY;\n        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {\n          this.cancel();\n        }\n      }\n    },\n    fireHold: function(inType, inHoldTime) {\n      var p = {\n        bubbles: true,\n        cancelable: true,\n        pointerType: this.heldPointer.pointerType,\n        pointerId: this.heldPointer.pointerId,\n        x: this.heldPointer.clientX,\n        y: this.heldPointer.clientY,\n        _source: 'hold'\n      };\n      if (inHoldTime) {\n        p.holdTime = inHoldTime;\n      }\n      var e = eventFactory.makeGestureEvent(inType, p);\n      this.target.dispatchEvent(e);\n    }\n  };\n  dispatcher.registerGesture('hold', hold);\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer quickly goes down and up, and is used to\n * denote activation.\n *\n * Any gesture event can prevent the tap event from being created by calling\n * `event.preventTap`.\n *\n * Any pointer event can prevent the tap by setting the `tapPrevented` property\n * on itself.\n *\n * @module PointerGestures\n * @submodule Events\n * @class tap\n */\n/**\n * X axis position of the tap.\n * @property x\n * @type Number\n */\n/**\n * Y axis position of the tap.\n * @property y\n * @type Number\n */\n/**\n * Type of the pointer that made the tap.\n * @property pointerType\n * @type String\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'down',\n      'up'\n    ],\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !inEvent.tapPrevented) {\n        pointermap.set(inEvent.pointerId, {\n          target: inEvent.target,\n          buttons: inEvent.buttons,\n          x: inEvent.clientX,\n          y: inEvent.clientY\n        });\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (e.pointerType === 'mouse') {\n        // only allow left click to tap for mouse\n        return downState.buttons === 1;\n      }\n      return !e.tapPrevented;\n    },\n    up: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        // up.relatedTarget is target currently under finger\n        var t = scope.targetFinding.LCA(start.target, inEvent.relatedTarget);\n        if (t) {\n          var e = eventFactory.makeGestureEvent('tap', {\n            bubbles: true,\n            cancelable: true,\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType,\n            pointerId: inEvent.pointerId,\n            altKey: inEvent.altKey,\n            ctrlKey: inEvent.ctrlKey,\n            metaKey: inEvent.metaKey,\n            shiftKey: inEvent.shiftKey,\n            _source: 'tap'\n          });\n          t.dispatchEvent(e);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    }\n  };\n  // patch eventFactory to remove id from tap's pointermap for preventTap calls\n  eventFactory.preventTap = function(e) {\n    return function() {\n      e.tapPrevented = true;\n      pointermap.delete(e.pointerId);\n    };\n  };\n  dispatcher.registerGesture('tap', tap);\n})(window.PolymerGestures);\n","/*\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n(function (global) {\n    'use strict';\n\n    var Token,\n        TokenName,\n        Syntax,\n        Messages,\n        source,\n        index,\n        length,\n        delegate,\n        lookahead,\n        state;\n\n    Token = {\n        BooleanLiteral: 1,\n        EOF: 2,\n        Identifier: 3,\n        Keyword: 4,\n        NullLiteral: 5,\n        NumericLiteral: 6,\n        Punctuator: 7,\n        StringLiteral: 8\n    };\n\n    TokenName = {};\n    TokenName[Token.BooleanLiteral] = 'Boolean';\n    TokenName[Token.EOF] = '<end>';\n    TokenName[Token.Identifier] = 'Identifier';\n    TokenName[Token.Keyword] = 'Keyword';\n    TokenName[Token.NullLiteral] = 'Null';\n    TokenName[Token.NumericLiteral] = 'Numeric';\n    TokenName[Token.Punctuator] = 'Punctuator';\n    TokenName[Token.StringLiteral] = 'String';\n\n    Syntax = {\n        ArrayExpression: 'ArrayExpression',\n        BinaryExpression: 'BinaryExpression',\n        CallExpression: 'CallExpression',\n        ConditionalExpression: 'ConditionalExpression',\n        EmptyStatement: 'EmptyStatement',\n        ExpressionStatement: 'ExpressionStatement',\n        Identifier: 'Identifier',\n        Literal: 'Literal',\n        LabeledStatement: 'LabeledStatement',\n        LogicalExpression: 'LogicalExpression',\n        MemberExpression: 'MemberExpression',\n        ObjectExpression: 'ObjectExpression',\n        Program: 'Program',\n        Property: 'Property',\n        ThisExpression: 'ThisExpression',\n        UnaryExpression: 'UnaryExpression'\n    };\n\n    // Error messages should be identical to V8.\n    Messages = {\n        UnexpectedToken:  'Unexpected token %0',\n        UnknownLabel: 'Undefined label \\'%0\\'',\n        Redeclaration: '%0 \\'%1\\' has already been declared'\n    };\n\n    // Ensure the condition is true, otherwise throw an error.\n    // This is only to have a better contract semantic, i.e. another safety net\n    // to catch a logic error. The condition shall be fulfilled in normal case.\n    // Do NOT use this to enforce a certain condition on any user input.\n\n    function assert(condition, message) {\n        if (!condition) {\n            throw new Error('ASSERT: ' + message);\n        }\n    }\n\n    function isDecimalDigit(ch) {\n        return (ch >= 48 && ch <= 57);   // 0..9\n    }\n\n\n    // 7.2 White Space\n\n    function isWhiteSpace(ch) {\n        return (ch === 32) ||  // space\n            (ch === 9) ||      // tab\n            (ch === 0xB) ||\n            (ch === 0xC) ||\n            (ch === 0xA0) ||\n            (ch >= 0x1680 && '\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);\n    }\n\n    // 7.3 Line Terminators\n\n    function isLineTerminator(ch) {\n        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);\n    }\n\n    // 7.6 Identifier Names and Identifiers\n\n    function isIdentifierStart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122);          // a..z\n    }\n\n    function isIdentifierPart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122) ||        // a..z\n            (ch >= 48 && ch <= 57);           // 0..9\n    }\n\n    // 7.6.1.1 Keywords\n\n    function isKeyword(id) {\n        return (id === 'this')\n    }\n\n    // 7.4 Comments\n\n    function skipWhitespace() {\n        while (index < length && isWhiteSpace(source.charCodeAt(index))) {\n           ++index;\n        }\n    }\n\n    function getIdentifier() {\n        var start, ch;\n\n        start = index++;\n        while (index < length) {\n            ch = source.charCodeAt(index);\n            if (isIdentifierPart(ch)) {\n                ++index;\n            } else {\n                break;\n            }\n        }\n\n        return source.slice(start, index);\n    }\n\n    function scanIdentifier() {\n        var start, id, type;\n\n        start = index;\n\n        id = getIdentifier();\n\n        // There is no keyword or literal with only one character.\n        // Thus, it must be an identifier.\n        if (id.length === 1) {\n            type = Token.Identifier;\n        } else if (isKeyword(id)) {\n            type = Token.Keyword;\n        } else if (id === 'null') {\n            type = Token.NullLiteral;\n        } else if (id === 'true' || id === 'false') {\n            type = Token.BooleanLiteral;\n        } else {\n            type = Token.Identifier;\n        }\n\n        return {\n            type: type,\n            value: id,\n            range: [start, index]\n        };\n    }\n\n\n    // 7.7 Punctuators\n\n    function scanPunctuator() {\n        var start = index,\n            code = source.charCodeAt(index),\n            code2,\n            ch1 = source[index],\n            ch2;\n\n        switch (code) {\n\n        // Check for most common single-character punctuators.\n        case 46:   // . dot\n        case 40:   // ( open bracket\n        case 41:   // ) close bracket\n        case 59:   // ; semicolon\n        case 44:   // , comma\n        case 123:  // { open curly brace\n        case 125:  // } close curly brace\n        case 91:   // [\n        case 93:   // ]\n        case 58:   // :\n        case 63:   // ?\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: String.fromCharCode(code),\n                range: [start, index]\n            };\n\n        default:\n            code2 = source.charCodeAt(index + 1);\n\n            // '=' (char #61) marks an assignment or comparison operator.\n            if (code2 === 61) {\n                switch (code) {\n                case 37:  // %\n                case 38:  // &\n                case 42:  // *:\n                case 43:  // +\n                case 45:  // -\n                case 47:  // /\n                case 60:  // <\n                case 62:  // >\n                case 124: // |\n                    index += 2;\n                    return {\n                        type: Token.Punctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        range: [start, index]\n                    };\n\n                case 33: // !\n                case 61: // =\n                    index += 2;\n\n                    // !== and ===\n                    if (source.charCodeAt(index) === 61) {\n                        ++index;\n                    }\n                    return {\n                        type: Token.Punctuator,\n                        value: source.slice(start, index),\n                        range: [start, index]\n                    };\n                default:\n                    break;\n                }\n            }\n            break;\n        }\n\n        // Peek more characters.\n\n        ch2 = source[index + 1];\n\n        // Other 2-character punctuators: && ||\n\n        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {\n            index += 2;\n            return {\n                type: Token.Punctuator,\n                value: ch1 + ch2,\n                range: [start, index]\n            };\n        }\n\n        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: ch1,\n                range: [start, index]\n            };\n        }\n\n        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n    }\n\n    // 7.8.3 Numeric Literals\n    function scanNumericLiteral() {\n        var number, start, ch;\n\n        ch = source[index];\n        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),\n            'Numeric literal must start with a decimal digit or a decimal point');\n\n        start = index;\n        number = '';\n        if (ch !== '.') {\n            number = source[index++];\n            ch = source[index];\n\n            // Hex number starts with '0x'.\n            // Octal number starts with '0'.\n            if (number === '0') {\n                // decimal number starts with '0' such as '09' is illegal.\n                if (ch && isDecimalDigit(ch.charCodeAt(0))) {\n                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                }\n            }\n\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === '.') {\n            number += source[index++];\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === 'e' || ch === 'E') {\n            number += source[index++];\n\n            ch = source[index];\n            if (ch === '+' || ch === '-') {\n                number += source[index++];\n            }\n            if (isDecimalDigit(source.charCodeAt(index))) {\n                while (isDecimalDigit(source.charCodeAt(index))) {\n                    number += source[index++];\n                }\n            } else {\n                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n            }\n        }\n\n        if (isIdentifierStart(source.charCodeAt(index))) {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseFloat(number),\n            range: [start, index]\n        };\n    }\n\n    // 7.8.4 String Literals\n\n    function scanStringLiteral() {\n        var str = '', quote, start, ch, octal = false;\n\n        quote = source[index];\n        assert((quote === '\\'' || quote === '\"'),\n            'String literal must starts with a quote');\n\n        start = index;\n        ++index;\n\n        while (index < length) {\n            ch = source[index++];\n\n            if (ch === quote) {\n                quote = '';\n                break;\n            } else if (ch === '\\\\') {\n                ch = source[index++];\n                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n                    switch (ch) {\n                    case 'n':\n                        str += '\\n';\n                        break;\n                    case 'r':\n                        str += '\\r';\n                        break;\n                    case 't':\n                        str += '\\t';\n                        break;\n                    case 'b':\n                        str += '\\b';\n                        break;\n                    case 'f':\n                        str += '\\f';\n                        break;\n                    case 'v':\n                        str += '\\x0B';\n                        break;\n\n                    default:\n                        str += ch;\n                        break;\n                    }\n                } else {\n                    if (ch ===  '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                }\n            } else if (isLineTerminator(ch.charCodeAt(0))) {\n                break;\n            } else {\n                str += ch;\n            }\n        }\n\n        if (quote !== '') {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.StringLiteral,\n            value: str,\n            octal: octal,\n            range: [start, index]\n        };\n    }\n\n    function isIdentifierName(token) {\n        return token.type === Token.Identifier ||\n            token.type === Token.Keyword ||\n            token.type === Token.BooleanLiteral ||\n            token.type === Token.NullLiteral;\n    }\n\n    function advance() {\n        var ch;\n\n        skipWhitespace();\n\n        if (index >= length) {\n            return {\n                type: Token.EOF,\n                range: [index, index]\n            };\n        }\n\n        ch = source.charCodeAt(index);\n\n        // Very common: ( and ) and ;\n        if (ch === 40 || ch === 41 || ch === 58) {\n            return scanPunctuator();\n        }\n\n        // String literal starts with single quote (#39) or double quote (#34).\n        if (ch === 39 || ch === 34) {\n            return scanStringLiteral();\n        }\n\n        if (isIdentifierStart(ch)) {\n            return scanIdentifier();\n        }\n\n        // Dot (.) char #46 can also start a floating-point number, hence the need\n        // to check the next character.\n        if (ch === 46) {\n            if (isDecimalDigit(source.charCodeAt(index + 1))) {\n                return scanNumericLiteral();\n            }\n            return scanPunctuator();\n        }\n\n        if (isDecimalDigit(ch)) {\n            return scanNumericLiteral();\n        }\n\n        return scanPunctuator();\n    }\n\n    function lex() {\n        var token;\n\n        token = lookahead;\n        index = token.range[1];\n\n        lookahead = advance();\n\n        index = token.range[1];\n\n        return token;\n    }\n\n    function peek() {\n        var pos;\n\n        pos = index;\n        lookahead = advance();\n        index = pos;\n    }\n\n    // Throw an exception\n\n    function throwError(token, messageFormat) {\n        var error,\n            args = Array.prototype.slice.call(arguments, 2),\n            msg = messageFormat.replace(\n                /%(\\d)/g,\n                function (whole, index) {\n                    assert(index < args.length, 'Message reference must be in range');\n                    return args[index];\n                }\n            );\n\n        error = new Error(msg);\n        error.index = index;\n        error.description = msg;\n        throw error;\n    }\n\n    // Throw an exception because of the token.\n\n    function throwUnexpected(token) {\n        throwError(token, Messages.UnexpectedToken, token.value);\n    }\n\n    // Expect the next token to match the specified punctuator.\n    // If not, an exception will be thrown.\n\n    function expect(value) {\n        var token = lex();\n        if (token.type !== Token.Punctuator || token.value !== value) {\n            throwUnexpected(token);\n        }\n    }\n\n    // Return true if the next token matches the specified punctuator.\n\n    function match(value) {\n        return lookahead.type === Token.Punctuator && lookahead.value === value;\n    }\n\n    // Return true if the next token matches the specified keyword\n\n    function matchKeyword(keyword) {\n        return lookahead.type === Token.Keyword && lookahead.value === keyword;\n    }\n\n    function consumeSemicolon() {\n        // Catch the very common case first: immediately a semicolon (char #59).\n        if (source.charCodeAt(index) === 59) {\n            lex();\n            return;\n        }\n\n        skipWhitespace();\n\n        if (match(';')) {\n            lex();\n            return;\n        }\n\n        if (lookahead.type !== Token.EOF && !match('}')) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    // 11.1.4 Array Initialiser\n\n    function parseArrayInitialiser() {\n        var elements = [];\n\n        expect('[');\n\n        while (!match(']')) {\n            if (match(',')) {\n                lex();\n                elements.push(null);\n            } else {\n                elements.push(parseExpression());\n\n                if (!match(']')) {\n                    expect(',');\n                }\n            }\n        }\n\n        expect(']');\n\n        return delegate.createArrayExpression(elements);\n    }\n\n    // 11.1.5 Object Initialiser\n\n    function parseObjectPropertyKey() {\n        var token;\n\n        skipWhitespace();\n        token = lex();\n\n        // Note: This function is called only from parseObjectProperty(), where\n        // EOF and Punctuator tokens are already filtered out.\n        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {\n            return delegate.createLiteral(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseObjectProperty() {\n        var token, key;\n\n        token = lookahead;\n        skipWhitespace();\n\n        if (token.type === Token.EOF || token.type === Token.Punctuator) {\n            throwUnexpected(token);\n        }\n\n        key = parseObjectPropertyKey();\n        expect(':');\n        return delegate.createProperty('init', key, parseExpression());\n    }\n\n    function parseObjectInitialiser() {\n        var properties = [];\n\n        expect('{');\n\n        while (!match('}')) {\n            properties.push(parseObjectProperty());\n\n            if (!match('}')) {\n                expect(',');\n            }\n        }\n\n        expect('}');\n\n        return delegate.createObjectExpression(properties);\n    }\n\n    // 11.1.6 The Grouping Operator\n\n    function parseGroupExpression() {\n        var expr;\n\n        expect('(');\n\n        expr = parseExpression();\n\n        expect(')');\n\n        return expr;\n    }\n\n\n    // 11.1 Primary Expressions\n\n    function parsePrimaryExpression() {\n        var type, token, expr;\n\n        if (match('(')) {\n            return parseGroupExpression();\n        }\n\n        type = lookahead.type;\n\n        if (type === Token.Identifier) {\n            expr = delegate.createIdentifier(lex().value);\n        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n            expr = delegate.createLiteral(lex());\n        } else if (type === Token.Keyword) {\n            if (matchKeyword('this')) {\n                lex();\n                expr = delegate.createThisExpression();\n            }\n        } else if (type === Token.BooleanLiteral) {\n            token = lex();\n            token.value = (token.value === 'true');\n            expr = delegate.createLiteral(token);\n        } else if (type === Token.NullLiteral) {\n            token = lex();\n            token.value = null;\n            expr = delegate.createLiteral(token);\n        } else if (match('[')) {\n            expr = parseArrayInitialiser();\n        } else if (match('{')) {\n            expr = parseObjectInitialiser();\n        }\n\n        if (expr) {\n            return expr;\n        }\n\n        throwUnexpected(lex());\n    }\n\n    // 11.2 Left-Hand-Side Expressions\n\n    function parseArguments() {\n        var args = [];\n\n        expect('(');\n\n        if (!match(')')) {\n            while (index < length) {\n                args.push(parseExpression());\n                if (match(')')) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        return args;\n    }\n\n    function parseNonComputedProperty() {\n        var token;\n\n        token = lex();\n\n        if (!isIdentifierName(token)) {\n            throwUnexpected(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseNonComputedMember() {\n        expect('.');\n\n        return parseNonComputedProperty();\n    }\n\n    function parseComputedMember() {\n        var expr;\n\n        expect('[');\n\n        expr = parseExpression();\n\n        expect(']');\n\n        return expr;\n    }\n\n    function parseLeftHandSideExpression() {\n        var expr, args, property;\n\n        expr = parsePrimaryExpression();\n\n        while (true) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else if (match('.')) {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\n            } else if (match('(')) {\n                args = parseArguments();\n                expr = delegate.createCallExpression(expr, args);\n            } else {\n                break;\n            }\n        }\n\n        return expr;\n    }\n\n    // 11.3 Postfix Expressions\n\n    var parsePostfixExpression = parseLeftHandSideExpression;\n\n    // 11.4 Unary Operators\n\n    function parseUnaryExpression() {\n        var token, expr;\n\n        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {\n            expr = parsePostfixExpression();\n        } else if (match('+') || match('-') || match('!')) {\n            token = lex();\n            expr = parseUnaryExpression();\n            expr = delegate.createUnaryExpression(token.value, expr);\n        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n            throwError({}, Messages.UnexpectedToken);\n        } else {\n            expr = parsePostfixExpression();\n        }\n\n        return expr;\n    }\n\n    function binaryPrecedence(token) {\n        var prec = 0;\n\n        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n            return 0;\n        }\n\n        switch (token.value) {\n        case '||':\n            prec = 1;\n            break;\n\n        case '&&':\n            prec = 2;\n            break;\n\n        case '==':\n        case '!=':\n        case '===':\n        case '!==':\n            prec = 6;\n            break;\n\n        case '<':\n        case '>':\n        case '<=':\n        case '>=':\n        case 'instanceof':\n            prec = 7;\n            break;\n\n        case 'in':\n            prec = 7;\n            break;\n\n        case '+':\n        case '-':\n            prec = 9;\n            break;\n\n        case '*':\n        case '/':\n        case '%':\n            prec = 11;\n            break;\n\n        default:\n            break;\n        }\n\n        return prec;\n    }\n\n    // 11.5 Multiplicative Operators\n    // 11.6 Additive Operators\n    // 11.7 Bitwise Shift Operators\n    // 11.8 Relational Operators\n    // 11.9 Equality Operators\n    // 11.10 Binary Bitwise Operators\n    // 11.11 Binary Logical Operators\n\n    function parseBinaryExpression() {\n        var expr, token, prec, stack, right, operator, left, i;\n\n        left = parseUnaryExpression();\n\n        token = lookahead;\n        prec = binaryPrecedence(token);\n        if (prec === 0) {\n            return left;\n        }\n        token.prec = prec;\n        lex();\n\n        right = parseUnaryExpression();\n\n        stack = [left, token, right];\n\n        while ((prec = binaryPrecedence(lookahead)) > 0) {\n\n            // Reduce: make a binary expression from the three topmost entries.\n            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n                right = stack.pop();\n                operator = stack.pop().value;\n                left = stack.pop();\n                expr = delegate.createBinaryExpression(operator, left, right);\n                stack.push(expr);\n            }\n\n            // Shift.\n            token = lex();\n            token.prec = prec;\n            stack.push(token);\n            expr = parseUnaryExpression();\n            stack.push(expr);\n        }\n\n        // Final reduce to clean-up the stack.\n        i = stack.length - 1;\n        expr = stack[i];\n        while (i > 1) {\n            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n            i -= 2;\n        }\n\n        return expr;\n    }\n\n\n    // 11.12 Conditional Operator\n\n    function parseConditionalExpression() {\n        var expr, consequent, alternate;\n\n        expr = parseBinaryExpression();\n\n        if (match('?')) {\n            lex();\n            consequent = parseConditionalExpression();\n            expect(':');\n            alternate = parseConditionalExpression();\n\n            expr = delegate.createConditionalExpression(expr, consequent, alternate);\n        }\n\n        return expr;\n    }\n\n    // Simplification since we do not support AssignmentExpression.\n    var parseExpression = parseConditionalExpression;\n\n    // Polymer Syntax extensions\n\n    // Filter ::\n    //   Identifier\n    //   Identifier \"(\" \")\"\n    //   Identifier \"(\" FilterArguments \")\"\n\n    function parseFilter() {\n        var identifier, args;\n\n        identifier = lex();\n\n        if (identifier.type !== Token.Identifier) {\n            throwUnexpected(identifier);\n        }\n\n        args = match('(') ? parseArguments() : [];\n\n        return delegate.createFilter(identifier.value, args);\n    }\n\n    // Filters ::\n    //   \"|\" Filter\n    //   Filters \"|\" Filter\n\n    function parseFilters() {\n        while (match('|')) {\n            lex();\n            parseFilter();\n        }\n    }\n\n    // TopLevel ::\n    //   LabelledExpressions\n    //   AsExpression\n    //   InExpression\n    //   FilterExpression\n\n    // AsExpression ::\n    //   FilterExpression as Identifier\n\n    // InExpression ::\n    //   Identifier, Identifier in FilterExpression\n    //   Identifier in FilterExpression\n\n    // FilterExpression ::\n    //   Expression\n    //   Expression Filters\n\n    function parseTopLevel() {\n        skipWhitespace();\n        peek();\n\n        var expr = parseExpression();\n        if (expr) {\n            if (lookahead.value === ',' || lookahead.value == 'in' &&\n                       expr.type === Syntax.Identifier) {\n                parseInExpression(expr);\n            } else {\n                parseFilters();\n                if (lookahead.value === 'as') {\n                    parseAsExpression(expr);\n                } else {\n                    delegate.createTopLevel(expr);\n                }\n            }\n        }\n\n        if (lookahead.type !== Token.EOF) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    function parseAsExpression(expr) {\n        lex();  // as\n        var identifier = lex().value;\n        delegate.createAsExpression(expr, identifier);\n    }\n\n    function parseInExpression(identifier) {\n        var indexName;\n        if (lookahead.value === ',') {\n            lex();\n            if (lookahead.type !== Token.Identifier)\n                throwUnexpected(lookahead);\n            indexName = lex().value;\n        }\n\n        lex();  // in\n        var expr = parseExpression();\n        parseFilters();\n        delegate.createInExpression(identifier.name, indexName, expr);\n    }\n\n    function parse(code, inDelegate) {\n        delegate = inDelegate;\n        source = code;\n        index = 0;\n        length = source.length;\n        lookahead = null;\n        state = {\n            labelSet: {}\n        };\n\n        return parseTopLevel();\n    }\n\n    global.esprima = {\n        parse: parse\n    };\n})(this);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function (global) {\n  'use strict';\n\n  function prepareBinding(expressionText, name, node, filterRegistry) {\n    var expression;\n    try {\n      expression = getExpression(expressionText);\n      if (expression.scopeIdent &&\n          (node.nodeType !== Node.ELEMENT_NODE ||\n           node.tagName !== 'TEMPLATE' ||\n           (name !== 'bind' && name !== 'repeat'))) {\n        throw Error('as and in can only be used within <template bind/repeat>');\n      }\n    } catch (ex) {\n      console.error('Invalid expression syntax: ' + expressionText, ex);\n      return;\n    }\n\n    return function(model, node, oneTime) {\n      var binding = expression.getBinding(model, filterRegistry, oneTime);\n      if (expression.scopeIdent && binding) {\n        node.polymerExpressionScopeIdent_ = expression.scopeIdent;\n        if (expression.indexIdent)\n          node.polymerExpressionIndexIdent_ = expression.indexIdent;\n      }\n\n      return binding;\n    }\n  }\n\n  // TODO(rafaelw): Implement simple LRU.\n  var expressionParseCache = Object.create(null);\n\n  function getExpression(expressionText) {\n    var expression = expressionParseCache[expressionText];\n    if (!expression) {\n      var delegate = new ASTDelegate();\n      esprima.parse(expressionText, delegate);\n      expression = new Expression(delegate);\n      expressionParseCache[expressionText] = expression;\n    }\n    return expression;\n  }\n\n  function Literal(value) {\n    this.value = value;\n    this.valueFn_ = undefined;\n  }\n\n  Literal.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var value = this.value;\n        this.valueFn_ = function() {\n          return value;\n        }\n      }\n\n      return this.valueFn_;\n    }\n  }\n\n  function IdentPath(name) {\n    this.name = name;\n    this.path = Path.get(name);\n  }\n\n  IdentPath.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var name = this.name;\n        var path = this.path;\n        this.valueFn_ = function(model, observer) {\n          if (observer)\n            observer.addPath(model, path);\n\n          return path.getValueFrom(model);\n        }\n      }\n\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.path.length == 1);\n        model = findScope(model, this.path[0]);\n\n      return this.path.setValueFrom(model, newValue);\n    }\n  };\n\n  function MemberExpression(object, property, accessor) {\n    this.computed = accessor == '[';\n\n    this.dynamicDeps = typeof object == 'function' ||\n                       object.dynamicDeps ||\n                       (this.computed && !(property instanceof Literal));\n\n    this.simplePath =\n        !this.dynamicDeps &&\n        (property instanceof IdentPath || property instanceof Literal) &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = !this.computed || this.simplePath ?\n        property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n\n        var parts = this.object instanceof MemberExpression ?\n            this.object.fullPath.slice() : [this.object.name];\n        parts.push(this.property instanceof IdentPath ?\n            this.property.name : this.property.value);\n        this.fullPath_ = Path.get(parts);\n      }\n\n      return this.fullPath_;\n    },\n\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var object = this.object;\n\n        if (this.simplePath) {\n          var path = this.fullPath;\n\n          this.valueFn_ = function(model, observer) {\n            if (observer)\n              observer.addPath(model, path);\n\n            return path.getValueFrom(model);\n          };\n        } else if (!this.computed) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n\n            if (observer)\n              observer.addPath(context, path);\n\n            return path.getValueFrom(context);\n          }\n        } else {\n          // Computed property.\n          var property = this.property;\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n            var propName = property(model, observer, filterRegistry);\n            if (observer)\n              observer.addPath(context, [propName]);\n\n            return context ? context[propName] : undefined;\n          };\n        }\n      }\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.simplePath) {\n        this.fullPath.setValueFrom(model, newValue);\n        return newValue;\n      }\n\n      var object = this.object(model);\n      var propName = this.property instanceof IdentPath ? this.property.name :\n          this.property(model);\n      return object[propName] = newValue;\n    }\n  };\n\n  function Filter(name, args) {\n    this.name = name;\n    this.args = [];\n    for (var i = 0; i < args.length; i++) {\n      this.args[i] = getFn(args[i]);\n    }\n  }\n\n  Filter.prototype = {\n    transform: function(model, observer, filterRegistry, toModelDirection,\n                        initialArgs) {\n      var fn = filterRegistry[this.name];\n      var context = model;\n      if (fn) {\n        context = undefined;\n      } else {\n        fn = context[this.name];\n        if (!fn) {\n          console.error('Cannot find function or filter: ' + this.name);\n          return;\n        }\n      }\n\n      // If toModelDirection is falsey, then the \"normal\" (dom-bound) direction\n      // is used. Otherwise, it looks for a 'toModel' property function on the\n      // object.\n      if (toModelDirection) {\n        fn = fn.toModel;\n      } else if (typeof fn.toDOM == 'function') {\n        fn = fn.toDOM;\n      }\n\n      if (typeof fn != 'function') {\n        console.error('Cannot find function or filter: ' + this.name);\n        return;\n      }\n\n      var args = initialArgs || [];\n      for (var i = 0; i < this.args.length; i++) {\n        args.push(getFn(this.args[i])(model, observer, filterRegistry));\n      }\n\n      return fn.apply(context, args);\n    }\n  };\n\n  function notImplemented() { throw Error('Not Implemented'); }\n\n  var unaryOperators = {\n    '+': function(v) { return +v; },\n    '-': function(v) { return -v; },\n    '!': function(v) { return !v; }\n  };\n\n  var binaryOperators = {\n    '+': function(l, r) { return l+r; },\n    '-': function(l, r) { return l-r; },\n    '*': function(l, r) { return l*r; },\n    '/': function(l, r) { return l/r; },\n    '%': function(l, r) { return l%r; },\n    '<': function(l, r) { return l<r; },\n    '>': function(l, r) { return l>r; },\n    '<=': function(l, r) { return l<=r; },\n    '>=': function(l, r) { return l>=r; },\n    '==': function(l, r) { return l==r; },\n    '!=': function(l, r) { return l!=r; },\n    '===': function(l, r) { return l===r; },\n    '!==': function(l, r) { return l!==r; },\n    '&&': function(l, r) { return l&&r; },\n    '||': function(l, r) { return l||r; },\n  };\n\n  function getFn(arg) {\n    return typeof arg == 'function' ? arg : arg.valueFn();\n  }\n\n  function ASTDelegate() {\n    this.expression = null;\n    this.filters = [];\n    this.deps = {};\n    this.currentPath = undefined;\n    this.scopeIdent = undefined;\n    this.indexIdent = undefined;\n    this.dynamicDeps = false;\n  }\n\n  ASTDelegate.prototype = {\n    createUnaryExpression: function(op, argument) {\n      if (!unaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      argument = getFn(argument);\n\n      return function(model, observer, filterRegistry) {\n        return unaryOperators[op](argument(model, observer, filterRegistry));\n      };\n    },\n\n    createBinaryExpression: function(op, left, right) {\n      if (!binaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      left = getFn(left);\n      right = getFn(right);\n\n      return function(model, observer, filterRegistry) {\n        return binaryOperators[op](left(model, observer, filterRegistry),\n                                   right(model, observer, filterRegistry));\n      };\n    },\n\n    createConditionalExpression: function(test, consequent, alternate) {\n      test = getFn(test);\n      consequent = getFn(consequent);\n      alternate = getFn(alternate);\n\n      return function(model, observer, filterRegistry) {\n        return test(model, observer, filterRegistry) ?\n            consequent(model, observer, filterRegistry) :\n            alternate(model, observer, filterRegistry);\n      }\n    },\n\n    createIdentifier: function(name) {\n      var ident = new IdentPath(name);\n      ident.type = 'Identifier';\n      return ident;\n    },\n\n    createMemberExpression: function(accessor, object, property) {\n      var ex = new MemberExpression(object, property, accessor);\n      if (ex.dynamicDeps)\n        this.dynamicDeps = true;\n      return ex;\n    },\n\n    createCallExpression: function(expression, args) {\n      if (!(expression instanceof IdentPath))\n        throw Error('Only identifier function invocations are allowed');\n\n      var filter = new Filter(expression.name, args);\n\n      return function(model, observer, filterRegistry) {\n        return filter.transform(model, observer, filterRegistry, false);\n      };\n    },\n\n    createLiteral: function(token) {\n      return new Literal(token.value);\n    },\n\n    createArrayExpression: function(elements) {\n      for (var i = 0; i < elements.length; i++)\n        elements[i] = getFn(elements[i]);\n\n      return function(model, observer, filterRegistry) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer, filterRegistry));\n        return arr;\n      }\n    },\n\n    createProperty: function(kind, key, value) {\n      return {\n        key: key instanceof IdentPath ? key.name : key.value,\n        value: value\n      };\n    },\n\n    createObjectExpression: function(properties) {\n      for (var i = 0; i < properties.length; i++)\n        properties[i].value = getFn(properties[i].value);\n\n      return function(model, observer, filterRegistry) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] =\n              properties[i].value(model, observer, filterRegistry);\n        return obj;\n      }\n    },\n\n    createFilter: function(name, args) {\n      this.filters.push(new Filter(name, args));\n    },\n\n    createAsExpression: function(expression, scopeIdent) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n    },\n\n    createInExpression: function(scopeIdent, indexIdent, expression) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n      this.indexIdent = indexIdent;\n    },\n\n    createTopLevel: function(expression) {\n      this.expression = expression;\n    },\n\n    createThisExpression: notImplemented\n  }\n\n  function ConstantObservable(value) {\n    this.value_ = value;\n  }\n\n  ConstantObservable.prototype = {\n    open: function() { return this.value_; },\n    discardChanges: function() { return this.value_; },\n    deliver: function() {},\n    close: function() {},\n  }\n\n  function Expression(delegate) {\n    this.scopeIdent = delegate.scopeIdent;\n    this.indexIdent = delegate.indexIdent;\n\n    if (!delegate.expression)\n      throw Error('No expression found.');\n\n    this.expression = delegate.expression;\n    getFn(this.expression); // forces enumeration of path dependencies\n\n    this.filters = delegate.filters;\n    this.dynamicDeps = delegate.dynamicDeps;\n  }\n\n  Expression.prototype = {\n    getBinding: function(model, filterRegistry, oneTime) {\n      if (oneTime)\n        return this.getValue(model, undefined, filterRegistry);\n\n      var observer = new CompoundObserver();\n      // captures deps.\n      var firstValue = this.getValue(model, observer, filterRegistry);\n      var firstTime = true;\n      var self = this;\n\n      function valueFn() {\n        // deps cannot have changed on first value retrieval.\n        if (firstTime) {\n          firstTime = false;\n          return firstValue;\n        }\n\n        if (self.dynamicDeps)\n          observer.startReset();\n\n        var value = self.getValue(model,\n                                  self.dynamicDeps ? observer : undefined,\n                                  filterRegistry);\n        if (self.dynamicDeps)\n          observer.finishReset();\n\n        return value;\n      }\n\n      function setValueFn(newValue) {\n        self.setValue(model, newValue, filterRegistry);\n        return newValue;\n      }\n\n      return new ObserverTransform(observer, valueFn, setValueFn, true);\n    },\n\n    getValue: function(model, observer, filterRegistry) {\n      var value = getFn(this.expression)(model, observer, filterRegistry);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(model, observer, filterRegistry,\n            false, [value]);\n      }\n\n      return value;\n    },\n\n    setValue: function(model, newValue, filterRegistry) {\n      var count = this.filters ? this.filters.length : 0;\n      while (count-- > 0) {\n        newValue = this.filters[count].transform(model, undefined,\n            filterRegistry, true, [newValue]);\n      }\n\n      if (this.expression.setValue)\n        return this.expression.setValue(model, newValue);\n    }\n  }\n\n  /**\n   * Converts a style property name to a css property name. For example:\n   * \"WebkitUserSelect\" to \"-webkit-user-select\"\n   */\n  function convertStylePropertyName(name) {\n    return String(name).replace(/[A-Z]/g, function(c) {\n      return '-' + c.toLowerCase();\n    });\n  }\n\n  var parentScopeName = '@' + Math.random().toString(36).slice(2);\n\n  // Single ident paths must bind directly to the appropriate scope object.\n  // I.e. Pushed values in two-bindings need to be assigned to the actual model\n  // object.\n  function findScope(model, prop) {\n    while (model[parentScopeName] &&\n           !Object.prototype.hasOwnProperty.call(model, prop)) {\n      model = model[parentScopeName];\n    }\n\n    return model;\n  }\n\n  function isLiteralExpression(pathString) {\n    switch (pathString) {\n      case '':\n        return false;\n\n      case 'false':\n      case 'null':\n      case 'true':\n        return true;\n    }\n\n    if (!isNaN(Number(pathString)))\n      return true;\n\n    return false;\n  };\n\n  function PolymerExpressions() {}\n\n  PolymerExpressions.prototype = {\n    // \"built-in\" filters\n    styleObject: function(value) {\n      var parts = [];\n      for (var key in value) {\n        parts.push(convertStylePropertyName(key) + ': ' + value[key]);\n      }\n      return parts.join('; ');\n    },\n\n    tokenList: function(value) {\n      var tokens = [];\n      for (var key in value) {\n        if (value[key])\n          tokens.push(key);\n      }\n      return tokens.join(' ');\n    },\n\n    // binding delegate API\n    prepareInstancePositionChanged: function(template) {\n      var indexIdent = template.polymerExpressionIndexIdent_;\n      if (!indexIdent)\n        return;\n\n      return function(templateInstance, index) {\n        templateInstance.model[indexIdent] = index;\n      };\n    },\n\n    prepareBinding: function(pathString, name, node) {\n      var path = Path.get(pathString);\n\n      if (!isLiteralExpression(pathString) && path.valid) {\n        if (path.length == 1) {\n          return function(model, node, oneTime) {\n            if (oneTime)\n              return path.getValueFrom(model);\n\n            var scope = findScope(model, path[0]);\n            return new PathObserver(scope, path);\n          };\n        }\n        return; // bail out early if pathString is simple path.\n      }\n\n      return prepareBinding(pathString, name, node, this);\n    },\n\n    prepareInstanceModel: function(template) {\n      var scopeName = template.polymerExpressionScopeIdent_;\n      if (!scopeName)\n        return;\n\n      var parentScope = template.templateInstance ?\n          template.templateInstance.model :\n          template.model;\n\n      var indexName = template.polymerExpressionIndexIdent_;\n\n      return function(model) {\n        return createScopeObject(parentScope, model, scopeName, indexName);\n      };\n    }\n  };\n\n  var createScopeObject = ('__proto__' in {}) ?\n    function(parentScope, model, scopeName, indexName) {\n      var scope = {};\n      scope[scopeName] = model;\n      scope[indexName] = undefined;\n      scope[parentScopeName] = parentScope;\n      scope.__proto__ = parentScope;\n      return scope;\n    } :\n    function(parentScope, model, scopeName, indexName) {\n      var scope = Object.create(parentScope);\n      Object.defineProperty(scope, scopeName,\n          { value: model, configurable: true, writable: true });\n      Object.defineProperty(scope, indexName,\n          { value: undefined, configurable: true, writable: true });\n      Object.defineProperty(scope, parentScopeName,\n          { value: parentScope, configurable: true, writable: true });\n      return scope;\n    };\n\n  global.PolymerExpressions = PolymerExpressions;\n  PolymerExpressions.getExpression = getExpression;\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nPolymer = {\n  version: '0.3.3-0e73963'\n};\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// TODO(sorvell): this ensures Polymer is an object and not a function\n// Platform is currently defining it as a function to allow for async loading\n// of polymer; once we refine the loading process this likely goes away.\nif (typeof window.Polymer === 'function') {\n  Polymer = {};\n}\n\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // copy own properties from 'api' to 'prototype, with name hinting for 'super'\n  function extend(prototype, api) {\n    if (prototype && api) {\n      // use only own properties of 'api'\n      Object.getOwnPropertyNames(api).forEach(function(n) {\n        // acquire property descriptor\n        var pd = Object.getOwnPropertyDescriptor(api, n);\n        if (pd) {\n          // clone property via descriptor\n          Object.defineProperty(prototype, n, pd);\n          // cache name-of-method for 'super' engine\n          if (typeof pd.value == 'function') {\n            // hint the 'super' engine\n            pd.value.nom = n;\n          }\n        }\n      });\n    }\n    return prototype;\n  }\n  \n  // exports\n\n  scope.extend = extend;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  \n  // usage\n  \n  // invoke cb.call(this) in 100ms, unless the job is re-registered,\n  // which resets the timer\n  // \n  // this.myJob = this.job(this.myJob, cb, 100)\n  //\n  // returns a job handle which can be used to re-register a job\n\n  var Job = function(inContext) {\n    this.context = inContext;\n    this.boundComplete = this.complete.bind(this)\n  };\n  Job.prototype = {\n    go: function(callback, wait) {\n      this.callback = callback;\n      var h;\n      if (!wait) {\n        h = requestAnimationFrame(this.boundComplete);\n        this.handle = function() {\n          cancelAnimationFrame(h);\n        }\n      } else {\n        h = setTimeout(this.boundComplete, wait);\n        this.handle = function() {\n          clearTimeout(h);\n        }\n      }\n    },\n    stop: function() {\n      if (this.handle) {\n        this.handle();\n        this.handle = null;\n      }\n    },\n    complete: function() {\n      if (this.handle) {\n        this.stop();\n        this.callback.call(this.context);\n      }\n    }\n  };\n  \n  function job(job, callback, wait) {\n    if (job) {\n      job.stop();\n    } else {\n      job = new Job(this);\n    }\n    job.go(callback, wait);\n    return job;\n  }\n  \n  // exports \n\n  scope.job = job;\n  \n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var registry = {};\n\n  HTMLElement.register = function(tag, prototype) {\n    registry[tag] = prototype;\n  }\n\n  // get prototype mapped to node <tag>\n  HTMLElement.getPrototypeForTag = function(tag) {\n    var prototype = !tag ? HTMLElement.prototype : registry[tag];\n    // TODO(sjmiles): creating <tag> is likely to have wasteful side-effects\n    return prototype || Object.getPrototypeOf(document.createElement(tag));\n  };\n\n  // we have to flag propagation stoppage for the event dispatcher\n  var originalStopPropagation = Event.prototype.stopPropagation;\n  Event.prototype.stopPropagation = function() {\n    this.cancelBubble = true;\n    originalStopPropagation.apply(this, arguments);\n  };\n  \n  // TODO(sorvell): remove when we're sure imports does not need\n  // to load stylesheets\n  /*\n  HTMLImports.importer.preloadSelectors += \n      ', polymer-element link[rel=stylesheet]';\n  */\n})(Polymer);\n","/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n (function(scope) {\r\n    // super\r\n\r\n    // `arrayOfArgs` is an optional array of args like one might pass\r\n    // to `Function.apply`\r\n\r\n    // TODO(sjmiles):\r\n    //    $super must be installed on an instance or prototype chain\r\n    //    as `super`, and invoked via `this`, e.g.\r\n    //      `this.super();`\r\n\r\n    //    will not work if function objects are not unique, for example,\r\n    //    when using mixins.\r\n    //    The memoization strategy assumes each function exists on only one \r\n    //    prototype chain i.e. we use the function object for memoizing)\r\n    //    perhaps we can bookkeep on the prototype itself instead\r\n    function $super(arrayOfArgs) {\r\n      // since we are thunking a method call, performance is important here: \r\n      // memoize all lookups, once memoized the fast path calls no other \r\n      // functions\r\n      //\r\n      // find the caller (cannot be `strict` because of 'caller')\r\n      var caller = $super.caller;\r\n      // memoized 'name of method' \r\n      var nom = caller.nom;\r\n      // memoized next implementation prototype\r\n      var _super = caller._super;\r\n      if (!_super) {\r\n        if (!nom) {\r\n          nom = caller.nom = nameInThis.call(this, caller);\r\n        }\r\n        if (!nom) {\r\n          console.warn('called super() on a method not installed declaratively (has no .nom property)');\r\n        }\r\n        // super prototype is either cached or we have to find it\r\n        // by searching __proto__ (at the 'top')\r\n        // invariant: because we cache _super on fn below, we never reach \r\n        // here from inside a series of calls to super(), so it's ok to \r\n        // start searching from the prototype of 'this' (at the 'top')\r\n        // we must never memoize a null super for this reason\r\n        _super = memoizeSuper(caller, nom, getPrototypeOf(this));\r\n      }\r\n      // our super function\r\n      var fn = _super[nom];\r\n      if (fn) {\r\n        // memoize information so 'fn' can call 'super'\r\n        if (!fn._super) {\r\n          // must not memoize null, or we lose our invariant above\r\n          memoizeSuper(fn, nom, _super);\r\n        }\r\n        // invoke the inherited method\r\n        // if 'fn' is not function valued, this will throw\r\n        return fn.apply(this, arrayOfArgs || []);\r\n      }\r\n    }\r\n\r\n    function nameInThis(value) {\r\n      var p = this.__proto__;\r\n      while (p && p !== HTMLElement.prototype) {\r\n        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive\r\n        var n$ = Object.getOwnPropertyNames(p);\r\n        for (var i=0, l=n$.length, n; i<l && (n=n$[i]); i++) {\r\n          var d = Object.getOwnPropertyDescriptor(p, n);\r\n          if (typeof d.value === 'function' && d.value === value) {\r\n            return n;\r\n          }\r\n        }\r\n        p = p.__proto__;\r\n      }\r\n    }\r\n\r\n    function memoizeSuper(method, name, proto) {\r\n      // find and cache next prototype containing `name`\r\n      // we need the prototype so we can do another lookup\r\n      // from here\r\n      var s = nextSuper(proto, name, method);\r\n      if (s[name]) {\r\n        // `s` is a prototype, the actual method is `s[name]`\r\n        // tag super method with it's name for quicker lookups\r\n        s[name].nom = name;\r\n      }\r\n      return method._super = s;\r\n    }\r\n\r\n    function nextSuper(proto, name, caller) {\r\n      // look for an inherited prototype that implements name\r\n      while (proto) {\r\n        if ((proto[name] !== caller) && proto[name]) {\r\n          return proto;\r\n        }\r\n        proto = getPrototypeOf(proto);\r\n      }\r\n      // must not return null, or we lose our invariant above\r\n      // in this case, a super() call was invoked where no superclass\r\n      // method exists\r\n      // TODO(sjmiles): thow an exception?\r\n      return Object;\r\n    }\r\n\r\n    // NOTE: In some platforms (IE10) the prototype chain is faked via \r\n    // __proto__. Therefore, always get prototype via __proto__ instead of\r\n    // the more standard Object.getPrototypeOf.\r\n    function getPrototypeOf(prototype) {\r\n      return prototype.__proto__;\r\n    }\r\n\r\n    // utility function to precompute name tags for functions\r\n    // in a (unchained) prototype\r\n    function hintSuper(prototype) {\r\n      // tag functions with their prototype name to optimize\r\n      // super call invocations\r\n      for (var n in prototype) {\r\n        var pd = Object.getOwnPropertyDescriptor(prototype, n);\r\n        if (pd && typeof pd.value === 'function') {\r\n          pd.value.nom = n;\r\n        }\r\n      }\r\n    }\r\n\r\n    // exports\r\n\r\n    scope.super = $super;\r\n\r\n})(Polymer);\r\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var typeHandlers = {\n    string: function(value) {\n      return value;\n    },\n    date: function(value) {\n      return new Date(Date.parse(value) || Date.now());\n    },\n    boolean: function(value) {\n      if (value === '') {\n        return true;\n      }\n      return value === 'false' ? false : !!value;\n    },\n    number: function(value) {\n      var n = parseFloat(value);\n      // hex values like \"0xFFFF\" parseFloat as 0\n      if (n === 0) {\n        n = parseInt(value);\n      }\n      return isNaN(n) ? value : n;\n      // this code disabled because encoded values (like \"0xFFFF\")\n      // do not round trip to their original format\n      //return (String(floatVal) === value) ? floatVal : value;\n    },\n    object: function(value, currentValue) {\n      if (currentValue === null) {\n        return value;\n      }\n      try {\n        // If the string is an object, we can parse is with the JSON library.\n        // include convenience replace for single-quotes. If the author omits\n        // quotes altogether, parse will fail.\n        return JSON.parse(value.replace(/'/g, '\"'));\n      } catch(e) {\n        // The object isn't valid JSON, return the raw value\n        return value;\n      }\n    },\n    // avoid deserialization of functions\n    'function': function(value, currentValue) {\n      return currentValue;\n    }\n  };\n\n  function deserializeValue(value, currentValue) {\n    // attempt to infer type from default value\n    var inferredType = typeof currentValue;\n    // invent 'date' type value for Date\n    if (currentValue instanceof Date) {\n      inferredType = 'date';\n    }\n    // delegate deserialization via type string\n    return typeHandlers[inferredType](value, currentValue);\n  }\n\n  // exports\n\n  scope.deserializeValue = deserializeValue;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n\n  // module\n\n  var api = {};\n\n  api.declaration = {};\n  api.instance = {};\n\n  api.publish = function(apis, prototype) {\n    for (var n in apis) {\n      extend(prototype, apis[n]);\n    }\n  };\n\n  // exports\n\n  scope.api = api;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var utils = {\n    /**\n      * Invokes a function asynchronously. The context of the callback\n      * function is bound to 'this' automatically.\n      * @method async\n      * @param {Function|String} method\n      * @param {any|Array} args\n      * @param {number} timeout\n      */\n    async: function(method, args, timeout) {\n      // when polyfilling Object.observe, ensure changes \n      // propagate before executing the async method\n      Platform.flush();\n      // second argument to `apply` must be an array\n      args = (args && args.length) ? args : [args];\n      // function to invoke\n      var fn = function() {\n        (this[method] || method).apply(this, args);\n      }.bind(this);\n      // execute `fn` sooner or later\n      var handle = timeout ? setTimeout(fn, timeout) :\n          requestAnimationFrame(fn);\n      // NOTE: switch on inverting handle to determine which time is used.\n      return timeout ? handle : ~handle;\n    },\n    cancelAsync: function(handle) {\n      if (handle < 0) {\n        cancelAnimationFrame(~handle);\n      } else {\n        clearTimeout(handle);\n      }\n    },\n    /**\n      * Fire an event.\n      * @method fire\n      * @returns {Object} event\n      * @param {string} type An event name.\n      * @param {any} detail\n      * @param {Node} onNode Target node.\n      */\n    fire: function(type, detail, onNode, bubbles, cancelable) {\n      var node = onNode || this;\n      var detail = detail || {};\n      var event = new CustomEvent(type, {\n        bubbles: (bubbles !== undefined ? bubbles : true), \n        cancelable: (cancelable !== undefined ? cancelable : true), \n        detail: detail\n      });\n      node.dispatchEvent(event);\n      return event;\n    },\n    /**\n      * Fire an event asynchronously.\n      * @method asyncFire\n      * @param {string} type An event name.\n      * @param detail\n      * @param {Node} toNode Target node.\n      */\n    asyncFire: function(/*inType, inDetail*/) {\n      this.async(\"fire\", arguments);\n    },\n    /**\n      * Remove class from old, add class to anew, if they exist.\n      * @param classFollows\n      * @param anew A node.\n      * @param old A node\n      * @param className\n      */\n    classFollows: function(anew, old, className) {\n      if (old) {\n        old.classList.remove(className);\n      }\n      if (anew) {\n        anew.classList.add(className);\n      }\n    },\n    /**\n      * Inject HTML which contains markup bound to this element into\n      * a target element (replacing target element content).\n      * @param String html to inject\n      * @param Element target element\n      */\n    injectBoundHTML: function(html, element) {\n      var template = document.createElement('template');\n      template.innerHTML = html;\n      var fragment = this.instanceTemplate(template);\n      if (element) {\n        element.textContent = '';\n        element.appendChild(fragment);\n      }\n      return fragment;\n    }\n  };\n\n  // no-operation function for handy stubs\n  var nop = function() {};\n\n  // null-object for handy stubs\n  var nob = {};\n\n  // deprecated\n\n  utils.asyncMethod = utils.async;\n\n  // exports\n\n  scope.api.instance.utils = utils;\n  scope.nop = nop;\n  scope.nob = nob;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var EVENT_PREFIX = 'on-';\n\n  // instance events api\n  var events = {\n    // read-only\n    EVENT_PREFIX: EVENT_PREFIX,\n    // event listeners on host\n    addHostListeners: function() {\n      var events = this.eventDelegates;\n      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);\n      // NOTE: host events look like bindings but really are not;\n      // (1) we don't want the attribute to be set and (2) we want to support\n      // multiple event listeners ('host' and 'instance') and Node.bind\n      // by default supports 1 thing being bound.\n      for (var type in events) {\n        var methodName = events[type];\n        this.addEventListener(type, this.element.getEventHandler(this, this,\n                                                                 methodName));\n      }\n    },\n    // call 'method' or function method on 'obj' with 'args', if the method exists\n    dispatchMethod: function(obj, method, args) {\n      if (obj) {\n        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);\n        var fn = typeof method === 'function' ? method : obj[method];\n        if (fn) {\n          fn[args ? 'apply' : 'call'](obj, args);\n        }\n        log.events && console.groupEnd();\n        Platform.flush();\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.instance.events = events;\n\n})(Polymer);\n","/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\n  // instance api for attributes\r\n\r\n  var attributes = {\r\n    copyInstanceAttributes: function () {\r\n      var a$ = this._instanceAttributes;\r\n      for (var k in a$) {\r\n        if (!this.hasAttribute(k)) {\r\n          this.setAttribute(k, a$[k]);\r\n        }\r\n      }\r\n    },\r\n    // for each attribute on this, deserialize value to property as needed\r\n    takeAttributes: function() {\r\n      // if we have no publish lookup table, we have no attributes to take\r\n      // TODO(sjmiles): ad hoc\r\n      if (this._publishLC) {\r\n        for (var i=0, a$=this.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\r\n          this.attributeToProperty(a.name, a.value);\r\n        }\r\n      }\r\n    },\r\n    // if attribute 'name' is mapped to a property, deserialize\r\n    // 'value' into that property\r\n    attributeToProperty: function(name, value) {\r\n      // try to match this attribute to a property (attributes are\r\n      // all lower-case, so this is case-insensitive search)\r\n      var name = this.propertyForAttribute(name);\r\n      if (name) {\r\n        // filter out 'mustached' values, these are to be\r\n        // replaced with bound-data and are not yet values\r\n        // themselves\r\n        if (value && value.search(scope.bindPattern) >= 0) {\r\n          return;\r\n        }\r\n        // get original value\r\n        var currentValue = this[name];\r\n        // deserialize Boolean or Number values from attribute\r\n        var value = this.deserializeValue(value, currentValue);\r\n        // only act if the value has changed\r\n        if (value !== currentValue) {\r\n          // install new value (has side-effects)\r\n          this[name] = value;\r\n        }\r\n      }\r\n    },\r\n    // return the published property matching name, or undefined\r\n    propertyForAttribute: function(name) {\r\n      var match = this._publishLC && this._publishLC[name];\r\n      //console.log('propertyForAttribute:', name, 'matches', match);\r\n      return match;\r\n    },\r\n    // convert representation of 'stringValue' based on type of 'currentValue'\r\n    deserializeValue: function(stringValue, currentValue) {\r\n      return scope.deserializeValue(stringValue, currentValue);\r\n    },\r\n    serializeValue: function(value, inferredType) {\r\n      if (inferredType === 'boolean') {\r\n        return value ? '' : undefined;\r\n      } else if (inferredType !== 'object' && inferredType !== 'function'\r\n          && value !== undefined) {\r\n        return value;\r\n      }\r\n    },\r\n    reflectPropertyToAttribute: function(name) {\r\n      var inferredType = typeof this[name];\r\n      // try to intelligently serialize property value\r\n      var serializedValue = this.serializeValue(this[name], inferredType);\r\n      // boolean properties must reflect as boolean attributes\r\n      if (serializedValue !== undefined) {\r\n        this.setAttribute(name, serializedValue);\r\n        // TODO(sorvell): we should remove attr for all properties\r\n        // that have undefined serialization; however, we will need to\r\n        // refine the attr reflection system to achieve this; pica, for example,\r\n        // relies on having inferredType object properties not removed as\r\n        // attrs.\r\n      } else if (inferredType === 'boolean') {\r\n        this.removeAttribute(name);\r\n      }\r\n    }\r\n  };\r\n\r\n  // exports\r\n\r\n  scope.api.instance.attributes = attributes;\r\n\r\n})(Polymer);\r\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n\n  // magic words\n\n  var OBSERVE_SUFFIX = 'Changed';\n\n  // element api\n\n  var empty = [];\n\n  var updateRecord = {\n    object: undefined,\n    type: 'update',\n    name: undefined,\n    oldValue: undefined\n  };\n\n  var numberIsNaN = Number.isNaN || function(value) {\n    return typeof value === 'number' && isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  // capture A's value if B's value is null or undefined,\n  // otherwise use B's value\n  function resolveBindingValue(oldValue, value) {\n    if (value === undefined && oldValue === null) {\n      return value;\n    }\n    return (value === null || value === undefined) ? oldValue : value;\n  }\n\n  var properties = {\n    createPropertyObserver: function() {\n      var n$ = this._observeNames;\n      if (n$ && n$.length) {\n        var o = this._propertyObserver = new CompoundObserver(true);\n        this.registerObserver(o);\n        // TODO(sorvell): may not be kosher to access the value here (this[n]);\n        // previously we looked at the descriptor on the prototype\n        // this doesn't work for inheritance and not for accessors without\n        // a value property\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          o.addPath(this, n);\n          this.observeArrayValue(n, this[n], null);\n        }\n      }\n    },\n    openPropertyObserver: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.open(this.notifyPropertyChanges, this);\n      }\n    },\n    notifyPropertyChanges: function(newValues, oldValues, paths) {\n      var name, method, called = {};\n      for (var i in oldValues) {\n        // note: paths is of form [object, path, object, path]\n        name = paths[2 * i + 1];\n        method = this.observe[name];\n        if (method) {\n          var ov = oldValues[i], nv = newValues[i];\n          // observes the value if it is an array\n          this.observeArrayValue(name, nv, ov);\n          if (!called[method]) {\n            // only invoke change method if one of ov or nv is not (undefined | null)\n            if ((ov !== undefined && ov !== null) || (nv !== undefined && nv !== null)) {\n              called[method] = true;\n              // TODO(sorvell): call method with the set of values it's expecting;\n              // e.g. 'foo bar': 'invalidate' expects the new and old values for\n              // foo and bar. Currently we give only one of these and then\n              // deliver all the arguments.\n              this.invokeMethod(method, [ov, nv, arguments]);\n            }\n          }\n        }\n      }\n    },\n    deliverChanges: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.deliver();\n      }\n    },\n    propertyChanged_: function(name, value, oldValue) {\n      if (this.reflect[name]) {\n        this.reflectPropertyToAttribute(name);\n      }\n    },\n    observeArrayValue: function(name, value, old) {\n      // we only care if there are registered side-effects\n      var callbackName = this.observe[name];\n      if (callbackName) {\n        // if we are observing the previous value, stop\n        if (Array.isArray(old)) {\n          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);\n          this.closeNamedObserver(name + '__array');\n        }\n        // if the new value is an array, being observing it\n        if (Array.isArray(value)) {\n          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);\n          var observer = new ArrayObserver(value);\n          observer.open(function(value, old) {\n            this.invokeMethod(callbackName, [old]);\n          }, this);\n          this.registerNamedObserver(name + '__array', observer);\n        }\n      }\n    },\n    emitPropertyChangeRecord: function(name, value, oldValue) {\n      var object = this;\n      if (areSameValue(value, oldValue))\n        return;\n\n      this.propertyChanged_(name, value, oldValue);\n\n      if (!Observer.hasObjectObserve)\n        return;\n\n      var notifier = this.notifier_;\n      if (!notifier)\n        notifier = this.notifier_ = Object.getNotifier(this);\n\n      updateRecord.object = this;\n      updateRecord.name = name;\n      updateRecord.oldValue = oldValue;\n\n      notifier.notify(updateRecord);\n    },\n    bindToAccessor: function(name, observable, resolveFn) {\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n\n      this[privateObservable] = observable;\n      var oldValue = this[privateName];\n\n      var self = this;\n      var value = observable.open(function(value, oldValue) {\n        self[privateName] = value;\n        self.emitPropertyChangeRecord(name, value, oldValue);\n      });\n\n      if (resolveFn && !areSameValue(oldValue, value)) {\n        var resolvedValue = resolveFn(oldValue, value);\n        if (!areSameValue(value, resolvedValue)) {\n          value = resolvedValue;\n          if (observable.setValue)\n            observable.setValue(value);\n        }\n      }\n\n      this[privateName] = value;\n      this.emitPropertyChangeRecord(name, value, oldValue);\n\n      var observer = {\n        close: function() {\n          observable.close();\n          self[privateObservable] = undefined;\n        }\n      };\n      this.registerObserver(observer);\n      return observer;\n    },\n    createComputedProperties: function() {\n      if (!this._computedNames) {\n        return;\n      }\n\n      for (var i = 0; i < this._computedNames.length; i++) {\n        var name = this._computedNames[i];\n        var expressionText = this.computed[name];\n        try {\n          var expression = PolymerExpressions.getExpression(expressionText);\n          var observable = expression.getBinding(this, this.element.syntax);\n          this.bindToAccessor(name, observable);\n        } catch (ex) {\n          console.error('Failed to create computed property', ex);\n        }\n      }\n    },\n    bindProperty: function(property, observable, oneTime) {\n      if (oneTime) {\n        this[property] = observable;\n        return;\n      }\n      return this.bindToAccessor(property, observable, resolveBindingValue);\n    },\n    invokeMethod: function(method, args) {\n      var fn = this[method] || method;\n      if (typeof fn === 'function') {\n        fn.apply(this, args);\n      }\n    },\n    registerObserver: function(observer) {\n      if (!this._observers) {\n        this._observers = [observer];\n        return;\n      }\n\n      this._observers.push(observer);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\n      if (!this._observers) {\n        return;\n      }\n\n      var observers = this._observers;\n      for (var i = 0; i < observers.length; i++) {\n        var observer = observers[i];\n        if (observer && typeof observer.close == 'function') {\n          observer.close();\n        }\n      }\n\n      this._observers = [];\n    },\n    // bookkeeping observers for memory management\n    registerNamedObserver: function(name, observer) {\n      var o$ = this._namedObservers || (this._namedObservers = {});\n      o$[name] = observer;\n    },\n    closeNamedObserver: function(name) {\n      var o$ = this._namedObservers;\n      if (o$ && o$[name]) {\n        o$[name].close();\n        o$[name] = null;\n        return true;\n      }\n    },\n    closeNamedObservers: function() {\n      if (this._namedObservers) {\n        for (var i in this._namedObservers) {\n          this.closeNamedObserver(i);\n        }\n        this._namedObservers = {};\n      }\n    }\n  };\n\n  // logging\n  var LOG_OBSERVE = '[%s] watching [%s]';\n  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';\n  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n\n  // element api supporting mdv\n  var mdv = {\n    instanceTemplate: function(template) {\n      // ensure a default bindingDelegate\n      var syntax = this.syntax || (!template.bindingDelegate &&\n          this.element.syntax);\n      var dom = template.createInstance(this, syntax);\n      var observers = dom.bindings_;\n      for (var i = 0; i < observers.length; i++) {\n        this.registerObserver(observers[i]);\n      }\n      return dom;\n    },\n    bind: function(name, observable, oneTime) {\n      var property = this.propertyForAttribute(name);\n      if (!property) {\n        // TODO(sjmiles): this mixin method must use the special form\n        // of `super` installed by `mixinMethod` in declaration/prototype.js\n        return this.mixinSuper(arguments);\n      } else {\n        // use n-way Polymer binding\n        var observer = this.bindProperty(property, observable, oneTime);\n        // NOTE: reflecting binding information is typically required only for\n        // tooling. It has a performance cost so it's opt-in in Node.bind.\n        if (Platform.enableBindingsReflection && observer) {\n          observer.path = observable.path_;\n          this._recordBinding(property, observer);\n        }\n        if (this.reflect[property]) {\n          this.reflectPropertyToAttribute(property);\n        }\n        return observer;\n      }\n    },\n    bindFinished: function() {\n      this.makeElementReady();\n    },\n    _recordBinding: function(name, observer) {\n      this.bindings_ = this.bindings_ || {};\n      this.bindings_[name] = observer;\n    },\n    // TODO(sorvell): unbind/unbindAll has been removed, as public api, from\n    // TemplateBinding. We still need to close/dispose of observers but perhaps\n    // we should choose a more explicit name.\n    asyncUnbindAll: function() {\n      if (!this._unbound) {\n        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);\n        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);\n      }\n    },\n    unbindAll: function() {\n      if (!this._unbound) {\n        this.closeObservers();\n        this.closeNamedObservers();\n        this._unbound = true;\n      }\n    },\n    cancelUnbindAll: function() {\n      if (this._unbound) {\n        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);\n        return;\n      }\n      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);\n      if (this._unbindAllJob) {\n        this._unbindAllJob = this._unbindAllJob.stop();\n      }\n    }\n  };\n\n  function unbindNodeTree(node) {\n    forNodeTree(node, _nodeUnbindAll);\n  }\n\n  function _nodeUnbindAll(node) {\n    node.unbindAll();\n  }\n\n  function forNodeTree(node, callback) {\n    if (node) {\n      callback(node);\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        forNodeTree(child, callback);\n      }\n    }\n  }\n\n  var mustachePattern = /\\{\\{([^{}]*)}}/;\n\n  // exports\n\n  scope.bindPattern = mustachePattern;\n  scope.api.instance.mdv = mdv;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var base = {\n    PolymerBase: true,\n    job: function(job, callback, wait) {\n      if (typeof job === 'string') {\n        var n = '___' + job;\n        this[n] = Polymer.job.call(this, this[n], callback, wait);\n      } else {\n        return Polymer.job.call(this, job, callback, wait);\n      }\n    },\n    super: Polymer.super,\n    // user entry point for element has had its createdCallback called\n    created: function() {\n    },\n    // user entry point for element has shadowRoot and is ready for\n    // api interaction\n    ready: function() {\n    },\n    createdCallback: function() {\n      if (this.templateInstance && this.templateInstance.model) {\n        console.warn('Attributes on ' + this.localName + ' were data bound ' +\n            'prior to Polymer upgrading the element. This may result in ' +\n            'incorrect binding types.');\n      }\n      this.created();\n      this.prepareElement();\n      // TODO(sorvell): replace when ShadowDOMPolyfill issue is corrected\n      // https://github.com/Polymer/ShadowDOM/issues/420\n      if (!this.ownerDocument.isStagingDocument || window.ShadowDOMPolyfill) {\n        this.makeElementReady();\n      }\n    },\n    // system entry point, do not override\n    prepareElement: function() {\n      if (this._elementPrepared) {\n        console.warn('Element already prepared', this.localName);\n        return;\n      }\n      this._elementPrepared = true;\n      // storage for shadowRoots info\n      this.shadowRoots = {};\n      // install property observers\n      this.createPropertyObserver();\n      // TODO (sorvell): temporarily open observer when created\n      this.openPropertyObserver();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\n    },\n    makeElementReady: function() {\n      if (this._readied) {\n        return;\n      }\n      this._readied = true;\n      this.createComputedProperties();\n      // TODO(sorvell): We could create an entry point here\n      // for the user to compute property values.\n      // process declarative resources\n      this.parseDeclarations(this.__proto__);\n      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate\n      // :unresolved; remove this attribute to be compatible with native\n      // CE.\n      this.removeAttribute('unresolved');\n      // user entry point\n      this.ready();\n      // TODO (sorvell): temporarily open observer when created\n      // turn on property observation and take any initial changes\n      //this.openPropertyObserver();\n    },\n    attachedCallback: function() {\n      this.cancelUnbindAll();\n      // invoke user action\n      if (this.attached) {\n        this.attached();\n      }\n      // TODO(sorvell): bc\n      if (this.enteredView) {\n        this.enteredView();\n      }\n      // NOTE: domReady can be used to access elements in dom (descendants,\n      // ancestors, siblings) such that the developer is enured to upgrade\n      // ordering. If the element definitions have loaded, domReady\n      // can be used to access upgraded elements.\n      if (!this.hasBeenAttached) {\n        this.hasBeenAttached = true;\n        if (this.domReady) {\n          this.async('domReady');\n        }\n      }\n    },\n    detachedCallback: function() {\n      if (!this.preventDispose) {\n        this.asyncUnbindAll();\n      }\n      // invoke user action\n      if (this.detached) {\n        this.detached();\n      }\n      // TODO(sorvell): bc\n      if (this.leftView) {\n        this.leftView();\n      }\n    },\n    // TODO(sorvell): bc\n    enteredViewCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftViewCallback: function() {\n      this.detachedCallback();\n    },\n    // TODO(sorvell): bc\n    enteredDocumentCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftDocumentCallback: function() {\n      this.detachedCallback();\n    },\n    // recursive ancestral <element> initialization, oldest first\n    parseDeclarations: function(p) {\n      if (p && p.element) {\n        this.parseDeclarations(p.__proto__);\n        p.parseDeclaration.call(this, p.element);\n      }\n    },\n    // parse input <element> as needed, override for custom behavior\n    parseDeclaration: function(elementElement) {\n      var template = this.fetchTemplate(elementElement);\n      if (template) {\n        var root = this.shadowFromTemplate(template);\n        this.shadowRoots[elementElement.name] = root;\n      }\n    },\n    // return a shadow-root template (if desired), override for custom behavior\n    fetchTemplate: function(elementElement) {\n      return elementElement.querySelector('template');\n    },\n    // utility function that creates a shadow root from a <template>\n    shadowFromTemplate: function(template) {\n      if (template) {\n        // make a shadow root\n        var root = this.createShadowRoot();\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        root.appendChild(dom);\n        // perform post-construction initialization tasks on shadow root\n        this.shadowRootReady(root, template);\n        // return the created shadow root\n        return root;\n      }\n    },\n    // utility function that stamps a <template> into light-dom\n    lightFromTemplate: function(template, refNode) {\n      if (template) {\n        // TODO(sorvell): mark this element as an eventController so that\n        // event listeners on bound nodes inside it will be called on it.\n        // Note, the expectation here is that events on all descendants\n        // should be handled by this element.\n        this.eventController = this;\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        if (refNode) {\n          this.insertBefore(dom, refNode);\n        } else {\n          this.appendChild(dom);\n        }\n        // perform post-construction initialization tasks on ahem, light root\n        this.shadowRootReady(this);\n        // return the created shadow root\n        return dom;\n      }\n    },\n    shadowRootReady: function(root) {\n      // locate nodes with id and store references to them in this.$ hash\n      this.marshalNodeReferences(root);\n      // set up polymer gestures\n      PolymerGestures.register(root);\n    },\n    // locate nodes with id and store references to them in this.$ hash\n    marshalNodeReferences: function(root) {\n      // establish $ instance variable\n      var $ = this.$ = this.$ || {};\n      // populate $ from nodes with ID from the LOCAL tree\n      if (root) {\n        var n$ = root.querySelectorAll(\"[id]\");\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          $[n.id] = n;\n        };\n      }\n    },\n    attributeChangedCallback: function(name, oldValue) {\n      // TODO(sjmiles): adhoc filter\n      if (name !== 'class' && name !== 'style') {\n        this.attributeToProperty(name, this.getAttribute(name));\n      }\n      if (this.attributeChanged) {\n        this.attributeChanged.apply(this, arguments);\n      }\n    },\n    onMutation: function(node, listener) {\n      var observer = new MutationObserver(function(mutations) {\n        listener.call(this, observer, mutations);\n        observer.disconnect();\n      }.bind(this));\n      observer.observe(node, {childList: true, subtree: true});\n    }\n  };\n\n  // true if object has own PolymerBase api\n  function isBase(object) {\n    return object.hasOwnProperty('PolymerBase')\n  }\n\n  // name a base constructor for dev tools\n\n  function PolymerBase() {};\n  PolymerBase.prototype = base;\n  base.constructor = PolymerBase;\n\n  // exports\n\n  scope.Base = PolymerBase;\n  scope.isBase = isBase;\n  scope.api.instance.base = base;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  \n  // magic words\n  \n  var STYLE_SCOPE_ATTRIBUTE = 'element';\n  var STYLE_CONTROLLER_SCOPE = 'controller';\n  \n  var styles = {\n    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,\n    /**\n     * Installs external stylesheets and <style> elements with the attribute \n     * polymer-scope='controller' into the scope of element. This is intended\n     * to be a called during custom element construction.\n    */\n    installControllerStyles: function() {\n      // apply controller styles, but only if they are not yet applied\n      var scope = this.findStyleScope();\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {\n        // allow inherited controller styles\n        var proto = getPrototypeOf(this), cssText = '';\n        while (proto && proto.element) {\n          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);\n          proto = getPrototypeOf(proto);\n        }\n        if (cssText) {\n          this.installScopeCssText(cssText, scope);\n        }\n      }\n    },\n    installScopeStyle: function(style, name, scope) {\n      var scope = scope || this.findStyleScope(), name = name || '';\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {\n        var cssText = '';\n        if (style instanceof Array) {\n          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {\n            cssText += s.textContent + '\\n\\n';\n          }\n        } else {\n          cssText = style.textContent;\n        }\n        this.installScopeCssText(cssText, scope, name);\n      }\n    },\n    installScopeCssText: function(cssText, scope, name) {\n      scope = scope || this.findStyleScope();\n      name = name || '';\n      if (!scope) {\n        return;\n      }\n      if (window.ShadowDOMPolyfill) {\n        cssText = shimCssText(cssText, scope.host);\n      }\n      var style = this.element.cssTextToScopeStyle(cssText,\n          STYLE_CONTROLLER_SCOPE);\n      Polymer.applyStyleToScope(style, scope);\n      // cache that this style has been applied\n      scope._scopeStyles[this.localName + name] = true;\n    },\n    findStyleScope: function(node) {\n      // find the shadow root that contains this element\n      var n = node || this;\n      while (n.parentNode) {\n        n = n.parentNode;\n      }\n      return n;\n    },\n    scopeHasNamedStyle: function(scope, name) {\n      scope._scopeStyles = scope._scopeStyles || {};\n      return scope._scopeStyles[name];\n    }\n  };\n  \n  // NOTE: use raw prototype traversal so that we ensure correct traversal\n  // on platforms where the protoype chain is simulated via __proto__ (IE10)\n  function getPrototypeOf(prototype) {\n    return prototype.__proto__;\n  }\n\n  function shimCssText(cssText, host) {\n    var name = '', is = false;\n    if (host) {\n      name = host.localName;\n      is = host.hasAttribute('is');\n    }\n    var selector = Platform.ShadowCSS.makeScopeSelector(name, is);\n    return Platform.ShadowCSS.shimCssText(cssText, selector);\n  }\n\n  // exports\n\n  scope.api.instance.styles = styles;\n  \n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n\n  // imperative implementation: Polymer()\n\n  // specify an 'own' prototype for tag `name`\n  function element(name, prototype) {\n    if (arguments.length === 1 && typeof arguments[0] !== 'string') {\n      prototype = name;\n      var script = document._currentScript;\n      name = script && script.parentNode && script.parentNode.getAttribute ?\n          script.parentNode.getAttribute('name') : '';\n      if (!name) {\n        throw 'Element name could not be inferred.';\n      }\n    }\n    if (getRegisteredPrototype[name]) {\n      throw 'Already registered (Polymer) prototype for element ' + name;\n    }\n    // cache the prototype\n    registerPrototype(name, prototype);\n    // notify the registrar waiting for 'name', if any\n    notifyPrototype(name);\n  }\n\n  // async prototype source\n\n  function waitingForPrototype(name, client) {\n    waitPrototype[name] = client;\n  }\n\n  var waitPrototype = {};\n\n  function notifyPrototype(name) {\n    if (waitPrototype[name]) {\n      waitPrototype[name].registerWhenReady();\n      delete waitPrototype[name];\n    }\n  }\n\n  // utility and bookkeeping\n\n  // maps tag names to prototypes, as registered with\n  // Polymer. Prototypes associated with a tag name\n  // using document.registerElement are available from\n  // HTMLElement.getPrototypeForTag().\n  // If an element was fully registered by Polymer, then\n  // Polymer.getRegisteredPrototype(name) === \n  //   HTMLElement.getPrototypeForTag(name)\n\n  var prototypesByName = {};\n\n  function registerPrototype(name, prototype) {\n    return prototypesByName[name] = prototype || {};\n  }\n\n  function getRegisteredPrototype(name) {\n    return prototypesByName[name];\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  scope.waitingForPrototype = waitingForPrototype;\n\n  // namespace shenanigans so we can expose our scope on the registration \n  // function\n\n  // make window.Polymer reference `element()`\n\n  window.Polymer = element;\n\n  // TODO(sjmiles): find a way to do this that is less terrible\n  // copy window.Polymer properties onto `element()`\n\n  extend(Polymer, scope);\n\n  // Under the HTMLImports polyfill, scripts in the main document\n  // do not block on imports; we want to allow calls to Polymer in the main\n  // document. Platform collects those calls until we can process them, which\n  // we do here.\n\n  var declarations = Platform.deliverDeclarations();\n  if (declarations) {\n    for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {\n      element.apply(null, d);\n    }\n  }\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar path = {\n  resolveElementPaths: function(node) {\n    Platform.urlResolver.resolveDom(node);\n  },\n  addResolvePathApi: function() {\n    // let assetpath attribute modify the resolve path\n    var assetPath = this.getAttribute('assetpath') || '';\n    var root = new URL(assetPath, this.ownerDocument.baseURI);\n    this.prototype.resolvePath = function(urlPath, base) {\n      var u = new URL(urlPath, base || root);\n      return u.href;\n    };\n  }\n};\n\n// exports\nscope.api.declaration.path = path;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.styles;\n  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;\n\n  // magic words\n\n  var STYLE_SELECTOR = 'style';\n  var STYLE_LOADABLE_MATCH = '@import';\n  var SHEET_SELECTOR = 'link[rel=stylesheet]';\n  var STYLE_GLOBAL_SCOPE = 'global';\n  var SCOPE_ATTR = 'polymer-scope';\n\n  var styles = {\n    // returns true if resources are loading\n    loadStyles: function(callback) {\n      var template = this.fetchTemplate();\n      var content = template && this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n        var styles = this.findLoadableStyles(content);\n        if (styles.length) {\n          var templateUrl = template.ownerDocument.baseURI;\n          return Platform.styleResolver.loadStyles(styles, templateUrl, callback);\n        }\n      }\n      if (callback) {\n        callback();\n      }\n    },\n    convertSheetsToStyles: function(root) {\n      var s$ = root.querySelectorAll(SHEET_SELECTOR);\n      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {\n        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),\n            this.ownerDocument);\n        this.copySheetAttributes(c, s);\n        s.parentNode.replaceChild(c, s);\n      }\n    },\n    copySheetAttributes: function(style, link) {\n      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\n        if (a.name !== 'rel' && a.name !== 'href') {\n          style.setAttribute(a.name, a.value);\n        }\n      }\n    },\n    findLoadableStyles: function(root) {\n      var loadables = [];\n      if (root) {\n        var s$ = root.querySelectorAll(STYLE_SELECTOR);\n        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {\n          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {\n            loadables.push(s);\n          }\n        }\n      }\n      return loadables;\n    },\n    /**\n     * Install external stylesheets loaded in <polymer-element> elements into the \n     * element's template.\n     * @param elementElement The <element> element to style.\n     */\n    installSheets: function() {\n      this.cacheSheets();\n      this.cacheStyles();\n      this.installLocalSheets();\n      this.installGlobalStyles();\n    },\n    /**\n     * Remove all sheets from element and store for later use.\n     */\n    cacheSheets: function() {\n      this.sheets = this.findNodes(SHEET_SELECTOR);\n      this.sheets.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    cacheStyles: function() {\n      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');\n      this.styles.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    /**\n     * Takes external stylesheets loaded in an <element> element and moves\n     * their content into a <style> element inside the <element>'s template.\n     * The sheet is then removed from the <element>. This is done only so \n     * that if the element is loaded in the main document, the sheet does\n     * not become active.\n     * Note, ignores sheets with the attribute 'polymer-scope'.\n     * @param elementElement The <element> element to style.\n     */\n    installLocalSheets: function () {\n      var sheets = this.sheets.filter(function(s) {\n        return !s.hasAttribute(SCOPE_ATTR);\n      });\n      var content = this.templateContent();\n      if (content) {\n        var cssText = '';\n        sheets.forEach(function(sheet) {\n          cssText += cssTextFromSheet(sheet) + '\\n';\n        });\n        if (cssText) {\n          var style = createStyleElement(cssText, this.ownerDocument);\n          content.insertBefore(style, content.firstChild);\n        }\n      }\n    },\n    findNodes: function(selector, matcher) {\n      var nodes = this.querySelectorAll(selector).array();\n      var content = this.templateContent();\n      if (content) {\n        var templateNodes = content.querySelectorAll(selector).array();\n        nodes = nodes.concat(templateNodes);\n      }\n      return matcher ? nodes.filter(matcher) : nodes;\n    },\n    /**\n     * Promotes external stylesheets and <style> elements with the attribute \n     * polymer-scope='global' into global scope.\n     * This is particularly useful for defining @keyframe rules which \n     * currently do not function in scoped or shadow style elements.\n     * (See wkb.ug/72462)\n     * @param elementElement The <element> element to style.\n    */\n    // TODO(sorvell): remove when wkb.ug/72462 is addressed.\n    installGlobalStyles: function() {\n      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);\n      applyStyleToScope(style, document.head);\n    },\n    cssTextForScope: function(scopeDescriptor) {\n      var cssText = '';\n      // handle stylesheets\n      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';\n      var matcher = function(s) {\n        return matchesSelector(s, selector);\n      };\n      var sheets = this.sheets.filter(matcher);\n      sheets.forEach(function(sheet) {\n        cssText += cssTextFromSheet(sheet) + '\\n\\n';\n      });\n      // handle cached style elements\n      var styles = this.styles.filter(matcher);\n      styles.forEach(function(style) {\n        cssText += style.textContent + '\\n\\n';\n      });\n      return cssText;\n    },\n    styleForScope: function(scopeDescriptor) {\n      var cssText = this.cssTextForScope(scopeDescriptor);\n      return this.cssTextToScopeStyle(cssText, scopeDescriptor);\n    },\n    cssTextToScopeStyle: function(cssText, scopeDescriptor) {\n      if (cssText) {\n        var style = createStyleElement(cssText);\n        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +\n            '-' + scopeDescriptor);\n        return style;\n      }\n    }\n  };\n\n  function importRuleForSheet(sheet, baseUrl) {\n    var href = new URL(sheet.getAttribute('href'), baseUrl).href;\n    return '@import \\'' + href + '\\';';\n  }\n\n  function applyStyleToScope(style, scope) {\n    if (style) {\n      if (scope === document) {\n        scope = document.head;\n      }\n      if (window.ShadowDOMPolyfill) {\n        scope = document.head;\n      }\n      // TODO(sorvell): necessary for IE\n      // see https://connect.microsoft.com/IE/feedback/details/790212/\n      // cloning-a-style-element-and-adding-to-document-produces\n      // -unexpected-result#details\n      // var clone = style.cloneNode(true);\n      var clone = createStyleElement(style.textContent);\n      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);\n      if (attr) {\n        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);\n      }\n      // TODO(sorvell): probably too brittle; try to figure out \n      // where to put the element.\n      var refNode = scope.firstElementChild;\n      if (scope === document.head) {\n        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';\n        var s$ = document.head.querySelectorAll(selector);\n        if (s$.length) {\n          refNode = s$[s$.length-1].nextElementSibling;\n        }\n      }\n      scope.insertBefore(clone, refNode);\n    }\n  }\n\n  function createStyleElement(cssText, scope) {\n    scope = scope || document;\n    scope = scope.createElement ? scope : scope.ownerDocument;\n    var style = scope.createElement('style');\n    style.textContent = cssText;\n    return style;\n  }\n\n  function cssTextFromSheet(sheet) {\n    return (sheet && sheet.__resource) || '';\n  }\n\n  function matchesSelector(node, inSelector) {\n    if (matches) {\n      return matches.call(node, inSelector);\n    }\n  }\n  var p = HTMLElement.prototype;\n  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector \n      || p.mozMatchesSelector;\n  \n  // exports\n\n  scope.api.declaration.styles = styles;\n  scope.applyStyleToScope = applyStyleToScope;\n  \n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.events;\n  var EVENT_PREFIX = api.EVENT_PREFIX;\n  // polymer-element declarative api: events feature\n\n  var mixedCaseEventTypes = {};\n  [\n    'webkitAnimationStart',\n    'webkitAnimationEnd',\n    'webkitTransitionEnd',\n    'DOMFocusOut',\n    'DOMFocusIn',\n    'DOMMouseScroll'\n  ].forEach(function(e) {\n    mixedCaseEventTypes[e.toLowerCase()] = e;\n  });\n\n  var events = {\n    parseHostEvents: function() {\n      // our delegates map\n      var delegates = this.prototype.eventDelegates;\n      // extract data from attributes into delegates\n      this.addAttributeDelegates(delegates);\n    },\n    addAttributeDelegates: function(delegates) {\n      // for each attribute\n      for (var i=0, a; a=this.attributes[i]; i++) {\n        // does it have magic marker identifying it as an event delegate?\n        if (this.hasEventPrefix(a.name)) {\n          // if so, add the info to delegates\n          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')\n              .replace('}}', '').trim();\n        }\n      }\n    },\n    // starts with 'on-'\n    hasEventPrefix: function (n) {\n      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');\n    },\n    removeEventPrefix: function(n) {\n      return n.slice(prefixLength);\n    },\n    findController: function(node) {\n      while (node.parentNode) {\n        if (node.eventController) {\n          return node.eventController;\n        }\n        node = node.parentNode;\n      }\n      return node.host;\n    },\n    getEventHandler: function(controller, target, method) {\n      var events = this;\n      return function(e) {\n        if (!controller || !controller.PolymerBase) {\n          controller = events.findController(target);\n        }\n\n        var args = [e, e.detail, e.currentTarget];\n        controller.dispatchMethod(controller, method, args);\n      };\n    },\n    prepareEventBinding: function(pathString, name, node) {\n      if (!this.hasEventPrefix(name))\n        return;\n\n      var eventType = this.removeEventPrefix(name);\n      eventType = mixedCaseEventTypes[eventType] || eventType;\n\n      var events = this;\n\n      return function(model, node, oneTime) {\n        var handler = events.getEventHandler(undefined, node, pathString);\n        node.addEventListener(eventType, handler);\n\n        if (oneTime)\n          return;\n\n        // TODO(rafaelw): This is really pointless work. Aside from the cost\n        // of these allocations, NodeBind is going to setAttribute back to its\n        // current value. Fixing this would mean changing the TemplateBinding\n        // binding delegate API.\n        function bindingValue() {\n          return '{{ ' + pathString + ' }}';\n        }\n\n        return {\n          open: bindingValue,\n          discardChanges: bindingValue,\n          close: function() {\n            node.removeEventListener(eventType, handler);\n          }\n        };\n      };\n    }\n  };\n\n  var prefixLength = EVENT_PREFIX.length;\n\n  // exports\n  scope.api.declaration.events = events;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // element api\n\n  var properties = {\n    inferObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var observe = prototype.observe, property;\n      for (var n in prototype) {\n        if (n.slice(-7) === 'Changed') {\n          if (!observe) {\n            observe  = (prototype.observe = {});\n          }\n          property = n.slice(0, -7)\n          observe[property] = observe[property] || n;\n        }\n      }\n    },\n    explodeObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var o = prototype.observe;\n      if (o) {\n        var exploded = {};\n        for (var n in o) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            exploded[ni] = o[n];\n          }\n        }\n        prototype.observe = exploded;\n      }\n    },\n    optimizePropertyMaps: function(prototype) {\n      if (prototype.observe) {\n        // construct name list\n        var a = prototype._observeNames = [];\n        for (var n in prototype.observe) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            a.push(ni);\n          }\n        }\n      }\n      if (prototype.publish) {\n        // construct name list\n        var a = prototype._publishNames = [];\n        for (var n in prototype.publish) {\n          a.push(n);\n        }\n      }\n      if (prototype.computed) {\n        // construct name list\n        var a = prototype._computedNames = [];\n        for (var n in prototype.computed) {\n          a.push(n);\n        }\n      }\n    },\n    publishProperties: function(prototype, base) {\n      // if we have any properties to publish\n      var publish = prototype.publish;\n      if (publish) {\n        // transcribe `publish` entries onto own prototype\n        this.requireProperties(publish, prototype, base);\n        // construct map of lower-cased property names\n        prototype._publishLC = this.lowerCaseMap(publish);\n      }\n    },\n    // sync prototype to property descriptors;\n    // desriptor format contains default value and optionally a\n    // hint for reflecting the property to an attribute.\n    // e.g. {foo: 5, bar: {value: true, reflect: true}}\n    // reflect: {foo: true} is also supported\n    //\n    requireProperties: function(propertyDescriptors, prototype, base) {\n      // reflected properties\n      prototype.reflect = prototype.reflect || {};\n      // ensure a prototype value for each property\n      // and update the property's reflect to attribute status\n      for (var n in propertyDescriptors) {\n        var propertyDescriptor = propertyDescriptors[n];\n        var reflects = this.reflectHintForDescriptor(propertyDescriptor);\n        if (prototype.reflect[n] === undefined && reflects !== undefined) {\n          prototype.reflect[n] = reflects;\n        }\n        if (prototype[n] === undefined) {\n          prototype[n] = this.valueForDescriptor(propertyDescriptor);\n        }\n      }\n    },\n    valueForDescriptor: function(propertyDescriptor) {\n      var value = typeof propertyDescriptor === 'object' &&\n          propertyDescriptor ? propertyDescriptor.value : propertyDescriptor;\n      return value !== undefined ? value : null;\n    },\n    // returns the value of the descriptor's 'reflect' property or undefined\n    reflectHintForDescriptor: function(propertyDescriptor) {\n      if (typeof propertyDescriptor === 'object' &&\n          propertyDescriptor && propertyDescriptor.reflect !== undefined) {\n        return propertyDescriptor.reflect;\n      }\n    },\n    lowerCaseMap: function(properties) {\n      var map = {};\n      for (var n in properties) {\n        map[n.toLowerCase()] = n;\n      }\n      return map;\n    },\n    createPropertyAccessor: function(name) {\n      var proto = this.prototype;\n\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n      proto[privateName] = proto[name];\n\n      Object.defineProperty(proto, name, {\n        get: function() {\n          var observable = this[privateObservable];\n          if (observable)\n            observable.deliver();\n\n          return this[privateName];\n        },\n        set: function(value) {\n          var observable = this[privateObservable];\n          if (observable) {\n            observable.setValue(value);\n            return;\n          }\n\n          var oldValue = this[privateName];\n          this[privateName] = value;\n          this.emitPropertyChangeRecord(name, value, oldValue);\n\n          return value;\n        },\n        configurable: true\n      });\n    },\n    createPropertyAccessors: function(prototype) {\n      var n$ = prototype._publishNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n\n      var n$ = prototype._computedNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n\n    }\n  };\n\n  // exports\n\n  scope.api.declaration.properties = properties;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // magic words\n\n  var ATTRIBUTES_ATTRIBUTE = 'attributes';\n  var ATTRIBUTES_REGEX = /\\s|,/;\n\n  // attributes api\n\n  var attributes = {\n    \n    inheritAttributesObjects: function(prototype) {\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject(prototype, 'publishLC');\n      // chain our instance attributes map to the inherited version\n      this.inheritObject(prototype, '_instanceAttributes');\n    },\n\n    publishAttributes: function(prototype, base) {\n      // merge names from 'attributes' attribute\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // get properties to publish\n        var publish = prototype.publish || (prototype.publish = {});\n        // names='a b c' or names='a,b,c'\n        var names = attributes.split(ATTRIBUTES_REGEX);\n        // record each name for publishing\n        for (var i=0, l=names.length, n; i<l; i++) {\n          // remove excess ws\n          n = names[i].trim();\n          // if the user hasn't specified a value, we want to use the\n          // default, unless a superclass has already chosen one\n          if (n && publish[n] === undefined) {\n            // TODO(sjmiles): querying native properties on IE11 (and possibly\n            // on other browsers) throws an exception because there is no actual\n            // instance.\n            // In fact, trying to publish native properties is known bad for this\n            // and other reasons, and we need to solve this problem writ large.\n            try {\n              var hasValue = (base[n] !== undefined);\n            } catch(x) {\n              hasValue = false;\n            }\n            // supply an empty 'descriptor' object and let the publishProperties\n            // code determine a default\n            if (!hasValue) {\n              publish[n] = Polymer.nob;\n            }\n          }\n        }\n      }\n    },\n\n    // record clonable attributes from <element>\n    accumulateInstanceAttributes: function() {\n      // inherit instance attributes\n      var clonable = this.prototype._instanceAttributes;\n      // merge attributes from element\n      var a$ = this.attributes;\n      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  \n        if (this.isInstanceAttribute(a.name)) {\n          clonable[a.name] = a.value;\n        }\n      }\n    },\n\n    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\n    },\n\n    // do not clone these attributes onto instances\n    blackList: {\n      name: 1,\n      'extends': 1,\n      constructor: 1,\n      noscript: 1,\n      assetpath: 1,\n      'cache-csstext': 1\n    }\n    \n  };\n\n  // add ATTRIBUTES_ATTRIBUTE to the blacklist\n  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;\n\n  // exports\n\n  scope.api.declaration.attributes = attributes;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  var events = scope.api.declaration.events;\n\n  var syntax = new PolymerExpressions();\n  var prepareBinding = syntax.prepareBinding;\n\n  // Polymer takes a first crack at the binding to see if it's a declarative\n  // event handler.\n  syntax.prepareBinding = function(pathString, name, node) {\n    return events.prepareEventBinding(pathString, name, node) ||\n           prepareBinding.call(syntax, pathString, name, node);\n  };\n\n  // declaration api supporting mdv\n  var mdv = {\n    syntax: syntax,\n    fetchTemplate: function() {\n      return this.querySelector('template');\n    },\n    templateContent: function() {\n      var template = this.fetchTemplate();\n      return template && Platform.templateContent(template);\n    },\n    installBindingDelegate: function(template) {\n      if (template) {\n        template.bindingDelegate = this.syntax;\n      }\n    }\n  };\n\n  // exports\n  scope.api.declaration.mdv = mdv;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  \n  var api = scope.api;\n  var isBase = scope.isBase;\n  var extend = scope.extend;\n\n  // prototype api\n\n  var prototype = {\n\n    register: function(name, extendeeName) {\n      // build prototype combining extendee, Polymer base, and named api\n      this.buildPrototype(name, extendeeName);\n      // register our custom element with the platform\n      this.registerPrototype(name, extendeeName);\n      // reference constructor in a global named by 'constructor' attribute\n      this.publishConstructor();\n    },\n\n    buildPrototype: function(name, extendeeName) {\n      // get our custom prototype (before chaining)\n      var extension = scope.getRegisteredPrototype(name);\n      // get basal prototype\n      var base = this.generateBasePrototype(extendeeName);\n      // implement declarative features\n      this.desugarBeforeChaining(extension, base);\n      // join prototypes\n      this.prototype = this.chainPrototypes(extension, base);\n      // more declarative features\n      this.desugarAfterChaining(name, extendeeName);\n    },\n\n    desugarBeforeChaining: function(prototype, base) {\n      // back reference declaration element\n      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`\n      prototype.element = this;\n      // transcribe `attributes` declarations onto own prototype's `publish`\n      this.publishAttributes(prototype, base);\n      // `publish` properties to the prototype and to attribute watch\n      this.publishProperties(prototype, base);\n      // infer observers for `observe` list based on method names\n      this.inferObservers(prototype);\n      // desugar compound observer syntax, e.g. 'a b c' \n      this.explodeObservers(prototype);\n    },\n\n    chainPrototypes: function(prototype, base) {\n      // chain various meta-data objects to inherited versions\n      this.inheritMetaData(prototype, base);\n      // chain custom api to inherited\n      var chained = this.chainObject(prototype, base);\n      // x-platform fixup\n      ensurePrototypeTraversal(chained);\n      return chained;\n    },\n\n    inheritMetaData: function(prototype, base) {\n      // chain observe object to inherited\n      this.inheritObject('observe', prototype, base);\n      // chain publish object to inherited\n      this.inheritObject('publish', prototype, base);\n      // chain reflect object to inherited\n      this.inheritObject('reflect', prototype, base);\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject('_publishLC', prototype, base);\n      // chain our instance attributes map to the inherited version\n      this.inheritObject('_instanceAttributes', prototype, base);\n      // chain our event delegates map to the inherited version\n      this.inheritObject('eventDelegates', prototype, base);\n    },\n\n    // implement various declarative features\n    desugarAfterChaining: function(name, extendee) {\n      // build side-chained lists to optimize iterations\n      this.optimizePropertyMaps(this.prototype);\n      this.createPropertyAccessors(this.prototype);\n      // install mdv delegate on template\n      this.installBindingDelegate(this.fetchTemplate());\n      // install external stylesheets as if they are inline\n      this.installSheets();\n      // adjust any paths in dom from imports\n      this.resolveElementPaths(this);\n      // compile list of attributes to copy to instances\n      this.accumulateInstanceAttributes();\n      // parse on-* delegates declared on `this` element\n      this.parseHostEvents();\n      //\n      // install a helper method this.resolvePath to aid in \n      // setting resource urls. e.g.\n      // this.$.image.src = this.resolvePath('images/foo.png')\n      this.addResolvePathApi();\n      // under ShadowDOMPolyfill, transforms to approximate missing CSS features\n      if (window.ShadowDOMPolyfill) {\n        Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);\n      }\n      // allow custom element access to the declarative context\n      if (this.prototype.registerCallback) {\n        this.prototype.registerCallback(this);\n      }\n    },\n\n    // if a named constructor is requested in element, map a reference\n    // to the constructor to the given symbol\n    publishConstructor: function() {\n      var symbol = this.getAttribute('constructor');\n      if (symbol) {\n        window[symbol] = this.ctor;\n      }\n    },\n\n    // build prototype combining extendee, Polymer base, and named api\n    generateBasePrototype: function(extnds) {\n      var prototype = this.findBasePrototype(extnds);\n      if (!prototype) {\n        // create a prototype based on tag-name extension\n        var prototype = HTMLElement.getPrototypeForTag(extnds);\n        // insert base api in inheritance chain (if needed)\n        prototype = this.ensureBaseApi(prototype);\n        // memoize this base\n        memoizedBases[extnds] = prototype;\n      }\n      return prototype;\n    },\n\n    findBasePrototype: function(name) {\n      return memoizedBases[name];\n    },\n\n    // install Polymer instance api into prototype chain, as needed \n    ensureBaseApi: function(prototype) {\n      if (prototype.PolymerBase) {\n        return prototype;\n      }\n      var extended = Object.create(prototype);\n      // we need a unique copy of base api for each base prototype\n      // therefore we 'extend' here instead of simply chaining\n      api.publish(api.instance, extended);\n      // TODO(sjmiles): sharing methods across prototype chains is\n      // not supported by 'super' implementation which optimizes\n      // by memoizing prototype relationships.\n      // Probably we should have a version of 'extend' that is \n      // share-aware: it could study the text of each function,\n      // look for usage of 'super', and wrap those functions in\n      // closures.\n      // As of now, there is only one problematic method, so \n      // we just patch it manually.\n      // To avoid re-entrancy problems, the special super method\n      // installed is called `mixinSuper` and the mixin method\n      // must use this method instead of the default `super`.\n      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');\n      // return buffed-up prototype\n      return extended;\n    },\n\n    mixinMethod: function(extended, prototype, api, name) {\n      var $super = function(args) {\n        return prototype[name].apply(this, args);\n      };\n      extended[name] = function() {\n        this.mixinSuper = $super;\n        return api[name].apply(this, arguments);\n      }\n    },\n\n    // ensure prototype[name] inherits from a prototype.prototype[name]\n    inheritObject: function(name, prototype, base) {\n      // require an object\n      var source = prototype[name] || {};\n      // chain inherited properties onto a new object\n      prototype[name] = this.chainObject(source, base[name]);\n    },\n\n    // register 'prototype' to custom element 'name', store constructor \n    registerPrototype: function(name, extendee) { \n      var info = {\n        prototype: this.prototype\n      }\n      // native element must be specified in extends\n      var typeExtension = this.findTypeExtension(extendee);\n      if (typeExtension) {\n        info.extends = typeExtension;\n      }\n      // register the prototype with HTMLElement for name lookup\n      HTMLElement.register(name, this.prototype);\n      // register the custom type\n      this.ctor = document.registerElement(name, info);\n    },\n\n    findTypeExtension: function(name) {\n      if (name && name.indexOf('-') < 0) {\n        return name;\n      } else {\n        var p = this.findBasePrototype(name);\n        if (p.element) {\n          return this.findTypeExtension(p.element.extends);\n        }\n      }\n    }\n\n  };\n\n  // memoize base prototypes\n  var memoizedBases = {};\n\n  // implementation of 'chainObject' depends on support for __proto__\n  if (Object.__proto__) {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        object.__proto__ = inherited;\n      }\n      return object;\n    }\n  } else {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        var chained = Object.create(inherited);\n        object = extend(chained, object);\n      }\n      return object;\n    }\n  }\n\n  // On platforms that do not support __proto__ (versions of IE), the prototype\n  // chain of a custom element is simulated via installation of __proto__.\n  // Although custom elements manages this, we install it here so it's\n  // available during desugaring.\n  function ensurePrototypeTraversal(prototype) {\n    if (!Object.__proto__) {\n      var ancestor = Object.getPrototypeOf(prototype);\n      prototype.__proto__ = ancestor;\n      if (isBase(ancestor)) {\n        ancestor.__proto__ = Object.getPrototypeOf(ancestor);\n      }\n    }\n  }\n\n  // exports\n\n  api.declaration.prototype = prototype;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  /*\n\n    Elements are added to a registration queue so that they register in \n    the proper order at the appropriate time. We do this for a few reasons:\n\n    * to enable elements to load resources (like stylesheets) \n    asynchronously. We need to do this until the platform provides an efficient\n    alternative. One issue is that remote @import stylesheets are \n    re-fetched whenever stamped into a shadowRoot.\n\n    * to ensure elements loaded 'at the same time' (e.g. via some set of\n    imports) are registered as a batch. This allows elements to be enured from\n    upgrade ordering as long as they query the dom tree 1 task after\n    upgrade (aka domReady). This is a performance tradeoff. On the one hand,\n    elements that could register while imports are loading are prevented from \n    doing so. On the other, grouping upgrades into a single task means less\n    incremental work (for example style recalcs),  Also, we can ensure the \n    document is in a known state at the single quantum of time when \n    elements upgrade.\n\n  */\n  var queue = {\n    // tell the queue to wait for an element to be ready\n    wait: function(element, check, go) {\n      var shouldAdd = (this.indexOf(element) === -1 && \n          flushQueue.indexOf(element) === -1);\n      if (shouldAdd) {\n        this.add(element);\n        element.__check = check;\n        element.__go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n    add: function(element) {\n      //console.log('queueing', element.name);\n      queueForElement(element).push(element);\n    },\n    indexOf: function(element) {\n      var i = queueForElement(element).indexOf(element);\n      if (i >= 0 && document.contains(element)) {\n        i += (HTMLImports.useNative || HTMLImports.ready) ? \n          importQueue.length : 1e9;\n      }\n      return i;  \n    },\n    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        this.addToFlushQueue(readied);\n        this.check();\n      }\n    },\n    remove: function(element) {\n      var i = this.indexOf(element);\n      if (i !== 0) {\n        //console.warn('queue order wrong', i);\n        return;\n      }\n      return queueForElement(element).shift();\n    },\n    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n    nextElement: function() {\n      return nextQueued();\n    },\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n    isEmpty: function() {\n      return !importQueue.length && !mainQueue.length;\n    },\n    addToFlushQueue: function(element) {\n      flushQueue.push(element);  \n    },\n    flush: function() {\n      var element;\n      while (flushQueue.length) {\n        element = flushQueue.shift();\n        element.__go.call(element);\n        element.__check = element.__go = null;\n      }\n    },\n    ready: function() {\n      this.flush();\n      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading\n      // while registering. This way we avoid having to upgrade each document\n      // piecemeal per registration and can instead register all elements\n      // and upgrade once in a batch. Without this optimization, upgrade time\n      // degrades significantly when SD polyfill is used. This is mainly because\n      // querying the document tree for elements is slow under the SD polyfill.\n      if (CustomElements.ready === false) {\n        CustomElements.upgradeDocumentTree(document);\n        CustomElements.ready = true;\n      }\n      Platform.flush();\n      requestAnimationFrame(this.flushReadyCallbacks);\n    },\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n    flushReadyCallbacks: function() {\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n    waitToReady: true\n  };\n\n  var flushQueue = [];\n\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  var polymerReadied = false; \n\n  document.addEventListener('WebComponentsReady', function() {\n    CustomElements.ready = false;\n  });\n  \n  function whenPolymerReady(callback) {\n    queue.waitToReady = true;\n    CustomElements.ready = false;\n    HTMLImports.whenImportsReady(function() {\n      queue.addReadyCallback(callback);\n      queue.waitToReady = false;\n      queue.check();\n    });\n  }\n\n  // exports\n  scope.queue = queue;\n  scope.whenPolymerReady = whenPolymerReady;\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var whenPolymerReady = scope.whenPolymerReady;\n\n  function importElements(elementOrFragment, callback) {\n    if (elementOrFragment) {\n      document.head.appendChild(elementOrFragment);\n      whenPolymerReady(callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  function importUrls(urls, callback) {\n    if (urls && urls.length) {\n        var frag = document.createDocumentFragment();\n        for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {\n          link = document.createElement('link');\n          link.rel = 'import';\n          link.href = url;\n          frag.appendChild(link);\n        }\n        importElements(frag, callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  // exports\n  scope.import = importUrls;\n  scope.importElements = importElements;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n  var queue = scope.queue;\n  var whenPolymerReady = scope.whenPolymerReady;\n  var getRegisteredPrototype = scope.getRegisteredPrototype;\n  var waitingForPrototype = scope.waitingForPrototype;\n\n  // declarative implementation: <polymer-element>\n\n  var prototype = extend(Object.create(HTMLElement.prototype), {\n\n    createdCallback: function() {\n      if (this.getAttribute('name')) {\n        this.init();\n      }\n    },\n\n    init: function() {\n      // fetch declared values\n      this.name = this.getAttribute('name');\n      this.extends = this.getAttribute('extends');\n      // initiate any async resource fetches\n      this.loadResources();\n      // register when all constraints are met\n      this.registerWhenReady();\n    },\n\n    registerWhenReady: function() {\n     if (this.registered\n       || this.waitingForPrototype(this.name)\n       || this.waitingForQueue()\n       || this.waitingForResources()) {\n          return;\n      }\n      // TODO(sorvell): ends up calling '_register' by virtue\n      // of `waitingForQueue` (see below)\n      queue.go(this);\n    },\n\n    // TODO(sorvell): refactor, this method is private-ish, but it's being\n    // called by the queue object.\n    _register: function() {\n      //console.log('registering', this.name);\n      //console.group('registering', this.name);\n      // warn if extending from a custom element not registered via Polymer\n      if (isCustomTag(this.extends) && !isRegistered(this.extends)) {\n        console.warn('%s is attempting to extend %s, an unregistered element ' +\n            'or one that was not registered with Polymer.', this.name,\n            this.extends);\n      }\n      this.register(this.name, this.extends);\n      this.registered = true;\n      //console.groupEnd();\n    },\n\n    waitingForPrototype: function(name) {\n      if (!getRegisteredPrototype(name)) {\n        // then wait for a prototype\n        waitingForPrototype(name, this);\n        // emulate script if user is not supplying one\n        this.handleNoScript(name);\n        // prototype not ready yet\n        return true;\n      }\n    },\n\n    handleNoScript: function(name) {\n      // if explicitly marked as 'noscript'\n      if (this.hasAttribute('noscript') && !this.noscript) {\n        this.noscript = true;\n        // TODO(sorvell): CustomElements polyfill awareness:\n        // noscript elements should upgrade in logical order\n        // script injection ensures this under native custom elements;\n        // under imports + ce polyfills, scripts run before upgrades.\n        // dependencies should be ready at upgrade time so register\n        // prototype at this time.\n        if (window.CustomElements && !CustomElements.useNative) {\n          Polymer(name);\n        } else {\n          var script = document.createElement('script');\n          script.textContent = 'Polymer(\\'' + name + '\\');';\n          this.appendChild(script);\n        }\n      }\n    },\n\n    waitingForResources: function() {\n      return this._needsResources;\n    },\n\n    // NOTE: Elements must be queued in proper order for inheritance/composition\n    // dependency resolution. Previously this was enforced for inheritance,\n    // and by rule for composition. It's now entirely by rule.\n    waitingForQueue: function() {\n      return queue.wait(this, this.registerWhenReady, this._register);\n    },\n\n    loadResources: function() {\n      this._needsResources = true;\n      this.loadStyles(function() {\n        this._needsResources = false;\n        this.registerWhenReady();\n      }.bind(this));\n    }\n\n  });\n\n  // semi-pluggable APIs \n\n  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently\n  // the various plugins are allowed to depend on each other directly)\n  api.publish(api.declaration, prototype);\n\n  // utility and bookkeeping\n\n  function isRegistered(name) {\n    return Boolean(HTMLElement.getPrototypeForTag(name));\n  }\n\n  function isCustomTag(name) {\n    return (name && name.indexOf('-') >= 0);\n  }\n\n  // boot tasks\n\n  whenPolymerReady(function() {\n    document.body.removeAttribute('unresolved');\n    document.dispatchEvent(\n      new CustomEvent('polymer-ready', {bubbles: true})\n    );\n  });\n\n  // register polymer-element with document\n\n  document.registerElement('polymer-element', {prototype: prototype});\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * The `auto-binding` element extends the template element. It provides a quick \n * and easy way to do data binding without the need to setup a model. \n * The `auto-binding` element itself serves as the model and controller for the \n * elements it contains. Both data and event handlers can be bound. \n *\n * The `auto-binding` element acts just like a template that is bound to \n * a model. It stamps its content in the dom adjacent to itself. When the \n * content is stamped, the `template-bound` event is fired.\n *\n * Example:\n *\n *     <template is=\"auto-binding\">\n *       <div>Say something: <input value=\"{{value}}\"></div>\n *       <div>You said: {{value}}</div>\n *       <button on-tap=\"{{buttonTap}}\">Tap me!</button>\n *     </template>\n *     <script>\n *       var template = document.querySelector('template');\n *       template.value = 'something';\n *       template.buttonTap = function() {\n *         console.log('tap!');\n *       };\n *     </script>\n *\n * @module Polymer\n * @status stable\n*/\n\n(function() {\n\n  var element = document.createElement('polymer-element');\n  element.setAttribute('name', 'auto-binding');\n  element.setAttribute('extends', 'template');\n  element.init();\n\n  Polymer('auto-binding', {\n\n    createdCallback: function() {\n      this.syntax = this.bindingDelegate = this.makeSyntax();\n      // delay stamping until polymer-ready so that auto-binding is not\n      // required to load last.\n      Polymer.whenPolymerReady(function() {\n        this.model = this;\n        this.setAttribute('bind', '');\n        // we don't bother with an explicit signal here, we could ust a MO\n        // if necessary\n        this.async(function() {\n          // note: this will marshall *all* the elements in the parentNode\n          // rather than just stamped ones. We'd need to use createInstance\n          // to fix this or something else fancier.\n          this.marshalNodeReferences(this.parentNode);\n          // template stamping is asynchronous so stamping isn't complete\n          // by polymer-ready; fire an event so users can use stamped elements\n          this.fire('template-bound');\n        });\n      }.bind(this));\n    },\n\n    makeSyntax: function() {\n      var events = Object.create(Polymer.api.declaration.events);\n      var self = this;\n      events.findController = function() { return self.model; };\n\n      var syntax = new PolymerExpressions();\n      var prepareBinding = syntax.prepareBinding;  \n      syntax.prepareBinding = function(pathString, name, node) {\n        return events.prepareEventBinding(pathString, name, node) ||\n               prepareBinding.call(syntax, pathString, name, node);\n      };\n      return syntax;\n    }\n\n  });\n\n})();\n"]}