{ "version": 3, "file": "generated.js", "sources": [ "/pipeline/build/framer/Animation.coffee", "/pipeline/build/framer/AnimationLoop.coffee", "/pipeline/build/framer/Animator.coffee", "/pipeline/build/framer/Animators/BezierCurveAnimator.coffee", "/pipeline/build/framer/Animators/LinearAnimator.coffee", "/pipeline/build/framer/Animators/SpringDHOAnimator.coffee", "/pipeline/build/framer/Animators/SpringRK4Animator.coffee", "/pipeline/build/framer/BaseClass.coffee", "/pipeline/build/framer/Compat.coffee", "/pipeline/build/framer/Config.coffee", "/pipeline/build/framer/Debug.coffee", "/pipeline/build/framer/Defaults.coffee", "/pipeline/build/framer/EventEmitter.coffee", "/pipeline/build/framer/Events.coffee", "/pipeline/build/framer/Frame.coffee", "/pipeline/build/framer/Framer.coffee", "/pipeline/build/framer/Importer.coffee", "/pipeline/build/framer/Layer.coffee", "/pipeline/build/framer/LayerDraggable.coffee", "/pipeline/build/framer/LayerStates.coffee", "/pipeline/build/framer/LayerStyle.coffee", "/pipeline/build/framer/Underscore.coffee", "/pipeline/build/framer/Utils.coffee", "/pipeline/build/node_modules/lodash/dist/lodash.js", "/pipeline/build/node_modules/underscore.string/lib/underscore.string.js" ], "names": [], "mappings": "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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjoNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA", "sourcesContent": [ "{_} = require \"./Underscore\"\n\nUtils = require \"./Utils\"\n\n{Config} = require \"./Config\"\n{Defaults} = require \"./Defaults\"\n{EventEmitter} = require \"./EventEmitter\"\n{Frame} = require \"./Frame\"\n\n{LinearAnimator} = require \"./Animators/LinearAnimator\"\n{BezierCurveAnimator} = require \"./Animators/BezierCurveAnimator\"\n{SpringRK4Animator} = require \"./Animators/SpringRK4Animator\"\n{SpringDHOAnimator} = require \"./Animators/SpringDHOAnimator\"\n\nAnimatorClasses =\n\t\"linear\": LinearAnimator\n\t\"bezier-curve\": BezierCurveAnimator\n\t\"spring-rk4\": SpringRK4Animator\n\t\"spring-dho\": SpringDHOAnimator\n\nAnimatorClasses[\"spring\"] = AnimatorClasses[\"spring-rk4\"]\nAnimatorClasses[\"cubic-bezier\"] = AnimatorClasses[\"bezier-curve\"]\n\n_runningAnimations = []\n\n# Todo: this would normally be BaseClass but the properties keyword\n# is not compatible and causes problems.\nclass exports.Animation extends EventEmitter\n\n\t@runningAnimations = ->\n\t\t_runningAnimations\n\n\tconstructor: (options={}) ->\n\n\t\toptions = Defaults.getDefaults \"Animation\", options\n\n\t\tsuper options\n\n\t\t@options = Utils.setDefaultProperties options,\n\t\t\tlayer: null\n\t\t\tproperties: {}\n\t\t\tcurve: \"linear\"\n\t\t\tcurveOptions: {}\n\t\t\ttime: 1\n\t\t\trepeat: 0\n\t\t\tdelay: 0\n\t\t\tdebug: true\n\n\t\tif options.layer is null\n\t\t\tconsole.error \"Animation: missing layer\"\n\n\t\tif options.origin\n\t\t\tconsole.warn \"Animation.origin: please use layer.originX and layer.originY\"\n\n\t\t# Convert a frame instance to a regular js object\n\t\tif options.properties instanceof Frame\n\t\t\toption.properties = option.properties.properties\n\n\t\t@options.properties = @_filterAnimatableProperties @options.properties\n\n\t\t@_parseAnimatorOptions()\n\t\t@_originalState = @_currentState()\n\t\t@_repeatCounter = @options.repeat\n\n\t_filterAnimatableProperties: (properties) ->\n\t\tdelete properties.image\n\t\tproperties\n\n\t_currentState: ->\n\t\t_.pick @options.layer, _.keys(@options.properties)\n\n\t_animatorClass: ->\n\n\t\tparsedCurve = Utils.parseFunction @options.curve\n\t\tanimatorClassName = parsedCurve.name.toLowerCase()\n\n\t\tif AnimatorClasses.hasOwnProperty animatorClassName\n\t\t\treturn AnimatorClasses[animatorClassName]\n\n\t\treturn LinearAnimator\n\n\t_parseAnimatorOptions: ->\n\n\t\tanimatorClass = @_animatorClass()\n\t\tparsedCurve = Utils.parseFunction @options.curve\n\n\t\t# This is for compatibility with the direct Animation.time argument. This should\n\t\t# ideally also be passed as a curveOption\n\n\t\tif animatorClass in [LinearAnimator, BezierCurveAnimator]\n\t\t\tif _.isString(@options.curveOptions) or _.isArray(@options.curveOptions)\n\t\t\t\t@options.curveOptions =\n\t\t\t\t\tvalues: @options.curveOptions\n\n\t\t\t@options.curveOptions.time ?= @options.time\n\n\t\t# All this is to support curve: \"spring(100,20,10)\". In the future we'd like people\n\t\t# to start using curveOptions: {tension:100, friction:10} etc\n\n\t\tif parsedCurve.args.length\n\n\t\t\t# console.warn \"Animation.curve arguments are deprecated. Please use Animation.curveOptions\"\n\n\t\t\tif animatorClass is BezierCurveAnimator\n\t\t\t\t@options.curveOptions.values = parsedCurve.args.map (v) -> parseFloat(v) or 0\n\n\t\t\tif animatorClass is SpringRK4Animator\n\t\t\t\tfor k, i in [\"tension\", \"friction\", \"velocity\"]\n\t\t\t\t\tvalue = parseFloat parsedCurve.args[i]\n\t\t\t\t\t@options.curveOptions[k] = value if value\n\n\t\t\tif animatorClass is SpringDHOAnimator\n\t\t\t\tfor k, i in [\"stiffness\", \"damping\", \"mass\", \"tolerance\"]\n\t\t\t\t\tvalue = parseFloat parsedCurve.args[i]\n\t\t\t\t\t@options.curveOptions[k] = value if value\n\n\tstart: =>\n\n\t\tAnimatorClass = @_animatorClass()\n\n\t\tconsole.debug \"Animation.start #{AnimatorClass.name}\", @options.curveOptions\n\n\t\t@_animator = new AnimatorClass @options.curveOptions\n\n\t\ttarget = @options.layer\n\t\tstateA = @_currentState()\n\t\tstateB = @options.properties\n\n\t\tif _.isEqual stateA, stateB\n\t\t\tconsole.warn \"Nothing to animate\"\n\n\t\tconsole.debug \"Animation.start\"\n\t\tconsole.debug \"\\t#{k}: #{stateA[k]} -> #{stateB[k]}\" for k, v of stateB\n\n\t\t@_animator.on \"start\", => @emit \"start\"\n\t\t@_animator.on \"stop\", => @emit \"stop\"\n\t\t@_animator.on \"end\", => @emit \"end\"\n\n\t\t# See if we need to repeat this animation\n\t\t# Todo: more repeat behaviours:\n\t\t# 1) add (from end position) 2) reverse (loop between a and b)\n\t\tif @_repeatCounter > 0\n\t\t\t@_animator.on \"end\", =>\n\t\t\t\tfor k, v of stateA\n\t\t\t\t\ttarget[k] = v\n\t\t\t\t@_repeatCounter--\n\t\t\t\t@start()\n\n\t\t# This is the function that sets the actual value to the layer in the\n\t\t# animation loop. It needs to be very fast.\n\t\t@_animator.on \"tick\", (value) ->\n\t\t\tfor k, v of stateB\n\t\t\t\ttarget[k] = Utils.mapRange value, 0, 1, stateA[k], stateB[k]\n\t\t\treturn # For performance\n\n\t\tstart = =>\n\t\t\t_runningAnimations.push @\n\t\t\t@_animator.start()\n\n\t\t# If we have a delay, we wait a bit for it to start\n\t\tif @options.delay\n\t\t\tUtils.delay @options.delay, start\n\t\telse\n\t\t\tstart()\n\n\n\tstop: ->\n\t\t@_animator.stop()\n\t\t_runningAnimations = _.without _runningAnimations, @\n\n\treverse: ->\n\t\t# TODO: Add some tests\n\t\toptions = _.clone @options\n\t\toptions.properties = @_originalState\n\t\tanimation = new Animation options\n\t\tanimation\n\n\t# A bunch of common aliases to minimize frustration\n\trevert: -> \t@reverse()\n\tinverse: -> @reverse()\n\tinvert: -> \t@reverse()\n\n\temit: (event) ->\n\t\tsuper\n\t\t# Also emit this to the layer with self as argument\n\t\t@options.layer.emit event, @\n", "{_} = require \"./Underscore\"\n\nUtils = require \"./Utils\"\n\n{Config} = require \"./Config\"\n{EventEmitter} = require \"./EventEmitter\"\n\n# Note: this is not an object because there should really only be one\n\nAnimationLoopIndexKey = \"_animationLoopIndex\"\n\nAnimationLoop = \n\n\tdebug: false\n\n\t_animators: []\n\t_running: false\n\t_frameCounter: 0\n\t_sessionTime: 0\n\t\n\t_start: ->\n\n\t\tif AnimationLoop._running\n\t\t\treturn\n\n\t\tif not AnimationLoop._animators.length\n\t\t\treturn\n\n\t\tAnimationLoop._running = true\n\t\tAnimationLoop._time = Utils.getTime()\n\t\tAnimationLoop._sessionTime = 0\n\n\t\twindow.requestAnimationFrame AnimationLoop._tick\n\n\t_stop: ->\n\t\tconsole.debug \"AnimationLoop._stop\"\n\t\tAnimationLoop._running = false\n\n\n\t_tick: ->\n\n\t\tif not AnimationLoop._animators.length\n\t\t\treturn AnimationLoop._stop()\n\n\t\tif AnimationLoop._sessionTime == 0\n\t\t\tconsole.debug \"AnimationLoop._start\"\n\n\n\t\tAnimationLoop._frameCounter++\n\t\t\n\t\ttime = Utils.getTime()\n\t\tdelta = time - AnimationLoop._time\n\n\t\tAnimationLoop._sessionTime += delta\n\n\t\t# console.debug [\n\t\t# \t\"_tick #{AnimationLoop._frameCounter} \",\n\t\t# \t\"#{Utils.round(delta, 5)}ms \",\n\t\t# \t\"#{Utils.round(AnimationLoop._sessionTime, 5)}\",\n\t\t# \t\"animators:#{AnimationLoop._animators.length}\"\n\t\t# ].join \" \"\n\n\t\tremoveAnimators = []\n\n\t\tfor animator in AnimationLoop._animators\n\n\t\t\tanimator.emit \"tick\", animator.next(delta)\n\n\t\t\tif animator.finished()\n\t\t\t\tanimator.emit \"tick\", 1 # This makes sure we and at a perfect value\n\t\t\t\tremoveAnimators.push animator\n\n\t\tAnimationLoop._time = time\n\n\t\tfor animator in removeAnimators\n\t\t\tAnimationLoop.remove animator\n\t\t\tanimator.emit \"end\"\n\n\t\twindow.requestAnimationFrame AnimationLoop._tick\n\n\t\treturn # Important for performance\n\n\tadd: (animator) ->\n\n\t\tif animator.hasOwnProperty AnimationLoopIndexKey\n\t\t\treturn\n\n\t\tanimator[AnimationLoopIndexKey] = AnimationLoop._animators.push animator\n\t\tanimator.emit \"start\"\n\t\tAnimationLoop._start()\n\n\tremove: (animator) ->\n\t\tAnimationLoop._animators = _.without AnimationLoop._animators, animator\n\t\tanimator.emit \"stop\"\n\nexports.AnimationLoop = AnimationLoop\n", "Utils = require \"./Utils\"\n\n{Config} = require \"./Config\"\n{EventEmitter} = require \"./EventEmitter\"\n{AnimationLoop} = require \"./AnimationLoop\"\n\nclass exports.Animator extends EventEmitter\n\n\t\"\"\"\n\tThe animator class is a very simple class that\n\t\t- Takes a set of input values at setup({input values})\n\t\t- Emits an output value for progress (0 -> 1) in value(progress)\n\t\"\"\"\n\t\n\tconstructor: (options={}) ->\n\t\t@setup options\n\n\tsetup: (options) ->\n\t\tthrow Error \"Not implemented\"\n\n\tnext: (delta) ->\n\t\tthrow Error \"Not implemented\"\n\n\tfinished: ->\n\t\tthrow Error \"Not implemented\"\n\n\tstart: -> AnimationLoop.add @\n\tstop: -> AnimationLoop.remove @\n", "{_} = require \"../Underscore\"\nUtils = require \"../Utils\"\n\n{Animator} = require \"../Animator\"\n\nBezierCurveDefaults =\n\t\"linear\": [0, 0, 1, 1]\n\t\"ease\": [.25, .1, .25, 1]\n\t\"ease-in\": [.42, 0, 1, 1]\n\t\"ease-out\": [0, 0, .58, 1]\n\t\"ease-in-out\": [.42, 0, .58, 1]\n\nclass exports.BezierCurveAnimator extends Animator\n\n\tsetup: (options) ->\n\n\t\t# Input is a one of the named bezier curves\n\t\tif _.isString(options) and BezierCurveDefaults.hasOwnProperty options.toLowerCase()\n\t\t\toptions = { values: BezierCurveDefaults[options.toLowerCase()] }\n\n\t\t# Input values is one of the named bezier curves\n\t\tif options.values and _.isString(options.values) and BezierCurveDefaults.hasOwnProperty options.values.toLowerCase()\n\t\t\toptions = { values: BezierCurveDefaults[options.values.toLowerCase()], time: options.time }\n\n\t\t# Input is a single array of 4 values\n\t\tif _.isArray(options) and options.length is 4\n\t\t\toptions = { values: options }\n\n\t\t@options = Utils.setDefaultProperties options,\n\t\t\tvalues: BezierCurveDefaults[\"ease-in-out\"]\n\t\t\ttime: 1\n\n\t\t@_unitBezier = new UnitBezier \\\n\t\t\t@options.values[0],\n\t\t\t@options.values[1],\n\t\t\t@options.values[2],\n\t\t\t@options.values[3],\n\n\t\t@_time = 0\n\n\n\tnext: (delta) ->\n\n\t\t@_time += delta\n\n\t\tif @finished()\n\t\t\treturn 1\n\n\t\t@_unitBezier.solve @_time / @options.time\n\n\tfinished: ->\n\t\t@_time >= @options.time\n\n\n# WebKit implementation found on http://stackoverflow.com/a/11697909\n\nclass UnitBezier\n\n\tepsilon: 1e-6 # Precision\n\n\tconstructor: (p1x, p1y, p2x, p2y) ->\n\n\t\t# pre-calculate the polynomial coefficients\n\t\t# First and last control points are implied to be (0,0) and (1.0, 1.0)\n\t\t@cx = 3.0 * p1x\n\t\t@bx = 3.0 * (p2x - p1x) - @cx\n\t\t@ax = 1.0 - @cx - @bx\n\t\t@cy = 3.0 * p1y\n\t\t@by = 3.0 * (p2y - p1y) - @cy\n\t\t@ay = 1.0 - @cy - @by\n\n\tsampleCurveX: (t) ->\n\t\t((@ax * t + @bx) * t + @cx) * t\n\n\tsampleCurveY: (t) ->\n\t\t((@ay * t + @by) * t + @cy) * t\n\n\tsampleCurveDerivativeX: (t) ->\n\t\t(3.0 * @ax * t + 2.0 * @bx) * t + @cx\n\n\tsolveCurveX: (x) ->\n\n\t\t# First try a few iterations of Newton's method -- normally very fast.\n\t\tt2 = x\n\t\ti = 0\n\n\t\twhile i < 8\n\t\t\tx2 = @sampleCurveX(t2) - x\n\t\t\treturn t2\tif Math.abs(x2) < @epsilon\n\t\t\td2 = @sampleCurveDerivativeX(t2)\n\t\t\tbreak\tif Math.abs(d2) < @epsilon\n\t\t\tt2 = t2 - x2 / d2\n\t\t\ti++\n\n\t\t# No solution found - use bi-section\n\t\tt0 = 0.0\n\t\tt1 = 1.0\n\t\tt2 = x\n\t\treturn t0\tif t2 < t0\n\t\treturn t1\tif t2 > t1\n\t\twhile t0 < t1\n\t\t\tx2 = @sampleCurveX(t2)\n\t\t\treturn t2\tif Math.abs(x2 - x) < @epsilon\n\t\t\tif x > x2\n\t\t\t\tt0 = t2\n\t\t\telse\n\t\t\t\tt1 = t2\n\t\t\tt2 = (t1 - t0) * .5 + t0\n\n\t\t# Give up\n\t\tt2\n\n\tsolve: (x) ->\n\t\t@sampleCurveY @solveCurveX(x)\n", "Utils = require \"../Utils\"\n\n{Animator} = require \"../Animator\"\n\nclass exports.LinearAnimator extends Animator\n\t\n\tsetup: (options) ->\n\n\t\t@options = Utils.setDefaultProperties options,\n\t\t\ttime: 1\n\n\t\t@_time = 0\n\n\tnext: (delta) ->\n\n\t\tif @finished()\n\t\t\treturn 1\n\t\t\n\t\t@_time += delta\n\t\t@_time / @options.time\n\n\tfinished: ->\n\t\t@_time >= @options.time", "Utils = require \"../Utils\"\n\n{Animator} = require \"../Animator\"\n\nclass exports.SpringDHOAnimator extends Animator\n\n\tsetup: (options) ->\n\n\t\t@options = Utils.setDefaultProperties options,\n\t\t\tvelocity: 0\n\t\t\ttolerance: 1/10000\n\t\t\tstiffness: 50\n\t\t\tdamping: 2\n\t\t\tmass: 0.2\n\t\t\ttime: null # Hack\n\n\t\tconsole.log \"SpringDHOAnimator.options\", @options, options\n\n\t\t@_time = 0\n\t\t@_value = 0\n\t\t@_velocity = @options.velocity\n\n\tnext: (delta) ->\n\n\t\tif @finished()\n\t\t\treturn 1\n\n\t\t@_time += delta\n\n\t\t# See the not science comment above\n\t\tk = 0 - @options.stiffness\n\t\tb = 0 - @options.damping\n\n\t\tF_spring = k * ((@_value) - 1)\n\t\tF_damper = b * (@_velocity)\n\n\t\t@_velocity += ((F_spring + F_damper) / @options.mass) * delta\n\t\t@_value += @_velocity * delta\n\n\t\t@_value\n\n\tfinished: =>\n\t\t@_time > 0 and Math.abs(@_velocity) < @options.tolerance", "Utils = require \"../Utils\"\n\n{Animator} = require \"../Animator\"\n\nclass exports.SpringRK4Animator extends Animator\n\n\tsetup: (options) ->\n\n\t\t@options = Utils.setDefaultProperties options,\n\t\t\ttension: 500\n\t\t\tfriction: 10\n\t\t\tvelocity: 0\n\t\t\ttolerance: 1/10000\n\t\t\ttime: null # Hack\n\n\t\t@_time = 0\n\t\t@_value = 0\n\t\t@_velocity = @options.velocity\n\t\t@_stopSpring = false\n\n\tnext: (delta) ->\n\n\t\tif @finished()\n\t\t\treturn 1\n\n\t\t@_time += delta\n\n\t\tstateBefore = {}\n\t\tstateAfter = {}\n\t\t\n\t\t# Calculate previous state\n\t\tstateBefore.x = @_value - 1\n\t\tstateBefore.v = @_velocity\n\t\tstateBefore.tension = @options.tension\n\t\tstateBefore.friction = @options.friction\n\t\t\n\t\t# Calculate new state\n\t\tstateAfter = springIntegrateState stateBefore, delta\n\t\t@_value = 1 + stateAfter.x\n\t\tfinalVelocity = stateAfter.v\n\t\tnetFloat = stateAfter.x\n\t\tnet1DVelocity = stateAfter.v\n\n\t\t# See if we reached the end state\n\t\tnetValueIsLow = Math.abs(netFloat) < @options.tolerance\n\t\tnetVelocityIsLow = Math.abs(net1DVelocity) < @options.tolerance\n\t\t\t\t\n\t\t@_stopSpring = netValueIsLow and netVelocityIsLow\n\t\t@_velocity = finalVelocity\n\n\t\t@_value\n\n\tfinished: =>\n\t\t@_stopSpring\n\n\nspringAccelerationForState = (state) ->\n\treturn - state.tension * state.x - state.friction * state.v\n\nspringEvaluateState = (initialState) ->\n\n\toutput = {}\n\toutput.dx = initialState.v\n\toutput.dv = springAccelerationForState initialState\n\n\treturn output\n\nspringEvaluateStateWithDerivative = (initialState, dt, derivative) ->\n\n\tstate = {}\n\tstate.x = initialState.x + derivative.dx * dt\n\tstate.v = initialState.v + derivative.dv * dt\n\tstate.tension = initialState.tension\n\tstate.friction = initialState.friction\n\n\toutput = {}\n\toutput.dx = state.v\n\toutput.dv = springAccelerationForState state\n\n\treturn output\n\nspringIntegrateState = (state, speed) ->\n\n\ta = springEvaluateState state\n\tb = springEvaluateStateWithDerivative state, speed * 0.5, a\n\tc = springEvaluateStateWithDerivative state, speed * 0.5, b\n\td = springEvaluateStateWithDerivative state, speed, c\n\n\tdxdt = 1.0/6.0 * (a.dx + 2.0 * (b.dx + c.dx) + d.dx)\n\tdvdt = 1.0/6.0 * (a.dv + 2.0 * (b.dv + c.dv) + d.dv)\n\n\tstate.x = state.x + dxdt * speed\n\tstate.v = state.v + dvdt * speed\n\n\treturn state\n\n", "{_} = require \"./Underscore\"\n\nUtils = require \"./Utils\"\n\n{EventEmitter} = require \"./EventEmitter\"\n\nCounterKey = \"_ObjectCounter\"\nDefinedPropertiesKey = \"_DefinedPropertiesKey\"\nDefinedPropertiesValuesKey = \"_DefinedPropertiesValuesKey\"\n\n\nclass exports.BaseClass extends EventEmitter\n\n\t#################################################################\n\t# Framer object properties\n\n\t@define = (propertyName, descriptor) ->\n\n\t\tif @ isnt BaseClass and descriptor.exportable == true\n\t\t\t# descriptor.enumerable = true\n\t\t\tdescriptor.propertyName = propertyName\n\n\t\t\t@[DefinedPropertiesKey] ?= {}\n\t\t\t@[DefinedPropertiesKey][propertyName] = descriptor\n\n\t\tObject.defineProperty @prototype, propertyName, descriptor\n\t\tObject.__\n\n\t@simpleProperty = (name, fallback, exportable=true) ->\n\t\texportable: exportable\n\t\tdefault: fallback\n\t\tget: -> @_getPropertyValue name\n\t\tset: (value) -> @_setPropertyValue name, value\n\n\t_setPropertyValue: (k, v) =>\n\t\t@[DefinedPropertiesValuesKey][k] = v\n\n\t_getPropertyValue: (k) =>\n\t\tUtils.valueOrDefault @[DefinedPropertiesValuesKey][k],\n\t\t\t@_getPropertyDefaultValue k\n\n\t_getPropertyDefaultValue: (k) ->\n\t\t@constructor[DefinedPropertiesKey][k][\"default\"]\n\n\t_propertyList: ->\n\t\t@constructor[DefinedPropertiesKey]\n\n\tkeys: ->\n\t\t_.keys @properties\n\n\t@define \"properties\",\n\t\tget: ->\n\t\t\tproperties = {}\n\n\t\t\tfor k, v of @constructor[DefinedPropertiesKey]\n\t\t\t\tif v.exportable isnt false\n\t\t\t\t\tproperties[k] = @[k]\n\n\t\t\tproperties\n\n\t\tset: (value) ->\n\t\t\tfor k, v of value\n\t\t\t\tif @constructor[DefinedPropertiesKey].hasOwnProperty k\n\t\t\t\t\tif @constructor[DefinedPropertiesKey].exportable isnt false\n\t\t\t\t\t\t@[k] = v\n\n\t@define \"id\",\n\t\tget: -> @_id\n\n\ttoString: =>\n\t\tproperties = _.map(@properties, ((v, k) -> \"#{k}:#{v}\"), 4)\n\t\t\"[#{@constructor.name} id:#{@id} #{properties.join \" \"}]\"\n\n\n\t#################################################################\n\t# Base constructor method\n\n\tconstructor: (options={}) ->\n\n\t\tsuper\n\n\t\t# Create a holder for the property values\n\t\t@[DefinedPropertiesValuesKey] = {}\n\n\t\t# Count the creation for these objects and set the id\n\t\t@constructor[CounterKey] ?= 0\n\t\t@constructor[CounterKey] += 1\n\n\t\t@_id = @constructor[CounterKey]\n\n\t\t# Set the default values for this object\n\t\t_.map @constructor[DefinedPropertiesKey], (descriptor, name) =>\n\t\t\t@[name] = Utils.valueOrDefault options[name], @_getPropertyDefaultValue name\n\n", "{Layer} = require \"./Layer\"\n\ncompatWarning = (msg) ->\n\tconsole.warn msg\n\ncompatProperty = (name, originalName) ->\n\texportable: false\n\tget: -> \n\t\tcompatWarning \"#{originalName} is a deprecated property\"\n\t\t@[name]\n\tset: (value) -> \n\t\tcompatWarning \"#{originalName} is a deprecated property\"\n\t\t@[name] = value\n\nclass CompatLayer extends Layer\n\n\tconstructor: (options={}) ->\n\n\t\tif options.hasOwnProperty \"superView\"\n\t\t\toptions.superLayer = options.superView\n\n\t\tsuper options\n\n\t@define \"superView\", compatProperty \"superLayer\", \"superView\"\n\t@define \"subViews\", compatProperty \"subLayers\", \"subViews\"\n\t@define \"siblingViews\", compatProperty \"siblingLayers\", \"siblingViews\"\n\n\taddSubView = (layer) -> @addSubLayer layer\n\tremoveSubView = (layer) -> @removeSubLayer layer\n\nclass CompatView extends CompatLayer\n\n\tconstructor: (options={}) ->\n\t\tcompatWarning \"Views are now called Layers\"\n\t\tsuper options\n\nclass CompatImageView extends CompatView\n\nclass CompatScrollView extends CompatView\n\tconstructor: ->\n\t\tsuper\n\t\t@scroll = true\n\nwindow.Layer = CompatLayer\nwindow.Framer.Layer = CompatLayer\n\nwindow.View = CompatView\nwindow.ImageView = CompatImageView\nwindow.ScrollView = CompatScrollView\n\n\t\n\n", "Utils = require \"./Utils\"\n\nexports.Config =\n\t\n\t# Animation\n\ttargetFPS: 60\n\n\trootBaseCSS:\n\t\t\"-webkit-perspective\": 1000\n\t\t\n\tlayerBaseCSS:\n\t\t\"display\": \"block\"\n\t\t#\"visibility\": \"visible\"\n\t\t\"position\": \"absolute\"\n\t\t# \"top\": \"auto\"\n\t\t# \"right\": \"auto\"\n\t\t# \"bottom\": \"auto\"\n\t\t# \"left\": \"auto\"\n\t\t# \"width\": \"auto\"\n\t\t# \"height\": \"auto\"\n\t\t#\"overflow\": \"visible\"\n\t\t#\"z-index\": 0\n\t\t\"-webkit-box-sizing\": \"border-box\"\n\t\t# \"-webkit-transform-style\": \"preserve-3d\"\n\t\t# \"-webkit-backface-visibility\": \"visible\"\n\t\t#\"-webkit-backface-visibility\": \"\"\n\t\t#\"-webkit-perspective\": 500\n\t\t# \"pointer-events\": \"none\"\n\t\t\"background-repeat\": \"no-repeat\"\n\t\t\"background-size\": \"cover\"\n\t\t\"-webkit-overflow-scrolling\": \"touch\"", "Utils = require \"./Utils\"\n\n###############################################################\n# Debug overview\n\n_debugLayers = null\n\ncreateDebugLayer = (layer) ->\n\n\toverLayer = new Layer\n\t\tframe: layer.screenFrame()\n\t\tbackgroundColor: \"rgba(50,150,200,.35)\"\n\n\toverLayer.style =\n\t\ttextAlign: \"center\"\n\t\tcolor: \"white\"\n\t\tfont: \"10px/1em Monaco\"\n\t\tlineHeight: \"#{overLayer.height + 1}px\"\n\t\tboxShadow: \"inset 0 0 0 1px rgba(255,255,255,.5)\"\n\n\toverLayer.html = layer.name or layer.id\n\n\toverLayer.on Events.Click, (event, layer) ->\n\t\tlayer.scale = 0.8\n\t\tlayer.animate \n\t\t\tproperties: {scale:1}\n\t\t\tcurve: \"spring(1000,10,0)\"\n\n\toverLayer\n\nshowDebug = -> _debugLayers = Layer.Layers().map createDebugLayer\nhideDebug = -> _debugLayers.map (layer) -> layer.destroy()\n\ntoggleDebug = Utils.toggle showDebug, hideDebug\n\nEventKeys =\n\tShift: 16\n\tEscape: 27\n\nwindow.document.onkeyup = (event) ->\n\tif event.keyCode == EventKeys.Escape\n\t\ttoggleDebug()()\n\n###############################################################\n# Error warning\n\n_errorWarningLayer = null\n\nerrorWarning = ->\n\n\treturn if _errorWarningLayer\n\n\tlayer = new Layer {x:20, y:-50, width:300, height:40}\n\n\tlayer.states.add\n\t\tvisible: {x:20, y:20, width:300, height:40}\n\n\tlayer.html = \"Javascript Error, see the console\"\n\tlayer.style =\n\t\tfont: \"12px/1.35em Menlo\"\n\t\tcolor: \"white\"\n\t\ttextAlign: \"center\"\n\t\tlineHeight: \"#{layer.height}px\"\n\t\tborderRadius: \"5px\"\n\t\tbackgroundColor: \"rgba(255,0,0,.8)\"\n\n\tlayer.states.animationOptions =\n\t\tcurve: \"spring\"\n\t\tcurveOptions:\n\t\t\ttension: 1000\n\t\t\tfriction: 30\n\n\tlayer.states.switch \"visible\"\n\n\tlayer.on Events.Click, ->\n\t\t@states.switch \"default\"\n\n\t_errorWarningLayer = layer\n\nwindow.onerror = errorWarning\n", "{_} = require \"./Underscore\"\n\nUtils = require \"./Utils\"\n\nOriginals = \n\tLayer:\n\t\tbackgroundColor: \"rgba(0,124,255,.5)\"\n\t\twidth: 100\n\t\theight: 100\n\tAnimation:\n\t\tcurve: \"linear\"\n\t\ttime: 1\n\nexports.Defaults =\n\n\tgetDefaults: (className, options) ->\n\n\t\t# Always start with the originals\n\t\tdefaults = _.clone Originals[className]\n\n\t\t# Copy over the user defined options\n\t\tfor k, v of Framer.Defaults[className]\n\t\t\tdefaults[k] = if _.isFunction(v) then v() else v\n\n\t\t# Then copy over the default keys to the options\n\t\tfor k, v of defaults\n\t\t\tif not options.hasOwnProperty k\n\t\t\t\toptions[k] = v\n\n\t\t# Include a secret property with the default keys\n\t\t# options._defaultValues = defaults\n\t\t\n\t\toptions\n\n\treset: ->\n\t\twindow.Framer.Defaults = _.clone Originals", "{_} = require \"./Underscore\"\n\nEventEmitterEventsKey = \"_events\"\n\nclass exports.EventEmitter\n\t\n\tconstructor: ->\n\t\t@[EventEmitterEventsKey] = {}\n\n\t_eventCheck: (event, method) ->\n\t\tif not event\n\t\t\tconsole.warn \"#{@constructor.name}.#{method} missing event (like 'click')\"\n\n\temit: (event, args...) ->\n\t\t\n\t\t# We skip it here because we need all the perf we can get\n\t\t# @_eventCheck event, \"emit\"\n\n\t\tif not @[EventEmitterEventsKey]?[event]\n\t\t\treturn\n\t\t\n\t\tfor listener in @[EventEmitterEventsKey][event]\n\t\t\tlistener args...\n\t\t\n\t\treturn\n\n\taddListener: (event, listener) ->\n\t\t\n\t\t@_eventCheck event, \"addListener\"\n\t\t\n\t\t@[EventEmitterEventsKey] ?= {}\n\t\t@[EventEmitterEventsKey][event] ?= []\n\t\t@[EventEmitterEventsKey][event].push listener\n\n\tremoveListener: (event, listener) ->\n\t\t\n\t\t@_eventCheck event, \"removeListener\"\n\t\t\n\t\treturn unless @[EventEmitterEventsKey]\n\t\treturn unless @[EventEmitterEventsKey][event]\n\t\t\n\t\t@[EventEmitterEventsKey][event] = _.without @[EventEmitterEventsKey][event], listener\n\n\t\treturn\n\n\tonce: (event, listener) ->\n\n\t\tfn = =>\n\t\t\t@removeListener event, fn\n\t\t\tlistener arguments...\n\n\t\t@on event, fn\n\n\tremoveAllListeners: (event) ->\n\t\t\n\t\treturn unless @[EventEmitterEventsKey]\n\t\treturn unless @[EventEmitterEventsKey][event]\n\t\t\n\t\tfor listener in @[EventEmitterEventsKey][event]\n\t\t\t@removeListener event, listener\n\n\t\treturn\n\t\n\ton: @::addListener\n\toff: @::removeListener", "{_} = require \"./Underscore\"\n\nUtils = require \"./Utils\"\n\nEvents = {}\n\nif Utils.isTouch()\n\tEvents.TouchStart = \"touchstart\"\n\tEvents.TouchEnd = \"touchend\"\n\tEvents.TouchMove = \"touchmove\"\nelse\n\tEvents.TouchStart = \"mousedown\"\n\tEvents.TouchEnd = \"mouseup\"\n\tEvents.TouchMove = \"mousemove\"\n\nEvents.Click = Events.TouchEnd\n\n# Standard dom events\nEvents.MouseOver = \"mouseover\"\nEvents.MouseOut = \"mouseout\"\n\n# Animation events\nEvents.AnimationStart = \"start\"\nEvents.AnimationStop = \"stop\"\nEvents.AnimationEnd = \"end\"\n\n# Scroll events\nEvents.Scroll = \"scroll\"\n\n# Extract touch events for any event\nEvents.touchEvent = (event) ->\n\ttouchEvent = event.touches?[0]\n\ttouchEvent ?= event.changedTouches?[0]\n\ttouchEvent ?= event\n\ttouchEvent\n\t\nexports.Events = Events", "{BaseClass} = require \"./BaseClass\"\n\nclass exports.Frame extends BaseClass\n\n\t@define \"x\", @simpleProperty \"x\", 0\n\t@define \"y\", @simpleProperty \"y\", 0\n\t@define \"width\", @simpleProperty \"width\", 0\n\t@define \"height\", @simpleProperty \"height\", 0\n\n\t@define \"minX\", @simpleProperty \"x\", 0, false\n\t@define \"minY\", @simpleProperty \"y\", 0, false\n\n\tconstructor: (options={}) ->\n\n\t\tsuper options\n\n\t\tfor k in [\"minX\", \"midX\", \"maxX\", \"minY\", \"midY\", \"maxY\"]\n\t\t\tif options.hasOwnProperty k\n\t\t\t\t@[k] = options[k]\n\n\t@define \"midX\",\n\t\tget: -> Utils.frameGetMidX @\n\t\tset: (value) -> Utils.frameSetMidX @, value\n\n\t@define \"maxX\",\n\t\tget: -> Utils.frameGetMaxX @\n\t\tset: (value) -> Utils.frameSetMaxX @, value\n\n\t@define \"midY\",\n\t\tget: -> Utils.frameGetMidY @\n\t\tset: (value) -> Utils.frameSetMidY @, value\n\n\t@define \"maxY\",\n\t\tget: -> Utils.frameGetMaxY @\n\t\tset: (value) -> Utils.frameSetMaxY @, value", "{_} = require \"./Underscore\"\n\nFramer = {}\n\n# Root level modules\nFramer._ = _\nFramer.Utils = (require \"./Utils\")\nFramer.Frame = (require \"./Frame\").Frame\nFramer.Layer = (require \"./Layer\").Layer\nFramer.Events = (require \"./Events\").Events\nFramer.Animation = (require \"./Animation\").Animation\n\n_.extend window, Framer if window\n\n# Framer level modules\n\nFramer.Config = (require \"./Config\").Config\nFramer.BaseClass = (require \"./BaseClass\").BaseClass\nFramer.LayerStyle = (require \"./LayerStyle\").LayerStyle\nFramer.AnimationLoop = (require \"./AnimationLoop\").AnimationLoop\nFramer.LinearAnimator = (require \"./Animators/LinearAnimator\").LinearAnimator\nFramer.BezierCurveAnimator = (require \"./Animators/BezierCurveAnimator\").BezierCurveAnimator\nFramer.SpringDHOAnimator = (require \"./Animators/SpringDHOAnimator\").SpringDHOAnimator\nFramer.SpringRK4Animator = (require \"./Animators/SpringRK4Animator\").SpringRK4Animator\nFramer.Importer = (require \"./Importer\").Importer\nFramer.Debug = (require \"./Debug\").Debug\n\nwindow.Framer = Framer if window\n\n# Compatibility for Framer 2\nrequire \"./Compat\"\n\n# Set the defaults\nDefaults = (require \"./Defaults\").Defaults\nFramer.resetDefaults = Defaults.reset\nFramer.resetDefaults()", "{_} = require \"./Underscore\"\nUtils = require \"./Utils\"\n\nChromeAlert = \"\"\"\nImporting layers is currently only supported on Safari. If you really want it to work with Chrome quit it, open a terminal and run:\nopen -a Google\\ Chrome -–allow-file-access-from-files\n\"\"\"\n\nclass exports.Importer\n\n\tconstructor: (@path, @extraLayerProperties={}) ->\n\n\t\t@paths =\n\t\t\tlayerInfo: Utils.pathJoin @path, \"layers.json\"\n\t\t\timages: Utils.pathJoin @path, \"images\"\n\t\t\tdocumentName: @path.split(\"/\").pop()\n\n\t\t@_createdLayers = []\n\t\t@_createdLayersByName = {}\n\n\tload: ->\n\n\t\tlayersByName = {}\n\t\tlayerInfo = @_loadlayerInfo()\n\t\t\n\t\t# Pass one. Create all layers build the hierarchy\n\t\tlayerInfo.map (layerItemInfo) =>\n\t\t\t@_createLayer layerItemInfo\n\n\t\t# Pass two. Adjust position on screen for all layers\n\t\t# based on the hierarchy.\n\t\tfor layer in @_createdLayers\n\t\t\t@_correctLayer layer\n\n\t\t# Pass three, insert the layers into the dom\n\t\t# (they were not inserted yet because of the shadow keyword)\n\t\tfor layer in @_createdLayers\n\t\t\tif not layer.superLayer\n\t\t\t\tlayer.superLayer = null\n\n\t\t@_createdLayersByName\n\n\t_loadlayerInfo: ->\n\n\t\t# Chrome is a pain in the ass and won't allow local file access\n\t\t# therefore I add a .js file which adds the data to \n\t\t# window.__imported__[\"\"]\n\n\t\timportedKey = \"#{@paths.documentName}/layers.json.js\"\n\n\t\tif window.__imported__?.hasOwnProperty importedKey\n\t\t\treturn window.__imported__[importedKey]\n\n\t\t# # For now this does not work in Chrome and we throw an error\n\t\t# try\n\t\t# \treturn Framer.Utils.domLoadJSONSync @paths.layerInfo\n\t\t# catch e\n\t\t# \tif Utils.isChrome\n\t\t# \t\talert ChromeAlert\n\t\t# \telse\n\t\t# \t\tthrow e\n\n\t\treturn Framer.Utils.domLoadJSONSync @paths.layerInfo\n\n\t_createLayer: (info, superLayer) ->\n\t\t\n\t\tLayerClass = Layer\n\n\t\tlayerInfo =\n\t\t\tshadow: true\n\t\t\tname: info.name\n\t\t\tframe: info.layerFrame\n\t\t\tclip: false\n\t\t\tbackgroundColor: null\n\t\t\tvisible: info.visible ? true\n\n\t\t_.extend layerInfo, @extraLayerProperties\n\n\t\t# Most layers will have an image, add that here\n\t\tif info.image\n\t\t\tlayerInfo.frame = info.image.frame\n\t\t\tlayerInfo.image = Utils.pathJoin @path, info.image.path\n\t\t\t\n\t\t# If there is a mask on this layer group, take it's frame\n\t\tif info.maskFrame\n\t\t\tlayerInfo.frame = info.maskFrame\n\t\t\tlayerInfo.clip = true\n\n\t\t# Todo: smart stuff for paging and scroll views\n\n\t\t# Figure out what the super layer should be. If this layer has a contentLayer\n\t\t# (like a scroll view) we attach it to that instead.\n\t\tif superLayer?.contentLayer\n\t\t\tlayerInfo.superLayer = superLayer.contentLayer\n\t\telse if superLayer\n\t\t\tlayerInfo.superLayer = superLayer\n\n\t\t# We can create the layer here\n\t\tlayer = new LayerClass layerInfo\n\t\tlayer.name = layerInfo.name\n\n\t\t# A layer without an image, mask or sublayers should be zero\n\t\tif not layer.image and not info.children.length and not info.maskFrame\n\t\t\tlayer.frame = new Frame\n\n\t\tinfo.children.reverse().map (info) => @_createLayer info, layer\n\n\t\t# TODODODODOD\n\t\tif not layer.image and not info.maskFrame\n\t\t\tlayer.frame = layer.contentFrame()\n\n\t\tlayer._info = info\n\n\t\t@_createdLayers.push layer\n\t\t@_createdLayersByName[layer.name] = layer\n\n\t_correctLayer: (layer) ->\n\n\t\ttraverse = (layer) ->\n\n\t\t\tif layer.superLayer\n\t\t\t\tlayer.frame = Utils.convertPoint layer.frame, null, layer.superLayer\n\n\t\t\tfor subLayer in layer.subLayers\n\t\t\t\ttraverse subLayer\n\n\t\tif not layer.superLayer\n\t\t\ttraverse layer\n\nexports.Importer.load = (path) ->\n\timporter = new exports.Importer path\n\timporter.load()", "{_} = require \"./Underscore\"\n\nUtils = require \"./Utils\"\n\n{Config} = require \"./Config\"\n{Defaults} = require \"./Defaults\"\n{BaseClass} = require \"./BaseClass\"\n{Animation} = require \"./Animation\"\n{Frame} = require \"./Frame\"\n{LayerStyle} = require \"./LayerStyle\"\n{LayerStates} = require \"./LayerStates\"\n{LayerDraggable} = require \"./LayerDraggable\"\n\n_RootElement = null\n_LayerList = []\n\nlayerProperty = (name, cssProperty, fallback, set) ->\n\texportable: true\n\tdefault: fallback\n\tget: ->\n\t\t@_getPropertyValue name\n\tset: (value) ->\n\t\t@_setPropertyValue name, value\n\t\t@style[cssProperty] = LayerStyle[cssProperty](@)\n\t\t@emit \"change:#{name}\", value\n\t\tset @, value if set\n\nlayerStyleProperty = (cssProperty) ->\n\texportable: true\n\t# default: fallback\n\tget: -> @style[cssProperty]\n\tset: (value) -> \n\t\t@style[cssProperty] = value\n\t\t@emit \"change:#{cssProperty}\", value\n\nframeProperty = (name) ->\n\texportable: false\n\tget: -> @frame[name]\n\tset: (value) -> \n\t\tframe = @frame\n\t\tframe[name] = value\n\t\t@frame = frame\n\nclass exports.Layer extends BaseClass\n\n\tconstructor: (options={}) ->\n\n\t\t_LayerList.push @\n\n\t\t# We have to create the element before we set the defaults\n\t\t@_createElement()\n\t\t@_setDefaultCSS()\n\n\t\toptions = Defaults.getDefaults \"Layer\", options\n\n\t\tsuper options\n\n\t\t# Keep track of the default values\n\t\t# @_defaultValues = options._defaultValues\n\n\t\t# We need to explicitly set the element id again, becuase it was made by the super\n\t\t@_element.id = \"FramerLayer-#{@id}\"\n\n\t\t# Extract the frame from the options, so we support minX, maxX etc.\n\t\tif options.hasOwnProperty \"frame\"\n\t\t\tframe = new Frame options.frame\n\t\telse\n\t\t\tframe = new Frame options\n\n\t\t@frame = frame\n\n\t\t# Insert the layer into the dom or the superLayer element\n\t\tif not options.superLayer\n\t\t\t@bringToFront()\n\t\t\t@_insertElement() if not options.shadow\n\t\telse\n\t\t\t@superLayer = options.superLayer\n\n\t\t# Set needed private variables\n\t\t@_subLayers = []\n\n\t##############################################################\n\t# Properties\n\n\t@define \"name\", @simpleProperty \"name\", \"\"\n\n\t# Css properties\n\t@define \"width\", layerProperty \"width\", \"width\", 100\n\t@define \"height\", layerProperty \"height\", \"height\", 100\n\n\t@define \"visible\", layerProperty \"visible\", \"display\", true\n\t@define \"opacity\", layerProperty \"opacity\", \"opacity\", 1\n\t@define \"index\", layerProperty \"index\", \"zIndex\", 0\n\n\n\t@define \"clip\", layerProperty \"clip\", \"overflow\", true\n\t@define \"scrollHorizontal\", layerProperty \"scrollHorizontal\", \"overflowX\", false, (layer, value) -> \n\t\tlayer.ignoreEvents = false if value is true\n\t@define \"scrollVertical\", layerProperty \"scrollVertical\", \"overflowY\", false, (layer, value) -> \n\t\tlayer.ignoreEvents = false if value is true\n\n\t@define \"scroll\",\n\t\tget: -> @scrollHorizontal is true or @scrollVertical is true\n\t\tset: (value) -> @scrollHorizontal = @scrollVertical = true\n\n\t# Behaviour properties\n\t@define \"ignoreEvents\", layerProperty \"ignoreEvents\", \"pointerEvents\", true\n\n\t# Matrix properties\n\t@define \"x\", layerProperty \"x\", \"webkitTransform\", 0\n\t@define \"y\", layerProperty \"y\", \"webkitTransform\", 0\n\t@define \"z\", layerProperty \"z\", \"webkitTransform\", 0\n\n\t@define \"scaleX\", layerProperty \"scaleX\", \"webkitTransform\", 1\n\t@define \"scaleY\", layerProperty \"scaleY\", \"webkitTransform\", 1\n\t@define \"scaleZ\", layerProperty \"scaleZ\", \"webkitTransform\", 1\n\t@define \"scale\", layerProperty \"scale\", \"webkitTransform\", 1\n\n\t# @define \"scale\",\n\t# \tget: -> (@scaleX + @scaleY + @scaleZ) / 3.0\n\t# \tset: (value) -> @scaleX = @scaleY = @scaleZ = value\n\n\t@define \"originX\", layerProperty \"originX\", \"webkitTransformOrigin\", 0.5\n\t@define \"originY\", layerProperty \"originY\", \"webkitTransformOrigin\", 0.5\n\t# @define \"originZ\", layerProperty \"originZ\", \"webkitTransformOrigin\", 0.5\n\n\t@define \"rotationX\", layerProperty \"rotationX\", \"webkitTransform\", 0\n\t@define \"rotationY\", layerProperty \"rotationY\", \"webkitTransform\", 0\n\t@define \"rotationZ\", layerProperty \"rotationZ\", \"webkitTransform\", 0\n\t@define \"rotation\", layerProperty \"rotationZ\", \"webkitTransform\", 0\n\n\t# Filter properties\n\t@define \"blur\", layerProperty \"blur\", \"webkitFilter\", 0\n\t@define \"brightness\", layerProperty \"brightness\", \"webkitFilter\", 100\n\t@define \"saturate\", layerProperty \"saturate\", \"webkitFilter\", 100\n\t@define \"hueRotate\", layerProperty \"hueRotate\", \"webkitFilter\", 0\n\t@define \"contrast\", layerProperty \"contrast\", \"webkitFilter\", 100\n\t@define \"invert\", layerProperty \"invert\", \"webkitFilter\", 0\n\t@define \"grayscale\", layerProperty \"grayscale\", \"webkitFilter\", 0\n\t@define \"sepia\", layerProperty \"sepia\", \"webkitFilter\", 0\n\n\t# Mapped style properties\n\n\t@define \"backgroundColor\", layerStyleProperty \"backgroundColor\"\n\t@define \"borderRadius\", layerStyleProperty \"borderRadius\"\n\t@define \"borderColor\", layerStyleProperty \"borderColor\"\n\t@define \"borderWidth\", layerStyleProperty \"borderWidth\"\n\n\n\t##############################################################\n\t# Geometry\n\n\t@define \"frame\",\n\t\tget: ->\n\t\t\tnew Frame @\n\t\tset: (frame) ->\n\t\t\treturn if not frame\n\t\t\tfor k in [\"x\", \"y\", \"width\", \"height\"]\n\t\t\t\t@[k] = frame[k]\n\n\t@define \"minX\", frameProperty \"minX\"\n\t@define \"midX\", frameProperty \"midX\"\n\t@define \"maxX\", frameProperty \"maxX\"\n\t@define \"minY\", frameProperty \"minY\"\n\t@define \"midY\", frameProperty \"midY\"\n\t@define \"maxY\", frameProperty \"maxY\"\n\n\tconvertPoint: (point) ->\n\t\t# Convert a point on screen to this views coordinate system\n\t\t# TODO: needs tests\n\t\tUtils.convertPoint point, null, @\n\t\t\n\tscreenFrame: ->\n\t\t# Get this views absolute frame on the screen\n\t\t# TODO: needs tests\n\t\tUtils.convertPoint @frame, @, null\n\t\n\tcontentFrame: ->\n\t\tUtils.frameMerge @subLayers.map (layer) -> layer.frame.properties\n\n\tcenterFrame: ->\n\t\t# Get the centered frame for its superview\n\t\t# We always make these pixel perfect\n\t\t# TODO: needs tests\n\t\tif @superView\n\t\t\tframe = @frame\n\t\t\tframe.midX = parseInt @superView.width / 2.0\n\t\t\tframe.midY = parseInt @superView.height / 2.0\n\t\t\treturn frame\n\t\t\n\t\telse\n\t\t\tframe = @frame\n\t\t\tframe.midX = parseInt window.innerWidth / 2.0\n\t\t\tframe.midY = parseInt window.innerHeight / 2.0\n\t\t\treturn frame\n\t\n\tcenter: -> @frame = @centerFrame() # Center in superLayer\n\tcenterX: -> @x = @centerFrame().x # Center x in superLayer\n\tcenterY: -> @y = @centerFrame().y # Center y in superLayer\n\t\n\tpixelAlign: ->\n\t\t@x = parseInt @x\n\t\t@y = parseInt @y\n\n\n\t##############################################################\n\t# CSS\n\n\t@define \"style\",\n\t\tget: -> @_element.style\n\t\tset: (value) -> \n\t\t\t_.extend @_element.style, value\n\t\t\t@emit \"change:style\"\n\n\t@define \"html\",\n\t\tget: -> \n\t\t\t@_elementHTML?.innerHTML\n\n\t\tset: (value) ->\n\n\t\t\t# Insert some html directly into this layer. We actually create\n\t\t\t# a child node to insert it in, so it won't mess with Framers\n\t\t\t# layer hierarchy.\n\n\t\t\tif not @_elementHTML\n\t\t\t\t@_elementHTML = document.createElement \"div\"\n\t\t\t\t@_element.appendChild @_elementHTML\n\t\t\t\n\t\t\t@_elementHTML.innerHTML = value\n\n\t\t\t# If the contents contains something else than plain text\n\t\t\t# then we turn off ignoreEvents so buttons etc will work.\n\n\t\t\tif not (\n\t\t\t\t@_elementHTML.childNodes.length == 1 and \n\t\t\t\t@_elementHTML.childNodes[0].nodeName == \"#text\")\n\t\t\t\t@ignoreEvents = false\n\n\t\t\t@emit \"change:html\"\n\n\tcomputedStyle: ->\n\t\tdocument.defaultView.getComputedStyle @_element\n\n\t_setDefaultCSS: ->\n\t\t@style = Config.layerBaseCSS\n\n\t@define \"classList\",\n\t\tget: -> @_element.classList\t\n\n\n\t##############################################################\n\t# DOM ELEMENTS\n\t\t\n\t_createElement: ->\n\t\treturn if @_element?\n\t\t@_element = document.createElement \"div\"\n\n\t_insertElement: ->\n\t\tUtils.domComplete @__insertElement\n\n\t__insertElement: =>\n\t\tif not _RootElement\n\t\t\t_RootElement = document.createElement \"div\"\n\t\t\t_RootElement.id = \"FramerRoot\"\n\t\t\t_.extend _RootElement.style, Config.rootBaseCSS\n\t\t\tdocument.body.appendChild _RootElement\n\n\t\t_RootElement.appendChild @_element\n\n\tdestroy: ->\n\t\t\n\t\tif @superLayer\n\t\t\t@superLayer._subLayers = _.without @superLayer._subLayers, @\n\n\t\t@_element.parentNode.removeChild @_element\n\t\t@removeAllListeners()\n\n\t\t_LayerList = _.without _LayerList, @\n\n\n\t##############################################################\n\t## COPYING\n\n\tcopy: ->\n\n\t\t# Todo: what about events, states, etc.\n\n\t\tlayer = @copySingle()\n\n\t\tfor subLayer in @subLayers\n\t\t\tcopiedSublayer = subLayer.copy()\n\t\t\tcopiedSublayer.superLayer = layer\n\n\t\tlayer\n\n\tcopySingle: -> new Layer @properties\n\n\t##############################################################\n\t## ANIMATION\n\n\tanimate: (options) ->\n\t\t\n\t\toptions.layer = @\n\t\toptions.curveOptions = options\n\n\t\tanimation = new Animation options\n\t\tanimation.start()\n\n\t\tanimation\n\n\t##############################################################\n\t## IMAGE\n\n\t@define \"image\",\n\t\texportable: true\n\t\tdefault: \"\"\n\t\tget: ->\n\t\t\t@_getPropertyValue \"image\"\n\t\tset: (value) ->\n\n\t\t\tcurrentValue = @_getPropertyValue \"image\"\n\n\t\t\tif currentValue == value\n\t\t\t\treturn @emit \"load\"\n\n\t\t\t# Todo: this is not very nice but I wanted to have it fixed\n\t\t\t# defaults = Defaults.getDefaults \"Layer\", {}\n\n\t\t\t# console.log defaults.backgroundColor\n\t\t\t# console.log @_defaultValues?.backgroundColor\n\n\t\t\t# if defaults.backgroundColor == @_defaultValues?.backgroundColor\n\t\t\t# \t@backgroundColor = null\n\n\t\t\t@backgroundColor = null\n\t\t\t\n\t\t\t# Set the property value\n\t\t\t@_setPropertyValue \"image\", value\n\n\t\t\timageUrl = value\n\n\t\t\t# Optional base image value \n\t\t\t# imageUrl = Config.baseUrl + imageUrl\n\n\t\t\t# If the file is local, we want to avoid caching\n\t\t\t# if Utils.isLocal()\n\t\t\t# \timageUrl += \"?nocache=#{Date.now()}\"\n\t\t\t\n\t\t\t# As an optimization, we will only use a loader\n\t\t\t# if something is explicitly listening to the load event\n\t\t\t\n\t\t\tif @events?.hasOwnProperty \"load\" or @events?.hasOwnProperty \"error\"\n\t\t\t\n\t\t\t\tloader = new Image()\n\t\t\t\tloader.name = imageUrl\n\t\t\t\tloader.src = imageUrl\n\t\t\t\n\t\t\t\tloader.onload = =>\n\t\t\t\t\t@style[\"background-image\"] = \"url('#{imageUrl}')\"\n\t\t\t\t\t@emit \"load\", loader\n\t\t\t\n\t\t\t\tloader.onerror = =>\n\t\t\t\t\t@emit \"error\", loader\n\t\t\t\n\t\t\telse\n\t\t\t\t@style[\"background-image\"] = \"url('#{imageUrl}')\"\n\n\t##############################################################\n\t## HIERARCHY\n\n\t@define \"superLayer\",\n\t\texportable: false\n\t\tget: -> \n\t\t\t@_superLayer or null\n\t\tset: (layer) ->\n\n\t\t\treturn if layer is @_superLayer\n\t\t\t\n\t\t\t# Check the type\n\t\t\tif not layer instanceof Layer\n\t\t\t\tthrow Error \"Layer.superLayer needs to be a Layer object\"\n\n\t\t\t# Cancel previous pending insertions\n\t\t\tUtils.domCompleteCancel @__insertElement\n\t\t\t\n\t\t\t# Remove from previous superlayer sublayers\n\t\t\tif @_superLayer\n\t\t\t\t@_superLayer._subLayers = _.without @_superLayer._subLayers, @\n\t\t\t\t@_superLayer._element.removeChild @_element\n\t\t\t\t@_superLayer.emit \"change:subLayers\", {added:[], removed:[@]}\n\t\t\t\n\t\t\t# Either insert the element to the new superlayer element or into dom\n\t\t\tif layer\n\t\t\t\tlayer._element.appendChild @_element\n\t\t\t\tlayer._subLayers.push @\n\t\t\t\tlayer.emit \"change:subLayers\", {added:[@], removed:[]}\n\t\t\telse\n\t\t\t\t@_insertElement()\n\t\t\t\n\t\t\t# Set the superlayer\n\t\t\t@_superLayer = layer\n\t\t\t\n\t\t\t# Place this layer on top of it's siblings\n\t\t\t@bringToFront()\n\t\t\t\n\t\t\t@emit \"change:superLayer\"\n\n\tsuperLayers: ->\n\n\t\tsuperLayers = []\n\n\t\trecurse = (layer) ->\n\t\t\treturn if not layer.superLayer\n\t\t\tsuperLayers.push layer.superLayer\n\t\t\trecurse layer.superLayer\n\n\t\trecurse @\n\n\t\tsuperLayers\n\t\n\t# Todo: should we have a recursive subLayers function?\n\t# Let's make it when we need it.\n\n\t@define \"subLayers\",\n\t\texportable: false\n\t\tget: -> _.clone @_subLayers\n\t\n\t@define \"siblingLayers\",\n\t\texportable: false\n\t\tget: ->\n\n\t\t\t# If there is no superLayer we need to walk through the root\n\t\t\tif @superLayer is null\n\t\t\t\treturn _.filter _LayerList, (layer) =>\n\t\t\t\t\tlayer isnt @ and layer.superLayer is null\n\n\t\t\treturn _.without @superLayer.subLayers, @\n\n\taddSubLayer: (layer) ->\n\t\tlayer.superLayer = @\n\t\n\tremoveSubLayer: (layer) ->\n\t\t\n\t\tif layer not in @subLayers\n\t\t\treturn\n\t\t\n\t\tlayer.superLayer = null\n\n\tsubLayersByName: (name) ->\n\t\t_.filter @subLayers, (layer) -> layer.name == name\n\n\t##############################################################\n\t## ANIMATION\n\n\tanimate: (options) ->\n\n\t\tstart = options.start\n\t\tstart ?= true\n\t\tdelete options.start\n\n\t\toptions.layer = @\n\t\tanimation = new Animation options\n\t\tanimation.start() if start\n\t\tanimation\n\n\tanimations: ->\n\t\t# Current running animations on this layer\n\t\t_.filter Animation.runningAnimations(), (a) =>\n\t\t\ta.options.layer == @\n\n\tanimateStop: ->\n\t\t_.invoke @animations(), \"stop\"\n\n\t##############################################################\n\t## INDEX ORDERING\n\n\tbringToFront: ->\n\t\t@index = _.max(_.union([0], @siblingLayers.map (layer) -> layer.index)) + 1\n\n\tsendToBack: ->\n\t\t@index = _.min(_.union([0], @siblingLayers.map (layer) -> layer.index)) - 1\n\n\tplaceBefore: (layer) ->\n\t\treturn if layer not in @siblingLayers\n\n\t\tfor l in @siblingLayers\n\t\t\tif l.index <= layer.index\n\t\t\t\tl.index -= 1\n\n\t\t@index = layer.index + 1\n\n\tplaceBehind: (layer) ->\n\t\treturn if layer not in @siblingLayers\n\n\t\tfor l in @siblingLayers\n\t\t\tif l.index >= layer.index\n\t\t\t\tl.index += 1\n\n\t\t@index = layer.index - 1\n\n\t##############################################################\n\t## STATES\n\n\t@define \"states\",\n\t\tget: -> @_states ?= new LayerStates @\n\n\t#############################################################################\n\t## Draggable\n\n\t@define \"draggable\",\n\t\tget: ->\n\t\t\t@_draggable ?= new LayerDraggable @\n\t\t\t@_draggable\n\n\t##############################################################\n\t## SCROLLING\n\n\t# TODO: Tests\n\n\t@define \"scrollFrame\",\n\t\tget: ->\n\t\t\treturn new Frame\n\t\t\t\tx: @scrollX\n\t\t\t\ty: @scrollY\n\t\t\t\twidth: @width\n\t\t\t\theight: @height\n\t\tset: (frame) ->\n\t\t\t@scrollX = frame.x\n\t\t\t@scrollY = frame.y\n\n\t@define \"scrollX\",\n\t\tget: -> @_element.scrollLeft\n\t\tset: (value) -> @_element.scrollLeft = value\n\n\t@define \"scrollY\",\n\t\tget: -> @_element.scrollTop\n\t\tset: (value) -> @_element.scrollTop = value\n\n\t##############################################################\n\t## EVENTS\n\t\n\taddListener: (event, originalListener) =>\n\n\t\t# Modify the scope to be the calling object, just like jquery\n\t\t# also add the object as the last argument\n\t\tlistener = (args...) =>\n\t\t\toriginalListener.call @, args..., @\n\n\t\t# Listen to dom events on the element\n\t\tsuper event, listener\n\t\t@_element.addEventListener event, listener\n\n\t\t@_eventListeners ?= {}\n\t\t@_eventListeners[event] ?= []\n\t\t@_eventListeners[event].push listener\n\n\t\t# We want to make sure we listen to these events\n\t\t@ignoreEvents = false\n\n\tremoveListener: (event, listener) ->\n\t\tsuper\n\t\t@_element.removeEventListener event, listener\n\t\t@_eventListeners[event] = _.without @_eventListeners[event], listener\n\n\tremoveAllListeners: ->\n\n\t\treturn if not @_eventListeners\n\t\t\n\t\tfor eventName, listeners of @_eventListeners\n\t\t\tfor listener in listeners\n\t\t\t\t@removeListener eventName, listener\n\n\ton: @::addListener\n\toff: @::removeListener\n\nexports.Layer.Layers = -> _.clone _LayerList\n", "_ = require \"./Underscore\"\n\nUtils = require \"./Utils\"\n{EventEmitter} = require \"./EventEmitter\"\n{Events} = require \"./Events\"\n\n# Add specific events for draggable\nEvents.DragStart = \"dragstart\"\nEvents.DragMove = \"dragmove\"\nEvents.DragEnd = \"dragend\"\n\n\"\"\"\nThis takes any layer and makes it draggable by the user on mobile or desktop.\n\nSome interesting things are:\n\n- The draggable.calculateVelocity().x|y contains the current average speed \n in the last 100ms (defined with VelocityTimeOut).\n- You can enable/disable or slowdown/speedup scrolling with\n draggable.speed.x|y\n\n\"\"\"\n\nclass exports.LayerDraggable extends EventEmitter\n\n\t@VelocityTimeOut = 100\n\n\tconstructor: (@layer) ->\n\n\t\t# @speed = {x:1.0, y:1.0}\n\t\t@speedX = 1.0\n\t\t@speedY = 1.0\n\n\t\t@_deltas = []\n\t\t@_isDragging = false\n\n\t\t@enabled = true\n\n\t\t@attach()\n\n\tattach: -> @layer.on Events.TouchStart, @_touchStart\n\tremove: -> @layer.off Events.TouchStart, @_touchStart\n\n\temit: (eventName, event) ->\n\t\t# We override this to get all events both on the draggable\n\t\t# and the encapsulated layer.\n\t\t@layer.emit eventName, event\n\n\t\tsuper eventName, event\n\n\n\tcalculateVelocity: ->\n\n\t\tif @_deltas.length < 2\n\t\t\treturn {x:0, y:0}\n\n\t\tcurr = @_deltas[-1..-1][0]\n\t\tprev = @_deltas[-2..-2][0]\n\t\ttime = curr.t - prev.t\n\n\t\t# Bail out if the last move updates where a while ago\n\t\ttimeSinceLastMove = (new Date().getTime() - prev.t)\n\n\t\tif timeSinceLastMove > @VelocityTimeOut\n\t\t\treturn {x:0, y:0}\n\n\t\tvelocity =\n\t\t\tx: (curr.x - prev.x) / time\n\t\t\ty: (curr.y - prev.y) / time\n\n\t\tvelocity.x = 0 if velocity.x is Infinity\n\t\tvelocity.y = 0 if velocity.y is Infinity\n\n\t\tvelocity\n\n\t_updatePosition: (event) =>\n\n\t\tif @enabled is false\n\t\t\treturn\n\n\t\t@emit Events.DragMove, event\n\n\t\ttouchEvent = Events.touchEvent event\n\n\t\tdelta =\n\t\t\tx: touchEvent.clientX - @_start.x\n\t\t\ty: touchEvent.clientY - @_start.y\n\n\t\t# Correct for current drag speed\n\t\tcorrectedDelta =\n\t\t\tx: delta.x * @speedX\n\t\t\ty: delta.y * @speedY\n\t\t\tt: event.timeStamp\n\n\t\t# We use the requestAnimationFrame to update the position\n\t\twindow.requestAnimationFrame =>\n\t\t\t@layer.x = @_start.x + correctedDelta.x - @_offset.x\n\t\t\t@layer.y = @_start.y + correctedDelta.y - @_offset.y\n\n\t\t@_deltas.push correctedDelta\n\n\t\t@emit Events.DragMove, event\n\n\t_touchStart: (event) =>\n\n\t\t@layer.animateStop()\n\n\t\t@_isDragging = true\n\n\t\ttouchEvent = Events.touchEvent event\n\n\t\t@_start =\n\t\t\tx: touchEvent.clientX\n\t\t\ty: touchEvent.clientY\n\n\t\t@_offset =\n\t\t\tx: touchEvent.clientX - @layer.x\n\t\t\ty: touchEvent.clientY - @layer.y\n\n\t\tdocument.addEventListener Events.TouchMove, @_updatePosition\n\t\tdocument.addEventListener Events.TouchEnd, @_touchEnd\n\n\t\t@emit Events.DragStart, event\n\n\t_touchEnd: (event) =>\n\n\t\t@_isDragging = false\n\n\t\tdocument.removeEventListener Events.TouchMove, @_updatePosition\n\t\tdocument.removeEventListener Events.TouchEnd, @_touchEnd\n\n\t\t@emit Events.DragEnd, event\n\n\t\t@_deltas = []", "{_} = require \"./Underscore\"\n\n{Events} = require \"./Events\"\n{BaseClass} = require \"./BaseClass\"\n\nLayerStatesIgnoredKeys = [\"ignoreEvents\"]\n\n# Animation events\nEvents.StateWillSwitch = \"willSwitch\"\nEvents.StateDidSwitch = \"didSwitch\"\n\nclass exports.LayerStates extends BaseClass\n\n\tconstructor: (@layer) ->\n\n\t\t@_states = {}\n\t\t@_orderedStates = []\n\n\t\t@animationOptions =\n\t\t\tcurve: \"spring\"\n\n\t\t# Always add the default state as the current\n\t\t@add \"default\", @layer.properties\n\n\t\t@_currentState = \"default\"\n\t\t@_previousStates = []\n\n\t\tsuper\n\n\tadd: (stateName, properties) ->\n\n\t\t# We also allow an object with states to be passed in\n\t\tif _.isObject stateName\n\t\t\tfor k, v of stateName\n\t\t\t\t@add k, v\n\t\t\treturn\n\n\t\terror = -> throw Error \"Usage example: layer.states.add(\\\"someName\\\", {x:500})\"\n\t\terror() if not _.isString stateName\n\t\terror() if not _.isObject properties\n\n\t\t# Add a state with a name and properties\n\t\t@_orderedStates.push stateName\n\t\t@_states[stateName] = properties\n\n\tremove: (stateName) ->\n\n\t\tif not @_states.hasOwnProperty stateName\n\t\t\treturn\n\n\t\tdelete @_states[stateName]\n\t\t@_orderedStates = _.without @_orderedStates, stateName\n\n\tswitch: (stateName, animationOptions) ->\n\n\t\t# Switches to a specific state. If animationOptions are\n\t\t# given use those, otherwise the default options.\n\n\t\tif stateName is @_currentState\n\t\t\treturn\n\n\t\tif not @_states.hasOwnProperty stateName\n\t\t\tthrow Error \"No such state: '#{stateName}'\"\n\n\t\t@emit Events.StateWillSwitch, @_currentState, stateName, @\n\n\t\t@_previousStates.push @_currentState\n\t\t@_currentState = stateName\n\n\t\tanimationOptions ?= @animationOptions\n\t\tanimationOptions.properties = {}\n\n\t\tanimatingKeys = @animatingKeys()\n\n\t\tfor k, v of @_states[stateName]\n\n\t\t\t# Don't animate ignored properties\n\t\t\tif k in LayerStatesIgnoredKeys\n\t\t\t\tcontinue\n\n\t\t\tif k not in animatingKeys\n\t\t\t\tcontinue\n\n\t\t\t# Allow dynamic properties as functions\n\t\t\tv = v.call(@layer, @layer, stateName) if _.isFunction(v)\n\n\t\t\tanimationOptions.properties[k] = v\n\n\t\tanimation = @layer.animate animationOptions\n\n\t\tanimation.on \"stop\", =>\n\t\t\t@emit Events.StateDidSwitch, _.last(@_previousStates), stateName, @\n\n\tswitchInstant: (stateName) ->\n\t\t# Instantly switch to this new state\n\t\t# TODO: this is not good because we need to be able to get \n\t\t# the next state immediately after calling this\n\t\t@switch stateName,\n\t\t\tcurve: \"linear\"\n\t\t\ttime: 0\n\n\t@define \"state\",\n\t\tget: -> @_currentState\n\n\t@define \"current\",\n\t\tget: -> @_currentState\n\n\tstates: ->\n\t\t# Return a list of all the possible states\n\t\t_.clone @_orderedStates\n\n\tanimatingKeys: ->\n\n\t\tkeys = []\n\n\t\tfor stateName, state of @_states\n\t\t\tcontinue if stateName is \"default\"\n\t\t\tkeys = _.union keys, _.keys state\n\n\t\tkeys\n\n\tprevious: (states, animationOptions) ->\n\t\t# Go to previous state in list\n\t\tstates ?= @states()\n\t\t@switch Utils.arrayPrev(states, @_currentState), animationOptions\n\n\tnext: ->\n\t\t# TODO: maybe add animationOptions\n\t\tstates = Utils.arrayFromArguments arguments\n\n\t\tif not states.length\n\t\t\tstates = @states()\n\n\t\t@switch Utils.arrayNext(states, @_currentState)\n\n\n\tlast: (animationOptions) ->\n\t\t# Return to last state\n\t\t@switch _.last(@_previousStates), animationOptions\n", "filterFormat = (value, unit) ->\n\t\"#{Utils.round value, 2}#{unit}\"\n\t# \"#{value}#{unit}\"\n\n# TODO: Ideally these should be read out from the layer defined properties\n_WebkitProperties = [\n\t[\"blur\", \"blur\", 0, \"px\"],\n\t[\"brightness\", \"brightness\", 100, \"%\"],\n\t[\"saturate\", \"saturate\", 100, \"%\"],\n\t[\"hue-rotate\", \"hueRotate\", 0, \"deg\"],\n\t[\"contrast\", \"contrast\", 100, \"%\"],\n\t[\"invert\", \"invert\", 0, \"%\"],\n\t[\"grayscale\", \"grayscale\", 0, \"%\"],\n\t[\"sepia\", \"sepia\", 0, \"%\"],\n]\n\nexports.LayerStyle =\n\n\twidth: (layer) ->\n\t\tlayer.width + \"px\"\n\t\n\theight: (layer) ->\n\t\tlayer.height + \"px\"\n\n\tdisplay: (layer) ->\n\t\tif layer.visible is true\n\t\t\treturn \"block\"\n\t\treturn \"none\"\n\n\topacity: (layer) ->\n\t\tlayer.opacity\n\n\toverflow: (layer) ->\n\t\tif layer.scrollHorizontal is true or layer.scrollVertical is true\n\t\t\treturn \"auto\"\n\t\tif layer.clip is true\n\t\t\treturn \"hidden\"\n\t\treturn \"visible\"\n\n\toverflowX: (layer) ->\n\t\tif layer.scrollHorizontal is true\n\t\t\treturn \"scroll\"\n\t\tif layer.clip is true\n\t\t\treturn \"hidden\"\n\t\treturn \"visible\"\n\n\toverflowY: (layer) ->\n\t\tif layer.scrollVertical is true\n\t\t\treturn \"scroll\"\n\t\tif layer.clip is true\n\t\t\treturn \"hidden\"\n\t\treturn \"visible\"\n\n\tzIndex: (layer) ->\n\t\tlayer.index\n\n\twebkitFilter: (layer) ->\n\n\t\t# This is mostly an optimization for Chrome. If you pass in the webkit filters\n\t\t# with the defaults, it still takes a shitty rendering path. So I compare them\n\t\t# first and only add the ones that have a non default value.\n\n\t\tcss = []\n\n\t\tfor [cssName, layerName, fallback, unit] in _WebkitProperties\n\t\t\tif layer[layerName] != fallback\n\t\t\t\tcss.push \"#{cssName}(#{filterFormat layer[layerName], unit})\"\n\n\t\treturn css.join(\" \")\n\n\t\t# This is how I used to do it before, and it works well in Safari\n\t\t\n\t\t# \"\n\t\t# blur(#{filterFormat layer.blur, \"px\"}) \n\t\t# brightness(#{filterFormat layer.brightness, \"%\"}) \n\t\t# saturate(#{filterFormat layer.saturate, \"%\"}) \n\t\t# hue-rotate(#{filterFormat layer.hueRotate, \"deg\"}) \n\t\t# contrast(#{filterFormat layer.contrast, \"%\"}) \n\t\t# invert(#{filterFormat layer.invert, \"%\"}) \n\t\t# grayscale(#{filterFormat layer.grayscale, \"%\"}) \n\t\t# sepia(#{filterFormat layer.sepia, \"%\"})\n\t\t# \"\n\n\twebkitTransform: (layer) ->\n\t\t# TODO: On Chrome it seems that adding any other transform property\n\t\t# together with a blur, it breaks the blur and performance. I'll just\n\t\t# wait for the Chrome guys to fix this I guess.\n\t\t\"\n\t\ttranslate3d(#{layer.x}px,#{layer.y}px,#{layer.z}px) \n\t\tscale(#{layer.scale})\n\t\tscale3d(#{layer.scaleX},#{layer.scaleY},#{layer.scaleZ}) \n\t\trotateX(#{layer.rotationX}deg) \n\t\trotateY(#{layer.rotationY}deg) \n\t\trotateZ(#{layer.rotationZ}deg) \n\t\t\"\n\n\twebkitTransformOrigin: (layer) ->\n\t\t\"#{layer.originX * 100}% #{layer.originY * 100}%\"\n\n\t\t# Todo: Origin z is in pixels. I need to read up on this.\n\t\t# \"#{layer.originX * 100}% #{layer.originY * 100}% #{layer.originZ * 100}%\"\n\n\tpointerEvents: (layer) ->\n\t\tif layer.ignoreEvents\n\t\t\treturn \"none\"\n\t\t\"auto\"\n\n\n\t# css: ->\n\t# \tcss = {}\n\t# \tfor k, v of exports.LayerStyle layer\n\t# \t\tif k isnt \"css\"\n\t# \t\t\tcss[k] = v()\n\t# \tcss\n\n\n\n\n", "# This allows us to switch out the underscore utility library\n\n_ = require \"lodash\"\n\n_.str = require 'underscore.string'\n_.mixin _.str.exports()\n\nexports._ = _\n", "# Utils.log = ->\n# \tconsole.log arguments.join \" \"\n\n{_} = require \"./Underscore\"\n\nUtils = {}\n\nUtils.setDefaultProperties = (obj, defaults, warn=true) ->\n\n\tresult = {}\n\n\tfor k, v of defaults\n\t\tif obj.hasOwnProperty k\n\t\t\tresult[k] = obj[k]\n\t\telse\n\t\t\tresult[k] = defaults[k]\n\n\tif warn\n\t\tfor k, v of obj\n\t\t\tif not defaults.hasOwnProperty k\n\t\t\t\tconsole.warn \"Utils.setDefaultProperties: got unexpected option: '#{k} -> #{v}'\", obj\n\n\tresult\n\nUtils.valueOrDefault = (value, defaultValue) ->\n\n\tif value in [undefined, null]\n\t\tvalue = defaultValue\n\n\treturn value\n\nUtils.arrayToObject = (arr) ->\n\tobj = {}\n\n\tfor item in arr\n\t\tobj[item[0]] = item[1]\n\n\tobj\n\nUtils.arrayNext = (arr, item) ->\n\tarr[arr.indexOf(item) + 1] or _.first arr\n\nUtils.arrayPrev = (arr, item) ->\n\tarr[arr.indexOf(item) - 1] or _.last arr\n\n\n######################################################\n# ANIMATION\n\n# This is a little hacky, but I want to avoid wrapping the function\n# in another one as it gets called at 60 fps. So we make it a global.\nwindow.requestAnimationFrame ?= window.webkitRequestAnimationFrame\nwindow.requestAnimationFrame ?= (f) -> Utils.delay 1/60, f\n\n######################################################\n# TIME FUNCTIONS\n\n# Note: in Framer 3 we try to keep all times in seconds\n\n# Used by animation engine, needs to be very performant\nUtils.getTime = -> Date.now() / 1000\n\n# This works only in chrome, but we only use it for testing\n# if window.performance\n# \tUtils.getTime = -> performance.now() / 1000\n\nUtils.delay = (time, f) ->\n\ttimer = setTimeout f, time * 1000\n\t# window._delayTimers ?= []\n\t# window._delayTimers.push timer\n\treturn timer\n\t\nUtils.interval = (time, f) ->\n\ttimer = setInterval f, time * 1000\n\t# window._delayIntervals ?= []\n\t# window._delayIntervals.push timer\n\treturn timer\n\nUtils.debounce = (threshold=0.1, fn, immediate) ->\n\ttimeout = null\n\tthreshold *= 1000\n\t(args...) ->\n\t\tobj = this\n\t\tdelayed = ->\n\t\t\tfn.apply(obj, args) unless immediate\n\t\t\ttimeout = null\n\t\tif timeout\n\t\t\tclearTimeout(timeout)\n\t\telse if (immediate)\n\t\t\tfn.apply(obj, args)\n\t\ttimeout = setTimeout delayed, threshold\n\nUtils.throttle = (delay, fn) ->\n\treturn fn if delay is 0\n\tdelay *= 1000\n\ttimer = false\n\treturn ->\n\t\treturn if timer\n\t\ttimer = true\n\t\tsetTimeout (-> timer = false), delay unless delay is -1\n\t\tfn arguments...\n\n\n######################################################\n# HANDY FUNCTIONS\n\nUtils.randomColor = (alpha = 1.0) ->\n\tc = -> parseInt(Math.random() * 255)\n\t\"rgba(#{c()}, #{c()}, #{c()}, #{alpha})\"\n\nUtils.randomChoice = (arr) ->\n\tarr[Math.floor(Math.random() * arr.length)]\n\nUtils.randomNumber = (a=0, b=1) ->\n\t# Return a random number between a and b\n\tUtils.mapRange Math.random(), 0, 1, a, b\n\nUtils.labelLayer = (layer, text, style={}) ->\n\t\n\tstyle = _.extend\n\t\tfont: \"10px/1em Menlo\"\n\t\tlineHeight: \"#{layer.height}px\"\n\t\ttextAlign: \"center\"\n\t\tcolor: \"#fff\"\n\t, style\n\n\tlayer.style = style\n\tlayer.html = text\n\nUtils.uuid = ->\n\n\tchars = \"0123456789abcdefghijklmnopqrstuvwxyz\".split(\"\")\n\toutput = new Array(36)\n\trandom = 0\n\n\tfor digit in [1..32]\n\t\trandom = 0x2000000 + (Math.random() * 0x1000000) | 0 if (random <= 0x02)\n\t\tr = random & 0xf\n\t\trandom = random >> 4\n\t\toutput[digit] = chars[if digit == 19 then (r & 0x3) | 0x8 else r]\n\n\toutput.join \"\"\n\nUtils.arrayFromArguments = (args) ->\n\n\t# Convert an arguments object to an array\n\t\n\tif _.isArray args[0]\n\t\treturn args[0]\n\t\n\tArray.prototype.slice.call args\n\nUtils.cycle = ->\n\t\n\t# Returns a function that cycles through a list of values with each call.\n\t\n\targs = Utils.arrayFromArguments arguments\n\t\n\tcurr = -1\n\treturn ->\n\t\tcurr++\n\t\tcurr = 0 if curr >= args.length\n\t\treturn args[curr]\n\n# Backwards compatibility\nUtils.toggle = Utils.cycle\n\n\n######################################################\n# ENVIROMENT FUNCTIONS\n\nUtils.isWebKit = ->\n\twindow.WebKitCSSMatrix isnt null\n\t\nUtils.isTouch = ->\n\twindow.ontouchstart is null\n\nUtils.isMobile = ->\n\t(/iphone|ipod|android|ie|blackberry|fennec/).test \\\n\t\tnavigator.userAgent.toLowerCase()\n\nUtils.isChrome = ->\n\t(/chrome/).test \\\n\t\tnavigator.userAgent.toLowerCase()\n\nUtils.isLocal = ->\n\tUtils.isLocalUrl window.location.href\n\nUtils.isLocalUrl = (url) ->\n\turl[0..6] == \"file://\"\n\nUtils.devicePixelRatio = ->\n\twindow.devicePixelRatio\n\nUtils.pathJoin = ->\n\tUtils.arrayFromArguments(arguments).join(\"/\")\n\n######################################################\n# MATH FUNCTIONS\n\t\t\nUtils.round = (value, decimals) ->\n\td = Math.pow 10, decimals\n\tMath.round(value * d) / d\n\n# Taken from http://jsfiddle.net/Xz464/7/\n# Used by animation engine, needs to be very performant\nUtils.mapRange = (value, fromLow, fromHigh, toLow, toHigh) ->\n\ttoLow + (((value - fromLow) / (fromHigh - fromLow)) * (toHigh - toLow))\n\n######################################################\n# STRING FUNCTIONS\n\nUtils.parseFunction = (str) ->\n\n\tresult = {name: \"\", args: []}\n\n\tif _.endsWith str, \")\"\n\t\tresult.name = str.split(\"(\")[0]\n\t\tresult.args = str.split(\"(\")[1].split(\",\").map (a) -> _.trim(_.rtrim(a, \")\"))\n\telse\n\t\tresult.name = str\n\n\treturn result\n\n######################################################\n# DOM FUNCTIONS\n\n__domComplete = []\n\nif document?\n\tdocument.onreadystatechange = (event) =>\n\t\tif document.readyState is \"complete\"\n\t\t\twhile __domComplete.length\n\t\t\t\tf = __domComplete.shift()()\n\nUtils.domComplete = (f) ->\n\tif document.readyState is \"complete\"\n\t\tf()\n\telse\n\t\t__domComplete.push f\n\nUtils.domCompleteCancel = (f) ->\n\t__domComplete = _.without __domComplete, f\n\nUtils.domLoadScript = (url, callback) ->\n\t\n\tscript = document.createElement \"script\"\n\tscript.type = \"text/javascript\"\n\tscript.src = url\n\t\n\tscript.onload = callback\n\t\n\thead = document.getElementsByTagName(\"head\")[0]\n\thead.appendChild script\n\t\n\tscript\n\nUtils.domLoadDataSync = (path) ->\n\n\trequest = new XMLHttpRequest()\n\trequest.open \"GET\", path, false\n\n\t# This does not work in Safari, see below\n\ttry\n\t\trequest.send null\n\tcatch e\n\t\tconsole.debug \"XMLHttpRequest.error\", e\n\n\tdata = request.responseText\n\n\t# Because I can't catch the actual 404 with Safari, I just assume something\n\t# went wrong if there is no text data returned from the request.\n\tif not data\n\t\tthrow Error \"Utils.domLoadDataSync: no data was loaded (url not found?)\"\n\n\treturn request.responseText\n\nUtils.domLoadJSONSync = (path) ->\n\tJSON.parse Utils.domLoadDataSync path\n\n######################################################\n# GEOMERTY FUNCTIONS\n\n# Point\n\nUtils.pointMin = ->\n\tpoints = Utils.arrayFromArguments arguments\n\tpoint = \n\t\tx: _.min point.map (size) -> size.x\n\t\ty: _.min point.map (size) -> size.y\n\nUtils.pointMax = ->\n\tpoints = Utils.arrayFromArguments arguments\n\tpoint = \n\t\tx: _.max point.map (size) -> size.x\n\t\ty: _.max point.map (size) -> size.y\n\nUtils.pointDistance = (pointA, pointB) ->\n\tdistance =\n\t\tx: Math.abs(pointB.x - pointA.x)\n\t\ty: Math.abs(pointB.y - pointA.y)\n\nUtils.pointInvert = (point) ->\n\tpoint =\n\t\tx: 0 - point.x\n\t\ty: 0 - point.y\n\nUtils.pointTotal = (point) ->\n\tpoint.x + point.y\n\nUtils.pointAbs = (point) ->\n\tpoint =\n\t\tx: Math.abs point.x\n\t\ty: Math.abs point.y\n\nUtils.pointInFrame = (point, frame) ->\n\treturn false if point.x < frame.minX or point.x > frame.maxX\n\treturn false if point.y < frame.minY or point.y > frame.maxY\n\ttrue\n\n# Size\n\nUtils.sizeMin = ->\n\tsizes = Utils.arrayFromArguments arguments\n\tsize =\n\t\twidth: _.min sizes.map (size) -> size.width\n\t\theight: _.min sizes.map (size) -> size.height\n\nUtils.sizeMax = ->\n\tsizes = Utils.arrayFromArguments arguments\n\tsize =\n\t\twidth: _.max sizes.map (size) -> size.width\n\t\theight: _.max sizes.map (size) -> size.height\n\n# Frames\n\n# min mid max * x, y\n\nUtils.frameGetMinX = (frame) -> frame.x\nUtils.frameSetMinX = (frame, value) -> frame.x = value\n\nUtils.frameGetMidX = (frame) -> \n\tif frame.width is 0 then 0 else frame.x + (frame.width / 2.0)\nUtils.frameSetMidX = (frame, value) ->\n\tframe.x = if frame.width is 0 then 0 else value - (frame.width / 2.0)\n\nUtils.frameGetMaxX = (frame) -> \n\tif frame.width is 0 then 0 else frame.x + frame.width\nUtils.frameSetMaxX = (frame, value) ->\n\tframe.x = if frame.width is 0 then 0 else value - frame.width\n\nUtils.frameGetMinY = (frame) -> frame.y\nUtils.frameSetMinY = (frame, value) -> frame.y = value\n\nUtils.frameGetMidY = (frame) -> \n\tif frame.height is 0 then 0 else frame.y + (frame.height / 2.0)\nUtils.frameSetMidY = (frame, value) ->\n\tframe.y = if frame.height is 0 then 0 else value - (frame.height / 2.0)\n\nUtils.frameGetMaxY = (frame) -> \n\tif frame.height is 0 then 0 else frame.y + frame.height\nUtils.frameSetMaxY = (frame, value) ->\n\tframe.y = if frame.height is 0 then 0 else value - frame.height\n\n\nUtils.frameSize = (frame) ->\n\tsize =\n\t\twidth: frame.width\n\t\theight: frame.height\n\nUtils.framePoint = (frame) ->\n\tpoint =\n\t\tx: frame.x\n\t\ty: frame.y\n\nUtils.frameMerge = ->\n\n\t# Return a frame that fits all the input frames\n\n\tframes = Utils.arrayFromArguments arguments\n\n\tframe =\n\t\tx: _.min frames.map Utils.frameGetMinX\n\t\ty: _.min frames.map Utils.frameGetMinY\n\n\tframe.width = _.max(frames.map Utils.frameGetMaxX) - frame.x\n\tframe.height = _.max(frames.map Utils.frameGetMaxY) - frame.y\n\n\tframe\n\n# Coordinate system\n\nUtils.convertPoint = (input, layerA, layerB) ->\n\n\t# Convert a point between two layer coordinate systems\n\n\tpoint = {}\n\n\tfor k in [\"x\", \"y\", \"width\", \"height\"]\n\t\tpoint[k] = input[k]\n\n\tsuperLayersA = layerA?.superLayers() or []\n\tsuperLayersB = layerB?.superLayers() or []\n\t\n\tsuperLayersB.push layerB if layerB\n\t\n\tfor layer in superLayersA\n\t\tpoint.x += layer.x - layer.scrollFrame.x\n\t\tpoint.y += layer.y - layer.scrollFrame.y\n\n\tfor layer in superLayersB\n\t\tpoint.x -= layer.x + layer.scrollFrame.x\n\t\tpoint.y -= layer.y + layer.scrollFrame.y\n\t\n\treturn point\n\n_.extend exports, Utils\n\n", "var global=typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {};/**\n * @license\n * Lo-Dash 2.4.1 (Custom Build) \n * Build: `lodash modern -o ./dist/lodash.js`\n * Copyright 2012-2013 The Dojo Foundation \n * Based on Underscore.js 1.5.2 \n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\n;(function() {\n\n /** Used as a safe reference for `undefined` in pre ES5 environments */\n var undefined;\n\n /** Used to pool arrays and objects used internally */\n var arrayPool = [],\n objectPool = [];\n\n /** Used to generate unique IDs */\n var idCounter = 0;\n\n /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\n var keyPrefix = +new Date + '';\n\n /** Used as the size when optimizations are enabled for large arrays */\n var largeArraySize = 75;\n\n /** Used as the max size of the `arrayPool` and `objectPool` */\n var maxPoolSize = 40;\n\n /** Used to detect and test whitespace */\n var whitespace = (\n // whitespace\n ' \\t\\x0B\\f\\xA0\\ufeff' +\n\n // line terminators\n '\\n\\r\\u2028\\u2029' +\n\n // unicode category \"Zs\" space separators\n '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\n );\n\n /** Used to match empty string literals in compiled template source */\n var reEmptyStringLeading = /\\b__p \\+= '';/g,\n reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n /**\n * Used to match ES6 template delimiters\n * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\n */\n var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n /** Used to match regexp flags from their coerced string values */\n var reFlags = /\\w*$/;\n\n /** Used to detected named functions */\n var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\n\n /** Used to match \"interpolate\" template delimiters */\n var reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n /** Used to match leading whitespace and zeros to be removed */\n var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\n\n /** Used to ensure capturing order of template delimiters */\n var reNoMatch = /($^)/;\n\n /** Used to detect functions containing a `this` reference */\n var reThis = /\\bthis\\b/;\n\n /** Used to match unescaped characters in compiled string literals */\n var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\n\n /** Used to assign default `context` object properties */\n var contextProps = [\n 'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\n 'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\n 'parseInt', 'setTimeout'\n ];\n\n /** Used to make template sourceURLs easier to identify */\n var templateCounter = 0;\n\n /** `Object#toString` result shortcuts */\n var argsClass = '[object Arguments]',\n arrayClass = '[object Array]',\n boolClass = '[object Boolean]',\n dateClass = '[object Date]',\n funcClass = '[object Function]',\n numberClass = '[object Number]',\n objectClass = '[object Object]',\n regexpClass = '[object RegExp]',\n stringClass = '[object String]';\n\n /** Used to identify object classifications that `_.clone` supports */\n var cloneableClasses = {};\n cloneableClasses[funcClass] = false;\n cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\n cloneableClasses[boolClass] = cloneableClasses[dateClass] =\n cloneableClasses[numberClass] = cloneableClasses[objectClass] =\n cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\n\n /** Used as an internal `_.debounce` options object */\n var debounceOptions = {\n 'leading': false,\n 'maxWait': 0,\n 'trailing': false\n };\n\n /** Used as the property descriptor for `__bindData__` */\n var descriptor = {\n 'configurable': false,\n 'enumerable': false,\n 'value': null,\n 'writable': false\n };\n\n /** Used to determine if values are of the language type Object */\n var objectTypes = {\n 'boolean': false,\n 'function': true,\n 'object': true,\n 'number': false,\n 'string': false,\n 'undefined': false\n };\n\n /** Used to escape characters for inclusion in compiled string literals */\n var stringEscapes = {\n '\\\\': '\\\\',\n \"'\": \"'\",\n '\\n': 'n',\n '\\r': 'r',\n '\\t': 't',\n '\\u2028': 'u2028',\n '\\u2029': 'u2029'\n };\n\n /** Used as a reference to the global object */\n var root = (objectTypes[typeof window] && window) || this;\n\n /** Detect free variable `exports` */\n var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\n\n /** Detect free variable `module` */\n var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\n\n /** Detect the popular CommonJS extension `module.exports` */\n var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\n\n /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\n var freeGlobal = objectTypes[typeof global] && global;\n if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n root = freeGlobal;\n }\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * The base implementation of `_.indexOf` without support for binary searches\n * or `fromIndex` constraints.\n *\n * @private\n * @param {Array} array The array to search.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the matched value or `-1`.\n */\n function baseIndexOf(array, value, fromIndex) {\n var index = (fromIndex || 0) - 1,\n length = array ? array.length : 0;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * An implementation of `_.contains` for cache objects that mimics the return\n * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\n *\n * @private\n * @param {Object} cache The cache object to inspect.\n * @param {*} value The value to search for.\n * @returns {number} Returns `0` if `value` is found, else `-1`.\n */\n function cacheIndexOf(cache, value) {\n var type = typeof value;\n cache = cache.cache;\n\n if (type == 'boolean' || value == null) {\n return cache[value] ? 0 : -1;\n }\n if (type != 'number' && type != 'string') {\n type = 'object';\n }\n var key = type == 'number' ? value : keyPrefix + value;\n cache = (cache = cache[type]) && cache[key];\n\n return type == 'object'\n ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\n : (cache ? 0 : -1);\n }\n\n /**\n * Adds a given value to the corresponding cache object.\n *\n * @private\n * @param {*} value The value to add to the cache.\n */\n function cachePush(value) {\n var cache = this.cache,\n type = typeof value;\n\n if (type == 'boolean' || value == null) {\n cache[value] = true;\n } else {\n if (type != 'number' && type != 'string') {\n type = 'object';\n }\n var key = type == 'number' ? value : keyPrefix + value,\n typeCache = cache[type] || (cache[type] = {});\n\n if (type == 'object') {\n (typeCache[key] || (typeCache[key] = [])).push(value);\n } else {\n typeCache[key] = true;\n }\n }\n }\n\n /**\n * Used by `_.max` and `_.min` as the default callback when a given\n * collection is a string value.\n *\n * @private\n * @param {string} value The character to inspect.\n * @returns {number} Returns the code unit of given character.\n */\n function charAtCallback(value) {\n return value.charCodeAt(0);\n }\n\n /**\n * Used by `sortBy` to compare transformed `collection` elements, stable sorting\n * them in ascending order.\n *\n * @private\n * @param {Object} a The object to compare to `b`.\n * @param {Object} b The object to compare to `a`.\n * @returns {number} Returns the sort order indicator of `1` or `-1`.\n */\n function compareAscending(a, b) {\n var ac = a.criteria,\n bc = b.criteria,\n index = -1,\n length = ac.length;\n\n while (++index < length) {\n var value = ac[index],\n other = bc[index];\n\n if (value !== other) {\n if (value > other || typeof value == 'undefined') {\n return 1;\n }\n if (value < other || typeof other == 'undefined') {\n return -1;\n }\n }\n }\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n // that causes it, under certain circumstances, to return the same value for\n // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\n //\n // This also ensures a stable sort in V8 and other engines.\n // See http://code.google.com/p/v8/issues/detail?id=90\n return a.index - b.index;\n }\n\n /**\n * Creates a cache object to optimize linear searches of large arrays.\n *\n * @private\n * @param {Array} [array=[]] The array to search.\n * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\n */\n function createCache(array) {\n var index = -1,\n length = array.length,\n first = array[0],\n mid = array[(length / 2) | 0],\n last = array[length - 1];\n\n if (first && typeof first == 'object' &&\n mid && typeof mid == 'object' && last && typeof last == 'object') {\n return false;\n }\n var cache = getObject();\n cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\n\n var result = getObject();\n result.array = array;\n result.cache = cache;\n result.push = cachePush;\n\n while (++index < length) {\n result.push(array[index]);\n }\n return result;\n }\n\n /**\n * Used by `template` to escape characters for inclusion in compiled\n * string literals.\n *\n * @private\n * @param {string} match The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\n function escapeStringChar(match) {\n return '\\\\' + stringEscapes[match];\n }\n\n /**\n * Gets an array from the array pool or creates a new one if the pool is empty.\n *\n * @private\n * @returns {Array} The array from the pool.\n */\n function getArray() {\n return arrayPool.pop() || [];\n }\n\n /**\n * Gets an object from the object pool or creates a new one if the pool is empty.\n *\n * @private\n * @returns {Object} The object from the pool.\n */\n function getObject() {\n return objectPool.pop() || {\n 'array': null,\n 'cache': null,\n 'criteria': null,\n 'false': false,\n 'index': 0,\n 'null': false,\n 'number': null,\n 'object': null,\n 'push': null,\n 'string': null,\n 'true': false,\n 'undefined': false,\n 'value': null\n };\n }\n\n /**\n * Releases the given array back to the array pool.\n *\n * @private\n * @param {Array} [array] The array to release.\n */\n function releaseArray(array) {\n array.length = 0;\n if (arrayPool.length < maxPoolSize) {\n arrayPool.push(array);\n }\n }\n\n /**\n * Releases the given object back to the object pool.\n *\n * @private\n * @param {Object} [object] The object to release.\n */\n function releaseObject(object) {\n var cache = object.cache;\n if (cache) {\n releaseObject(cache);\n }\n object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\n if (objectPool.length < maxPoolSize) {\n objectPool.push(object);\n }\n }\n\n /**\n * Slices the `collection` from the `start` index up to, but not including,\n * the `end` index.\n *\n * Note: This function is used instead of `Array#slice` to support node lists\n * in IE < 9 and to ensure dense arrays are returned.\n *\n * @private\n * @param {Array|Object|string} collection The collection to slice.\n * @param {number} start The start index.\n * @param {number} end The end index.\n * @returns {Array} Returns the new array.\n */\n function slice(array, start, end) {\n start || (start = 0);\n if (typeof end == 'undefined') {\n end = array ? array.length : 0;\n }\n var index = -1,\n length = end - start || 0,\n result = Array(length < 0 ? 0 : length);\n\n while (++index < length) {\n result[index] = array[start + index];\n }\n return result;\n }\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Create a new `lodash` function using the given context object.\n *\n * @static\n * @memberOf _\n * @category Utilities\n * @param {Object} [context=root] The context object.\n * @returns {Function} Returns the `lodash` function.\n */\n function runInContext(context) {\n // Avoid issues with some ES3 environments that attempt to use values, named\n // after built-in constructors like `Object`, for the creation of literals.\n // ES5 clears this up by stating that literals must use built-in constructors.\n // See http://es5.github.io/#x11.1.5.\n context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\n\n /** Native constructor references */\n var Array = context.Array,\n Boolean = context.Boolean,\n Date = context.Date,\n Function = context.Function,\n Math = context.Math,\n Number = context.Number,\n Object = context.Object,\n RegExp = context.RegExp,\n String = context.String,\n TypeError = context.TypeError;\n\n /**\n * Used for `Array` method references.\n *\n * Normally `Array.prototype` would suffice, however, using an array literal\n * avoids issues in Narwhal.\n */\n var arrayRef = [];\n\n /** Used for native method references */\n var objectProto = Object.prototype;\n\n /** Used to restore the original `_` reference in `noConflict` */\n var oldDash = context._;\n\n /** Used to resolve the internal [[Class]] of values */\n var toString = objectProto.toString;\n\n /** Used to detect if a method is native */\n var reNative = RegExp('^' +\n String(toString)\n .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n );\n\n /** Native method shortcuts */\n var ceil = Math.ceil,\n clearTimeout = context.clearTimeout,\n floor = Math.floor,\n fnToString = Function.prototype.toString,\n getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\n hasOwnProperty = objectProto.hasOwnProperty,\n push = arrayRef.push,\n setTimeout = context.setTimeout,\n splice = arrayRef.splice,\n unshift = arrayRef.unshift;\n\n /** Used to set meta data on functions */\n var defineProperty = (function() {\n // IE 8 only accepts DOM elements\n try {\n var o = {},\n func = isNative(func = Object.defineProperty) && func,\n result = func(o, o, o) && func;\n } catch(e) { }\n return result;\n }());\n\n /* Native method shortcuts for methods with the same name as other `lodash` methods */\n var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\n nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\n nativeIsFinite = context.isFinite,\n nativeIsNaN = context.isNaN,\n nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\n nativeMax = Math.max,\n nativeMin = Math.min,\n nativeParseInt = context.parseInt,\n nativeRandom = Math.random;\n\n /** Used to lookup a built-in constructor by [[Class]] */\n var ctorByClass = {};\n ctorByClass[arrayClass] = Array;\n ctorByClass[boolClass] = Boolean;\n ctorByClass[dateClass] = Date;\n ctorByClass[funcClass] = Function;\n ctorByClass[objectClass] = Object;\n ctorByClass[numberClass] = Number;\n ctorByClass[regexpClass] = RegExp;\n ctorByClass[stringClass] = String;\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Creates a `lodash` object which wraps the given value to enable intuitive\n * method chaining.\n *\n * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\n * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\n * and `unshift`\n *\n * Chaining is supported in custom builds as long as the `value` method is\n * implicitly or explicitly included in the build.\n *\n * The chainable wrapper functions are:\n * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\n * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\n * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\n * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\n * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\n * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\n * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\n * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\n * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\n * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\n * and `zip`\n *\n * The non-chainable wrapper functions are:\n * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\n * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\n * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\n * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\n * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\n * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\n * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\n * `template`, `unescape`, `uniqueId`, and `value`\n *\n * The wrapper functions `first` and `last` return wrapped values when `n` is\n * provided, otherwise they return unwrapped values.\n *\n * Explicit chaining can be enabled by using the `_.chain` method.\n *\n * @name _\n * @constructor\n * @category Chaining\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns a `lodash` instance.\n * @example\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // returns an unwrapped value\n * wrapped.reduce(function(sum, num) {\n * return sum + num;\n * });\n * // => 6\n *\n * // returns a wrapped value\n * var squares = wrapped.map(function(num) {\n * return num * num;\n * });\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */\n function lodash(value) {\n // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\n return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\n ? value\n : new lodashWrapper(value);\n }\n\n /**\n * A fast path for creating `lodash` wrapper objects.\n *\n * @private\n * @param {*} value The value to wrap in a `lodash` instance.\n * @param {boolean} chainAll A flag to enable chaining for all methods\n * @returns {Object} Returns a `lodash` instance.\n */\n function lodashWrapper(value, chainAll) {\n this.__chain__ = !!chainAll;\n this.__wrapped__ = value;\n }\n // ensure `new lodashWrapper` is an instance of `lodash`\n lodashWrapper.prototype = lodash.prototype;\n\n /**\n * An object used to flag environments features.\n *\n * @static\n * @memberOf _\n * @type Object\n */\n var support = lodash.support = {};\n\n /**\n * Detect if functions can be decompiled by `Function#toString`\n * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\n *\n * @memberOf _.support\n * @type boolean\n */\n support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\n\n /**\n * Detect if `Function#name` is supported (all but IE).\n *\n * @memberOf _.support\n * @type boolean\n */\n support.funcNames = typeof Function.name == 'string';\n\n /**\n * By default, the template delimiters used by Lo-Dash are similar to those in\n * embedded Ruby (ERB). Change the following template settings to use alternative\n * delimiters.\n *\n * @static\n * @memberOf _\n * @type Object\n */\n lodash.templateSettings = {\n\n /**\n * Used to detect `data` property values to be HTML-escaped.\n *\n * @memberOf _.templateSettings\n * @type RegExp\n */\n 'escape': /<%-([\\s\\S]+?)%>/g,\n\n /**\n * Used to detect code to be evaluated.\n *\n * @memberOf _.templateSettings\n * @type RegExp\n */\n 'evaluate': /<%([\\s\\S]+?)%>/g,\n\n /**\n * Used to detect `data` property values to inject.\n *\n * @memberOf _.templateSettings\n * @type RegExp\n */\n 'interpolate': reInterpolate,\n\n /**\n * Used to reference the data object in the template text.\n *\n * @memberOf _.templateSettings\n * @type string\n */\n 'variable': '',\n\n /**\n * Used to import variables into the compiled template.\n *\n * @memberOf _.templateSettings\n * @type Object\n */\n 'imports': {\n\n /**\n * A reference to the `lodash` function.\n *\n * @memberOf _.templateSettings.imports\n * @type Function\n */\n '_': lodash\n }\n };\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * The base implementation of `_.bind` that creates the bound function and\n * sets its meta data.\n *\n * @private\n * @param {Array} bindData The bind data array.\n * @returns {Function} Returns the new bound function.\n */\n function baseBind(bindData) {\n var func = bindData[0],\n partialArgs = bindData[2],\n thisArg = bindData[4];\n\n function bound() {\n // `Function#bind` spec\n // http://es5.github.io/#x15.3.4.5\n if (partialArgs) {\n // avoid `arguments` object deoptimizations by using `slice` instead\n // of `Array.prototype.slice.call` and not assigning `arguments` to a\n // variable as a ternary expression\n var args = slice(partialArgs);\n push.apply(args, arguments);\n }\n // mimic the constructor's `return` behavior\n // http://es5.github.io/#x13.2.2\n if (this instanceof bound) {\n // ensure `new bound` is an instance of `func`\n var thisBinding = baseCreate(func.prototype),\n result = func.apply(thisBinding, args || arguments);\n return isObject(result) ? result : thisBinding;\n }\n return func.apply(thisArg, args || arguments);\n }\n setBindData(bound, bindData);\n return bound;\n }\n\n /**\n * The base implementation of `_.clone` without argument juggling or support\n * for `thisArg` binding.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} [isDeep=false] Specify a deep clone.\n * @param {Function} [callback] The function to customize cloning values.\n * @param {Array} [stackA=[]] Tracks traversed source objects.\n * @param {Array} [stackB=[]] Associates clones with source counterparts.\n * @returns {*} Returns the cloned value.\n */\n function baseClone(value, isDeep, callback, stackA, stackB) {\n if (callback) {\n var result = callback(value);\n if (typeof result != 'undefined') {\n return result;\n }\n }\n // inspect [[Class]]\n var isObj = isObject(value);\n if (isObj) {\n var className = toString.call(value);\n if (!cloneableClasses[className]) {\n return value;\n }\n var ctor = ctorByClass[className];\n switch (className) {\n case boolClass:\n case dateClass:\n return new ctor(+value);\n\n case numberClass:\n case stringClass:\n return new ctor(value);\n\n case regexpClass:\n result = ctor(value.source, reFlags.exec(value));\n result.lastIndex = value.lastIndex;\n return result;\n }\n } else {\n return value;\n }\n var isArr = isArray(value);\n if (isDeep) {\n // check for circular references and return corresponding clone\n var initedStack = !stackA;\n stackA || (stackA = getArray());\n stackB || (stackB = getArray());\n\n var length = stackA.length;\n while (length--) {\n if (stackA[length] == value) {\n return stackB[length];\n }\n }\n result = isArr ? ctor(value.length) : {};\n }\n else {\n result = isArr ? slice(value) : assign({}, value);\n }\n // add array properties assigned by `RegExp#exec`\n if (isArr) {\n if (hasOwnProperty.call(value, 'index')) {\n result.index = value.index;\n }\n if (hasOwnProperty.call(value, 'input')) {\n result.input = value.input;\n }\n }\n // exit for shallow clone\n if (!isDeep) {\n return result;\n }\n // add the source value to the stack of traversed objects\n // and associate it with its clone\n stackA.push(value);\n stackB.push(result);\n\n // recursively populate clone (susceptible to call stack limits)\n (isArr ? forEach : forOwn)(value, function(objValue, key) {\n result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\n });\n\n if (initedStack) {\n releaseArray(stackA);\n releaseArray(stackB);\n }\n return result;\n }\n\n /**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} prototype The object to inherit from.\n * @returns {Object} Returns the new object.\n */\n function baseCreate(prototype, properties) {\n return isObject(prototype) ? nativeCreate(prototype) : {};\n }\n // fallback for browsers without `Object.create`\n if (!nativeCreate) {\n baseCreate = (function() {\n function Object() {}\n return function(prototype) {\n if (isObject(prototype)) {\n Object.prototype = prototype;\n var result = new Object;\n Object.prototype = null;\n }\n return result || context.Object();\n };\n }());\n }\n\n /**\n * The base implementation of `_.createCallback` without support for creating\n * \"_.pluck\" or \"_.where\" style callbacks.\n *\n * @private\n * @param {*} [func=identity] The value to convert to a callback.\n * @param {*} [thisArg] The `this` binding of the created callback.\n * @param {number} [argCount] The number of arguments the callback accepts.\n * @returns {Function} Returns a callback function.\n */\n function baseCreateCallback(func, thisArg, argCount) {\n if (typeof func != 'function') {\n return identity;\n }\n // exit early for no `thisArg` or already bound by `Function#bind`\n if (typeof thisArg == 'undefined' || !('prototype' in func)) {\n return func;\n }\n var bindData = func.__bindData__;\n if (typeof bindData == 'undefined') {\n if (support.funcNames) {\n bindData = !func.name;\n }\n bindData = bindData || !support.funcDecomp;\n if (!bindData) {\n var source = fnToString.call(func);\n if (!support.funcNames) {\n bindData = !reFuncName.test(source);\n }\n if (!bindData) {\n // checks if `func` references the `this` keyword and stores the result\n bindData = reThis.test(source);\n setBindData(func, bindData);\n }\n }\n }\n // exit early if there are no `this` references or `func` is bound\n if (bindData === false || (bindData !== true && bindData[1] & 1)) {\n return func;\n }\n switch (argCount) {\n case 1: return function(value) {\n return func.call(thisArg, value);\n };\n case 2: return function(a, b) {\n return func.call(thisArg, a, b);\n };\n case 3: return function(value, index, collection) {\n return func.call(thisArg, value, index, collection);\n };\n case 4: return function(accumulator, value, index, collection) {\n return func.call(thisArg, accumulator, value, index, collection);\n };\n }\n return bind(func, thisArg);\n }\n\n /**\n * The base implementation of `createWrapper` that creates the wrapper and\n * sets its meta data.\n *\n * @private\n * @param {Array} bindData The bind data array.\n * @returns {Function} Returns the new function.\n */\n function baseCreateWrapper(bindData) {\n var func = bindData[0],\n bitmask = bindData[1],\n partialArgs = bindData[2],\n partialRightArgs = bindData[3],\n thisArg = bindData[4],\n arity = bindData[5];\n\n var isBind = bitmask & 1,\n isBindKey = bitmask & 2,\n isCurry = bitmask & 4,\n isCurryBound = bitmask & 8,\n key = func;\n\n function bound() {\n var thisBinding = isBind ? thisArg : this;\n if (partialArgs) {\n var args = slice(partialArgs);\n push.apply(args, arguments);\n }\n if (partialRightArgs || isCurry) {\n args || (args = slice(arguments));\n if (partialRightArgs) {\n push.apply(args, partialRightArgs);\n }\n if (isCurry && args.length < arity) {\n bitmask |= 16 & ~32;\n return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\n }\n }\n args || (args = arguments);\n if (isBindKey) {\n func = thisBinding[key];\n }\n if (this instanceof bound) {\n thisBinding = baseCreate(func.prototype);\n var result = func.apply(thisBinding, args);\n return isObject(result) ? result : thisBinding;\n }\n return func.apply(thisBinding, args);\n }\n setBindData(bound, bindData);\n return bound;\n }\n\n /**\n * The base implementation of `_.difference` that accepts a single array\n * of values to exclude.\n *\n * @private\n * @param {Array} array The array to process.\n * @param {Array} [values] The array of values to exclude.\n * @returns {Array} Returns a new array of filtered values.\n */\n function baseDifference(array, values) {\n var index = -1,\n indexOf = getIndexOf(),\n length = array ? array.length : 0,\n isLarge = length >= largeArraySize && indexOf === baseIndexOf,\n result = [];\n\n if (isLarge) {\n var cache = createCache(values);\n if (cache) {\n indexOf = cacheIndexOf;\n values = cache;\n } else {\n isLarge = false;\n }\n }\n while (++index < length) {\n var value = array[index];\n if (indexOf(values, value) < 0) {\n result.push(value);\n }\n }\n if (isLarge) {\n releaseObject(values);\n }\n return result;\n }\n\n /**\n * The base implementation of `_.flatten` without support for callback\n * shorthands or `thisArg` binding.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\n * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\n * @param {number} [fromIndex=0] The index to start from.\n * @returns {Array} Returns a new flattened array.\n */\n function baseFlatten(array, isShallow, isStrict, fromIndex) {\n var index = (fromIndex || 0) - 1,\n length = array ? array.length : 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n\n if (value && typeof value == 'object' && typeof value.length == 'number'\n && (isArray(value) || isArguments(value))) {\n // recursively flatten arrays (susceptible to call stack limits)\n if (!isShallow) {\n value = baseFlatten(value, isShallow, isStrict);\n }\n var valIndex = -1,\n valLength = value.length,\n resIndex = result.length;\n\n result.length += valLength;\n while (++valIndex < valLength) {\n result[resIndex++] = value[valIndex];\n }\n } else if (!isStrict) {\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.isEqual`, without support for `thisArg` binding,\n * that allows partial \"_.where\" style comparisons.\n *\n * @private\n * @param {*} a The value to compare.\n * @param {*} b The other value to compare.\n * @param {Function} [callback] The function to customize comparing values.\n * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\n * @param {Array} [stackA=[]] Tracks traversed `a` objects.\n * @param {Array} [stackB=[]] Tracks traversed `b` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\n function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\n // used to indicate that when comparing objects, `a` has at least the properties of `b`\n if (callback) {\n var result = callback(a, b);\n if (typeof result != 'undefined') {\n return !!result;\n }\n }\n // exit early for identical values\n if (a === b) {\n // treat `+0` vs. `-0` as not equal\n return a !== 0 || (1 / a == 1 / b);\n }\n var type = typeof a,\n otherType = typeof b;\n\n // exit early for unlike primitive values\n if (a === a &&\n !(a && objectTypes[type]) &&\n !(b && objectTypes[otherType])) {\n return false;\n }\n // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\n // http://es5.github.io/#x15.3.4.4\n if (a == null || b == null) {\n return a === b;\n }\n // compare [[Class]] names\n var className = toString.call(a),\n otherClass = toString.call(b);\n\n if (className == argsClass) {\n className = objectClass;\n }\n if (otherClass == argsClass) {\n otherClass = objectClass;\n }\n if (className != otherClass) {\n return false;\n }\n switch (className) {\n case boolClass:\n case dateClass:\n // coerce dates and booleans to numbers, dates to milliseconds and booleans\n // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\n return +a == +b;\n\n case numberClass:\n // treat `NaN` vs. `NaN` as equal\n return (a != +a)\n ? b != +b\n // but treat `+0` vs. `-0` as not equal\n : (a == 0 ? (1 / a == 1 / b) : a == +b);\n\n case regexpClass:\n case stringClass:\n // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\n // treat string primitives and their corresponding object instances as equal\n return a == String(b);\n }\n var isArr = className == arrayClass;\n if (!isArr) {\n // unwrap any `lodash` wrapped values\n var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\n bWrapped = hasOwnProperty.call(b, '__wrapped__');\n\n if (aWrapped || bWrapped) {\n return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\n }\n // exit for functions and DOM nodes\n if (className != objectClass) {\n return false;\n }\n // in older versions of Opera, `arguments` objects have `Array` constructors\n var ctorA = a.constructor,\n ctorB = b.constructor;\n\n // non `Object` object instances with different constructors are not equal\n if (ctorA != ctorB &&\n !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\n ('constructor' in a && 'constructor' in b)\n ) {\n return false;\n }\n }\n // assume cyclic structures are equal\n // the algorithm for detecting cyclic structures is adapted from ES 5.1\n // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\n var initedStack = !stackA;\n stackA || (stackA = getArray());\n stackB || (stackB = getArray());\n\n var length = stackA.length;\n while (length--) {\n if (stackA[length] == a) {\n return stackB[length] == b;\n }\n }\n var size = 0;\n result = true;\n\n // add `a` and `b` to the stack of traversed objects\n stackA.push(a);\n stackB.push(b);\n\n // recursively compare objects and arrays (susceptible to call stack limits)\n if (isArr) {\n // compare lengths to determine if a deep comparison is necessary\n length = a.length;\n size = b.length;\n result = size == length;\n\n if (result || isWhere) {\n // deep compare the contents, ignoring non-numeric properties\n while (size--) {\n var index = length,\n value = b[size];\n\n if (isWhere) {\n while (index--) {\n if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\n break;\n }\n }\n } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\n break;\n }\n }\n }\n }\n else {\n // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\n // which, in this case, is more costly\n forIn(b, function(value, key, b) {\n if (hasOwnProperty.call(b, key)) {\n // count the number of properties.\n size++;\n // deep compare each property value.\n return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\n }\n });\n\n if (result && !isWhere) {\n // ensure both objects have the same number of properties\n forIn(a, function(value, key, a) {\n if (hasOwnProperty.call(a, key)) {\n // `size` will be `-1` if `a` has more properties than `b`\n return (result = --size > -1);\n }\n });\n }\n }\n stackA.pop();\n stackB.pop();\n\n if (initedStack) {\n releaseArray(stackA);\n releaseArray(stackB);\n }\n return result;\n }\n\n /**\n * The base implementation of `_.merge` without argument juggling or support\n * for `thisArg` binding.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {Function} [callback] The function to customize merging properties.\n * @param {Array} [stackA=[]] Tracks traversed source objects.\n * @param {Array} [stackB=[]] Associates values with source counterparts.\n */\n function baseMerge(object, source, callback, stackA, stackB) {\n (isArray(source) ? forEach : forOwn)(source, function(source, key) {\n var found,\n isArr,\n result = source,\n value = object[key];\n\n if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\n // avoid merging previously merged cyclic sources\n var stackLength = stackA.length;\n while (stackLength--) {\n if ((found = stackA[stackLength] == source)) {\n value = stackB[stackLength];\n break;\n }\n }\n if (!found) {\n var isShallow;\n if (callback) {\n result = callback(value, source);\n if ((isShallow = typeof result != 'undefined')) {\n value = result;\n }\n }\n if (!isShallow) {\n value = isArr\n ? (isArray(value) ? value : [])\n : (isPlainObject(value) ? value : {});\n }\n // add `source` and associated `value` to the stack of traversed objects\n stackA.push(source);\n stackB.push(value);\n\n // recursively merge objects and arrays (susceptible to call stack limits)\n if (!isShallow) {\n baseMerge(value, source, callback, stackA, stackB);\n }\n }\n }\n else {\n if (callback) {\n result = callback(value, source);\n if (typeof result == 'undefined') {\n result = source;\n }\n }\n if (typeof result != 'undefined') {\n value = result;\n }\n }\n object[key] = value;\n });\n }\n\n /**\n * The base implementation of `_.random` without argument juggling or support\n * for returning floating-point numbers.\n *\n * @private\n * @param {number} min The minimum possible value.\n * @param {number} max The maximum possible value.\n * @returns {number} Returns a random number.\n */\n function baseRandom(min, max) {\n return min + floor(nativeRandom() * (max - min + 1));\n }\n\n /**\n * The base implementation of `_.uniq` without support for callback shorthands\n * or `thisArg` binding.\n *\n * @private\n * @param {Array} array The array to process.\n * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\n * @param {Function} [callback] The function called per iteration.\n * @returns {Array} Returns a duplicate-value-free array.\n */\n function baseUniq(array, isSorted, callback) {\n var index = -1,\n indexOf = getIndexOf(),\n length = array ? array.length : 0,\n result = [];\n\n var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\n seen = (callback || isLarge) ? getArray() : result;\n\n if (isLarge) {\n var cache = createCache(seen);\n indexOf = cacheIndexOf;\n seen = cache;\n }\n while (++index < length) {\n var value = array[index],\n computed = callback ? callback(value, index, array) : value;\n\n if (isSorted\n ? !index || seen[seen.length - 1] !== computed\n : indexOf(seen, computed) < 0\n ) {\n if (callback || isLarge) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n if (isLarge) {\n releaseArray(seen.array);\n releaseObject(seen);\n } else if (callback) {\n releaseArray(seen);\n }\n return result;\n }\n\n /**\n * Creates a function that aggregates a collection, creating an object composed\n * of keys generated from the results of running each element of the collection\n * through a callback. The given `setter` function sets the keys and values\n * of the composed object.\n *\n * @private\n * @param {Function} setter The setter function.\n * @returns {Function} Returns the new aggregator function.\n */\n function createAggregator(setter) {\n return function(collection, callback, thisArg) {\n var result = {};\n callback = lodash.createCallback(callback, thisArg, 3);\n\n var index = -1,\n length = collection ? collection.length : 0;\n\n if (typeof length == 'number') {\n while (++index < length) {\n var value = collection[index];\n setter(result, value, callback(value, index, collection), collection);\n }\n } else {\n forOwn(collection, function(value, key, collection) {\n setter(result, value, callback(value, key, collection), collection);\n });\n }\n return result;\n };\n }\n\n /**\n * Creates a function that, when called, either curries or invokes `func`\n * with an optional `this` binding and partially applied arguments.\n *\n * @private\n * @param {Function|string} func The function or method name to reference.\n * @param {number} bitmask The bitmask of method flags to compose.\n * The bitmask may be composed of the following flags:\n * 1 - `_.bind`\n * 2 - `_.bindKey`\n * 4 - `_.curry`\n * 8 - `_.curry` (bound)\n * 16 - `_.partial`\n * 32 - `_.partialRight`\n * @param {Array} [partialArgs] An array of arguments to prepend to those\n * provided to the new function.\n * @param {Array} [partialRightArgs] An array of arguments to append to those\n * provided to the new function.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new function.\n */\n function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\n var isBind = bitmask & 1,\n isBindKey = bitmask & 2,\n isCurry = bitmask & 4,\n isCurryBound = bitmask & 8,\n isPartial = bitmask & 16,\n isPartialRight = bitmask & 32;\n\n if (!isBindKey && !isFunction(func)) {\n throw new TypeError;\n }\n if (isPartial && !partialArgs.length) {\n bitmask &= ~16;\n isPartial = partialArgs = false;\n }\n if (isPartialRight && !partialRightArgs.length) {\n bitmask &= ~32;\n isPartialRight = partialRightArgs = false;\n }\n var bindData = func && func.__bindData__;\n if (bindData && bindData !== true) {\n // clone `bindData`\n bindData = slice(bindData);\n if (bindData[2]) {\n bindData[2] = slice(bindData[2]);\n }\n if (bindData[3]) {\n bindData[3] = slice(bindData[3]);\n }\n // set `thisBinding` is not previously bound\n if (isBind && !(bindData[1] & 1)) {\n bindData[4] = thisArg;\n }\n // set if previously bound but not currently (subsequent curried functions)\n if (!isBind && bindData[1] & 1) {\n bitmask |= 8;\n }\n // set curried arity if not yet set\n if (isCurry && !(bindData[1] & 4)) {\n bindData[5] = arity;\n }\n // append partial left arguments\n if (isPartial) {\n push.apply(bindData[2] || (bindData[2] = []), partialArgs);\n }\n // append partial right arguments\n if (isPartialRight) {\n unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\n }\n // merge flags\n bindData[1] |= bitmask;\n return createWrapper.apply(null, bindData);\n }\n // fast path for `_.bind`\n var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\n return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\n }\n\n /**\n * Used by `escape` to convert characters to HTML entities.\n *\n * @private\n * @param {string} match The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\n function escapeHtmlChar(match) {\n return htmlEscapes[match];\n }\n\n /**\n * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\n * customized, this method returns the custom method, otherwise it returns\n * the `baseIndexOf` function.\n *\n * @private\n * @returns {Function} Returns the \"indexOf\" function.\n */\n function getIndexOf() {\n var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\n return result;\n }\n\n /**\n * Checks if `value` is a native function.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\n */\n function isNative(value) {\n return typeof value == 'function' && reNative.test(value);\n }\n\n /**\n * Sets `this` binding data on a given function.\n *\n * @private\n * @param {Function} func The function to set data on.\n * @param {Array} value The data array to set.\n */\n var setBindData = !defineProperty ? noop : function(func, value) {\n descriptor.value = value;\n defineProperty(func, '__bindData__', descriptor);\n };\n\n /**\n * A fallback implementation of `isPlainObject` which checks if a given value\n * is an object created by the `Object` constructor, assuming objects created\n * by the `Object` constructor have no inherited enumerable properties and that\n * there are no `Object.prototype` extensions.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n */\n function shimIsPlainObject(value) {\n var ctor,\n result;\n\n // avoid non Object objects, `arguments` objects, and DOM elements\n if (!(value && toString.call(value) == objectClass) ||\n (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\n return false;\n }\n // In most environments an object's own properties are iterated before\n // its inherited properties. If the last iterated property is an object's\n // own property then there are no inherited enumerable properties.\n forIn(value, function(value, key) {\n result = key;\n });\n return typeof result == 'undefined' || hasOwnProperty.call(value, result);\n }\n\n /**\n * Used by `unescape` to convert HTML entities to characters.\n *\n * @private\n * @param {string} match The matched character to unescape.\n * @returns {string} Returns the unescaped character.\n */\n function unescapeHtmlChar(match) {\n return htmlUnescapes[match];\n }\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Checks if `value` is an `arguments` object.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\n * @example\n *\n * (function() { return _.isArguments(arguments); })(1, 2, 3);\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\n function isArguments(value) {\n return value && typeof value == 'object' && typeof value.length == 'number' &&\n toString.call(value) == argsClass || false;\n }\n\n /**\n * Checks if `value` is an array.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Objects\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\n * @example\n *\n * (function() { return _.isArray(arguments); })();\n * // => false\n *\n * _.isArray([1, 2, 3]);\n * // => true\n */\n var isArray = nativeIsArray || function(value) {\n return value && typeof value == 'object' && typeof value.length == 'number' &&\n toString.call(value) == arrayClass || false;\n };\n\n /**\n * A fallback implementation of `Object.keys` which produces an array of the\n * given object's own enumerable property names.\n *\n * @private\n * @type Function\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns an array of property names.\n */\n var shimKeys = function(object) {\n var index, iterable = object, result = [];\n if (!iterable) return result;\n if (!(objectTypes[typeof object])) return result;\n for (index in iterable) {\n if (hasOwnProperty.call(iterable, index)) {\n result.push(index);\n }\n }\n return result\n };\n\n /**\n * Creates an array composed of the own enumerable property names of an object.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns an array of property names.\n * @example\n *\n * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\n * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\n */\n var keys = !nativeKeys ? shimKeys : function(object) {\n if (!isObject(object)) {\n return [];\n }\n return nativeKeys(object);\n };\n\n /**\n * Used to convert characters to HTML entities:\n *\n * Though the `>` character is escaped for symmetry, characters like `>` and `/`\n * don't require escaping in HTML and have no special meaning unless they're part\n * of a tag or an unquoted attribute value.\n * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\n */\n var htmlEscapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n };\n\n /** Used to convert HTML entities to characters */\n var htmlUnescapes = invert(htmlEscapes);\n\n /** Used to match HTML entities and HTML characters */\n var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\n reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Assigns own enumerable properties of source object(s) to the destination\n * object. Subsequent sources will overwrite property assignments of previous\n * sources. If a callback is provided it will be executed to produce the\n * assigned values. The callback is bound to `thisArg` and invoked with two\n * arguments; (objectValue, sourceValue).\n *\n * @static\n * @memberOf _\n * @type Function\n * @alias extend\n * @category Objects\n * @param {Object} object The destination object.\n * @param {...Object} [source] The source objects.\n * @param {Function} [callback] The function to customize assigning values.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {Object} Returns the destination object.\n * @example\n *\n * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\n * // => { 'name': 'fred', 'employer': 'slate' }\n *\n * var defaults = _.partialRight(_.assign, function(a, b) {\n * return typeof a == 'undefined' ? b : a;\n * });\n *\n * var object = { 'name': 'barney' };\n * defaults(object, { 'name': 'fred', 'employer': 'slate' });\n * // => { 'name': 'barney', 'employer': 'slate' }\n */\n var assign = function(object, source, guard) {\n var index, iterable = object, result = iterable;\n if (!iterable) return result;\n var args = arguments,\n argsIndex = 0,\n argsLength = typeof guard == 'number' ? 2 : args.length;\n if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\n var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\n } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\n callback = args[--argsLength];\n }\n while (++argsIndex < argsLength) {\n iterable = args[argsIndex];\n if (iterable && objectTypes[typeof iterable]) {\n var ownIndex = -1,\n ownProps = objectTypes[typeof iterable] && keys(iterable),\n length = ownProps ? ownProps.length : 0;\n\n while (++ownIndex < length) {\n index = ownProps[ownIndex];\n result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\n }\n }\n }\n return result\n };\n\n /**\n * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\n * be cloned, otherwise they will be assigned by reference. If a callback\n * is provided it will be executed to produce the cloned values. If the\n * callback returns `undefined` cloning will be handled by the method instead.\n * The callback is bound to `thisArg` and invoked with one argument; (value).\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {*} value The value to clone.\n * @param {boolean} [isDeep=false] Specify a deep clone.\n * @param {Function} [callback] The function to customize cloning values.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {*} Returns the cloned value.\n * @example\n *\n * var characters = [\n * { 'name': 'barney', 'age': 36 },\n * { 'name': 'fred', 'age': 40 }\n * ];\n *\n * var shallow = _.clone(characters);\n * shallow[0] === characters[0];\n * // => true\n *\n * var deep = _.clone(characters, true);\n * deep[0] === characters[0];\n * // => false\n *\n * _.mixin({\n * 'clone': _.partialRight(_.clone, function(value) {\n * return _.isElement(value) ? value.cloneNode(false) : undefined;\n * })\n * });\n *\n * var clone = _.clone(document.body);\n * clone.childNodes.length;\n * // => 0\n */\n function clone(value, isDeep, callback, thisArg) {\n // allows working with \"Collections\" methods without using their `index`\n // and `collection` arguments for `isDeep` and `callback`\n if (typeof isDeep != 'boolean' && isDeep != null) {\n thisArg = callback;\n callback = isDeep;\n isDeep = false;\n }\n return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\n }\n\n /**\n * Creates a deep clone of `value`. If a callback is provided it will be\n * executed to produce the cloned values. If the callback returns `undefined`\n * cloning will be handled by the method instead. The callback is bound to\n * `thisArg` and invoked with one argument; (value).\n *\n * Note: This method is loosely based on the structured clone algorithm. Functions\n * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\n * objects created by constructors other than `Object` are cloned to plain `Object` objects.\n * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {*} value The value to deep clone.\n * @param {Function} [callback] The function to customize cloning values.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {*} Returns the deep cloned value.\n * @example\n *\n * var characters = [\n * { 'name': 'barney', 'age': 36 },\n * { 'name': 'fred', 'age': 40 }\n * ];\n *\n * var deep = _.cloneDeep(characters);\n * deep[0] === characters[0];\n * // => false\n *\n * var view = {\n * 'label': 'docs',\n * 'node': element\n * };\n *\n * var clone = _.cloneDeep(view, function(value) {\n * return _.isElement(value) ? value.cloneNode(true) : undefined;\n * });\n *\n * clone.node == view.node;\n * // => false\n */\n function cloneDeep(value, callback, thisArg) {\n return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\n }\n\n /**\n * Creates an object that inherits from the given `prototype` object. If a\n * `properties` object is provided its own enumerable properties are assigned\n * to the created object.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {Object} prototype The object to inherit from.\n * @param {Object} [properties] The properties to assign to the object.\n * @returns {Object} Returns the new object.\n * @example\n *\n * function Shape() {\n * this.x = 0;\n * this.y = 0;\n * }\n *\n * function Circle() {\n * Shape.call(this);\n * }\n *\n * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\n *\n * var circle = new Circle;\n * circle instanceof Circle;\n * // => true\n *\n * circle instanceof Shape;\n * // => true\n */\n function create(prototype, properties) {\n var result = baseCreate(prototype);\n return properties ? assign(result, properties) : result;\n }\n\n /**\n * Assigns own enumerable properties of source object(s) to the destination\n * object for all destination properties that resolve to `undefined`. Once a\n * property is set, additional defaults of the same property will be ignored.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Objects\n * @param {Object} object The destination object.\n * @param {...Object} [source] The source objects.\n * @param- {Object} [guard] Allows working with `_.reduce` without using its\n * `key` and `object` arguments as sources.\n * @returns {Object} Returns the destination object.\n * @example\n *\n * var object = { 'name': 'barney' };\n * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\n * // => { 'name': 'barney', 'employer': 'slate' }\n */\n var defaults = function(object, source, guard) {\n var index, iterable = object, result = iterable;\n if (!iterable) return result;\n var args = arguments,\n argsIndex = 0,\n argsLength = typeof guard == 'number' ? 2 : args.length;\n while (++argsIndex < argsLength) {\n iterable = args[argsIndex];\n if (iterable && objectTypes[typeof iterable]) {\n var ownIndex = -1,\n ownProps = objectTypes[typeof iterable] && keys(iterable),\n length = ownProps ? ownProps.length : 0;\n\n while (++ownIndex < length) {\n index = ownProps[ownIndex];\n if (typeof result[index] == 'undefined') result[index] = iterable[index];\n }\n }\n }\n return result\n };\n\n /**\n * This method is like `_.findIndex` except that it returns the key of the\n * first element that passes the callback check, instead of the element itself.\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {Object} object The object to search.\n * @param {Function|Object|string} [callback=identity] The function called per\n * iteration. If a property name or object is provided it will be used to\n * create a \"_.pluck\" or \"_.where\" style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {string|undefined} Returns the key of the found element, else `undefined`.\n * @example\n *\n * var characters = {\n * 'barney': { 'age': 36, 'blocked': false },\n * 'fred': { 'age': 40, 'blocked': true },\n * 'pebbles': { 'age': 1, 'blocked': false }\n * };\n *\n * _.findKey(characters, function(chr) {\n * return chr.age < 40;\n * });\n * // => 'barney' (property order is not guaranteed across environments)\n *\n * // using \"_.where\" callback shorthand\n * _.findKey(characters, { 'age': 1 });\n * // => 'pebbles'\n *\n * // using \"_.pluck\" callback shorthand\n * _.findKey(characters, 'blocked');\n * // => 'fred'\n */\n function findKey(object, callback, thisArg) {\n var result;\n callback = lodash.createCallback(callback, thisArg, 3);\n forOwn(object, function(value, key, object) {\n if (callback(value, key, object)) {\n result = key;\n return false;\n }\n });\n return result;\n }\n\n /**\n * This method is like `_.findKey` except that it iterates over elements\n * of a `collection` in the opposite order.\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {Object} object The object to search.\n * @param {Function|Object|string} [callback=identity] The function called per\n * iteration. If a property name or object is provided it will be used to\n * create a \"_.pluck\" or \"_.where\" style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {string|undefined} Returns the key of the found element, else `undefined`.\n * @example\n *\n * var characters = {\n * 'barney': { 'age': 36, 'blocked': true },\n * 'fred': { 'age': 40, 'blocked': false },\n * 'pebbles': { 'age': 1, 'blocked': true }\n * };\n *\n * _.findLastKey(characters, function(chr) {\n * return chr.age < 40;\n * });\n * // => returns `pebbles`, assuming `_.findKey` returns `barney`\n *\n * // using \"_.where\" callback shorthand\n * _.findLastKey(characters, { 'age': 40 });\n * // => 'fred'\n *\n * // using \"_.pluck\" callback shorthand\n * _.findLastKey(characters, 'blocked');\n * // => 'pebbles'\n */\n function findLastKey(object, callback, thisArg) {\n var result;\n callback = lodash.createCallback(callback, thisArg, 3);\n forOwnRight(object, function(value, key, object) {\n if (callback(value, key, object)) {\n result = key;\n return false;\n }\n });\n return result;\n }\n\n /**\n * Iterates over own and inherited enumerable properties of an object,\n * executing the callback for each property. The callback is bound to `thisArg`\n * and invoked with three arguments; (value, key, object). Callbacks may exit\n * iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Objects\n * @param {Object} object The object to iterate over.\n * @param {Function} [callback=identity] The function called per iteration.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function Shape() {\n * this.x = 0;\n * this.y = 0;\n * }\n *\n * Shape.prototype.move = function(x, y) {\n * this.x += x;\n * this.y += y;\n * };\n *\n * _.forIn(new Shape, function(value, key) {\n * console.log(key);\n * });\n * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\n */\n var forIn = function(collection, callback, thisArg) {\n var index, iterable = collection, result = iterable;\n if (!iterable) return result;\n if (!objectTypes[typeof iterable]) return result;\n callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n for (index in iterable) {\n if (callback(iterable[index], index, collection) === false) return result;\n }\n return result\n };\n\n /**\n * This method is like `_.forIn` except that it iterates over elements\n * of a `collection` in the opposite order.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {Object} object The object to iterate over.\n * @param {Function} [callback=identity] The function called per iteration.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function Shape() {\n * this.x = 0;\n * this.y = 0;\n * }\n *\n * Shape.prototype.move = function(x, y) {\n * this.x += x;\n * this.y += y;\n * };\n *\n * _.forInRight(new Shape, function(value, key) {\n * console.log(key);\n * });\n * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\n */\n function forInRight(object, callback, thisArg) {\n var pairs = [];\n\n forIn(object, function(value, key) {\n pairs.push(key, value);\n });\n\n var length = pairs.length;\n callback = baseCreateCallback(callback, thisArg, 3);\n while (length--) {\n if (callback(pairs[length--], pairs[length], object) === false) {\n break;\n }\n }\n return object;\n }\n\n /**\n * Iterates over own enumerable properties of an object, executing the callback\n * for each property. The callback is bound to `thisArg` and invoked with three\n * arguments; (value, key, object). Callbacks may exit iteration early by\n * explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Objects\n * @param {Object} object The object to iterate over.\n * @param {Function} [callback=identity] The function called per iteration.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {Object} Returns `object`.\n * @example\n *\n * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\n * console.log(key);\n * });\n * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\n */\n var forOwn = function(collection, callback, thisArg) {\n var index, iterable = collection, result = iterable;\n if (!iterable) return result;\n if (!objectTypes[typeof iterable]) return result;\n callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n var ownIndex = -1,\n ownProps = objectTypes[typeof iterable] && keys(iterable),\n length = ownProps ? ownProps.length : 0;\n\n while (++ownIndex < length) {\n index = ownProps[ownIndex];\n if (callback(iterable[index], index, collection) === false) return result;\n }\n return result\n };\n\n /**\n * This method is like `_.forOwn` except that it iterates over elements\n * of a `collection` in the opposite order.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {Object} object The object to iterate over.\n * @param {Function} [callback=identity] The function called per iteration.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {Object} Returns `object`.\n * @example\n *\n * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\n * console.log(key);\n * });\n * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\n */\n function forOwnRight(object, callback, thisArg) {\n var props = keys(object),\n length = props.length;\n\n callback = baseCreateCallback(callback, thisArg, 3);\n while (length--) {\n var key = props[length];\n if (callback(object[key], key, object) === false) {\n break;\n }\n }\n return object;\n }\n\n /**\n * Creates a sorted array of property names of all enumerable properties,\n * own and inherited, of `object` that have function values.\n *\n * @static\n * @memberOf _\n * @alias methods\n * @category Objects\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns an array of property names that have function values.\n * @example\n *\n * _.functions(_);\n * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\n */\n function functions(object) {\n var result = [];\n forIn(object, function(value, key) {\n if (isFunction(value)) {\n result.push(key);\n }\n });\n return result.sort();\n }\n\n /**\n * Checks if the specified property name exists as a direct property of `object`,\n * instead of an inherited property.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {Object} object The object to inspect.\n * @param {string} key The name of the property to check.\n * @returns {boolean} Returns `true` if key is a direct property, else `false`.\n * @example\n *\n * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\n * // => true\n */\n function has(object, key) {\n return object ? hasOwnProperty.call(object, key) : false;\n }\n\n /**\n * Creates an object composed of the inverted keys and values of the given object.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {Object} object The object to invert.\n * @returns {Object} Returns the created inverted object.\n * @example\n *\n * _.invert({ 'first': 'fred', 'second': 'barney' });\n * // => { 'fred': 'first', 'barney': 'second' }\n */\n function invert(object) {\n var index = -1,\n props = keys(object),\n length = props.length,\n result = {};\n\n while (++index < length) {\n var key = props[index];\n result[object[key]] = key;\n }\n return result;\n }\n\n /**\n * Checks if `value` is a boolean value.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\n * @example\n *\n * _.isBoolean(null);\n * // => false\n */\n function isBoolean(value) {\n return value === true || value === false ||\n value && typeof value == 'object' && toString.call(value) == boolClass || false;\n }\n\n /**\n * Checks if `value` is a date.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\n * @example\n *\n * _.isDate(new Date);\n * // => true\n */\n function isDate(value) {\n return value && typeof value == 'object' && toString.call(value) == dateClass || false;\n }\n\n /**\n * Checks if `value` is a DOM element.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\n * @example\n *\n * _.isElement(document.body);\n * // => true\n */\n function isElement(value) {\n return value && value.nodeType === 1 || false;\n }\n\n /**\n * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\n * length of `0` and objects with no own enumerable properties are considered\n * \"empty\".\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {Array|Object|string} value The value to inspect.\n * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({});\n * // => true\n *\n * _.isEmpty('');\n * // => true\n */\n function isEmpty(value) {\n var result = true;\n if (!value) {\n return result;\n }\n var className = toString.call(value),\n length = value.length;\n\n if ((className == arrayClass || className == stringClass || className == argsClass ) ||\n (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\n return !length;\n }\n forOwn(value, function() {\n return (result = false);\n });\n return result;\n }\n\n /**\n * Performs a deep comparison between two values to determine if they are\n * equivalent to each other. If a callback is provided it will be executed\n * to compare values. If the callback returns `undefined` comparisons will\n * be handled by the method instead. The callback is bound to `thisArg` and\n * invoked with two arguments; (a, b).\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {*} a The value to compare.\n * @param {*} b The other value to compare.\n * @param {Function} [callback] The function to customize comparing values.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'name': 'fred' };\n * var copy = { 'name': 'fred' };\n *\n * object == copy;\n * // => false\n *\n * _.isEqual(object, copy);\n * // => true\n *\n * var words = ['hello', 'goodbye'];\n * var otherWords = ['hi', 'goodbye'];\n *\n * _.isEqual(words, otherWords, function(a, b) {\n * var reGreet = /^(?:hello|hi)$/i,\n * aGreet = _.isString(a) && reGreet.test(a),\n * bGreet = _.isString(b) && reGreet.test(b);\n *\n * return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\n * });\n * // => true\n */\n function isEqual(a, b, callback, thisArg) {\n return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\n }\n\n /**\n * Checks if `value` is, or can be coerced to, a finite number.\n *\n * Note: This is not the same as native `isFinite` which will return true for\n * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\n * @example\n *\n * _.isFinite(-101);\n * // => true\n *\n * _.isFinite('10');\n * // => true\n *\n * _.isFinite(true);\n * // => false\n *\n * _.isFinite('');\n * // => false\n *\n * _.isFinite(Infinity);\n * // => false\n */\n function isFinite(value) {\n return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\n }\n\n /**\n * Checks if `value` is a function.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n */\n function isFunction(value) {\n return typeof value == 'function';\n }\n\n /**\n * Checks if `value` is the language type of Object.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(1);\n * // => false\n */\n function isObject(value) {\n // check if the value is the ECMAScript language type of Object\n // http://es5.github.io/#x8\n // and avoid a V8 bug\n // http://code.google.com/p/v8/issues/detail?id=2291\n return !!(value && objectTypes[typeof value]);\n }\n\n /**\n * Checks if `value` is `NaN`.\n *\n * Note: This is not the same as native `isNaN` which will return `true` for\n * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\n * @example\n *\n * _.isNaN(NaN);\n * // => true\n *\n * _.isNaN(new Number(NaN));\n * // => true\n *\n * isNaN(undefined);\n * // => true\n *\n * _.isNaN(undefined);\n * // => false\n */\n function isNaN(value) {\n // `NaN` as a primitive is the only value that is not equal to itself\n // (perform the [[Class]] check first to avoid errors with some host objects in IE)\n return isNumber(value) && value != +value;\n }\n\n /**\n * Checks if `value` is `null`.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\n * @example\n *\n * _.isNull(null);\n * // => true\n *\n * _.isNull(undefined);\n * // => false\n */\n function isNull(value) {\n return value === null;\n }\n\n /**\n * Checks if `value` is a number.\n *\n * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\n * @example\n *\n * _.isNumber(8.4 * 5);\n * // => true\n */\n function isNumber(value) {\n return typeof value == 'number' ||\n value && typeof value == 'object' && toString.call(value) == numberClass || false;\n }\n\n /**\n * Checks if `value` is an object created by the `Object` constructor.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Shape() {\n * this.x = 0;\n * this.y = 0;\n * }\n *\n * _.isPlainObject(new Shape);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n */\n var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\n if (!(value && toString.call(value) == objectClass)) {\n return false;\n }\n var valueOf = value.valueOf,\n objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\n\n return objProto\n ? (value == objProto || getPrototypeOf(value) == objProto)\n : shimIsPlainObject(value);\n };\n\n /**\n * Checks if `value` is a regular expression.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\n * @example\n *\n * _.isRegExp(/fred/);\n * // => true\n */\n function isRegExp(value) {\n return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\n }\n\n /**\n * Checks if `value` is a string.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\n * @example\n *\n * _.isString('fred');\n * // => true\n */\n function isString(value) {\n return typeof value == 'string' ||\n value && typeof value == 'object' && toString.call(value) == stringClass || false;\n }\n\n /**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n */\n function isUndefined(value) {\n return typeof value == 'undefined';\n }\n\n /**\n * Creates an object with the same keys as `object` and values generated by\n * running each own enumerable property of `object` through the callback.\n * The callback is bound to `thisArg` and invoked with three arguments;\n * (value, key, object).\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {Object} object The object to iterate over.\n * @param {Function|Object|string} [callback=identity] The function called\n * per iteration. If a property name or object is provided it will be used\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {Array} Returns a new object with values of the results of each `callback` execution.\n * @example\n *\n * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\n * // => { 'a': 3, 'b': 6, 'c': 9 }\n *\n * var characters = {\n * 'fred': { 'name': 'fred', 'age': 40 },\n * 'pebbles': { 'name': 'pebbles', 'age': 1 }\n * };\n *\n * // using \"_.pluck\" callback shorthand\n * _.mapValues(characters, 'age');\n * // => { 'fred': 40, 'pebbles': 1 }\n */\n function mapValues(object, callback, thisArg) {\n var result = {};\n callback = lodash.createCallback(callback, thisArg, 3);\n\n forOwn(object, function(value, key, object) {\n result[key] = callback(value, key, object);\n });\n return result;\n }\n\n /**\n * Recursively merges own enumerable properties of the source object(s), that\n * don't resolve to `undefined` into the destination object. Subsequent sources\n * will overwrite property assignments of previous sources. If a callback is\n * provided it will be executed to produce the merged values of the destination\n * and source properties. If the callback returns `undefined` merging will\n * be handled by the method instead. The callback is bound to `thisArg` and\n * invoked with two arguments; (objectValue, sourceValue).\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {Object} object The destination object.\n * @param {...Object} [source] The source objects.\n * @param {Function} [callback] The function to customize merging properties.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {Object} Returns the destination object.\n * @example\n *\n * var names = {\n * 'characters': [\n * { 'name': 'barney' },\n * { 'name': 'fred' }\n * ]\n * };\n *\n * var ages = {\n * 'characters': [\n * { 'age': 36 },\n * { 'age': 40 }\n * ]\n * };\n *\n * _.merge(names, ages);\n * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\n *\n * var food = {\n * 'fruits': ['apple'],\n * 'vegetables': ['beet']\n * };\n *\n * var otherFood = {\n * 'fruits': ['banana'],\n * 'vegetables': ['carrot']\n * };\n *\n * _.merge(food, otherFood, function(a, b) {\n * return _.isArray(a) ? a.concat(b) : undefined;\n * });\n * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\n */\n function merge(object) {\n var args = arguments,\n length = 2;\n\n if (!isObject(object)) {\n return object;\n }\n // allows working with `_.reduce` and `_.reduceRight` without using\n // their `index` and `collection` arguments\n if (typeof args[2] != 'number') {\n length = args.length;\n }\n if (length > 3 && typeof args[length - 2] == 'function') {\n var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\n } else if (length > 2 && typeof args[length - 1] == 'function') {\n callback = args[--length];\n }\n var sources = slice(arguments, 1, length),\n index = -1,\n stackA = getArray(),\n stackB = getArray();\n\n while (++index < length) {\n baseMerge(object, sources[index], callback, stackA, stackB);\n }\n releaseArray(stackA);\n releaseArray(stackB);\n return object;\n }\n\n /**\n * Creates a shallow clone of `object` excluding the specified properties.\n * Property names may be specified as individual arguments or as arrays of\n * property names. If a callback is provided it will be executed for each\n * property of `object` omitting the properties the callback returns truey\n * for. The callback is bound to `thisArg` and invoked with three arguments;\n * (value, key, object).\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {Object} object The source object.\n * @param {Function|...string|string[]} [callback] The properties to omit or the\n * function called per iteration.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {Object} Returns an object without the omitted properties.\n * @example\n *\n * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\n * // => { 'name': 'fred' }\n *\n * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\n * return typeof value == 'number';\n * });\n * // => { 'name': 'fred' }\n */\n function omit(object, callback, thisArg) {\n var result = {};\n if (typeof callback != 'function') {\n var props = [];\n forIn(object, function(value, key) {\n props.push(key);\n });\n props = baseDifference(props, baseFlatten(arguments, true, false, 1));\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n result[key] = object[key];\n }\n } else {\n callback = lodash.createCallback(callback, thisArg, 3);\n forIn(object, function(value, key, object) {\n if (!callback(value, key, object)) {\n result[key] = value;\n }\n });\n }\n return result;\n }\n\n /**\n * Creates a two dimensional array of an object's key-value pairs,\n * i.e. `[[key1, value1], [key2, value2]]`.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns new array of key-value pairs.\n * @example\n *\n * _.pairs({ 'barney': 36, 'fred': 40 });\n * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\n */\n function pairs(object) {\n var index = -1,\n props = keys(object),\n length = props.length,\n result = Array(length);\n\n while (++index < length) {\n var key = props[index];\n result[index] = [key, object[key]];\n }\n return result;\n }\n\n /**\n * Creates a shallow clone of `object` composed of the specified properties.\n * Property names may be specified as individual arguments or as arrays of\n * property names. If a callback is provided it will be executed for each\n * property of `object` picking the properties the callback returns truey\n * for. The callback is bound to `thisArg` and invoked with three arguments;\n * (value, key, object).\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {Object} object The source object.\n * @param {Function|...string|string[]} [callback] The function called per\n * iteration or property names to pick, specified as individual property\n * names or arrays of property names.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {Object} Returns an object composed of the picked properties.\n * @example\n *\n * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\n * // => { 'name': 'fred' }\n *\n * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\n * return key.charAt(0) != '_';\n * });\n * // => { 'name': 'fred' }\n */\n function pick(object, callback, thisArg) {\n var result = {};\n if (typeof callback != 'function') {\n var index = -1,\n props = baseFlatten(arguments, true, false, 1),\n length = isObject(object) ? props.length : 0;\n\n while (++index < length) {\n var key = props[index];\n if (key in object) {\n result[key] = object[key];\n }\n }\n } else {\n callback = lodash.createCallback(callback, thisArg, 3);\n forIn(object, function(value, key, object) {\n if (callback(value, key, object)) {\n result[key] = value;\n }\n });\n }\n return result;\n }\n\n /**\n * An alternative to `_.reduce` this method transforms `object` to a new\n * `accumulator` object which is the result of running each of its own\n * enumerable properties through a callback, with each callback execution\n * potentially mutating the `accumulator` object. The callback is bound to\n * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\n * Callbacks may exit iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {Array|Object} object The object to iterate over.\n * @param {Function} [callback=identity] The function called per iteration.\n * @param {*} [accumulator] The custom accumulator value.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\n * num *= num;\n * if (num % 2) {\n * return result.push(num) < 3;\n * }\n * });\n * // => [1, 9, 25]\n *\n * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\n * result[key] = num * 3;\n * });\n * // => { 'a': 3, 'b': 6, 'c': 9 }\n */\n function transform(object, callback, accumulator, thisArg) {\n var isArr = isArray(object);\n if (accumulator == null) {\n if (isArr) {\n accumulator = [];\n } else {\n var ctor = object && object.constructor,\n proto = ctor && ctor.prototype;\n\n accumulator = baseCreate(proto);\n }\n }\n if (callback) {\n callback = lodash.createCallback(callback, thisArg, 4);\n (isArr ? forEach : forOwn)(object, function(value, index, object) {\n return callback(accumulator, value, index, object);\n });\n }\n return accumulator;\n }\n\n /**\n * Creates an array composed of the own enumerable property values of `object`.\n *\n * @static\n * @memberOf _\n * @category Objects\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns an array of property values.\n * @example\n *\n * _.values({ 'one': 1, 'two': 2, 'three': 3 });\n * // => [1, 2, 3] (property order is not guaranteed across environments)\n */\n function values(object) {\n var index = -1,\n props = keys(object),\n length = props.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = object[props[index]];\n }\n return result;\n }\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Creates an array of elements from the specified indexes, or keys, of the\n * `collection`. Indexes may be specified as individual arguments or as arrays\n * of indexes.\n *\n * @static\n * @memberOf _\n * @category Collections\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\n * to retrieve, specified as individual indexes or arrays of indexes.\n * @returns {Array} Returns a new array of elements corresponding to the\n * provided indexes.\n * @example\n *\n * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\n * // => ['a', 'c', 'e']\n *\n * _.at(['fred', 'barney', 'pebbles'], 0, 2);\n * // => ['fred', 'pebbles']\n */\n function at(collection) {\n var args = arguments,\n index = -1,\n props = baseFlatten(args, true, false, 1),\n length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\n result = Array(length);\n\n while(++index < length) {\n result[index] = collection[props[index]];\n }\n return result;\n }\n\n /**\n * Checks if a given value is present in a collection using strict equality\n * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\n * offset from the end of the collection.\n *\n * @static\n * @memberOf _\n * @alias include\n * @category Collections\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {*} target The value to check for.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\n * @example\n *\n * _.contains([1, 2, 3], 1);\n * // => true\n *\n * _.contains([1, 2, 3], 1, 2);\n * // => false\n *\n * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\n * // => true\n *\n * _.contains('pebbles', 'eb');\n * // => true\n */\n function contains(collection, target, fromIndex) {\n var index = -1,\n indexOf = getIndexOf(),\n length = collection ? collection.length : 0,\n result = false;\n\n fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\n if (isArray(collection)) {\n result = indexOf(collection, target, fromIndex) > -1;\n } else if (typeof length == 'number') {\n result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\n } else {\n forOwn(collection, function(value) {\n if (++index >= fromIndex) {\n return !(result = value === target);\n }\n });\n }\n return result;\n }\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` through the callback. The corresponding value\n * of each key is the number of times the key was returned by the callback.\n * The callback is bound to `thisArg` and invoked with three arguments;\n * (value, index|key, collection).\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @category Collections\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [callback=identity] The function called\n * per iteration. If a property name or object is provided it will be used\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\n * // => { '4': 1, '6': 2 }\n *\n * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\n * // => { '4': 1, '6': 2 }\n *\n * _.countBy(['one', 'two', 'three'], 'length');\n * // => { '3': 2, '5': 1 }\n */\n var countBy = createAggregator(function(result, value, key) {\n (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\n });\n\n /**\n * Checks if the given callback returns truey value for **all** elements of\n * a collection. The callback is bound to `thisArg` and invoked with three\n * arguments; (value, index|key, collection).\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @alias all\n * @category Collections\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [callback=identity] The function called\n * per iteration. If a property name or object is provided it will be used\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {boolean} Returns `true` if all elements passed the callback check,\n * else `false`.\n * @example\n *\n * _.every([true, 1, null, 'yes']);\n * // => false\n *\n * var characters = [\n * { 'name': 'barney', 'age': 36 },\n * { 'name': 'fred', 'age': 40 }\n * ];\n *\n * // using \"_.pluck\" callback shorthand\n * _.every(characters, 'age');\n * // => true\n *\n * // using \"_.where\" callback shorthand\n * _.every(characters, { 'age': 36 });\n * // => false\n */\n function every(collection, callback, thisArg) {\n var result = true;\n callback = lodash.createCallback(callback, thisArg, 3);\n\n var index = -1,\n length = collection ? collection.length : 0;\n\n if (typeof length == 'number') {\n while (++index < length) {\n if (!(result = !!callback(collection[index], index, collection))) {\n break;\n }\n }\n } else {\n forOwn(collection, function(value, index, collection) {\n return (result = !!callback(value, index, collection));\n });\n }\n return result;\n }\n\n /**\n * Iterates over elements of a collection, returning an array of all elements\n * the callback returns truey for. The callback is bound to `thisArg` and\n * invoked with three arguments; (value, index|key, collection).\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @alias select\n * @category Collections\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [callback=identity] The function called\n * per iteration. If a property name or object is provided it will be used\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {Array} Returns a new array of elements that passed the callback check.\n * @example\n *\n * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\n * // => [2, 4, 6]\n *\n * var characters = [\n * { 'name': 'barney', 'age': 36, 'blocked': false },\n * { 'name': 'fred', 'age': 40, 'blocked': true }\n * ];\n *\n * // using \"_.pluck\" callback shorthand\n * _.filter(characters, 'blocked');\n * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\n *\n * // using \"_.where\" callback shorthand\n * _.filter(characters, { 'age': 36 });\n * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\n */\n function filter(collection, callback, thisArg) {\n var result = [];\n callback = lodash.createCallback(callback, thisArg, 3);\n\n var index = -1,\n length = collection ? collection.length : 0;\n\n if (typeof length == 'number') {\n while (++index < length) {\n var value = collection[index];\n if (callback(value, index, collection)) {\n result.push(value);\n }\n }\n } else {\n forOwn(collection, function(value, index, collection) {\n if (callback(value, index, collection)) {\n result.push(value);\n }\n });\n }\n return result;\n }\n\n /**\n * Iterates over elements of a collection, returning the first element that\n * the callback returns truey for. The callback is bound to `thisArg` and\n * invoked with three arguments; (value, index|key, collection).\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @alias detect, findWhere\n * @category Collections\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [callback=identity] The function called\n * per iteration. If a property name or object is provided it will be used\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {*} Returns the found element, else `undefined`.\n * @example\n *\n * var characters = [\n * { 'name': 'barney', 'age': 36, 'blocked': false },\n * { 'name': 'fred', 'age': 40, 'blocked': true },\n * { 'name': 'pebbles', 'age': 1, 'blocked': false }\n * ];\n *\n * _.find(characters, function(chr) {\n * return chr.age < 40;\n * });\n * // => { 'name': 'barney', 'age': 36, 'blocked': false }\n *\n * // using \"_.where\" callback shorthand\n * _.find(characters, { 'age': 1 });\n * // => { 'name': 'pebbles', 'age': 1, 'blocked': false }\n *\n * // using \"_.pluck\" callback shorthand\n * _.find(characters, 'blocked');\n * // => { 'name': 'fred', 'age': 40, 'blocked': true }\n */\n function find(collection, callback, thisArg) {\n callback = lodash.createCallback(callback, thisArg, 3);\n\n var index = -1,\n length = collection ? collection.length : 0;\n\n if (typeof length == 'number') {\n while (++index < length) {\n var value = collection[index];\n if (callback(value, index, collection)) {\n return value;\n }\n }\n } else {\n var result;\n forOwn(collection, function(value, index, collection) {\n if (callback(value, index, collection)) {\n result = value;\n return false;\n }\n });\n return result;\n }\n }\n\n /**\n * This method is like `_.find` except that it iterates over elements\n * of a `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @category Collections\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [callback=identity] The function called\n * per iteration. If a property name or object is provided it will be used\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {*} Returns the found element, else `undefined`.\n * @example\n *\n * _.findLast([1, 2, 3, 4], function(num) {\n * return num % 2 == 1;\n * });\n * // => 3\n */\n function findLast(collection, callback, thisArg) {\n var result;\n callback = lodash.createCallback(callback, thisArg, 3);\n forEachRight(collection, function(value, index, collection) {\n if (callback(value, index, collection)) {\n result = value;\n return false;\n }\n });\n return result;\n }\n\n /**\n * Iterates over elements of a collection, executing the callback for each\n * element. The callback is bound to `thisArg` and invoked with three arguments;\n * (value, index|key, collection). Callbacks may exit iteration early by\n * explicitly returning `false`.\n *\n * Note: As with other \"Collections\" methods, objects with a `length` property\n * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\n * may be used for object iteration.\n *\n * @static\n * @memberOf _\n * @alias each\n * @category Collections\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} [callback=identity] The function called per iteration.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {Array|Object|string} Returns `collection`.\n * @example\n *\n * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\n * // => logs each number and returns '1,2,3'\n *\n * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\n * // => logs each number and returns the object (property order is not guaranteed across environments)\n */\n function forEach(collection, callback, thisArg) {\n var index = -1,\n length = collection ? collection.length : 0;\n\n callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n if (typeof length == 'number') {\n while (++index < length) {\n if (callback(collection[index], index, collection) === false) {\n break;\n }\n }\n } else {\n forOwn(collection, callback);\n }\n return collection;\n }\n\n /**\n * This method is like `_.forEach` except that it iterates over elements\n * of a `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @alias eachRight\n * @category Collections\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} [callback=identity] The function called per iteration.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {Array|Object|string} Returns `collection`.\n * @example\n *\n * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\n * // => logs each number from right to left and returns '3,2,1'\n */\n function forEachRight(collection, callback, thisArg) {\n var length = collection ? collection.length : 0;\n callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n if (typeof length == 'number') {\n while (length--) {\n if (callback(collection[length], length, collection) === false) {\n break;\n }\n }\n } else {\n var props = keys(collection);\n length = props.length;\n forOwn(collection, function(value, key, collection) {\n key = props ? props[--length] : --length;\n return callback(collection[key], key, collection);\n });\n }\n return collection;\n }\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of a collection through the callback. The corresponding value\n * of each key is an array of the elements responsible for generating the key.\n * The callback is bound to `thisArg` and invoked with three arguments;\n * (value, index|key, collection).\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`\n *\n * @static\n * @memberOf _\n * @category Collections\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [callback=identity] The function called\n * per iteration. If a property name or object is provided it will be used\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\n * // => { '4': [4.2], '6': [6.1, 6.4] }\n *\n * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\n * // => { '4': [4.2], '6': [6.1, 6.4] }\n *\n * // using \"_.pluck\" callback shorthand\n * _.groupBy(['one', 'two', 'three'], 'length');\n * // => { '3': ['one', 'two'], '5': ['three'] }\n */\n var groupBy = createAggregator(function(result, value, key) {\n (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\n });\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of the collection through the given callback. The corresponding\n * value of each key is the last element responsible for generating the key.\n * The callback is bound to `thisArg` and invoked with three arguments;\n * (value, index|key, collection).\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @category Collections\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [callback=identity] The function called\n * per iteration. If a property name or object is provided it will be used\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * var keys = [\n * { 'dir': 'left', 'code': 97 },\n * { 'dir': 'right', 'code': 100 }\n * ];\n *\n * _.indexBy(keys, 'dir');\n * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n *\n * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n *\n * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n */\n var indexBy = createAggregator(function(result, value, key) {\n result[key] = value;\n });\n\n /**\n * Invokes the method named by `methodName` on each element in the `collection`\n * returning an array of the results of each invoked method. Additional arguments\n * will be provided to each invoked method. If `methodName` is a function it\n * will be invoked for, and `this` bound to, each element in the `collection`.\n *\n * @static\n * @memberOf _\n * @category Collections\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|string} methodName The name of the method to invoke or\n * the function invoked per iteration.\n * @param {...*} [arg] Arguments to invoke the method with.\n * @returns {Array} Returns a new array of the results of each invoked method.\n * @example\n *\n * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\n * // => [[1, 5, 7], [1, 2, 3]]\n *\n * _.invoke([123, 456], String.prototype.split, '');\n * // => [['1', '2', '3'], ['4', '5', '6']]\n */\n function invoke(collection, methodName) {\n var args = slice(arguments, 2),\n index = -1,\n isFunc = typeof methodName == 'function',\n length = collection ? collection.length : 0,\n result = Array(typeof length == 'number' ? length : 0);\n\n forEach(collection, function(value) {\n result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\n });\n return result;\n }\n\n /**\n * Creates an array of values by running each element in the collection\n * through the callback. The callback is bound to `thisArg` and invoked with\n * three arguments; (value, index|key, collection).\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @alias collect\n * @category Collections\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [callback=identity] The function called\n * per iteration. If a property name or object is provided it will be used\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {Array} Returns a new array of the results of each `callback` execution.\n * @example\n *\n * _.map([1, 2, 3], function(num) { return num * 3; });\n * // => [3, 6, 9]\n *\n * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\n * // => [3, 6, 9] (property order is not guaranteed across environments)\n *\n * var characters = [\n * { 'name': 'barney', 'age': 36 },\n * { 'name': 'fred', 'age': 40 }\n * ];\n *\n * // using \"_.pluck\" callback shorthand\n * _.map(characters, 'name');\n * // => ['barney', 'fred']\n */\n function map(collection, callback, thisArg) {\n var index = -1,\n length = collection ? collection.length : 0;\n\n callback = lodash.createCallback(callback, thisArg, 3);\n if (typeof length == 'number') {\n var result = Array(length);\n while (++index < length) {\n result[index] = callback(collection[index], index, collection);\n }\n } else {\n result = [];\n forOwn(collection, function(value, key, collection) {\n result[++index] = callback(value, key, collection);\n });\n }\n return result;\n }\n\n /**\n * Retrieves the maximum value of a collection. If the collection is empty or\n * falsey `-Infinity` is returned. If a callback is provided it will be executed\n * for each value in the collection to generate the criterion by which the value\n * is ranked. The callback is bound to `thisArg` and invoked with three\n * arguments; (value, index, collection).\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @category Collections\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [callback=identity] The function called\n * per iteration. If a property name or object is provided it will be used\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {*} Returns the maximum value.\n * @example\n *\n * _.max([4, 2, 8, 6]);\n * // => 8\n *\n * var characters = [\n * { 'name': 'barney', 'age': 36 },\n * { 'name': 'fred', 'age': 40 }\n * ];\n *\n * _.max(characters, function(chr) { return chr.age; });\n * // => { 'name': 'fred', 'age': 40 };\n *\n * // using \"_.pluck\" callback shorthand\n * _.max(characters, 'age');\n * // => { 'name': 'fred', 'age': 40 };\n */\n function max(collection, callback, thisArg) {\n var computed = -Infinity,\n result = computed;\n\n // allows working with functions like `_.map` without using\n // their `index` argument as a callback\n if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\n callback = null;\n }\n if (callback == null && isArray(collection)) {\n var index = -1,\n length = collection.length;\n\n while (++index < length) {\n var value = collection[index];\n if (value > result) {\n result = value;\n }\n }\n } else {\n callback = (callback == null && isString(collection))\n ? charAtCallback\n : lodash.createCallback(callback, thisArg, 3);\n\n forEach(collection, function(value, index, collection) {\n var current = callback(value, index, collection);\n if (current > computed) {\n computed = current;\n result = value;\n }\n });\n }\n return result;\n }\n\n /**\n * Retrieves the minimum value of a collection. If the collection is empty or\n * falsey `Infinity` is returned. If a callback is provided it will be executed\n * for each value in the collection to generate the criterion by which the value\n * is ranked. The callback is bound to `thisArg` and invoked with three\n * arguments; (value, index, collection).\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @category Collections\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [callback=identity] The function called\n * per iteration. If a property name or object is provided it will be used\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * _.min([4, 2, 8, 6]);\n * // => 2\n *\n * var characters = [\n * { 'name': 'barney', 'age': 36 },\n * { 'name': 'fred', 'age': 40 }\n * ];\n *\n * _.min(characters, function(chr) { return chr.age; });\n * // => { 'name': 'barney', 'age': 36 };\n *\n * // using \"_.pluck\" callback shorthand\n * _.min(characters, 'age');\n * // => { 'name': 'barney', 'age': 36 };\n */\n function min(collection, callback, thisArg) {\n var computed = Infinity,\n result = computed;\n\n // allows working with functions like `_.map` without using\n // their `index` argument as a callback\n if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\n callback = null;\n }\n if (callback == null && isArray(collection)) {\n var index = -1,\n length = collection.length;\n\n while (++index < length) {\n var value = collection[index];\n if (value < result) {\n result = value;\n }\n }\n } else {\n callback = (callback == null && isString(collection))\n ? charAtCallback\n : lodash.createCallback(callback, thisArg, 3);\n\n forEach(collection, function(value, index, collection) {\n var current = callback(value, index, collection);\n if (current < computed) {\n computed = current;\n result = value;\n }\n });\n }\n return result;\n }\n\n /**\n * Retrieves the value of a specified property from all elements in the collection.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Collections\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {string} property The name of the property to pluck.\n * @returns {Array} Returns a new array of property values.\n * @example\n *\n * var characters = [\n * { 'name': 'barney', 'age': 36 },\n * { 'name': 'fred', 'age': 40 }\n * ];\n *\n * _.pluck(characters, 'name');\n * // => ['barney', 'fred']\n */\n var pluck = map;\n\n /**\n * Reduces a collection to a value which is the accumulated result of running\n * each element in the collection through the callback, where each successive\n * callback execution consumes the return value of the previous execution. If\n * `accumulator` is not provided the first element of the collection will be\n * used as the initial `accumulator` value. The callback is bound to `thisArg`\n * and invoked with four arguments; (accumulator, value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @alias foldl, inject\n * @category Collections\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} [callback=identity] The function called per iteration.\n * @param {*} [accumulator] Initial value of the accumulator.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * var sum = _.reduce([1, 2, 3], function(sum, num) {\n * return sum + num;\n * });\n * // => 6\n *\n * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\n * result[key] = num * 3;\n * return result;\n * }, {});\n * // => { 'a': 3, 'b': 6, 'c': 9 }\n */\n function reduce(collection, callback, accumulator, thisArg) {\n if (!collection) return accumulator;\n var noaccum = arguments.length < 3;\n callback = lodash.createCallback(callback, thisArg, 4);\n\n var index = -1,\n length = collection.length;\n\n if (typeof length == 'number') {\n if (noaccum) {\n accumulator = collection[++index];\n }\n while (++index < length) {\n accumulator = callback(accumulator, collection[index], index, collection);\n }\n } else {\n forOwn(collection, function(value, index, collection) {\n accumulator = noaccum\n ? (noaccum = false, value)\n : callback(accumulator, value, index, collection)\n });\n }\n return accumulator;\n }\n\n /**\n * This method is like `_.reduce` except that it iterates over elements\n * of a `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @alias foldr\n * @category Collections\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} [callback=identity] The function called per iteration.\n * @param {*} [accumulator] Initial value of the accumulator.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * var list = [[0, 1], [2, 3], [4, 5]];\n * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\n * // => [4, 5, 2, 3, 0, 1]\n */\n function reduceRight(collection, callback, accumulator, thisArg) {\n var noaccum = arguments.length < 3;\n callback = lodash.createCallback(callback, thisArg, 4);\n forEachRight(collection, function(value, index, collection) {\n accumulator = noaccum\n ? (noaccum = false, value)\n : callback(accumulator, value, index, collection);\n });\n return accumulator;\n }\n\n /**\n * The opposite of `_.filter` this method returns the elements of a\n * collection that the callback does **not** return truey for.\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @category Collections\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [callback=identity] The function called\n * per iteration. If a property name or object is provided it will be used\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {Array} Returns a new array of elements that failed the callback check.\n * @example\n *\n * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\n * // => [1, 3, 5]\n *\n * var characters = [\n * { 'name': 'barney', 'age': 36, 'blocked': false },\n * { 'name': 'fred', 'age': 40, 'blocked': true }\n * ];\n *\n * // using \"_.pluck\" callback shorthand\n * _.reject(characters, 'blocked');\n * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\n *\n * // using \"_.where\" callback shorthand\n * _.reject(characters, { 'age': 36 });\n * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\n */\n function reject(collection, callback, thisArg) {\n callback = lodash.createCallback(callback, thisArg, 3);\n return filter(collection, function(value, index, collection) {\n return !callback(value, index, collection);\n });\n }\n\n /**\n * Retrieves a random element or `n` random elements from a collection.\n *\n * @static\n * @memberOf _\n * @category Collections\n * @param {Array|Object|string} collection The collection to sample.\n * @param {number} [n] The number of elements to sample.\n * @param- {Object} [guard] Allows working with functions like `_.map`\n * without using their `index` arguments as `n`.\n * @returns {Array} Returns the random sample(s) of `collection`.\n * @example\n *\n * _.sample([1, 2, 3, 4]);\n * // => 2\n *\n * _.sample([1, 2, 3, 4], 2);\n * // => [3, 1]\n */\n function sample(collection, n, guard) {\n if (collection && typeof collection.length != 'number') {\n collection = values(collection);\n }\n if (n == null || guard) {\n return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\n }\n var result = shuffle(collection);\n result.length = nativeMin(nativeMax(0, n), result.length);\n return result;\n }\n\n /**\n * Creates an array of shuffled values, using a version of the Fisher-Yates\n * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\n *\n * @static\n * @memberOf _\n * @category Collections\n * @param {Array|Object|string} collection The collection to shuffle.\n * @returns {Array} Returns a new shuffled collection.\n * @example\n *\n * _.shuffle([1, 2, 3, 4, 5, 6]);\n * // => [4, 1, 6, 3, 5, 2]\n */\n function shuffle(collection) {\n var index = -1,\n length = collection ? collection.length : 0,\n result = Array(typeof length == 'number' ? length : 0);\n\n forEach(collection, function(value) {\n var rand = baseRandom(0, ++index);\n result[index] = result[rand];\n result[rand] = value;\n });\n return result;\n }\n\n /**\n * Gets the size of the `collection` by returning `collection.length` for arrays\n * and array-like objects or the number of own enumerable properties for objects.\n *\n * @static\n * @memberOf _\n * @category Collections\n * @param {Array|Object|string} collection The collection to inspect.\n * @returns {number} Returns `collection.length` or number of own enumerable properties.\n * @example\n *\n * _.size([1, 2]);\n * // => 2\n *\n * _.size({ 'one': 1, 'two': 2, 'three': 3 });\n * // => 3\n *\n * _.size('pebbles');\n * // => 7\n */\n function size(collection) {\n var length = collection ? collection.length : 0;\n return typeof length == 'number' ? length : keys(collection).length;\n }\n\n /**\n * Checks if the callback returns a truey value for **any** element of a\n * collection. The function returns as soon as it finds a passing value and\n * does not iterate over the entire collection. The callback is bound to\n * `thisArg` and invoked with three arguments; (value, index|key, collection).\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @alias any\n * @category Collections\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [callback=identity] The function called\n * per iteration. If a property name or object is provided it will be used\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {boolean} Returns `true` if any element passed the callback check,\n * else `false`.\n * @example\n *\n * _.some([null, 0, 'yes', false], Boolean);\n * // => true\n *\n * var characters = [\n * { 'name': 'barney', 'age': 36, 'blocked': false },\n * { 'name': 'fred', 'age': 40, 'blocked': true }\n * ];\n *\n * // using \"_.pluck\" callback shorthand\n * _.some(characters, 'blocked');\n * // => true\n *\n * // using \"_.where\" callback shorthand\n * _.some(characters, { 'age': 1 });\n * // => false\n */\n function some(collection, callback, thisArg) {\n var result;\n callback = lodash.createCallback(callback, thisArg, 3);\n\n var index = -1,\n length = collection ? collection.length : 0;\n\n if (typeof length == 'number') {\n while (++index < length) {\n if ((result = callback(collection[index], index, collection))) {\n break;\n }\n }\n } else {\n forOwn(collection, function(value, index, collection) {\n return !(result = callback(value, index, collection));\n });\n }\n return !!result;\n }\n\n /**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection through the callback. This method\n * performs a stable sort, that is, it will preserve the original sort order\n * of equal elements. The callback is bound to `thisArg` and invoked with\n * three arguments; (value, index|key, collection).\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an array of property names is provided for `callback` the collection\n * will be sorted by each property value.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @category Collections\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Array|Function|Object|string} [callback=identity] The function called\n * per iteration. If a property name or object is provided it will be used\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {Array} Returns a new array of sorted elements.\n * @example\n *\n * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\n * // => [3, 1, 2]\n *\n * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\n * // => [3, 1, 2]\n *\n * var characters = [\n * { 'name': 'barney', 'age': 36 },\n * { 'name': 'fred', 'age': 40 },\n * { 'name': 'barney', 'age': 26 },\n * { 'name': 'fred', 'age': 30 }\n * ];\n *\n * // using \"_.pluck\" callback shorthand\n * _.map(_.sortBy(characters, 'age'), _.values);\n * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\n *\n * // sorting by multiple properties\n * _.map(_.sortBy(characters, ['name', 'age']), _.values);\n * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\n */\n function sortBy(collection, callback, thisArg) {\n var index = -1,\n isArr = isArray(callback),\n length = collection ? collection.length : 0,\n result = Array(typeof length == 'number' ? length : 0);\n\n if (!isArr) {\n callback = lodash.createCallback(callback, thisArg, 3);\n }\n forEach(collection, function(value, key, collection) {\n var object = result[++index] = getObject();\n if (isArr) {\n object.criteria = map(callback, function(key) { return value[key]; });\n } else {\n (object.criteria = getArray())[0] = callback(value, key, collection);\n }\n object.index = index;\n object.value = value;\n });\n\n length = result.length;\n result.sort(compareAscending);\n while (length--) {\n var object = result[length];\n result[length] = object.value;\n if (!isArr) {\n releaseArray(object.criteria);\n }\n releaseObject(object);\n }\n return result;\n }\n\n /**\n * Converts the `collection` to an array.\n *\n * @static\n * @memberOf _\n * @category Collections\n * @param {Array|Object|string} collection The collection to convert.\n * @returns {Array} Returns the new converted array.\n * @example\n *\n * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\n * // => [2, 3, 4]\n */\n function toArray(collection) {\n if (collection && typeof collection.length == 'number') {\n return slice(collection);\n }\n return values(collection);\n }\n\n /**\n * Performs a deep comparison of each element in a `collection` to the given\n * `properties` object, returning an array of all elements that have equivalent\n * property values.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Collections\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Object} props The object of property values to filter by.\n * @returns {Array} Returns a new array of elements that have the given properties.\n * @example\n *\n * var characters = [\n * { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\n * { 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }\n * ];\n *\n * _.where(characters, { 'age': 36 });\n * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\n *\n * _.where(characters, { 'pets': ['dino'] });\n * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\n */\n var where = filter;\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Creates an array with all falsey values removed. The values `false`, `null`,\n * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\n *\n * @static\n * @memberOf _\n * @category Arrays\n * @param {Array} array The array to compact.\n * @returns {Array} Returns a new array of filtered values.\n * @example\n *\n * _.compact([0, 1, false, 2, '', 3]);\n * // => [1, 2, 3]\n */\n function compact(array) {\n var index = -1,\n length = array ? array.length : 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value) {\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * Creates an array excluding all values of the provided arrays using strict\n * equality for comparisons, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @category Arrays\n * @param {Array} array The array to process.\n * @param {...Array} [values] The arrays of values to exclude.\n * @returns {Array} Returns a new array of filtered values.\n * @example\n *\n * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\n * // => [1, 3, 4]\n */\n function difference(array) {\n return baseDifference(array, baseFlatten(arguments, true, true, 1));\n }\n\n /**\n * This method is like `_.find` except that it returns the index of the first\n * element that passes the callback check, instead of the element itself.\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @category Arrays\n * @param {Array} array The array to search.\n * @param {Function|Object|string} [callback=identity] The function called\n * per iteration. If a property name or object is provided it will be used\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var characters = [\n * { 'name': 'barney', 'age': 36, 'blocked': false },\n * { 'name': 'fred', 'age': 40, 'blocked': true },\n * { 'name': 'pebbles', 'age': 1, 'blocked': false }\n * ];\n *\n * _.findIndex(characters, function(chr) {\n * return chr.age < 20;\n * });\n * // => 2\n *\n * // using \"_.where\" callback shorthand\n * _.findIndex(characters, { 'age': 36 });\n * // => 0\n *\n * // using \"_.pluck\" callback shorthand\n * _.findIndex(characters, 'blocked');\n * // => 1\n */\n function findIndex(array, callback, thisArg) {\n var index = -1,\n length = array ? array.length : 0;\n\n callback = lodash.createCallback(callback, thisArg, 3);\n while (++index < length) {\n if (callback(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * This method is like `_.findIndex` except that it iterates over elements\n * of a `collection` from right to left.\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @category Arrays\n * @param {Array} array The array to search.\n * @param {Function|Object|string} [callback=identity] The function called\n * per iteration. If a property name or object is provided it will be used\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var characters = [\n * { 'name': 'barney', 'age': 36, 'blocked': true },\n * { 'name': 'fred', 'age': 40, 'blocked': false },\n * { 'name': 'pebbles', 'age': 1, 'blocked': true }\n * ];\n *\n * _.findLastIndex(characters, function(chr) {\n * return chr.age > 30;\n * });\n * // => 1\n *\n * // using \"_.where\" callback shorthand\n * _.findLastIndex(characters, { 'age': 36 });\n * // => 0\n *\n * // using \"_.pluck\" callback shorthand\n * _.findLastIndex(characters, 'blocked');\n * // => 2\n */\n function findLastIndex(array, callback, thisArg) {\n var length = array ? array.length : 0;\n callback = lodash.createCallback(callback, thisArg, 3);\n while (length--) {\n if (callback(array[length], length, array)) {\n return length;\n }\n }\n return -1;\n }\n\n /**\n * Gets the first element or first `n` elements of an array. If a callback\n * is provided elements at the beginning of the array are returned as long\n * as the callback returns truey. The callback is bound to `thisArg` and\n * invoked with three arguments; (value, index, array).\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @alias head, take\n * @category Arrays\n * @param {Array} array The array to query.\n * @param {Function|Object|number|string} [callback] The function called\n * per element or the number of elements to return. If a property name or\n * object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n * style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {*} Returns the first element(s) of `array`.\n * @example\n *\n * _.first([1, 2, 3]);\n * // => 1\n *\n * _.first([1, 2, 3], 2);\n * // => [1, 2]\n *\n * _.first([1, 2, 3], function(num) {\n * return num < 3;\n * });\n * // => [1, 2]\n *\n * var characters = [\n * { 'name': 'barney', 'blocked': true, 'employer': 'slate' },\n * { 'name': 'fred', 'blocked': false, 'employer': 'slate' },\n * { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\n * ];\n *\n * // using \"_.pluck\" callback shorthand\n * _.first(characters, 'blocked');\n * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\n *\n * // using \"_.where\" callback shorthand\n * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\n * // => ['barney', 'fred']\n */\n function first(array, callback, thisArg) {\n var n = 0,\n length = array ? array.length : 0;\n\n if (typeof callback != 'number' && callback != null) {\n var index = -1;\n callback = lodash.createCallback(callback, thisArg, 3);\n while (++index < length && callback(array[index], index, array)) {\n n++;\n }\n } else {\n n = callback;\n if (n == null || thisArg) {\n return array ? array[0] : undefined;\n }\n }\n return slice(array, 0, nativeMin(nativeMax(0, n), length));\n }\n\n /**\n * Flattens a nested array (the nesting can be to any depth). If `isShallow`\n * is truey, the array will only be flattened a single level. If a callback\n * is provided each element of the array is passed through the callback before\n * flattening. The callback is bound to `thisArg` and invoked with three\n * arguments; (value, index, array).\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @category Arrays\n * @param {Array} array The array to flatten.\n * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\n * @param {Function|Object|string} [callback=identity] The function called\n * per iteration. If a property name or object is provided it will be used\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {Array} Returns a new flattened array.\n * @example\n *\n * _.flatten([1, [2], [3, [[4]]]]);\n * // => [1, 2, 3, 4];\n *\n * _.flatten([1, [2], [3, [[4]]]], true);\n * // => [1, 2, 3, [[4]]];\n *\n * var characters = [\n * { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\n * { 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }\n * ];\n *\n * // using \"_.pluck\" callback shorthand\n * _.flatten(characters, 'pets');\n * // => ['hoppy', 'baby puss', 'dino']\n */\n function flatten(array, isShallow, callback, thisArg) {\n // juggle arguments\n if (typeof isShallow != 'boolean' && isShallow != null) {\n thisArg = callback;\n callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\n isShallow = false;\n }\n if (callback != null) {\n array = map(array, callback, thisArg);\n }\n return baseFlatten(array, isShallow);\n }\n\n /**\n * Gets the index at which the first occurrence of `value` is found using\n * strict equality for comparisons, i.e. `===`. If the array is already sorted\n * providing `true` for `fromIndex` will run a faster binary search.\n *\n * @static\n * @memberOf _\n * @category Arrays\n * @param {Array} array The array to search.\n * @param {*} value The value to search for.\n * @param {boolean|number} [fromIndex=0] The index to search from or `true`\n * to perform a binary search on a sorted array.\n * @returns {number} Returns the index of the matched value or `-1`.\n * @example\n *\n * _.indexOf([1, 2, 3, 1, 2, 3], 2);\n * // => 1\n *\n * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\n * // => 4\n *\n * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\n * // => 2\n */\n function indexOf(array, value, fromIndex) {\n if (typeof fromIndex == 'number') {\n var length = array ? array.length : 0;\n fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\n } else if (fromIndex) {\n var index = sortedIndex(array, value);\n return array[index] === value ? index : -1;\n }\n return baseIndexOf(array, value, fromIndex);\n }\n\n /**\n * Gets all but the last element or last `n` elements of an array. If a\n * callback is provided elements at the end of the array are excluded from\n * the result as long as the callback returns truey. The callback is bound\n * to `thisArg` and invoked with three arguments; (value, index, array).\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @category Arrays\n * @param {Array} array The array to query.\n * @param {Function|Object|number|string} [callback=1] The function called\n * per element or the number of elements to exclude. If a property name or\n * object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n * style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {Array} Returns a slice of `array`.\n * @example\n *\n * _.initial([1, 2, 3]);\n * // => [1, 2]\n *\n * _.initial([1, 2, 3], 2);\n * // => [1]\n *\n * _.initial([1, 2, 3], function(num) {\n * return num > 1;\n * });\n * // => [1]\n *\n * var characters = [\n * { 'name': 'barney', 'blocked': false, 'employer': 'slate' },\n * { 'name': 'fred', 'blocked': true, 'employer': 'slate' },\n * { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\n * ];\n *\n * // using \"_.pluck\" callback shorthand\n * _.initial(characters, 'blocked');\n * // => [{ 'name': 'barney', 'blocked': false, 'employer': 'slate' }]\n *\n * // using \"_.where\" callback shorthand\n * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\n * // => ['barney', 'fred']\n */\n function initial(array, callback, thisArg) {\n var n = 0,\n length = array ? array.length : 0;\n\n if (typeof callback != 'number' && callback != null) {\n var index = length;\n callback = lodash.createCallback(callback, thisArg, 3);\n while (index-- && callback(array[index], index, array)) {\n n++;\n }\n } else {\n n = (callback == null || thisArg) ? 1 : callback || n;\n }\n return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\n }\n\n /**\n * Creates an array of unique values present in all provided arrays using\n * strict equality for comparisons, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @category Arrays\n * @param {...Array} [array] The arrays to inspect.\n * @returns {Array} Returns an array of shared values.\n * @example\n *\n * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\n * // => [1, 2]\n */\n function intersection() {\n var args = [],\n argsIndex = -1,\n argsLength = arguments.length,\n caches = getArray(),\n indexOf = getIndexOf(),\n trustIndexOf = indexOf === baseIndexOf,\n seen = getArray();\n\n while (++argsIndex < argsLength) {\n var value = arguments[argsIndex];\n if (isArray(value) || isArguments(value)) {\n args.push(value);\n caches.push(trustIndexOf && value.length >= largeArraySize &&\n createCache(argsIndex ? args[argsIndex] : seen));\n }\n }\n var array = args[0],\n index = -1,\n length = array ? array.length : 0,\n result = [];\n\n outer:\n while (++index < length) {\n var cache = caches[0];\n value = array[index];\n\n if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\n argsIndex = argsLength;\n (cache || seen).push(value);\n while (--argsIndex) {\n cache = caches[argsIndex];\n if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\n continue outer;\n }\n }\n result.push(value);\n }\n }\n while (argsLength--) {\n cache = caches[argsLength];\n if (cache) {\n releaseObject(cache);\n }\n }\n releaseArray(caches);\n releaseArray(seen);\n return result;\n }\n\n /**\n * Gets the last element or last `n` elements of an array. If a callback is\n * provided elements at the end of the array are returned as long as the\n * callback returns truey. The callback is bound to `thisArg` and invoked\n * with three arguments; (value, index, array).\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @category Arrays\n * @param {Array} array The array to query.\n * @param {Function|Object|number|string} [callback] The function called\n * per element or the number of elements to return. If a property name or\n * object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n * style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {*} Returns the last element(s) of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n *\n * _.last([1, 2, 3], 2);\n * // => [2, 3]\n *\n * _.last([1, 2, 3], function(num) {\n * return num > 1;\n * });\n * // => [2, 3]\n *\n * var characters = [\n * { 'name': 'barney', 'blocked': false, 'employer': 'slate' },\n * { 'name': 'fred', 'blocked': true, 'employer': 'slate' },\n * { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\n * ];\n *\n * // using \"_.pluck\" callback shorthand\n * _.pluck(_.last(characters, 'blocked'), 'name');\n * // => ['fred', 'pebbles']\n *\n * // using \"_.where\" callback shorthand\n * _.last(characters, { 'employer': 'na' });\n * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\n */\n function last(array, callback, thisArg) {\n var n = 0,\n length = array ? array.length : 0;\n\n if (typeof callback != 'number' && callback != null) {\n var index = length;\n callback = lodash.createCallback(callback, thisArg, 3);\n while (index-- && callback(array[index], index, array)) {\n n++;\n }\n } else {\n n = callback;\n if (n == null || thisArg) {\n return array ? array[length - 1] : undefined;\n }\n }\n return slice(array, nativeMax(0, length - n));\n }\n\n /**\n * Gets the index at which the last occurrence of `value` is found using strict\n * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\n * as the offset from the end of the collection.\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @category Arrays\n * @param {Array} array The array to search.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the matched value or `-1`.\n * @example\n *\n * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\n * // => 4\n *\n * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\n * // => 1\n */\n function lastIndexOf(array, value, fromIndex) {\n var index = array ? array.length : 0;\n if (typeof fromIndex == 'number') {\n index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\n }\n while (index--) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * Removes all provided values from the given array using strict equality for\n * comparisons, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @category Arrays\n * @param {Array} array The array to modify.\n * @param {...*} [value] The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3, 1, 2, 3];\n * _.pull(array, 2, 3);\n * console.log(array);\n * // => [1, 1]\n */\n function pull(array) {\n var args = arguments,\n argsIndex = 0,\n argsLength = args.length,\n length = array ? array.length : 0;\n\n while (++argsIndex < argsLength) {\n var index = -1,\n value = args[argsIndex];\n while (++index < length) {\n if (array[index] === value) {\n splice.call(array, index--, 1);\n length--;\n }\n }\n }\n return array;\n }\n\n /**\n * Creates an array of numbers (positive and/or negative) progressing from\n * `start` up to but not including `end`. If `start` is less than `stop` a\n * zero-length range is created unless a negative `step` is specified.\n *\n * @static\n * @memberOf _\n * @category Arrays\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @param {number} [step=1] The value to increment or decrement by.\n * @returns {Array} Returns a new range array.\n * @example\n *\n * _.range(4);\n * // => [0, 1, 2, 3]\n *\n * _.range(1, 5);\n * // => [1, 2, 3, 4]\n *\n * _.range(0, 20, 5);\n * // => [0, 5, 10, 15]\n *\n * _.range(0, -4, -1);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 4, 0);\n * // => [1, 1, 1]\n *\n * _.range(0);\n * // => []\n */\n function range(start, end, step) {\n start = +start || 0;\n step = typeof step == 'number' ? step : (+step || 1);\n\n if (end == null) {\n end = start;\n start = 0;\n }\n // use `Array(length)` so engines like Chakra and V8 avoid slower modes\n // http://youtu.be/XAqIpGU8ZZk#t=17m25s\n var index = -1,\n length = nativeMax(0, ceil((end - start) / (step || 1))),\n result = Array(length);\n\n while (++index < length) {\n result[index] = start;\n start += step;\n }\n return result;\n }\n\n /**\n * Removes all elements from an array that the callback returns truey for\n * and returns an array of removed elements. The callback is bound to `thisArg`\n * and invoked with three arguments; (value, index, array).\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @category Arrays\n * @param {Array} array The array to modify.\n * @param {Function|Object|string} [callback=identity] The function called\n * per iteration. If a property name or object is provided it will be used\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {Array} Returns a new array of removed elements.\n * @example\n *\n * var array = [1, 2, 3, 4, 5, 6];\n * var evens = _.remove(array, function(num) { return num % 2 == 0; });\n *\n * console.log(array);\n * // => [1, 3, 5]\n *\n * console.log(evens);\n * // => [2, 4, 6]\n */\n function remove(array, callback, thisArg) {\n var index = -1,\n length = array ? array.length : 0,\n result = [];\n\n callback = lodash.createCallback(callback, thisArg, 3);\n while (++index < length) {\n var value = array[index];\n if (callback(value, index, array)) {\n result.push(value);\n splice.call(array, index--, 1);\n length--;\n }\n }\n return result;\n }\n\n /**\n * The opposite of `_.initial` this method gets all but the first element or\n * first `n` elements of an array. If a callback function is provided elements\n * at the beginning of the array are excluded from the result as long as the\n * callback returns truey. The callback is bound to `thisArg` and invoked\n * with three arguments; (value, index, array).\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @alias drop, tail\n * @category Arrays\n * @param {Array} array The array to query.\n * @param {Function|Object|number|string} [callback=1] The function called\n * per element or the number of elements to exclude. If a property name or\n * object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n * style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {Array} Returns a slice of `array`.\n * @example\n *\n * _.rest([1, 2, 3]);\n * // => [2, 3]\n *\n * _.rest([1, 2, 3], 2);\n * // => [3]\n *\n * _.rest([1, 2, 3], function(num) {\n * return num < 3;\n * });\n * // => [3]\n *\n * var characters = [\n * { 'name': 'barney', 'blocked': true, 'employer': 'slate' },\n * { 'name': 'fred', 'blocked': false, 'employer': 'slate' },\n * { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\n * ];\n *\n * // using \"_.pluck\" callback shorthand\n * _.pluck(_.rest(characters, 'blocked'), 'name');\n * // => ['fred', 'pebbles']\n *\n * // using \"_.where\" callback shorthand\n * _.rest(characters, { 'employer': 'slate' });\n * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\n */\n function rest(array, callback, thisArg) {\n if (typeof callback != 'number' && callback != null) {\n var n = 0,\n index = -1,\n length = array ? array.length : 0;\n\n callback = lodash.createCallback(callback, thisArg, 3);\n while (++index < length && callback(array[index], index, array)) {\n n++;\n }\n } else {\n n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\n }\n return slice(array, n);\n }\n\n /**\n * Uses a binary search to determine the smallest index at which a value\n * should be inserted into a given sorted array in order to maintain the sort\n * order of the array. If a callback is provided it will be executed for\n * `value` and each element of `array` to compute their sort ranking. The\n * callback is bound to `thisArg` and invoked with one argument; (value).\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @category Arrays\n * @param {Array} array The array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function|Object|string} [callback=identity] The function called\n * per iteration. If a property name or object is provided it will be used\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedIndex([20, 30, 50], 40);\n * // => 2\n *\n * // using \"_.pluck\" callback shorthand\n * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\n * // => 2\n *\n * var dict = {\n * 'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\n * };\n *\n * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\n * return dict.wordToNumber[word];\n * });\n * // => 2\n *\n * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\n * return this.wordToNumber[word];\n * }, dict);\n * // => 2\n */\n function sortedIndex(array, value, callback, thisArg) {\n var low = 0,\n high = array ? array.length : low;\n\n // explicitly reference `identity` for better inlining in Firefox\n callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\n value = callback(value);\n\n while (low < high) {\n var mid = (low + high) >>> 1;\n (callback(array[mid]) < value)\n ? low = mid + 1\n : high = mid;\n }\n return low;\n }\n\n /**\n * Creates an array of unique values, in order, of the provided arrays using\n * strict equality for comparisons, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @category Arrays\n * @param {...Array} [array] The arrays to inspect.\n * @returns {Array} Returns an array of combined values.\n * @example\n *\n * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\n * // => [1, 2, 3, 5, 4]\n */\n function union() {\n return baseUniq(baseFlatten(arguments, true, true));\n }\n\n /**\n * Creates a duplicate-value-free version of an array using strict equality\n * for comparisons, i.e. `===`. If the array is sorted, providing\n * `true` for `isSorted` will use a faster algorithm. If a callback is provided\n * each element of `array` is passed through the callback before uniqueness\n * is computed. The callback is bound to `thisArg` and invoked with three\n * arguments; (value, index, array).\n *\n * If a property name is provided for `callback` the created \"_.pluck\" style\n * callback will return the property value of the given element.\n *\n * If an object is provided for `callback` the created \"_.where\" style callback\n * will return `true` for elements that have the properties of the given object,\n * else `false`.\n *\n * @static\n * @memberOf _\n * @alias unique\n * @category Arrays\n * @param {Array} array The array to process.\n * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\n * @param {Function|Object|string} [callback=identity] The function called\n * per iteration. If a property name or object is provided it will be used\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n * @param {*} [thisArg] The `this` binding of `callback`.\n * @returns {Array} Returns a duplicate-value-free array.\n * @example\n *\n * _.uniq([1, 2, 1, 3, 1]);\n * // => [1, 2, 3]\n *\n * _.uniq([1, 1, 2, 2, 3], true);\n * // => [1, 2, 3]\n *\n * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\n * // => ['A', 'b', 'C']\n *\n * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\n * // => [1, 2.5, 3]\n *\n * // using \"_.pluck\" callback shorthand\n * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\n function uniq(array, isSorted, callback, thisArg) {\n // juggle arguments\n if (typeof isSorted != 'boolean' && isSorted != null) {\n thisArg = callback;\n callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\n isSorted = false;\n }\n if (callback != null) {\n callback = lodash.createCallback(callback, thisArg, 3);\n }\n return baseUniq(array, isSorted, callback);\n }\n\n /**\n * Creates an array excluding all provided values using strict equality for\n * comparisons, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @category Arrays\n * @param {Array} array The array to filter.\n * @param {...*} [value] The values to exclude.\n * @returns {Array} Returns a new array of filtered values.\n * @example\n *\n * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\n * // => [2, 3, 4]\n */\n function without(array) {\n return baseDifference(array, slice(arguments, 1));\n }\n\n /**\n * Creates an array that is the symmetric difference of the provided arrays.\n * See http://en.wikipedia.org/wiki/Symmetric_difference.\n *\n * @static\n * @memberOf _\n * @category Arrays\n * @param {...Array} [array] The arrays to inspect.\n * @returns {Array} Returns an array of values.\n * @example\n *\n * _.xor([1, 2, 3], [5, 2, 1, 4]);\n * // => [3, 5, 4]\n *\n * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\n * // => [1, 4, 5]\n */\n function xor() {\n var index = -1,\n length = arguments.length;\n\n while (++index < length) {\n var array = arguments[index];\n if (isArray(array) || isArguments(array)) {\n var result = result\n ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\n : array;\n }\n }\n return result || [];\n }\n\n /**\n * Creates an array of grouped elements, the first of which contains the first\n * elements of the given arrays, the second of which contains the second\n * elements of the given arrays, and so on.\n *\n * @static\n * @memberOf _\n * @alias unzip\n * @category Arrays\n * @param {...Array} [array] Arrays to process.\n * @returns {Array} Returns a new array of grouped elements.\n * @example\n *\n * _.zip(['fred', 'barney'], [30, 40], [true, false]);\n * // => [['fred', 30, true], ['barney', 40, false]]\n */\n function zip() {\n var array = arguments.length > 1 ? arguments : arguments[0],\n index = -1,\n length = array ? max(pluck(array, 'length')) : 0,\n result = Array(length < 0 ? 0 : length);\n\n while (++index < length) {\n result[index] = pluck(array, index);\n }\n return result;\n }\n\n /**\n * Creates an object composed from arrays of `keys` and `values`. Provide\n * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\n * or two arrays, one of `keys` and one of corresponding `values`.\n *\n * @static\n * @memberOf _\n * @alias object\n * @category Arrays\n * @param {Array} keys The array of keys.\n * @param {Array} [values=[]] The array of values.\n * @returns {Object} Returns an object composed of the given keys and\n * corresponding values.\n * @example\n *\n * _.zipObject(['fred', 'barney'], [30, 40]);\n * // => { 'fred': 30, 'barney': 40 }\n */\n function zipObject(keys, values) {\n var index = -1,\n length = keys ? keys.length : 0,\n result = {};\n\n if (!values && length && !isArray(keys[0])) {\n values = [];\n }\n while (++index < length) {\n var key = keys[index];\n if (values) {\n result[key] = values[index];\n } else if (key) {\n result[key[0]] = key[1];\n }\n }\n return result;\n }\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Creates a function that executes `func`, with the `this` binding and\n * arguments of the created function, only after being called `n` times.\n *\n * @static\n * @memberOf _\n * @category Functions\n * @param {number} n The number of times the function must be called before\n * `func` is executed.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var saves = ['profile', 'settings'];\n *\n * var done = _.after(saves.length, function() {\n * console.log('Done saving!');\n * });\n *\n * _.forEach(saves, function(type) {\n * asyncSave({ 'type': type, 'complete': done });\n * });\n * // => logs 'Done saving!', after all saves have completed\n */\n function after(n, func) {\n if (!isFunction(func)) {\n throw new TypeError;\n }\n return function() {\n if (--n < 1) {\n return func.apply(this, arguments);\n }\n };\n }\n\n /**\n * Creates a function that, when called, invokes `func` with the `this`\n * binding of `thisArg` and prepends any additional `bind` arguments to those\n * provided to the bound function.\n *\n * @static\n * @memberOf _\n * @category Functions\n * @param {Function} func The function to bind.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {...*} [arg] Arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * var func = function(greeting) {\n * return greeting + ' ' + this.name;\n * };\n *\n * func = _.bind(func, { 'name': 'fred' }, 'hi');\n * func();\n * // => 'hi fred'\n */\n function bind(func, thisArg) {\n return arguments.length > 2\n ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\n : createWrapper(func, 1, null, null, thisArg);\n }\n\n /**\n * Binds methods of an object to the object itself, overwriting the existing\n * method. Method names may be specified as individual arguments or as arrays\n * of method names. If no method names are provided all the function properties\n * of `object` will be bound.\n *\n * @static\n * @memberOf _\n * @category Functions\n * @param {Object} object The object to bind and assign the bound methods to.\n * @param {...string} [methodName] The object method names to\n * bind, specified as individual method names or arrays of method names.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var view = {\n * 'label': 'docs',\n * 'onClick': function() { console.log('clicked ' + this.label); }\n * };\n *\n * _.bindAll(view);\n * jQuery('#docs').on('click', view.onClick);\n * // => logs 'clicked docs', when the button is clicked\n */\n function bindAll(object) {\n var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\n index = -1,\n length = funcs.length;\n\n while (++index < length) {\n var key = funcs[index];\n object[key] = createWrapper(object[key], 1, null, null, object);\n }\n return object;\n }\n\n /**\n * Creates a function that, when called, invokes the method at `object[key]`\n * and prepends any additional `bindKey` arguments to those provided to the bound\n * function. This method differs from `_.bind` by allowing bound functions to\n * reference methods that will be redefined or don't yet exist.\n * See http://michaux.ca/articles/lazy-function-definition-pattern.\n *\n * @static\n * @memberOf _\n * @category Functions\n * @param {Object} object The object the method belongs to.\n * @param {string} key The key of the method.\n * @param {...*} [arg] Arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * var object = {\n * 'name': 'fred',\n * 'greet': function(greeting) {\n * return greeting + ' ' + this.name;\n * }\n * };\n *\n * var func = _.bindKey(object, 'greet', 'hi');\n * func();\n * // => 'hi fred'\n *\n * object.greet = function(greeting) {\n * return greeting + 'ya ' + this.name + '!';\n * };\n *\n * func();\n * // => 'hiya fred!'\n */\n function bindKey(object, key) {\n return arguments.length > 2\n ? createWrapper(key, 19, slice(arguments, 2), null, object)\n : createWrapper(key, 3, null, null, object);\n }\n\n /**\n * Creates a function that is the composition of the provided functions,\n * where each function consumes the return value of the function that follows.\n * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\n * Each function is executed with the `this` binding of the composed function.\n *\n * @static\n * @memberOf _\n * @category Functions\n * @param {...Function} [func] Functions to compose.\n * @returns {Function} Returns the new composed function.\n * @example\n *\n * var realNameMap = {\n * 'pebbles': 'penelope'\n * };\n *\n * var format = function(name) {\n * name = realNameMap[name.toLowerCase()] || name;\n * return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\n * };\n *\n * var greet = function(formatted) {\n * return 'Hiya ' + formatted + '!';\n * };\n *\n * var welcome = _.compose(greet, format);\n * welcome('pebbles');\n * // => 'Hiya Penelope!'\n */\n function compose() {\n var funcs = arguments,\n length = funcs.length;\n\n while (length--) {\n if (!isFunction(funcs[length])) {\n throw new TypeError;\n }\n }\n return function() {\n var args = arguments,\n length = funcs.length;\n\n while (length--) {\n args = [funcs[length].apply(this, args)];\n }\n return args[0];\n };\n }\n\n /**\n * Creates a function which accepts one or more arguments of `func` that when\n * invoked either executes `func` returning its result, if all `func` arguments\n * have been provided, or returns a function that accepts one or more of the\n * remaining `func` arguments, and so on. The arity of `func` can be specified\n * if `func.length` is not sufficient.\n *\n * @static\n * @memberOf _\n * @category Functions\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var curried = _.curry(function(a, b, c) {\n * console.log(a + b + c);\n * });\n *\n * curried(1)(2)(3);\n * // => 6\n *\n * curried(1, 2)(3);\n * // => 6\n *\n * curried(1, 2, 3);\n * // => 6\n */\n function curry(func, arity) {\n arity = typeof arity == 'number' ? arity : (+arity || func.length);\n return createWrapper(func, 4, null, null, null, arity);\n }\n\n /**\n * Creates a function that will delay the execution of `func` until after\n * `wait` milliseconds have elapsed since the last time it was invoked.\n * Provide an options object to indicate that `func` should be invoked on\n * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\n * to the debounced function will return the result of the last `func` call.\n *\n * Note: If `leading` and `trailing` options are `true` `func` will be called\n * on the trailing edge of the timeout only if the the debounced function is\n * invoked more than once during the `wait` timeout.\n *\n * @static\n * @memberOf _\n * @category Functions\n * @param {Function} func The function to debounce.\n * @param {number} wait The number of milliseconds to delay.\n * @param {Object} [options] The options object.\n * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\n * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\n * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // avoid costly calculations while the window size is in flux\n * var lazyLayout = _.debounce(calculateLayout, 150);\n * jQuery(window).on('resize', lazyLayout);\n *\n * // execute `sendMail` when the click event is fired, debouncing subsequent calls\n * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * });\n *\n * // ensure `batchLog` is executed once after 1 second of debounced calls\n * var source = new EventSource('/stream');\n * source.addEventListener('message', _.debounce(batchLog, 250, {\n * 'maxWait': 1000\n * }, false);\n */\n function debounce(func, wait, options) {\n var args,\n maxTimeoutId,\n result,\n stamp,\n thisArg,\n timeoutId,\n trailingCall,\n lastCalled = 0,\n maxWait = false,\n trailing = true;\n\n if (!isFunction(func)) {\n throw new TypeError;\n }\n wait = nativeMax(0, wait) || 0;\n if (options === true) {\n var leading = true;\n trailing = false;\n } else if (isObject(options)) {\n leading = options.leading;\n maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\n trailing = 'trailing' in options ? options.trailing : trailing;\n }\n var delayed = function() {\n var remaining = wait - (now() - stamp);\n if (remaining <= 0) {\n if (maxTimeoutId) {\n clearTimeout(maxTimeoutId);\n }\n var isCalled = trailingCall;\n maxTimeoutId = timeoutId = trailingCall = undefined;\n if (isCalled) {\n lastCalled = now();\n result = func.apply(thisArg, args);\n if (!timeoutId && !maxTimeoutId) {\n args = thisArg = null;\n }\n }\n } else {\n timeoutId = setTimeout(delayed, remaining);\n }\n };\n\n var maxDelayed = function() {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n maxTimeoutId = timeoutId = trailingCall = undefined;\n if (trailing || (maxWait !== wait)) {\n lastCalled = now();\n result = func.apply(thisArg, args);\n if (!timeoutId && !maxTimeoutId) {\n args = thisArg = null;\n }\n }\n };\n\n return function() {\n args = arguments;\n stamp = now();\n thisArg = this;\n trailingCall = trailing && (timeoutId || !leading);\n\n if (maxWait === false) {\n var leadingCall = leading && !timeoutId;\n } else {\n if (!maxTimeoutId && !leading) {\n lastCalled = stamp;\n }\n var remaining = maxWait - (stamp - lastCalled),\n isCalled = remaining <= 0;\n\n if (isCalled) {\n if (maxTimeoutId) {\n maxTimeoutId = clearTimeout(maxTimeoutId);\n }\n lastCalled = stamp;\n result = func.apply(thisArg, args);\n }\n else if (!maxTimeoutId) {\n maxTimeoutId = setTimeout(maxDelayed, remaining);\n }\n }\n if (isCalled && timeoutId) {\n timeoutId = clearTimeout(timeoutId);\n }\n else if (!timeoutId && wait !== maxWait) {\n timeoutId = setTimeout(delayed, wait);\n }\n if (leadingCall) {\n isCalled = true;\n result = func.apply(thisArg, args);\n }\n if (isCalled && !timeoutId && !maxTimeoutId) {\n args = thisArg = null;\n }\n return result;\n };\n }\n\n /**\n * Defers executing the `func` function until the current call stack has cleared.\n * Additional arguments will be provided to `func` when it is invoked.\n *\n * @static\n * @memberOf _\n * @category Functions\n * @param {Function} func The function to defer.\n * @param {...*} [arg] Arguments to invoke the function with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.defer(function(text) { console.log(text); }, 'deferred');\n * // logs 'deferred' after one or more milliseconds\n */\n function defer(func) {\n if (!isFunction(func)) {\n throw new TypeError;\n }\n var args = slice(arguments, 1);\n return setTimeout(function() { func.apply(undefined, args); }, 1);\n }\n\n /**\n * Executes the `func` function after `wait` milliseconds. Additional arguments\n * will be provided to `func` when it is invoked.\n *\n * @static\n * @memberOf _\n * @category Functions\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay execution.\n * @param {...*} [arg] Arguments to invoke the function with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.delay(function(text) { console.log(text); }, 1000, 'later');\n * // => logs 'later' after one second\n */\n function delay(func, wait) {\n if (!isFunction(func)) {\n throw new TypeError;\n }\n var args = slice(arguments, 2);\n return setTimeout(function() { func.apply(undefined, args); }, wait);\n }\n\n /**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided it will be used to determine the cache key for storing the result\n * based on the arguments provided to the memoized function. By default, the\n * first argument provided to the memoized function is used as the cache key.\n * The `func` is executed with the `this` binding of the memoized function.\n * The result cache is exposed as the `cache` property on the memoized function.\n *\n * @static\n * @memberOf _\n * @category Functions\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] A function used to resolve the cache key.\n * @returns {Function} Returns the new memoizing function.\n * @example\n *\n * var fibonacci = _.memoize(function(n) {\n * return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\n * });\n *\n * fibonacci(9)\n * // => 34\n *\n * var data = {\n * 'fred': { 'name': 'fred', 'age': 40 },\n * 'pebbles': { 'name': 'pebbles', 'age': 1 }\n * };\n *\n * // modifying the result cache\n * var get = _.memoize(function(name) { return data[name]; }, _.identity);\n * get('pebbles');\n * // => { 'name': 'pebbles', 'age': 1 }\n *\n * get.cache.pebbles.name = 'penelope';\n * get('pebbles');\n * // => { 'name': 'penelope', 'age': 1 }\n */\n function memoize(func, resolver) {\n if (!isFunction(func)) {\n throw new TypeError;\n }\n var memoized = function() {\n var cache = memoized.cache,\n key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\n\n return hasOwnProperty.call(cache, key)\n ? cache[key]\n : (cache[key] = func.apply(this, arguments));\n }\n memoized.cache = {};\n return memoized;\n }\n\n /**\n * Creates a function that is restricted to execute `func` once. Repeat calls to\n * the function will return the value of the first call. The `func` is executed\n * with the `this` binding of the created function.\n *\n * @static\n * @memberOf _\n * @category Functions\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var initialize = _.once(createApplication);\n * initialize();\n * initialize();\n * // `initialize` executes `createApplication` once\n */\n function once(func) {\n var ran,\n result;\n\n if (!isFunction(func)) {\n throw new TypeError;\n }\n return function() {\n if (ran) {\n return result;\n }\n ran = true;\n result = func.apply(this, arguments);\n\n // clear the `func` variable so the function may be garbage collected\n func = null;\n return result;\n };\n }\n\n /**\n * Creates a function that, when called, invokes `func` with any additional\n * `partial` arguments prepended to those provided to the new function. This\n * method is similar to `_.bind` except it does **not** alter the `this` binding.\n *\n * @static\n * @memberOf _\n * @category Functions\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [arg] Arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * var greet = function(greeting, name) { return greeting + ' ' + name; };\n * var hi = _.partial(greet, 'hi');\n * hi('fred');\n * // => 'hi fred'\n */\n function partial(func) {\n return createWrapper(func, 16, slice(arguments, 1));\n }\n\n /**\n * This method is like `_.partial` except that `partial` arguments are\n * appended to those provided to the new function.\n *\n * @static\n * @memberOf _\n * @category Functions\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [arg] Arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * var defaultsDeep = _.partialRight(_.merge, _.defaults);\n *\n * var options = {\n * 'variable': 'data',\n * 'imports': { 'jq': $ }\n * };\n *\n * defaultsDeep(options, _.templateSettings);\n *\n * options.variable\n * // => 'data'\n *\n * options.imports\n * // => { '_': _, 'jq': $ }\n */\n function partialRight(func) {\n return createWrapper(func, 32, null, slice(arguments, 1));\n }\n\n /**\n * Creates a function that, when executed, will only call the `func` function\n * at most once per every `wait` milliseconds. Provide an options object to\n * indicate that `func` should be invoked on the leading and/or trailing edge\n * of the `wait` timeout. Subsequent calls to the throttled function will\n * return the result of the last `func` call.\n *\n * Note: If `leading` and `trailing` options are `true` `func` will be called\n * on the trailing edge of the timeout only if the the throttled function is\n * invoked more than once during the `wait` timeout.\n *\n * @static\n * @memberOf _\n * @category Functions\n * @param {Function} func The function to throttle.\n * @param {number} wait The number of milliseconds to throttle executions to.\n * @param {Object} [options] The options object.\n * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // avoid excessively updating the position while scrolling\n * var throttled = _.throttle(updatePosition, 100);\n * jQuery(window).on('scroll', throttled);\n *\n * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\n * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\n * 'trailing': false\n * }));\n */\n function throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (!isFunction(func)) {\n throw new TypeError;\n }\n if (options === false) {\n leading = false;\n } else if (isObject(options)) {\n leading = 'leading' in options ? options.leading : leading;\n trailing = 'trailing' in options ? options.trailing : trailing;\n }\n debounceOptions.leading = leading;\n debounceOptions.maxWait = wait;\n debounceOptions.trailing = trailing;\n\n return debounce(func, wait, debounceOptions);\n }\n\n /**\n * Creates a function that provides `value` to the wrapper function as its\n * first argument. Additional arguments provided to the function are appended\n * to those provided to the wrapper function. The wrapper is executed with\n * the `this` binding of the created function.\n *\n * @static\n * @memberOf _\n * @category Functions\n * @param {*} value The value to wrap.\n * @param {Function} wrapper The wrapper function.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var p = _.wrap(_.escape, function(func, text) {\n * return '

' + func(text) + '

';\n * });\n *\n * p('Fred, Wilma, & Pebbles');\n * // => '

Fred, Wilma, & Pebbles

'\n */\n function wrap(value, wrapper) {\n return createWrapper(wrapper, 16, [value]);\n }\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @category Utilities\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var object = { 'name': 'fred' };\n * var getter = _.constant(object);\n * getter() === object;\n * // => true\n */\n function constant(value) {\n return function() {\n return value;\n };\n }\n\n /**\n * Produces a callback bound to an optional `thisArg`. If `func` is a property\n * name the created callback will return the property value for a given element.\n * If `func` is an object the created callback will return `true` for elements\n * that contain the equivalent object properties, otherwise it will return `false`.\n *\n * @static\n * @memberOf _\n * @category Utilities\n * @param {*} [func=identity] The value to convert to a callback.\n * @param {*} [thisArg] The `this` binding of the created callback.\n * @param {number} [argCount] The number of arguments the callback accepts.\n * @returns {Function} Returns a callback function.\n * @example\n *\n * var characters = [\n * { 'name': 'barney', 'age': 36 },\n * { 'name': 'fred', 'age': 40 }\n * ];\n *\n * // wrap to create custom callback shorthands\n * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\n * var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\n * return !match ? func(callback, thisArg) : function(object) {\n * return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\n * };\n * });\n *\n * _.filter(characters, 'age__gt38');\n * // => [{ 'name': 'fred', 'age': 40 }]\n */\n function createCallback(func, thisArg, argCount) {\n var type = typeof func;\n if (func == null || type == 'function') {\n return baseCreateCallback(func, thisArg, argCount);\n }\n // handle \"_.pluck\" style callback shorthands\n if (type != 'object') {\n return property(func);\n }\n var props = keys(func),\n key = props[0],\n a = func[key];\n\n // handle \"_.where\" style callback shorthands\n if (props.length == 1 && a === a && !isObject(a)) {\n // fast path the common case of providing an object with a single\n // property containing a primitive value\n return function(object) {\n var b = object[key];\n return a === b && (a !== 0 || (1 / a == 1 / b));\n };\n }\n return function(object) {\n var length = props.length,\n result = false;\n\n while (length--) {\n if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\n break;\n }\n }\n return result;\n };\n }\n\n /**\n * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\n * corresponding HTML entities.\n *\n * @static\n * @memberOf _\n * @category Utilities\n * @param {string} string The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escape('Fred, Wilma, & Pebbles');\n * // => 'Fred, Wilma, & Pebbles'\n */\n function escape(string) {\n return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\n }\n\n /**\n * This method returns the first argument provided to it.\n *\n * @static\n * @memberOf _\n * @category Utilities\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'name': 'fred' };\n * _.identity(object) === object;\n * // => true\n */\n function identity(value) {\n return value;\n }\n\n /**\n * Adds function properties of a source object to the destination object.\n * If `object` is a function methods will be added to its prototype as well.\n *\n * @static\n * @memberOf _\n * @category Utilities\n * @param {Function|Object} [object=lodash] object The destination object.\n * @param {Object} source The object of functions to add.\n * @param {Object} [options] The options object.\n * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\n * @example\n *\n * function capitalize(string) {\n * return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\n * }\n *\n * _.mixin({ 'capitalize': capitalize });\n * _.capitalize('fred');\n * // => 'Fred'\n *\n * _('fred').capitalize().value();\n * // => 'Fred'\n *\n * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\n * _('fred').capitalize();\n * // => 'Fred'\n */\n function mixin(object, source, options) {\n var chain = true,\n methodNames = source && functions(source);\n\n if (!source || (!options && !methodNames.length)) {\n if (options == null) {\n options = source;\n }\n ctor = lodashWrapper;\n source = object;\n object = lodash;\n methodNames = functions(source);\n }\n if (options === false) {\n chain = false;\n } else if (isObject(options) && 'chain' in options) {\n chain = options.chain;\n }\n var ctor = object,\n isFunc = isFunction(ctor);\n\n forEach(methodNames, function(methodName) {\n var func = object[methodName] = source[methodName];\n if (isFunc) {\n ctor.prototype[methodName] = function() {\n var chainAll = this.__chain__,\n value = this.__wrapped__,\n args = [value];\n\n push.apply(args, arguments);\n var result = func.apply(object, args);\n if (chain || chainAll) {\n if (value === result && isObject(result)) {\n return this;\n }\n result = new ctor(result);\n result.__chain__ = chainAll;\n }\n return result;\n };\n }\n });\n }\n\n /**\n * Reverts the '_' variable to its previous value and returns a reference to\n * the `lodash` function.\n *\n * @static\n * @memberOf _\n * @category Utilities\n * @returns {Function} Returns the `lodash` function.\n * @example\n *\n * var lodash = _.noConflict();\n */\n function noConflict() {\n context._ = oldDash;\n return this;\n }\n\n /**\n * A no-operation function.\n *\n * @static\n * @memberOf _\n * @category Utilities\n * @example\n *\n * var object = { 'name': 'fred' };\n * _.noop(object) === undefined;\n * // => true\n */\n function noop() {\n // no operation performed\n }\n\n /**\n * Gets the number of milliseconds that have elapsed since the Unix epoch\n * (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @category Utilities\n * @example\n *\n * var stamp = _.now();\n * _.defer(function() { console.log(_.now() - stamp); });\n * // => logs the number of milliseconds it took for the deferred function to be called\n */\n var now = isNative(now = Date.now) && now || function() {\n return new Date().getTime();\n };\n\n /**\n * Converts the given value into an integer of the specified radix.\n * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\n * `value` is a hexadecimal, in which case a `radix` of `16` is used.\n *\n * Note: This method avoids differences in native ES3 and ES5 `parseInt`\n * implementations. See http://es5.github.io/#E.\n *\n * @static\n * @memberOf _\n * @category Utilities\n * @param {string} value The value to parse.\n * @param {number} [radix] The radix used to interpret the value to parse.\n * @returns {number} Returns the new integer value.\n * @example\n *\n * _.parseInt('08');\n * // => 8\n */\n var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\n // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\n return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\n };\n\n /**\n * Creates a \"_.pluck\" style function, which returns the `key` value of a\n * given object.\n *\n * @static\n * @memberOf _\n * @category Utilities\n * @param {string} key The name of the property to retrieve.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var characters = [\n * { 'name': 'fred', 'age': 40 },\n * { 'name': 'barney', 'age': 36 }\n * ];\n *\n * var getName = _.property('name');\n *\n * _.map(characters, getName);\n * // => ['barney', 'fred']\n *\n * _.sortBy(characters, getName);\n * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }]\n */\n function property(key) {\n return function(object) {\n return object[key];\n };\n }\n\n /**\n * Produces a random number between `min` and `max` (inclusive). If only one\n * argument is provided a number between `0` and the given number will be\n * returned. If `floating` is truey or either `min` or `max` are floats a\n * floating-point number will be returned instead of an integer.\n *\n * @static\n * @memberOf _\n * @category Utilities\n * @param {number} [min=0] The minimum possible value.\n * @param {number} [max=1] The maximum possible value.\n * @param {boolean} [floating=false] Specify returning a floating-point number.\n * @returns {number} Returns a random number.\n * @example\n *\n * _.random(0, 5);\n * // => an integer between 0 and 5\n *\n * _.random(5);\n * // => also an integer between 0 and 5\n *\n * _.random(5, true);\n * // => a floating-point number between 0 and 5\n *\n * _.random(1.2, 5.2);\n * // => a floating-point number between 1.2 and 5.2\n */\n function random(min, max, floating) {\n var noMin = min == null,\n noMax = max == null;\n\n if (floating == null) {\n if (typeof min == 'boolean' && noMax) {\n floating = min;\n min = 1;\n }\n else if (!noMax && typeof max == 'boolean') {\n floating = max;\n noMax = true;\n }\n }\n if (noMin && noMax) {\n max = 1;\n }\n min = +min || 0;\n if (noMax) {\n max = min;\n min = 0;\n } else {\n max = +max || 0;\n }\n if (floating || min % 1 || max % 1) {\n var rand = nativeRandom();\n return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\n }\n return baseRandom(min, max);\n }\n\n /**\n * Resolves the value of property `key` on `object`. If `key` is a function\n * it will be invoked with the `this` binding of `object` and its result returned,\n * else the property value is returned. If `object` is falsey then `undefined`\n * is returned.\n *\n * @static\n * @memberOf _\n * @category Utilities\n * @param {Object} object The object to inspect.\n * @param {string} key The name of the property to resolve.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = {\n * 'cheese': 'crumpets',\n * 'stuff': function() {\n * return 'nonsense';\n * }\n * };\n *\n * _.result(object, 'cheese');\n * // => 'crumpets'\n *\n * _.result(object, 'stuff');\n * // => 'nonsense'\n */\n function result(object, key) {\n if (object) {\n var value = object[key];\n return isFunction(value) ? object[key]() : value;\n }\n }\n\n /**\n * A micro-templating method that handles arbitrary delimiters, preserves\n * whitespace, and correctly escapes quotes within interpolated code.\n *\n * Note: In the development build, `_.template` utilizes sourceURLs for easier\n * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\n *\n * For more information on precompiling templates see:\n * http://lodash.com/custom-builds\n *\n * For more information on Chrome extension sandboxes see:\n * http://developer.chrome.com/stable/extensions/sandboxingEval.html\n *\n * @static\n * @memberOf _\n * @category Utilities\n * @param {string} text The template text.\n * @param {Object} data The data object used to populate the text.\n * @param {Object} [options] The options object.\n * @param {RegExp} [options.escape] The \"escape\" delimiter.\n * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\n * @param {Object} [options.imports] An object to import into the template as local variables.\n * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\n * @param {string} [sourceURL] The sourceURL of the template's compiled source.\n * @param {string} [variable] The data object variable name.\n * @returns {Function|string} Returns a compiled function when no `data` object\n * is given, else it returns the interpolated text.\n * @example\n *\n * // using the \"interpolate\" delimiter to create a compiled template\n * var compiled = _.template('hello <%= name %>');\n * compiled({ 'name': 'fred' });\n * // => 'hello fred'\n *\n * // using the \"escape\" delimiter to escape HTML in data property values\n * _.template('<%- value %>', { 'value': '