🦊StackFox
centravet.net logo

centravet.net

Detected Technologies

Visit Site
12 technologies4 categories

centravet.net is built on Angular with Mandrill and SparkPost.

Tech Stack Highlights

Frameworks & Languages1

angular.io logo
Angular
JavaScript frameworks
75%
1 evidence signal
DOMangular-version

Analytics & Marketing2

M
Mandrill
Email
95%
1 evidence signal
dnsSPF includes mandrillapp.com
S
SparkPost
Email
95%
1 evidence signal
dnsSPF includes sparkpostmail.com

Infrastructure & Security2

www.rfc-editor.org logo
HSTS
Security
75%
1 evidence signal
Headermax-age=63072000; includeSubDomains; preload
nginx.org logo
Nginx
Web servers
75%
1 evidence signal
Headernginx(?:/([\d.]+))?\;version:\1: nginx

Libraries & Utilities7

underscorejs.org logo
Underscore.js
JavaScript libraries
75%
1 evidence signal
Scriptdata:text/javascript;charset=utf-8,(function%20()%20%7B%0A%20%20'use%20strict'%3B%0A%20%20%2F**%20%40const%20%7BObject%7D%20*%2F%0A%0A%20%20const%20CaseMap%20%3D%20Polymer.CaseMap%3B%20%2F%2F%20Monotonically%20increasing%20unique%20ID%20used%20for%20de-duping%20effects%20triggered%0A%20%20%2F%2F%20from%20multiple%20properties%20in%20the%20same%20turn%0A%0A%20%20let%20dedupeId%20%3D%200%3B%0A%20%20%2F**%0A%20%20%20*%20Property%20effect%20types%3B%20effects%20are%20stored%20on%20the%20prototype%20using%20these%20keys%0A%20%20%20*%20%40enum%20%7Bstring%7D%0A%20%20%20*%2F%0A%0A%20%20const%20TYPES%20%3D%20%7B%0A%20%20%20%20COMPUTE%3A%20'__computeEffects'%2C%0A%20%20%20%20REFLECT%3A%20'__reflectEffects'%2C%0A%20%20%20%20NOTIFY%3A%20'__notifyEffects'%2C%0A%20%20%20%20PROPAGATE%3A%20'__propagateEffects'%2C%0A%20%20%20%20OBSERVE%3A%20'__observeEffects'%2C%0A%20%20%20%20READ_ONLY%3A%20'__readOnly'%0A%20%20%7D%3B%0A%20%20%2F**%20%40const%20%7BRegExp%7D%20*%2F%0A%0A%20%20const%20capitalAttributeRegex%20%3D%20%2F%5BA-Z%5D%2F%3B%0A%20%20%2F**%0A%20%20%20*%20%40typedef%20%7B%7B%0A%20%20%20*%20name%3A%20(string%20%7C%20undefined)%2C%0A%20%20%20*%20structured%3A%20(boolean%20%7C%20undefined)%2C%0A%20%20%20*%20wildcard%3A%20(boolean%20%7C%20undefined)%0A%20%20%20*%20%7D%7D%0A%20%20%20*%2F%0A%0A%20%20let%20DataTrigger%3B%20%2F%2Feslint-disable-line%20no-unused-vars%0A%0A%20%20%2F**%0A%20%20%20*%20%40typedef%20%7B%7B%0A%20%20%20*%20info%3A%20%3F%2C%0A%20%20%20*%20trigger%3A%20(!DataTrigger%20%7C%20undefined)%2C%0A%20%20%20*%20fn%3A%20(!Function%20%7C%20undefined)%0A%20%20%20*%20%7D%7D%0A%20%20%20*%2F%0A%0A%20%20let%20DataEffect%3B%20%2F%2Feslint-disable-line%20no-unused-vars%0A%0A%20%20let%20PropertyEffectsType%3B%20%2F%2Feslint-disable-line%20no-unused-vars%0A%0A%20%20%2F**%0A%20%20%20*%20Ensures%20that%20the%20model%20has%20an%20own-property%20map%20of%20effects%20for%20the%20given%20type.%0A%20%20%20*%20The%20model%20may%20be%20a%20prototype%20or%20an%20instance.%0A%20%20%20*%0A%20%20%20*%20Property%20effects%20are%20stored%20as%20arrays%20of%20effects%20by%20property%20in%20a%20map%2C%0A%20%20%20*%20by%20named%20type%20on%20the%20model.%20e.g.%0A%20%20%20*%0A%20%20%20*%20%20%20__computeEffects%3A%20%7B%0A%20%20%20*%20%20%20%20%20foo%3A%20%5B%20...%20%5D%2C%0A%20%20%20*%20%20%20%20%20bar%3A%20%5B%20...%20%5D%0A%20%20%20*%20%20%20%7D%0A%20%20%20*%0A%20%20%20*%20If%20the%20model%20does%20not%20yet%20have%20an%20effect%20map%20for%20the%20type%2C%20one%20is%20created%0A%20%20%20*%20and%20returned.%20%20If%20it%20does%2C%20but%20it%20is%20not%20an%20own%20property%20(i.e.%20the%0A%20%20%20*%20prototype%20had%20effects)%2C%20the%20the%20map%20is%20deeply%20cloned%20and%20the%20copy%20is%0A%20%20%20*%20set%20on%20the%20model%20and%20returned%2C%20ready%20for%20new%20effects%20to%20be%20added.%0A%20%20%20*%0A%20%20%20*%20%40param%20%7BObject%7D%20model%20Prototype%20or%20instance%0A%20%20%20*%20%40param%20%7Bstring%7D%20type%20Property%20effect%20type%0A%20%20%20*%20%40return%20%7BObject%7D%20The%20own-property%20map%20of%20effects%20for%20the%20given%20type%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%20%20function%20ensureOwnEffectMap(model%2C%20type)%20%7B%0A%20%20%20%20let%20effects%20%3D%20model%5Btype%5D%3B%0A%0A%20%20%20%20if%20(!effects)%20%7B%0A%20%20%20%20%20%20effects%20%3D%20model%5Btype%5D%20%3D%20%7B%7D%3B%0A%20%20%20%20%7D%20else%20if%20(!model.hasOwnProperty(type))%20%7B%0A%20%20%20%20%20%20effects%20%3D%20model%5Btype%5D%20%3D%20Object.create(model%5Btype%5D)%3B%0A%0A%20%20%20%20%20%20for%20(let%20p%20in%20effects)%20%7B%0A%20%20%20%20%20%20%20%20let%20protoFx%20%3D%20effects%5Bp%5D%3B%0A%20%20%20%20%20%20%20%20let%20instFx%20%3D%20effects%5Bp%5D%20%3D%20Array(protoFx.length)%3B%0A%0A%20%20%20%20%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%20protoFx.length%3B%20i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20instFx%5Bi%5D%20%3D%20protoFx%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20effects%3B%0A%20%20%7D%20%2F%2F%20--%20effects%20----------------------------------------------%0A%0A%20%20%2F**%0A%20%20%20*%20Runs%20all%20effects%20of%20a%20given%20type%20for%20the%20given%20set%20of%20property%20changes%0A%20%20%20*%20on%20an%20instance.%0A%20%20%20*%0A%20%20%20*%20%40param%20%7B!PropertyEffectsType%7D%20inst%20The%20instance%20with%20effects%20to%20run%0A%20%20%20*%20%40param%20%7BObject%7D%20effects%20Object%20map%20of%20property-to-Array%20of%20effects%0A%20%20%20*%20%40param%20%7BObject%7D%20props%20Bag%20of%20current%20property%20changes%0A%20%20%20*%20%40param%20%7BObject%3D%7D%20oldProps%20Bag%20of%20previous%20values%20for%20changed%20properties%0A%20%20%20*%20%40param%20%7Bboolean%3D%7D%20hasPaths%20True%20with%20%60props%60%20contains%20one%20or%20more%20paths%0A%20%20%20*%20%40param%20%7B*%3D%7D%20extraArgs%20Additional%20metadata%20to%20pass%20to%20effect%20function%0A%20%20%20*%20%40return%20%7Bboolean%7D%20True%20if%20an%20effect%20ran%20for%20this%20property%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20runEffects(inst%2C%20effects%2C%20props%2C%20oldProps%2C%20hasPaths%2C%20extraArgs)%20%7B%0A%20%20%20%20if%20(effects)%20%7B%0A%20%20%20%20%20%20let%20ran%20%3D%20false%3B%0A%20%20%20%20%20%20let%20id%20%3D%20dedupeId%2B%2B%3B%0A%0A%20%20%20%20%20%20for%20(let%20prop%20in%20props)%20%7B%0A%20%20%20%20%20%20%20%20if%20(runEffectsForProperty(inst%2C%20effects%2C%20id%2C%20prop%2C%20props%2C%20oldProps%2C%20hasPaths%2C%20extraArgs))%20%7B%0A%20%20%20%20%20%20%20%20%20%20ran%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20return%20ran%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20false%3B%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Runs%20a%20list%20of%20effects%20for%20a%20given%20property.%0A%20%20%20*%0A%20%20%20*%20%40param%20%7B!PropertyEffectsType%7D%20inst%20The%20instance%20with%20effects%20to%20run%0A%20%20%20*%20%40param%20%7BObject%7D%20effects%20Object%20map%20of%20property-to-Array%20of%20effects%0A%20%20%20*%20%40param%20%7Bnumber%7D%20dedupeId%20Counter%20used%20for%20de-duping%20effects%0A%20%20%20*%20%40param%20%7Bstring%7D%20prop%20Name%20of%20changed%20property%0A%20%20%20*%20%40param%20%7B*%7D%20props%20Changed%20properties%0A%20%20%20*%20%40param%20%7B*%7D%20oldProps%20Old%20properties%0A%20%20%20*%20%40param%20%7Bboolean%3D%7D%20hasPaths%20True%20with%20%60props%60%20contains%20one%20or%20more%20paths%0A%20%20%20*%20%40param%20%7B*%3D%7D%20extraArgs%20Additional%20metadata%20to%20pass%20to%20effect%20function%0A%20%20%20*%20%40return%20%7Bboolean%7D%20True%20if%20an%20effect%20ran%20for%20this%20property%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20runEffectsForProperty(inst%2C%20effects%2C%20dedupeId%2C%20prop%2C%20props%2C%20oldProps%2C%20hasPaths%2C%20extraArgs)%20%7B%0A%20%20%20%20let%20ran%20%3D%20false%3B%0A%20%20%20%20let%20rootProperty%20%3D%20hasPaths%20%3F%20Polymer.Path.root(prop)%20%3A%20prop%3B%0A%20%20%20%20let%20fxs%20%3D%20effects%5BrootProperty%5D%3B%0A%0A%20%20%20%20if%20(fxs)%20%7B%0A%20%20%20%20%20%20for%20(let%20i%20%3D%200%2C%20l%20%3D%20fxs.length%2C%20fx%3B%20i%20%3C%20l%20%26%26%20(fx%20%3D%20fxs%5Bi%5D)%3B%20i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20if%20((!fx.info%20%7C%7C%20fx.info.lastRun%20!%3D%3D%20dedupeId)%20%26%26%20(!hasPaths%20%7C%7C%20pathMatchesTrigger(prop%2C%20fx.trigger)))%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(fx.info)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20fx.info.lastRun%20%3D%20dedupeId%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20fx.fn(inst%2C%20prop%2C%20props%2C%20oldProps%2C%20fx.info%2C%20hasPaths%2C%20extraArgs)%3B%0A%20%20%20%20%20%20%20%20%20%20ran%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20ran%3B%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Determines%20whether%20a%20property%2Fpath%20that%20has%20changed%20matches%20the%20trigger%0A%20%20%20*%20criteria%20for%20an%20effect.%20%20A%20trigger%20is%20a%20descriptor%20with%20the%20following%0A%20%20%20*%20structure%2C%20which%20matches%20the%20descriptors%20returned%20from%20%60parseArg%60.%0A%20%20%20*%20e.g.%20for%20%60foo.bar.*%60%3A%0A%20%20%20*%20%60%60%60%0A%20%20%20*%20trigger%3A%20%7B%0A%20%20%20*%20%20%20name%3A%20'a.b'%2C%0A%20%20%20*%20%20%20structured%3A%20true%2C%0A%20%20%20*%20%20%20wildcard%3A%20true%0A%20%20%20*%20%7D%0A%20%20%20*%20%60%60%60%0A%20%20%20*%20If%20no%20trigger%20is%20given%2C%20the%20path%20is%20deemed%20to%20match.%0A%20%20%20*%0A%20%20%20*%20%40param%20%7Bstring%7D%20path%20Path%20or%20property%20that%20changed%0A%20%20%20*%20%40param%20%7BDataTrigger%7D%20trigger%20Descriptor%0A%20%20%20*%20%40return%20%7Bboolean%7D%20Whether%20the%20path%20matched%20the%20trigger%0A%20%20%20*%2F%0A%0A%0A%20%20function%20pathMatchesTrigger(path%2C%20trigger)%20%7B%0A%20%20%20%20if%20(trigger)%20%7B%0A%20%20%20%20%20%20let%20triggerPath%20%3D%20trigger.name%3B%0A%20%20%20%20%20%20return%20triggerPath%20%3D%3D%20path%20%7C%7C%20trigger.structured%20%26%26%20Polymer.Path.isAncestor(triggerPath%2C%20path)%20%7C%7C%20trigger.wildcard%20%26%26%20Polymer.Path.isDescendant(triggerPath%2C%20path)%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Implements%20the%20%22observer%22%20effect.%0A%20%20%20*%0A%20%20%20*%20Calls%20the%20method%20with%20%60info.methodName%60%20on%20the%20instance%2C%20passing%20the%0A%20%20%20*%20new%20and%20old%20values.%0A%20%20%20*%0A%20%20%20*%20%40param%20%7B!PropertyEffectsType%7D%20inst%20The%20instance%20the%20effect%20will%20be%20run%20on%0A%20%20%20*%20%40param%20%7Bstring%7D%20property%20Name%20of%20property%0A%20%20%20*%20%40param%20%7BObject%7D%20props%20Bag%20of%20current%20property%20changes%0A%20%20%20*%20%40param%20%7BObject%7D%20oldProps%20Bag%20of%20previous%20values%20for%20changed%20properties%0A%20%20%20*%20%40param%20%7B%3F%7D%20info%20Effect%20metadata%0A%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20runObserverEffect(inst%2C%20property%2C%20props%2C%20oldProps%2C%20info)%20%7B%0A%20%20%20%20let%20fn%20%3D%20typeof%20info.method%20%3D%3D%3D%20%22string%22%20%3F%20inst%5Binfo.method%5D%20%3A%20info.method%3B%0A%20%20%20%20let%20changedProp%20%3D%20info.property%3B%0A%0A%20%20%20%20if%20(fn)%20%7B%0A%20%20%20%20%20%20fn.call(inst%2C%20inst.__data%5BchangedProp%5D%2C%20oldProps%5BchangedProp%5D)%3B%0A%20%20%20%20%7D%20else%20if%20(!info.dynamicFn)%20%7B%0A%20%20%20%20%20%20console.warn('observer%20method%20%60'%20%2B%20info.method%20%2B%20'%60%20not%20defined')%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Runs%20%22notify%22%20effects%20for%20a%20set%20of%20changed%20properties.%0A%20%20%20*%0A%20%20%20*%20This%20method%20differs%20from%20the%20generic%20%60runEffects%60%20method%20in%20that%20it%0A%20%20%20*%20will%20dispatch%20path%20notification%20events%20in%20the%20case%20that%20the%20property%0A%20%20%20*%20changed%20was%20a%20path%20and%20the%20root%20property%20for%20that%20path%20didn't%20have%20a%0A%20%20%20*%20%22notify%22%20effect.%20%20This%20is%20to%20maintain%201.0%20behavior%20that%20did%20not%20require%0A%20%20%20*%20%60notify%3A%20true%60%20to%20ensure%20object%20sub-property%20notifications%20were%0A%20%20%20*%20sent.%0A%20%20%20*%0A%20%20%20*%20%40param%20%7B!PropertyEffectsType%7D%20inst%20The%20instance%20with%20effects%20to%20run%0A%20%20%20*%20%40param%20%7BObject%7D%20notifyProps%20Bag%20of%20properties%20to%20notify%0A%20%20%20*%20%40param%20%7BObject%7D%20props%20Bag%20of%20current%20property%20changes%0A%20%20%20*%20%40param%20%7BObject%7D%20oldProps%20Bag%20of%20previous%20values%20for%20changed%20properties%0A%20%20%20*%20%40param%20%7Bboolean%7D%20hasPaths%20True%20with%20%60props%60%20contains%20one%20or%20more%20paths%0A%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20runNotifyEffects(inst%2C%20notifyProps%2C%20props%2C%20oldProps%2C%20hasPaths)%20%7B%0A%20%20%20%20%2F%2F%20Notify%0A%20%20%20%20let%20fxs%20%3D%20inst%5BTYPES.NOTIFY%5D%3B%0A%20%20%20%20let%20notified%3B%0A%20%20%20%20let%20id%20%3D%20dedupeId%2B%2B%3B%20%2F%2F%20Try%20normal%20notify%20effects%3B%20if%20none%2C%20fall%20back%20to%20try%20path%20notification%0A%0A%20%20%20%20for%20(let%20prop%20in%20notifyProps)%20%7B%0A%20%20%20%20%20%20if%20(notifyProps%5Bprop%5D)%20%7B%0A%20%20%20%20%20%20%20%20if%20(fxs%20%26%26%20runEffectsForProperty(inst%2C%20fxs%2C%20id%2C%20prop%2C%20props%2C%20oldProps%2C%20hasPaths))%20%7B%0A%20%20%20%20%20%20%20%20%20%20notified%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20(hasPaths%20%26%26%20notifyPath(inst%2C%20prop%2C%20props))%20%7B%0A%20%20%20%20%20%20%20%20%20%20notified%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20%2F%2F%20Flush%20host%20if%20we%20actually%20notified%20and%20host%20was%20batching%0A%20%20%20%20%2F%2F%20And%20the%20host%20has%20already%20initialized%20clients%3B%20this%20prevents%0A%20%20%20%20%2F%2F%20an%20issue%20with%20a%20host%20observing%20data%20changes%20before%20clients%20are%20ready.%0A%0A%0A%20%20%20%20let%20host%3B%0A%0A%20%20%20%20if%20(notified%20%26%26%20(host%20%3D%20inst.__dataHost)%20%26%26%20host._invalidateProperties)%20%7B%0A%20%20%20%20%20%20host._invalidateProperties()%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Dispatches%20%7Bproperty%7D-changed%20events%20with%20path%20information%20in%20the%20detail%0A%20%20%20*%20object%20to%20indicate%20a%20sub-path%20of%20the%20property%20was%20changed.%0A%20%20%20*%0A%20%20%20*%20%40param%20%7B!PropertyEffectsType%7D%20inst%20The%20element%20from%20which%20to%20fire%20the%20event%0A%20%20%20*%20%40param%20%7Bstring%7D%20path%20The%20path%20that%20was%20changed%0A%20%20%20*%20%40param%20%7BObject%7D%20props%20Bag%20of%20current%20property%20changes%0A%20%20%20*%20%40return%20%7Bboolean%7D%20Returns%20true%20if%20the%20path%20was%20notified%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20notifyPath(inst%2C%20path%2C%20props)%20%7B%0A%20%20%20%20let%20rootProperty%20%3D%20Polymer.Path.root(path)%3B%0A%0A%20%20%20%20if%20(rootProperty%20!%3D%3D%20path)%20%7B%0A%20%20%20%20%20%20let%20eventName%20%3D%20Polymer.CaseMap.camelToDashCase(rootProperty)%20%2B%20'-changed'%3B%0A%20%20%20%20%20%20dispatchNotifyEvent(inst%2C%20eventName%2C%20props%5Bpath%5D%2C%20path)%3B%0A%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20false%3B%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Dispatches%20%7Bproperty%7D-changed%20events%20to%20indicate%20a%20property%20(or%20path)%0A%20%20%20*%20changed.%0A%20%20%20*%0A%20%20%20*%20%40param%20%7B!PropertyEffectsType%7D%20inst%20The%20element%20from%20which%20to%20fire%20the%20event%0A%20%20%20*%20%40param%20%7Bstring%7D%20eventName%20The%20name%20of%20the%20event%20to%20send%20('%7Bproperty%7D-changed')%0A%20%20%20*%20%40param%20%7B*%7D%20value%20The%20value%20of%20the%20changed%20property%0A%20%20%20*%20%40param%20%7Bstring%20%7C%20null%20%7C%20undefined%7D%20path%20If%20a%20sub-path%20of%20this%20property%20changed%2C%20the%20path%0A%20%20%20*%20%20%20that%20changed%20(optional).%0A%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20*%20%40private%0A%20%20%20*%20%40suppress%20%7BinvalidCasts%7D%0A%20%20%20*%2F%0A%0A%0A%20%20function%20dispatchNotifyEvent(inst%2C%20eventName%2C%20value%2C%20path)%20%7B%0A%20%20%20%20let%20detail%20%3D%20%7B%0A%20%20%20%20%20%20value%3A%20value%2C%0A%20%20%20%20%20%20queueProperty%3A%20true%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20if%20(path)%20%7B%0A%20%20%20%20%20%20detail.path%20%3D%20path%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F**%20%40type%20%7B!HTMLElement%7D%20*%2F%0A%0A%0A%20%20%20%20inst.dispatchEvent(new%20CustomEvent(eventName%2C%20%7B%0A%20%20%20%20%20%20detail%0A%20%20%20%20%7D))%3B%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Implements%20the%20%22notify%22%20effect.%0A%20%20%20*%0A%20%20%20*%20Dispatches%20a%20non-bubbling%20event%20named%20%60info.eventName%60%20on%20the%20instance%0A%20%20%20*%20with%20a%20detail%20object%20containing%20the%20new%20%60value%60.%0A%20%20%20*%0A%20%20%20*%20%40param%20%7B!PropertyEffectsType%7D%20inst%20The%20instance%20the%20effect%20will%20be%20run%20on%0A%20%20%20*%20%40param%20%7Bstring%7D%20property%20Name%20of%20property%0A%20%20%20*%20%40param%20%7BObject%7D%20props%20Bag%20of%20current%20property%20changes%0A%20%20%20*%20%40param%20%7BObject%7D%20oldProps%20Bag%20of%20previous%20values%20for%20changed%20properties%0A%20%20%20*%20%40param%20%7B%3F%7D%20info%20Effect%20metadata%0A%20%20%20*%20%40param%20%7Bboolean%7D%20hasPaths%20True%20with%20%60props%60%20contains%20one%20or%20more%20paths%0A%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20runNotifyEffect(inst%2C%20property%2C%20props%2C%20oldProps%2C%20info%2C%20hasPaths)%20%7B%0A%20%20%20%20let%20rootProperty%20%3D%20hasPaths%20%3F%20Polymer.Path.root(property)%20%3A%20property%3B%0A%20%20%20%20let%20path%20%3D%20rootProperty%20!%3D%20property%20%3F%20property%20%3A%20null%3B%0A%20%20%20%20let%20value%20%3D%20path%20%3F%20Polymer.Path.get(inst%2C%20path)%20%3A%20inst.__data%5Bproperty%5D%3B%0A%0A%20%20%20%20if%20(path%20%26%26%20value%20%3D%3D%3D%20undefined)%20%7B%0A%20%20%20%20%20%20value%20%3D%20props%5Bproperty%5D%3B%20%2F%2F%20specifically%20for%20.splices%0A%20%20%20%20%7D%0A%0A%20%20%20%20dispatchNotifyEvent(inst%2C%20info.eventName%2C%20value%2C%20path)%3B%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Handler%20function%20for%202-way%20notification%20events.%20Receives%20context%0A%20%20%20*%20information%20captured%20in%20the%20%60addNotifyListener%60%20closure%20from%20the%0A%20%20%20*%20%60__notifyListeners%60%20metadata.%0A%20%20%20*%0A%20%20%20*%20Sets%20the%20value%20of%20the%20notified%20property%20to%20the%20host%20property%20or%20path.%20%20If%0A%20%20%20*%20the%20event%20contained%20path%20information%2C%20translate%20that%20path%20to%20the%20host%0A%20%20%20*%20scope's%20name%20for%20that%20path%20first.%0A%20%20%20*%0A%20%20%20*%20%40param%20%7BCustomEvent%7D%20event%20Notification%20event%20(e.g.%20'%3Cproperty%3E-changed')%0A%20%20%20*%20%40param%20%7B!PropertyEffectsType%7D%20inst%20Host%20element%20instance%20handling%20the%20notification%20event%0A%20%20%20*%20%40param%20%7Bstring%7D%20fromProp%20Child%20element%20property%20that%20was%20bound%0A%20%20%20*%20%40param%20%7Bstring%7D%20toPath%20Host%20property%2Fpath%20that%20was%20bound%0A%20%20%20*%20%40param%20%7Bboolean%7D%20negate%20Whether%20the%20binding%20was%20negated%0A%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20handleNotification(event%2C%20inst%2C%20fromProp%2C%20toPath%2C%20negate)%20%7B%0A%20%20%20%20let%20value%3B%0A%20%20%20%20let%20detail%20%3D%0A%20%20%20%20%2F**%20%40type%20%7BObject%7D%20*%2F%0A%20%20%20%20event.detail%3B%0A%20%20%20%20let%20fromPath%20%3D%20detail%20%26%26%20detail.path%3B%0A%0A%20%20%20%20if%20(fromPath)%20%7B%0A%20%20%20%20%20%20toPath%20%3D%20Polymer.Path.translate(fromProp%2C%20toPath%2C%20fromPath)%3B%0A%20%20%20%20%20%20value%20%3D%20detail%20%26%26%20detail.value%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20value%20%3D%20event.currentTarget%5BfromProp%5D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20value%20%3D%20negate%20%3F%20!value%20%3A%20value%3B%0A%0A%20%20%20%20if%20(!inst%5BTYPES.READ_ONLY%5D%20%7C%7C%20!inst%5BTYPES.READ_ONLY%5D%5BtoPath%5D)%20%7B%0A%20%20%20%20%20%20if%20(inst._setPendingPropertyOrPath(toPath%2C%20value%2C%20true%2C%20Boolean(fromPath))%20%26%26%20(!detail%20%7C%7C%20!detail.queueProperty))%20%7B%0A%20%20%20%20%20%20%20%20inst._invalidateProperties()%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Implements%20the%20%22reflect%22%20effect.%0A%20%20%20*%0A%20%20%20*%20Sets%20the%20attribute%20named%20%60info.attrName%60%20to%20the%20given%20property%20value.%0A%20%20%20*%0A%20%20%20*%20%40param%20%7B!PropertyEffectsType%7D%20inst%20The%20instance%20the%20effect%20will%20be%20run%20on%0A%20%20%20*%20%40param%20%7Bstring%7D%20property%20Name%20of%20property%0A%20%20%20*%20%40param%20%7BObject%7D%20props%20Bag%20of%20current%20property%20changes%0A%20%20%20*%20%40param%20%7BObject%7D%20oldProps%20Bag%20of%20previous%20values%20for%20changed%20properties%0A%20%20%20*%20%40param%20%7B%3F%7D%20info%20Effect%20metadata%0A%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20runReflectEffect(inst%2C%20property%2C%20props%2C%20oldProps%2C%20info)%20%7B%0A%20%20%20%20let%20value%20%3D%20inst.__data%5Bproperty%5D%3B%0A%0A%20%20%20%20if%20(Polymer.sanitizeDOMValue)%20%7B%0A%20%20%20%20%20%20value%20%3D%20Polymer.sanitizeDOMValue(value%2C%20info.attrName%2C%20'attribute'%2C%0A%20%20%20%20%20%20%2F**%20%40type%20%7BNode%7D%20*%2F%0A%20%20%20%20%20%20inst)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20inst._propertyToAttribute(property%2C%20info.attrName%2C%20value)%3B%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Runs%20%22computed%22%20effects%20for%20a%20set%20of%20changed%20properties.%0A%20%20%20*%0A%20%20%20*%20This%20method%20differs%20from%20the%20generic%20%60runEffects%60%20method%20in%20that%20it%0A%20%20%20*%20continues%20to%20run%20computed%20effects%20based%20on%20the%20output%20of%20each%20pass%20until%0A%20%20%20*%20there%20are%20no%20more%20newly%20computed%20properties.%20%20This%20ensures%20that%20all%0A%20%20%20*%20properties%20that%20will%20be%20computed%20by%20the%20initial%20set%20of%20changes%20are%0A%20%20%20*%20computed%20before%20other%20effects%20(binding%20propagation%2C%20observers%2C%20and%20notify)%0A%20%20%20*%20run.%0A%20%20%20*%0A%20%20%20*%20%40param%20%7B!PropertyEffectsType%7D%20inst%20The%20instance%20the%20effect%20will%20be%20run%20on%0A%20%20%20*%20%40param%20%7B!Object%7D%20changedProps%20Bag%20of%20changed%20properties%0A%20%20%20*%20%40param%20%7B!Object%7D%20oldProps%20Bag%20of%20previous%20values%20for%20changed%20properties%0A%20%20%20*%20%40param%20%7Bboolean%7D%20hasPaths%20True%20with%20%60props%60%20contains%20one%20or%20more%20paths%0A%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20runComputedEffects(inst%2C%20changedProps%2C%20oldProps%2C%20hasPaths)%20%7B%0A%20%20%20%20let%20computeEffects%20%3D%20inst%5BTYPES.COMPUTE%5D%3B%0A%0A%20%20%20%20if%20(computeEffects)%20%7B%0A%20%20%20%20%20%20let%20inputProps%20%3D%20changedProps%3B%0A%0A%20%20%20%20%20%20while%20(runEffects(inst%2C%20computeEffects%2C%20inputProps%2C%20oldProps%2C%20hasPaths))%20%7B%0A%20%20%20%20%20%20%20%20Object.assign(oldProps%2C%20inst.__dataOld)%3B%0A%20%20%20%20%20%20%20%20Object.assign(changedProps%2C%20inst.__dataPending)%3B%0A%20%20%20%20%20%20%20%20inputProps%20%3D%20inst.__dataPending%3B%0A%20%20%20%20%20%20%20%20inst.__dataPending%20%3D%20null%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Implements%20the%20%22computed%20property%22%20effect%20by%20running%20the%20method%20with%20the%0A%20%20%20*%20values%20of%20the%20arguments%20specified%20in%20the%20%60info%60%20object%20and%20setting%20the%0A%20%20%20*%20return%20value%20to%20the%20computed%20property%20specified.%0A%20%20%20*%0A%20%20%20*%20%40param%20%7B!PropertyEffectsType%7D%20inst%20The%20instance%20the%20effect%20will%20be%20run%20on%0A%20%20%20*%20%40param%20%7Bstring%7D%20property%20Name%20of%20property%0A%20%20%20*%20%40param%20%7BObject%7D%20props%20Bag%20of%20current%20property%20changes%0A%20%20%20*%20%40param%20%7BObject%7D%20oldProps%20Bag%20of%20previous%20values%20for%20changed%20properties%0A%20%20%20*%20%40param%20%7B%3F%7D%20info%20Effect%20metadata%0A%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20runComputedEffect(inst%2C%20property%2C%20props%2C%20oldProps%2C%20info)%20%7B%0A%20%20%20%20let%20result%20%3D%20runMethodEffect(inst%2C%20property%2C%20props%2C%20oldProps%2C%20info)%3B%0A%20%20%20%20let%20computedProp%20%3D%20info.methodInfo%3B%0A%0A%20%20%20%20if%20(inst.__dataHasAccessor%20%26%26%20inst.__dataHasAccessor%5BcomputedProp%5D)%20%7B%0A%20%20%20%20%20%20inst._setPendingProperty(computedProp%2C%20result%2C%20true)%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20inst%5BcomputedProp%5D%20%3D%20result%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Computes%20path%20changes%20based%20on%20path%20links%20set%20up%20using%20the%20%60linkPaths%60%0A%20%20%20*%20API.%0A%20%20%20*%0A%20%20%20*%20%40param%20%7B!PropertyEffectsType%7D%20inst%20The%20instance%20whose%20props%20are%20changing%0A%20%20%20*%20%40param%20%7Bstring%20%7C%20!Array%3C(string%7Cnumber)%3E%7D%20path%20Path%20that%20has%20changed%0A%20%20%20*%20%40param%20%7B*%7D%20value%20Value%20of%20changed%20path%0A%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20computeLinkedPaths(inst%2C%20path%2C%20value)%20%7B%0A%20%20%20%20let%20links%20%3D%20inst.__dataLinkedPaths%3B%0A%0A%20%20%20%20if%20(links)%20%7B%0A%20%20%20%20%20%20let%20link%3B%0A%0A%20%20%20%20%20%20for%20(let%20a%20in%20links)%20%7B%0A%20%20%20%20%20%20%20%20let%20b%20%3D%20links%5Ba%5D%3B%0A%0A%20%20%20%20%20%20%20%20if%20(Polymer.Path.isDescendant(a%2C%20path))%20%7B%0A%20%20%20%20%20%20%20%20%20%20link%20%3D%20Polymer.Path.translate(a%2C%20b%2C%20path)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20inst._setPendingPropertyOrPath(link%2C%20value%2C%20true%2C%20true)%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20(Polymer.Path.isDescendant(b%2C%20path))%20%7B%0A%20%20%20%20%20%20%20%20%20%20link%20%3D%20Polymer.Path.translate(b%2C%20a%2C%20path)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20inst._setPendingPropertyOrPath(link%2C%20value%2C%20true%2C%20true)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%20%2F%2F%20--%20bindings%20----------------------------------------------%0A%0A%20%20%2F**%0A%20%20%20*%20Adds%20binding%20metadata%20to%20the%20current%20%60nodeInfo%60%2C%20and%20binding%20effects%0A%20%20%20*%20for%20all%20part%20dependencies%20to%20%60templateInfo%60.%0A%20%20%20*%0A%20%20%20*%20%40param%20%7BFunction%7D%20constructor%20Class%20that%20%60_parseTemplate%60%20is%20currently%0A%20%20%20*%20%20%20running%20on%0A%20%20%20*%20%40param%20%7BTemplateInfo%7D%20templateInfo%20Template%20metadata%20for%20current%20template%0A%20%20%20*%20%40param%20%7BNodeInfo%7D%20nodeInfo%20Node%20metadata%20for%20current%20template%20node%0A%20%20%20*%20%40param%20%7Bstring%7D%20kind%20Binding%20kind%2C%20either%20'property'%2C%20'attribute'%2C%20or%20'text'%0A%20%20%20*%20%40param%20%7Bstring%7D%20target%20Target%20property%20name%0A%20%20%20*%20%40param%20%7B!Array%3C!BindingPart%3E%7D%20parts%20Array%20of%20binding%20part%20metadata%0A%20%20%20*%20%40param%20%7Bstring%3D%7D%20literal%20Literal%20text%20surrounding%20binding%20parts%20(specified%0A%20%20%20*%20%20%20only%20for%20'property'%20bindings%2C%20since%20these%20must%20be%20initialized%20as%20part%0A%20%20%20*%20%20%20of%20boot-up)%0A%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20addBinding(constructor%2C%20templateInfo%2C%20nodeInfo%2C%20kind%2C%20target%2C%20parts%2C%20literal)%20%7B%0A%20%20%20%20%2F%2F%20Create%20binding%20metadata%20and%20add%20to%20nodeInfo%0A%20%20%20%20nodeInfo.bindings%20%3D%20nodeInfo.bindings%20%7C%7C%20%5B%5D%3B%0A%20%20%20%20let%0A%20%20%20%20%2F**%20Binding%20*%2F%0A%20%20%20%20binding%20%3D%20%7B%0A%20%20%20%20%20%20kind%2C%0A%20%20%20%20%20%20target%2C%0A%20%20%20%20%20%20parts%2C%0A%20%20%20%20%20%20literal%2C%0A%20%20%20%20%20%20isCompound%3A%20parts.length%20!%3D%3D%201%0A%20%20%20%20%7D%3B%0A%20%20%20%20nodeInfo.bindings.push(binding)%3B%20%2F%2F%20Add%20listener%20info%20to%20binding%20metadata%0A%0A%20%20%20%20if%20(shouldAddListener(binding))%20%7B%0A%20%20%20%20%20%20let%20%7B%0A%20%20%20%20%20%20%20%20event%2C%0A%20%20%20%20%20%20%20%20negate%0A%20%20%20%20%20%20%7D%20%3D%20binding.parts%5B0%5D%3B%0A%20%20%20%20%20%20binding.listenerEvent%20%3D%20event%20%7C%7C%20CaseMap.camelToDashCase(target)%20%2B%20'-changed'%3B%0A%20%20%20%20%20%20binding.listenerNegate%20%3D%20negate%3B%0A%20%20%20%20%7D%20%2F%2F%20Add%20%22propagate%22%20property%20effects%20to%20templateInfo%0A%0A%0A%20%20%20%20let%20index%20%3D%20templateInfo.nodeInfoList.length%3B%0A%0A%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%20binding.parts.length%3B%20i%2B%2B)%20%7B%0A%20%20%20%20%20%20let%20part%20%3D%20binding.parts%5Bi%5D%3B%0A%20%20%20%20%20%20part.compoundIndex%20%3D%20i%3B%0A%20%20%20%20%20%20addEffectForBindingPart(constructor%2C%20templateInfo%2C%20binding%2C%20part%2C%20index)%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Adds%20property%20effects%20to%20the%20given%20%60templateInfo%60%20for%20the%20given%20binding%0A%20%20%20*%20part.%0A%20%20%20*%0A%20%20%20*%20%40param%20%7BFunction%7D%20constructor%20Class%20that%20%60_parseTemplate%60%20is%20currently%0A%20%20%20*%20%20%20running%20on%0A%20%20%20*%20%40param%20%7BTemplateInfo%7D%20templateInfo%20Template%20metadata%20for%20current%20template%0A%20%20%20*%20%40param%20%7B!Binding%7D%20binding%20Binding%20metadata%0A%20%20%20*%20%40param%20%7B!BindingPart%7D%20part%20Binding%20part%20metadata%0A%20%20%20*%20%40param%20%7Bnumber%7D%20index%20Index%20into%20%60nodeInfoList%60%20for%20this%20node%0A%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20*%2F%0A%0A%0A%20%20function%20addEffectForBindingPart(constructor%2C%20templateInfo%2C%20binding%2C%20part%2C%20index)%20%7B%0A%20%20%20%20if%20(!part.literal)%20%7B%0A%20%20%20%20%20%20if%20(binding.kind%20%3D%3D%3D%20'attribute'%20%26%26%20binding.target%5B0%5D%20%3D%3D%3D%20'-')%20%7B%0A%20%20%20%20%20%20%20%20console.warn('Cannot%20set%20attribute%20'%20%2B%20binding.target%20%2B%20'%20because%20%22-%22%20is%20not%20a%20valid%20attribute%20starting%20character')%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20let%20dependencies%20%3D%20part.dependencies%3B%0A%20%20%20%20%20%20%20%20let%20info%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20index%2C%0A%20%20%20%20%20%20%20%20%20%20binding%2C%0A%20%20%20%20%20%20%20%20%20%20part%2C%0A%20%20%20%20%20%20%20%20%20%20evaluator%3A%20constructor%0A%20%20%20%20%20%20%20%20%7D%3B%0A%0A%20%20%20%20%20%20%20%20for%20(let%20j%20%3D%200%3B%20j%20%3C%20dependencies.length%3B%20j%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20let%20trigger%20%3D%20dependencies%5Bj%5D%3B%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(typeof%20trigger%20%3D%3D%20'string')%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20trigger%20%3D%20parseArg(trigger)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20trigger.wildcard%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20constructor._addTemplatePropertyEffect(templateInfo%2C%20trigger.rootProperty%2C%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20fn%3A%20runBindingEffect%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20info%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20trigger%0A%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Implements%20the%20%22binding%22%20(property%2Fpath%20binding)%20effect.%0A%20%20%20*%0A%20%20%20*%20Note%20that%20binding%20syntax%20is%20overridable%20via%20%60_parseBindings%60%20and%0A%20%20%20*%20%60_evaluateBinding%60.%20%20This%20method%20will%20call%20%60_evaluateBinding%60%20for%20any%0A%20%20%20*%20non-literal%20parts%20returned%20from%20%60_parseBindings%60.%20%20However%2C%0A%20%20%20*%20there%20is%20no%20support%20for%20_path_%20bindings%20via%20custom%20binding%20parts%2C%0A%20%20%20*%20as%20this%20is%20specific%20to%20Polymer's%20path%20binding%20syntax.%0A%20%20%20*%0A%20%20%20*%20%40param%20%7B!PropertyEffectsType%7D%20inst%20The%20instance%20the%20effect%20will%20be%20run%20on%0A%20%20%20*%20%40param%20%7Bstring%7D%20path%20Name%20of%20property%0A%20%20%20*%20%40param%20%7BObject%7D%20props%20Bag%20of%20current%20property%20changes%0A%20%20%20*%20%40param%20%7BObject%7D%20oldProps%20Bag%20of%20previous%20values%20for%20changed%20properties%0A%20%20%20*%20%40param%20%7B%3F%7D%20info%20Effect%20metadata%0A%20%20%20*%20%40param%20%7Bboolean%7D%20hasPaths%20True%20with%20%60props%60%20contains%20one%20or%20more%20paths%0A%20%20%20*%20%40param%20%7BArray%7D%20nodeList%20List%20of%20nodes%20associated%20with%20%60nodeInfoList%60%20template%0A%20%20%20*%20%20%20metadata%0A%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20runBindingEffect(inst%2C%20path%2C%20props%2C%20oldProps%2C%20info%2C%20hasPaths%2C%20nodeList)%20%7B%0A%20%20%20%20let%20node%20%3D%20nodeList%5Binfo.index%5D%3B%0A%20%20%20%20let%20binding%20%3D%20info.binding%3B%0A%20%20%20%20let%20part%20%3D%20info.part%3B%20%2F%2F%20Subpath%20notification%3A%20transform%20path%20and%20set%20to%20client%0A%20%20%20%20%2F%2F%20e.g.%3A%20foo%3D%22%7B%7Bobj.sub%7D%7D%22%2C%20path%3A%20'obj.sub.prop'%2C%20set%20'foo.prop'%3Dobj.sub.prop%0A%0A%20%20%20%20if%20(hasPaths%20%26%26%20part.source%20%26%26%20path.length%20%3E%20part.source.length%20%26%26%20binding.kind%20%3D%3D%20'property'%20%26%26%20!binding.isCompound%20%26%26%20node.__isPropertyEffectsClient%20%26%26%20node.__dataHasAccessor%20%26%26%20node.__dataHasAccessor%5Bbinding.target%5D)%20%7B%0A%20%20%20%20%20%20let%20value%20%3D%20props%5Bpath%5D%3B%0A%20%20%20%20%20%20path%20%3D%20Polymer.Path.translate(part.source%2C%20binding.target%2C%20path)%3B%0A%0A%20%20%20%20%20%20if%20(node._setPendingPropertyOrPath(path%2C%20value%2C%20false%2C%20true))%20%7B%0A%20%20%20%20%20%20%20%20inst._enqueueClient(node)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20let%20value%20%3D%20info.evaluator._evaluateBinding(inst%2C%20part%2C%20path%2C%20props%2C%20oldProps%2C%20hasPaths)%3B%20%2F%2F%20Propagate%20value%20to%20child%0A%0A%0A%20%20%20%20%20%20applyBindingValue(inst%2C%20node%2C%20binding%2C%20part%2C%20value)%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Sets%20the%20value%20for%20an%20%22binding%22%20(binding)%20effect%20to%20a%20node%2C%0A%20%20%20*%20either%20as%20a%20property%20or%20attribute.%0A%20%20%20*%0A%20%20%20*%20%40param%20%7B!PropertyEffectsType%7D%20inst%20The%20instance%20owning%20the%20binding%20effect%0A%20%20%20*%20%40param%20%7BNode%7D%20node%20Target%20node%20for%20binding%0A%20%20%20*%20%40param%20%7B!Binding%7D%20binding%20Binding%20metadata%0A%20%20%20*%20%40param%20%7B!BindingPart%7D%20part%20Binding%20part%20metadata%0A%20%20%20*%20%40param%20%7B*%7D%20value%20Value%20to%20set%0A%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20applyBindingValue(inst%2C%20node%2C%20binding%2C%20part%2C%20value)%20%7B%0A%20%20%20%20value%20%3D%20computeBindingValue(node%2C%20value%2C%20binding%2C%20part)%3B%0A%0A%20%20%20%20if%20(Polymer.sanitizeDOMValue)%20%7B%0A%20%20%20%20%20%20value%20%3D%20Polymer.sanitizeDOMValue(value%2C%20binding.target%2C%20binding.kind%2C%20node)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20(binding.kind%20%3D%3D%20'attribute')%20%7B%0A%20%20%20%20%20%20%2F%2F%20Attribute%20binding%0A%20%20%20%20%20%20inst._valueToNodeAttribute(%0A%20%20%20%20%20%20%2F**%20%40type%20%7BElement%7D%20*%2F%0A%20%20%20%20%20%20node%2C%20value%2C%20binding.target)%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%2F%2F%20Property%20binding%0A%20%20%20%20%20%20let%20prop%20%3D%20binding.target%3B%0A%0A%20%20%20%20%20%20if%20(node.__isPropertyEffectsClient%20%26%26%20node.__dataHasAccessor%20%26%26%20node.__dataHasAccessor%5Bprop%5D)%20%7B%0A%20%20%20%20%20%20%20%20if%20(!node%5BTYPES.READ_ONLY%5D%20%7C%7C%20!node%5BTYPES.READ_ONLY%5D%5Bprop%5D)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(node._setPendingProperty(prop%2C%20value))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20inst._enqueueClient(node)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20inst._setUnmanagedPropertyToNode(node%2C%20prop%2C%20value)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Transforms%20an%20%22binding%22%20effect%20value%20based%20on%20compound%20%26%20negation%0A%20%20%20*%20effect%20metadata%2C%20as%20well%20as%20handling%20for%20special-case%20properties%0A%20%20%20*%0A%20%20%20*%20%40param%20%7BNode%7D%20node%20Node%20the%20value%20will%20be%20set%20to%0A%20%20%20*%20%40param%20%7B*%7D%20value%20Value%20to%20set%0A%20%20%20*%20%40param%20%7B!Binding%7D%20binding%20Binding%20metadata%0A%20%20%20*%20%40param%20%7B!BindingPart%7D%20part%20Binding%20part%20metadata%0A%20%20%20*%20%40return%20%7B*%7D%20Transformed%20value%20to%20set%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20computeBindingValue(node%2C%20value%2C%20binding%2C%20part)%20%7B%0A%20%20%20%20if%20(binding.isCompound)%20%7B%0A%20%20%20%20%20%20let%20storage%20%3D%20node.__dataCompoundStorage%5Bbinding.target%5D%3B%0A%20%20%20%20%20%20storage%5Bpart.compoundIndex%5D%20%3D%20value%3B%0A%20%20%20%20%20%20value%20%3D%20storage.join('')%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20(binding.kind%20!%3D%3D%20'attribute')%20%7B%0A%20%20%20%20%20%20%2F%2F%20Some%20browsers%20serialize%20%60undefined%60%20to%20%60%22undefined%22%60%0A%20%20%20%20%20%20if%20(binding.target%20%3D%3D%3D%20'textContent'%20%7C%7C%20binding.target%20%3D%3D%3D%20'value'%20%26%26%20(node.localName%20%3D%3D%3D%20'input'%20%7C%7C%20node.localName%20%3D%3D%3D%20'textarea'))%20%7B%0A%20%20%20%20%20%20%20%20value%20%3D%20value%20%3D%3D%20undefined%20%3F%20''%20%3A%20value%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20value%3B%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Returns%20true%20if%20a%20binding's%20metadata%20meets%20all%20the%20requirements%20to%20allow%0A%20%20%20*%202-way%20binding%2C%20and%20therefore%20a%20%60%3Cproperty%3E-changed%60%20event%20listener%20should%20be%0A%20%20%20*%20added%3A%0A%20%20%20*%20-%20used%20curly%20braces%0A%20%20%20*%20-%20is%20a%20property%20(not%20attribute)%20binding%0A%20%20%20*%20-%20is%20not%20a%20textContent%20binding%0A%20%20%20*%20-%20is%20not%20compound%0A%20%20%20*%0A%20%20%20*%20%40param%20%7B!Binding%7D%20binding%20Binding%20metadata%0A%20%20%20*%20%40return%20%7Bboolean%7D%20True%20if%202-way%20listener%20should%20be%20added%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20shouldAddListener(binding)%20%7B%0A%20%20%20%20return%20Boolean(binding.target)%20%26%26%20binding.kind%20!%3D%20'attribute'%20%26%26%20binding.kind%20!%3D%20'text'%20%26%26%20!binding.isCompound%20%26%26%20binding.parts%5B0%5D.mode%20%3D%3D%3D%20'%7B'%3B%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Setup%20compound%20binding%20storage%20structures%2C%20notify%20listeners%2C%20and%20dataHost%0A%20%20%20*%20references%20onto%20the%20bound%20nodeList.%0A%20%20%20*%0A%20%20%20*%20%40param%20%7B!PropertyEffectsType%7D%20inst%20Instance%20that%20bas%20been%20previously%20bound%0A%20%20%20*%20%40param%20%7BTemplateInfo%7D%20templateInfo%20Template%20metadata%0A%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20setupBindings(inst%2C%20templateInfo)%20%7B%0A%20%20%20%20%2F%2F%20Setup%20compound%20storage%2C%20dataHost%2C%20and%20notify%20listeners%0A%20%20%20%20let%20%7B%0A%20%20%20%20%20%20nodeList%2C%0A%20%20%20%20%20%20nodeInfoList%0A%20%20%20%20%7D%20%3D%20templateInfo%3B%0A%0A%20%20%20%20if%20(nodeInfoList.length)%20%7B%0A%20%20%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%20nodeInfoList.length%3B%20i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20let%20info%20%3D%20nodeInfoList%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20let%20node%20%3D%20nodeList%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20let%20bindings%20%3D%20info.bindings%3B%0A%0A%20%20%20%20%20%20%20%20if%20(bindings)%20%7B%0A%20%20%20%20%20%20%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%20bindings.length%3B%20i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20let%20binding%20%3D%20bindings%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20setupCompoundStorage(node%2C%20binding)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20addNotifyListener(node%2C%20inst%2C%20binding)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20node.__dataHost%20%3D%20inst%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Initializes%20%60__dataCompoundStorage%60%20local%20storage%20on%20a%20bound%20node%20with%0A%20%20%20*%20initial%20literal%20data%20for%20compound%20bindings%2C%20and%20sets%20the%20joined%0A%20%20%20*%20literal%20parts%20to%20the%20bound%20property.%0A%20%20%20*%0A%20%20%20*%20When%20changes%20to%20compound%20parts%20occur%2C%20they%20are%20first%20set%20into%20the%20compound%0A%20%20%20*%20storage%20array%20for%20that%20property%2C%20and%20then%20the%20array%20is%20joined%20to%20result%20in%0A%20%20%20*%20the%20final%20value%20set%20to%20the%20property%2Fattribute.%0A%20%20%20*%0A%20%20%20*%20%40param%20%7BNode%7D%20node%20Bound%20node%20to%20initialize%0A%20%20%20*%20%40param%20%7BBinding%7D%20binding%20Binding%20metadata%0A%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20setupCompoundStorage(node%2C%20binding)%20%7B%0A%20%20%20%20if%20(binding.isCompound)%20%7B%0A%20%20%20%20%20%20%2F%2F%20Create%20compound%20storage%20map%0A%20%20%20%20%20%20let%20storage%20%3D%20node.__dataCompoundStorage%20%7C%7C%20(node.__dataCompoundStorage%20%3D%20%7B%7D)%3B%0A%20%20%20%20%20%20let%20parts%20%3D%20binding.parts%3B%20%2F%2F%20Copy%20literals%20from%20parts%20into%20storage%20for%20this%20binding%0A%0A%20%20%20%20%20%20let%20literals%20%3D%20new%20Array(parts.length)%3B%0A%0A%20%20%20%20%20%20for%20(let%20j%20%3D%200%3B%20j%20%3C%20parts.length%3B%20j%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20literals%5Bj%5D%20%3D%20parts%5Bj%5D.literal%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20let%20target%20%3D%20binding.target%3B%0A%20%20%20%20%20%20storage%5Btarget%5D%20%3D%20literals%3B%20%2F%2F%20Configure%20properties%20with%20their%20literal%20parts%0A%0A%20%20%20%20%20%20if%20(binding.literal%20%26%26%20binding.kind%20%3D%3D%20'property')%20%7B%0A%20%20%20%20%20%20%20%20node%5Btarget%5D%20%3D%20binding.literal%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Adds%20a%202-way%20binding%20notification%20event%20listener%20to%20the%20node%20specified%0A%20%20%20*%0A%20%20%20*%20%40param%20%7BObject%7D%20node%20Child%20element%20to%20add%20listener%20to%0A%20%20%20*%20%40param%20%7B!PropertyEffectsType%7D%20inst%20Host%20element%20instance%20to%20handle%20notification%20event%0A%20%20%20*%20%40param%20%7BBinding%7D%20binding%20Binding%20metadata%0A%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20addNotifyListener(node%2C%20inst%2C%20binding)%20%7B%0A%20%20%20%20if%20(binding.listenerEvent)%20%7B%0A%20%20%20%20%20%20let%20part%20%3D%20binding.parts%5B0%5D%3B%0A%20%20%20%20%20%20node.addEventListener(binding.listenerEvent%2C%20function%20(e)%20%7B%0A%20%20%20%20%20%20%20%20handleNotification(e%2C%20inst%2C%20binding.target%2C%20part.source%2C%20part.negate)%3B%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%20%20%7D%20%2F%2F%20--%20for%20method-based%20effects%20(complexObserver%20%26%20computed)%20--------------%0A%0A%20%20%2F**%0A%20%20%20*%20Adds%20property%20effects%20for%20each%20argument%20in%20the%20method%20signature%20(and%0A%20%20%20*%20optionally%2C%20for%20the%20method%20name%20if%20%60dynamic%60%20is%20true)%20that%20calls%20the%0A%20%20%20*%20provided%20effect%20function.%0A%20%20%20*%0A%20%20%20*%20%40param%20%7BElement%20%7C%20Object%7D%20model%20Prototype%20or%20instance%0A%20%20%20*%20%40param%20%7B!MethodSignature%7D%20sig%20Method%20signature%20metadata%0A%20%20%20*%20%40param%20%7Bstring%7D%20type%20Type%20of%20property%20effect%20to%20add%0A%20%20%20*%20%40param%20%7BFunction%7D%20effectFn%20Function%20to%20run%20when%20arguments%20change%0A%20%20%20*%20%40param%20%7B*%3D%7D%20methodInfo%20Effect-specific%20information%20to%20be%20included%20in%0A%20%20%20*%20%20%20method%20effect%20metadata%0A%20%20%20*%20%40param%20%7Bboolean%7CObject%3D%7D%20dynamicFn%20Boolean%20or%20object%20map%20indicating%20whether%0A%20%20%20*%20%20%20method%20names%20should%20be%20included%20as%20a%20dependency%20to%20the%20effect.%20Note%2C%0A%20%20%20*%20%20%20defaults%20to%20true%20if%20the%20signature%20is%20static%20(sig.static%20is%20true).%0A%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20createMethodEffect(model%2C%20sig%2C%20type%2C%20effectFn%2C%20methodInfo%2C%20dynamicFn)%20%7B%0A%20%20%20%20dynamicFn%20%3D%20sig.static%20%7C%7C%20dynamicFn%20%26%26%20(typeof%20dynamicFn%20!%3D%3D%20'object'%20%7C%7C%20dynamicFn%5Bsig.methodName%5D)%3B%0A%20%20%20%20let%20info%20%3D%20%7B%0A%20%20%20%20%20%20methodName%3A%20sig.methodName%2C%0A%20%20%20%20%20%20args%3A%20sig.args%2C%0A%20%20%20%20%20%20methodInfo%2C%0A%20%20%20%20%20%20dynamicFn%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20for%20(let%20i%20%3D%200%2C%20arg%3B%20i%20%3C%20sig.args.length%20%26%26%20(arg%20%3D%20sig.args%5Bi%5D)%3B%20i%2B%2B)%20%7B%0A%20%20%20%20%20%20if%20(!arg.literal)%20%7B%0A%20%20%20%20%20%20%20%20model._addPropertyEffect(arg.rootProperty%2C%20type%2C%20%7B%0A%20%20%20%20%20%20%20%20%20%20fn%3A%20effectFn%2C%0A%20%20%20%20%20%20%20%20%20%20info%3A%20info%2C%0A%20%20%20%20%20%20%20%20%20%20trigger%3A%20arg%0A%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20(dynamicFn)%20%7B%0A%20%20%20%20%20%20model._addPropertyEffect(sig.methodName%2C%20type%2C%20%7B%0A%20%20%20%20%20%20%20%20fn%3A%20effectFn%2C%0A%20%20%20%20%20%20%20%20info%3A%20info%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Calls%20a%20method%20with%20arguments%20marshaled%20from%20properties%20on%20the%20instance%0A%20%20%20*%20based%20on%20the%20method%20signature%20contained%20in%20the%20effect%20metadata.%0A%20%20%20*%0A%20%20%20*%20Multi-property%20observers%2C%20computed%20properties%2C%20and%20inline%20computing%0A%20%20%20*%20functions%20call%20this%20function%20to%20invoke%20the%20method%2C%20then%20use%20the%20return%0A%20%20%20*%20value%20accordingly.%0A%20%20%20*%0A%20%20%20*%20%40param%20%7B!PropertyEffectsType%7D%20inst%20The%20instance%20the%20effect%20will%20be%20run%20on%0A%20%20%20*%20%40param%20%7Bstring%7D%20property%20Name%20of%20property%0A%20%20%20*%20%40param%20%7BObject%7D%20props%20Bag%20of%20current%20property%20changes%0A%20%20%20*%20%40param%20%7BObject%7D%20oldProps%20Bag%20of%20previous%20values%20for%20changed%20properties%0A%20%20%20*%20%40param%20%7B%3F%7D%20info%20Effect%20metadata%0A%20%20%20*%20%40return%20%7B*%7D%20Returns%20the%20return%20value%20from%20the%20method%20invocation%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20runMethodEffect(inst%2C%20property%2C%20props%2C%20oldProps%2C%20info)%20%7B%0A%20%20%20%20%2F%2F%20Instances%20can%20optionally%20have%20a%20_methodHost%20which%20allows%20redirecting%20where%0A%20%20%20%20%2F%2F%20to%20find%20methods.%20Currently%20used%20by%20%60templatize%60.%0A%20%20%20%20let%20context%20%3D%20inst._methodHost%20%7C%7C%20inst%3B%0A%20%20%20%20let%20fn%20%3D%20context%5Binfo.methodName%5D%3B%0A%0A%20%20%20%20if%20(fn)%20%7B%0A%20%20%20%20%20%20let%20args%20%3D%20inst._marshalArgs(info.args%2C%20property%2C%20props)%3B%0A%0A%20%20%20%20%20%20return%20fn.apply(context%2C%20args)%3B%0A%20%20%20%20%7D%20else%20if%20(!info.dynamicFn)%20%7B%0A%20%20%20%20%20%20console.warn('method%20%60'%20%2B%20info.methodName%20%2B%20'%60%20not%20defined')%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20const%20emptyArray%20%3D%20%5B%5D%3B%20%2F%2F%20Regular%20expressions%20used%20for%20binding%0A%0A%20%20const%20IDENT%20%3D%20'(%3F%3A'%20%2B%20'%5Ba-zA-Z_%24%5D%5B%5C%5Cw.%3A%24%5C%5C-*%5D*'%20%2B%20')'%3B%0A%20%20const%20NUMBER%20%3D%20'(%3F%3A'%20%2B%20'%5B-%2B%5D%3F%5B0-9%5D*%5C%5C.%3F%5B0-9%5D%2B(%3F%3A%5BeE%5D%5B-%2B%5D%3F%5B0-9%5D%2B)%3F'%20%2B%20')'%3B%0A%20%20const%20SQUOTE_STRING%20%3D%20'(%3F%3A'%20%2B%20'%5C'(%3F%3A%5B%5E%5C'%5C%5C%5C%5C%5D%7C%5C%5C%5C%5C.)*%5C''%20%2B%20')'%3B%0A%20%20const%20DQUOTE_STRING%20%3D%20'(%3F%3A'%20%2B%20'%22(%3F%3A%5B%5E%22%5C%5C%5C%5C%5D%7C%5C%5C%5C%5C.)*%22'%20%2B%20')'%3B%0A%20%20const%20STRING%20%3D%20'(%3F%3A'%20%2B%20SQUOTE_STRING%20%2B%20'%7C'%20%2B%20DQUOTE_STRING%20%2B%20')'%3B%0A%20%20const%20ARGUMENT%20%3D%20'(%3F%3A('%20%2B%20IDENT%20%2B%20'%7C'%20%2B%20NUMBER%20%2B%20'%7C'%20%2B%20STRING%20%2B%20')%5C%5Cs*'%20%2B%20')'%3B%0A%20%20const%20ARGUMENTS%20%3D%20'(%3F%3A'%20%2B%20ARGUMENT%20%2B%20'(%3F%3A%2C%5C%5Cs*'%20%2B%20ARGUMENT%20%2B%20')*'%20%2B%20')'%3B%0A%20%20const%20ARGUMENT_LIST%20%3D%20'(%3F%3A'%20%2B%20'%5C%5C(%5C%5Cs*'%20%2B%20'(%3F%3A'%20%2B%20ARGUMENTS%20%2B%20'%3F'%20%2B%20')'%20%2B%20'%5C%5C)%5C%5Cs*'%20%2B%20')'%3B%0A%20%20const%20BINDING%20%3D%20'('%20%2B%20IDENT%20%2B%20'%5C%5Cs*'%20%2B%20ARGUMENT_LIST%20%2B%20'%3F'%20%2B%20')'%3B%20%2F%2F%20Group%203%0A%0A%20%20const%20OPEN_BRACKET%20%3D%20'(%5C%5C%5B%5C%5C%5B%7C%7B%7B)'%20%2B%20'%5C%5Cs*'%3B%0A%20%20const%20CLOSE_BRACKET%20%3D%20'(%3F%3A%5D%5D%7C%7D%7D)'%3B%0A%20%20const%20NEGATE%20%3D%20'(%3F%3A(!)%5C%5Cs*)%3F'%3B%20%2F%2F%20Group%202%0A%0A%20%20const%20EXPRESSION%20%3D%20OPEN_BRACKET%20%2B%20NEGATE%20%2B%20BINDING%20%2B%20CLOSE_BRACKET%3B%0A%20%20const%20bindingRegex%20%3D%20new%20RegExp(EXPRESSION%2C%20%22g%22)%3B%0A%20%20%2F**%0A%20%20%20*%20Create%20a%20string%20from%20binding%20parts%20of%20all%20the%20literal%20parts%0A%20%20%20*%0A%20%20%20*%20%40param%20%7B!Array%3CBindingPart%3E%7D%20parts%20All%20parts%20to%20stringify%0A%20%20%20*%20%40return%20%7Bstring%7D%20String%20made%20from%20the%20literal%20parts%0A%20%20%20*%2F%0A%0A%20%20function%20literalFromParts(parts)%20%7B%0A%20%20%20%20let%20s%20%3D%20''%3B%0A%0A%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%20parts.length%3B%20i%2B%2B)%20%7B%0A%20%20%20%20%20%20let%20literal%20%3D%20parts%5Bi%5D.literal%3B%0A%20%20%20%20%20%20s%20%2B%3D%20literal%20%7C%7C%20''%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20s%3B%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Parses%20an%20expression%20string%20for%20a%20method%20signature%2C%20and%20returns%20a%20metadata%0A%20%20%20*%20describing%20the%20method%20in%20terms%20of%20%60methodName%60%2C%20%60static%60%20(whether%20all%20the%0A%20%20%20*%20arguments%20are%20literals)%2C%20and%20an%20array%20of%20%60args%60%0A%20%20%20*%0A%20%20%20*%20%40param%20%7Bstring%7D%20expression%20The%20expression%20to%20parse%0A%20%20%20*%20%40return%20%7B%3FMethodSignature%7D%20The%20method%20metadata%20object%20if%20a%20method%20expression%20was%0A%20%20%20*%20%20%20found%2C%20otherwise%20%60undefined%60%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20parseMethod(expression)%20%7B%0A%20%20%20%20%2F%2F%20tries%20to%20match%20valid%20javascript%20property%20names%0A%20%20%20%20let%20m%20%3D%20expression.match(%2F(%5B%5E%5Cs%5D%2B%3F)%5C((%5B%5Cs%5CS%5D*)%5C)%2F)%3B%0A%0A%20%20%20%20if%20(m)%20%7B%0A%20%20%20%20%20%20let%20methodName%20%3D%20m%5B1%5D%3B%0A%20%20%20%20%20%20let%20sig%20%3D%20%7B%0A%20%20%20%20%20%20%20%20methodName%2C%0A%20%20%20%20%20%20%20%20static%3A%20true%2C%0A%20%20%20%20%20%20%20%20args%3A%20emptyArray%0A%20%20%20%20%20%20%7D%3B%0A%0A%20%20%20%20%20%20if%20(m%5B2%5D.trim())%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20replace%20escaped%20commas%20with%20comma%20entity%2C%20split%20on%20un-escaped%20commas%0A%20%20%20%20%20%20%20%20let%20args%20%3D%20m%5B2%5D.replace(%2F%5C%5C%2C%2Fg%2C%20'%26comma%3B').split('%2C')%3B%0A%20%20%20%20%20%20%20%20return%20parseArgs(args%2C%20sig)%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20return%20sig%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20null%3B%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Parses%20an%20array%20of%20arguments%20and%20sets%20the%20%60args%60%20property%20of%20the%20supplied%0A%20%20%20*%20signature%20metadata%20object.%20Sets%20the%20%60static%60%20property%20to%20false%20if%20any%0A%20%20%20*%20argument%20is%20a%20non-literal.%0A%20%20%20*%0A%20%20%20*%20%40param%20%7B!Array%3Cstring%3E%7D%20argList%20Array%20of%20argument%20names%0A%20%20%20*%20%40param%20%7B!MethodSignature%7D%20sig%20Method%20signature%20metadata%20object%0A%20%20%20*%20%40return%20%7B!MethodSignature%7D%20The%20updated%20signature%20metadata%20object%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20parseArgs(argList%2C%20sig)%20%7B%0A%20%20%20%20sig.args%20%3D%20argList.map(function%20(rawArg)%20%7B%0A%20%20%20%20%20%20let%20arg%20%3D%20parseArg(rawArg)%3B%0A%0A%20%20%20%20%20%20if%20(!arg.literal)%20%7B%0A%20%20%20%20%20%20%20%20sig.static%20%3D%20false%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20return%20arg%3B%0A%20%20%20%20%7D%2C%20this)%3B%0A%20%20%20%20return%20sig%3B%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Parses%20an%20individual%20argument%2C%20and%20returns%20an%20argument%20metadata%20object%0A%20%20%20*%20with%20the%20following%20fields%3A%0A%20%20%20*%0A%20%20%20*%20%20%20%7B%0A%20%20%20*%20%20%20%20%20value%3A%20'prop'%2C%20%20%20%20%20%20%20%20%2F%2F%20property%2Fpath%20or%20literal%20value%0A%20%20%20*%20%20%20%20%20literal%3A%20false%2C%20%20%20%20%20%20%20%2F%2F%20whether%20argument%20is%20a%20literal%0A%20%20%20*%20%20%20%20%20structured%3A%20false%2C%20%20%20%20%2F%2F%20whether%20the%20property%20is%20a%20path%0A%20%20%20*%20%20%20%20%20rootProperty%3A%20'prop'%2C%20%2F%2F%20the%20root%20property%20of%20the%20path%0A%20%20%20*%20%20%20%20%20wildcard%3A%20false%20%20%20%20%20%20%20%2F%2F%20whether%20the%20argument%20was%20a%20wildcard%20'.*'%20path%0A%20%20%20*%20%20%20%7D%0A%20%20%20*%0A%20%20%20*%20%40param%20%7Bstring%7D%20rawArg%20The%20string%20value%20of%20the%20argument%0A%20%20%20*%20%40return%20%7B!MethodArg%7D%20Argument%20metadata%20object%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20parseArg(rawArg)%20%7B%0A%20%20%20%20%2F%2F%20clean%20up%20whitespace%0A%20%20%20%20let%20arg%20%3D%20rawArg.trim()%20%2F%2F%20replace%20comma%20entity%20with%20comma%0A%20%20%20%20.replace(%2F%26comma%3B%2Fg%2C%20'%2C')%20%2F%2F%20repair%20extra%20escape%20sequences%3B%20note%20only%20commas%20strictly%20need%0A%20%20%20%20%2F%2F%20escaping%2C%20but%20we%20allow%20any%20other%20char%20to%20be%20escaped%20since%20its%0A%20%20%20%20%2F%2F%20likely%20users%20will%20do%20this%0A%20%20%20%20.replace(%2F%5C%5C(.)%2Fg%2C%20'%5C%241')%3B%20%2F%2F%20basic%20argument%20descriptor%0A%0A%20%20%20%20let%20a%20%3D%20%7B%0A%20%20%20%20%20%20name%3A%20arg%2C%0A%20%20%20%20%20%20value%3A%20''%2C%0A%20%20%20%20%20%20literal%3A%20false%0A%20%20%20%20%7D%3B%20%2F%2F%20detect%20literal%20value%20(must%20be%20String%20or%20Number)%0A%0A%20%20%20%20let%20fc%20%3D%20arg%5B0%5D%3B%0A%0A%20%20%20%20if%20(fc%20%3D%3D%3D%20'-')%20%7B%0A%20%20%20%20%20%20fc%20%3D%20arg%5B1%5D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20(fc%20%3E%3D%20'0'%20%26%26%20fc%20%3C%3D%20'9')%20%7B%0A%20%20%20%20%20%20fc%20%3D%20'%23'%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20switch%20(fc)%20%7B%0A%20%20%20%20%20%20case%20%22'%22%3A%0A%20%20%20%20%20%20case%20'%22'%3A%0A%20%20%20%20%20%20%20%20a.value%20%3D%20arg.slice(1%2C%20-1)%3B%0A%20%20%20%20%20%20%20%20a.literal%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%0A%20%20%20%20%20%20case%20'%23'%3A%0A%20%20%20%20%20%20%20%20a.value%20%3D%20Number(arg)%3B%0A%20%20%20%20%20%20%20%20a.literal%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%7D%20%2F%2F%20if%20not%20literal%2C%20look%20for%20structured%20path%0A%0A%0A%20%20%20%20if%20(!a.literal)%20%7B%0A%20%20%20%20%20%20a.rootProperty%20%3D%20Polymer.Path.root(arg)%3B%20%2F%2F%20detect%20structured%20path%20(has%20dots)%0A%0A%20%20%20%20%20%20a.structured%20%3D%20Polymer.Path.isPath(arg)%3B%0A%0A%20%20%20%20%20%20if%20(a.structured)%20%7B%0A%20%20%20%20%20%20%20%20a.wildcard%20%3D%20arg.slice(-2)%20%3D%3D%20'.*'%3B%0A%0A%20%20%20%20%20%20%20%20if%20(a.wildcard)%20%7B%0A%20%20%20%20%20%20%20%20%20%20a.name%20%3D%20arg.slice(0%2C%20-2)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20a%3B%0A%20%20%7D%20%2F%2F%20data%20api%0A%0A%20%20%2F**%0A%20%20%20*%20Sends%20array%20splice%20notifications%20(%60.splices%60%20and%20%60.length%60)%0A%20%20%20*%0A%20%20%20*%20Note%3A%20this%20implementation%20only%20accepts%20normalized%20paths%0A%20%20%20*%0A%20%20%20*%20%40param%20%7B!PropertyEffectsType%7D%20inst%20Instance%20to%20send%20notifications%20to%0A%20%20%20*%20%40param%20%7BArray%7D%20array%20The%20array%20the%20mutations%20occurred%20on%0A%20%20%20*%20%40param%20%7Bstring%7D%20path%20The%20path%20to%20the%20array%20that%20was%20mutated%0A%20%20%20*%20%40param%20%7BArray%7D%20splices%20Array%20of%20splice%20records%0A%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20notifySplices(inst%2C%20array%2C%20path%2C%20splices)%20%7B%0A%20%20%20%20let%20splicesPath%20%3D%20path%20%2B%20'.splices'%3B%0A%20%20%20%20inst.notifyPath(splicesPath%2C%20%7B%0A%20%20%20%20%20%20indexSplices%3A%20splices%0A%20%20%20%20%7D)%3B%0A%20%20%20%20inst.notifyPath(path%20%2B%20'.length'%2C%20array.length)%3B%20%2F%2F%20Null%20here%20to%20allow%20potentially%20large%20splice%20records%20to%20be%20GC'ed.%0A%0A%20%20%20%20inst.__data%5BsplicesPath%5D%20%3D%20%7B%0A%20%20%20%20%20%20indexSplices%3A%20null%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Creates%20a%20splice%20record%20and%20sends%20an%20array%20splice%20notification%20for%0A%20%20%20*%20the%20described%20mutation%0A%20%20%20*%0A%20%20%20*%20Note%3A%20this%20implementation%20only%20accepts%20normalized%20paths%0A%20%20%20*%0A%20%20%20*%20%40param%20%7B!PropertyEffectsType%7D%20inst%20Instance%20to%20send%20notifications%20to%0A%20%20%20*%20%40param%20%7BArray%7D%20array%20The%20array%20the%20mutations%20occurred%20on%0A%20%20%20*%20%40param%20%7Bstring%7D%20path%20The%20path%20to%20the%20array%20that%20was%20mutated%0A%20%20%20*%20%40param%20%7Bnumber%7D%20index%20Index%20at%20which%20the%20array%20mutation%20occurred%0A%20%20%20*%20%40param%20%7Bnumber%7D%20addedCount%20Number%20of%20added%20items%0A%20%20%20*%20%40param%20%7BArray%7D%20removed%20Array%20of%20removed%20items%0A%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20notifySplice(inst%2C%20array%2C%20path%2C%20index%2C%20addedCount%2C%20removed)%20%7B%0A%20%20%20%20notifySplices(inst%2C%20array%2C%20path%2C%20%5B%7B%0A%20%20%20%20%20%20index%3A%20index%2C%0A%20%20%20%20%20%20addedCount%3A%20addedCount%2C%0A%20%20%20%20%20%20removed%3A%20removed%2C%0A%20%20%20%20%20%20object%3A%20array%2C%0A%20%20%20%20%20%20type%3A%20'splice'%0A%20%20%20%20%7D%5D)%3B%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Returns%20an%20upper-cased%20version%20of%20the%20string.%0A%20%20%20*%0A%20%20%20*%20%40param%20%7Bstring%7D%20name%20String%20to%20uppercase%0A%20%20%20*%20%40return%20%7Bstring%7D%20Uppercased%20string%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%0A%20%20function%20upper(name)%20%7B%0A%20%20%20%20return%20name%5B0%5D.toUpperCase()%20%2B%20name.substring(1)%3B%0A%20%20%7D%0A%20%20%2F**%0A%20%20%20*%20Element%20class%20mixin%20that%20provides%20meta-programming%20for%20Polymer's%20template%0A%20%20%20*%20binding%20and%20data%20observation%20(collectively%2C%20%22property%20effects%22)%20system.%0A%20%20%20*%0A%20%20%20*%20This%20mixin%20uses%20provides%20the%20following%20key%20static%20methods%20for%20adding%0A%20%20%20*%20property%20effects%20to%20an%20element%20class%3A%0A%20%20%20*%20-%20%60addPropertyEffect%60%0A%20%20%20*%20-%20%60createPropertyObserver%60%0A%20%20%20*%20-%20%60createMethodObserver%60%0A%20%20%20*%20-%20%60createNotifyingProperty%60%0A%20%20%20*%20-%20%60createReadOnlyProperty%60%0A%20%20%20*%20-%20%60createReflectedProperty%60%0A%20%20%20*%20-%20%60createComputedProperty%60%0A%20%20%20*%20-%20%60bindTemplate%60%0A%20%20%20*%0A%20%20%20*%20Each%20method%20creates%20one%20or%20more%20property%20accessors%2C%20along%20with%20metadata%0A%20%20%20*%20used%20by%20this%20mixin's%20implementation%20of%20%60_propertiesChanged%60%20to%20perform%0A%20%20%20*%20the%20property%20effects.%0A%20%20%20*%0A%20%20%20*%20Underscored%20versions%20of%20the%20above%20methods%20also%20exist%20on%20the%20element%0A%20%20%20*%20prototype%20for%20adding%20property%20effects%20on%20instances%20at%20runtime.%0A%20%20%20*%0A%20%20%20*%20Note%20that%20this%20mixin%20overrides%20several%20%60PropertyAccessors%60%20methods%2C%20in%0A%20%20%20*%20many%20cases%20to%20maintain%20guarantees%20provided%20by%20the%20Polymer%201.x%20features%3B%0A%20%20%20*%20notably%20it%20changes%20property%20accessors%20to%20be%20synchronous%20by%20default%0A%20%20%20*%20whereas%20the%20default%20when%20using%20%60PropertyAccessors%60%20standalone%20is%20to%20be%0A%20%20%20*%20async%20by%20default.%0A%20%20%20*%0A%20%20%20*%20%40mixinFunction%0A%20%20%20*%20%40polymer%0A%20%20%20*%20%40appliesMixin%20Polymer.TemplateStamp%0A%20%20%20*%20%40appliesMixin%20Polymer.PropertyAccessors%0A%20%20%20*%20%40memberof%20Polymer%0A%20%20%20*%20%40summary%20Element%20class%20mixin%20that%20provides%20meta-programming%20for%20Polymer's%0A%20%20%20*%20template%20binding%20and%20data%20observation%20system.%0A%20%20%20*%2F%0A%0A%0A%20%20Polymer.PropertyEffects%20%3D%20Polymer.dedupingMixin(superClass%20%3D%3E%20%7B%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%40constructor%0A%20%20%20%20%20*%20%40extends%20%7BsuperClass%7D%0A%20%20%20%20%20*%20%40implements%20%7BPolymer_PropertyAccessors%7D%0A%20%20%20%20%20*%20%40implements%20%7BPolymer_TemplateStamp%7D%0A%20%20%20%20%20*%20%40unrestricted%0A%20%20%20%20%20*%20%40private%0A%20%20%20%20%20*%2F%0A%20%20%20%20const%20propertyEffectsBase%20%3D%20Polymer.TemplateStamp(Polymer.PropertyAccessors(superClass))%3B%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%40polymer%0A%20%20%20%20%20*%20%40mixinClass%0A%20%20%20%20%20*%20%40implements%20%7BPolymer_PropertyEffects%7D%0A%20%20%20%20%20*%20%40extends%20%7BpropertyEffectsBase%7D%0A%20%20%20%20%20*%20%40unrestricted%0A%20%20%20%20%20*%2F%0A%0A%20%20%20%20class%20PropertyEffects%20extends%20propertyEffectsBase%20%7B%0A%20%20%20%20%20%20constructor()%20%7B%0A%20%20%20%20%20%20%20%20super()%3B%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7Bboolean%7D%20*%2F%0A%20%20%20%20%20%20%20%20%2F%2F%20Used%20to%20identify%20users%20of%20this%20mixin%2C%20ala%20instanceof%0A%0A%20%20%20%20%20%20%20%20this.__isPropertyEffectsClient%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7Bnumber%7D%20*%2F%0A%20%20%20%20%20%20%20%20%2F%2F%20NOTE%3A%20used%20to%20track%20re-entrant%20calls%20to%20%60_flushProperties%60%0A%20%20%20%20%20%20%20%20%2F%2F%20path%20changes%20dirty%20check%20against%20%60__dataTemp%60%20only%20during%20one%20%22turn%22%0A%20%20%20%20%20%20%20%20%2F%2F%20and%20are%20cleared%20when%20%60__dataCounter%60%20returns%20to%200.%0A%0A%20%20%20%20%20%20%20%20this.__dataCounter%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7Bboolean%7D%20*%2F%0A%0A%20%20%20%20%20%20%20%20this.__dataClientsReady%3B%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7BArray%7D%20*%2F%0A%0A%20%20%20%20%20%20%20%20this.__dataPendingClients%3B%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7BObject%7D%20*%2F%0A%0A%20%20%20%20%20%20%20%20this.__dataToNotify%3B%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7BObject%7D%20*%2F%0A%0A%20%20%20%20%20%20%20%20this.__dataLinkedPaths%3B%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7Bboolean%7D%20*%2F%0A%0A%20%20%20%20%20%20%20%20this.__dataHasPaths%3B%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7BObject%7D%20*%2F%0A%0A%20%20%20%20%20%20%20%20this.__dataCompoundStorage%3B%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7BPolymer_PropertyEffects%7D%20*%2F%0A%0A%20%20%20%20%20%20%20%20this.__dataHost%3B%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7B!Object%7D%20*%2F%0A%0A%20%20%20%20%20%20%20%20this.__dataTemp%3B%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7Bboolean%7D%20*%2F%0A%0A%20%20%20%20%20%20%20%20this.__dataClientsInitialized%3B%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7B!Object%7D%20*%2F%0A%0A%20%20%20%20%20%20%20%20this.__data%3B%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7B!Object%7D%20*%2F%0A%0A%20%20%20%20%20%20%20%20this.__dataPending%3B%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7B!Object%7D%20*%2F%0A%0A%20%20%20%20%20%20%20%20this.__dataOld%3B%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7BObject%7D%20*%2F%0A%0A%20%20%20%20%20%20%20%20this.__computeEffects%3B%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7BObject%7D%20*%2F%0A%0A%20%20%20%20%20%20%20%20this.__reflectEffects%3B%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7BObject%7D%20*%2F%0A%0A%20%20%20%20%20%20%20%20this.__notifyEffects%3B%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7BObject%7D%20*%2F%0A%0A%20%20%20%20%20%20%20%20this.__propagateEffects%3B%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7BObject%7D%20*%2F%0A%0A%20%20%20%20%20%20%20%20this.__observeEffects%3B%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7BObject%7D%20*%2F%0A%0A%20%20%20%20%20%20%20%20this.__readOnly%3B%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7B!TemplateInfo%7D%20*%2F%0A%0A%20%20%20%20%20%20%20%20this.__templateInfo%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20get%20PROPERTY_EFFECT_TYPES()%20%7B%0A%20%20%20%20%20%20%20%20return%20TYPES%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_initializeProperties()%20%7B%0A%20%20%20%20%20%20%20%20super._initializeProperties()%3B%0A%0A%20%20%20%20%20%20%20%20hostStack.registerHost(this)%3B%0A%20%20%20%20%20%20%20%20this.__dataClientsReady%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20this.__dataPendingClients%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20this.__dataToNotify%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20this.__dataLinkedPaths%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20this.__dataHasPaths%20%3D%20false%3B%20%2F%2F%20May%20be%20set%20on%20instance%20prior%20to%20upgrade%0A%0A%20%20%20%20%20%20%20%20this.__dataCompoundStorage%20%3D%20this.__dataCompoundStorage%20%7C%7C%20null%3B%0A%20%20%20%20%20%20%20%20this.__dataHost%20%3D%20this.__dataHost%20%7C%7C%20null%3B%0A%20%20%20%20%20%20%20%20this.__dataTemp%20%3D%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20this.__dataClientsInitialized%20%3D%20false%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Overrides%20%60Polymer.PropertyAccessors%60%20implementation%20to%20provide%20a%0A%20%20%20%20%20%20%20*%20more%20efficient%20implementation%20of%20initializing%20properties%20from%0A%20%20%20%20%20%20%20*%20the%20prototype%20on%20the%20instance.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40override%0A%20%20%20%20%20%20%20*%20%40param%20%7BObject%7D%20props%20Properties%20to%20initialize%20on%20the%20prototype%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_initializeProtoProperties(props)%20%7B%0A%20%20%20%20%20%20%20%20this.__data%20%3D%20Object.create(props)%3B%0A%20%20%20%20%20%20%20%20this.__dataPending%20%3D%20Object.create(props)%3B%0A%20%20%20%20%20%20%20%20this.__dataOld%20%3D%20%7B%7D%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Overrides%20%60Polymer.PropertyAccessors%60%20implementation%20to%20avoid%20setting%0A%20%20%20%20%20%20%20*%20%60_setProperty%60's%20%60shouldNotify%3A%20true%60.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40override%0A%20%20%20%20%20%20%20*%20%40param%20%7BObject%7D%20props%20Properties%20to%20initialize%20on%20the%20instance%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_initializeInstanceProperties(props)%20%7B%0A%20%20%20%20%20%20%20%20let%20readOnly%20%3D%20this%5BTYPES.READ_ONLY%5D%3B%0A%0A%20%20%20%20%20%20%20%20for%20(let%20prop%20in%20props)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(!readOnly%20%7C%7C%20!readOnly%5Bprop%5D)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.__dataPending%20%3D%20this.__dataPending%20%7C%7C%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.__dataOld%20%3D%20this.__dataOld%20%7C%7C%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.__data%5Bprop%5D%20%3D%20this.__dataPending%5Bprop%5D%20%3D%20props%5Bprop%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20%2F%2F%20Prototype%20setup%20----------------------------------------%0A%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Equivalent%20to%20static%20%60addPropertyEffect%60%20API%20but%20can%20be%20called%20on%0A%20%20%20%20%20%20%20*%20an%20instance%20to%20add%20effects%20at%20runtime.%20%20See%20that%20method%20for%0A%20%20%20%20%20%20%20*%20full%20API%20docs.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20property%20Property%20that%20should%20trigger%20the%20effect%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20type%20Effect%20type%2C%20from%20this.PROPERTY_EFFECT_TYPES%0A%20%20%20%20%20%20%20*%20%40param%20%7BObject%3D%7D%20effect%20Effect%20metadata%20object%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_addPropertyEffect(property%2C%20type%2C%20effect)%20%7B%0A%20%20%20%20%20%20%20%20this._createPropertyAccessor(property%2C%20type%20%3D%3D%20TYPES.READ_ONLY)%3B%20%2F%2F%20effects%20are%20accumulated%20into%20arrays%20per%20property%20based%20on%20type%0A%0A%0A%20%20%20%20%20%20%20%20let%20effects%20%3D%20ensureOwnEffectMap(this%2C%20type)%5Bproperty%5D%3B%0A%0A%20%20%20%20%20%20%20%20if%20(!effects)%20%7B%0A%20%20%20%20%20%20%20%20%20%20effects%20%3D%20this%5Btype%5D%5Bproperty%5D%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20effects.push(effect)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Removes%20the%20given%20property%20effect.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20property%20Property%20the%20effect%20was%20associated%20with%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20type%20Effect%20type%2C%20from%20this.PROPERTY_EFFECT_TYPES%0A%20%20%20%20%20%20%20*%20%40param%20%7BObject%3D%7D%20effect%20Effect%20metadata%20object%20to%20remove%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_removePropertyEffect(property%2C%20type%2C%20effect)%20%7B%0A%20%20%20%20%20%20%20%20let%20effects%20%3D%20ensureOwnEffectMap(this%2C%20type)%5Bproperty%5D%3B%0A%20%20%20%20%20%20%20%20let%20idx%20%3D%20effects.indexOf(effect)%3B%0A%0A%20%20%20%20%20%20%20%20if%20(idx%20%3E%3D%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20effects.splice(idx%2C%201)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Returns%20whether%20the%20current%20prototype%2Finstance%20has%20a%20property%20effect%0A%20%20%20%20%20%20%20*%20of%20a%20certain%20type.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20property%20Property%20name%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%3D%7D%20type%20Effect%20type%2C%20from%20this.PROPERTY_EFFECT_TYPES%0A%20%20%20%20%20%20%20*%20%40return%20%7Bboolean%7D%20True%20if%20the%20prototype%2Finstance%20has%20an%20effect%20of%20this%20type%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_hasPropertyEffect(property%2C%20type)%20%7B%0A%20%20%20%20%20%20%20%20let%20effects%20%3D%20this%5Btype%5D%3B%0A%20%20%20%20%20%20%20%20return%20Boolean(effects%20%26%26%20effects%5Bproperty%5D)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Returns%20whether%20the%20current%20prototype%2Finstance%20has%20a%20%22read%20only%22%0A%20%20%20%20%20%20%20*%20accessor%20for%20the%20given%20property.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20property%20Property%20name%0A%20%20%20%20%20%20%20*%20%40return%20%7Bboolean%7D%20True%20if%20the%20prototype%2Finstance%20has%20an%20effect%20of%20this%20type%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_hasReadOnlyEffect(property)%20%7B%0A%20%20%20%20%20%20%20%20return%20this._hasPropertyEffect(property%2C%20TYPES.READ_ONLY)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Returns%20whether%20the%20current%20prototype%2Finstance%20has%20a%20%22notify%22%0A%20%20%20%20%20%20%20*%20property%20effect%20for%20the%20given%20property.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20property%20Property%20name%0A%20%20%20%20%20%20%20*%20%40return%20%7Bboolean%7D%20True%20if%20the%20prototype%2Finstance%20has%20an%20effect%20of%20this%20type%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_hasNotifyEffect(property)%20%7B%0A%20%20%20%20%20%20%20%20return%20this._hasPropertyEffect(property%2C%20TYPES.NOTIFY)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Returns%20whether%20the%20current%20prototype%2Finstance%20has%20a%20%22reflect%20to%20attribute%22%0A%20%20%20%20%20%20%20*%20property%20effect%20for%20the%20given%20property.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20property%20Property%20name%0A%20%20%20%20%20%20%20*%20%40return%20%7Bboolean%7D%20True%20if%20the%20prototype%2Finstance%20has%20an%20effect%20of%20this%20type%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_hasReflectEffect(property)%20%7B%0A%20%20%20%20%20%20%20%20return%20this._hasPropertyEffect(property%2C%20TYPES.REFLECT)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Returns%20whether%20the%20current%20prototype%2Finstance%20has%20a%20%22computed%22%0A%20%20%20%20%20%20%20*%20property%20effect%20for%20the%20given%20property.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20property%20Property%20name%0A%20%20%20%20%20%20%20*%20%40return%20%7Bboolean%7D%20True%20if%20the%20prototype%2Finstance%20has%20an%20effect%20of%20this%20type%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_hasComputedEffect(property)%20%7B%0A%20%20%20%20%20%20%20%20return%20this._hasPropertyEffect(property%2C%20TYPES.COMPUTE)%3B%0A%20%20%20%20%20%20%7D%20%2F%2F%20Runtime%20----------------------------------------%0A%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Sets%20a%20pending%20property%20or%20path.%20%20If%20the%20root%20property%20of%20the%20path%20in%0A%20%20%20%20%20%20%20*%20question%20had%20no%20accessor%2C%20the%20path%20is%20set%2C%20otherwise%20it%20is%20enqueued%0A%20%20%20%20%20%20%20*%20via%20%60_setPendingProperty%60.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20This%20function%20isolates%20relatively%20expensive%20functionality%20necessary%0A%20%20%20%20%20%20%20*%20for%20the%20public%20API%20(%60set%60%2C%20%60setProperties%60%2C%20%60notifyPath%60%2C%20and%20property%0A%20%20%20%20%20%20%20*%20change%20listeners%20via%20%7B%7B...%7D%7D%20bindings)%2C%20such%20that%20it%20is%20only%20done%0A%20%20%20%20%20%20%20*%20when%20paths%20enter%20the%20system%2C%20and%20not%20at%20every%20propagation%20step.%20%20It%0A%20%20%20%20%20%20%20*%20also%20sets%20a%20%60__dataHasPaths%60%20flag%20on%20the%20instance%20which%20is%20used%20to%0A%20%20%20%20%20%20%20*%20fast-path%20slower%20path-matching%20code%20in%20the%20property%20effects%20host%20paths.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%60path%60%20can%20be%20a%20path%20string%20or%20array%20of%20path%20parts%20as%20accepted%20by%20the%0A%20%20%20%20%20%20%20*%20public%20API.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%20%7C%20!Array%3Cnumber%7Cstring%3E%7D%20path%20Path%20to%20set%0A%20%20%20%20%20%20%20*%20%40param%20%7B*%7D%20value%20Value%20to%20set%0A%20%20%20%20%20%20%20*%20%40param%20%7Bboolean%3D%7D%20shouldNotify%20Set%20to%20true%20if%20this%20change%20should%0A%20%20%20%20%20%20%20*%20%20cause%20a%20property%20notification%20event%20dispatch%0A%20%20%20%20%20%20%20*%20%40param%20%7Bboolean%3D%7D%20isPathNotification%20If%20the%20path%20being%20set%20is%20a%20path%0A%20%20%20%20%20%20%20*%20%20%20notification%20of%20an%20already%20changed%20value%2C%20as%20opposed%20to%20a%20request%0A%20%20%20%20%20%20%20*%20%20%20to%20set%20and%20notify%20the%20change.%20%20In%20the%20latter%20%60false%60%20case%2C%20a%20dirty%0A%20%20%20%20%20%20%20*%20%20%20check%20is%20performed%20and%20then%20the%20value%20is%20set%20to%20the%20path%20before%0A%20%20%20%20%20%20%20*%20%20%20enqueuing%20the%20pending%20property%20change.%0A%20%20%20%20%20%20%20*%20%40return%20%7Bboolean%7D%20Returns%20true%20if%20the%20property%2Fpath%20was%20enqueued%20in%0A%20%20%20%20%20%20%20*%20%20%20the%20pending%20changes%20bag.%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_setPendingPropertyOrPath(path%2C%20value%2C%20shouldNotify%2C%20isPathNotification)%20%7B%0A%20%20%20%20%20%20%20%20if%20(isPathNotification%20%7C%7C%20Polymer.Path.root(Array.isArray(path)%20%3F%20path%5B0%5D%20%3A%20path)%20!%3D%3D%20path)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Dirty%20check%20changes%20being%20set%20to%20a%20path%20against%20the%20actual%20object%2C%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20since%20this%20is%20the%20entry%20point%20for%20paths%20into%20the%20system%3B%20from%20here%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20the%20only%20dirty%20checks%20are%20against%20the%20%60__dataTemp%60%20cache%20to%20prevent%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20duplicate%20work%20in%20the%20same%20turn%20only.%20Note%2C%20if%20this%20was%20a%20notification%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20of%20a%20change%20already%20set%20to%20a%20path%20(isPathNotification%3A%20true)%2C%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20we%20always%20let%20the%20change%20through%20and%20skip%20the%20%60set%60%20since%20it%20was%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20already%20dirty%20checked%20at%20the%20point%20of%20entry%20and%20the%20underlying%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20object%20has%20already%20been%20updated%0A%20%20%20%20%20%20%20%20%20%20if%20(!isPathNotification)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20let%20old%20%3D%20Polymer.Path.get(this%2C%20path)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20path%20%3D%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F**%20%40type%20%7Bstring%7D%20*%2F%0A%20%20%20%20%20%20%20%20%20%20%20%20Polymer.Path.set(this%2C%20path%2C%20value)%3B%20%2F%2F%20Use%20property-accessor's%20simpler%20dirty%20check%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(!path%20%7C%7C%20!super._shouldPropertyChange(path%2C%20value%2C%20old))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20this.__dataHasPaths%20%3D%20true%3B%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(this._setPendingProperty(%0A%20%20%20%20%20%20%20%20%20%20%2F**%40type%7Bstring%7D*%2F%0A%20%20%20%20%20%20%20%20%20%20path%2C%20value%2C%20shouldNotify))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20computeLinkedPaths(this%2C%20path%2C%20value)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(this.__dataHasAccessor%20%26%26%20this.__dataHasAccessor%5Bpath%5D)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20this._setPendingProperty(%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F**%40type%7Bstring%7D*%2F%0A%20%20%20%20%20%20%20%20%20%20%20%20path%2C%20value%2C%20shouldNotify)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20this%5Bpath%5D%20%3D%20value%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Applies%20a%20value%20to%20a%20non-Polymer%20element%2Fnode's%20property.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20The%20implementation%20makes%20a%20best-effort%20at%20binding%20interop%3A%0A%20%20%20%20%20%20%20*%20Some%20native%20element%20properties%20have%20side-effects%20when%0A%20%20%20%20%20%20%20*%20re-setting%20the%20same%20value%20(e.g.%20setting%20%60%3Cinput%3E.value%60%20resets%20the%0A%20%20%20%20%20%20%20*%20cursor%20position)%2C%20so%20we%20do%20a%20dirty-check%20before%20setting%20the%20value.%0A%20%20%20%20%20%20%20*%20However%2C%20for%20better%20interop%20with%20non-Polymer%20custom%20elements%20that%0A%20%20%20%20%20%20%20*%20accept%20objects%2C%20we%20explicitly%20re-set%20object%20changes%20coming%20from%20the%0A%20%20%20%20%20%20%20*%20Polymer%20world%20(which%20may%20include%20deep%20object%20changes%20without%20the%0A%20%20%20%20%20%20%20*%20top%20reference%20changing)%2C%20erring%20on%20the%20side%20of%20providing%20more%0A%20%20%20%20%20%20%20*%20information.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20Users%20may%20override%20this%20method%20to%20provide%20alternate%20approaches.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7B!Node%7D%20node%20The%20node%20to%20set%20a%20property%20on%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20prop%20The%20property%20to%20set%0A%20%20%20%20%20%20%20*%20%40param%20%7B*%7D%20value%20The%20value%20to%20set%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_setUnmanagedPropertyToNode(node%2C%20prop%2C%20value)%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20It%20is%20a%20judgment%20call%20that%20resetting%20primitives%20is%0A%20%20%20%20%20%20%20%20%2F%2F%20%22bad%22%20and%20resettings%20objects%20is%20also%20%22good%22%3B%20alternatively%20we%20could%0A%20%20%20%20%20%20%20%20%2F%2F%20implement%20a%20whitelist%20of%20tag%20%26%20property%20values%20that%20should%20never%0A%20%20%20%20%20%20%20%20%2F%2F%20be%20reset%20(e.g.%20%3Cinput%3E.value%20%26%26%20%3Cselect%3E.value)%0A%20%20%20%20%20%20%20%20if%20(value%20!%3D%3D%20node%5Bprop%5D%20%7C%7C%20typeof%20value%20%3D%3D%20'object')%20%7B%0A%20%20%20%20%20%20%20%20%20%20node%5Bprop%5D%20%3D%20value%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Overrides%20the%20%60PropertiesChanged%60%20implementation%20to%20introduce%20special%0A%20%20%20%20%20%20%20*%20dirty%20check%20logic%20depending%20on%20the%20property%20%26%20value%20being%20set%3A%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%201.%20Any%20value%20set%20to%20a%20path%20(e.g.%20'obj.prop'%3A%2042%20or%20'obj.prop'%3A%20%7B...%7D)%0A%20%20%20%20%20%20%20*%20%20%20%20Stored%20in%20%60__dataTemp%60%2C%20dirty%20checked%20against%20%60__dataTemp%60%0A%20%20%20%20%20%20%20*%202.%20Object%20set%20to%20simple%20property%20(e.g.%20'prop'%3A%20%7B...%7D)%0A%20%20%20%20%20%20%20*%20%20%20%20Stored%20in%20%60__dataTemp%60%20and%20%60__data%60%2C%20dirty%20checked%20against%0A%20%20%20%20%20%20%20*%20%20%20%20%60__dataTemp%60%20by%20default%20implementation%20of%20%60_shouldPropertyChange%60%0A%20%20%20%20%20%20%20*%203.%20Primitive%20value%20set%20to%20simple%20property%20(e.g.%20'prop'%3A%2042)%0A%20%20%20%20%20%20%20*%20%20%20%20Stored%20in%20%60__data%60%2C%20dirty%20checked%20against%20%60__data%60%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20The%20dirty-check%20is%20important%20to%20prevent%20cycles%20due%20to%20two-way%0A%20%20%20%20%20%20%20*%20notification%2C%20but%20paths%20and%20objects%20are%20only%20dirty%20checked%20against%20any%0A%20%20%20%20%20%20%20*%20previous%20value%20set%20during%20this%20turn%20via%20a%20%22temporary%20cache%22%20that%20is%0A%20%20%20%20%20%20%20*%20cleared%20when%20the%20last%20%60_propertiesChanged%60%20exits.%20This%20is%20so%3A%0A%20%20%20%20%20%20%20*%20a.%20any%20cached%20array%20paths%20(e.g.%20'array.3.prop')%20may%20be%20invalidated%0A%20%20%20%20%20%20%20*%20%20%20%20due%20to%20array%20mutations%20like%20shift%2Funshift%2Fsplice%3B%20this%20is%20fine%0A%20%20%20%20%20%20%20*%20%20%20%20since%20path%20changes%20are%20dirty-checked%20at%20user%20entry%20points%20like%20%60set%60%0A%20%20%20%20%20%20%20*%20b.%20dirty-checking%20for%20objects%20only%20lasts%20one%20turn%20to%20allow%20the%20user%0A%20%20%20%20%20%20%20*%20%20%20%20to%20mutate%20the%20object%20in-place%20and%20re-set%20it%20with%20the%20same%20identity%0A%20%20%20%20%20%20%20*%20%20%20%20and%20have%20all%20sub-properties%20re-propagated%20in%20a%20subsequent%20turn.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20The%20temp%20cache%20is%20not%20necessarily%20sufficient%20to%20prevent%20invalid%20array%0A%20%20%20%20%20%20%20*%20paths%2C%20since%20a%20splice%20can%20happen%20during%20the%20same%20turn%20(with%20pathological%0A%20%20%20%20%20%20%20*%20user%20code)%3B%20we%20could%20introduce%20a%20%22fixup%22%20for%20temporarily%20cached%20array%0A%20%20%20%20%20%20%20*%20paths%20if%20needed%3A%20https%3A%2F%2Fgithub.com%2FPolymer%2Fpolymer%2Fissues%2F4227%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40override%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20property%20Name%20of%20the%20property%0A%20%20%20%20%20%20%20*%20%40param%20%7B*%7D%20value%20Value%20to%20set%0A%20%20%20%20%20%20%20*%20%40param%20%7Bboolean%3D%7D%20shouldNotify%20True%20if%20property%20should%20fire%20notification%0A%20%20%20%20%20%20%20*%20%20%20event%20(applies%20only%20for%20%60notify%3A%20true%60%20properties)%0A%20%20%20%20%20%20%20*%20%40return%20%7Bboolean%7D%20Returns%20true%20if%20the%20property%20changed%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_setPendingProperty(property%2C%20value%2C%20shouldNotify)%20%7B%0A%20%20%20%20%20%20%20%20let%20isPath%20%3D%20this.__dataHasPaths%20%26%26%20Polymer.Path.isPath(property)%3B%0A%20%20%20%20%20%20%20%20let%20prevProps%20%3D%20isPath%20%3F%20this.__dataTemp%20%3A%20this.__data%3B%0A%0A%20%20%20%20%20%20%20%20if%20(this._shouldPropertyChange(property%2C%20value%2C%20prevProps%5Bproperty%5D))%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(!this.__dataPending)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.__dataPending%20%3D%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.__dataOld%20%3D%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20%2F%2F%20Ensure%20old%20is%20captured%20from%20the%20last%20turn%0A%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(!(property%20in%20this.__dataOld))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.__dataOld%5Bproperty%5D%20%3D%20this.__data%5Bproperty%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20%2F%2F%20Paths%20are%20stored%20in%20temporary%20cache%20(cleared%20at%20end%20of%20turn)%2C%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20which%20is%20used%20for%20dirty-checking%2C%20all%20others%20stored%20in%20__data%0A%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(isPath)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.__dataTemp%5Bproperty%5D%20%3D%20value%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.__data%5Bproperty%5D%20%3D%20value%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20%2F%2F%20All%20changes%20go%20into%20pending%20property%20bag%2C%20passed%20to%20_propertiesChanged%0A%0A%0A%20%20%20%20%20%20%20%20%20%20this.__dataPending%5Bproperty%5D%20%3D%20value%3B%20%2F%2F%20Track%20properties%20that%20should%20notify%20separately%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(isPath%20%7C%7C%20this%5BTYPES.NOTIFY%5D%20%26%26%20this%5BTYPES.NOTIFY%5D%5Bproperty%5D)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.__dataToNotify%20%3D%20this.__dataToNotify%20%7C%7C%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.__dataToNotify%5Bproperty%5D%20%3D%20shouldNotify%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Overrides%20base%20implementation%20to%20ensure%20all%20accessors%20set%20%60shouldNotify%60%0A%20%20%20%20%20%20%20*%20to%20true%2C%20for%20per-property%20notification%20tracking.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40override%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20property%20Name%20of%20the%20property%0A%20%20%20%20%20%20%20*%20%40param%20%7B*%7D%20value%20Value%20to%20set%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_setProperty(property%2C%20value)%20%7B%0A%20%20%20%20%20%20%20%20if%20(this._setPendingProperty(property%2C%20value%2C%20true))%20%7B%0A%20%20%20%20%20%20%20%20%20%20this._invalidateProperties()%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Overrides%20%60PropertyAccessor%60's%20default%20async%20queuing%20of%0A%20%20%20%20%20%20%20*%20%60_propertiesChanged%60%3A%20if%20%60__dataReady%60%20is%20false%20(has%20not%20yet%20been%0A%20%20%20%20%20%20%20*%20manually%20flushed)%2C%20the%20function%20no-ops%3B%20otherwise%20flushes%0A%20%20%20%20%20%20%20*%20%60_propertiesChanged%60%20synchronously.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40override%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_invalidateProperties()%20%7B%0A%20%20%20%20%20%20%20%20if%20(this.__dataReady)%20%7B%0A%20%20%20%20%20%20%20%20%20%20this._flushProperties()%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Enqueues%20the%20given%20client%20on%20a%20list%20of%20pending%20clients%2C%20whose%0A%20%20%20%20%20%20%20*%20pending%20property%20changes%20can%20later%20be%20flushed%20via%20a%20call%20to%0A%20%20%20%20%20%20%20*%20%60_flushClients%60.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7BObject%7D%20client%20PropertyEffects%20client%20to%20enqueue%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_enqueueClient(client)%20%7B%0A%20%20%20%20%20%20%20%20this.__dataPendingClients%20%3D%20this.__dataPendingClients%20%7C%7C%20%5B%5D%3B%0A%0A%20%20%20%20%20%20%20%20if%20(client%20!%3D%3D%20this)%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.__dataPendingClients.push(client)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Overrides%20superclass%20implementation.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_flushProperties()%20%7B%0A%20%20%20%20%20%20%20%20this.__dataCounter%2B%2B%3B%0A%0A%20%20%20%20%20%20%20%20super._flushProperties()%3B%0A%0A%20%20%20%20%20%20%20%20this.__dataCounter--%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Flushes%20any%20clients%20previously%20enqueued%20via%20%60_enqueueClient%60%2C%20causing%0A%20%20%20%20%20%20%20*%20their%20%60_flushProperties%60%20method%20to%20run.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_flushClients()%20%7B%0A%20%20%20%20%20%20%20%20if%20(!this.__dataClientsReady)%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.__dataClientsReady%20%3D%20true%3B%0A%0A%20%20%20%20%20%20%20%20%20%20this._readyClients()%3B%20%2F%2F%20Override%20point%20where%20accessors%20are%20turned%20on%3B%20importantly%2C%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20this%20is%20after%20clients%20have%20fully%20readied%2C%20providing%20a%20guarantee%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20that%20any%20property%20effects%20occur%20only%20after%20all%20clients%20are%20ready.%0A%0A%0A%20%20%20%20%20%20%20%20%20%20this.__dataReady%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.__enableOrFlushClients()%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20%2F%2F%20NOTE%3A%20We%20ensure%20clients%20either%20enable%20or%20flush%20as%20appropriate.%20This%0A%20%20%20%20%20%20%2F%2F%20handles%20two%20corner%20cases%3A%0A%20%20%20%20%20%20%2F%2F%20(1)%20clients%20flush%20properly%20when%20connected%2Fenabled%20before%20the%20host%0A%20%20%20%20%20%20%2F%2F%20enables%3B%20e.g.%0A%20%20%20%20%20%20%2F%2F%20%20%20(a)%20Templatize%20stamps%20with%20no%20properties%20and%20does%20not%20flush%20and%0A%20%20%20%20%20%20%2F%2F%20%20%20(b)%20the%20instance%20is%20inserted%20into%20dom%20and%0A%20%20%20%20%20%20%2F%2F%20%20%20(c)%20then%20the%20instance%20flushes.%0A%20%20%20%20%20%20%2F%2F%20(2)%20clients%20enable%20properly%20when%20not%20connected%2Fenabled%20when%20the%20host%0A%20%20%20%20%20%20%2F%2F%20flushes%3B%20e.g.%0A%20%20%20%20%20%20%2F%2F%20%20%20(a)%20a%20template%20is%20runtime%20stamped%20and%20not%20yet%20connected%2Fenabled%0A%20%20%20%20%20%20%2F%2F%20%20%20(b)%20a%20host%20sets%20a%20property%2C%20causing%20stamped%20dom%20to%20flush%0A%20%20%20%20%20%20%2F%2F%20%20%20(c)%20the%20stamped%20dom%20enables.%0A%0A%0A%20%20%20%20%20%20__enableOrFlushClients()%20%7B%0A%20%20%20%20%20%20%20%20let%20clients%20%3D%20this.__dataPendingClients%3B%0A%0A%20%20%20%20%20%20%20%20if%20(clients)%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.__dataPendingClients%20%3D%20null%3B%0A%0A%20%20%20%20%20%20%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%20clients.length%3B%20i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20let%20client%20%3D%20clients%5Bi%5D%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(!client.__dataEnabled)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20client._enableProperties()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(client.__dataPending)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20client._flushProperties()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Perform%20any%20initial%20setup%20on%20client%20dom.%20Called%20before%20the%20first%0A%20%20%20%20%20%20%20*%20%60_flushProperties%60%20call%20on%20client%20dom%20and%20before%20any%20element%0A%20%20%20%20%20%20%20*%20observers%20are%20called.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_readyClients()%20%7B%0A%20%20%20%20%20%20%20%20this.__enableOrFlushClients()%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Sets%20a%20bag%20of%20property%20changes%20to%20this%20instance%2C%20and%0A%20%20%20%20%20%20%20*%20synchronously%20processes%20all%20effects%20of%20the%20properties%20as%20a%20batch.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20Property%20names%20must%20be%20simple%20properties%2C%20not%20paths.%20%20Batched%0A%20%20%20%20%20%20%20*%20path%20propagation%20is%20not%20supported.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7BObject%7D%20props%20Bag%20of%20one%20or%20more%20key-value%20pairs%20whose%20key%20is%0A%20%20%20%20%20%20%20*%20%20%20a%20property%20and%20value%20is%20the%20new%20value%20to%20set%20for%20that%20property.%0A%20%20%20%20%20%20%20*%20%40param%20%7Bboolean%3D%7D%20setReadOnly%20When%20true%2C%20any%20private%20values%20set%20in%0A%20%20%20%20%20%20%20*%20%20%20%60props%60%20will%20be%20set.%20By%20default%2C%20%60setProperties%60%20will%20not%20set%0A%20%20%20%20%20%20%20*%20%20%20%60readOnly%3A%20true%60%20root%20properties.%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40public%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20setProperties(props%2C%20setReadOnly)%20%7B%0A%20%20%20%20%20%20%20%20for%20(let%20path%20in%20props)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(setReadOnly%20%7C%7C%20!this%5BTYPES.READ_ONLY%5D%20%7C%7C%20!this%5BTYPES.READ_ONLY%5D%5Bpath%5D)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FTODO(kschaaf)%3A%20explicitly%20disallow%20paths%20in%20setProperty%3F%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20wildcard%20observers%20currently%20only%20pass%20the%20first%20changed%20path%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20in%20the%20%60info%60%20object%2C%20and%20you%20could%20do%20some%20odd%20things%20batching%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20paths%2C%20e.g.%20%7B'foo.bar'%3A%20%7B...%7D%2C%20'foo'%3A%20null%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20this._setPendingPropertyOrPath(path%2C%20props%5Bpath%5D%2C%20true)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20this._invalidateProperties()%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Overrides%20%60PropertyAccessors%60%20so%20that%20property%20accessor%0A%20%20%20%20%20%20%20*%20side%20effects%20are%20not%20enabled%20until%20after%20client%20dom%20is%20fully%20ready.%0A%20%20%20%20%20%20%20*%20Also%20calls%20%60_flushClients%60%20callback%20to%20ensure%20client%20dom%20is%20enabled%0A%20%20%20%20%20%20%20*%20that%20was%20not%20enabled%20as%20a%20result%20of%20flushing%20properties.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40override%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20ready()%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20It%20is%20important%20that%20%60super.ready()%60%20is%20not%20called%20here%20as%20it%0A%20%20%20%20%20%20%20%20%2F%2F%20immediately%20turns%20on%20accessors.%20Instead%2C%20we%20wait%20until%20%60readyClients%60%0A%20%20%20%20%20%20%20%20%2F%2F%20to%20enable%20accessors%20to%20provide%20a%20guarantee%20that%20clients%20are%20ready%0A%20%20%20%20%20%20%20%20%2F%2F%20before%20processing%20any%20accessors%20side%20effects.%0A%20%20%20%20%20%20%20%20this._flushProperties()%3B%20%2F%2F%20If%20no%20data%20was%20pending%2C%20%60_flushProperties%60%20will%20not%20%60flushClients%60%0A%20%20%20%20%20%20%20%20%2F%2F%20so%20ensure%20this%20is%20done.%0A%0A%0A%20%20%20%20%20%20%20%20if%20(!this.__dataClientsReady)%20%7B%0A%20%20%20%20%20%20%20%20%20%20this._flushClients()%3B%0A%20%20%20%20%20%20%20%20%7D%20%2F%2F%20Before%20ready%2C%20client%20notifications%20do%20not%20trigger%20_flushProperties.%0A%20%20%20%20%20%20%20%20%2F%2F%20Therefore%20a%20flush%20is%20necessary%20here%20if%20data%20has%20been%20set.%0A%0A%0A%20%20%20%20%20%20%20%20if%20(this.__dataPending)%20%7B%0A%20%20%20%20%20%20%20%20%20%20this._flushProperties()%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Implements%20%60PropertyAccessors%60's%20properties%20changed%20callback.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20Runs%20each%20class%20of%20effects%20for%20the%20batch%20of%20changed%20properties%20in%0A%20%20%20%20%20%20%20*%20a%20specific%20order%20(compute%2C%20propagate%2C%20reflect%2C%20observe%2C%20notify).%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7B!Object%7D%20currentProps%20Bag%20of%20all%20current%20accessor%20values%0A%20%20%20%20%20%20%20*%20%40param%20%7B!Object%7D%20changedProps%20Bag%20of%20properties%20changed%20since%20the%20last%0A%20%20%20%20%20%20%20*%20%20%20call%20to%20%60_propertiesChanged%60%0A%20%20%20%20%20%20%20*%20%40param%20%7B!Object%7D%20oldProps%20Bag%20of%20previous%20values%20for%20each%20property%0A%20%20%20%20%20%20%20*%20%20%20in%20%60changedProps%60%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_propertiesChanged(currentProps%2C%20changedProps%2C%20oldProps)%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20----------------------------%0A%20%20%20%20%20%20%20%20%2F%2F%20let%20c%20%3D%20Object.getOwnPropertyNames(changedProps%20%7C%7C%20%7B%7D)%3B%0A%20%20%20%20%20%20%20%20%2F%2F%20window.debug%20%26%26%20console.group(this.localName%20%2B%20'%23'%20%2B%20this.id%20%2B%20'%3A%20'%20%2B%20c)%3B%0A%20%20%20%20%20%20%20%20%2F%2F%20if%20(window.debug)%20%7B%20debugger%3B%20%7D%0A%20%20%20%20%20%20%20%20%2F%2F%20----------------------------%0A%20%20%20%20%20%20%20%20let%20hasPaths%20%3D%20this.__dataHasPaths%3B%0A%20%20%20%20%20%20%20%20this.__dataHasPaths%20%3D%20false%3B%20%2F%2F%20Compute%20properties%0A%0A%20%20%20%20%20%20%20%20runComputedEffects(this%2C%20changedProps%2C%20oldProps%2C%20hasPaths)%3B%20%2F%2F%20Clear%20notify%20properties%20prior%20to%20possible%20reentry%20(propagate%2C%20observe)%2C%0A%20%20%20%20%20%20%20%20%2F%2F%20but%20after%20computing%20effects%20have%20a%20chance%20to%20add%20to%20them%0A%0A%20%20%20%20%20%20%20%20let%20notifyProps%20%3D%20this.__dataToNotify%3B%0A%20%20%20%20%20%20%20%20this.__dataToNotify%20%3D%20null%3B%20%2F%2F%20Propagate%20properties%20to%20clients%0A%0A%20%20%20%20%20%20%20%20this._propagatePropertyChanges(changedProps%2C%20oldProps%2C%20hasPaths)%3B%20%2F%2F%20Flush%20clients%0A%0A%0A%20%20%20%20%20%20%20%20this._flushClients()%3B%20%2F%2F%20Reflect%20properties%0A%0A%0A%20%20%20%20%20%20%20%20runEffects(this%2C%20this%5BTYPES.REFLECT%5D%2C%20changedProps%2C%20oldProps%2C%20hasPaths)%3B%20%2F%2F%20Observe%20properties%0A%0A%20%20%20%20%20%20%20%20runEffects(this%2C%20this%5BTYPES.OBSERVE%5D%2C%20changedProps%2C%20oldProps%2C%20hasPaths)%3B%20%2F%2F%20Notify%20properties%20to%20host%0A%0A%20%20%20%20%20%20%20%20if%20(notifyProps)%20%7B%0A%20%20%20%20%20%20%20%20%20%20runNotifyEffects(this%2C%20notifyProps%2C%20changedProps%2C%20oldProps%2C%20hasPaths)%3B%0A%20%20%20%20%20%20%20%20%7D%20%2F%2F%20Clear%20temporary%20cache%20at%20end%20of%20turn%0A%0A%0A%20%20%20%20%20%20%20%20if%20(this.__dataCounter%20%3D%3D%201)%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.__dataTemp%20%3D%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20%7D%20%2F%2F%20----------------------------%0A%20%20%20%20%20%20%20%20%2F%2F%20window.debug%20%26%26%20console.groupEnd(this.localName%20%2B%20'%23'%20%2B%20this.id%20%2B%20'%3A%20'%20%2B%20c)%3B%0A%20%20%20%20%20%20%20%20%2F%2F%20----------------------------%0A%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Called%20to%20propagate%20any%20property%20changes%20to%20stamped%20template%20nodes%0A%20%20%20%20%20%20%20*%20managed%20by%20this%20element.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7BObject%7D%20changedProps%20Bag%20of%20changed%20properties%0A%20%20%20%20%20%20%20*%20%40param%20%7BObject%7D%20oldProps%20Bag%20of%20previous%20values%20for%20changed%20properties%0A%20%20%20%20%20%20%20*%20%40param%20%7Bboolean%7D%20hasPaths%20True%20with%20%60props%60%20contains%20one%20or%20more%20paths%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_propagatePropertyChanges(changedProps%2C%20oldProps%2C%20hasPaths)%20%7B%0A%20%20%20%20%20%20%20%20if%20(this%5BTYPES.PROPAGATE%5D)%20%7B%0A%20%20%20%20%20%20%20%20%20%20runEffects(this%2C%20this%5BTYPES.PROPAGATE%5D%2C%20changedProps%2C%20oldProps%2C%20hasPaths)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20let%20templateInfo%20%3D%20this.__templateInfo%3B%0A%0A%20%20%20%20%20%20%20%20while%20(templateInfo)%20%7B%0A%20%20%20%20%20%20%20%20%20%20runEffects(this%2C%20templateInfo.propertyEffects%2C%20changedProps%2C%20oldProps%2C%20hasPaths%2C%20templateInfo.nodeList)%3B%0A%20%20%20%20%20%20%20%20%20%20templateInfo%20%3D%20templateInfo.nextTemplateInfo%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Aliases%20one%20data%20path%20as%20another%2C%20such%20that%20path%20notifications%20from%20one%0A%20%20%20%20%20%20%20*%20are%20routed%20to%20the%20other.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%20%7C%20!Array%3Cstring%7Cnumber%3E%7D%20to%20Target%20path%20to%20link.%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%20%7C%20!Array%3Cstring%7Cnumber%3E%7D%20from%20Source%20path%20to%20link.%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40public%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20linkPaths(to%2C%20from)%20%7B%0A%20%20%20%20%20%20%20%20to%20%3D%20Polymer.Path.normalize(to)%3B%0A%20%20%20%20%20%20%20%20from%20%3D%20Polymer.Path.normalize(from)%3B%0A%20%20%20%20%20%20%20%20this.__dataLinkedPaths%20%3D%20this.__dataLinkedPaths%20%7C%7C%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20this.__dataLinkedPaths%5Bto%5D%20%3D%20from%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Removes%20a%20data%20path%20alias%20previously%20established%20with%20%60_linkPaths%60.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20Note%2C%20the%20path%20to%20unlink%20should%20be%20the%20target%20(%60to%60)%20used%20when%0A%20%20%20%20%20%20%20*%20linking%20the%20paths.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%20%7C%20!Array%3Cstring%7Cnumber%3E%7D%20path%20Target%20path%20to%20unlink.%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40public%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20unlinkPaths(path)%20%7B%0A%20%20%20%20%20%20%20%20path%20%3D%20Polymer.Path.normalize(path)%3B%0A%0A%20%20%20%20%20%20%20%20if%20(this.__dataLinkedPaths)%20%7B%0A%20%20%20%20%20%20%20%20%20%20delete%20this.__dataLinkedPaths%5Bpath%5D%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Notify%20that%20an%20array%20has%20changed.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20Example%3A%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%20%20%20%20this.items%20%3D%20%5B%20%7Bname%3A%20'Jim'%7D%2C%20%7Bname%3A%20'Todd'%7D%2C%20%7Bname%3A%20'Bill'%7D%20%5D%3B%0A%20%20%20%20%20%20%20*%20%20%20%20%20...%0A%20%20%20%20%20%20%20*%20%20%20%20%20this.items.splice(1%2C%201%2C%20%7Bname%3A%20'Sam'%7D)%3B%0A%20%20%20%20%20%20%20*%20%20%20%20%20this.items.push(%7Bname%3A%20'Bob'%7D)%3B%0A%20%20%20%20%20%20%20*%20%20%20%20%20this.notifySplices('items'%2C%20%5B%0A%20%20%20%20%20%20%20*%20%20%20%20%20%20%20%7B%20index%3A%201%2C%20removed%3A%20%5B%7Bname%3A%20'Todd'%7D%5D%2C%20addedCount%3A%201%2C%20object%3A%20this.items%2C%20type%3A%20'splice'%20%7D%2C%0A%20%20%20%20%20%20%20*%20%20%20%20%20%20%20%7B%20index%3A%203%2C%20removed%3A%20%5B%5D%2C%20addedCount%3A%201%2C%20object%3A%20this.items%2C%20type%3A%20'splice'%7D%0A%20%20%20%20%20%20%20*%20%20%20%20%20%5D)%3B%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20path%20Path%20that%20should%20be%20notified.%0A%20%20%20%20%20%20%20*%20%40param%20%7BArray%7D%20splices%20Array%20of%20splice%20records%20indicating%20ordered%0A%20%20%20%20%20%20%20*%20%20%20changes%20that%20occurred%20to%20the%20array.%20Each%20record%20should%20have%20the%0A%20%20%20%20%20%20%20*%20%20%20following%20fields%3A%0A%20%20%20%20%20%20%20*%20%20%20%20*%20index%3A%20index%20at%20which%20the%20change%20occurred%0A%20%20%20%20%20%20%20*%20%20%20%20*%20removed%3A%20array%20of%20items%20that%20were%20removed%20from%20this%20index%0A%20%20%20%20%20%20%20*%20%20%20%20*%20addedCount%3A%20number%20of%20new%20items%20added%20at%20this%20index%0A%20%20%20%20%20%20%20*%20%20%20%20*%20object%3A%20a%20reference%20to%20the%20array%20in%20question%0A%20%20%20%20%20%20%20*%20%20%20%20*%20type%3A%20the%20string%20literal%20'splice'%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%20%20Note%20that%20splice%20records%20_must_%20be%20normalized%20such%20that%20they%20are%0A%20%20%20%20%20%20%20*%20%20%20reported%20in%20index%20order%20(raw%20results%20from%20%60Object.observe%60%20are%20not%0A%20%20%20%20%20%20%20*%20%20%20ordered%20and%20must%20be%20normalized%2Fmerged%20before%20notifying).%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40public%0A%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20notifySplices(path%2C%20splices)%20%7B%0A%20%20%20%20%20%20%20%20let%20info%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20path%3A%20''%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20let%20array%20%3D%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7BArray%7D%20*%2F%0A%20%20%20%20%20%20%20%20Polymer.Path.get(this%2C%20path%2C%20info)%3B%0A%20%20%20%20%20%20%20%20notifySplices(this%2C%20array%2C%20info.path%2C%20splices)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Convenience%20method%20for%20reading%20a%20value%20from%20a%20path.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20Note%2C%20if%20any%20part%20in%20the%20path%20is%20undefined%2C%20this%20method%20returns%0A%20%20%20%20%20%20%20*%20%60undefined%60%20(this%20method%20does%20not%20throw%20when%20dereferencing%20undefined%0A%20%20%20%20%20%20%20*%20paths).%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7B(string%7C!Array%3C(string%7Cnumber)%3E)%7D%20path%20Path%20to%20the%20value%0A%20%20%20%20%20%20%20*%20%20%20to%20read.%20%20The%20path%20may%20be%20specified%20as%20a%20string%20(e.g.%20%60foo.bar.baz%60)%0A%20%20%20%20%20%20%20*%20%20%20or%20an%20array%20of%20path%20parts%20(e.g.%20%60%5B'foo.bar'%2C%20'baz'%5D%60).%20%20Note%20that%0A%20%20%20%20%20%20%20*%20%20%20bracketed%20expressions%20are%20not%20supported%3B%20string-based%20path%20parts%0A%20%20%20%20%20%20%20*%20%20%20*must*%20be%20separated%20by%20dots.%20%20Note%20that%20when%20dereferencing%20array%0A%20%20%20%20%20%20%20*%20%20%20indices%2C%20the%20index%20may%20be%20used%20as%20a%20dotted%20part%20directly%0A%20%20%20%20%20%20%20*%20%20%20(e.g.%20%60users.12.name%60%20or%20%60%5B'users'%2C%2012%2C%20'name'%5D%60).%0A%20%20%20%20%20%20%20*%20%40param%20%7BObject%3D%7D%20root%20Root%20object%20from%20which%20the%20path%20is%20evaluated.%0A%20%20%20%20%20%20%20*%20%40return%20%7B*%7D%20Value%20at%20the%20path%2C%20or%20%60undefined%60%20if%20any%20part%20of%20the%20path%0A%20%20%20%20%20%20%20*%20%20%20is%20undefined.%0A%20%20%20%20%20%20%20*%20%40public%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20get(path%2C%20root)%20%7B%0A%20%20%20%20%20%20%20%20return%20Polymer.Path.get(root%20%7C%7C%20this%2C%20path)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Convenience%20method%20for%20setting%20a%20value%20to%20a%20path%20and%20notifying%20any%0A%20%20%20%20%20%20%20*%20elements%20bound%20to%20the%20same%20path.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20Note%2C%20if%20any%20part%20in%20the%20path%20except%20for%20the%20last%20is%20undefined%2C%0A%20%20%20%20%20%20%20*%20this%20method%20does%20nothing%20(this%20method%20does%20not%20throw%20when%0A%20%20%20%20%20%20%20*%20dereferencing%20undefined%20paths).%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7B(string%7C!Array%3C(string%7Cnumber)%3E)%7D%20path%20Path%20to%20the%20value%0A%20%20%20%20%20%20%20*%20%20%20to%20write.%20%20The%20path%20may%20be%20specified%20as%20a%20string%20(e.g.%20%60'foo.bar.baz'%60)%0A%20%20%20%20%20%20%20*%20%20%20or%20an%20array%20of%20path%20parts%20(e.g.%20%60%5B'foo.bar'%2C%20'baz'%5D%60).%20%20Note%20that%0A%20%20%20%20%20%20%20*%20%20%20bracketed%20expressions%20are%20not%20supported%3B%20string-based%20path%20parts%0A%20%20%20%20%20%20%20*%20%20%20*must*%20be%20separated%20by%20dots.%20%20Note%20that%20when%20dereferencing%20array%0A%20%20%20%20%20%20%20*%20%20%20indices%2C%20the%20index%20may%20be%20used%20as%20a%20dotted%20part%20directly%0A%20%20%20%20%20%20%20*%20%20%20(e.g.%20%60'users.12.name'%60%20or%20%60%5B'users'%2C%2012%2C%20'name'%5D%60).%0A%20%20%20%20%20%20%20*%20%40param%20%7B*%7D%20value%20Value%20to%20set%20at%20the%20specified%20path.%0A%20%20%20%20%20%20%20*%20%40param%20%7BObject%3D%7D%20root%20Root%20object%20from%20which%20the%20path%20is%20evaluated.%0A%20%20%20%20%20%20%20*%20%20%20When%20specified%2C%20no%20notification%20will%20occur.%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40public%0A%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20set(path%2C%20value%2C%20root)%20%7B%0A%20%20%20%20%20%20%20%20if%20(root)%20%7B%0A%20%20%20%20%20%20%20%20%20%20Polymer.Path.set(root%2C%20path%2C%20value)%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(!this%5BTYPES.READ_ONLY%5D%20%7C%7C%20!this%5BTYPES.READ_ONLY%5D%5B%0A%20%20%20%20%20%20%20%20%20%20%2F**%20%40type%20%7Bstring%7D%20*%2F%0A%20%20%20%20%20%20%20%20%20%20path%5D)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(this._setPendingPropertyOrPath(path%2C%20value%2C%20true))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._invalidateProperties()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Adds%20items%20onto%20the%20end%20of%20the%20array%20at%20the%20path%20specified.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20The%20arguments%20after%20%60path%60%20and%20return%20value%20match%20that%20of%0A%20%20%20%20%20%20%20*%20%60Array.prototype.push%60.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20This%20method%20notifies%20other%20paths%20to%20the%20same%20array%20that%20a%0A%20%20%20%20%20%20%20*%20splice%20occurred%20to%20the%20array.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%20%7C%20!Array%3Cstring%7Cnumber%3E%7D%20path%20Path%20to%20array.%0A%20%20%20%20%20%20%20*%20%40param%20%7B...*%7D%20items%20Items%20to%20push%20onto%20array%0A%20%20%20%20%20%20%20*%20%40return%20%7Bnumber%7D%20New%20length%20of%20the%20array.%0A%20%20%20%20%20%20%20*%20%40public%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20push(path%2C%20...items)%20%7B%0A%20%20%20%20%20%20%20%20let%20info%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20path%3A%20''%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20let%20array%20%3D%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7BArray%7D*%2F%0A%20%20%20%20%20%20%20%20Polymer.Path.get(this%2C%20path%2C%20info)%3B%0A%20%20%20%20%20%20%20%20let%20len%20%3D%20array.length%3B%0A%20%20%20%20%20%20%20%20let%20ret%20%3D%20array.push(...items)%3B%0A%0A%20%20%20%20%20%20%20%20if%20(items.length)%20%7B%0A%20%20%20%20%20%20%20%20%20%20notifySplice(this%2C%20array%2C%20info.path%2C%20len%2C%20items.length%2C%20%5B%5D)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20return%20ret%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Removes%20an%20item%20from%20the%20end%20of%20array%20at%20the%20path%20specified.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20The%20arguments%20after%20%60path%60%20and%20return%20value%20match%20that%20of%0A%20%20%20%20%20%20%20*%20%60Array.prototype.pop%60.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20This%20method%20notifies%20other%20paths%20to%20the%20same%20array%20that%20a%0A%20%20%20%20%20%20%20*%20splice%20occurred%20to%20the%20array.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%20%7C%20!Array%3Cstring%7Cnumber%3E%7D%20path%20Path%20to%20array.%0A%20%20%20%20%20%20%20*%20%40return%20%7B*%7D%20Item%20that%20was%20removed.%0A%20%20%20%20%20%20%20*%20%40public%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20pop(path)%20%7B%0A%20%20%20%20%20%20%20%20let%20info%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20path%3A%20''%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20let%20array%20%3D%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7BArray%7D%20*%2F%0A%20%20%20%20%20%20%20%20Polymer.Path.get(this%2C%20path%2C%20info)%3B%0A%20%20%20%20%20%20%20%20let%20hadLength%20%3D%20Boolean(array.length)%3B%0A%20%20%20%20%20%20%20%20let%20ret%20%3D%20array.pop()%3B%0A%0A%20%20%20%20%20%20%20%20if%20(hadLength)%20%7B%0A%20%20%20%20%20%20%20%20%20%20notifySplice(this%2C%20array%2C%20info.path%2C%20array.length%2C%200%2C%20%5Bret%5D)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20return%20ret%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Starting%20from%20the%20start%20index%20specified%2C%20removes%200%20or%20more%20items%0A%20%20%20%20%20%20%20*%20from%20the%20array%20and%20inserts%200%20or%20more%20new%20items%20in%20their%20place.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20The%20arguments%20after%20%60path%60%20and%20return%20value%20match%20that%20of%0A%20%20%20%20%20%20%20*%20%60Array.prototype.splice%60.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20This%20method%20notifies%20other%20paths%20to%20the%20same%20array%20that%20a%0A%20%20%20%20%20%20%20*%20splice%20occurred%20to%20the%20array.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%20%7C%20!Array%3Cstring%7Cnumber%3E%7D%20path%20Path%20to%20array.%0A%20%20%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20start%20Index%20from%20which%20to%20start%20removing%2Finserting.%0A%20%20%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20deleteCount%20Number%20of%20items%20to%20remove.%0A%20%20%20%20%20%20%20*%20%40param%20%7B...*%7D%20items%20Items%20to%20insert%20into%20array.%0A%20%20%20%20%20%20%20*%20%40return%20%7BArray%7D%20Array%20of%20removed%20items.%0A%20%20%20%20%20%20%20*%20%40public%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20splice(path%2C%20start%2C%20deleteCount%2C%20...items)%20%7B%0A%20%20%20%20%20%20%20%20let%20info%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20path%3A%20''%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20let%20array%20%3D%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7BArray%7D%20*%2F%0A%20%20%20%20%20%20%20%20Polymer.Path.get(this%2C%20path%2C%20info)%3B%20%2F%2F%20Normalize%20fancy%20native%20splice%20handling%20of%20crazy%20start%20values%0A%0A%20%20%20%20%20%20%20%20if%20(start%20%3C%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20start%20%3D%20array.length%20-%20Math.floor(-start)%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20(start)%20%7B%0A%20%20%20%20%20%20%20%20%20%20start%20%3D%20Math.floor(start)%3B%0A%20%20%20%20%20%20%20%20%7D%20%2F%2F%20array.splice%20does%20different%20things%20based%20on%20the%20number%20of%20arguments%0A%20%20%20%20%20%20%20%20%2F%2F%20you%20pass%20in.%20Therefore%2C%20array.splice(0)%20and%20array.splice(0%2C%20undefined)%0A%20%20%20%20%20%20%20%20%2F%2F%20do%20different%20things.%20In%20the%20former%2C%20the%20whole%20array%20is%20cleared.%20In%20the%0A%20%20%20%20%20%20%20%20%2F%2F%20latter%2C%20no%20items%20are%20removed.%0A%20%20%20%20%20%20%20%20%2F%2F%20This%20means%20that%20we%20need%20to%20detect%20whether%201.%20one%20of%20the%20arguments%0A%20%20%20%20%20%20%20%20%2F%2F%20is%20actually%20passed%20in%20and%20then%202.%20determine%20how%20many%20arguments%0A%20%20%20%20%20%20%20%20%2F%2F%20we%20should%20pass%20on%20to%20the%20native%20array.splice%0A%20%20%20%20%20%20%20%20%2F%2F%0A%0A%0A%20%20%20%20%20%20%20%20let%20ret%3B%20%2F%2F%20Omit%20any%20additional%20arguments%20if%20they%20were%20not%20passed%20in%0A%0A%20%20%20%20%20%20%20%20if%20(arguments.length%20%3D%3D%3D%202)%20%7B%0A%20%20%20%20%20%20%20%20%20%20ret%20%3D%20array.splice(start)%3B%20%2F%2F%20Either%20start%20was%20undefined%20and%20the%20others%20were%20defined%2C%20but%20in%20this%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20case%20we%20can%20safely%20pass%20on%20all%20arguments%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Note%3A%20this%20includes%20the%20case%20where%20none%20of%20the%20arguments%20were%20passed%20in%2C%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20e.g.%20this.splice('array').%20However%2C%20if%20both%20start%20and%20deleteCount%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20are%20undefined%2C%20array.splice%20will%20not%20modify%20the%20array%20(as%20expected)%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20ret%20%3D%20array.splice(start%2C%20deleteCount%2C%20...items)%3B%0A%20%20%20%20%20%20%20%20%7D%20%2F%2F%20At%20the%20end%2C%20check%20whether%20any%20items%20were%20passed%20in%20(e.g.%20insertions)%0A%20%20%20%20%20%20%20%20%2F%2F%20or%20if%20the%20return%20array%20contains%20items%20(e.g.%20deletions).%0A%20%20%20%20%20%20%20%20%2F%2F%20Only%20notify%20if%20items%20were%20added%20or%20deleted.%0A%0A%0A%20%20%20%20%20%20%20%20if%20(items.length%20%7C%7C%20ret.length)%20%7B%0A%20%20%20%20%20%20%20%20%20%20notifySplice(this%2C%20array%2C%20info.path%2C%20start%2C%20items.length%2C%20ret)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20return%20ret%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Removes%20an%20item%20from%20the%20beginning%20of%20array%20at%20the%20path%20specified.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20The%20arguments%20after%20%60path%60%20and%20return%20value%20match%20that%20of%0A%20%20%20%20%20%20%20*%20%60Array.prototype.pop%60.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20This%20method%20notifies%20other%20paths%20to%20the%20same%20array%20that%20a%0A%20%20%20%20%20%20%20*%20splice%20occurred%20to%20the%20array.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%20%7C%20!Array%3Cstring%7Cnumber%3E%7D%20path%20Path%20to%20array.%0A%20%20%20%20%20%20%20*%20%40return%20%7B*%7D%20Item%20that%20was%20removed.%0A%20%20%20%20%20%20%20*%20%40public%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20shift(path)%20%7B%0A%20%20%20%20%20%20%20%20let%20info%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20path%3A%20''%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20let%20array%20%3D%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7BArray%7D%20*%2F%0A%20%20%20%20%20%20%20%20Polymer.Path.get(this%2C%20path%2C%20info)%3B%0A%20%20%20%20%20%20%20%20let%20hadLength%20%3D%20Boolean(array.length)%3B%0A%20%20%20%20%20%20%20%20let%20ret%20%3D%20array.shift()%3B%0A%0A%20%20%20%20%20%20%20%20if%20(hadLength)%20%7B%0A%20%20%20%20%20%20%20%20%20%20notifySplice(this%2C%20array%2C%20info.path%2C%200%2C%200%2C%20%5Bret%5D)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20return%20ret%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Adds%20items%20onto%20the%20beginning%20of%20the%20array%20at%20the%20path%20specified.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20The%20arguments%20after%20%60path%60%20and%20return%20value%20match%20that%20of%0A%20%20%20%20%20%20%20*%20%60Array.prototype.push%60.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20This%20method%20notifies%20other%20paths%20to%20the%20same%20array%20that%20a%0A%20%20%20%20%20%20%20*%20splice%20occurred%20to%20the%20array.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%20%7C%20!Array%3Cstring%7Cnumber%3E%7D%20path%20Path%20to%20array.%0A%20%20%20%20%20%20%20*%20%40param%20%7B...*%7D%20items%20Items%20to%20insert%20info%20array%0A%20%20%20%20%20%20%20*%20%40return%20%7Bnumber%7D%20New%20length%20of%20the%20array.%0A%20%20%20%20%20%20%20*%20%40public%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20unshift(path%2C%20...items)%20%7B%0A%20%20%20%20%20%20%20%20let%20info%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20path%3A%20''%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20let%20array%20%3D%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7BArray%7D%20*%2F%0A%20%20%20%20%20%20%20%20Polymer.Path.get(this%2C%20path%2C%20info)%3B%0A%20%20%20%20%20%20%20%20let%20ret%20%3D%20array.unshift(...items)%3B%0A%0A%20%20%20%20%20%20%20%20if%20(items.length)%20%7B%0A%20%20%20%20%20%20%20%20%20%20notifySplice(this%2C%20array%2C%20info.path%2C%200%2C%20items.length%2C%20%5B%5D)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20return%20ret%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Notify%20that%20a%20path%20has%20changed.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20Example%3A%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%20%20%20%20this.item.user.name%20%3D%20'Bob'%3B%0A%20%20%20%20%20%20%20*%20%20%20%20%20this.notifyPath('item.user.name')%3B%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20path%20Path%20that%20should%20be%20notified.%0A%20%20%20%20%20%20%20*%20%40param%20%7B*%3D%7D%20value%20Value%20at%20the%20path%20(optional).%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40public%0A%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20notifyPath(path%2C%20value)%20%7B%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7Bstring%7D%20*%2F%0A%20%20%20%20%20%20%20%20let%20propPath%3B%0A%0A%20%20%20%20%20%20%20%20if%20(arguments.length%20%3D%3D%201)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Get%20value%20if%20not%20supplied%0A%20%20%20%20%20%20%20%20%20%20let%20info%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20path%3A%20''%0A%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%20%20value%20%3D%20Polymer.Path.get(this%2C%20path%2C%20info)%3B%0A%20%20%20%20%20%20%20%20%20%20propPath%20%3D%20info.path%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20(Array.isArray(path))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Normalize%20path%20if%20needed%0A%20%20%20%20%20%20%20%20%20%20propPath%20%3D%20Polymer.Path.normalize(path)%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20propPath%20%3D%0A%20%20%20%20%20%20%20%20%20%20%2F**%20%40type%7Bstring%7D%20*%2F%0A%20%20%20%20%20%20%20%20%20%20path%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20(this._setPendingPropertyOrPath(propPath%2C%20value%2C%20true%2C%20true))%20%7B%0A%20%20%20%20%20%20%20%20%20%20this._invalidateProperties()%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Equivalent%20to%20static%20%60createReadOnlyProperty%60%20API%20but%20can%20be%20called%20on%0A%20%20%20%20%20%20%20*%20an%20instance%20to%20add%20effects%20at%20runtime.%20%20See%20that%20method%20for%0A%20%20%20%20%20%20%20*%20full%20API%20docs.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20property%20Property%20name%0A%20%20%20%20%20%20%20*%20%40param%20%7Bboolean%3D%7D%20protectedSetter%20Creates%20a%20custom%20protected%20setter%0A%20%20%20%20%20%20%20*%20%20%20when%20%60true%60.%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_createReadOnlyProperty(property%2C%20protectedSetter)%20%7B%0A%20%20%20%20%20%20%20%20this._addPropertyEffect(property%2C%20TYPES.READ_ONLY)%3B%0A%0A%20%20%20%20%20%20%20%20if%20(protectedSetter)%20%7B%0A%20%20%20%20%20%20%20%20%20%20this%5B'_set'%20%2B%20upper(property)%5D%20%3D%0A%20%20%20%20%20%20%20%20%20%20%2F**%20%40this%20%7BPropertyEffects%7D%20*%2F%0A%20%20%20%20%20%20%20%20%20%20function%20(value)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20this._setProperty(property%2C%20value)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Equivalent%20to%20static%20%60createPropertyObserver%60%20API%20but%20can%20be%20called%20on%0A%20%20%20%20%20%20%20*%20an%20instance%20to%20add%20effects%20at%20runtime.%20%20See%20that%20method%20for%0A%20%20%20%20%20%20%20*%20full%20API%20docs.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20property%20Property%20name%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7Cfunction(*%2C*)%7D%20method%20Function%20or%20name%20of%20observer%20method%20to%20call%0A%20%20%20%20%20%20%20*%20%40param%20%7Bboolean%3D%7D%20dynamicFn%20Whether%20the%20method%20name%20should%20be%20included%20as%0A%20%20%20%20%20%20%20*%20%20%20a%20dependency%20to%20the%20effect.%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_createPropertyObserver(property%2C%20method%2C%20dynamicFn)%20%7B%0A%20%20%20%20%20%20%20%20let%20info%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20property%2C%0A%20%20%20%20%20%20%20%20%20%20method%2C%0A%20%20%20%20%20%20%20%20%20%20dynamicFn%3A%20Boolean(dynamicFn)%0A%20%20%20%20%20%20%20%20%7D%3B%0A%0A%20%20%20%20%20%20%20%20this._addPropertyEffect(property%2C%20TYPES.OBSERVE%2C%20%7B%0A%20%20%20%20%20%20%20%20%20%20fn%3A%20runObserverEffect%2C%0A%20%20%20%20%20%20%20%20%20%20info%2C%0A%20%20%20%20%20%20%20%20%20%20trigger%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3A%20property%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D)%3B%0A%0A%20%20%20%20%20%20%20%20if%20(dynamicFn)%20%7B%0A%20%20%20%20%20%20%20%20%20%20this._addPropertyEffect(%0A%20%20%20%20%20%20%20%20%20%20%2F**%20%40type%20%7Bstring%7D%20*%2F%0A%20%20%20%20%20%20%20%20%20%20method%2C%20TYPES.OBSERVE%2C%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20fn%3A%20runObserverEffect%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20info%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20trigger%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3A%20method%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Equivalent%20to%20static%20%60createMethodObserver%60%20API%20but%20can%20be%20called%20on%0A%20%20%20%20%20%20%20*%20an%20instance%20to%20add%20effects%20at%20runtime.%20%20See%20that%20method%20for%0A%20%20%20%20%20%20%20*%20full%20API%20docs.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20expression%20Method%20expression%0A%20%20%20%20%20%20%20*%20%40param%20%7Bboolean%7CObject%3D%7D%20dynamicFn%20Boolean%20or%20object%20map%20indicating%0A%20%20%20%20%20%20%20*%20%20%20whether%20method%20names%20should%20be%20included%20as%20a%20dependency%20to%20the%20effect.%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_createMethodObserver(expression%2C%20dynamicFn)%20%7B%0A%20%20%20%20%20%20%20%20let%20sig%20%3D%20parseMethod(expression)%3B%0A%0A%20%20%20%20%20%20%20%20if%20(!sig)%20%7B%0A%20%20%20%20%20%20%20%20%20%20throw%20new%20Error(%22Malformed%20observer%20expression%20'%22%20%2B%20expression%20%2B%20%22'%22)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20createMethodEffect(this%2C%20sig%2C%20TYPES.OBSERVE%2C%20runMethodEffect%2C%20null%2C%20dynamicFn)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Equivalent%20to%20static%20%60createNotifyingProperty%60%20API%20but%20can%20be%20called%20on%0A%20%20%20%20%20%20%20*%20an%20instance%20to%20add%20effects%20at%20runtime.%20%20See%20that%20method%20for%0A%20%20%20%20%20%20%20*%20full%20API%20docs.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20property%20Property%20name%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_createNotifyingProperty(property)%20%7B%0A%20%20%20%20%20%20%20%20this._addPropertyEffect(property%2C%20TYPES.NOTIFY%2C%20%7B%0A%20%20%20%20%20%20%20%20%20%20fn%3A%20runNotifyEffect%2C%0A%20%20%20%20%20%20%20%20%20%20info%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20eventName%3A%20CaseMap.camelToDashCase(property)%20%2B%20'-changed'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20property%3A%20property%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Equivalent%20to%20static%20%60createReflectedProperty%60%20API%20but%20can%20be%20called%20on%0A%20%20%20%20%20%20%20*%20an%20instance%20to%20add%20effects%20at%20runtime.%20%20See%20that%20method%20for%0A%20%20%20%20%20%20%20*%20full%20API%20docs.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20property%20Property%20name%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_createReflectedProperty(property)%20%7B%0A%20%20%20%20%20%20%20%20let%20attr%20%3D%20this.constructor.attributeNameForProperty(property)%3B%0A%0A%20%20%20%20%20%20%20%20if%20(attr%5B0%5D%20%3D%3D%3D%20'-')%20%7B%0A%20%20%20%20%20%20%20%20%20%20console.warn('Property%20'%20%2B%20property%20%2B%20'%20cannot%20be%20reflected%20to%20attribute%20'%20%2B%20attr%20%2B%20'%20because%20%22-%22%20is%20not%20a%20valid%20starting%20attribute%20name.%20Use%20a%20lowercase%20first%20letter%20for%20the%20property%20instead.')%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20this._addPropertyEffect(property%2C%20TYPES.REFLECT%2C%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20fn%3A%20runReflectEffect%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20info%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20attrName%3A%20attr%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Equivalent%20to%20static%20%60createComputedProperty%60%20API%20but%20can%20be%20called%20on%0A%20%20%20%20%20%20%20*%20an%20instance%20to%20add%20effects%20at%20runtime.%20%20See%20that%20method%20for%0A%20%20%20%20%20%20%20*%20full%20API%20docs.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20property%20Name%20of%20computed%20property%20to%20set%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20expression%20Method%20expression%0A%20%20%20%20%20%20%20*%20%40param%20%7Bboolean%7CObject%3D%7D%20dynamicFn%20Boolean%20or%20object%20map%20indicating%0A%20%20%20%20%20%20%20*%20%20%20whether%20method%20names%20should%20be%20included%20as%20a%20dependency%20to%20the%20effect.%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_createComputedProperty(property%2C%20expression%2C%20dynamicFn)%20%7B%0A%20%20%20%20%20%20%20%20let%20sig%20%3D%20parseMethod(expression)%3B%0A%0A%20%20%20%20%20%20%20%20if%20(!sig)%20%7B%0A%20%20%20%20%20%20%20%20%20%20throw%20new%20Error(%22Malformed%20computed%20expression%20'%22%20%2B%20expression%20%2B%20%22'%22)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20createMethodEffect(this%2C%20sig%2C%20TYPES.COMPUTE%2C%20runComputedEffect%2C%20property%2C%20dynamicFn)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Gather%20the%20argument%20values%20for%20a%20method%20specified%20in%20the%20provided%20array%0A%20%20%20%20%20%20%20*%20of%20argument%20metadata.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20The%20%60path%60%20and%20%60value%60%20arguments%20are%20used%20to%20fill%20in%20wildcard%20descriptor%0A%20%20%20%20%20%20%20*%20when%20the%20method%20is%20being%20called%20as%20a%20result%20of%20a%20path%20notification.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7B!Array%3C!MethodArg%3E%7D%20args%20Array%20of%20argument%20metadata%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20path%20Property%2Fpath%20name%20that%20triggered%20the%20method%20effect%0A%20%20%20%20%20%20%20*%20%40param%20%7BObject%7D%20props%20Bag%20of%20current%20property%20changes%0A%20%20%20%20%20%20%20*%20%40return%20%7BArray%3C*%3E%7D%20Array%20of%20argument%20values%0A%20%20%20%20%20%20%20*%20%40private%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_marshalArgs(args%2C%20path%2C%20props)%20%7B%0A%20%20%20%20%20%20%20%20const%20data%20%3D%20this.__data%3B%0A%20%20%20%20%20%20%20%20let%20values%20%3D%20%5B%5D%3B%0A%0A%20%20%20%20%20%20%20%20for%20(let%20i%20%3D%200%2C%20l%20%3D%20args.length%3B%20i%20%3C%20l%3B%20i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20let%20arg%20%3D%20args%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20%20%20let%20name%20%3D%20arg.name%3B%0A%20%20%20%20%20%20%20%20%20%20let%20v%3B%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(arg.literal)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20v%20%3D%20arg.value%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(arg.structured)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20v%20%3D%20Polymer.Path.get(data%2C%20name)%3B%20%2F%2F%20when%20data%20is%20not%20stored%20e.g.%20%60splices%60%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(v%20%3D%3D%3D%20undefined)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20v%20%3D%20props%5Bname%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20v%20%3D%20data%5Bname%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(arg.wildcard)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Only%20send%20the%20actual%20path%20changed%20info%20if%20the%20change%20that%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20caused%20the%20observer%20to%20run%20matched%20the%20wildcard%0A%20%20%20%20%20%20%20%20%20%20%20%20let%20baseChanged%20%3D%20name.indexOf(path%20%2B%20'.')%20%3D%3D%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20let%20matches%20%3D%20path.indexOf(name)%20%3D%3D%3D%200%20%26%26%20!baseChanged%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20values%5Bi%5D%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20path%3A%20matches%20%3F%20path%20%3A%20name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20matches%20%3F%20props%5Bpath%5D%20%3A%20v%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20base%3A%20v%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20values%5Bi%5D%20%3D%20v%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20return%20values%3B%0A%20%20%20%20%20%20%7D%20%2F%2F%20--%20static%20class%20methods%20------------%0A%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Ensures%20an%20accessor%20exists%20for%20the%20specified%20property%2C%20and%20adds%0A%20%20%20%20%20%20%20*%20to%20a%20list%20of%20%22property%20effects%22%20that%20will%20run%20when%20the%20accessor%20for%0A%20%20%20%20%20%20%20*%20the%20specified%20property%20is%20set.%20%20Effects%20are%20grouped%20by%20%22type%22%2C%20which%0A%20%20%20%20%20%20%20*%20roughly%20corresponds%20to%20a%20phase%20in%20effect%20processing.%20%20The%20effect%0A%20%20%20%20%20%20%20*%20metadata%20should%20be%20in%20the%20following%20form%3A%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20*%20%20%20%20%20%20%20fn%3A%20effectFunction%2C%20%2F%2F%20Reference%20to%20function%20to%20call%20to%20perform%20effect%0A%20%20%20%20%20%20%20*%20%20%20%20%20%20%20info%3A%20%7B%20...%20%7D%20%20%20%20%20%20%20%2F%2F%20Effect%20metadata%20passed%20to%20function%0A%20%20%20%20%20%20%20*%20%20%20%20%20%20%20trigger%3A%20%7B%20%20%20%20%20%20%20%20%20%20%2F%2F%20Optional%20triggering%20metadata%3B%20if%20not%20provided%0A%20%20%20%20%20%20%20*%20%20%20%20%20%20%20%20%20name%3A%20string%20%20%20%20%20%20%2F%2F%20the%20property%20is%20treated%20as%20a%20wildcard%0A%20%20%20%20%20%20%20*%20%20%20%20%20%20%20%20%20structured%3A%20boolean%0A%20%20%20%20%20%20%20*%20%20%20%20%20%20%20%20%20wildcard%3A%20boolean%0A%20%20%20%20%20%20%20*%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20*%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20Effects%20are%20called%20from%20%60_propertiesChanged%60%20in%20the%20following%20order%20by%0A%20%20%20%20%20%20%20*%20type%3A%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%201.%20COMPUTE%0A%20%20%20%20%20%20%20*%202.%20PROPAGATE%0A%20%20%20%20%20%20%20*%203.%20REFLECT%0A%20%20%20%20%20%20%20*%204.%20OBSERVE%0A%20%20%20%20%20%20%20*%205.%20NOTIFY%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20Effect%20functions%20are%20called%20with%20the%20following%20signature%3A%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%20%20%20%20effectFunction(inst%2C%20path%2C%20props%2C%20oldProps%2C%20info%2C%20hasPaths)%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20property%20Property%20that%20should%20trigger%20the%20effect%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20type%20Effect%20type%2C%20from%20this.PROPERTY_EFFECT_TYPES%0A%20%20%20%20%20%20%20*%20%40param%20%7BObject%3D%7D%20effect%20Effect%20metadata%20object%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20static%20addPropertyEffect(property%2C%20type%2C%20effect)%20%7B%0A%20%20%20%20%20%20%20%20this.prototype._addPropertyEffect(property%2C%20type%2C%20effect)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Creates%20a%20single-property%20observer%20for%20the%20given%20property.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20property%20Property%20name%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7Cfunction(*%2C*)%7D%20method%20Function%20or%20name%20of%20observer%20method%20to%20call%0A%20%20%20%20%20%20%20*%20%40param%20%7Bboolean%3D%7D%20dynamicFn%20Whether%20the%20method%20name%20should%20be%20included%20as%0A%20%20%20%20%20%20%20*%20%20%20a%20dependency%20to%20the%20effect.%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20static%20createPropertyObserver(property%2C%20method%2C%20dynamicFn)%20%7B%0A%20%20%20%20%20%20%20%20this.prototype._createPropertyObserver(property%2C%20method%2C%20dynamicFn)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Creates%20a%20multi-property%20%22method%20observer%22%20based%20on%20the%20provided%0A%20%20%20%20%20%20%20*%20expression%2C%20which%20should%20be%20a%20string%20in%20the%20form%20of%20a%20normal%20JavaScript%0A%20%20%20%20%20%20%20*%20function%20signature%3A%20%60'methodName(arg1%2C%20%5B...%2C%20argn%5D)'%60.%20%20Each%20argument%0A%20%20%20%20%20%20%20*%20should%20correspond%20to%20a%20property%20or%20path%20in%20the%20context%20of%20this%0A%20%20%20%20%20%20%20*%20prototype%20(or%20instance)%2C%20or%20may%20be%20a%20literal%20string%20or%20number.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20expression%20Method%20expression%0A%20%20%20%20%20%20%20*%20%40param%20%7Bboolean%7CObject%3D%7D%20dynamicFn%20Boolean%20or%20object%20map%20indicating%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%20%20whether%20method%20names%20should%20be%20included%20as%20a%20dependency%20to%20the%20effect.%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20static%20createMethodObserver(expression%2C%20dynamicFn)%20%7B%0A%20%20%20%20%20%20%20%20this.prototype._createMethodObserver(expression%2C%20dynamicFn)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Causes%20the%20setter%20for%20the%20given%20property%20to%20dispatch%20%60%3Cproperty%3E-changed%60%0A%20%20%20%20%20%20%20*%20events%20to%20notify%20of%20changes%20to%20the%20property.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20property%20Property%20name%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20static%20createNotifyingProperty(property)%20%7B%0A%20%20%20%20%20%20%20%20this.prototype._createNotifyingProperty(property)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Creates%20a%20read-only%20accessor%20for%20the%20given%20property.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20To%20set%20the%20property%2C%20use%20the%20protected%20%60_setProperty%60%20API.%0A%20%20%20%20%20%20%20*%20To%20create%20a%20custom%20protected%20setter%20(e.g.%20%60_setMyProp()%60%20for%0A%20%20%20%20%20%20%20*%20property%20%60myProp%60)%2C%20pass%20%60true%60%20for%20%60protectedSetter%60.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20Note%2C%20if%20the%20property%20will%20have%20other%20property%20effects%2C%20this%20method%0A%20%20%20%20%20%20%20*%20should%20be%20called%20first%2C%20before%20adding%20other%20effects.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20property%20Property%20name%0A%20%20%20%20%20%20%20*%20%40param%20%7Bboolean%3D%7D%20protectedSetter%20Creates%20a%20custom%20protected%20setter%0A%20%20%20%20%20%20%20*%20%20%20when%20%60true%60.%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20static%20createReadOnlyProperty(property%2C%20protectedSetter)%20%7B%0A%20%20%20%20%20%20%20%20this.prototype._createReadOnlyProperty(property%2C%20protectedSetter)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Causes%20the%20setter%20for%20the%20given%20property%20to%20reflect%20the%20property%20value%0A%20%20%20%20%20%20%20*%20to%20a%20(dash-cased)%20attribute%20of%20the%20same%20name.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20property%20Property%20name%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20static%20createReflectedProperty(property)%20%7B%0A%20%20%20%20%20%20%20%20this.prototype._createReflectedProperty(property)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Creates%20a%20computed%20property%20whose%20value%20is%20set%20to%20the%20result%20of%20the%0A%20%20%20%20%20%20%20*%20method%20described%20by%20the%20given%20%60expression%60%20each%20time%20one%20or%20more%0A%20%20%20%20%20%20%20*%20arguments%20to%20the%20method%20changes.%20%20The%20expression%20should%20be%20a%20string%0A%20%20%20%20%20%20%20*%20in%20the%20form%20of%20a%20normal%20JavaScript%20function%20signature%3A%0A%20%20%20%20%20%20%20*%20%60'methodName(arg1%2C%20%5B...%2C%20argn%5D)'%60%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20property%20Name%20of%20computed%20property%20to%20set%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20expression%20Method%20expression%0A%20%20%20%20%20%20%20*%20%40param%20%7Bboolean%7CObject%3D%7D%20dynamicFn%20Boolean%20or%20object%20map%20indicating%20whether%0A%20%20%20%20%20%20%20*%20%20%20method%20names%20should%20be%20included%20as%20a%20dependency%20to%20the%20effect.%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20static%20createComputedProperty(property%2C%20expression%2C%20dynamicFn)%20%7B%0A%20%20%20%20%20%20%20%20this.prototype._createComputedProperty(property%2C%20expression%2C%20dynamicFn)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Parses%20the%20provided%20template%20to%20ensure%20binding%20effects%20are%20created%0A%20%20%20%20%20%20%20*%20for%20them%2C%20and%20then%20ensures%20property%20accessors%20are%20created%20for%20any%0A%20%20%20%20%20%20%20*%20dependent%20properties%20in%20the%20template.%20%20Binding%20effects%20for%20bound%0A%20%20%20%20%20%20%20*%20templates%20are%20stored%20in%20a%20linked%20list%20on%20the%20instance%20so%20that%0A%20%20%20%20%20%20%20*%20templates%20can%20be%20efficiently%20stamped%20and%20unstamped.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7B!HTMLTemplateElement%7D%20template%20Template%20containing%20binding%0A%20%20%20%20%20%20%20*%20%20%20bindings%0A%20%20%20%20%20%20%20*%20%40return%20%7B!TemplateInfo%7D%20Template%20metadata%20object%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20static%20bindTemplate(template)%20%7B%0A%20%20%20%20%20%20%20%20return%20this.prototype._bindTemplate(template)%3B%0A%20%20%20%20%20%20%7D%20%2F%2F%20--%20binding%20----------------------------------------------%0A%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Equivalent%20to%20static%20%60bindTemplate%60%20API%20but%20can%20be%20called%20on%0A%20%20%20%20%20%20%20*%20an%20instance%20to%20add%20effects%20at%20runtime.%20%20See%20that%20method%20for%0A%20%20%20%20%20%20%20*%20full%20API%20docs.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20This%20method%20may%20be%20called%20on%20the%20prototype%20(for%20prototypical%20template%0A%20%20%20%20%20%20%20*%20binding%2C%20to%20avoid%20creating%20accessors%20every%20instance)%20once%20per%20prototype%2C%0A%20%20%20%20%20%20%20*%20and%20will%20be%20called%20with%20%60runtimeBinding%3A%20true%60%20by%20%60_stampTemplate%60%20to%0A%20%20%20%20%20%20%20*%20create%20and%20link%20an%20instance%20of%20the%20template%20metadata%20associated%20with%20a%0A%20%20%20%20%20%20%20*%20particular%20stamping.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7B!HTMLTemplateElement%7D%20template%20Template%20containing%20binding%0A%20%20%20%20%20%20%20*%20%20%20bindings%0A%20%20%20%20%20%20%20*%20%40param%20%7Bboolean%3D%7D%20instanceBinding%20When%20false%20(default)%2C%20performs%0A%20%20%20%20%20%20%20*%20%20%20%22prototypical%22%20binding%20of%20the%20template%20and%20overwrites%20any%20previously%0A%20%20%20%20%20%20%20*%20%20%20bound%20template%20for%20the%20class.%20When%20true%20(as%20passed%20from%0A%20%20%20%20%20%20%20*%20%20%20%60_stampTemplate%60)%2C%20the%20template%20info%20is%20instanced%20and%20linked%20into%0A%20%20%20%20%20%20%20*%20%20%20the%20list%20of%20bound%20templates.%0A%20%20%20%20%20%20%20*%20%40return%20%7B!TemplateInfo%7D%20Template%20metadata%20object%3B%20for%20%60runtimeBinding%60%2C%0A%20%20%20%20%20%20%20*%20%20%20this%20is%20an%20instance%20of%20the%20prototypical%20template%20info%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_bindTemplate(template%2C%20instanceBinding)%20%7B%0A%20%20%20%20%20%20%20%20let%20templateInfo%20%3D%20this.constructor._parseTemplate(template)%3B%0A%0A%20%20%20%20%20%20%20%20let%20wasPreBound%20%3D%20this.__templateInfo%20%3D%3D%20templateInfo%3B%20%2F%2F%20Optimization%3A%20since%20this%20is%20called%20twice%20for%20proto-bound%20templates%2C%0A%20%20%20%20%20%20%20%20%2F%2F%20don't%20attempt%20to%20recreate%20accessors%20if%20this%20template%20was%20pre-bound%0A%0A%20%20%20%20%20%20%20%20if%20(!wasPreBound)%20%7B%0A%20%20%20%20%20%20%20%20%20%20for%20(let%20prop%20in%20templateInfo.propertyEffects)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20this._createPropertyAccessor(prop)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20(instanceBinding)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20For%20instance-time%20binding%2C%20create%20instance%20of%20template%20metadata%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20and%20link%20into%20list%20of%20templates%20if%20necessary%0A%20%20%20%20%20%20%20%20%20%20templateInfo%20%3D%0A%20%20%20%20%20%20%20%20%20%20%2F**%20%40type%20%7B!TemplateInfo%7D%20*%2F%0A%20%20%20%20%20%20%20%20%20%20Object.create(templateInfo)%3B%0A%20%20%20%20%20%20%20%20%20%20templateInfo.wasPreBound%20%3D%20wasPreBound%3B%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(!wasPreBound%20%26%26%20this.__templateInfo)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20let%20last%20%3D%20this.__templateInfoLast%20%7C%7C%20this.__templateInfo%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.__templateInfoLast%20%3D%20last.nextTemplateInfo%20%3D%20templateInfo%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20templateInfo.previousTemplateInfo%20%3D%20last%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20templateInfo%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20return%20this.__templateInfo%20%3D%20templateInfo%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Adds%20a%20property%20effect%20to%20the%20given%20template%20metadata%2C%20which%20is%20run%0A%20%20%20%20%20%20%20*%20at%20the%20%22propagate%22%20stage%20of%20%60_propertiesChanged%60%20when%20the%20template%0A%20%20%20%20%20%20%20*%20has%20been%20bound%20to%20the%20element%20via%20%60_bindTemplate%60.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20The%20%60effect%60%20object%20should%20match%20the%20format%20in%20%60_addPropertyEffect%60.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7BObject%7D%20templateInfo%20Template%20metadata%20to%20add%20effect%20to%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20prop%20Property%20that%20should%20trigger%20the%20effect%0A%20%20%20%20%20%20%20*%20%40param%20%7BObject%3D%7D%20effect%20Effect%20metadata%20object%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20static%20_addTemplatePropertyEffect(templateInfo%2C%20prop%2C%20effect)%20%7B%0A%20%20%20%20%20%20%20%20let%20hostProps%20%3D%20templateInfo.hostProps%20%3D%20templateInfo.hostProps%20%7C%7C%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20hostProps%5Bprop%5D%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20let%20effects%20%3D%20templateInfo.propertyEffects%20%3D%20templateInfo.propertyEffects%20%7C%7C%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20let%20propEffects%20%3D%20effects%5Bprop%5D%20%3D%20effects%5Bprop%5D%20%7C%7C%20%5B%5D%3B%0A%20%20%20%20%20%20%20%20propEffects.push(effect)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Stamps%20the%20provided%20template%20and%20performs%20instance-time%20setup%20for%0A%20%20%20%20%20%20%20*%20Polymer%20template%20features%2C%20including%20data%20bindings%2C%20declarative%20event%0A%20%20%20%20%20%20%20*%20listeners%2C%20and%20the%20%60this.%24%60%20map%20of%20%60id%60's%20to%20nodes.%20%20A%20document%20fragment%0A%20%20%20%20%20%20%20*%20is%20returned%20containing%20the%20stamped%20DOM%2C%20ready%20for%20insertion%20into%20the%0A%20%20%20%20%20%20%20*%20DOM.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20This%20method%20may%20be%20called%20more%20than%20once%3B%20however%20note%20that%20due%20to%0A%20%20%20%20%20%20%20*%20%60shadycss%60%20polyfill%20limitations%2C%20only%20styles%20from%20templates%20prepared%0A%20%20%20%20%20%20%20*%20using%20%60ShadyCSS.prepareTemplate%60%20will%20be%20correctly%20polyfilled%20(scoped%0A%20%20%20%20%20%20%20*%20to%20the%20shadow%20root%20and%20support%20CSS%20custom%20properties)%2C%20and%20note%20that%0A%20%20%20%20%20%20%20*%20%60ShadyCSS.prepareTemplate%60%20may%20only%20be%20called%20once%20per%20element.%20As%20such%2C%0A%20%20%20%20%20%20%20*%20any%20styles%20required%20by%20in%20runtime-stamped%20templates%20must%20be%20included%0A%20%20%20%20%20%20%20*%20in%20the%20main%20element%20template.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7B!HTMLTemplateElement%7D%20template%20Template%20to%20stamp%0A%20%20%20%20%20%20%20*%20%40return%20%7B!StampedTemplate%7D%20Cloned%20template%20content%0A%20%20%20%20%20%20%20*%20%40override%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_stampTemplate(template)%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20Ensures%20that%20created%20dom%20is%20%60_enqueueClient%60'd%20to%20this%20element%20so%0A%20%20%20%20%20%20%20%20%2F%2F%20that%20it%20can%20be%20flushed%20on%20next%20call%20to%20%60_flushProperties%60%0A%20%20%20%20%20%20%20%20hostStack.beginHosting(this)%3B%0A%0A%20%20%20%20%20%20%20%20let%20dom%20%3D%20super._stampTemplate(template)%3B%0A%0A%20%20%20%20%20%20%20%20hostStack.endHosting(this)%3B%0A%0A%20%20%20%20%20%20%20%20let%20templateInfo%20%3D%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7B!TemplateInfo%7D%20*%2F%0A%20%20%20%20%20%20%20%20this._bindTemplate(template%2C%20true)%3B%20%2F%2F%20Add%20template-instance-specific%20data%20to%20instanced%20templateInfo%0A%0A%0A%20%20%20%20%20%20%20%20templateInfo.nodeList%20%3D%20dom.nodeList%3B%20%2F%2F%20Capture%20child%20nodes%20to%20allow%20unstamping%20of%20non-prototypical%20templates%0A%0A%20%20%20%20%20%20%20%20if%20(!templateInfo.wasPreBound)%20%7B%0A%20%20%20%20%20%20%20%20%20%20let%20nodes%20%3D%20templateInfo.childNodes%20%3D%20%5B%5D%3B%0A%0A%20%20%20%20%20%20%20%20%20%20for%20(let%20n%20%3D%20dom.firstChild%3B%20n%3B%20n%20%3D%20n.nextSibling)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20nodes.push(n)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20dom.templateInfo%20%3D%20templateInfo%3B%20%2F%2F%20Setup%20compound%20storage%2C%202-way%20listeners%2C%20and%20dataHost%20for%20bindings%0A%0A%20%20%20%20%20%20%20%20setupBindings(this%2C%20templateInfo)%3B%20%2F%2F%20Flush%20properties%20into%20template%20nodes%20if%20already%20booted%0A%0A%20%20%20%20%20%20%20%20if%20(this.__dataReady)%20%7B%0A%20%20%20%20%20%20%20%20%20%20runEffects(this%2C%20templateInfo.propertyEffects%2C%20this.__data%2C%20null%2C%20false%2C%20templateInfo.nodeList)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20return%20dom%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Removes%20and%20unbinds%20the%20nodes%20previously%20contained%20in%20the%20provided%0A%20%20%20%20%20%20%20*%20DocumentFragment%20returned%20from%20%60_stampTemplate%60.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7B!StampedTemplate%7D%20dom%20DocumentFragment%20previously%20returned%0A%20%20%20%20%20%20%20*%20%20%20from%20%60_stampTemplate%60%20associated%20with%20the%20nodes%20to%20be%20removed%0A%20%20%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20_removeBoundDom(dom)%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20Unlink%20template%20info%0A%20%20%20%20%20%20%20%20let%20templateInfo%20%3D%20dom.templateInfo%3B%0A%0A%20%20%20%20%20%20%20%20if%20(templateInfo.previousTemplateInfo)%20%7B%0A%20%20%20%20%20%20%20%20%20%20templateInfo.previousTemplateInfo.nextTemplateInfo%20%3D%20templateInfo.nextTemplateInfo%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20(templateInfo.nextTemplateInfo)%20%7B%0A%20%20%20%20%20%20%20%20%20%20templateInfo.nextTemplateInfo.previousTemplateInfo%20%3D%20templateInfo.previousTemplateInfo%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20(this.__templateInfoLast%20%3D%3D%20templateInfo)%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.__templateInfoLast%20%3D%20templateInfo.previousTemplateInfo%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20templateInfo.previousTemplateInfo%20%3D%20templateInfo.nextTemplateInfo%20%3D%20null%3B%20%2F%2F%20Remove%20stamped%20nodes%0A%0A%20%20%20%20%20%20%20%20let%20nodes%20%3D%20templateInfo.childNodes%3B%0A%0A%20%20%20%20%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%20nodes.length%3B%20i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20let%20node%20%3D%20nodes%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20%20%20node.parentNode.removeChild(node)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Overrides%20default%20%60TemplateStamp%60%20implementation%20to%20add%20support%20for%0A%20%20%20%20%20%20%20*%20parsing%20bindings%20from%20%60TextNode%60's'%20%60textContent%60.%20%20A%20%60bindings%60%0A%20%20%20%20%20%20%20*%20array%20is%20added%20to%20%60nodeInfo%60%20and%20populated%20with%20binding%20metadata%0A%20%20%20%20%20%20%20*%20with%20information%20capturing%20the%20binding%20target%2C%20and%20a%20%60parts%60%20array%0A%20%20%20%20%20%20%20*%20with%20one%20or%20more%20metadata%20objects%20capturing%20the%20source(s)%20of%20the%0A%20%20%20%20%20%20%20*%20binding.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40override%0A%20%20%20%20%20%20%20*%20%40param%20%7BNode%7D%20node%20Node%20to%20parse%0A%20%20%20%20%20%20%20*%20%40param%20%7BTemplateInfo%7D%20templateInfo%20Template%20metadata%20for%20current%20template%0A%20%20%20%20%20%20%20*%20%40param%20%7BNodeInfo%7D%20nodeInfo%20Node%20metadata%20for%20current%20template%20node%0A%20%20%20%20%20%20%20*%20%40return%20%7Bboolean%7D%20%60true%60%20if%20the%20visited%20node%20added%20node-specific%0A%20%20%20%20%20%20%20*%20%20%20metadata%20to%20%60nodeInfo%60%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%20%40suppress%20%7BmissingProperties%7D%20Interfaces%20in%20closure%20do%20not%20inherit%20statics%2C%20but%20classes%20do%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20static%20_parseTemplateNode(node%2C%20templateInfo%2C%20nodeInfo)%20%7B%0A%20%20%20%20%20%20%20%20let%20noted%20%3D%20super._parseTemplateNode(node%2C%20templateInfo%2C%20nodeInfo)%3B%0A%0A%20%20%20%20%20%20%20%20if%20(node.nodeType%20%3D%3D%3D%20Node.TEXT_NODE)%20%7B%0A%20%20%20%20%20%20%20%20%20%20let%20parts%20%3D%20this._parseBindings(node.textContent%2C%20templateInfo)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(parts)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Initialize%20the%20textContent%20with%20any%20literal%20parts%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20NOTE%3A%20default%20to%20a%20space%20here%20so%20the%20textNode%20remains%3B%20some%20browsers%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20(IE)%20omit%20an%20empty%20textNode%20following%20cloneNode%2FimportNode.%0A%20%20%20%20%20%20%20%20%20%20%20%20node.textContent%20%3D%20literalFromParts(parts)%20%7C%7C%20'%20'%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20addBinding(this%2C%20templateInfo%2C%20nodeInfo%2C%20'text'%2C%20'textContent'%2C%20parts)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20noted%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20return%20noted%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Overrides%20default%20%60TemplateStamp%60%20implementation%20to%20add%20support%20for%0A%20%20%20%20%20%20%20*%20parsing%20bindings%20from%20attributes.%20%20A%20%60bindings%60%0A%20%20%20%20%20%20%20*%20array%20is%20added%20to%20%60nodeInfo%60%20and%20populated%20with%20binding%20metadata%0A%20%20%20%20%20%20%20*%20with%20information%20capturing%20the%20binding%20target%2C%20and%20a%20%60parts%60%20array%0A%20%20%20%20%20%20%20*%20with%20one%20or%20more%20metadata%20objects%20capturing%20the%20source(s)%20of%20the%0A%20%20%20%20%20%20%20*%20binding.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40override%0A%20%20%20%20%20%20%20*%20%40param%20%7BElement%7D%20node%20Node%20to%20parse%0A%20%20%20%20%20%20%20*%20%40param%20%7BTemplateInfo%7D%20templateInfo%20Template%20metadata%20for%20current%20template%0A%20%20%20%20%20%20%20*%20%40param%20%7BNodeInfo%7D%20nodeInfo%20Node%20metadata%20for%20current%20template%20node%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20name%20Attribute%20name%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20value%20Attribute%20value%0A%20%20%20%20%20%20%20*%20%40return%20%7Bboolean%7D%20%60true%60%20if%20the%20visited%20node%20added%20node-specific%0A%20%20%20%20%20%20%20*%20%20%20metadata%20to%20%60nodeInfo%60%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%20%40suppress%20%7BmissingProperties%7D%20Interfaces%20in%20closure%20do%20not%20inherit%20statics%2C%20but%20classes%20do%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20static%20_parseTemplateNodeAttribute(node%2C%20templateInfo%2C%20nodeInfo%2C%20name%2C%20value)%20%7B%0A%20%20%20%20%20%20%20%20let%20parts%20%3D%20this._parseBindings(value%2C%20templateInfo)%3B%0A%0A%20%20%20%20%20%20%20%20if%20(parts)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Attribute%20or%20property%0A%20%20%20%20%20%20%20%20%20%20let%20origName%20%3D%20name%3B%0A%20%20%20%20%20%20%20%20%20%20let%20kind%20%3D%20'property'%3B%20%2F%2F%20The%20only%20way%20we%20see%20a%20capital%20letter%20here%20is%20if%20the%20attr%20has%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20a%20capital%20letter%20in%20it%20per%20spec.%20In%20this%20case%2C%20to%20make%20sure%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20this%20binding%20works%2C%20we%20go%20ahead%20and%20make%20the%20binding%20to%20the%20attribute.%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(capitalAttributeRegex.test(name))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20kind%20%3D%20'attribute'%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(name%5Bname.length%20-%201%5D%20%3D%3D%20'%24')%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20name%20%3D%20name.slice(0%2C%20-1)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20kind%20%3D%20'attribute'%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20%2F%2F%20Initialize%20attribute%20bindings%20with%20any%20literal%20parts%0A%0A%0A%20%20%20%20%20%20%20%20%20%20let%20literal%20%3D%20literalFromParts(parts)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(literal%20%26%26%20kind%20%3D%3D%20'attribute')%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Ensure%20a%20ShadyCSS%20template%20scoped%20style%20is%20not%20removed%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20when%20a%20class%24%20binding's%20initial%20literal%20value%20is%20set.%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(name%20%3D%3D%20'class'%20%26%26%20node.hasAttribute('class'))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20literal%20%2B%3D%20'%20'%20%2B%20node.getAttribute(name)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20node.setAttribute(name%2C%20literal)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20%2F%2F%20Clear%20attribute%20before%20removing%2C%20since%20IE%20won't%20allow%20removing%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20%60value%60%20attribute%20if%20it%20previously%20had%20a%20value%20(can't%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20unconditionally%20set%20''%20before%20removing%20since%20attributes%20with%20%60%24%60%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20can't%20be%20set%20using%20setAttribute)%0A%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(node.localName%20%3D%3D%3D%20'input'%20%26%26%20origName%20%3D%3D%3D%20'value')%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20node.setAttribute(origName%2C%20'')%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20%2F%2F%20Remove%20annotation%0A%0A%0A%20%20%20%20%20%20%20%20%20%20node.removeAttribute(origName)%3B%20%2F%2F%20Case%20hackery%3A%20attributes%20are%20lower-case%2C%20but%20bind%20targets%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20(properties)%20are%20case%20sensitive.%20Gambit%20is%20to%20map%20dash-case%20to%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20camel-case%3A%20%60foo-bar%60%20becomes%20%60fooBar%60.%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Attribute%20bindings%20are%20excepted.%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(kind%20%3D%3D%3D%20'property')%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20name%20%3D%20Polymer.CaseMap.dashToCamelCase(name)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20addBinding(this%2C%20templateInfo%2C%20nodeInfo%2C%20kind%2C%20name%2C%20parts%2C%20literal)%3B%0A%20%20%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20super._parseTemplateNodeAttribute(node%2C%20templateInfo%2C%20nodeInfo%2C%20name%2C%20value)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Overrides%20default%20%60TemplateStamp%60%20implementation%20to%20add%20support%20for%0A%20%20%20%20%20%20%20*%20binding%20the%20properties%20that%20a%20nested%20template%20depends%20on%20to%20the%20template%0A%20%20%20%20%20%20%20*%20as%20%60_host_%3Cproperty%3E%60.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40override%0A%20%20%20%20%20%20%20*%20%40param%20%7BNode%7D%20node%20Node%20to%20parse%0A%20%20%20%20%20%20%20*%20%40param%20%7BTemplateInfo%7D%20templateInfo%20Template%20metadata%20for%20current%20template%0A%20%20%20%20%20%20%20*%20%40param%20%7BNodeInfo%7D%20nodeInfo%20Node%20metadata%20for%20current%20template%20node%0A%20%20%20%20%20%20%20*%20%40return%20%7Bboolean%7D%20%60true%60%20if%20the%20visited%20node%20added%20node-specific%0A%20%20%20%20%20%20%20*%20%20%20metadata%20to%20%60nodeInfo%60%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%20%40suppress%20%7BmissingProperties%7D%20Interfaces%20in%20closure%20do%20not%20inherit%20statics%2C%20but%20classes%20do%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20static%20_parseTemplateNestedTemplate(node%2C%20templateInfo%2C%20nodeInfo)%20%7B%0A%20%20%20%20%20%20%20%20let%20noted%20%3D%20super._parseTemplateNestedTemplate(node%2C%20templateInfo%2C%20nodeInfo)%3B%20%2F%2F%20Merge%20host%20props%20into%20outer%20template%20and%20add%20bindings%0A%0A%0A%20%20%20%20%20%20%20%20let%20hostProps%20%3D%20nodeInfo.templateInfo.hostProps%3B%0A%20%20%20%20%20%20%20%20let%20mode%20%3D%20'%7B'%3B%0A%0A%20%20%20%20%20%20%20%20for%20(let%20source%20in%20hostProps)%20%7B%0A%20%20%20%20%20%20%20%20%20%20let%20parts%20%3D%20%5B%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20mode%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20source%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20dependencies%3A%20%5Bsource%5D%0A%20%20%20%20%20%20%20%20%20%20%7D%5D%3B%0A%20%20%20%20%20%20%20%20%20%20addBinding(this%2C%20templateInfo%2C%20nodeInfo%2C%20'property'%2C%20'_host_'%20%2B%20source%2C%20parts)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20return%20noted%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Called%20to%20parse%20text%20in%20a%20template%20(either%20attribute%20values%20or%0A%20%20%20%20%20%20%20*%20textContent)%20into%20binding%20metadata.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20Any%20overrides%20of%20this%20method%20should%20return%20an%20array%20of%20binding%20part%0A%20%20%20%20%20%20%20*%20metadata%20%20representing%20one%20or%20more%20bindings%20found%20in%20the%20provided%20text%0A%20%20%20%20%20%20%20*%20and%20any%20%22literal%22%20text%20in%20between.%20%20Any%20non-literal%20parts%20will%20be%20passed%0A%20%20%20%20%20%20%20*%20to%20%60_evaluateBinding%60%20when%20any%20dependencies%20change.%20%20The%20only%20required%0A%20%20%20%20%20%20%20*%20fields%20of%20each%20%22part%22%20in%20the%20returned%20array%20are%20as%20follows%3A%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20-%20%60dependencies%60%20-%20Array%20containing%20trigger%20metadata%20for%20each%20property%0A%20%20%20%20%20%20%20*%20%20%20that%20should%20trigger%20the%20binding%20to%20update%0A%20%20%20%20%20%20%20*%20-%20%60literal%60%20-%20String%20containing%20text%20if%20the%20part%20represents%20a%20literal%3B%0A%20%20%20%20%20%20%20*%20%20%20in%20this%20case%20no%20%60dependencies%60%20are%20needed%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20Additional%20metadata%20for%20use%20by%20%60_evaluateBinding%60%20may%20be%20provided%20in%0A%20%20%20%20%20%20%20*%20each%20part%20object%20as%20needed.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20The%20default%20implementation%20handles%20the%20following%20types%20of%20bindings%0A%20%20%20%20%20%20%20*%20(one%20or%20more%20may%20be%20intermixed%20with%20literal%20strings)%3A%0A%20%20%20%20%20%20%20*%20-%20Property%20binding%3A%20%60%5B%5Bprop%5D%5D%60%0A%20%20%20%20%20%20%20*%20-%20Path%20binding%3A%20%60%5B%5Bobject.prop%5D%5D%60%0A%20%20%20%20%20%20%20*%20-%20Negated%20property%20or%20path%20bindings%3A%20%60%5B%5B!prop%5D%5D%60%20or%20%60%5B%5B!object.prop%5D%5D%60%0A%20%20%20%20%20%20%20*%20-%20Two-way%20property%20or%20path%20bindings%20(supports%20negation)%3A%0A%20%20%20%20%20%20%20*%20%20%20%60%7B%7Bprop%7D%7D%60%2C%20%60%7B%7Bobject.prop%7D%7D%60%2C%20%60%7B%7B!prop%7D%7D%60%20or%20%60%7B%7B!object.prop%7D%7D%60%0A%20%20%20%20%20%20%20*%20-%20Inline%20computed%20method%20(supports%20negation)%3A%0A%20%20%20%20%20%20%20*%20%20%20%60%5B%5Bcompute(a%2C%20'literal'%2C%20b)%5D%5D%60%2C%20%60%5B%5B!compute(a%2C%20'literal'%2C%20b)%5D%5D%60%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20The%20default%20implementation%20uses%20a%20regular%20expression%20for%20best%0A%20%20%20%20%20%20%20*%20performance.%20However%2C%20the%20regular%20expression%20uses%20a%20white-list%20of%0A%20%20%20%20%20%20%20*%20allowed%20characters%20in%20a%20data-binding%2C%20which%20causes%20problems%20for%0A%20%20%20%20%20%20%20*%20data-bindings%20that%20do%20use%20characters%20not%20in%20this%20white-list.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20Instead%20of%20updating%20the%20white-list%20with%20all%20allowed%20characters%2C%0A%20%20%20%20%20%20%20*%20there%20is%20a%20StrictBindingParser%20(see%20lib%2Fmixins%2Fstrict-binding-parser)%0A%20%20%20%20%20%20%20*%20that%20uses%20a%20state%20machine%20instead.%20This%20state%20machine%20is%20able%20to%20handle%0A%20%20%20%20%20%20%20*%20all%20characters.%20However%2C%20it%20is%20slightly%20less%20performant%2C%20therefore%20we%0A%20%20%20%20%20%20%20*%20extracted%20it%20into%20a%20separate%20optional%20mixin.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20text%20Text%20to%20parse%20from%20attribute%20or%20textContent%0A%20%20%20%20%20%20%20*%20%40param%20%7BObject%7D%20templateInfo%20Current%20template%20metadata%0A%20%20%20%20%20%20%20*%20%40return%20%7BArray%3C!BindingPart%3E%7D%20Array%20of%20binding%20part%20metadata%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20static%20_parseBindings(text%2C%20templateInfo)%20%7B%0A%20%20%20%20%20%20%20%20let%20parts%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20%20%20let%20lastIndex%20%3D%200%3B%0A%20%20%20%20%20%20%20%20let%20m%3B%20%2F%2F%20Example%3A%20%22literal1%7B%7Bprop%7D%7Dliteral2%5B%5B!compute(foo%2Cbar)%5D%5Dfinal%22%0A%20%20%20%20%20%20%20%20%2F%2F%20Regex%20matches%3A%0A%20%20%20%20%20%20%20%20%2F%2F%20%20%20%20%20%20%20%20Iteration%201%3A%20%20Iteration%202%3A%0A%20%20%20%20%20%20%20%20%2F%2F%20m%5B1%5D%3A%20'%7B%7B'%20%20%20%20%20%20%20%20%20%20'%5B%5B'%0A%20%20%20%20%20%20%20%20%2F%2F%20m%5B2%5D%3A%20''%20%20%20%20%20%20%20%20%20%20%20%20'!'%0A%20%20%20%20%20%20%20%20%2F%2F%20m%5B3%5D%3A%20'prop'%20%20%20%20%20%20%20%20'compute(foo%2Cbar)'%0A%0A%20%20%20%20%20%20%20%20while%20((m%20%3D%20bindingRegex.exec(text))%20!%3D%3D%20null)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Add%20literal%20part%0A%20%20%20%20%20%20%20%20%20%20if%20(m.index%20%3E%20lastIndex)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20parts.push(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20literal%3A%20text.slice(lastIndex%2C%20m.index)%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20%2F%2F%20Add%20binding%20part%0A%0A%0A%20%20%20%20%20%20%20%20%20%20let%20mode%20%3D%20m%5B1%5D%5B0%5D%3B%0A%20%20%20%20%20%20%20%20%20%20let%20negate%20%3D%20Boolean(m%5B2%5D)%3B%0A%20%20%20%20%20%20%20%20%20%20let%20source%20%3D%20m%5B3%5D.trim()%3B%0A%20%20%20%20%20%20%20%20%20%20let%20customEvent%20%3D%20false%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20notifyEvent%20%3D%20''%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20colon%20%3D%20-1%3B%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(mode%20%3D%3D%20'%7B'%20%26%26%20(colon%20%3D%20source.indexOf('%3A%3A'))%20%3E%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20notifyEvent%20%3D%20source.substring(colon%20%2B%202)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20source%20%3D%20source.substring(0%2C%20colon)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20customEvent%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20let%20signature%20%3D%20parseMethod(source)%3B%0A%20%20%20%20%20%20%20%20%20%20let%20dependencies%20%3D%20%5B%5D%3B%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(signature)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Inline%20computed%20function%0A%20%20%20%20%20%20%20%20%20%20%20%20let%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20args%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20methodName%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%3D%20signature%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%20args.length%3B%20i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20let%20arg%20%3D%20args%5Bi%5D%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(!arg.literal)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dependencies.push(arg)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20let%20dynamicFns%20%3D%20templateInfo.dynamicFns%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(dynamicFns%20%26%26%20dynamicFns%5BmethodName%5D%20%7C%7C%20signature.static)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20dependencies.push(methodName)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20signature.dynamicFn%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Property%20or%20path%0A%20%20%20%20%20%20%20%20%20%20%20%20dependencies.push(source)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20parts.push(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20source%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mode%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20negate%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20customEvent%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20signature%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20dependencies%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20event%3A%20notifyEvent%0A%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20lastIndex%20%3D%20bindingRegex.lastIndex%3B%0A%20%20%20%20%20%20%20%20%7D%20%2F%2F%20Add%20a%20final%20literal%20part%0A%0A%0A%20%20%20%20%20%20%20%20if%20(lastIndex%20%26%26%20lastIndex%20%3C%20text.length)%20%7B%0A%20%20%20%20%20%20%20%20%20%20let%20literal%20%3D%20text.substring(lastIndex)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(literal)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20parts.push(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20literal%3A%20literal%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20(parts.length)%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20parts%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20null%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20*%20Called%20to%20evaluate%20a%20previously%20parsed%20binding%20part%20based%20on%20a%20set%20of%0A%20%20%20%20%20%20%20*%20one%20or%20more%20changed%20dependencies.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20%40param%20%7Bthis%7D%20inst%20Element%20that%20should%20be%20used%20as%20scope%20for%0A%20%20%20%20%20%20%20*%20%20%20binding%20dependencies%0A%20%20%20%20%20%20%20*%20%40param%20%7BBindingPart%7D%20part%20Binding%20part%20metadata%0A%20%20%20%20%20%20%20*%20%40param%20%7Bstring%7D%20path%20Property%2Fpath%20that%20triggered%20this%20effect%0A%20%20%20%20%20%20%20*%20%40param%20%7BObject%7D%20props%20Bag%20of%20current%20property%20changes%0A%20%20%20%20%20%20%20*%20%40param%20%7BObject%7D%20oldProps%20Bag%20of%20previous%20values%20for%20changed%20properties%0A%20%20%20%20%20%20%20*%20%40param%20%7Bboolean%7D%20hasPaths%20True%20with%20%60props%60%20contains%20one%20or%20more%20paths%0A%20%20%20%20%20%20%20*%20%40return%20%7B*%7D%20Value%20the%20binding%20part%20evaluated%20to%0A%20%20%20%20%20%20%20*%20%40protected%0A%20%20%20%20%20%20%20*%2F%0A%0A%0A%20%20%20%20%20%20static%20_evaluateBinding(inst%2C%20part%2C%20path%2C%20props%2C%20oldProps%2C%20hasPaths)%20%7B%0A%20%20%20%20%20%20%20%20let%20value%3B%0A%0A%20%20%20%20%20%20%20%20if%20(part.signature)%20%7B%0A%20%20%20%20%20%20%20%20%20%20value%20%3D%20runMethodEffect(inst%2C%20path%2C%20props%2C%20oldProps%2C%20part.signature)%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20(path%20!%3D%20part.source)%20%7B%0A%20%20%20%20%20%20%20%20%20%20value%20%3D%20Polymer.Path.get(inst%2C%20part.source)%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(hasPaths%20%26%26%20Polymer.Path.isPath(path))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20value%20%3D%20Polymer.Path.get(inst%2C%20path)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20value%20%3D%20inst.__data%5Bpath%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20(part.negate)%20%7B%0A%20%20%20%20%20%20%20%20%20%20value%20%3D%20!value%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20return%20value%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%7D%20%2F%2F%20make%20a%20typing%20for%20closure%20%3AP%0A%0A%0A%20%20%20%20PropertyEffectsType%20%3D%20PropertyEffects%3B%0A%20%20%20%20return%20PropertyEffects%3B%0A%20%20%7D)%3B%0A%20%20%2F**%0A%20%20%20*%20Helper%20api%20for%20enqueuing%20client%20dom%20created%20by%20a%20host%20element.%0A%20%20%20*%0A%20%20%20*%20By%20default%20elements%20are%20flushed%20via%20%60_flushProperties%60%20when%0A%20%20%20*%20%60connectedCallback%60%20is%20called.%20Elements%20attach%20their%20client%20dom%20to%0A%20%20%20*%20themselves%20at%20%60ready%60%20time%20which%20results%20from%20this%20first%20flush.%0A%20%20%20*%20This%20provides%20an%20ordering%20guarantee%20that%20the%20client%20dom%20an%20element%0A%20%20%20*%20creates%20is%20flushed%20before%20the%20element%20itself%20(i.e.%20client%20%60ready%60%0A%20%20%20*%20fires%20before%20host%20%60ready%60).%0A%20%20%20*%0A%20%20%20*%20However%2C%20if%20%60_flushProperties%60%20is%20called%20*before*%20an%20element%20is%20connected%2C%0A%20%20%20*%20as%20for%20example%20%60Templatize%60%20does%2C%20this%20ordering%20guarantee%20cannot%20be%0A%20%20%20*%20satisfied%20because%20no%20elements%20are%20connected.%20(Note%3A%20Bound%20elements%20that%0A%20%20%20*%20receive%20data%20do%20become%20enqueued%20clients%20and%20are%20properly%20ordered%20but%0A%20%20%20*%20unbound%20elements%20are%20not.)%0A%20%20%20*%0A%20%20%20*%20To%20maintain%20the%20desired%20%22client%20before%20host%22%20ordering%20guarantee%20for%20this%0A%20%20%20*%20case%20we%20rely%20on%20the%20%22host%20stack.%20Client%20nodes%20registers%20themselves%20with%0A%20%20%20*%20the%20creating%20host%20element%20when%20created.%20This%20ensures%20that%20all%20client%20dom%0A%20%20%20*%20is%20readied%20in%20the%20proper%20order%2C%20maintaining%20the%20desired%20guarantee.%0A%20%20%20*%0A%20%20%20*%20%40private%0A%20%20%20*%2F%0A%0A%20%20let%20hostStack%20%3D%20%7B%0A%20%20%20%20stack%3A%20%5B%5D%2C%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%40param%20%7B*%7D%20inst%20Instance%20to%20add%20to%20hostStack%0A%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20*%20%40this%20%7BhostStack%7D%0A%20%20%20%20%20*%2F%0A%20%20%20%20registerHost(inst)%20%7B%0A%20%20%20%20%20%20if%20(this.stack.length)%20%7B%0A%20%20%20%20%20%20%20%20let%20host%20%3D%20this.stack%5Bthis.stack.length%20-%201%5D%3B%0A%0A%20%20%20%20%20%20%20%20host._enqueueClient(inst)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%40param%20%7B*%7D%20inst%20Instance%20to%20begin%20hosting%0A%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20*%20%40this%20%7BhostStack%7D%0A%20%20%20%20%20*%2F%0A%20%20%20%20beginHosting(inst)%20%7B%0A%20%20%20%20%20%20this.stack.push(inst)%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%40param%20%7B*%7D%20inst%20Instance%20to%20end%20hosting%0A%20%20%20%20%20*%20%40return%20%7Bvoid%7D%0A%20%20%20%20%20*%20%40this%20%7BhostStack%7D%0A%20%20%20%20%20*%2F%0A%20%20%20%20endHosting(inst)%20%7B%0A%20%20%20%20%20%20let%20stackLen%20%3D%20this.stack.length%3B%0A%0A%20%20%20%20%20%20if%20(stackLen%20%26%26%20this.stack%5BstackLen%20-%201%5D%20%3D%3D%20inst)%20%7B%0A%20%20%20%20%20%20%20%20this.stack.pop()%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%7D%3B%0A%7D)()%3B%0A%2F%2F%23%20sourceURL%3Dhttps%3A%2F%2Fwww.centravet.net%2Fcomponents%2Fcatalogue-search%2Fbower_components%2Fpolymer%2Flib%2Fmixins%2Fproperty-effects.html.js%0A
jquery.com logo
jQueryv1.7.2
JavaScript libraries
75%
1 evidence signal
Scripthttps://www.centravet.net/components/catalogue-search/js/jquery-1.7.2.min.js
jqueryui.com logo
jQuery UIv1.12.1
JavaScript libraries
75%
4 evidence signals
Scripthttps://www.centravet.net/components/catalogue-search/js/jquery-ui-1.12.1.min.js
Scripthttps://www.centravet.net/components/catalogue-search/js/jquery-ui-1.12.1.min.js
Scripthttps://www.centravet.net/components/catalogue-search/js/jquery-ui-1.12.1.min.js
Scripthttps://www.centravet.net/components/catalogue-search/js/jquery-ui-1.12.1.min.js
github.com logo
core-js
JavaScript libraries
75%
1 evidence signal
JS Global__core-js_shared__ → object
hammerjs.github.io logo
Hammer.jsv2.0.7
JavaScript libraries
75%
1 evidence signal
JS GlobalHammer → function(v2.0.7)
swiperjs.com logo
Swiper
JavaScript libraries
75%
1 evidence signal
JS GlobalSwiper → function
quilljs.com logo
Quillv2.0.3
Rich text editors
75%
1 evidence signal
JS GlobalQuill → function(v2.0.3)

Want to see AI crawler policies?

Check which AI bots can access this site.

View AI Policy →