ember-source 1.0.0.rc2.2 → 1.0.0.rc2.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of ember-source might be problematic. Click here for more details.

@@ -8,10 +8,10 @@
8
8
  // ==========================================================================
9
9
 
10
10
 
11
- // Version: v1.0.0-rc.1-354-g4e75d2b
12
- // Last commit: 4e75d2b (2013-04-09 16:28:08 -0700)
11
+ // Version: v1.0.0-rc.2-2-gd22a11b
12
+ // Last commit: d22a11b (2013-07-25 20:15:17 -0400)
13
13
 
14
14
 
15
- (function(){var e,t;(function(){var n={},r={};e=function(e,t,r){n[e]={deps:t,callback:r}},t=function(e){if(r[e])return r[e];r[e]={};var i=n[e],s=i.deps,o=i.callback,u=[],a;for(var f=0,l=s.length;f<l;f++)s[f]==="exports"?u.push(a={}):u.push(t(s[f]));var c=o.apply(this,u);return r[e]=a||c}})(),function(){function r(t){if(e.console&&e.console[t])return e.console[t].apply?function(){e.console[t].apply(e.console,arguments)}:function(){var n=Array.prototype.join.call(arguments,", ");e.console[t](n)}}"undefined"==typeof Ember&&(Ember={});var e=Ember.imports=Ember.imports||this,t=Ember.exports=Ember.exports||this,n=Ember.lookup=Ember.lookup||this;t.Em=t.Ember=Em=Ember,Ember.isNamespace=!0,Ember.toString=function(){return"Ember"},Ember.VERSION="1.0.0-rc.2",Ember.ENV=Ember.ENV||("undefined"==typeof ENV?{}:ENV),Ember.config=Ember.config||{},Ember.EXTEND_PROTOTYPES=Ember.ENV.EXTEND_PROTOTYPES,typeof Ember.EXTEND_PROTOTYPES=="undefined"&&(Ember.EXTEND_PROTOTYPES=!0),Ember.LOG_STACKTRACE_ON_DEPRECATION=Ember.ENV.LOG_STACKTRACE_ON_DEPRECATION!==!1,Ember.SHIM_ES5=Ember.ENV.SHIM_ES5===!1?!1:Ember.EXTEND_PROTOTYPES,Ember.LOG_VERSION=Ember.ENV.LOG_VERSION===!1?!1:!0,Ember.K=function(){return this},"undefined"==typeof Ember.assert&&(Ember.assert=Ember.K),"undefined"==typeof Ember.warn&&(Ember.warn=Ember.K),"undefined"==typeof Ember.debug&&(Ember.debug=Ember.K),"undefined"==typeof Ember.deprecate&&(Ember.deprecate=Ember.K),"undefined"==typeof Ember.deprecateFunc&&(Ember.deprecateFunc=function(e,t){return t}),Ember.uuid=0,Ember.Logger={log:r("log")||Ember.K,warn:r("warn")||Ember.K,error:r("error")||Ember.K,info:r("info")||Ember.K,debug:r("debug")||r("info")||Ember.K},Ember.onerror=null,Ember.handleErrors=function(e,t){if("function"!=typeof Ember.onerror)return e.call(t||this);try{return e.call(t||this)}catch(n){Ember.onerror(n)}},Ember.merge=function(e,t){for(var n in t){if(!t.hasOwnProperty(n))continue;e[n]=t[n]}return e},Ember.isNone=function(e){return e===null||e===undefined},Ember.none=Ember.deprecateFunc("Ember.none is deprecated. Please use Ember.isNone instead.",Ember.isNone),Ember.isEmpty=function(e){return e===null||e===undefined||e.length===0&&typeof e!="function"||typeof e=="object"&&Ember.get(e,"length")===0},Ember.empty=Ember.deprecateFunc("Ember.empty is deprecated. Please use Ember.isEmpty instead.",Ember.isEmpty)}(),function(){var e=Ember.platform={};Ember.create=Object.create;if(!Ember.create||Ember.ENV.STUB_OBJECT_CREATE){var t=function(){};Ember.create=function(e,n){t.prototype=e,e=new t;if(n){t.prototype=e;for(var r in n)t.prototype[r]=n[r].value;e=new t}return t.prototype=null,e},Ember.create.isSimulated=!0}var n=Object.defineProperty,r,i;if(n)try{n({},"a",{get:function(){}})}catch(s){n=null}n&&(r=function(){var e={};return n(e,"a",{configurable:!0,enumerable:!0,get:function(){},set:function(){}}),n(e,"a",{configurable:!0,enumerable:!0,writable:!0,value:!0}),e.a===!0}(),i=function(){try{return n(document.createElement("div"),"definePropertyOnDOM",{}),!0}catch(e){}return!1}(),r?i||(n=function(e,t,n){var r;return typeof Node=="object"?r=e instanceof Node:r=typeof e=="object"&&typeof e.nodeType=="number"&&typeof e.nodeName=="string",r?e[t]=n.value:Object.defineProperty(e,t,n)}):n=null),e.defineProperty=n,e.hasPropertyAccessors=!0,e.defineProperty||(e.hasPropertyAccessors=!1,e.defineProperty=function(e,t,n){n.get||(e[t]=n.value)},e.defineProperty.isSimulated=!0),Ember.ENV.MANDATORY_SETTER&&!e.hasPropertyAccessors&&(Ember.ENV.MANDATORY_SETTER=!1)}(),function(){var e=Ember.EnumerableUtils={map:function(e,t,n){return e.map?e.map.call(e,t,n):Array.prototype.map.call(e,t,n)},forEach:function(e,t,n){return e.forEach?e.forEach.call(e,t,n):Array.prototype.forEach.call(e,t,n)},indexOf:function(e,t,n){return e.indexOf?e.indexOf.call(e,t,n):Array.prototype.indexOf.call(e,t,n)},indexesOf:function(t,n){return n===undefined?[]:e.map(n,function(n){return e.indexOf(t,n)})},addObject:function(t,n){var r=e.indexOf(t,n);r===-1&&t.push(n)},removeObject:function(t,n){var r=e.indexOf(t,n);r!==-1&&t.splice(r,1)},replace:function(e,t,n,r){if(e.replace)return e.replace(t,n,r);var i=Array.prototype.concat.apply([t,n],r);return e.splice.apply(e,i)},intersection:function(e,t){var n=[];return e.forEach(function(e){t.indexOf(e)>=0&&n.push(e)}),n}}}(),function(){var e=function(e){return e&&Function.prototype.toString.call(e).indexOf("[native code]")>-1},t=e(Array.prototype.map)?Array.prototype.map:function(e){if(this===void 0||this===null)throw new TypeError;var t=Object(this),n=t.length>>>0;if(typeof e!="function")throw new TypeError;var r=new Array(n),i=arguments[1];for(var s=0;s<n;s++)s in t&&(r[s]=e.call(i,t[s],s,t));return r},n=e(Array.prototype.forEach)?Array.prototype.forEach:function(e){if(this===void 0||this===null)throw new TypeError;var t=Object(this),n=t.length>>>0;if(typeof e!="function")throw new TypeError;var r=arguments[1];for(var i=0;i<n;i++)i in t&&e.call(r,t[i],i,t)},r=e(Array.prototype.indexOf)?Array.prototype.indexOf:function(e,t){t===null||t===undefined?t=0:t<0&&(t=Math.max(0,this.length+t));for(var n=t,r=this.length;n<r;n++)if(this[n]===e)return n;return-1};Ember.ArrayPolyfills={map:t,forEach:n,indexOf:r},Ember.SHIM_ES5&&(Array.prototype.map||(Array.prototype.map=t),Array.prototype.forEach||(Array.prototype.forEach=n),Array.prototype.indexOf||(Array.prototype.indexOf=r))}(),function(){function h(e){this.descs={},this.watching={},this.cache={},this.source=e}function p(e,t){return!!e&&typeof e[t]=="function"}var e=Ember.platform.defineProperty,t=Ember.create,n="__ember"+ +(new Date),r=0,i=[],s={},o=Ember.ENV.MANDATORY_SETTER;Ember.GUID_KEY=n;var u={writable:!1,configurable:!1,enumerable:!1,value:null};Ember.generateGuid=function(i,s){s||(s="ember");var o=s+r++;return i&&(u.value=o,e(i,n,u)),o},Ember.guidFor=function(o){if(o===undefined)return"(undefined)";if(o===null)return"(null)";var a,f,l=typeof o;switch(l){case"number":return f=i[o],f||(f=i[o]="nu"+o),f;case"string":return f=s[o],f||(f=s[o]="st"+r++),f;case"boolean":return o?"(true)":"(false)";default:if(o[n])return o[n];if(o===Object)return"(Object)";if(o===Array)return"(Array)";return f="ember"+r++,u.value=f,e(o,n,u),f}};var a={writable:!0,configurable:!1,enumerable:!1,value:null},f=Ember.GUID_KEY+"_meta";Ember.META_KEY=f;var l={descs:{},watching:{}};o&&(l.values={}),Ember.EMPTY_META=l,Object.freeze&&Object.freeze(l);var c=Ember.platform.defineProperty.isSimulated;c&&(h.prototype.__preventPlainObject__=!0,h.prototype.toJSON=function(){}),Ember.meta=function(r,i){var s=r[f];return i===!1?s||l:(s?s.source!==r&&(c||e(r,f,a),s=t(s),s.descs=t(s.descs),s.watching=t(s.watching),s.cache={},s.source=r,o&&(s.values=t(s.values)),r[f]=s):(c||e(r,f,a),s=new h(r),o&&(s.values={}),r[f]=s,s.descs.constructor=null),s)},Ember.getMeta=function(t,n){var r=Ember.meta(t,!1);return r[n]},Ember.setMeta=function(t,n,r){var i=Ember.meta(t,!0);return i[n]=r,r},Ember.metaPath=function(n,r,i){var s=Ember.meta(n,i),o,u;for(var a=0,f=r.length;a<f;a++){o=r[a],u=s[o];if(!u){if(!i)return undefined;u=s[o]={__ember_source__:n}}else if(u.__ember_source__!==n){if(!i)return undefined;u=s[o]=t(u),u.__ember_source__=n}s=u}return u},Ember.wrap=function(e,t){function n(){}function r(){var r,i=this._super;return this._super=t||n,r=e.apply(this,arguments),this._super=i,r}return r.wrappedFunction=e,r.__ember_observes__=e.__ember_observes__,r.__ember_observesBefore__=e.__ember_observesBefore__,r},Ember.isArray=function(e){return!e||e.setInterval?!1:Array.isArray&&Array.isArray(e)?!0:Ember.Array&&Ember.Array.detect(e)?!0:e.length!==undefined&&"object"==typeof e?!0:!1},Ember.makeArray=function(e){return e===null||e===undefined?[]:Ember.isArray(e)?e:[e]},Ember.canInvoke=p,Ember.tryInvoke=function(e,t,n){if(p(e,t))return e[t].apply(e,n||[])};var d=function(){var e=0;try{try{}finally{throw e++,new Error("needsFinallyFixTest")}}catch(t){}return e!==1}();d?Ember.tryFinally=function(e,t,n){var r,i,s;n=n||this;try{r=e.call(n)}finally{try{i=t.call(n)}catch(o){s=o}}if(s)throw s;return i===undefined?r:i}:Ember.tryFinally=function(e,t,n){var r,i;n=n||this;try{r=e.call(n)}finally{i=t.call(n)}return i===undefined?r:i},d?Ember.tryCatchFinally=function(e,t,n,r){var i,s,o,u;r=r||this;try{i=e.call(r)}catch(a){i=t.call(r,a)}finally{try{s=n.call(r)}catch(f){o=f}}if(o)throw o;return s===undefined?i:s}:Ember.tryCatchFinally=function(e,t,n,r){var i,s;r=r||this;try{i=e.call(r)}catch(o){i=t.call(r,o)}finally{s=n.call(r)}return s===undefined?i:s};var v={},m="Boolean Number String Function Array Date RegExp Object".split(" ");Ember.ArrayPolyfills.forEach.call(m,function(e){v["[object "+e+"]"]=e.toLowerCase()});var g=Object.prototype.toString;Ember.typeOf=function(e){var t;return t=e===null||e===undefined?String(e):v[g.call(e)]||"object",t==="function"?Ember.Object&&Ember.Object.detect(e)&&(t="class"):t==="object"&&(e instanceof Error?t="error":Ember.Object&&e instanceof Ember.Object?t="instance":t="object"),t}}(),function(){Ember.Instrumentation={};var e=[],t={},n=function(n){var r=[],i;for(var s=0,o=e.length;s<o;s++)i=e[s],i.regex.test(n)&&r.push(i.object);return t[n]=r,r},r=function(){var e="undefined"!=typeof window?window.performance||{}:{},t=e.now||e.mozNow||e.webkitNow||e.msNow||e.oNow;return t?t.bind(e):function(){return+(new Date)}}();Ember.Instrumentation.instrument=function(e,i,s,o){function d(){for(h=0,p=u.length;h<p;h++)c=u[h],l[h]=c.before(e,r(),i);return s.call(o)}function v(e){i=i||{},i.exception=e}function m(){for(h=0,p=u.length;h<p;h++)c=u[h],c.after(e,r(),i,l[h]);Ember.STRUCTURED_PROFILE&&console.timeEnd(a)}var u=t[e],a,f;Ember.STRUCTURED_PROFILE&&(a=e+": "+i.object,console.time(a)),u||(u=n(e));if(u.length===0)return f=s.call(o),Ember.STRUCTURED_PROFILE&&console.timeEnd(a),f;var l=[],c,h,p;return Ember.tryCatchFinally(d,v,m)},Ember.Instrumentation.subscribe=function(n,r){var i=n.split("."),s,o=[];for(var u=0,a=i.length;u<a;u++)s=i[u],s==="*"?o.push("[^\\.]*"):o.push(s);o=o.join("\\."),o+="(\\..*)?";var f={pattern:n,regex:new RegExp("^"+o+"$"),object:r};return e.push(f),t={},f},Ember.Instrumentation.unsubscribe=function(n){var r;for(var i=0,s=e.length;i<s;i++)e[i]===n&&(r=i);e.splice(r,1),t={}},Ember.Instrumentation.reset=function(){e=[],t={}},Ember.instrument=Ember.Instrumentation.instrument,Ember.subscribe=Ember.Instrumentation.subscribe}(),function(){var e=Ember.guidFor,t=Ember.ArrayPolyfills.indexOf,n=function(e){var t={};for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t},r=function(e,t){var r=e.keys.copy(),i=n(e.values);return t.keys=r,t.values=i,t},i=Ember.OrderedSet=function(){this.clear()};i.create=function(){return new i},i.prototype={clear:function(){this.presenceSet={},this.list=[]},add:function(t){var n=e(t),r=this.presenceSet,i=this.list;if(n in r)return;r[n]=!0,i.push(t)},remove:function(n){var r=e(n),i=this.presenceSet,s=this.list;delete i[r];var o=t.call(s,n);o>-1&&s.splice(o,1)},isEmpty:function(){return this.list.length===0},has:function(t){var n=e(t),r=this.presenceSet;return n in r},forEach:function(e,t){var n=this.list.slice();for(var r=0,i=n.length;r<i;r++)e.call(t,n[r])},toArray:function(){return this.list.slice()},copy:function(){var e=new i;return e.presenceSet=n(this.presenceSet),e.list=this.list.slice(),e}};var s=Ember.Map=function(){this.keys=Ember.OrderedSet.create(),this.values={}};s.create=function(){return new s},s.prototype={get:function(t){var n=this.values,r=e(t);return n[r]},set:function(t,n){var r=this.keys,i=this.values,s=e(t);r.add(t),i[s]=n},remove:function(t){var n=this.keys,r=this.values,i=e(t),s;return r.hasOwnProperty(i)?(n.remove(t),s=r[i],delete r[i],!0):!1},has:function(t){var n=this.values,r=e(t);return n.hasOwnProperty(r)},forEach:function(t,n){var r=this.keys,i=this.values;r.forEach(function(r){var s=e(r);t.call(n,r,i[s])})},copy:function(){return r(this,new s)}};var o=Ember.MapWithDefault=function(e){s.call(this),this.defaultValue=e.defaultValue};o.create=function(e){return e?new o(e):new s},o.prototype=Ember.create(s.prototype),o.prototype.get=function(e){var t=this.has(e);if(t)return s.prototype.get.call(this,e);var n=this.defaultValue(e);return this.set(e,n),n},o.prototype.copy=function(){return r(this,new o({defaultValue:this.defaultValue}))}}(),function(){function o(e){return e.match(s)[0]}function u(e,n){var s=i.test(n),u=!s&&r.test(n),a;if(!e||u)e=Ember.lookup;s&&(n=n.slice(5)),e===Ember.lookup&&(a=o(n),e=t(e,a),n=n.slice(a.length+1));if(!n||n.length===0)throw new Error("Invalid Path");return[e,n]}var e=Ember.META_KEY,t,n=Ember.ENV.MANDATORY_SETTER,r=/^([A-Z$]|([0-9][A-Z$])).*[\.\*]/,i=/^this[\.\*]/,s=/^([^\.\*]+)/;t=function(r,i){if(i==="")return r;!i&&"string"==typeof r&&(i=r,r=null);if(!r||i.indexOf(".")!==-1)return a(r,i);var s=r[e],o=s&&s.descs[i],u;return o?o.get(r,i):(n&&s&&s.watching[i]>0?u=s.values[i]:u=r[i],u!==undefined||"object"!=typeof r||i in r||"function"!=typeof r.unknownProperty?u:r.unknownProperty(i))},Ember.config.overrideAccessors&&(Ember.get=t,Ember.config.overrideAccessors(),t=Ember.get);var a=Ember._getPath=function(e,n){var r,s,o,a,f;if(e===null&&n.indexOf(".")===-1)return t(Ember.lookup,n);r=i.test(n);if(!e||r)o=u(e,n),e=o[0],n=o[1],o.length=0;s=n.split("."),f=s.length;for(a=0;e&&a<f;a++){e=t(e,s[a],!0);if(e&&e.isDestroyed)return undefined}return e};Ember.normalizeTuple=function(e,t){return u(e,t)},Ember.getWithDefault=function(e,n,r){var i=t(e,n);return i===undefined?r:i},Ember.get=t,Ember.getPath=Ember.deprecateFunc("getPath is deprecated since get now supports paths",Ember.get)}(),function(){function r(e,t,n){var r=-1;for(var i=0,s=e.length;i<s;i++)if(t===e[i][0]&&n===e[i][1]){r=i;break}return r}function i(n,r){var i=t(n,!0),s;return i.listeners||(i.listeners={}),i.hasOwnProperty("listeners")||(i.listeners=e(i.listeners)),s=i.listeners[r],s&&!i.listeners.hasOwnProperty(r)?s=i.listeners[r]=i.listeners[r].slice():s||(s=i.listeners[r]=[]),s}function s(e,t,i){var s=e[n],o=s&&s.listeners&&s.listeners[t];if(!o)return;for(var u=o.length-1;u>=0;u--){var a=o[u][0],f=o[u][1],l=o[u][2],c=o[u][3],h=r(i,a,f);h===-1&&i.push([a,f,l,c])}}function o(e,t,i){var s=e[n],o=s&&s.listeners&&s.listeners[t],u=[];if(!o)return;for(var a=o.length-1;a>=0;a--){var f=o[a][0],l=o[a][1],c=o[a][2],h=o[a][3],p=r(i,f,l);if(p!==-1)continue;i.push([f,l,c,h]),u.push([f,l,c,h])}return u}function u(e,t,n,s,o){!s&&"function"==typeof n&&(s=n,n=null);var u=i(e,t),a=r(u,n,s);if(a!==-1)return;u.push([n,s,o,undefined]),"function"==typeof e.didAddListener&&e.didAddListener(t,n,s)}function a(e,t,s,o){function u(n,s,o){var u=i(e,t),a=r(u,n,s);if(a===-1)return;u.splice(a,1),"function"==typeof e.didRemoveListener&&e.didRemoveListener(t,n,s)}!o&&"function"==typeof s&&(o=s,s=null);if(o)u(s,o);else{var a=e[n],f=a&&a.listeners&&a.listeners[t];if(!f)return;for(var l=f.length-1;l>=0;l--)u(f[l][0],f[l][1])}}function f(e,t,n,s,o){function l(){return o.call(n)}function c(){f&&(f[3]=undefined)}!s&&"function"==typeof n&&(s=n,n=null);var u=i(e,t),a=r(u,n,s),f;return a!==-1&&(f=u[a].slice(),f[3]=!0,u[a]=f),Ember.tryFinally(l,c)}function l(e,t,n,s,o){function d(){return o.call(n)}function v(){for(c=0,h=u.length;c<h;c++)u[c][3]=undefined}!s&&"function"==typeof n&&(s=n,n=null);var u=[],a,f,l,c,h;for(c=0,h=t.length;c<h;c++){a=t[c],f=i(e,a);var p=r(f,n,s);p!==-1&&(l=f[p].slice(),l[3]=!0,f[p]=l,u.push(l))}return Ember.tryFinally(d,v)}function c(e){var t=e[n].listeners,r=[];if(t)for(var i in t)t[i]&&r.push(i);return r}function h(e,t,r,i){e!==Ember&&"function"==typeof e.sendEvent&&e.sendEvent(t,r);if(!i){var s=e[n];i=s&&s.listeners&&s.listeners[t]}if(!i)return;for(var o=i.length-1;o>=0;o--){if(!i[o]||i[o][3]===!0)continue;var u=i[o][0],f=i[o][1],l=i[o][2];l&&a(e,t,u,f),u||(u=e),"string"==typeof f&&(f=u[f]),r?f.apply(u,r):f.call(u)}return!0}function p(e,t){var r=e[n],i=r&&r.listeners&&r.listeners[t];return!!i&&!!i.length}function d(e,t){var r=[],i=e[n],s=i&&i.listeners&&i.listeners[t];if(!s)return r;for(var o=0,u=s.length;o<u;o++){var a=s[o][0],f=s[o][1];r.push([a,f])}return r}var e=Ember.create,t=Ember.meta,n=Ember.META_KEY;Ember.addListener=u,Ember.removeListener=a,Ember._suspendListener=f,Ember._suspendListeners=l,Ember.sendEvent=h,Ember.hasListeners=p,Ember.watchedEvents=c,Ember.listenersFor=d,Ember.listenersDiff=o,Ember.listenersUnion=s}(),function(){var e=Ember.guidFor,t=Ember.sendEvent,n=Ember._ObserverSet=function(){this.clear()};n.prototype.add=function(t,n,r){var i=this.observerSet,s=this.observers,o=e(t),u=i[o],a;return u||(i[o]=u={}),a=u[n],a===undefined&&(a=s.push({sender:t,keyName:n,eventName:r,listeners:[]})-1,u[n]=a),s[a].listeners},n.prototype.flush=function(){var e=this.observers,n,r,i,s;this.clear();for(n=0,r=e.length;n<r;++n){i=e[n],s=i.sender;if(s.isDestroying||s.isDestroyed)continue;t(s,i.eventName,[s,i.keyName],i.listeners)}},n.prototype.clear=function(){this.observerSet={},this.observers=[]}}(),function(){function d(e,t,n){if(e.isDestroying)return;var r=h,i=!r;i&&(r=h={}),m(l,e,t,r,n),i&&(h=null)}function v(e,t,n){if(e.isDestroying)return;var r=p,i=!r;i&&(r=p={}),m(c,e,t,r,n),i&&(p=null)}function m(e,n,r,i,s){var o=t(n);i[o]||(i[o]={});if(i[o][r])return;i[o][r]=!0;var u=s.deps;u=u&&u[r];if(u)for(var a in u){var f=s.descs[a];if(f&&f._suspended===n)continue;e(n,a)}}var e=Ember.meta,t=Ember.guidFor,n=Ember.tryFinally,r=Ember.sendEvent,i=Ember.listenersUnion,s=Ember.listenersDiff,o=Ember._ObserverSet,u=new o,a=new o,f=0,l=Ember.propertyWillChange=function(t,n){var r=e(t,!1),i=r.watching[n]>0||n==="length",s=r.proto,o=r.descs[n];if(!i)return;if(s===t)return;o&&o.willChange&&o.willChange(t,n),d(t,n,r),g(t,n,r),S(t,n)},c=Ember.propertyDidChange=function(t,n){var r=e(t,!1),i=r.watching[n]>0||n==="length",s=r.proto,o=r.descs[n];if(s===t)return;o&&o.didChange&&o.didChange(t,n);if(!i&&n!=="length")return;v(t,n,r),y(t,n,r),x(t,n)},h,p,g=function(e,t,n,r){if(!n.hasOwnProperty("chainWatchers"))return;var i=n.chainWatchers;i=i[t];if(!i)return;for(var s=0,o=i.length;s<o;s++)i[s].willChange(r)},y=function(e,t,n,r){if(!n.hasOwnProperty("chainWatchers"))return;var i=n.chainWatchers;i=i[t];if(!i)return;for(var s=i.length-1;s>=0;s--)i[s].didChange(r)};Ember.overrideChains=function(e,t,n){y(e,t,n,!0)};var b=Ember.beginPropertyChanges=function(){f++},w=Ember.endPropertyChanges=function(){f--,f<=0&&(u.clear(),a.flush())},E=Ember.changeProperties=function(e,t){b(),n(e,w,t)},S=function(e,t){if(e.isDestroying)return;var n=t+":before",i,o;f?(i=u.add(e,t,n),o=s(e,n,i),r(e,n,[e,t],o)):r(e,n,[e,t])},x=function(e,t){if(e.isDestroying)return;var n=t+":change",s;f?(s=a.add(e,t,n),i(e,n,s)):r(e,n,[e,t])}}(),function(){function u(e,t,n,r){var i;i=t.slice(t.lastIndexOf(".")+1),t=t.slice(0,t.length-(i.length+1)),t!=="this"&&(e=s(e,t));if(!i||i.length===0)throw new Error("You passed an empty path");if(!e){if(r)return;throw new Error("Object in path "+t+" could not be found or was destroyed.")}return o(e,i,n)}var e=Ember.META_KEY,t=Ember.ENV.MANDATORY_SETTER,n=/^([A-Z$]|([0-9][A-Z$]))/,r=Ember.propertyWillChange,i=Ember.propertyDidChange,s=Ember._getPath,o=function(r,i,s,o){typeof r=="string"&&(s=i,i=r,r=null);if(!r||i.indexOf(".")!==-1)return u(r,i,s,o);var a=r[e],f=a&&a.descs[i],l,c;return f?f.set(r,i,s):(l="object"==typeof r&&!(i in r),l&&"function"==typeof r.setUnknownProperty?r.setUnknownProperty(i,s):a&&a.watching[i]>0?(t?c=a.values[i]:c=r[i],s!==c&&(Ember.propertyWillChange(r,i),t?c!==undefined||i in r?a.values[i]=s:Ember.defineProperty(r,i,null,s):r[i]=s,Ember.propertyDidChange(r,i))):r[i]=s),s};Ember.config.overrideAccessors&&(Ember.set=o,Ember.config.overrideAccessors(),o=Ember.set),Ember.set=o,Ember.setPath=Ember.deprecateFunc("setPath is deprecated since set now supports paths",Ember.set),Ember.trySet=function(e,t,n){return o(e,t,n,!0)},Ember.trySetPath=Ember.deprecateFunc("trySetPath has been renamed to trySet",Ember.trySet)}(),function(){var e=Ember.META_KEY,t=Ember.meta,n=Ember.platform.defineProperty,r=Ember.ENV.MANDATORY_SETTER,i=Ember.Descriptor=function(){},s=Ember.MANDATORY_SETTER_FUNCTION=function(e){},o=Ember.DEFAULT_GETTER_FUNCTION=function(t){return function(){var n=this[e];return n&&n.values[t]}};Ember.defineProperty=function(e,i,u,a,f){var l,c,h,p;return f||(f=t(e)),l=f.descs,c=f.descs[i],h=f.watching[i]>0,c instanceof Ember.Descriptor&&c.teardown(e,i),u instanceof Ember.Descriptor?(p=u,l[i]=u,r&&h?n(e,i,{configurable:!0,enumerable:!0,writable:!0,value:undefined}):e[i]=undefined,u.setup(e,i)):(l[i]=undefined,u==null?(p=a,r&&h?(f.values[i]=a,n(e,i,{configurable:!0,enumerable:!0,set:s,get:o(i)})):e[i]=a):(p=u,n(e,i,u))),h&&Ember.overrideChains(e,i,f),e.didDefineProperty&&e.didDefineProperty(e,i,p),this}}(),function(){var e=Ember.changeProperties,t=Ember.set;Ember.setProperties=function(n,r){return e(function(){for(var e in r)r.hasOwnProperty(e)&&t(n,e,r[e])}),n}}(),function(){var e=Ember.meta,t=Ember.typeOf,n=Ember.ENV.MANDATORY_SETTER,r=Ember.platform.defineProperty;Ember.watchKey=function(i,s){if(s==="length"&&t(i)==="array")return;var o=e(i),u=o.watching,a;u[s]?u[s]=(u[s]||0)+1:(u[s]=1,a=o.descs[s],a&&a.willWatch&&a.willWatch(i,s),"function"==typeof i.willWatchProperty&&i.willWatchProperty(s),n&&s in i&&(o.values[s]=i[s],r(i,s,{configurable:!0,enumerable:!0,set:Ember.MANDATORY_SETTER_FUNCTION,get:Ember.DEFAULT_GETTER_FUNCTION(s)})))},Ember.unwatchKey=function(t,i){var s=e(t),o=s.watching,u;o[i]===1?(o[i]=0,u=s.descs[i],u&&u.didUnwatch&&u.didUnwatch(t,i),"function"==typeof t.didUnwatchProperty&&t.didUnwatchProperty(i),n&&i in t&&(r(t,i,{configurable:!0,enumerable:!0,writable:!0,value:s.values[i]}),delete s.values[i])):o[i]>1&&o[i]--}}(),function(){function l(e){return e.match(f)[0]}function h(t,n,r){if(!t||"object"!=typeof t)return;var i=e(t),o=i.chainWatchers;i.hasOwnProperty("chainWatchers")||(o=i.chainWatchers={}),o[n]||(o[n]=[]),o[n].push(r),s(t,n)}function d(t){return e(t,!1).proto===t}var e=Ember.meta,t=Ember.get,n=Ember.normalizeTuple,r=Ember.ArrayPolyfills.forEach,i=Ember.warn,s=Ember.watchKey,o=Ember.unwatchKey,u=Ember.propertyWillChange,a=Ember.propertyDidChange,f=/^([^\.\*]+)/,c=[];Ember.flushPendingChains=function(){if(c.length===0)return;var e=c;c=[],r.call(e,function(e){e[0].add(e[1])}),i("Watching an undefined global, Ember expects watched globals to be setup by the time the run loop is flushed, check for typos",c.length===0)};var p=Ember.removeChainWatcher=function(t,n,r){if(!t||"object"!=typeof t)return;var i=e(t,!1);if(!i.hasOwnProperty("chainWatchers"))return;var s=i.chainWatchers;if(s[n]){s=s[n];for(var u=0,a=s.length;u<a;u++)s[u]===r&&s.splice(u,1)}o(t,n)},v=Ember._ChainNode=function(e,t,n){var r;this._parent=e,this._key=t,this._watching=n===undefined,this._value=n,this._paths={},this._watching&&(this._object=e.value(),this._object&&h(this._object,this._key,this)),this._parent&&this._parent._key==="@each"&&this.value()},m=v.prototype;m.value=function(){if(this._value===undefined&&this._watching){var e=this._parent.value();this._value=e&&!d(e)?t(e,this._key):undefined}return this._value},m.destroy=function(){if(this._watching){var e=this._object;e&&p(e,this._key,this),this._watching=!1}},m.copy=function(e){var t=new v(null,null,e),n=this._paths,r;for(r in n){if(n[r]<=0)continue;t.add(r)}return t},m.add=function(e){var t,r,i,s,o;o=this._paths,o[e]=(o[e]||0)+1,t=this.value(),r=n(t,e);if(r[0]&&r[0]===t)e=r[1],i=l(e),e=e.slice(i.length+1);else{if(!r[0]){c.push([this,e]),r.length=0;return}s=r[0],i=e.slice(0,0-(r[1].length+1)),e=r[1]}r.length=0,this.chain(i,e,s)},m.remove=function(e){var t,r,i,s,o;o=this._paths,o[e]>0&&o[e]--,t=this.value(),r=n(t,e),r[0]===t?(e=r[1],i=l(e),e=e.slice(i.length+1)):(s=r[0],i=e.slice(0,0-(r[1].length+1)),e=r[1]),r.length=0,this.unchain(i,e)},m.count=0,m.chain=function(e,t,n){var r=this._chains,i;r||(r=this._chains={}),i=r[e],i||(i=r[e]=new v(this,e,n)),i.count++,t&&t.length>0&&(e=l(t),t=t.slice(e.length+1),i.chain(e,t))},m.unchain=function(e,t){var n=this._chains,r=n[e];t&&t.length>1&&(e=l(t),t=t.slice(e.length+1),r.unchain(e,t)),r.count--,r.count<=0&&(delete n[r._key],r.destroy())},m.willChange=function(){var e=this._chains;if(e)for(var t in e){if(!e.hasOwnProperty(t))continue;e[t].willChange()}this._parent&&this._parent.chainWillChange(this,this._key,1)},m.chainWillChange=function(e,t,n){this._key&&(t=this._key+"."+t),this._parent?this._parent.chainWillChange(this,t,n+1):(n>1&&u(this.value(),t),t="this."+t,this._paths[t]>0&&u(this.value(),t))},m.chainDidChange=function(e,t,n){this._key&&(t=this._key+"."+t),this._parent?this._parent.chainDidChange(this,t,n+1):(n>1&&a(this.value(),t),t="this."+t,this._paths[t]>0&&a(this.value(),t))},m.didChange=function(e){if(this._watching){var t=this._parent.value();t!==this._object&&(p(this._object,this._key,this),this._object=t,h(t,this._key,this)),this._value=undefined,this._parent&&this._parent._key==="@each"&&this.value()}var n=this._chains;if(n)for(var r in n){if(!n.hasOwnProperty(r))continue;n[r].didChange(e)}if(e)return;this._parent&&this._parent.chainDidChange(this,this._key,1)},Ember.finishChains=function(t){var n=e(t,!1),r=n.chains;r&&(r.value()!==t&&(n.chains=r=r.copy(t)),r.didChange(!0))}}(),function(){function r(t){var r=e(t),i=r.chains;return i?i.value()!==t&&(i=r.chains=i.copy(t)):i=r.chains=new n(null,null,t),i}var e=Ember.meta,t=Ember.typeOf,n=Ember._ChainNode;Ember.watchPath=function(n,i){if(i==="length"&&t(n)==="array")return;var s=e(n),o=s.watching;o[i]?o[i]=(o[i]||0)+1:(o[i]=1,r(n).add(i))},Ember.unwatchPath=function(t,n){var i=e(t),s=i.watching,o;s[n]===1?(s[n]=0,r(t).remove(n)):s[n]>1&&s[n]--}}(),function(){function c(e){return e==="*"||!l.test(e)}var e=Ember.meta,t=Ember.GUID_KEY,n=Ember.META_KEY,r=Ember.removeChainWatcher,i=Ember.watchKey,s=Ember.unwatchKey,o=Ember.watchPath,u=Ember.unwatchPath,a=Ember.typeOf,f=Ember.generateGuid,l=/[\.\*]/;Ember.watch=function(e,t){if(t==="length"&&a(e)==="array")return;c(t)?i(e,t):o(e,t)},Ember.isWatching=function(t,r){var i=t[n];return(i&&i.watching[r])>0},Ember.watch.flushPending=Ember.flushPendingChains,Ember.unwatch=function(e,t){if(t==="length"&&a(e)==="array")return;c(t)?s(e,t):u(e,t)},Ember.rewatch=function(n){var r=e(n,!1),i=r.chains;t in n&&!n.hasOwnProperty(t)&&f(n,"ember"),i&&i.value()!==n&&(r.chains=i.copy(n))};var h=[];Ember.destroy=function(e){var t=e[n],i,s,o,u;if(t){e[n]=null,i=t.chains;if(i){h.push(i);while(h.length>0){i=h.pop(),s=i._chains;if(s)for(o in s)s.hasOwnProperty(o)&&h.push(s[o]);i._watching&&(u=i._object,u&&r(u,i._key,i))}}}}}(),function(){function a(e,t,n){var r=t[n];return r?t.hasOwnProperty(n)||(r=t[n]=i(r)):r=t[n]={},r}function f(e,t){return a(e,t,"deps")}function l(e,t,n,r){var i=e._dependentKeys,s,u,l,c,h;if(!i)return;s=f(t,r);for(u=0,l=i.length;u<l;u++)c=i[u],h=a(t,s,c),h[n]=(h[n]||0)+1,o(t,c)}function c(e,t,n,r){var i=e._dependentKeys,s,o,l,c,h;if(!i)return;s=f(t,r);for(o=0,l=i.length;o<l;o++)c=i[o],h=a(t,s,c),h[n]=(h[n]||0)-1,u(t,c)}function h(e,t){this.func=e,this._cacheable=t&&t.cacheable!==undefined?t.cacheable:!0,this._dependentKeys=t&&t.dependentKeys,this._readOnly=t&&(t.readOnly!==undefined||!!t.readOnly)}function d(t,n){var r={};for(var i=0;i<n.length;i++)r[n[i]]=e(t,n[i]);return r}function v(e,t){Ember.computed[e]=function(e){var n=r.call(arguments);return Ember.computed(e,function(){return t.apply(this,n)})}}function m(e,t){Ember.computed[e]=function(){var e=r.call(arguments),n=Ember.computed(function(){return t.apply(this,[d(this,e)])});return n.property.apply(n,e)}}var e=Ember.get,t=Ember.set,n=Ember.meta,r=[].slice,i=Ember.create,s=Ember.META_KEY,o=Ember.watch,u=Ember.unwatch;Ember.ComputedProperty=h,h.prototype=new Ember.Descriptor;var p=h.prototype;p.cacheable=function(e){return this._cacheable=e!==!1,this},p.volatile=function(){return this.cacheable(!1)},p.readOnly=function(e){return this._readOnly=e===undefined||!!e,this},p.property=function(){var e=[];for(var t=0,n=arguments.length;t<n;t++)e.push(arguments[t]);return this._dependentKeys=e,this},p.meta=function(e){return arguments.length===0?this._meta||{}:(this._meta=e,this)},p.willWatch=function(e,t){var n=e[s];t in n.cache||l(this,e,t,n)},p.didUnwatch=function(e,t){var n=e[s];t in n.cache||c(this,e,t,n)},p.didChange=function(e,t){if(this._cacheable&&this._suspended!==e){var r=n(e);t in r.cache&&(delete r.cache[t],r.watching[t]||c(this,e,t,r))}},p.get=function(e,t){var r,i,s;if(this._cacheable){s=n(e),i=s.cache;if(t in i)return i[t];r=i[t]=this.func.call(e,t),s.watching[t]||l(this,e,t,s)}else r=this.func.call(e,t);return r},p.set=function(e,t,r){var i=this._cacheable,s=this.func,o=n(e,i),u=o.watching[t],a=this._suspended,f=!1,c=o.cache,h,p;if(this._readOnly)throw new Error("Cannot Set: "+t+" on: "+e.toString());this._suspended=e;try{i&&c.hasOwnProperty(t)&&(h=c[t],f=!0),s.wrappedFunction&&(s=s.wrappedFunction);if(s.length===3)p=s.call(e,t,r,h);else{if(s.length!==2){Ember.defineProperty(e,t,null,h),Ember.set(e,t,r);return}p=s.call(e,t,r)}if(f&&h===p)return;u&&Ember.propertyWillChange(e,t),f&&delete c[t],i&&(!u&&!f&&l(this,e,t,o),c[t]=p),u&&Ember.propertyDidChange(e,t)}finally{this._suspended=a}return p},p.setup=function(e,t){var r=e[s];r&&r.watching[t]&&l(this,e,t,n(e))},p.teardown=function(e,t){var r=n(e);return(r.watching[t]||t in r.cache)&&c(this,e,t,r),this._cacheable&&delete r.cache[t],null},Ember.computed=function(e){var t;arguments.length>1&&(t=r.call(arguments,0,-1),e=r.call(arguments,-1)[0]);if(typeof e!="function")throw new Error("Computed Property declared without a property function");var n=new h(e);return t&&n.property.apply(n,t),n},Ember.cacheFor=function(t,r){var i=n(t,!1).cache;if(i&&r in i)return i[r]},v("empty",function(t){return Ember.isEmpty(e(this,t))}),v("notEmpty",function(t){return!Ember.isEmpty(e(this,t))}),v("none",function(t){return Ember.isNone(e(this,t))}),v("not",function(t){return!e(this,t)}),v("bool",function(t){return!!e(this,t)}),v("match",function(t,n){var r=e(this,t);return typeof r=="string"?!!r.match(n):!1}),v("equal",function(t,n){return e(this,t)===n}),v("gt",function(t,n){return e(this,t)>n}),v("gte",function(t,n){return e(this,t)>=n}),v("lt",function(t,n){return e(this,t)<n}),v("lte",function(t,n){return e(this,t)<=n}),m("and",function(e){for(var t in e)if(e.hasOwnProperty(t)&&!e[t])return!1;return!0}),m("or",function(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!0;return!1}),m("any",function(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return e[t];return null}),m("map",function(e){var t=[];for(var n in e)e.hasOwnProperty(n)&&(Ember.isNone(e[n])?t.push(null):t.push(e[n]));return t}),Ember.computed.alias=function(n){return Ember.computed(n,function(r,i){return arguments.length>1?(t(this,n,i),i):e(this,n)})},Ember.computed.defaultTo=function(t){return Ember.computed(function(n,r,i){var s;return arguments.length===1?i!=null?i:e(this,t):r!=null?r:e(this,t)})}}(),function(){function r(t){return t+e}function i(e){return e+t}var e=":change",t=":before",n=Ember.guidFor;Ember.addObserver=function(e,t,n,i){return Ember.addListener(e,r(t),n,i),Ember.watch(e,t),this},Ember.observersFor=function(e,t){return Ember.listenersFor(e,r(t))},Ember.removeObserver=function(e,t,n,i){return Ember.unwatch(e,t),Ember.removeListener(e,r(t),n,i),this},Ember.addBeforeObserver=function(e,t,n,r){return Ember.addListener(e,i(t),n,r),Ember.watch(e,t),this},Ember._suspendBeforeObserver=function(e,t,n,r,s){return Ember._suspendListener(e,i(t),n,r,s)},Ember._suspendObserver=function(e,t,n,i,s){return Ember._suspendListener(e,r(t),n,i,s)};var s=Ember.ArrayPolyfills.map;Ember._suspendBeforeObservers=function(e,t,n,r,o){var u=s.call(t,i);return Ember._suspendListeners(e,u,n,r,o)},Ember._suspendObservers=function(e,t,n,i,o){var u=s.call(t,r);return Ember._suspendListeners(e,u,n,i,o)},Ember.beforeObserversFor=function(e,t){return Ember.listenersFor(e,i(t))},Ember.removeBeforeObserver=function(e,t,n,r){return Ember.unwatch(e,t),Ember.removeListener(e,i(t),n,r),this}}(),function(){function n(t,n,r,i){return n===undefined&&(n=t,t=undefined),"string"==typeof n&&(n=t[n]),r&&i>0&&(r=r.length>i?e.call(r,i):null),Ember.handleErrors(function(){return n.apply(t||this,r||[])},this)}function u(){o=null,s.currentRunLoop&&s.end()}function c(){f=null,s(function(){var e=+(new Date),t=-1;for(var r in a){if(!a.hasOwnProperty(r))continue;var i=a[r];if(i&&i.expires)if(e>=i.expires)delete a[r],n(i.target,i.method,i.args,2);else if(t<0||i.expires<t)t=i.expires}t>0&&(f=setTimeout(c,t-e),l=t)})}function h(e,t){t[this.tguid]&&delete t[this.tguid][this.mguid],a[e]&&n(this.target,this.method,this.args),delete a[e]}function p(e,t,n,r){var i=Ember.guidFor(t),o=Ember.guidFor(n),u=s.autorun().onceTimers,f=u[i]&&u[i][o],l;return f&&a[f]?a[f].args=r:(l={target:t,method:n,args:r,tguid:i,mguid:o},f=Ember.guidFor(l),a[f]=l,u[i]||(u[i]={}),u[i][o]=f,s.schedule(e,l,h,f,u)),f}var e=[].slice,t=Ember.ArrayPolyfills
16
- .forEach,r,i=function(e){this._prev=e||null,this.onceTimers={}};i.prototype={end:function(){this.flush()},prev:function(){return this._prev},schedule:function(t,n,r){var i=this._queues,s;i||(i=this._queues={}),s=i[t],s||(s=i[t]=[]);var o=arguments.length>3?e.call(arguments,3):null;return s.push({target:n,method:r,args:o}),this},flush:function(e){function f(e){n(e.target,e.method,e.args)}function l(){t.call(u,f)}var i,s,o,u,a;if(!this._queues)return this;Ember.watch.flushPending();if(e)while(this._queues&&(u=this._queues[e]))this._queues[e]=null,e==="sync"?(a=Ember.LOG_BINDINGS,a&&Ember.Logger.log("Begin: Flush Sync Queue"),Ember.beginPropertyChanges(),Ember.tryFinally(l,Ember.endPropertyChanges),a&&Ember.Logger.log("End: Flush Sync Queue")):t.call(u,f);else{i=Ember.run.queues,o=i.length,s=0;e:while(s<o){e=i[s],u=this._queues&&this._queues[e],delete this._queues[e],u&&(e==="sync"?(a=Ember.LOG_BINDINGS,a&&Ember.Logger.log("Begin: Flush Sync Queue"),Ember.beginPropertyChanges(),Ember.tryFinally(l,Ember.endPropertyChanges),a&&Ember.Logger.log("End: Flush Sync Queue")):t.call(u,f));for(var c=0;c<=s;c++)if(this._queues&&this._queues[i[c]]){s=c;continue e}s++}}return r=null,this}},Ember.RunLoop=i,Ember.run=function(e,t){function i(){if(e||t)return n(e,t,r,2)}var r=arguments;return s.begin(),Ember.tryFinally(i,s.end)};var s=Ember.run;Ember.run.begin=function(){s.currentRunLoop=new i(s.currentRunLoop)},Ember.run.end=function(){function e(){s.currentRunLoop.end()}function t(){s.currentRunLoop=s.currentRunLoop.prev()}Ember.tryFinally(e,t)},Ember.run.queues=["sync","actions","destroy"],Ember.run.schedule=function(e,t,n){var r=s.autorun();r.schedule.apply(r,arguments)};var o;Ember.run.hasScheduledTimers=function(){return!!o||!!f},Ember.run.cancelTimers=function(){o&&(clearTimeout(o),o=null),f&&(clearTimeout(f),f=null),a={}},Ember.run.autorun=function(){return s.currentRunLoop||(s.begin(),o||(o=setTimeout(u,1))),s.currentRunLoop},Ember.run.sync=function(){s.autorun(),s.currentRunLoop.flush("sync")};var a={},f,l;Ember.run.later=function(t,n){var r,i,s,o,u;return arguments.length===2&&"function"==typeof t?(u=n,n=t,t=undefined,r=[t,n]):(r=e.call(arguments),u=r.pop()),i=+(new Date)+u,s={target:t,method:n,expires:i,args:r},o=Ember.guidFor(s),a[o]=s,f&&i<l&&(clearTimeout(f),f=null),f||(f=setTimeout(c,u),l=i),o},Ember.run.once=function(t,n){return p("actions",t,n,e.call(arguments,2))},Ember.run.scheduleOnce=function(t,n,r,i){return p(t,n,r,e.call(arguments,3))},Ember.run.next=function(){var t=e.call(arguments);return t.push(1),s.later.apply(this,t)},Ember.run.cancel=function(e){delete a[e]}}(),function(){function s(t,n){return e(i(n)?Ember.lookup:t,n)}function u(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])}Ember.LOG_BINDINGS=!!Ember.ENV.LOG_BINDINGS;var e=Ember.get,t=Ember.set,n=Ember.guidFor,r=/^([A-Z$]|([0-9][A-Z$]))/,i=Ember.isGlobalPath=function(e){return r.test(e)},o=function(e,t){this._direction="fwd",this._from=t,this._to=e,this._directionMap=Ember.Map.create()};o.prototype={copy:function(){var e=new o(this._to,this._from);return this._oneWay&&(e._oneWay=!0),e},from:function(e){return this._from=e,this},to:function(e){return this._to=e,this},oneWay:function(){return this._oneWay=!0,this},toString:function(){var e=this._oneWay?"[oneWay]":"";return"Ember.Binding<"+n(this)+">("+this._from+" -> "+this._to+")"+e},connect:function(e){var t=this._from,n=this._to;return Ember.trySet(e,n,s(e,t)),Ember.addObserver(e,t,this,this.fromDidChange),this._oneWay||Ember.addObserver(e,n,this,this.toDidChange),this._readyToSync=!0,this},disconnect:function(e){var t=!this._oneWay;return Ember.removeObserver(e,this._from,this,this.fromDidChange),t&&Ember.removeObserver(e,this._to,this,this.toDidChange),this._readyToSync=!1,this},fromDidChange:function(e){this._scheduleSync(e,"fwd")},toDidChange:function(e){this._scheduleSync(e,"back")},_scheduleSync:function(e,t){var n=this._directionMap,r=n.get(e);r||(Ember.run.schedule("sync",this,this._sync,e),n.set(e,t)),r==="back"&&t==="fwd"&&n.set(e,"fwd")},_sync:function(t){var n=Ember.LOG_BINDINGS;if(t.isDestroyed||!this._readyToSync)return;var r=this._directionMap,i=r.get(t),o=this._from,u=this._to;r.remove(t);if(i==="fwd"){var a=s(t,this._from);n&&Ember.Logger.log(" ",this.toString(),"->",a,t),this._oneWay?Ember.trySet(t,u,a):Ember._suspendObserver(t,u,this,this.toDidChange,function(){Ember.trySet(t,u,a)})}else if(i==="back"){var f=e(t,this._to);n&&Ember.Logger.log(" ",this.toString(),"<-",f,t),Ember._suspendObserver(t,o,this,this.fromDidChange,function(){Ember.trySet(Ember.isGlobalPath(o)?Ember.lookup:t,o,f)})}}},u(o,{from:function(){var e=this,t=new e;return t.from.apply(t,arguments)},to:function(){var e=this,t=new e;return t.to.apply(t,arguments)},oneWay:function(e,t){var n=this,r=new n(null,e);return r.oneWay(t)}}),Ember.Binding=o,Ember.bind=function(e,t,n){return(new Ember.Binding(t,n)).connect(e)},Ember.oneWay=function(e,t,n){return(new Ember.Binding(t,n)).oneWay().connect(e)}}(),function(){function l(e){var t=Ember.meta(e,!0),n=t.mixins;return n?t.hasOwnProperty("mixins")||(n=t.mixins=u(n)):n=t.mixins={},n}function c(t,n){return n&&n.length>0&&(t.mixins=r.call(n,function(t){if(t instanceof e)return t;var n=new e;return n.properties=t,n})),t}function h(e){return"function"==typeof e&&e.isMethod!==!1&&e!==Boolean&&e!==Object&&e!==Number&&e!==Array&&e!==Date&&e!==String}function d(t,n){var r;return n instanceof e?(r=f(n),t[r]?p:(t[r]=n,n.properties)):n}function v(e,t,n){var r;return r=t.concatenatedProperties||n.concatenatedProperties,e.concatenatedProperties&&(r=r?r.concat(e.concatenatedProperties):e.concatenatedProperties),r}function m(e,t,n,r,i){var s;return r[t]===undefined&&(s=i[t]),s=s||e.descs[t],!!s&&s instanceof Ember.ComputedProperty?(n=u(n),n.func=Ember.wrap(n.func,s.func),n):n}function g(e,t,n,r,i){var s;return i[t]===undefined&&(s=r[t]),s=s||e[t],"function"!=typeof s?n:Ember.wrap(n,s)}function y(e,t,n,r){var i=r[t]||e[t];return i?"function"==typeof i.concat?i.concat(n):Ember.makeArray(i).concat(n):Ember.makeArray(n)}function b(e,n,r,s,o,u,a){if(r instanceof Ember.Descriptor){if(r===t&&o[n])return p;r.func&&(r=m(s,n,r,u,o)),o[n]=r,u[n]=undefined}else{if(h(r))r=g(e,n,r,u,o);else if(a&&i.call(a,n)>=0||n==="concatenatedProperties")r=y(e,n,r,u);o[n]=undefined,u[n]=r}}function w(e,t,n,r,i,o){function h(e){delete n[e],delete r[e]}var u,a,f,l,c;for(var m=0,g=e.length;m<g;m++){u=e[m],a=d(t,u);if(a===p)continue;if(a){c=Ember.meta(i),l=v(a,r,i);for(f in a){if(!a.hasOwnProperty(f))continue;o.push(f),b(i,f,a[f],c,n,r,l)}a.hasOwnProperty("toString")&&(i.toString=a.toString)}else u.mixins&&(w(u.mixins,t,n,r,i,o),u._without&&s.call(u._without,h))}}function E(e){var t=Ember.meta(e),n=t.required;if(!n||!t.hasOwnProperty("required"))n=t.required=n?u(n):{};return n}function x(e,t,n,r){if(S.test(t)){var i=r.bindings;i?r.hasOwnProperty("bindings")||(i=r.bindings=u(r.bindings)):i=r.bindings={},i[t]=n}}function T(e,t){var n=t.bindings,r,i,s;if(n){for(r in n)i=n[r],i&&(s=r.slice(0,-7),i instanceof Ember.Binding?(i=i.copy(),i.to(s)):i=new Ember.Binding(s,i),i.connect(e),e[r]=i);t.bindings={}}}function N(e,t){return T(e,t||Ember.meta(e)),e}function C(e,t,n,r,i){var s=t.methodName,o;return r[s]||i[s]?(o=i[s],t=r[s]):n.descs[s]?(t=n.descs[s],o=undefined):(t=undefined,o=e[s]),{desc:t,value:o}}function k(e,t,n,r,i){if("function"!=typeof n)return;var s=n[r];if(s)for(var o=0,u=s.length;o<u;o++)Ember[i](e,s[o],null,t)}function L(e,t,n){var r=e[t];k(e,t,r,"__ember_observesBefore__","removeBeforeObserver"),k(e,t,r,"__ember_observes__","removeObserver"),k(e,t,n,"__ember_observesBefore__","addBeforeObserver"),k(e,t,n,"__ember_observes__","addObserver")}function A(e,r,i){var s={},o={},u=Ember.meta(e),f,c,h,p=[];w(r,l(e),s,o,e,p);for(var d=0,v=p.length;d<v;d++){f=p[d];if(f==="constructor"||!o.hasOwnProperty(f))continue;h=s[f],c=o[f];if(h===t)continue;while(h&&h instanceof n){var m=C(e,h,u,s,o);h=m.desc,c=m.value}if(h===undefined&&c===undefined)continue;L(e,f,c),x(e,f,c,u),a(e,f,h,c,u)}return i||N(e,u),e}function M(e,t,n){var r=f(e);if(n[r])return!1;n[r]=!0;if(e===t)return!0;var i=e.mixins,s=i?i.length:0;while(--s>=0)if(M(i[s],t,n))return!0;return!1}function _(e,t,n){if(n[f(t)])return;n[f(t)]=!0;if(t.properties){var r=t.properties;for(var i in r)r.hasOwnProperty(i)&&(e[i]=!0)}else t.mixins&&s.call(t.mixins,function(t){_(e,t,n)})}var e,t,n,r=Ember.ArrayPolyfills.map,i=Ember.ArrayPolyfills.indexOf,s=Ember.ArrayPolyfills.forEach,o=[].slice,u=Ember.create,a=Ember.defineProperty,f=Ember.guidFor,p={},S=Ember.IS_BINDING=/^.+Binding$/;Ember.mixin=function(e){var t=o.call(arguments,1);return A(e,t,!1),e},Ember.Mixin=function(){return c(this,arguments)},e=Ember.Mixin,e.prototype={properties:null,mixins:null,ownerConstructor:null},e._apply=A,e.applyPartial=function(e){var t=o.call(arguments,1);return A(e,t,!0)},e.finishPartial=N,Ember.anyUnprocessedMixins=!1,e.create=function(){Ember.anyUnprocessedMixins=!0;var e=this;return c(new e,arguments)};var O=e.prototype;O.reopen=function(){var t,n;this.properties?(t=e.create(),t.properties=this.properties,delete this.properties,this.mixins=[t]):this.mixins||(this.mixins=[]);var r=arguments.length,i=this.mixins,s;for(s=0;s<r;s++)t=arguments[s],t instanceof e?i.push(t):(n=e.create(),n.properties=t,i.push(n));return this},O.apply=function(e){return A(e,[this],!1)},O.applyPartial=function(e){return A(e,[this],!0)},O.detect=function(t){if(!t)return!1;if(t instanceof e)return M(t,this,{});var n=Ember.meta(t,!1).mixins;return n?!!n[f(this)]:!1},O.without=function(){var t=new e(this);return t._without=o.call(arguments),t},O.keys=function(){var e={},t={},n=[];_(e,this,t);for(var r in e)e.hasOwnProperty(r)&&n.push(r);return n},e.mixins=function(e){var t=Ember.meta(e,!1).mixins,n=[];if(!t)return n;for(var r in t){var i=t[r];i.properties||n.push(i)}return n},t=new Ember.Descriptor,t.toString=function(){return"(Required Property)"},Ember.required=function(){return t},n=function(e){this.methodName=e},n.prototype=new Ember.Descriptor,Ember.alias=function(e){return new n(e)},Ember.deprecateFunc("Ember.alias is deprecated. Please use Ember.aliasMethod or Ember.computed.alias instead.",Ember.alias),Ember.aliasMethod=function(e){return new n(e)},Ember.observer=function(e){var t=o.call(arguments,1);return e.__ember_observes__=t,e},Ember.immediateObserver=function(){for(var e=0,t=arguments.length;e<t;e++)var n=arguments[e];return Ember.observer.apply(this,arguments)},Ember.beforeObserver=function(e){var t=o.call(arguments,1);return e.__ember_observesBefore__=t,e}}(),function(){}(),function(){e("rsvp",[],function(){"use strict";function d(e,t){n.async(function(){e.trigger("promise:resolved",{detail:t}),e.isResolved=!0,e.resolvedValue=t})}function v(e,t){n.async(function(){e.trigger("promise:failed",{detail:t}),e.isRejected=!0,e.rejectedValue=t})}function m(e){var t,n=[],r=new c,i=e.length;i===0&&r.resolve([]);var s=function(e){return function(t){o(e,t)}},o=function(e,t){n[e]=t,--i===0&&r.resolve(n)},u=function(e){r.reject(e)};for(t=0;t<i;t++)e[t].then(s(t),u);return r}var e=typeof window!="undefined"?window:{},t=e.MutationObserver||e.WebKitMutationObserver,n,r;if(typeof process!="undefined"&&{}.toString.call(process)==="[object process]")r=function(e,t){process.nextTick(function(){e.call(t)})};else if(t){var i=[],s=new t(function(){var e=i.slice();i=[],e.forEach(function(e){var t=e[0],n=e[1];t.call(n)})}),o=document.createElement("div");s.observe(o,{attributes:!0}),window.addEventListener("unload",function(){s.disconnect(),s=null}),r=function(e,t){i.push([e,t]),o.setAttribute("drainQueue","drainQueue")}}else r=function(e,t){setTimeout(function(){e.call(t)},1)};var u=function(e,t){this.type=e;for(var n in t){if(!t.hasOwnProperty(n))continue;this[n]=t[n]}},a=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n][0]===t)return n;return-1},f=function(e){var t=e._promiseCallbacks;return t||(t=e._promiseCallbacks={}),t},l={mixin:function(e){return e.on=this.on,e.off=this.off,e.trigger=this.trigger,e},on:function(e,t,n){var r=f(this),i,s;e=e.split(/\s+/),n=n||this;while(s=e.shift())i=r[s],i||(i=r[s]=[]),a(i,t)===-1&&i.push([t,n])},off:function(e,t){var n=f(this),r,i,s;e=e.split(/\s+/);while(i=e.shift()){if(!t){n[i]=[];continue}r=n[i],s=a(r,t),s!==-1&&r.splice(s,1)}},trigger:function(e,t){var n=f(this),r,i,s,o,a;if(r=n[e])for(var l=0;l<r.length;l++)i=r[l],s=i[0],o=i[1],typeof t!="object"&&(t={detail:t}),a=new u(e,t),s.call(o,a)}},c=function(){this.on("promise:resolved",function(e){this.trigger("success",{detail:e.detail})},this),this.on("promise:failed",function(e){this.trigger("error",{detail:e.detail})},this)},h=function(){},p=function(e,t,n,r){var i=typeof n=="function",s,o,u,a;if(i)try{s=n(r.detail),u=!0}catch(f){a=!0,o=f}else s=r.detail,u=!0;s&&typeof s.then=="function"?s.then(function(e){t.resolve(e)},function(e){t.reject(e)}):i&&u?t.resolve(s):a?t.reject(o):t[e](s)};return c.prototype={then:function(e,t){var r=new c;return this.isResolved&&n.async(function(){p("resolve",r,e,{detail:this.resolvedValue})},this),this.isRejected&&n.async(function(){p("reject",r,t,{detail:this.rejectedValue})},this),this.on("promise:resolved",function(t){p("resolve",r,e,t)}),this.on("promise:failed",function(e){p("reject",r,t,e)}),r},resolve:function(e){d(this,e),this.resolve=h,this.reject=h},reject:function(e){v(this,e),this.resolve=h,this.reject=h}},l.mixin(c.prototype),n={async:r,Promise:c,Event:u,EventTarget:l,all:m,raiseOnUncaughtExceptions:!0},n})}(),function(){e("container",[],function(){function e(e){this.parent=e,this.dict={}}function t(t){this.parent=t,this.children=[],this.resolver=t&&t.resolver||function(){},this.registry=new e(t&&t.registry),this.cache=new e(t&&t.cache),this.typeInjections=new e(t&&t.typeInjections),this.injections={},this._options=new e(t&&t._options),this._typeOptions=new e(t&&t._typeOptions)}function n(e){throw new Error(e+" is not currently supported on child containers")}function r(e,t){var n=s(e,t,"singleton");return n!==!1}function i(e,t){var n={};if(!t)return n;var r,i;for(var s=0,o=t.length;s<o;s++)r=t[s],i=e.lookup(r.fullName),n[r.property]=i;return n}function s(e,t,n){var r=e._options.get(t);if(r&&r[n]!==undefined)return r[n];var i=t.split(":")[0];r=e._typeOptions.get(i);if(r)return r[n]}function o(e,t){var n=e.normalize(t);return e.resolve(n)}function u(e,t){var n=o(e,t),r=t.split(":"),u=r[0],a=r[1],f;if(s(e,t,"instantiate")===!1)return n;if(n){var l=[];l=l.concat(e.typeInjections.get(u)||[]),l=l.concat(e.injections[t]||[]);var c=i(e,l);return c.container=e,c._debugContainerKey=t,f=n.create(c),f}}function a(e,t){e.cache.eachLocal(function(n,r){if(s(e,n,"instantiate")===!1)return;t(r)})}function f(e){e.cache.eachLocal(function(t,n){if(s(e,t,"instantiate")===!1)return;n.destroy()}),e.cache.dict={}}return e.prototype={get:function(e){var t=this.dict;if(t.hasOwnProperty(e))return t[e];if(this.parent)return this.parent.get(e)},set:function(e,t){this.dict[e]=t},has:function(e){var t=this.dict;return t.hasOwnProperty(e)?!0:this.parent?this.parent.has(e):!1},eachLocal:function(e,t){var n=this.dict;for(var r in n)n.hasOwnProperty(r)&&e.call(t,r,n[r])}},t.prototype={child:function(){var e=new t(this);return this.children.push(e),e},set:function(e,t,n){e[t]=n},register:function(e,t,n,r){var i;e.indexOf(":")!==-1?(r=n,n=t,i=e):i=e+":"+t;var s=this.normalize(i);this.registry.set(s,n),this._options.set(s,r||{})},resolve:function(e){return this.resolver(e)||this.registry.get(e)},normalize:function(e){return e},lookup:function(e,t){e=this.normalize(e),t=t||{};if(this.cache.has(e)&&t.singleton!==!1)return this.cache.get(e);var n=u(this,e);if(!n)return;return r(this,e)&&t.singleton!==!1&&this.cache.set(e,n),n},has:function(e){return this.cache.has(e)?!0:!!o(this,e)},optionsForType:function(e,t){this.parent&&n("optionsForType"),this._typeOptions.set(e,t)},options:function(e,t){this.optionsForType(e,t)},typeInjection:function(e,t,r){this.parent&&n("typeInjection");var i=this.typeInjections.get(e);i||(i=[],this.typeInjections.set(e,i)),i.push({property:t,fullName:r})},injection:function(e,t,r){this.parent&&n("injection");if(e.indexOf(":")===-1)return this.typeInjection(e,t,r);var i=this.injections[e]=this.injections[e]||[];i.push({property:t,fullName:r})},destroy:function(){this.isDestroyed=!0;for(var e=0,t=this.children.length;e<t;e++)this.children[e].destroy();this.children=[],a(this,function(e){e.isDestroying=!0}),a(this,function(e){e.destroy()}),delete this.parent,this.isDestroyed=!0},reset:function(){for(var e=0,t=this.children.length;e<t;e++)f(this.children[e]);f(this)}},t})}(),function(){function t(n,r,i,s){var o,u,a;if("object"!=typeof n||n===null)return n;if(r&&(u=e(i,n))>=0)return s[u];if(Ember.typeOf(n)==="array"){o=n.slice();if(r){u=o.length;while(--u>=0)o[u]=t(o[u],r,i,s)}}else if(Ember.Copyable&&Ember.Copyable.detect(n))o=n.copy(r,i,s);else{o={};for(a in n){if(!n.hasOwnProperty(a))continue;if(a.substring(0,2)==="__")continue;o[a]=r?t(n[a],r,i,s):n[a]}}return r&&(i.push(n),s.push(o)),o}var e=Ember.EnumerableUtils.indexOf;Ember.compare=function r(e,t){if(e===t)return 0;var n=Ember.typeOf(e),i=Ember.typeOf(t),s=Ember.Comparable;if(s){if(n==="instance"&&s.detect(e.constructor))return e.constructor.compare(e,t);if(i==="instance"&&s.detect(t.constructor))return 1-t.constructor.compare(t,e)}var o=Ember.ORDER_DEFINITION_MAPPING;if(!o){var u=Ember.ORDER_DEFINITION;o=Ember.ORDER_DEFINITION_MAPPING={};var a,f;for(a=0,f=u.length;a<f;++a)o[u[a]]=a;delete Ember.ORDER_DEFINITION}var l=o[n],c=o[i];if(l<c)return-1;if(l>c)return 1;switch(n){case"boolean":case"number":if(e<t)return-1;if(e>t)return 1;return 0;case"string":var h=e.localeCompare(t);if(h<0)return-1;if(h>0)return 1;return 0;case"array":var p=e.length,d=t.length,v=Math.min(p,d),m=0,g=0;while(m===0&&g<v)m=r(e[g],t[g]),g++;if(m!==0)return m;if(p<d)return-1;if(p>d)return 1;return 0;case"instance":if(Ember.Comparable&&Ember.Comparable.detect(e))return e.compare(e,t);return 0;case"date":var y=e.getTime(),b=t.getTime();if(y<b)return-1;if(y>b)return 1;return 0;default:return 0}},Ember.copy=function(e,n){return"object"!=typeof e||e===null?e:Ember.Copyable&&Ember.Copyable.detect(e)?e.copy(n):t(e,n,n?[]:null,n?[]:null)},Ember.inspect=function(e){if(typeof e!="object"||e===null)return e+"";var t,n=[];for(var r in e)if(e.hasOwnProperty(r)){t=e[r];if(t==="toString")continue;Ember.typeOf(t)==="function"&&(t="function() { ... }"),n.push(r+": "+t)}return"{"+n.join(", ")+"}"},Ember.isEqual=function(e,t){return e&&"function"==typeof e.isEqual?e.isEqual(t):e===t},Ember.ORDER_DEFINITION=Ember.ENV.ORDER_DEFINITION||["undefined","null","boolean","number","string","array","object","instance","function","class","date"],Ember.keys=Object.keys,Ember.keys||(Ember.keys=function(e){var t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(n);return t});var n=["description","fileName","lineNumber","message","name","number","stack"];Ember.Error=function(){var e=Error.prototype.constructor.apply(this,arguments);for(var t=0;t<n.length;t++)this[n[t]]=e[n[t]]},Ember.Error.prototype=Ember.create(Error.prototype)}(),function(){Ember.RSVP=t("rsvp")}(),function(){var e=/[ _]/g,t={},n=/([a-z])([A-Z])/g,r=/(\-|_|\.|\s)+(.)?/g,i=/([a-z\d])([A-Z]+)/g,s=/\-|\s+/g;Ember.STRINGS={},Ember.String={fmt:function(e,t){var n=0;return e.replace(/%@([0-9]+)?/g,function(e,r){return r=r?parseInt(r,0)-1:n++,e=t[r],(e===null?"(null)":e===undefined?"":e).toString()})},loc:function(e,t){return e=Ember.STRINGS[e]||e,Ember.String.fmt(e,t)},w:function(e){return e.split(/\s+/)},decamelize:function(e){return e.replace(n,"$1_$2").toLowerCase()},dasherize:function(n){var r=t,i=r.hasOwnProperty(n),s;return i?r[n]:(s=Ember.String.decamelize(n).replace(e,"-"),r[n]=s,s)},camelize:function(e){return e.replace(r,function(e,t,n){return n?n.toUpperCase():""}).replace(/^([A-Z])/,function(e,t,n){return e.toLowerCase()})},classify:function(e){var t=e.split("."),n=[];for(var r=0,i=t.length;r<i;r++){var s=Ember.String.camelize(t[r]);n.push(s.charAt(0).toUpperCase()+s.substr(1))}return n.join(".")},underscore:function(e){return e.replace(i,"$1_$2").replace(s,"_").toLowerCase()},capitalize:function(e){return e.charAt(0).toUpperCase()+e.substr(1)}}}(),function(){var e=Ember.String.fmt,t=Ember.String.w,n=Ember.String.loc,r=Ember.String.camelize,i=Ember.String.decamelize,s=Ember.String.dasherize,o=Ember.String.underscore,u=Ember.String.capitalize,a=Ember.String.classify;if(Ember.EXTEND_PROTOTYPES===!0||Ember.EXTEND_PROTOTYPES.String)String.prototype.fmt=function(){return e(this,arguments)},String.prototype.w=function(){return t(this)},String.prototype.loc=function(){return n(this,arguments)},String.prototype.camelize=function(){return r(this)},String.prototype.decamelize=function(){return i(this)},String.prototype.dasherize=function(){return s(this)},String.prototype.underscore=function(){return o(this)},String.prototype.classify=function(){return a(this)},String.prototype.capitalize=function(){return u(this)}}(),function(){var e=Array.prototype.slice;if(Ember.EXTEND_PROTOTYPES===!0||Ember.EXTEND_PROTOTYPES.Function)Function.prototype.property=function(){var e=Ember.computed(this);return e.property.apply(e,arguments)},Function.prototype.observes=function(){return this.__ember_observes__=e.call(arguments),this},Function.prototype.observesBefore=function(){return this.__ember_observesBefore__=e.call(arguments),this}}(),function(){}(),function(){function s(){return i.length===0?{}:i.pop()}function o(e){return i.push(e),null}function u(t,n){function i(i){var s=e(i,t);return r?n===s:!!s}var r=arguments.length===2;return i}var e=Ember.get,t=Ember.set,n=Array.prototype.slice,r=Ember.EnumerableUtils.indexOf,i=[];Ember.Enumerable=Ember.Mixin.create({isEnumerable:!0,nextObject:Ember.required(Function),firstObject:Ember.computed(function(){if(e(this,"length")===0)return undefined;var t=s(),n;return n=this.nextObject(0,null,t),o(t),n}).property("[]"),lastObject:Ember.computed(function(){var t=e(this,"length");if(t===0)return undefined;var n=s(),r=0,i,u=null;do u=i,i=this.nextObject(r++,u,n);while(i!==undefined);return o(n),u}).property("[]"),contains:function(e){return this.find(function(t){return t===e})!==undefined},forEach:function(t,n){if(typeof t!="function")throw new TypeError;var r=e(this,"length"),i=null,u=s();n===undefined&&(n=null);for(var a=0;a<r;a++){var f=this.nextObject(a,i,u);t.call(n,f,a,this),i=f}return i=null,u=o(u),this},getEach:function(e){return this.mapProperty(e)},setEach:function(e,n){return this.forEach(function(r){t(r,e,n)})},map:function(e,t){var n=Ember.A([]);return this.forEach(function(r,i,s){n[i]=e.call(t,r,i,s)}),n},mapProperty:function(t){return this.map(function(n){return e(n,t)})},filter:function(e,t){var n=Ember.A([]);return this.forEach(function(r,i,s){e.call(t,r,i,s)&&n.push(r)}),n},reject:function(e,t){return this.filter(function(){return!e.apply(t,arguments)})},filterProperty:function(e,t){return this.filter(u.apply(this,arguments))},rejectProperty:function(t,n){var r=function(r){return e(r,t)===n},i=function(n){return!!e(n,t)},s=arguments.length===2?r:i;return this.reject(s)},find:function(t,n){var r=e(this,"length");n===undefined&&(n=null);var i=null,u,a=!1,f,l=s();for(var c=0;c<r&&!a;c++){u=this.nextObject(c,i,l);if(a=t.call(n,u,c,this))f=u;i=u}return u=i=null,l=o(l),f},findProperty:function(e,t){return this.find(u.apply(this,arguments))},every:function(e,t){return!this.find(function(n,r,i){return!e.call(t,n,r,i)})},everyProperty:function(e,t){return this.every(u.apply(this,arguments))},some:function(e,t){return!!this.find(function(n,r,i){return!!e.call(t,n,r,i)})},someProperty:function(e,t){return this.some(u.apply(this,arguments))},reduce:function(e,t,n){if(typeof e!="function")throw new TypeError;var r=t;return this.forEach(function(t,i){r=e.call(null,r,t,i,this,n)},this),r},invoke:function(e){var t,r=Ember.A([]);return arguments.length>1&&(t=n.call(arguments,1)),this.forEach(function(n,i){var s=n&&n[e];"function"==typeof s&&(r[i]=t?s.apply(n,t):s.call(n))},this),r},toArray:function(){var e=Ember.A([]);return this.forEach(function(t,n){e[n]=t}),e},compact:function(){return this.filter(function(e){return e!=null})},without:function(e){if(!this.contains(e))return this;var t=Ember.A([]);return this.forEach(function(n){n!==e&&(t[t.length]=n)}),t},uniq:function(){var e=Ember.A([]);return this.forEach(function(t){r(e,t)<0&&e.push(t)}),e},"[]":Ember.computed(function(e,t){return this}),addEnumerableObserver:function(t,n){var r=n&&n.willChange||"enumerableWillChange",i=n&&n.didChange||"enumerableDidChange",s=e(this,"hasEnumerableObservers");return s||Ember.propertyWillChange(this,"hasEnumerableObservers"),Ember.addListener(this,"@enumerable:before",t,r),Ember.addListener(this,"@enumerable:change",t,i),s||Ember.propertyDidChange(this,"hasEnumerableObservers"),this},removeEnumerableObserver:function(t,n){var r=n&&n.willChange||"enumerableWillChange",i=n&&n.didChange||"enumerableDidChange",s=e(this,"hasEnumerableObservers");return s&&Ember.propertyWillChange(this,"hasEnumerableObservers"),Ember.removeListener(this,"@enumerable:before",t,r),Ember.removeListener(this,"@enumerable:change",t,i),s&&Ember.propertyDidChange(this,"hasEnumerableObservers"),this},hasEnumerableObservers:Ember.computed(function(){return Ember.hasListeners(this,"@enumerable:change")||Ember.hasListeners(this,"@enumerable:before")}),enumerableContentWillChange:function(t,n){var r,i,s;return"number"==typeof t?r=t:t?r=e(t,"length"):r=t=-1,"number"==typeof n?i=n:n?i=e(n,"length"):i=n=-1,s=i<0||r<0||i-r!==0,t===-1&&(t=null),n===-1&&(n=null),Ember.propertyWillChange(this,"[]"),s&&Ember.propertyWillChange(this,"length"),Ember.sendEvent(this,"@enumerable:before",[this,t,n]),this},enumerableContentDidChange:function(t,n){var r,i,s;return"number"==typeof t?r=t:t?r=e(t,"length"):r=t=-1,"number"==typeof n?i=n:n?i=e(n,"length"):i=n=-1,s=i<0||r<0||i-r!==0,t===-1&&(t=null),n===-1&&(n=null),Ember.sendEvent(this,"@enumerable:change",[this,t,n]),s&&Ember.propertyDidChange(this,"length"),Ember.propertyDidChange(this,"[]"),this}})}(),function(){function i(e){return e===null||e===undefined}var e=Ember.get,t=Ember.set,n=Ember.EnumerableUtils.map,r=Ember.cacheFor;Ember.Array=Ember.Mixin.create(Ember.Enumerable,{isSCArray:!0,length:Ember.required(),objectAt:function(t){return t<0||t>=e(this,"length")?undefined:e(this,t)},objectsAt:function(e){var t=this;return n(e,function(e){return t.objectAt(e)})},nextObject:function(e){return this.objectAt(e)},"[]":Ember.computed(function(t,n){return n!==undefined&&this.replace(0,e(this,"length"),n),this}),firstObject:Ember.computed(function(){return this.objectAt(0)}),lastObject:Ember.computed(function(){return this.objectAt(e(this,"length")-1)}),contains:function(e){return this.indexOf(e)>=0},slice:function(t,n){var r=Ember.A([]),s=e(this,"length");i(t)&&(t=0);if(i(n)||n>s)n=s;t<0&&(t=s+t),n<0&&(n=s+n);while(t<n)r[r.length]=this.objectAt(t++);return r},indexOf:function(t,n){var r,i=e(this,"length");n===undefined&&(n=0),n<0&&(n+=i);for(r=n;r<i;r++)if(this.objectAt(r,!0)===t)return r;return-1},lastIndexOf:function(t,n){var r,i=e(this,"length");if(n===undefined||n>=i)n=i-1;n<0&&(n+=i);for(r=n;r>=0;r--)if(this.objectAt(r)===t)return r;return-1},addArrayObserver:function(t,n){var r=n&&n.willChange||"arrayWillChange",i=n&&n.didChange||"arrayDidChange",s=e(this,"hasArrayObservers");return s||Ember.propertyWillChange(this,"hasArrayObservers"),Ember.addListener(this,"@array:before",t,r),Ember.addListener(this,"@array:change",t,i),s||Ember.propertyDidChange(this,"hasArrayObservers"),this},removeArrayObserver:function(t,n){var r=n&&n.willChange||"arrayWillChange",i=n&&n.didChange||"arrayDidChange",s=e(this,"hasArrayObservers");return s&&Ember.propertyWillChange(this,"hasArrayObservers"),Ember.removeListener(this,"@array:before",t,r),Ember.removeListener(this,"@array:change",t,i),s&&Ember.propertyDidChange(this,"hasArrayObservers"),this},hasArrayObservers:Ember.computed(function(){return Ember.hasListeners(this,"@array:change")||Ember.hasListeners(this,"@array:before")}),arrayContentWillChange:function(t,n,r){t===undefined?(t=0,n=r=-1):(n===undefined&&(n=-1),r===undefined&&(r=-1)),Ember.isWatching(this,"@each")&&e(this,"@each"),Ember.sendEvent(this,"@array:before",[this,t,n,r]);var i,s;if(t>=0&&n>=0&&e(this,"hasEnumerableObservers")){i=[],s=t+n;for(var o=t;o<s;o++)i.push(this.objectAt(o))}else i=n;return this.enumerableContentWillChange(i,r),this},arrayContentDidChange:function(t,n,i){t===undefined?(t=0,n=i=-1):(n===undefined&&(n=-1),i===undefined&&(i=-1));var s,o;if(t>=0&&i>=0&&e(this,"hasEnumerableObservers")){s=[],o=t+i;for(var u=t;u<o;u++)s.push(this.objectAt(u))}else s=i;this.enumerableContentDidChange(n,s),Ember.sendEvent(this,"@array:change",[this,t,n,i]);var a=e(this,"length"),f=r(this,"firstObject"),l=r(this,"lastObject");return this.objectAt(0)!==f&&(Ember.propertyWillChange(this,"firstObject"),Ember.propertyDidChange(this,"firstObject")),this.objectAt(a-1)!==l&&(Ember.propertyWillChange(this,"lastObject"),Ember.propertyDidChange(this,"lastObject")),this},"@each":Ember.computed(function(){return this.__each||(this.__each=new Ember.EachProxy(this)),this.__each})})}(),function(){Ember.Comparable=Ember.Mixin.create({isComparable:!0,compare:Ember.required(Function)})}(),function(){var e=Ember.get,t=Ember.set;Ember.Copyable=Ember.Mixin.create({copy:Ember.required(Function),frozenCopy:function(){if(Ember.Freezable&&Ember.Freezable.detect(this))return e(this,"isFrozen")?this:this.copy().freeze();throw new Error(Ember.String.fmt("%@ does not support freezing",[this]))}})}(),function(){var e=Ember.get,t=Ember.set;Ember.Freezable=Ember.Mixin.create({isFrozen:!1,freeze:function(){return e(this,"isFrozen")?this:(t(this,"isFrozen",!0),this)}}),Ember.FROZEN_ERROR="Frozen object cannot be modified."}(),function(){var e=Ember.EnumerableUtils.forEach;Ember.MutableEnumerable=Ember.Mixin.create(Ember.Enumerable,{addObject:Ember.required(Function),addObjects:function(t){return Ember.beginPropertyChanges(this),e(t,function(e){this.addObject(e)},this),Ember.endPropertyChanges(this),this},removeObject:Ember.required(Function),removeObjects:function(t){return Ember.beginPropertyChanges(this),e(t,function(e){this.removeObject(e)},this),Ember.endPropertyChanges(this),this}})}(),function(){var e="Index out of range",t=[],n=Ember.get,r=Ember.set;Ember.MutableArray=Ember.Mixin.create(Ember.Array,Ember.MutableEnumerable,{replace:Ember.required(),clear:function(){var e=n(this,"length");return e===0?this:(this.replace(0,e,t),this)},insertAt:function(t,r){if(t>n(this,"length"))throw new Error(e);return this.replace(t,0,[r]),this},removeAt:function(r,i){if("number"==typeof r){if(r<0||r>=n(this,"length"))throw new Error(e);i===undefined&&(i=1),this.replace(r,i,t)}return this},pushObject:function(e){return this.insertAt(n(this,"length"),e),e},pushObjects:function(e){return this.replace(n(this,"length"),0,e),this},popObject:function(){var e=n(this,"length");if(e===0)return null;var t=this.objectAt(e-1);return this.removeAt(e-1,1),t},shiftObject:function(){if(n(this,"length")===0)return null;var e=this.objectAt(0);return this.removeAt(0),e},unshiftObject:function(e){return this.insertAt(0,e),e},unshiftObjects:function(e){return this.replace(0,0,e),this},reverseObjects:function(){var e=n(this,"length");if(e===0)return this;var t=this.toArray().reverse();return this.replace(0,e,t),this},setObjects:function(e){if(e.length===0)return this.clear();var t=n(this,"length");return this.replace(0,t,e),this},removeObject:function(e){var t=n(this,"length")||0;while(--t>=0){var r=this.objectAt(t);r===e&&this.removeAt(t)}return this},addObject:function(e){return this.contains(e)||this.pushObject(e),this}})}(),function(){var e=Ember.get,t=Ember.set;Ember.Observable=Ember.Mixin.create({get:function(t){return e(this,t)},getProperties:function(){var t={},n=arguments;arguments.length===1&&Ember.typeOf(arguments[0])==="array"&&(n=arguments[0]);for(var r=0;r<n.length;r++)t[n[r]]=e(this,n[r]);return t},set:function(e,n){return t(this,e,n),this},setProperties:function(e){return Ember.setProperties(this,e)},beginPropertyChanges:function(){return Ember.beginPropertyChanges(),this},endPropertyChanges:function(){return Ember.endPropertyChanges(),this},propertyWillChange:function(e){return Ember.propertyWillChange(this,e),this},propertyDidChange:function(e){return Ember.propertyDidChange(this,e),this},notifyPropertyChange:function(e){return this.propertyWillChange(e),this.propertyDidChange(e),this},addBeforeObserver:function(e,t,n){Ember.addBeforeObserver(this,e,t,n)},addObserver:function(e,t,n){Ember.addObserver(this,e,t,n)},removeObserver:function(e,t,n){Ember.removeObserver(this,e,t,n)},hasObserverFor:function(e){return Ember
17
- .hasListeners(this,e+":change")},getPath:function(e){return this.get(e)},setPath:function(e,t){return this.set(e,t)},getWithDefault:function(e,t){return Ember.getWithDefault(this,e,t)},incrementProperty:function(n,r){return r||(r=1),t(this,n,(e(this,n)||0)+r),e(this,n)},decrementProperty:function(n,r){return r||(r=1),t(this,n,(e(this,n)||0)-r),e(this,n)},toggleProperty:function(n){return t(this,n,!e(this,n)),e(this,n)},cacheFor:function(e){return Ember.cacheFor(this,e)},observersForKey:function(e){return Ember.observersFor(this,e)}})}(),function(){var e=Ember.get,t=Ember.set;Ember.TargetActionSupport=Ember.Mixin.create({target:null,action:null,targetObject:Ember.computed(function(){var t=e(this,"target");if(Ember.typeOf(t)==="string"){var n=e(this,t);return n===undefined&&(n=e(Ember.lookup,t)),n}return t}).property("target"),triggerAction:function(){var t=e(this,"action"),n=e(this,"targetObject");if(n&&t){var r;return typeof n.send=="function"?r=n.send(t,this):(typeof t=="string"&&(t=n[t]),r=t.call(n,this)),r!==!1&&(r=!0),r}return!1}})}(),function(){Ember.Evented=Ember.Mixin.create({on:function(e,t,n){return Ember.addListener(this,e,t,n),this},one:function(e,t,n){return n||(n=t,t=null),Ember.addListener(this,e,t,n,!0),this},trigger:function(e){var t=[],n,r;for(n=1,r=arguments.length;n<r;n++)t.push(arguments[n]);Ember.sendEvent(this,e,t)},fire:function(e){this.trigger.apply(this,arguments)},off:function(e,t,n){return Ember.removeListener(this,e,t,n),this},has:function(e){return Ember.hasListeners(this,e)}})}(),function(){var e=t("rsvp");e.async=function(e,t){Ember.run.schedule("actions",t,e)};var n=Ember.get;Ember.DeferredMixin=Ember.Mixin.create({then:function(e,t){var r=n(this,"promise");return r.then.apply(r,arguments)},resolve:function(e){n(this,"promise").resolve(e)},reject:function(e){n(this,"promise").reject(e)},promise:Ember.computed(function(){return new e.Promise})})}(),function(){}(),function(){Ember.Container=t("container"),Ember.Container.set=Ember.set}(),function(){function b(){var e=!1,t,s,o=function(){e||o.proto(),r(this,i,y),r(this,"_super",y);var a=u(this);a.proto=this;if(t){var l=t;t=null,this.reopen.apply(this,l)}if(s){var c=s;s=null;var h=this.concatenatedProperties;for(var p=0,v=c.length;p<v;p++){var b=c[p];for(var w in b){if(!b.hasOwnProperty(w))continue;var E=b[w],S=Ember.IS_BINDING;if(S.test(w)){var x=a.bindings;x?a.hasOwnProperty("bindings")||(x=a.bindings=n(a.bindings)):x=a.bindings={},x[w]=E}var T=a.descs[w];if(h&&g(h,w)>=0){var N=this[w];N?"function"==typeof N.concat?E=N.concat(E):E=Ember.makeArray(N).concat(E):E=Ember.makeArray(E)}T?T.set(this,w,E):typeof this.setUnknownProperty!="function"||w in this?m?Ember.defineProperty(this,w,null,E):this[w]=E:this.setUnknownProperty(w,E)}}}d(this,a),delete a.proto,f(this),this.init.apply(this,arguments)};return o.toString=h.prototype.toString,o.willReopen=function(){e&&(o.PrototypeMixin=h.create(o.PrototypeMixin)),e=!1},o._initMixins=function(e){t=e},o._initProperties=function(e){s=e},o.proto=function(){var t=o.superclass;return t&&t.proto(),e||(e=!0,o.PrototypeMixin.applyPartial(o.prototype),a(o.prototype)),this.prototype},o}function E(e){return function(){return e}}var e=Ember.set,t=Ember.get,n=Ember.create,r=Ember.platform.defineProperty,i=Ember.GUID_KEY,s=Ember.guidFor,o=Ember.generateGuid,u=Ember.meta,a=Ember.rewatch,f=Ember.finishChains,l=Ember.destroy,c=Ember.run.schedule,h=Ember.Mixin,p=h._apply,d=h.finishPartial,v=h.prototype.reopen,m=Ember.ENV.MANDATORY_SETTER,g=Ember.EnumerableUtils.indexOf,y={configurable:!0,writable:!0,enumerable:!1,value:undefined},w=b();w.toString=function(){return"Ember.CoreObject"},w.PrototypeMixin=h.create({reopen:function(){return p(this,arguments,!0),this},isInstance:!0,init:function(){},concatenatedProperties:null,isDestroyed:!1,isDestroying:!1,destroy:function(){if(this._didCallDestroy)return;return this.isDestroying=!0,this._didCallDestroy=!0,c("destroy",this,this._scheduledDestroy),this},willDestroy:Ember.K,_scheduledDestroy:function(){this.willDestroy&&this.willDestroy(),l(this),this.isDestroyed=!0,this.didDestroy&&this.didDestroy()},bind:function(e,t){return t instanceof Ember.Binding||(t=Ember.Binding.from(t)),t.to(e).connect(this),t},toString:function x(){var e=typeof this.toStringExtension=="function",t=e?":"+this.toStringExtension():"",n="<"+this.constructor.toString()+":"+s(this)+t+">";return this.toString=E(n),n}}),w.PrototypeMixin.ownerConstructor=w,Ember.config.overridePrototypeMixin&&Ember.config.overridePrototypeMixin(w.PrototypeMixin),w.__super__=null;var S=h.create({ClassMixin:Ember.required(),PrototypeMixin:Ember.required(),isClass:!0,isMethod:!1,extend:function(){var e=b(),t;return e.ClassMixin=h.create(this.ClassMixin),e.PrototypeMixin=h.create(this.PrototypeMixin),e.ClassMixin.ownerConstructor=e,e.PrototypeMixin.ownerConstructor=e,v.apply(e.PrototypeMixin,arguments),e.superclass=this,e.__super__=this.prototype,t=e.prototype=n(this.prototype),t.constructor=e,o(t,"ember"),u(t).proto=t,e.ClassMixin.apply(e),e},createWithMixins:function(){var e=this;return arguments.length>0&&this._initMixins(arguments),new e},create:function(){var e=this;return arguments.length>0&&this._initProperties(arguments),new e},reopen:function(){return this.willReopen(),v.apply(this.PrototypeMixin,arguments),this},reopenClass:function(){return v.apply(this.ClassMixin,arguments),p(this,arguments,!1),this},detect:function(e){if("function"!=typeof e)return!1;while(e){if(e===this)return!0;e=e.superclass}return!1},detectInstance:function(e){return e instanceof this},metaForProperty:function(e){var t=u(this.proto(),!1).descs[e];return t._meta||{}},eachComputedProperty:function(e,t){var n=this.proto(),r=u(n).descs,i={},s;for(var o in r)s=r[o],s instanceof Ember.ComputedProperty&&e.call(t||this,o,s._meta||i)}});S.ownerConstructor=w,Ember.config.overrideClassMixin&&Ember.config.overrideClassMixin(S),w.ClassMixin=S,S.apply(w),Ember.CoreObject=w}(),function(){Ember.Object=Ember.CoreObject.extend(Ember.Observable),Ember.Object.toString=function(){return"Ember.Object"}}(),function(){function o(e,t,n){var u=e.length;r[e.join(".")]=t;for(var f in t){if(!i.call(t,f))continue;var c=t[f];e[u]=f;if(c&&c.toString===l)c.toString=h(e.join(".")),c[a]=e.join(".");else if(c&&c.isNamespace){if(n[s(c)])continue;n[s(c)]=!0,o(e,c,n)}}e.length=u}function u(){var e=Ember.Namespace,t=Ember.lookup,n,r;if(e.PROCESSED)return;for(var i in t){if(i==="parent"||i==="top"||i==="frameElement")continue;if(i==="globalStorage"&&t.StorageList&&t.globalStorage instanceof t.StorageList)continue;if(t.hasOwnProperty&&!t.hasOwnProperty(i))continue;try{n=Ember.lookup[i],r=n&&n.isNamespace}catch(s){continue}r&&(n[a]=i)}}function f(e){var t=e.superclass;if(t)return t[a]?t[a]:f(t);return}function l(){!Ember.BOOTED&&!this[a]&&c();var e;if(this[a])e=this[a];else{var t=f(this);t?e="(subclass of "+t+")":e="(unknown mixin)",this.toString=h(e)}return e}function c(){var e=!n.PROCESSED,t=Ember.anyUnprocessedMixins;e&&(u(),n.PROCESSED=!0);if(e||t){var r=n.NAMESPACES,i;for(var s=0,a=r.length;s<a;s++)i=r[s],o([i.toString()],i,{});Ember.anyUnprocessedMixins=!1}}function h(e){return function(){return e}}var e=Ember.get,t=Ember.ArrayPolyfills.indexOf,n=Ember.Namespace=Ember.Object.extend({isNamespace:!0,init:function(){Ember.Namespace.NAMESPACES.push(this),Ember.Namespace.PROCESSED=!1},toString:function(){var t=e(this,"name");return t?t:(u(),this[Ember.GUID_KEY+"_name"])},nameClasses:function(){o([this.toString()],this,{})},destroy:function(){var e=Ember.Namespace.NAMESPACES;Ember.lookup[this.toString()]=undefined,e.splice(t.call(e,this),1),this._super()}});n.reopenClass({NAMESPACES:[Ember],NAMESPACES_BY_ID:{},PROCESSED:!1,processAll:c,byName:function(e){return Ember.BOOTED||c(),r[e]}});var r=n.NAMESPACES_BY_ID,i={}.hasOwnProperty,s=Ember.guidFor,a=Ember.NAME_KEY=Ember.GUID_KEY+"_name";Ember.Mixin.prototype.toString=l}(),function(){Ember.Application=Ember.Namespace.extend()}(),function(){var e="Index out of range",t=[],n=Ember.get,r=Ember.set;Ember.ArrayProxy=Ember.Object.extend(Ember.MutableArray,{content:null,arrangedContent:Ember.computed.alias("content"),objectAtContent:function(e){return n(this,"arrangedContent").objectAt(e)},replaceContent:function(e,t,r){n(this,"content").replace(e,t,r)},_contentWillChange:Ember.beforeObserver(function(){this._teardownContent()},"content"),_teardownContent:function(){var e=n(this,"content");e&&e.removeArrayObserver(this,{willChange:"contentArrayWillChange",didChange:"contentArrayDidChange"})},contentArrayWillChange:Ember.K,contentArrayDidChange:Ember.K,_contentDidChange:Ember.observer(function(){var e=n(this,"content");this._setupContent()},"content"),_setupContent:function(){var e=n(this,"content");e&&e.addArrayObserver(this,{willChange:"contentArrayWillChange",didChange:"contentArrayDidChange"})},_arrangedContentWillChange:Ember.beforeObserver(function(){var e=n(this,"arrangedContent"),t=e?n(e,"length"):0;this.arrangedContentArrayWillChange(this,0,t,undefined),this.arrangedContentWillChange(this),this._teardownArrangedContent(e)},"arrangedContent"),_arrangedContentDidChange:Ember.observer(function(){var e=n(this,"arrangedContent"),t=e?n(e,"length"):0;this._setupArrangedContent(),this.arrangedContentDidChange(this),this.arrangedContentArrayDidChange(this,0,undefined,t)},"arrangedContent"),_setupArrangedContent:function(){var e=n(this,"arrangedContent");e&&e.addArrayObserver(this,{willChange:"arrangedContentArrayWillChange",didChange:"arrangedContentArrayDidChange"})},_teardownArrangedContent:function(){var e=n(this,"arrangedContent");e&&e.removeArrayObserver(this,{willChange:"arrangedContentArrayWillChange",didChange:"arrangedContentArrayDidChange"})},arrangedContentWillChange:Ember.K,arrangedContentDidChange:Ember.K,objectAt:function(e){return n(this,"content")&&this.objectAtContent(e)},length:Ember.computed(function(){var e=n(this,"arrangedContent");return e?n(e,"length"):0}),_replace:function(e,t,r){var i=n(this,"content");return i&&this.replaceContent(e,t,r),this},replace:function(){if(n(this,"arrangedContent")!==n(this,"content"))throw new Ember.Error("Using replace on an arranged ArrayProxy is not allowed.");this._replace.apply(this,arguments)},_insertAt:function(t,r){if(t>n(this,"content.length"))throw new Error(e);return this._replace(t,0,[r]),this},insertAt:function(e,t){if(n(this,"arrangedContent")===n(this,"content"))return this._insertAt(e,t);throw new Ember.Error("Using insertAt on an arranged ArrayProxy is not allowed.")},removeAt:function(r,i){if("number"==typeof r){var s=n(this,"content"),o=n(this,"arrangedContent"),u=[],a;if(r<0||r>=n(this,"length"))throw new Error(e);i===undefined&&(i=1);for(a=r;a<r+i;a++)u.push(s.indexOf(o.objectAt(a)));u.sort(function(e,t){return t-e}),Ember.beginPropertyChanges();for(a=0;a<u.length;a++)this._replace(u[a],1,t);Ember.endPropertyChanges()}return this},pushObject:function(e){return this._insertAt(n(this,"content.length"),e),e},pushObjects:function(e){return this._replace(n(this,"length"),0,e),this},setObjects:function(e){if(e.length===0)return this.clear();var t=n(this,"length");return this._replace(0,t,e),this},unshiftObject:function(e){return this._insertAt(0,e),e},unshiftObjects:function(e){return this._replace(0,0,e),this},slice:function(){var e=this.toArray();return e.slice.apply(e,arguments)},arrangedContentArrayWillChange:function(e,t,n,r){this.arrayContentWillChange(t,n,r)},arrangedContentArrayDidChange:function(e,t,n,r){this.arrayContentDidChange(t,n,r)},init:function(){this._super(),this._setupContent(),this._setupArrangedContent()},willDestroy:function(){this._teardownArrangedContent(),this._teardownContent()}})}(),function(){function f(e,t){var n=t.slice(8);if(n in this)return;u(this,n)}function l(e,t){var n=t.slice(8);if(n in this)return;a(this,n)}var e=Ember.get,t=Ember.set,n=Ember.String.fmt,r=Ember.addBeforeObserver,i=Ember.addObserver,s=Ember.removeBeforeObserver,o=Ember.removeObserver,u=Ember.propertyWillChange,a=Ember.propertyDidChange;Ember.ObjectProxy=Ember.Object.extend({content:null,_contentDidChange:Ember.observer(function(){},"content"),isTruthy:Ember.computed.bool("content"),_debugContainerKey:null,willWatchProperty:function(e){var t="content."+e;r(this,t,null,f),i(this,t,null,l)},didUnwatchProperty:function(e){var t="content."+e;s(this,t,null,f),o(this,t,null,l)},unknownProperty:function(t){var n=e(this,"content");if(n)return e(n,t)},setUnknownProperty:function(n,r){var i=e(this,"content");return t(i,n,r)}}),Ember.ObjectProxy.reopenClass({create:function(){var e,t,n,r,i,s;if(arguments.length){t=this.proto();for(n=0,r=arguments.length;n<r;n++){i=arguments[n];for(s in i){if(!i.hasOwnProperty(s)||s in t)continue;e||(e={}),e[s]=null}}e&&this._initMixins([e])}return this._super.apply(this,arguments)}})}(),function(){function o(e,t,r,i,s){var o=r._objects,u;o||(o=r._objects={});while(--s>=i){var a=e.objectAt(s);a&&(Ember.addBeforeObserver(a,t,r,"contentKeyWillChange"),Ember.addObserver(a,t,r,"contentKeyDidChange"),u=n(a),o[u]||(o[u]=[]),o[u].push(s))}}function u(e,t,r,i,s){var o=r._objects;o||(o=r._objects={});var u,a;while(--s>=i){var f=e.objectAt(s);f&&(Ember.removeBeforeObserver(f,t,r,"contentKeyWillChange"),Ember.removeObserver(f,t,r,"contentKeyDidChange"),a=n(f),u=o[a],u[u.indexOf(s)]=null)}}var e=Ember.set,t=Ember.get,n=Ember.guidFor,r=Ember.EnumerableUtils.forEach,i=Ember.Object.extend(Ember.Array,{init:function(e,t,n){this._super(),this._keyName=t,this._owner=n,this._content=e},objectAt:function(e){var n=this._content.objectAt(e);return n&&t(n,this._keyName)},length:Ember.computed(function(){var e=this._content;return e?t(e,"length"):0})}),s=/^.+:(before|change)$/;Ember.EachProxy=Ember.Object.extend({init:function(e){this._super(),this._content=e,e.addArrayObserver(this),r(Ember.watchedEvents(this),function(e){this.didAddListener(e)},this)},unknownProperty:function(e,t){var n;return n=new i(this._content,e,this),Ember.defineProperty(this,e,null,n),this.beginObservingContentKey(e),n},arrayWillChange:function(e,t,n,r){var i=this._keys,s,o;o=n>0?t+n:-1,Ember.beginPropertyChanges(this);for(s in i){if(!i.hasOwnProperty(s))continue;o>0&&u(e,s,this,t,o),Ember.propertyWillChange(this,s)}Ember.propertyWillChange(this._content,"@each"),Ember.endPropertyChanges(this)},arrayDidChange:function(e,t,n,r){var i=this._keys,s,u;u=r>0?t+r:-1,Ember.beginPropertyChanges(this);for(s in i){if(!i.hasOwnProperty(s))continue;u>0&&o(e,s,this,t,u),Ember.propertyDidChange(this,s)}Ember.propertyDidChange(this._content,"@each"),Ember.endPropertyChanges(this)},didAddListener:function(e){s.test(e)&&this.beginObservingContentKey(e.slice(0,-7))},didRemoveListener:function(e){s.test(e)&&this.stopObservingContentKey(e.slice(0,-7))},beginObservingContentKey:function(e){var n=this._keys;n||(n=this._keys={});if(!n[e]){n[e]=1;var r=this._content,i=t(r,"length");o(r,e,this,0,i)}else n[e]++},stopObservingContentKey:function(e){var n=this._keys;if(n&&n[e]>0&&--n[e]<=0){var r=this._content,i=t(r,"length");u(r,e,this,0,i)}},contentKeyWillChange:function(e,t){Ember.propertyWillChange(this,t)},contentKeyDidChange:function(e,t){Ember.propertyDidChange(this,t)}})}(),function(){var e=Ember.get,t=Ember.set,n=Ember.Mixin.create(Ember.MutableArray,Ember.Observable,Ember.Copyable,{get:function(e){return e==="length"?this.length:"number"==typeof e?this[e]:this._super(e)},objectAt:function(e){return this[e]},replace:function(t,n,r){if(this.isFrozen)throw Ember.FROZEN_ERROR;var i=r?e(r,"length"):0;this.arrayContentWillChange(t,n,i);if(!r||r.length===0)this.splice(t,n);else{var s=[t,n].concat(r);this.splice.apply(this,s)}return this.arrayContentDidChange(t,n,i),this},unknownProperty:function(e,t){var n;return t!==undefined&&n===undefined&&(n=this[e]=t),n},indexOf:function(e,t){var n,r=this.length;t===undefined?t=0:t=t<0?Math.ceil(t):Math.floor(t),t<0&&(t+=r);for(n=t;n<r;n++)if(this[n]===e)return n;return-1},lastIndexOf:function(e,t){var n,r=this.length;t===undefined?t=r-1:t=t<0?Math.ceil(t):Math.floor(t),t<0&&(t+=r);for(n=t;n>=0;n--)if(this[n]===e)return n;return-1},copy:function(e){return e?this.map(function(e){return Ember.copy(e,!0)}):this.slice()}}),r=["length"];Ember.EnumerableUtils.forEach(n.keys(),function(e){Array.prototype[e]&&r.push(e)}),r.length>0&&(n=n.without.apply(n,r)),Ember.NativeArray=n,Ember.A=function(e){return e===undefined&&(e=[]),Ember.Array.detect(e)?e:Ember.NativeArray.apply(e)},Ember.NativeArray.activate=function(){n.apply(Array.prototype),Ember.A=function(e){return e||[]}},(Ember.EXTEND_PROTOTYPES===!0||Ember.EXTEND_PROTOTYPES.Array)&&Ember.NativeArray.activate()}(),function(){var e=Ember.get,t=Ember.set,n=Ember.guidFor,r=Ember.isNone,i=Ember.String.fmt;Ember.Set=Ember.CoreObject.extend(Ember.MutableEnumerable,Ember.Copyable,Ember.Freezable,{length:0,clear:function(){if(this.isFrozen)throw new Error(Ember.FROZEN_ERROR);var r=e(this,"length");if(r===0)return this;var i;this.enumerableContentWillChange(r,0),Ember.propertyWillChange(this,"firstObject"),Ember.propertyWillChange(this,"lastObject");for(var s=0;s<r;s++)i=n(this[s]),delete this[i],delete this[s];return t(this,"length",0),Ember.propertyDidChange(this,"firstObject"),Ember.propertyDidChange(this,"lastObject"),this.enumerableContentDidChange(r,0),this},isEqual:function(t){if(!Ember.Enumerable.detect(t))return!1;var n=e(this,"length");if(e(t,"length")!==n)return!1;while(--n>=0)if(!t.contains(this[n]))return!1;return!0},add:Ember.aliasMethod("addObject"),remove:Ember.aliasMethod("removeObject"),pop:function(){if(e(this,"isFrozen"))throw new Error(Ember.FROZEN_ERROR);var t=this.length>0?this[this.length-1]:null;return this.remove(t),t},push:Ember.aliasMethod("addObject"),shift:Ember.aliasMethod("pop"),unshift:Ember.aliasMethod("push"),addEach:Ember.aliasMethod("addObjects"),removeEach:Ember.aliasMethod("removeObjects"),init:function(e){this._super(),e&&this.addObjects(e)},nextObject:function(e){return this[e]},firstObject:Ember.computed(function(){return this.length>0?this[0]:undefined}),lastObject:Ember.computed(function(){return this.length>0?this[this.length-1]:undefined}),addObject:function(i){if(e(this,"isFrozen"))throw new Error(Ember.FROZEN_ERROR);if(r(i))return this;var s=n(i),o=this[s],u=e(this,"length"),a;return o>=0&&o<u&&this[o]===i?this:(a=[i],this.enumerableContentWillChange(null,a),Ember.propertyWillChange(this,"lastObject"),u=e(this,"length"),this[s]=u,this[u]=i,t(this,"length",u+1),Ember.propertyDidChange(this,"lastObject"),this.enumerableContentDidChange(null,a),this)},removeObject:function(i){if(e(this,"isFrozen"))throw new Error(Ember.FROZEN_ERROR);if(r(i))return this;var s=n(i),o=this[s],u=e(this,"length"),a=o===0,f=o===u-1,l,c;return o>=0&&o<u&&this[o]===i&&(c=[i],this.enumerableContentWillChange(c,null),a&&Ember.propertyWillChange(this,"firstObject"),f&&Ember.propertyWillChange(this,"lastObject"),o<u-1&&(l=this[u-1],this[o]=l,this[n(l)]=o),delete this[s],delete this[u-1],t(this,"length",u-1),a&&Ember.propertyDidChange(this,"firstObject"),f&&Ember.propertyDidChange(this,"lastObject"),this.enumerableContentDidChange(c,null)),this},contains:function(e){return this[n(e)]>=0},copy:function(){var r=this.constructor,i=new r,s=e(this,"length");t(i,"length",s);while(--s>=0)i[s]=this[s],i[n(this[s])]=s;return i},toString:function(){var e=this.length,t,n=[];for(t=0;t<e;t++)n[t]=this[t];return i("Ember.Set<%@>",[n.join(",")])}})}(),function(){var e=Ember.DeferredMixin,t=Ember.get,n=Ember.Object.extend(e);n.reopenClass({promise:function(e,r){var i=n.create();return e.call(r,i),t(i,"promise")}}),Ember.Deferred=n}(),function(){var e=Ember.ENV.EMBER_LOAD_HOOKS||{},t={};Ember.onLoad=function(n,r){var i;e[n]=e[n]||Ember.A(),e[n].pushObject(r),(i=t[n])&&r(i)},Ember.runLoadHooks=function(n,r){var i;t[n]=r,(i=e[n])&&e[n].forEach(function(e){e(r)})}}(),function(){}(),function(){var e=Ember.get;Ember.ControllerMixin=Ember.Mixin.create({isController:!0,target:null,container:null,store:null,model:Ember.computed.alias("content"),send:function(t){var n=[].slice.call(arguments,1),r;this[t]?this[t].apply(this,n):(r=e(this,"target"))&&r.send.apply(r,arguments)}}),Ember.Controller=Ember.Object.extend(Ember.ControllerMixin)}(),function(){var e=Ember.get,t=Ember.set,n=Ember.EnumerableUtils.forEach;Ember.SortableMixin=Ember.Mixin.create(Ember.MutableEnumerable,{sortProperties:null,sortAscending:!0,orderBy:function(t,r){var i=0,s=e(this,"sortProperties"),o=e(this,"sortAscending");return n(s,function(n){i===0&&(i=Ember.compare(e(t,n),e(r,n)),i!==0&&!o&&(i=-1*i))}),i},destroy:function(){var t=e(this,"content"),r=e(this,"sortProperties");return t&&r&&n(t,function(e){n(r,function(t){Ember.removeObserver(e,t,this,"contentItemSortPropertyDidChange")},this)},this),this._super()},isSorted:Ember.computed.bool("sortProperties"),arrangedContent:Ember.computed("content","sortProperties.@each",function(t,r){var i=e(this,"content"),s=e(this,"isSorted"),o=e(this,"sortProperties"),u=this;return i&&s?(i=i.slice(),i.sort(function(e,t){return u.orderBy(e,t)}),n(i,function(e){n(o,function(t){Ember.addObserver(e,t,this,"contentItemSortPropertyDidChange")},this)},this),Ember.A(i)):i}),_contentWillChange:Ember.beforeObserver(function(){var t=e(this,"content"),r=e(this,"sortProperties");t&&r&&n(t,function(e){n(r,function(t){Ember.removeObserver(e,t,this,"contentItemSortPropertyDidChange")},this)},this),this._super()},"content"),sortAscendingWillChange:Ember.beforeObserver(function(){this._lastSortAscending=e(this,"sortAscending")},"sortAscending"),sortAscendingDidChange:Ember.observer(function(){if(e(this,"sortAscending")!==this._lastSortAscending){var t=e(this,"arrangedContent");t.reverseObjects()}},"sortAscending"),contentArrayWillChange:function(t,r,i,s){var o=e(this,"isSorted");if(o){var u=e(this,"arrangedContent"),a=t.slice(r,r+i),f=e(this,"sortProperties");n(a,function(e){u.removeObject(e),n(f,function(t){Ember.removeObserver(e,t,this,"contentItemSortPropertyDidChange")},this)},this)}return this._super(t,r,i,s)},contentArrayDidChange:function(t,r,i,s){var o=e(this,"isSorted"),u=e(this,"sortProperties");if(o){var a=t.slice(r,r+s);n(a,function(e){this.insertItemSorted(e),n(u,function(t){Ember.addObserver(e,t,this,"contentItemSortPropertyDidChange")},this)},this)}return this._super(t,r,i,s)},insertItemSorted:function(t){var n=e(this,"arrangedContent"),r=e(n,"length"),i=this._binarySearch(t,0,r);n.insertAt(i,t)},contentItemSortPropertyDidChange:function(t){var n=e(this,"arrangedContent"),r=n.indexOf(t),i=n.objectAt(r-1),s=n.objectAt(r+1),o=i&&this.orderBy(t,i),u=s&&this.orderBy(t,s);if(o<0||u>0)n.removeObject(t),this.insertItemSorted(t)},_binarySearch:function(t,n,r){var i,s,o,u;return n===r?n:(u=e(this,"arrangedContent"),i=n+Math.floor((r-n)/2),s=u.objectAt(i),o=this.orderBy(s,t),o<0?this._binarySearch(t,i+1,r):o>0?this._binarySearch(t,n,i):i)}})}(),function(){var e=Ember.get,t=Ember.set,n=Ember.EnumerableUtils.forEach,r=Ember.EnumerableUtils.replace;Ember.ArrayController=Ember.ArrayProxy.extend(Ember.ControllerMixin,Ember.SortableMixin,{itemController:null,lookupItemController:function(t){return e(this,"itemController")},objectAtContent:function(t){var n=e(this,"length"),r=e(this,"arrangedContent"),i=r&&r.objectAt(t);if(t>=0&&t<n){var s=this.lookupItemController(i);if(s)return this.controllerAt(t,i,s)}return i},arrangedContentDidChange:function(){this._super(),this._resetSubControllers()},arrayContentDidChange:function(t,i,s){var o=e(this,"_subControllers"),u=o.slice(t,t+i);n(u,function(e){e&&e.destroy()}),r(o,t,i,new Array(s)),this._super(t,i,s)},init:function(){this.get("content")||Ember.defineProperty(this,"content",undefined,Ember.A()),this._super(),this.set("_subControllers",Ember.A())},controllerAt:function(t,n,r){var i=e(this,"container"),s=e(this,"_subControllers"),o=s[t];o||(o=i.lookup("controller:"+r,{singleton:!1}),s[t]=o);if(!o)throw new Error('Could not resolve itemController: "'+r+'"');return o.set("target",this),o.set("content",n),o},_subControllers:null,_resetSubControllers:function(){var t=e(this,"_subControllers");n(t,function(e){e&&e.destroy()}),this.set("_subControllers",Ember.A())}})}(),function(){Ember.ObjectController=Ember.ObjectProxy.extend(Ember.ControllerMixin)}(),function(){}(),function(){}(),function(){var e=Ember.get,t=Ember.set;Ember.State=Ember.Object.extend(Ember.Evented,{isState:!0,parentState:null,start:null,name:null,path:Ember.computed(function(){var t=e(this,"parentState.path"),n=e(this,"name");return t&&(n=t+"."+n),n}),trigger:function(e){this[e]&&this[e].apply(this,[].slice.call(arguments,1)),this._super.apply(this,arguments)},init:function(){var n=e(this,"states");t(this,"childStates",Ember.A()),t(this,"eventTransitions",e(this,"eventTransitions")||{});var r,i,s;if(!n){n={};for(r in this){if(r==="constructor")continue;if(i=this[r]){if(s=i.transitionTarget)this.eventTransitions[r]=s;this.setupChild(n,r,i)}}t(this,"states",n)}else for(r in n)this.setupChild(n,r,n[r]);t(this,"pathsCache",{}),t(this,"pathsCacheNoContext",{})},setupChild:function(n,r,i){if(!i)return!1;i.isState?t(i,"name",r):Ember.State.detect(i)&&(i=i.create({name:r}));if(i.isState)return t(i,"parentState",this),e(this,"childStates").pushObject(i),n[r]=i,i},lookupEventTransition:function(e){var t,n=this;while(n&&!t)t=n.eventTransitions[e],n=n.get("parentState");return t},isLeaf:Ember.computed(function(){return!e(this,"childStates").length}),hasContext:!0,setup:Ember.K,enter:Ember.K,exit:Ember.K}),Ember.State.reopenClass({transitionTo:function(e){var t=function(t,n){var r=[],i=Ember.$&&Ember.$.Event;n&&i&&n instanceof i?n.hasOwnProperty("contexts")&&(r=n.contexts.slice()):r=[].slice.call(arguments,1),r.unshift(e),t.transitionTo.apply(t,r)};return t.transitionTarget=e,t}})}(),function(){var e=Ember.get,t=Ember.set,n=Ember.String.fmt,r=Ember.ArrayPolyfills.forEach,i=function(e){this.enterStates=e.enterStates.slice(),this.exitStates=e.exitStates.slice(),this.resolveState=e.resolveState,this.finalState=e.enterStates[e.enterStates.length-1]||e.resolveState};i.prototype={normalize:function(e,t){return this.matchContextsToStates(t),this.addInitialStates(),this.removeUnchangedContexts(e),this},matchContextsToStates:function(t){var n=this.enterStates.length-1,r=[],i,s;while(t.length>0){if(n>=0)i=this.enterStates[n--];else{if(this.enterStates.length){i=e(this.enterStates[0],"parentState");if(!i)throw"Cannot match all contexts to states"}else i=this.resolveState;this.enterStates.unshift(i),this.exitStates.unshift(i)}e(i,"hasContext")?s=t.pop():s=null,r.unshift(s)}this.contexts=r},addInitialStates:function(){var t=this.finalState,n;for(;;){n=e(t,"initialState")||"start",t=e(t,"states."+n);if(!t)break;this.finalState=t,this.enterStates.push(t),this.contexts.push(undefined)}},removeUnchangedContexts:function(e){while(this.enterStates.length>0){if(this.enterStates[0]!==this.exitStates[0])break;if(this.enterStates.length===this.contexts.length){if(e.getStateMeta(this.enterStates[0],"context")!==this.contexts[0])break;this.contexts.shift()}this.resolveState=this.enterStates.shift(),this.exitStates.shift()}}};var s=function(t,r,i){var u=this.enableLogging,a=i?"unhandledEvent":t,f=r[a],l,c,h;l=[].slice.call(arguments,3);if(typeof f=="function")return u&&(i?Ember.Logger.log(n("STATEMANAGER: Unhandled event '%@' being sent to state %@.",[t,e(r,"path")])):Ember.Logger.log(n("STATEMANAGER: Sending event '%@' to state %@.",[t,e(r,"path")]))),h=l,i&&h.unshift(t),h.unshift(this),f.apply(r,h);var p=e(r,"parentState");if(p)return c=l,c.unshift(t,p,i),s.apply(this,c);if(!i)return o.call(this,t,l,!0)},o=function(t,n,r){return n.unshift(t,e(this,"currentState"),r),s.apply(this,n)};Ember.StateManager=Ember.State.extend({init:function(){this._super(),t(this,"stateMeta",Ember.Map.create());var n=e(this,"initialState");!n&&e(this,"states.start")&&(n="start"),n&&this.transitionTo(n)},stateMetaFor:function(t){var n=e(this,"stateMeta"),r=n.get(t);return r||(r={},n.set(t,r)),r},setStateMeta:function(e,n,r){return t(this.stateMetaFor(e),n,r)},getStateMeta:function(t,n){return e(this.stateMetaFor(t),n)},currentState:null,currentPath:Ember.computed.alias("currentState.path"),transitionEvent:"setup",errorOnUnhandledEvent:!0,send:function(e){var t=[].slice.call(arguments,1);return o.call(this,e,t,!1)},unhandledEvent:function(t,n){if(e(this,"errorOnUnhandledEvent"))throw new Ember.Error(this.toString()+" could not respond to event "+n+" in state "+e(this,"currentState.path")+".")},getStateByPath:function(t,n){var r=n.split("."),i=t;for(var s=0,o=r.length;s<o;s++){i=e(e(i,"states"),r[s]);if(!i)break}return i},findStateByPath:function(t,n){var r;while(!r&&t)r=this.getStateByPath(t,n),t=e(t,"parentState");return r},getStatesInPath:function(t,n){if(!n||n==="")return undefined;var r=n.split("."),i=[],s,o;for(var u=0,a=r.length;u<a;u++){s=e(t,"states");if(!s)return undefined;o=e(s,r[u]);if(!o)return undefined;t=o,i.push(o)}return i},goToState:function(){return this.transitionTo.apply(this,arguments)},transitionTo:function(t,n){if(Ember.isEmpty(t))return;var r=n?Array.prototype.slice.call(arguments,1):[],s=e(this,"currentState")||this,o=this.contextFreeTransition(s,t),u=(new i(o)).normalize(this,r);this.enterState(u),this.triggerSetupContext(u)},contextFreeTransition:function(t,n){var r=t.pathsCache[n];if(r)return r;var i=this.getStatesInPath(t,n),s=[],o=t;while(o&&!i){s.unshift(o),o=e(o,"parentState");if(!o){i=this.getStatesInPath(this,n);if(!i)return}i=this.getStatesInPath(o,n)}while(i.length>0&&i[0]===s[0])o=i.shift(),s.shift();var u=t.pathsCache[n]={exitStates:s,enterStates:i,resolveState:o};return u},triggerSetupContext:function(t){var n=t.contexts,i=t.enterStates.length-n.length,s=t.enterStates,o=e(this,"transitionEvent");r.call(s,function(e,t){e.trigger(o,this,n[t-i])},this)},getState:function(t){var n=e(this,t),r=e(this,"parentState");if(n)return n;if(r)return r.getState(t)},enterState:function(n){var i=this.enableLogging,s=n.exitStates.slice(0).reverse();r.call(s,function(e){e.trigger("exit",this)},this),r.call(n.enterStates,function(t){i&&Ember.Logger.log("STATEMANAGER: Entering "+e(t,"path")),t.trigger("enter",this)},this),t(this,"currentState",n.finalState)}})}(),function(){}()})(),typeof location!="undefined"&&(location.hostname==="localhost"||location.hostname==="127.0.0.1")&&console.warn("You are running a production build of Ember on localhost and won't receive detailed error messages. If you want full error messages please use the non-minified build provided on the Ember website.");
15
+ (function(){var e,t;(function(){var n={},r={};e=function(e,t,r){n[e]={deps:t,callback:r}},t=function(e){if(r[e])return r[e];r[e]={};var i=n[e],s=i.deps,o=i.callback,u=[],a;for(var f=0,l=s.length;f<l;f++)s[f]==="exports"?u.push(a={}):u.push(t(s[f]));var c=o.apply(this,u);return r[e]=a||c}})(),function(){function r(t){if(e.console&&e.console[t])return e.console[t].apply?function(){e.console[t].apply(e.console,arguments)}:function(){var n=Array.prototype.join.call(arguments,", ");e.console[t](n)}}"undefined"==typeof Ember&&(Ember={});var e=Ember.imports=Ember.imports||this,t=Ember.exports=Ember.exports||this,n=Ember.lookup=Ember.lookup||this;t.Em=t.Ember=Em=Ember,Ember.isNamespace=!0,Ember.toString=function(){return"Ember"},Ember.VERSION="1.0.0-rc.2",Ember.ENV=Ember.ENV||("undefined"==typeof ENV?{}:ENV),Ember.config=Ember.config||{},Ember.EXTEND_PROTOTYPES=Ember.ENV.EXTEND_PROTOTYPES,typeof Ember.EXTEND_PROTOTYPES=="undefined"&&(Ember.EXTEND_PROTOTYPES=!0),Ember.LOG_STACKTRACE_ON_DEPRECATION=Ember.ENV.LOG_STACKTRACE_ON_DEPRECATION!==!1,Ember.SHIM_ES5=Ember.ENV.SHIM_ES5===!1?!1:Ember.EXTEND_PROTOTYPES,Ember.LOG_VERSION=Ember.ENV.LOG_VERSION===!1?!1:!0,Ember.K=function(){return this},"undefined"==typeof Ember.assert&&(Ember.assert=Ember.K),"undefined"==typeof Ember.warn&&(Ember.warn=Ember.K),"undefined"==typeof Ember.debug&&(Ember.debug=Ember.K),"undefined"==typeof Ember.deprecate&&(Ember.deprecate=Ember.K),"undefined"==typeof Ember.deprecateFunc&&(Ember.deprecateFunc=function(e,t){return t}),Ember.uuid=0,Ember.Logger={log:r("log")||Ember.K,warn:r("warn")||Ember.K,error:r("error")||Ember.K,info:r("info")||Ember.K,debug:r("debug")||r("info")||Ember.K},Ember.onerror=null,Ember.handleErrors=function(e,t){if("function"!=typeof Ember.onerror)return e.call(t||this);try{return e.call(t||this)}catch(n){Ember.onerror(n)}},Ember.merge=function(e,t){for(var n in t){if(!t.hasOwnProperty(n))continue;e[n]=t[n]}return e},Ember.isNone=function(e){return e===null||e===undefined},Ember.none=Ember.deprecateFunc("Ember.none is deprecated. Please use Ember.isNone instead.",Ember.isNone),Ember.isEmpty=function(e){return e===null||e===undefined||e.length===0&&typeof e!="function"||typeof e=="object"&&Ember.get(e,"length")===0},Ember.empty=Ember.deprecateFunc("Ember.empty is deprecated. Please use Ember.isEmpty instead.",Ember.isEmpty)}(),function(){var e=Ember.platform={};Ember.create=Object.create;if(!Ember.create||Ember.ENV.STUB_OBJECT_CREATE){var t=function(){};Ember.create=function(e,n){t.prototype=e,e=new t;if(n){t.prototype=e;for(var r in n)t.prototype[r]=n[r].value;e=new t}return t.prototype=null,e},Ember.create.isSimulated=!0}var n=Object.defineProperty,r,i;if(n)try{n({},"a",{get:function(){}})}catch(s){n=null}n&&(r=function(){var e={};return n(e,"a",{configurable:!0,enumerable:!0,get:function(){},set:function(){}}),n(e,"a",{configurable:!0,enumerable:!0,writable:!0,value:!0}),e.a===!0}(),i=function(){try{return n(document.createElement("div"),"definePropertyOnDOM",{}),!0}catch(e){}return!1}(),r?i||(n=function(e,t,n){var r;return typeof Node=="object"?r=e instanceof Node:r=typeof e=="object"&&typeof e.nodeType=="number"&&typeof e.nodeName=="string",r?e[t]=n.value:Object.defineProperty(e,t,n)}):n=null),e.defineProperty=n,e.hasPropertyAccessors=!0,e.defineProperty||(e.hasPropertyAccessors=!1,e.defineProperty=function(e,t,n){n.get||(e[t]=n.value)},e.defineProperty.isSimulated=!0),Ember.ENV.MANDATORY_SETTER&&!e.hasPropertyAccessors&&(Ember.ENV.MANDATORY_SETTER=!1)}(),function(){function h(e){this.descs={},this.watching={},this.cache={},this.source=e}function p(e,t){return!!e&&typeof e[t]=="function"}var e=Ember.platform.defineProperty,t=Ember.create,n="__ember"+ +(new Date),r=0,i=[],s={},o=Ember.ENV.MANDATORY_SETTER;Ember.GUID_KEY=n;var u={writable:!1,configurable:!1,enumerable:!1,value:null};Ember.generateGuid=function(i,s){s||(s="ember");var o=s+r++;return i&&(u.value=o,e(i,n,u)),o},Ember.guidFor=function(o){if(o===undefined)return"(undefined)";if(o===null)return"(null)";var a,f,l=typeof o;switch(l){case"number":return f=i[o],f||(f=i[o]="nu"+o),f;case"string":return f=s[o],f||(f=s[o]="st"+r++),f;case"boolean":return o?"(true)":"(false)";default:if(o[n])return o[n];if(o===Object)return"(Object)";if(o===Array)return"(Array)";return f="ember"+r++,u.value=f,e(o,n,u),f}};var a={writable:!0,configurable:!1,enumerable:!1,value:null},f=Ember.GUID_KEY+"_meta";Ember.META_KEY=f;var l={descs:{},watching:{}};o&&(l.values={}),Ember.EMPTY_META=l,Object.freeze&&Object.freeze(l);var c=Ember.platform.defineProperty.isSimulated;c&&(h.prototype.__preventPlainObject__=!0,h.prototype.toJSON=function(){}),Ember.meta=function(r,i){var s=r[f];return i===!1?s||l:(s?s.source!==r&&(c||e(r,f,a),s=t(s),s.descs=t(s.descs),s.watching=t(s.watching),s.cache={},s.source=r,o&&(s.values=t(s.values)),r[f]=s):(c||e(r,f,a),s=new h(r),o&&(s.values={}),r[f]=s,s.descs.constructor=null),s)},Ember.getMeta=function(t,n){var r=Ember.meta(t,!1);return r[n]},Ember.setMeta=function(t,n,r){var i=Ember.meta(t,!0);return i[n]=r,r},Ember.metaPath=function(n,r,i){var s=Ember.meta(n,i),o,u;for(var a=0,f=r.length;a<f;a++){o=r[a],u=s[o];if(!u){if(!i)return undefined;u=s[o]={__ember_source__:n}}else if(u.__ember_source__!==n){if(!i)return undefined;u=s[o]=t(u),u.__ember_source__=n}s=u}return u},Ember.wrap=function(e,t){function n(){}function r(){var r,i=this._super;return this._super=t||n,r=e.apply(this,arguments),this._super=i,r}return r.wrappedFunction=e,r.__ember_observes__=e.__ember_observes__,r.__ember_observesBefore__=e.__ember_observesBefore__,r},Ember.isArray=function(e){return!e||e.setInterval?!1:Array.isArray&&Array.isArray(e)?!0:Ember.Array&&Ember.Array.detect(e)?!0:e.length!==undefined&&"object"==typeof e?!0:!1},Ember.makeArray=function(e){return e===null||e===undefined?[]:Ember.isArray(e)?e:[e]},Ember.canInvoke=p,Ember.tryInvoke=function(e,t,n){if(p(e,t))return e[t].apply(e,n||[])};var d=function(){var e=0;try{try{}finally{throw e++,new Error("needsFinallyFixTest")}}catch(t){}return e!==1}();d?Ember.tryFinally=function(e,t,n){var r,i,s;n=n||this;try{r=e.call(n)}finally{try{i=t.call(n)}catch(o){s=o}}if(s)throw s;return i===undefined?r:i}:Ember.tryFinally=function(e,t,n){var r,i;n=n||this;try{r=e.call(n)}finally{i=t.call(n)}return i===undefined?r:i},d?Ember.tryCatchFinally=function(e,t,n,r){var i,s,o,u;r=r||this;try{i=e.call(r)}catch(a){i=t.call(r,a)}finally{try{s=n.call(r)}catch(f){o=f}}if(o)throw o;return s===undefined?i:s}:Ember.tryCatchFinally=function(e,t,n,r){var i,s;r=r||this;try{i=e.call(r)}catch(o){i=t.call(r,o)}finally{s=n.call(r)}return s===undefined?i:s}}(),function(){Ember.Instrumentation={};var e=[],t={},n=function(n){var r=[],i;for(var s=0,o=e.length;s<o;s++)i=e[s],i.regex.test(n)&&r.push(i.object);return t[n]=r,r},r=function(){var e="undefined"!=typeof window?window.performance||{}:{},t=e.now||e.mozNow||e.webkitNow||e.msNow||e.oNow;return t?t.bind(e):function(){return+(new Date)}}();Ember.Instrumentation.instrument=function(e,i,s,o){function d(){for(h=0,p=u.length;h<p;h++)c=u[h],l[h]=c.before(e,r(),i);return s.call(o)}function v(e){i=i||{},i.exception=e}function m(){for(h=0,p=u.length;h<p;h++)c=u[h],c.after(e,r(),i,l[h]);Ember.STRUCTURED_PROFILE&&console.timeEnd(a)}var u=t[e],a,f;Ember.STRUCTURED_PROFILE&&(a=e+": "+i.object,console.time(a)),u||(u=n(e));if(u.length===0)return f=s.call(o),Ember.STRUCTURED_PROFILE&&console.timeEnd(a),f;var l=[],c,h,p;return Ember.tryCatchFinally(d,v,m)},Ember.Instrumentation.subscribe=function(n,r){var i=n.split("."),s,o=[];for(var u=0,a=i.length;u<a;u++)s=i[u],s==="*"?o.push("[^\\.]*"):o.push(s);o=o.join("\\."),o+="(\\..*)?";var f={pattern:n,regex:new RegExp("^"+o+"$"),object:r};return e.push(f),t={},f},Ember.Instrumentation.unsubscribe=function(n){var r;for(var i=0,s=e.length;i<s;i++)e[i]===n&&(r=i);e.splice(r,1),t={}},Ember.Instrumentation.reset=function(){e=[],t={}},Ember.instrument=Ember.Instrumentation.instrument,Ember.subscribe=Ember.Instrumentation.subscribe}(),function(){var e=Ember.EnumerableUtils={map:function(e,t,n){return e.map?e.map.call(e,t,n):Array.prototype.map.call(e,t,n)},forEach:function(e,t,n){return e.forEach?e.forEach.call(e,t,n):Array.prototype.forEach.call(e,t,n)},indexOf:function(e,t,n){return e.indexOf?e.indexOf.call(e,t,n):Array.prototype.indexOf.call(e,t,n)},indexesOf:function(t,n){return n===undefined?[]:e.map(n,function(n){return e.indexOf(t,n)})},addObject:function(t,n){var r=e.indexOf(t,n);r===-1&&t.push(n)},removeObject:function(t,n){var r=e.indexOf(t,n);r!==-1&&t.splice(r,1)},replace:function(e,t,n,r){if(e.replace)return e.replace(t,n,r);var i=Array.prototype.concat.apply([t,n],r);return e.splice.apply(e,i)},intersection:function(e,t){var n=[];return e.forEach(function(e){t.indexOf(e)>=0&&n.push(e)}),n}}}(),function(){var e=function(e){return e&&Function.prototype.toString.call(e).indexOf("[native code]")>-1},t=e(Array.prototype.map)?Array.prototype.map:function(e){if(this===void 0||this===null)throw new TypeError;var t=Object(this),n=t.length>>>0;if(typeof e!="function")throw new TypeError;var r=new Array(n),i=arguments[1];for(var s=0;s<n;s++)s in t&&(r[s]=e.call(i,t[s],s,t));return r},n=e(Array.prototype.forEach)?Array.prototype.forEach:function(e){if(this===void 0||this===null)throw new TypeError;var t=Object(this),n=t.length>>>0;if(typeof e!="function")throw new TypeError;var r=arguments[1];for(var i=0;i<n;i++)i in t&&e.call(r,t[i],i,t)},r=e(Array.prototype.indexOf)?Array.prototype.indexOf:function(e,t){t===null||t===undefined?t=0:t<0&&(t=Math.max(0,this.length+t));for(var n=t,r=this.length;n<r;n++)if(this[n]===e)return n;return-1};Ember.ArrayPolyfills={map:t,forEach:n,indexOf:r},Ember.SHIM_ES5&&(Array.prototype.map||(Array.prototype.map=t),Array.prototype.forEach||(Array.prototype.forEach=n),Array.prototype.indexOf||(Array.prototype.indexOf=r))}(),function(){var e=Ember.guidFor,t=Ember.ArrayPolyfills.indexOf,n=function(e){var t={};for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t},r=function(e,t){var r=e.keys.copy(),i=n(e.values);return t.keys=r,t.values=i,t},i=Ember.OrderedSet=function(){this.clear()};i.create=function(){return new i},i.prototype={clear:function(){this.presenceSet={},this.list=[]},add:function(t){var n=e(t),r=this.presenceSet,i=this.list;if(n in r)return;r[n]=!0,i.push(t)},remove:function(n){var r=e(n),i=this.presenceSet,s=this.list;delete i[r];var o=t.call(s,n);o>-1&&s.splice(o,1)},isEmpty:function(){return this.list.length===0},has:function(t){var n=e(t),r=this.presenceSet;return n in r},forEach:function(e,t){var n=this.list.slice();for(var r=0,i=n.length;r<i;r++)e.call(t,n[r])},toArray:function(){return this.list.slice()},copy:function(){var e=new i;return e.presenceSet=n(this.presenceSet),e.list=this.list.slice(),e}};var s=Ember.Map=function(){this.keys=Ember.OrderedSet.create(),this.values={}};s.create=function(){return new s},s.prototype={get:function(t){var n=this.values,r=e(t);return n[r]},set:function(t,n){var r=this.keys,i=this.values,s=e(t);r.add(t),i[s]=n},remove:function(t){var n=this.keys,r=this.values,i=e(t),s;return r.hasOwnProperty(i)?(n.remove(t),s=r[i],delete r[i],!0):!1},has:function(t){var n=this.values,r=e(t);return n.hasOwnProperty(r)},forEach:function(t,n){var r=this.keys,i=this.values;r.forEach(function(r){var s=e(r);t.call(n,r,i[s])})},copy:function(){return r(this,new s)}};var o=Ember.MapWithDefault=function(e){s.call(this),this.defaultValue=e.defaultValue};o.create=function(e){return e?new o(e):new s},o.prototype=Ember.create(s.prototype),o.prototype.get=function(e){var t=this.has(e);if(t)return s.prototype.get.call(this,e);var n=this.defaultValue(e);return this.set(e,n),n},o.prototype.copy=function(){return r(this,new o({defaultValue:this.defaultValue}))}}(),function(){function a(e){return e.match(u)[0]}function f(e,n){var r=o.test(n),i=!r&&s.test(n),u;if(!e||i)e=Ember.lookup;r&&(n=n.slice(5)),e===Ember.lookup&&(u=a(n),e=t(e,u),n=n.slice(u.length+1));if(!n||n.length===0)throw new Error("Invalid Path");return[e,n]}function l(e,n){var r,i,s,u,a;if(e===null&&n.indexOf(".")===-1)return t(Ember.lookup,n);r=o.test(n);if(!e||r)s=f(e,n),e=s[0],n=s[1],s.length=0;i=n.split("."),a=i.length;for(u=0;e&&u<a;u++){e=t(e,i[u],!0);if(e&&e.isDestroyed)return undefined}return e}function c(e,t,r,i){var s;s=t.slice(t.lastIndexOf(".")+1),t=t.slice(0,t.length-(s.length+1)),t!=="this"&&(e=l(e,t));if(!s||s.length===0)throw new Error("You passed an empty path");if(!e){if(i)return;throw new Error("Object in path "+t+" could not be found or was destroyed.")}return n(e,s,r)}var e=Ember.META_KEY,t,n,r=Ember.ENV.MANDATORY_SETTER,i=/^([A-Z$]|([0-9][A-Z$]))/,s=/^([A-Z$]|([0-9][A-Z$])).*[\.\*]/,o=/^this[\.\*]/,u=/^([^\.\*]+)/;t=function(n,i){if(i==="")return n;!i&&"string"==typeof n&&(i=n,n=null);if(!n||i.indexOf(".")!==-1)return l(n,i);var s=n[e],o=s&&s.descs[i],u;return o?o.get(n,i):(r&&s&&s.watching[i]>0?u=s.values[i]:u=n[i],u!==undefined||"object"!=typeof n||i in n||"function"!=typeof n.unknownProperty?u:n.unknownProperty(i))},n=function(n,i,s,o){typeof n=="string"&&(s=i,i=n,n=null);if(!n||i.indexOf(".")!==-1)return c(n,i,s,o);var u=n[e],a=u&&u.descs[i],f,l;return a?a.set(n,i,s):(f="object"==typeof n&&!(i in n),f&&"function"==typeof n.setUnknownProperty?n.setUnknownProperty(i,s):u&&u.watching[i]>0?(r?l=u.values[i]:l=n[i],s!==l&&(Ember.propertyWillChange(n,i),r?l!==undefined||i in n?u.values[i]=s:Ember.defineProperty(n,i,null,s):n[i]=s,Ember.propertyDidChange(n,i))):n[i]=s),s},Ember.config.overrideAccessors&&(Ember.get=t,Ember.set=n,Ember.config.overrideAccessors(),t=Ember.get,n=Ember.set),Ember.normalizeTuple=function(e,t){return f(e,t)},Ember.getWithDefault=function(e,n,r){var i=t(e,n);return i===undefined?r:i},Ember.get=t,Ember.getPath=Ember.deprecateFunc("getPath is deprecated since get now supports paths",Ember.get),Ember.set=n,Ember.setPath=Ember.deprecateFunc("setPath is deprecated since set now supports paths",Ember.set),Ember.trySet=function(e,t,r){return n(e,t,r,!0)},Ember.trySetPath=Ember.deprecateFunc("trySetPath has been renamed to trySet",Ember.trySet),Ember.isGlobalPath=function(e){return i.test(e)}}(),function(){var e=Ember.META_KEY,t=Ember.meta,n=Ember.platform.defineProperty,r=Ember.ENV.MANDATORY_SETTER,i=Ember.Descriptor=function(){},s=Ember.MANDATORY_SETTER_FUNCTION=function(e){},o=Ember.DEFAULT_GETTER_FUNCTION=function(t){return function(){var n=this[e];return n&&n.values[t]}};Ember.defineProperty=function(e,i,u,a,f){var l,c,h,p;return f||(f=t(e)),l=f.descs,c=f.descs[i],h=f.watching[i]>0,c instanceof Ember.Descriptor&&c.teardown(e,i),u instanceof Ember.Descriptor?(p=u,l[i]=u,r&&h?n(e,i,{configurable:!0,enumerable:!0,writable:!0,value:undefined}):e[i]=undefined,u.setup(e,i)):(l[i]=undefined,u==null?(p=a,r&&h?(f.values[i]=a,n(e,i,{configurable:!0,enumerable:!0,set:s,get:o(i)})):e[i]=a):(p=u,n(e,i,u))),h&&Ember.overrideChains(e,i,f),e.didDefineProperty&&e.didDefineProperty(e,i,p),this}}(),function(){function i(){this.clear()}function u(t){return t+e}function a(e){return e+t}var e=":change",t=":before",n=Ember.guidFor,r=0;i.prototype.add=function(e,t,n){var r=this.observerSet,i=this.observers,s=Ember.guidFor(e),o=r[s],u;return o||(r[s]=o={}),u=o[t],u===undefined&&(u=i.push({sender:e,keyName:t,eventName:n,listeners:[]})-1,o[t]=u),i[u].listeners},i.prototype.flush=function(){var e=this.observers,t,n,r,i;this.clear();for(t=0,n=e.length;t<n;++t){r=e[t],i=r.sender;if(i.isDestroying||i.isDestroyed)continue;Ember.sendEvent(i,r.eventName,[i,r.keyName],r.listeners)}},i.prototype.clear=function(){this.observerSet={},this.observers=[]};var s=new i,o=new i;Ember.beginPropertyChanges=function(){r++},Ember.endPropertyChanges=function(){r--,r<=0&&(s.clear(),o.flush())},Ember.changeProperties=function(e,t){Ember.beginPropertyChanges(),Ember.tryFinally(e,Ember.endPropertyChanges,t)},Ember.setProperties=function(e,t){return Ember.changeProperties(function(){for(var n in t)t.hasOwnProperty(n)&&Ember.set(e,n,t[n])}),e},Ember.addObserver=function(e,t,n,r){return Ember.addListener(e,u(t),n,r),Ember.watch(e,t),this},Ember.observersFor=function(e,t){return Ember.listenersFor(e,u(t))},Ember.removeObserver=function(e,t,n,r){return Ember.unwatch(e,t),Ember.removeListener(e,u(t),n,r),this},Ember.addBeforeObserver=function(e,t,n,r){return Ember.addListener(e,a(t),n,r),Ember.watch(e,t),this},Ember._suspendBeforeObserver=function(e,t,n,r,i){return Ember._suspendListener(e,a(t),n,r,i)},Ember._suspendObserver=function(e,t,n,r,i){return Ember._suspendListener(e,u(t),n,r,i)};var f=Ember.ArrayPolyfills.map;Ember._suspendBeforeObservers=function(e,t,n,r,i){var s=f.call(t,a);return Ember._suspendListeners(e,s,n,r,i)},Ember._suspendObservers=function(e,t,n,r,i){var s=f.call(t,u);return Ember._suspendListeners(e,s,n,r,i)},Ember.beforeObserversFor=function(e,t){return Ember.listenersFor(e,a(t))},Ember.removeBeforeObserver=function(e,t,n,r){return Ember.unwatch(e,t),Ember.removeListener(e,a(t),n,r),this},Ember.notifyBeforeObservers=function(e,t){if(e.isDestroying)return;var n=a(t),i,o;r?(i=s.add(e,t,n),o=Ember.listenersDiff(e,n,i),Ember.sendEvent(e,n,[e,t],o)):Ember.sendEvent(e,n,[e,t])},Ember.notifyObservers=function(e,t){if(e.isDestroying)return;var n=u(t),i;r?(i=o.add(e,t,n),Ember.listenersUnion(e,n,i)):Ember.sendEvent(e,n,[e,t])}}(),function(){function h(e){return e.match(a)[0]}function p(e){return e==="*"||!f.test(e)}function d(t,n,r,i,s){var o=e(n);i[o]||(i[o]={});if(i[o][r])return;i[o][r]=!0;var u=s.deps;u=u&&u[r];if(u)for(var a in u){var f=s.descs[a];if(f&&f._suspended===n)continue;t(n,a)}}function g(e,t,n){if(e.isDestroying)return;var r=v,i=!r;i&&(r=v={}),d(A,e,t,r,n),i&&(v=null)}function y(e,t,n){if(e.isDestroying)return;var r=m,i=!r;i&&(r=m={}),d(O,e,t,r,n),i&&(m=null)}function b(e,n,r){if(!e||"object"!=typeof e)return;var i=t(e),s=i.chainWatchers;i.hasOwnProperty("chainWatchers")||(s=i.chainWatchers={}),s[n]||(s[n]=[]),s[n].push(r),Ember.watch(e,n)}function w(e,n,r){if(!e||"object"!=typeof e)return;var i=t(e,!1);if(!i.hasOwnProperty("chainWatchers"))return;var s=i.chainWatchers;if(s[n]){s=s[n];for(var o=0,u=s.length;o<u;o++)s[o]===r&&s.splice(o,1)}Ember.unwatch(e,n)}function S(){if(E.length===0)return;var e=E;E=[],u.call(e,function(e){e[0].add(e[1])})}function x(e){return t(e,!1).proto===e}function C(e){var n=t(e),r=n.chains;return r?r.value()!==e&&(r=n.chains=r.copy(e)):r=n.chains=new T(null,null,e),r}function k(e,t,n,r){if(!n.hasOwnProperty("chainWatchers"))return;var i=n.chainWatchers;i=i[t];if(!i)return;for(var s=0,o=i.length;s<o;s++)i[s].willChange(r)}function L(e,t,n,r){if(!n.hasOwnProperty("chainWatchers"))return;var i=n.chainWatchers;i=i[t];if(!i)return;for(var s=i.length-1;s>=0;s--)i[s].didChange(r)}function A(e,n){var r=t(e,!1),i=r.watching[n]>0||n==="length",s=r.proto,o=r.descs[n];if(!i)return;if(s===e)return;o&&o.willChange&&o.willChange(e,n),g(e,n,r),k(e,n,r),Ember.notifyBeforeObservers(e,n)}function O(e,n){var r=t(e,!1),i=r.watching[n]>0||n==="length",s=r.proto,o=r.descs[n];if(s===e)return;o&&o.didChange&&o.didChange(e,n);if(!i&&n!=="length")return;y(e,n,r),L(e,n,r),Ember.notifyObservers(e,n)}var e=Ember.guidFor,t=Ember.meta,n=Ember.get,r=Ember.set,i=Ember.normalizeTuple,s=Ember.GUID_KEY,o=Ember.META_KEY,u=Ember.ArrayPolyfills.forEach,a=/^([^\.\*]+)/,f=/[\.\*]/,l=Ember.ENV.MANDATORY_SETTER,c=Ember.platform.defineProperty,v,m,E=[],T=function(e,t,n){var r;this._parent=e,this._key=t,this._watching=n===undefined,this._value=n,this._paths={},this._watching&&(this._object=e.value(),this._object&&b(this._object,this._key,this)),this._parent&&this._parent._key==="@each"&&this.value()},N=T.prototype;N.value=function(){if(this._value===undefined&&this._watching){var e=this._parent.value();this._value=e&&!x(e)?n(e,this._key):undefined}return this._value},N.destroy=function(){if(this._watching){var e=this._object;e&&w(e,this._key,this),this._watching=!1}},N.copy=function(e){var t=new T(null,null,e),n=this._paths,r;for(r in n){if(n[r]<=0)continue;t.add(r)}return t},N.add=function(e){var t,n,r,s,o;o=this._paths,o[e]=(o[e]||0)+1,t=this.value(),n=i(t,e);if(n[0]&&n[0]===t)e=n[1],r=h(e),e=e.slice(r.length+1);else{if(!n[0]){E.push([this,e]),n.length=0;return}s=n[0],r=e.slice(0,0-(n[1].length+1)),e=n[1]}n.length=0,this.chain(r,e,s)},N.remove=function(e){var t,n,r,s,o;o=this._paths,o[e]>0&&o[e]--,t=this.value(),n=i(t,e),n[0]===t?(e=n[1],r=h(e),e=e.slice(r.length+1)):(s=n[0],r=e.slice(0,0-(n[1].length+1)),e=n[1]),n.length=0,this.unchain(r,e)},N.count=0,N.chain=function(e,t,n){var r=this._chains,i;r||(r=this._chains={}),i=r[e],i||(i=r[e]=new T(this,e,n)),i.count++,t&&t.length>0&&(e=h(t),t=t.slice(e.length+1),i.chain(e,t))},N.unchain=function(e,t){var n=this._chains,r=n[e];t&&t.length>1&&(e=h(t),t=t.slice(e.length+1),r.unchain(e,t)),r.count--,r.count<=0&&(delete n[r._key],r.destroy())},N.willChange=function(){var e=this._chains;if(e)for(var t in e){if(!e.hasOwnProperty(t))continue;e[t].willChange()}this._parent&&this._parent.chainWillChange(this,this._key,1)},N.chainWillChange=function(e,t,n){this._key&&(t=this._key+"."+t),this._parent?this._parent.chainWillChange(this,t,n+1):(n>1&&Ember.propertyWillChange(this.value(),t),t="this."+t,this._paths[t]>0&&Ember.propertyWillChange(this.value(),t))},N.chainDidChange=function(e,t,n){this._key&&(t=this._key+"."+t),this._parent?this._parent.chainDidChange(this,t,n+1):(n>1&&Ember.propertyDidChange(this.value(),t),t="this."+t,this._paths[t]>0&&Ember.propertyDidChange(this.value(),t))},N.didChange=function(e){if(this._watching){var t=this._parent.value();t!==this._object&&(w(this._object,this._key,this),this._object=t,b(t,this._key,this)),this._value=undefined,this._parent&&this._parent._key==="@each"&&this.value()}var n=this._chains;if(n)for(var r in n){if(!n.hasOwnProperty(r))continue;n[r].didChange(e)}if(e)return;this._parent&&this._parent.chainDidChange(this,this._key,1)},Ember.overrideChains=function(e,t,n){L(e,t,n,!0)},Ember.watch=function(e,n){if(n==="length"&&Ember.typeOf(e)==="array")return this;var r=t(e),i=r.watching,s;return i[n]?i[n]=(i[n]||0)+1:(i[n]=1,p(n)?(s=r.descs[n],s&&s.willWatch&&s.willWatch(e,n),"function"==typeof e.willWatchProperty&&e.willWatchProperty(n),l&&n in e&&(r.values[n]=e[n],c(e,n,{configurable:!0,enumerable:!0,set:Ember.MANDATORY_SETTER_FUNCTION,get:Ember.DEFAULT_GETTER_FUNCTION(n)}))):C(e).add(n)),this},Ember.isWatching=function(t,n){var r=t[o];return(r&&r.watching[n])>0},Ember.watch.flushPending=S,Ember.unwatch=function(e,n){if(n==="length"&&Ember.typeOf(e)==="array")return this;var r=t(e),i=r.watching,s;return i[n]===1?(i[n]=0,p(n)?(s=r.descs[n],s&&s.didUnwatch&&s.didUnwatch(e,n),"function"==typeof e.didUnwatchProperty&&e.didUnwatchProperty(n),l&&n in e&&(c(e,n,{configurable:!0,enumerable:!0,writable:!0,value:r.values[n]}),delete r.values[n])):C(e).remove(n)):i[n]>1&&i[n]--,this},Ember.rewatch=function(e){var n=t(e,!1),r=n.chains;return s in e&&!e.hasOwnProperty(s)&&Ember.generateGuid(e,"ember"),r&&r.value()!==e&&(n.chains=r.copy(e)),this},Ember.finishChains=function(e){var n=t(e,!1),r=n.chains;r&&(r.value()!==e&&(n.chains=r=r.copy(e)),r.didChange(!0))},Ember.propertyWillChange=A,Ember.propertyDidChange=O;var M=[];Ember.destroy=function(e){var t=e[o],n,r,i,s;if(t){e[o]=null,n=t.chains;if(n){M.push(n);while(M.length>0){n=M.pop(),r=n._chains;if(r)for(i in r)r.hasOwnProperty(i)&&M.push(r[i]);n._watching&&(s=n._object,s&&w(s,n._key,n))}}}}}(),function(){function a(e,t,n){var r=t[n];return r?t.hasOwnProperty(n)||(r=t[n]=i(r)):r=t[n]={},r}function f(e,t){return a(e,t,"deps")}function l(e,t,n,r){var i=e._dependentKeys,s,u,l,c,h;if(!i)return;s=f(t,r);for(u=0,l=i.length;u<l;u++)c=i[u],h=a(t,s,c),h[n]=(h[n]||0)+1,o(t,c)}function c(e,t,n,r){var i=e._dependentKeys,s,o,l,c,h;if(!i)return;s=f(t,r);for(o=0,l=i.length;o<l;o++)c=i[o],h=a(t,s,c),h[n]=(h[n]||0)-1,u(t,c)}function h(e,t){this.func=e,this._cacheable=t&&t.cacheable!==undefined?t.cacheable:!0,this._dependentKeys=t&&t.dependentKeys,this._readOnly=t&&(t.readOnly!==undefined||!!t.readOnly)}function d(t,n){var r={};for(var i=0;i<n.length;i++)r[n[i]]=e(t,n[i]);return r}function v(e,t){Ember.computed[e]=function(e){var n=r.call(arguments);return Ember.computed(e,function(){return t.apply(this,n)})}}function m(e,t){Ember.computed[e]=function(){var e=r.call(arguments),n=Ember.computed(function(){return t.apply(this,[d(this,e)])});return n.property.apply(n,e)}}var e=Ember.get,t=Ember.set,n=Ember.meta,r=[].slice,i=Ember.create,s=Ember.META_KEY,o=Ember.watch,u=Ember.unwatch;Ember.ComputedProperty=h,h.prototype=new Ember.Descriptor;var p=h.prototype;p.cacheable=function(e){return this._cacheable=e!==!1,this},p.volatile=function(){return this.cacheable(!1)},p.readOnly=function(e){return this._readOnly=e===undefined||!!e,this},p.property=function(){var e=[];for(var t=0,n=arguments.length;t<n;t++)e.push(arguments[t]);return this._dependentKeys=e,this},p.meta=function(e){return arguments.length===0?this._meta||{}:(this._meta=e,this)},p.willWatch=function(e,t){var n=e[s];t in n.cache||l(this,e,t,n)},p.didUnwatch=function(e,t){var n=e[s];t in n.cache||c(this,e,t,n)},p.didChange=function(e,t){if(this._cacheable&&this._suspended!==e){var r=n(e);t in r.cache&&(delete r.cache[t],r.watching[t]||c(this,e,t,r))}},p.get=function(e,t){var r,i,s;if(this._cacheable){s=n(e),i=s.cache;if(t in i)return i[t];r=i[t]=this.func.call(e,t),s.watching[t]||l(this,e,t,s)}else r=this.func.call(e,t);return r},p.set=function(e,t,r){var i=this._cacheable,s=this.func,o=n(e,i),u=o.watching[t],a=this._suspended,f=!1,c=o.cache,h,p;if(this._readOnly)throw new Error("Cannot Set: "+t+" on: "+e.toString());this._suspended=e;try{i&&c.hasOwnProperty(t)&&(h=c[t],f=!0),s.wrappedFunction&&(s=s.wrappedFunction);if(s.length===3)p=s.call(e,t,r,h);else{if(s.length!==2){Ember.defineProperty(e,t,null,h),Ember.set(e,t,r);return}p=s.call(e,t,r)}if(f&&h===p)return;u&&Ember.propertyWillChange(e,t),f&&delete c[t],i&&(!u&&!f&&l(this,e,t,o),c[t]=p),u&&Ember.propertyDidChange(e,t)}finally{this._suspended=a}return p},p.setup=function(e,t){var r=e[s];r&&r.watching[t]&&l(this,e,t,n(e))},p.teardown=function(e,t){var r=n(e);return(r.watching[t]||t in r.cache)&&c(this,e,t,r),this._cacheable&&delete r.cache[t],null},Ember.computed=function(e){var t;arguments.length>1&&(t=r.call(arguments,0,-1),e=r.call(arguments,-1)[0]);if(typeof e!="function")throw new Error("Computed Property declared without a property function");var n=new h(e);return t&&n.property.apply(n,t),n},Ember.cacheFor=function(t,r){var i=n(t,!1).cache;if(i&&r in i)return i[r]},v("empty",function(t){return Ember.isEmpty(e(this,t))}),v("notEmpty",function(t){return!Ember.isEmpty(e(this,t))}),v("none",function(t){return Ember.isNone(e(this,t))}),v("not",function(t){return!e(this,t)}),v("bool",function(t){return!!e(this,t)}),v("match",function(t,n){var r=e(this,t);return typeof r=="string"?!!r.match(n):!1}),v("equal",function(t,n){return e(this,t)===n}),v("gt",function(t,n){return e(this,t)>n}),v("gte",function(t,n){return e(this,t)>=n}),v("lt",function(t,n){return e(this,t)<n}),v("lte",function(t,n){return e(this,t)<=n}),m("and",function(e){for(var t in e)if(e.hasOwnProperty(t)&&!e[t])return!1;return!0}),m("or",function(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!0;return!1}),m("any",function(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return e[t];return null}),m("map",function(e){var t=[];for(var n in e)e.hasOwnProperty(n)&&(Ember.isNone(e[n])?t.push(null):t.push(e[n]));return t}),Ember.computed.alias=function(n){return Ember.computed(n,function(r,i){return arguments.length>1?(t(this,n,i),i):e(this,n)})},Ember.computed.defaultTo=function(t){return Ember.computed(function(n,r,i){var s;return arguments.length===1?i!=null?i:e(this,t):r!=null?r:e(this,t)})}}(),function(){function r(e,t,n){var r=-1;for(var i=0,s=e.length;i<s;i++)if(t===e[i][0]&&n===e[i][1]){r=i;break}return r}function i(n,r){var i=t(n,!0),s;return i.listeners||(i.listeners={}),i.hasOwnProperty("listeners")||(i.listeners=e(i.listeners)),s=i.listeners[r],s&&!i.listeners.hasOwnProperty(r)?s=i.listeners[r]=i.listeners[r].slice():s||(s=i.listeners[r]=[]),s}function s(e,t,i){var s=e[n],o=s&&s.listeners&&s.listeners[t];if(!o)return;for(var u=o.length-1;u>=0;u--){var a=o[u][0],f=o[u][1],l=o[u][2],c=o[u][3],h=r(i,a,f);h===-1&&i.push([a,f,l,c])}}function o(e,t,i){var s=e[n],o=s&&s.listeners&&s.listeners[t],u=[];if(!o)return;for(var a=o.length-1;a>=0;a--){var f=o[a][0],l=o[a][1],c=o[a][2],h=o[a][3],p=r(i,f,l);if(p!==-1)continue;i.push([f,l,c,h]),u.push([f,l,c,h])}return u}function u(e,t,n,s,o){!s&&"function"==typeof n&&(s=n,n=null);var u=i(e,t),a=r(u,n,s);if(a!==-1)return;u.push([n,s,o,undefined]),"function"==typeof e.didAddListener&&e.didAddListener(t,n,s)}function a(e,t,s,o){function u(n,s,o){var u=i(e,t),a=r(u,n,s);if(a===-1)return;u.splice(a,1),"function"==typeof e.didRemoveListener&&e.didRemoveListener(t,n,s)}!o&&"function"==typeof s&&(o=s,s=null);if(o)u(s,o);else{var a=e[n],f=a&&a.listeners&&a.listeners[t];if(!f)return;for(var l=f.length-1;l>=0;l--)u(f[l][0],f[l][1])}}function f(e,t,n,s,o){function l(){return o.call(n)}function c(){f&&(f[3]=undefined)}!s&&"function"==typeof n&&(s=n,n=null);var u=i(e,t),a=r(u,n,s),f;return a!==-1&&(f=u[a].slice(),f[3]=!0,u[a]=f),Ember.tryFinally(l,c)}function l(e,t,n,s,o){function d(){return o.call(n)}function v(){for(c=0,h=u.length;c<h;c++)u[c][3]=undefined}!s&&"function"==typeof n&&(s=n,n=null);var u=[],a,f,l,c,h;for(c=0,h=t.length;c<h;c++){a=t[c],f=i(e,a);var p=r(f,n,s);p!==-1&&(l=f[p].slice(),l[3]=!0,f[p]=l,u.push(l))}return Ember.tryFinally(d,v)}function c(e){var t=e[n].listeners,r=[];if(t)for(var i in t)t[i]&&r.push(i);return r}function h(e,t,r,i){e!==Ember&&"function"==typeof e.sendEvent&&e.sendEvent(t,r);if(!i){var s=e[n];i=s&&s.listeners&&s.listeners[t]}if(!i)return;for(var o=i.length-1;o>=0;o--){if(!i[o]||i[o][3]===!0)continue;var u=i[o][0],f=i[o][1],l=i[o][2];l&&a(e,t,u,f),u||(u=e),"string"==typeof f&&(f=u[f]),r?f.apply(u,r):f.call(u)}return!0}function p(e,t){var r=e[n],i=r&&r.listeners&&r.listeners[t];return!!i&&!!i.length}function d(e,t){var r=[],i=e[n],s=i&&i.listeners&&i.listeners[t];if(!s)return r;for(var o=0,u=s.length;o<u;o++){var a=s[o][0],f=s[o][1];r.push([a,f])}return r}var e=Ember.create,t=Ember.meta,n=Ember.META_KEY;Ember.addListener=u,Ember.removeListener=a,Ember._suspendListener=f,Ember._suspendListeners=l,Ember.sendEvent=h,Ember.hasListeners=p,Ember.watchedEvents=c,Ember.listenersFor=d,Ember.listenersDiff=o,Ember.listenersUnion=s}(),function(){function n(t,n,r,i){return n===undefined&&(n=t,t=undefined),"string"==typeof n&&(n=t[n]),r&&i>0&&(r=r.length>i?e.call(r,i):null),Ember.handleErrors(function(){return n.apply(t||this,r||[])},this)}function u(){o=null,s.currentRunLoop&&s.end()}function c(){f=null,s(function(){var e=+(new Date),t=-1;for(var r in a){if(!a.hasOwnProperty(r))continue;var i=a[r];if(i&&i.expires)if(e>=i.expires)delete a[r],n(i.target,i.method,i.args,2);else if(t<0||i.expires<t)t=i.expires}t>0&&(f=setTimeout(c,t-e),l=t)})}function h(e,t){t[this.tguid]&&delete t[this.tguid][this.mguid],a[e]&&n(this.target,this.method,this.args),delete a[e]}function p(e,t,n,r){var i=Ember.guidFor(t),o=Ember.guidFor(n),u=s.autorun().onceTimers,f=u[i]&&u[i][o],l;return f&&a[f]?a[f].args=r:(l={target:t,method:n,args:r,tguid:i,mguid:o},f=Ember.guidFor(l),a[f]=l,u[i]||(u[i]={}),u[i][o]=f,s.schedule(e,l,h,f,u)),f}var e=[].slice,t=Ember.ArrayPolyfills.forEach,r,i=function(e){this._prev=e||null,this.onceTimers={}};i.prototype={end:function(){this.flush()},prev:function(){return this._prev},schedule:function(t,n,r){var i=this._queues,s;i||(i=this._queues={}),s=i[t],s||(s=i[t]=[]);var o=arguments.length>3?e.call(arguments,3):null;return s.push({target:n,method:r,args:o}),this},flush:function(e){function f(e){n(e.target,e.method,e.args)}function l(){t.call(u,f)}var i,s,o,u,a;if(!this._queues)return this;Ember.watch.flushPending();if(e)while(this._queues&&(u=this._queues[e]))this._queues[e]=null,e==="sync"?(a=Ember.LOG_BINDINGS,a&&Ember.Logger.log("Begin: Flush Sync Queue"),Ember.beginPropertyChanges(),Ember.tryFinally(l,Ember.endPropertyChanges),a&&Ember.Logger.log("End: Flush Sync Queue")):t.call(u,f);else{i=Ember.run.queues,o=i.length,s=0;e:while(s<o){e=i[s],u=this._queues&&this._queues[e],delete this._queues[e],u&&(e==="sync"?(a=Ember.LOG_BINDINGS,a&&Ember.Logger.log("Begin: Flush Sync Queue"),Ember.beginPropertyChanges(),Ember.tryFinally(l,Ember.endPropertyChanges),a&&Ember.Logger.log("End: Flush Sync Queue")):t.call(u,f));for(var c=0;c<=s;c++)if(this._queues&&this._queues[i[c]]){s=c;continue e}s++}}return r=null,this}},Ember.RunLoop=i,Ember.run=function(e,t){function i(){if(e||t)return n(e,t,r,2)}var r=arguments;return s.begin(),Ember.tryFinally(i,s.end)};var s=Ember.run;Ember.run.begin=function(){s
16
+ .currentRunLoop=new i(s.currentRunLoop)},Ember.run.end=function(){function e(){s.currentRunLoop.end()}function t(){s.currentRunLoop=s.currentRunLoop.prev()}Ember.tryFinally(e,t)},Ember.run.queues=["sync","actions","destroy"],Ember.run.schedule=function(e,t,n){var r=s.autorun();r.schedule.apply(r,arguments)};var o;Ember.run.hasScheduledTimers=function(){return!!o||!!f},Ember.run.cancelTimers=function(){o&&(clearTimeout(o),o=null),f&&(clearTimeout(f),f=null),a={}},Ember.run.autorun=function(){return s.currentRunLoop||(s.begin(),o||(o=setTimeout(u,1))),s.currentRunLoop},Ember.run.sync=function(){s.autorun(),s.currentRunLoop.flush("sync")};var a={},f,l;Ember.run.later=function(t,n){var r,i,s,o,u;return arguments.length===2&&"function"==typeof t?(u=n,n=t,t=undefined,r=[t,n]):(r=e.call(arguments),u=r.pop()),i=+(new Date)+u,s={target:t,method:n,expires:i,args:r},o=Ember.guidFor(s),a[o]=s,f&&i<l&&(clearTimeout(f),f=null),f||(f=setTimeout(c,u),l=i),o},Ember.run.once=function(t,n){return p("actions",t,n,e.call(arguments,2))},Ember.run.scheduleOnce=function(t,n,r,i){return p(t,n,r,e.call(arguments,3))},Ember.run.next=function(){var t=e.call(arguments);return t.push(1),s.later.apply(this,t)},Ember.run.cancel=function(e){delete a[e]}}(),function(){function i(t,n){return e(r(n)?Ember.lookup:t,n)}function o(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])}Ember.LOG_BINDINGS=!!Ember.ENV.LOG_BINDINGS;var e=Ember.get,t=Ember.set,n=Ember.guidFor,r=Ember.isGlobalPath,s=function(e,t){this._direction="fwd",this._from=t,this._to=e,this._directionMap=Ember.Map.create()};s.prototype={copy:function(){var e=new s(this._to,this._from);return this._oneWay&&(e._oneWay=!0),e},from:function(e){return this._from=e,this},to:function(e){return this._to=e,this},oneWay:function(){return this._oneWay=!0,this},toString:function(){var e=this._oneWay?"[oneWay]":"";return"Ember.Binding<"+n(this)+">("+this._from+" -> "+this._to+")"+e},connect:function(e){var t=this._from,n=this._to;return Ember.trySet(e,n,i(e,t)),Ember.addObserver(e,t,this,this.fromDidChange),this._oneWay||Ember.addObserver(e,n,this,this.toDidChange),this._readyToSync=!0,this},disconnect:function(e){var t=!this._oneWay;return Ember.removeObserver(e,this._from,this,this.fromDidChange),t&&Ember.removeObserver(e,this._to,this,this.toDidChange),this._readyToSync=!1,this},fromDidChange:function(e){this._scheduleSync(e,"fwd")},toDidChange:function(e){this._scheduleSync(e,"back")},_scheduleSync:function(e,t){var n=this._directionMap,r=n.get(e);r||(Ember.run.schedule("sync",this,this._sync,e),n.set(e,t)),r==="back"&&t==="fwd"&&n.set(e,"fwd")},_sync:function(t){var n=Ember.LOG_BINDINGS;if(t.isDestroyed||!this._readyToSync)return;var r=this._directionMap,s=r.get(t),o=this._from,u=this._to;r.remove(t);if(s==="fwd"){var a=i(t,this._from);n&&Ember.Logger.log(" ",this.toString(),"->",a,t),this._oneWay?Ember.trySet(t,u,a):Ember._suspendObserver(t,u,this,this.toDidChange,function(){Ember.trySet(t,u,a)})}else if(s==="back"){var f=e(t,this._to);n&&Ember.Logger.log(" ",this.toString(),"<-",f,t),Ember._suspendObserver(t,o,this,this.fromDidChange,function(){Ember.trySet(Ember.isGlobalPath(o)?Ember.lookup:t,o,f)})}}},o(s,{from:function(){var e=this,t=new e;return t.from.apply(t,arguments)},to:function(){var e=this,t=new e;return t.to.apply(t,arguments)},oneWay:function(e,t){var n=this,r=new n(null,e);return r.oneWay(t)}}),Ember.Binding=s,Ember.bind=function(e,t,n){return(new Ember.Binding(t,n)).connect(e)},Ember.oneWay=function(e,t,n){return(new Ember.Binding(t,n)).oneWay().connect(e)}}(),function(){function l(e){var t=Ember.meta(e,!0),n=t.mixins;return n?t.hasOwnProperty("mixins")||(n=t.mixins=u(n)):n=t.mixins={},n}function c(t,n){return n&&n.length>0&&(t.mixins=r.call(n,function(t){if(t instanceof e)return t;var n=new e;return n.properties=t,n})),t}function h(e){return"function"==typeof e&&e.isMethod!==!1&&e!==Boolean&&e!==Object&&e!==Number&&e!==Array&&e!==Date&&e!==String}function d(t,n){var r;return n instanceof e?(r=f(n),t[r]?p:(t[r]=n,n.properties)):n}function v(e,t,n){var r;return r=t.concatenatedProperties||n.concatenatedProperties,e.concatenatedProperties&&(r=r?r.concat(e.concatenatedProperties):e.concatenatedProperties),r}function m(e,t,n,r,i){var s;return r[t]===undefined&&(s=i[t]),s=s||e.descs[t],!!s&&s instanceof Ember.ComputedProperty?(n=u(n),n.func=Ember.wrap(n.func,s.func),n):n}function g(e,t,n,r,i){var s;return i[t]===undefined&&(s=r[t]),s=s||e[t],"function"!=typeof s?n:Ember.wrap(n,s)}function y(e,t,n,r){var i=r[t]||e[t];return i?"function"==typeof i.concat?i.concat(n):Ember.makeArray(i).concat(n):Ember.makeArray(n)}function b(e,n,r,s,o,u,a){if(r instanceof Ember.Descriptor){if(r===t&&o[n])return p;r.func&&(r=m(s,n,r,u,o)),o[n]=r,u[n]=undefined}else{if(h(r))r=g(e,n,r,u,o);else if(a&&i.call(a,n)>=0||n==="concatenatedProperties")r=y(e,n,r,u);o[n]=undefined,u[n]=r}}function w(e,t,n,r,i){function c(e){delete n[e],delete r[e]}var o,u,a,f,l;for(var h=0,m=e.length;h<m;h++){o=e[h],u=d(t,o);if(u===p)continue;if(u){l=Ember.meta(i),f=v(u,r,i);for(a in u){if(!u.hasOwnProperty(a))continue;b(i,a,u[a],l,n,r,f)}u.hasOwnProperty("toString")&&(i.toString=u.toString)}else o.mixins&&(w(o.mixins,t,n,r,i),o._without&&s.call(o._without,c))}}function E(e){var t=Ember.meta(e),n=t.required;if(!n||!t.hasOwnProperty("required"))n=t.required=n?u(n):{};return n}function x(e,t,n,r){if(S.test(t)){var i=r.bindings;i?r.hasOwnProperty("bindings")||(i=r.bindings=u(r.bindings)):i=r.bindings={},i[t]=n}}function T(e,t){var n=t.bindings,r,i,s;if(n){for(r in n)i=n[r],i&&(s=r.slice(0,-7),i instanceof Ember.Binding?(i=i.copy(),i.to(s)):i=new Ember.Binding(s,i),i.connect(e),e[r]=i);t.bindings={}}}function N(e,t){return T(e,t||Ember.meta(e)),e}function C(e,t,n,r,i){var s=t.methodName,o;return r[s]||i[s]?(o=i[s],t=r[s]):n.descs[s]?(t=n.descs[s],o=undefined):(t=undefined,o=e[s]),{desc:t,value:o}}function k(e,t,n,r,i){if("function"!=typeof n)return;var s=n[r];if(s)for(var o=0,u=s.length;o<u;o++)Ember[i](e,s[o],null,t)}function L(e,t,n){var r=e[t];k(e,t,r,"__ember_observesBefore__","removeBeforeObserver"),k(e,t,r,"__ember_observes__","removeObserver"),k(e,t,n,"__ember_observesBefore__","addBeforeObserver"),k(e,t,n,"__ember_observes__","addObserver")}function A(e,r,i){var s={},o={},u=Ember.meta(e),f,c,h;w(r,l(e),s,o,e);for(f in o){if(f==="contructor"||!o.hasOwnProperty(f))continue;h=s[f],c=o[f];if(h===t)continue;while(h&&h instanceof n){var p=C(e,h,u,s,o);h=p.desc,c=p.value}if(h===undefined&&c===undefined)continue;L(e,f,c),x(e,f,c,u),a(e,f,h,c,u)}return i||N(e,u),e}function M(e,t,n){var r=f(e);if(n[r])return!1;n[r]=!0;if(e===t)return!0;var i=e.mixins,s=i?i.length:0;while(--s>=0)if(M(i[s],t,n))return!0;return!1}function _(e,t,n){if(n[f(t)])return;n[f(t)]=!0;if(t.properties){var r=t.properties;for(var i in r)r.hasOwnProperty(i)&&(e[i]=!0)}else t.mixins&&s.call(t.mixins,function(t){_(e,t,n)})}var e,t,n,r=Ember.ArrayPolyfills.map,i=Ember.ArrayPolyfills.indexOf,s=Ember.ArrayPolyfills.forEach,o=[].slice,u=Ember.create,a=Ember.defineProperty,f=Ember.guidFor,p={},S=Ember.IS_BINDING=/^.+Binding$/;Ember.mixin=function(e){var t=o.call(arguments,1);return A(e,t,!1),e},Ember.Mixin=function(){return c(this,arguments)},e=Ember.Mixin,e._apply=A,e.applyPartial=function(e){var t=o.call(arguments,1);return A(e,t,!0)},e.finishPartial=N,Ember.anyUnprocessedMixins=!1,e.create=function(){Ember.anyUnprocessedMixins=!0;var e=this;return c(new e,arguments)};var O=e.prototype;O.reopen=function(){var t,n;this.properties?(t=e.create(),t.properties=this.properties,delete this.properties,this.mixins=[t]):this.mixins||(this.mixins=[]);var r=arguments.length,i=this.mixins,s;for(s=0;s<r;s++)t=arguments[s],t instanceof e?i.push(t):(n=e.create(),n.properties=t,i.push(n));return this},O.apply=function(e){return A(e,[this],!1)},O.applyPartial=function(e){return A(e,[this],!0)},O.detect=function(t){if(!t)return!1;if(t instanceof e)return M(t,this,{});var n=Ember.meta(t,!1).mixins;return n?!!n[f(this)]:!1},O.without=function(){var t=new e(this);return t._without=o.call(arguments),t},O.keys=function(){var e={},t={},n=[];_(e,this,t);for(var r in e)e.hasOwnProperty(r)&&n.push(r);return n},e.mixins=function(e){var t=Ember.meta(e,!1).mixins,n=[];if(!t)return n;for(var r in t){var i=t[r];i.properties||n.push(i)}return n},t=new Ember.Descriptor,t.toString=function(){return"(Required Property)"},Ember.required=function(){return t},n=function(e){this.methodName=e},n.prototype=new Ember.Descriptor,Ember.alias=function(e){return new n(e)},Ember.deprecateFunc("Ember.alias is deprecated. Please use Ember.aliasMethod or Ember.computed.alias instead.",Ember.alias),Ember.aliasMethod=function(e){return new n(e)},Ember.observer=function(e){var t=o.call(arguments,1);return e.__ember_observes__=t,e},Ember.immediateObserver=function(){for(var e=0,t=arguments.length;e<t;e++)var n=arguments[e];return Ember.observer.apply(this,arguments)},Ember.beforeObserver=function(e){var t=o.call(arguments,1);return e.__ember_observesBefore__=t,e}}(),function(){}(),function(){e("rsvp",[],function(){"use strict";function d(e,t){n.async(function(){e.trigger("promise:resolved",{detail:t}),e.isResolved=!0,e.resolvedValue=t})}function v(e,t){n.async(function(){e.trigger("promise:failed",{detail:t}),e.isRejected=!0,e.rejectedValue=t})}function m(e){var t,n=[],r=new c,i=e.length;i===0&&r.resolve([]);var s=function(e){return function(t){o(e,t)}},o=function(e,t){n[e]=t,--i===0&&r.resolve(n)},u=function(e){r.reject(e)};for(t=0;t<i;t++)e[t].then(s(t),u);return r}var e=typeof window!="undefined"?window:{},t=e.MutationObserver||e.WebKitMutationObserver,n,r;if(typeof process!="undefined"&&{}.toString.call(process)==="[object process]")r=function(e,t){process.nextTick(function(){e.call(t)})};else if(t){var i=[],s=new t(function(){var e=i.slice();i=[],e.forEach(function(e){var t=e[0],n=e[1];t.call(n)})}),o=document.createElement("div");s.observe(o,{attributes:!0}),window.addEventListener("unload",function(){s.disconnect(),s=null}),r=function(e,t){i.push([e,t]),o.setAttribute("drainQueue","drainQueue")}}else r=function(e,t){setTimeout(function(){e.call(t)},1)};var u=function(e,t){this.type=e;for(var n in t){if(!t.hasOwnProperty(n))continue;this[n]=t[n]}},a=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n][0]===t)return n;return-1},f=function(e){var t=e._promiseCallbacks;return t||(t=e._promiseCallbacks={}),t},l={mixin:function(e){return e.on=this.on,e.off=this.off,e.trigger=this.trigger,e},on:function(e,t,n){var r=f(this),i,s;e=e.split(/\s+/),n=n||this;while(s=e.shift())i=r[s],i||(i=r[s]=[]),a(i,t)===-1&&i.push([t,n])},off:function(e,t){var n=f(this),r,i,s;e=e.split(/\s+/);while(i=e.shift()){if(!t){n[i]=[];continue}r=n[i],s=a(r,t),s!==-1&&r.splice(s,1)}},trigger:function(e,t){var n=f(this),r,i,s,o,a;if(r=n[e])for(var l=0;l<r.length;l++)i=r[l],s=i[0],o=i[1],typeof t!="object"&&(t={detail:t}),a=new u(e,t),s.call(o,a)}},c=function(){this.on("promise:resolved",function(e){this.trigger("success",{detail:e.detail})},this),this.on("promise:failed",function(e){this.trigger("error",{detail:e.detail})},this)},h=function(){},p=function(e,t,n,r){var i=typeof n=="function",s,o,u,a;if(i)try{s=n(r.detail),u=!0}catch(f){a=!0,o=f}else s=r.detail,u=!0;s&&typeof s.then=="function"?s.then(function(e){t.resolve(e)},function(e){t.reject(e)}):i&&u?t.resolve(s):a?t.reject(o):t[e](s)};return c.prototype={then:function(e,t){var r=new c;return this.isResolved&&n.async(function(){p("resolve",r,e,{detail:this.resolvedValue})},this),this.isRejected&&n.async(function(){p("reject",r,t,{detail:this.rejectedValue})},this),this.on("promise:resolved",function(t){p("resolve",r,e,t)}),this.on("promise:failed",function(e){p("reject",r,t,e)}),r},resolve:function(e){d(this,e),this.resolve=h,this.reject=h},reject:function(e){v(this,e),this.resolve=h,this.reject=h}},l.mixin(c.prototype),n={async:r,Promise:c,Event:u,EventTarget:l,all:m,raiseOnUncaughtExceptions:!0},n})}(),function(){e("container",[],function(){function e(e){this.parent=e,this.dict={}}function t(t){this.parent=t,this.children=[],this.resolver=t&&t.resolver||function(){},this.registry=new e(t&&t.registry),this.cache=new e(t&&t.cache),this.typeInjections=new e(t&&t.typeInjections),this.injections={},this._options=new e(t&&t._options),this._typeOptions=new e(t&&t._typeOptions)}function n(e){throw new Error(e+" is not currently supported on child containers")}function r(e,t){var n=s(e,t,"singleton");return n!==!1}function i(e,t){var n={};if(!t)return n;var r,i;for(var s=0,o=t.length;s<o;s++)r=t[s],i=e.lookup(r.fullName),n[r.property]=i;return n}function s(e,t,n){var r=e._options.get(t);if(r&&r[n]!==undefined)return r[n];var i=t.split(":")[0];r=e._typeOptions.get(i);if(r)return r[n]}function o(e,t){var n=e.normalize(t);return e.resolve(n)}function u(e,t){var n=o(e,t),r=t.split(":"),u=r[0],a=r[1],f;if(s(e,t,"instantiate")===!1)return n;if(n){var l=[];l=l.concat(e.typeInjections.get(u)||[]),l=l.concat(e.injections[t]||[]);var c=i(e,l);return c.container=e,c._debugContainerKey=t,f=n.create(c),f}}function a(e,t){e.cache.eachLocal(function(n,r){if(s(e,n,"instantiate")===!1)return;t(r)})}function f(e){e.cache.eachLocal(function(t,n){if(s(e,t,"instantiate")===!1)return;n.destroy()}),e.cache.dict={}}return e.prototype={get:function(e){var t=this.dict;if(t.hasOwnProperty(e))return t[e];if(this.parent)return this.parent.get(e)},set:function(e,t){this.dict[e]=t},has:function(e){var t=this.dict;return t.hasOwnProperty(e)?!0:this.parent?this.parent.has(e):!1},eachLocal:function(e,t){var n=this.dict;for(var r in n)n.hasOwnProperty(r)&&e.call(t,r,n[r])}},t.prototype={child:function(){var e=new t(this);return this.children.push(e),e},set:function(e,t,n){e[t]=n},register:function(e,t,n,r){var i;e.indexOf(":")!==-1?(r=n,n=t,i=e):i=e+":"+t;var s=this.normalize(i);this.registry.set(s,n),this._options.set(s,r||{})},resolve:function(e){return this.resolver(e)||this.registry.get(e)},normalize:function(e){return e},lookup:function(e,t){e=this.normalize(e),t=t||{};if(this.cache.has(e)&&t.singleton!==!1)return this.cache.get(e);var n=u(this,e);if(!n)return;return r(this,e)&&t.singleton!==!1&&this.cache.set(e,n),n},has:function(e){return this.cache.has(e)?!0:!!o(this,e)},optionsForType:function(e,t){this.parent&&n("optionsForType"),this._typeOptions.set(e,t)},options:function(e,t){this.optionsForType(e,t)},typeInjection:function(e,t,r){this.parent&&n("typeInjection");var i=this.typeInjections.get(e);i||(i=[],this.typeInjections.set(e,i)),i.push({property:t,fullName:r})},injection:function(e,t,r){this.parent&&n("injection");if(e.indexOf(":")===-1)return this.typeInjection(e,t,r);var i=this.injections[e]=this.injections[e]||[];i.push({property:t,fullName:r})},destroy:function(){this.isDestroyed=!0;for(var e=0,t=this.children.length;e<t;e++)this.children[e].destroy();this.children=[],a(this,function(e){e.isDestroying=!0}),a(this,function(e){e.destroy()}),delete this.parent,this.isDestroyed=!0},reset:function(){for(var e=0,t=this.children.length;e<t;e++)f(this.children[e]);f(this)}},t})}(),function(){function i(t,n,r,s){var o,u,a;if("object"!=typeof t||t===null)return t;if(n&&(u=e(r,t))>=0)return s[u];if(Ember.typeOf(t)==="array"){o=t.slice();if(n){u=o.length;while(--u>=0)o[u]=i(o[u],n,r,s)}}else if(Ember.Copyable&&Ember.Copyable.detect(t))o=t.copy(n,r,s);else{o={};for(a in t){if(!t.hasOwnProperty(a))continue;if(a.substring(0,2)==="__")continue;o[a]=n?i(t[a],n,r,s):t[a]}}return n&&(r.push(t),s.push(o)),o}var e=Ember.EnumerableUtils.indexOf,t={},n="Boolean Number String Function Array Date RegExp Object".split(" ");Ember.ArrayPolyfills.forEach.call(n,function(e){t["[object "+e+"]"]=e.toLowerCase()});var r=Object.prototype.toString;Ember.typeOf=function(e){var n;return n=e===null||e===undefined?String(e):t[r.call(e)]||"object",n==="function"?Ember.Object&&Ember.Object.detect(e)&&(n="class"):n==="object"&&(e instanceof Error?n="error":Ember.Object&&e instanceof Ember.Object?n="instance":n="object"),n},Ember.compare=function o(e,t){if(e===t)return 0;var n=Ember.typeOf(e),r=Ember.typeOf(t),i=Ember.Comparable;if(i){if(n==="instance"&&i.detect(e.constructor))return e.constructor.compare(e,t);if(r==="instance"&&i.detect(t.constructor))return 1-t.constructor.compare(t,e)}var s=Ember.ORDER_DEFINITION_MAPPING;if(!s){var u=Ember.ORDER_DEFINITION;s=Ember.ORDER_DEFINITION_MAPPING={};var a,f;for(a=0,f=u.length;a<f;++a)s[u[a]]=a;delete Ember.ORDER_DEFINITION}var l=s[n],c=s[r];if(l<c)return-1;if(l>c)return 1;switch(n){case"boolean":case"number":if(e<t)return-1;if(e>t)return 1;return 0;case"string":var h=e.localeCompare(t);if(h<0)return-1;if(h>0)return 1;return 0;case"array":var p=e.length,d=t.length,v=Math.min(p,d),m=0,g=0;while(m===0&&g<v)m=o(e[g],t[g]),g++;if(m!==0)return m;if(p<d)return-1;if(p>d)return 1;return 0;case"instance":if(Ember.Comparable&&Ember.Comparable.detect(e))return e.compare(e,t);return 0;case"date":var y=e.getTime(),b=t.getTime();if(y<b)return-1;if(y>b)return 1;return 0;default:return 0}},Ember.copy=function(e,t){return"object"!=typeof e||e===null?e:Ember.Copyable&&Ember.Copyable.detect(e)?e.copy(t):i(e,t,t?[]:null,t?[]:null)},Ember.inspect=function(e){if(typeof e!="object"||e===null)return e+"";var t,n=[];for(var r in e)if(e.hasOwnProperty(r)){t=e[r];if(t==="toString")continue;Ember.typeOf(t)==="function"&&(t="function() { ... }"),n.push(r+": "+t)}return"{"+n.join(", ")+"}"},Ember.isEqual=function(e,t){return e&&"function"==typeof e.isEqual?e.isEqual(t):e===t},Ember.ORDER_DEFINITION=Ember.ENV.ORDER_DEFINITION||["undefined","null","boolean","number","string","array","object","instance","function","class","date"],Ember.keys=Object.keys,Ember.keys||(Ember.keys=function(e){var t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(n);return t});var s=["description","fileName","lineNumber","message","name","number","stack"];Ember.Error=function(){var e=Error.prototype.constructor.apply(this,arguments);for(var t=0;t<s.length;t++)this[s[t]]=e[s[t]]},Ember.Error.prototype=Ember.create(Error.prototype)}(),function(){Ember.RSVP=t("rsvp")}(),function(){var e=/[ _]/g,t={},n=/([a-z])([A-Z])/g,r=/(\-|_|\.|\s)+(.)?/g,i=/([a-z\d])([A-Z]+)/g,s=/\-|\s+/g;Ember.STRINGS={},Ember.String={fmt:function(e,t){var n=0;return e.replace(/%@([0-9]+)?/g,function(e,r){return r=r?parseInt(r,0)-1:n++,e=t[r],(e===null?"(null)":e===undefined?"":e).toString()})},loc:function(e,t){return e=Ember.STRINGS[e]||e,Ember.String.fmt(e,t)},w:function(e){return e.split(/\s+/)},decamelize:function(e){return e.replace(n,"$1_$2").toLowerCase()},dasherize:function(n){var r=t,i=r.hasOwnProperty(n),s;return i?r[n]:(s=Ember.String.decamelize(n).replace(e,"-"),r[n]=s,s)},camelize:function(e){return e.replace(r,function(e,t,n){return n?n.toUpperCase():""}).replace(/^([A-Z])/,function(e,t,n){return e.toLowerCase()})},classify:function(e){var t=e.split("."),n=[];for(var r=0,i=t.length;r<i;r++){var s=Ember.String.camelize(t[r]);n.push(s.charAt(0).toUpperCase()+s.substr(1))}return n.join(".")},underscore:function(e){return e.replace(i,"$1_$2").replace(s,"_").toLowerCase()},capitalize:function(e){return e.charAt(0).toUpperCase()+e.substr(1)}}}(),function(){var e=Ember.String.fmt,t=Ember.String.w,n=Ember.String.loc,r=Ember.String.camelize,i=Ember.String.decamelize,s=Ember.String.dasherize,o=Ember.String.underscore,u=Ember.String.capitalize,a=Ember.String.classify;if(Ember.EXTEND_PROTOTYPES===!0||Ember.EXTEND_PROTOTYPES.String)String.prototype.fmt=function(){return e(this,arguments)},String.prototype.w=function(){return t(this)},String.prototype.loc=function(){return n(this,arguments)},String.prototype.camelize=function(){return r(this)},String.prototype.decamelize=function(){return i(this)},String.prototype.dasherize=function(){return s(this)},String.prototype.underscore=function(){return o(this)},String.prototype.classify=function(){return a(this)},String.prototype.capitalize=function(){return u(this)}}(),function(){var e=Array.prototype.slice;if(Ember.EXTEND_PROTOTYPES===!0||Ember.EXTEND_PROTOTYPES.Function)Function.prototype.property=function(){var e=Ember.computed(this);return e.property.apply(e,arguments)},Function.prototype.observes=function(){return this.__ember_observes__=e.call(arguments),this},Function.prototype.observesBefore=function(){return this.__ember_observesBefore__=e.call(arguments),this}}(),function(){}(),function(){function s(){return i.length===0?{}:i.pop()}function o(e){return i.push(e),null}function u(t,n){function i(i){var s=e(i,t);return r?n===s:!!s}var r=arguments.length===2;return i}var e=Ember.get,t=Ember.set,n=Array.prototype.slice,r=Ember.EnumerableUtils.indexOf,i=[];Ember.Enumerable=Ember.Mixin.create({isEnumerable:!0,nextObject:Ember.required(Function),firstObject:Ember.computed(function(){if(e(this,"length")===0)return undefined;var t=s(),n;return n=this.nextObject(0,null,t),o(t),n}).property("[]"),lastObject:Ember.computed(function(){var t=e(this,"length");if(t===0)return undefined;var n=s(),r=0,i,u=null;do u=i,i=this.nextObject(r++,u,n);while(i!==undefined);return o(n),u}).property("[]"),contains:function(e){return this.find(function(t){return t===e})!==undefined},forEach:function(t,n){if(typeof t!="function")throw new TypeError;var r=e(this,"length"),i=null,u=s();n===undefined&&(n=null);for(var a=0;a<r;a++){var f=this.nextObject(a,i,u);t.call(n,f,a,this),i=f}return i=null,u=o(u),this},getEach:function(e){return this.mapProperty(e)},setEach:function(e,n){return this.forEach(function(r){t(r,e,n)})},map:function(e,t){var n=Ember.A([]);return this.forEach(function(r,i,s){n[i]=e.call(t,r,i,s)}),n},mapProperty:function(t){return this.map(function(n){return e(n,t)})},filter:function(e,t){var n=Ember.A([]);return this.forEach(function(r,i,s){e.call(t,r,i,s)&&n.push(r)}),n},reject:function(e,t){return this.filter(function(){return!e.apply(t,arguments)})},filterProperty:function(e,t){return this.filter(u.apply(this,arguments))},rejectProperty:function(t,n){var r=function(r){return e(r,t)===n},i=function(n){return!!e(n,t)},s=arguments.length===2?r:i;return this.reject(s)},find:function(t,n){var r=e(this,"length");n===undefined&&(n=null);var i=null,u,a=!1,f,l=s();for(var c=0;c<r&&!a;c++){u=this.nextObject(c,i,l);if(a=t.call(n,u,c,this))f=u;i=u}return u=i=null,l=o(l),f},findProperty:function(e,t){return this.find(u.apply(this,arguments))},every:function(e,t){return!this.find(function(n,r,i){return!e.call(t,n,r,i)})},everyProperty:function(e,t){return this.every(u.apply(this,arguments))},some:function(e,t){return!!this.find(function(n,r,i){return!!e.call(t,n,r,i)})},someProperty:function(e,t){return this.some(u.apply(this,arguments))},reduce:function(e,t,n){if(typeof e!="function")throw new TypeError;var r=t;return this.forEach(function(t,i){r=e.call(null,r,t,i,this,n)},this),r},invoke:function(e){var t,r=Ember.A([]);return arguments.length>1&&(t=n.call(arguments,1)),this.forEach(function(n,i){var s=n&&n[e];"function"==typeof s&&(r[i]=t?s.apply(n,t):s.call(n))},this),r},toArray:function(){var e=Ember.A([]);return this.forEach(function(t,n){e[n]=t}),e},compact:function(){return this.filter(function(e){return e!=null})},without:function(e){if(!this.contains(e))return this;var t=Ember.A([]);return this.forEach(function(n){n!==e&&(t[t.length]=n)}),t},uniq:function(){var e=Ember.A([]);return this.forEach(function(t){r(e,t)<0&&e.push(t)}),e},"[]":Ember.computed(function(e,t){return this}),addEnumerableObserver:function(t,n){var r=n&&n.willChange||"enumerableWillChange",i=n&&n.didChange||"enumerableDidChange",s=e(this,"hasEnumerableObservers");return s||Ember.propertyWillChange(this,"hasEnumerableObservers"),Ember.addListener(this,"@enumerable:before",t,r),Ember.addListener(this,"@enumerable:change",t,i),s||Ember.propertyDidChange(this,"hasEnumerableObservers"),this},removeEnumerableObserver:function(t,n){var r=n&&n.willChange||"enumerableWillChange",i=n&&n.didChange||"enumerableDidChange",s=e(this,"hasEnumerableObservers");return s&&Ember.propertyWillChange(this,"hasEnumerableObservers"),Ember.removeListener(this,"@enumerable:before",t,r),Ember.removeListener(this,"@enumerable:change",t,i),s&&Ember.propertyDidChange(this,"hasEnumerableObservers"),this},hasEnumerableObservers:Ember.computed(function(){return Ember.hasListeners(this,"@enumerable:change")||Ember.hasListeners(this,"@enumerable:before")}),enumerableContentWillChange:function(t,n){var r,i,s;return"number"==typeof t?r=t:t?r=e(t,"length"):r=t=-1,"number"==typeof n?i=n:n?i=e(n,"length"):i=n=-1,s=i<0||r<0||i-r!==0,t===-1&&(t=null),n===-1&&(n=null),Ember.propertyWillChange(this,"[]"),s&&Ember.propertyWillChange(this,"length"),Ember.sendEvent(this,"@enumerable:before",[this,t,n]),this},enumerableContentDidChange:function(t,n){var r,i,s;return"number"==typeof t?r=t:t?r=e(t,"length"):r=t=-1,"number"==typeof n?i=n:n?i=e(n,"length"):i=n=-1,s=i<0||r<0||i-r!==0,t===-1&&(t=null),n===-1&&(n=null),Ember.sendEvent(this,"@enumerable:change",[this,t,n]),s&&Ember.propertyDidChange(this,"length"),Ember.propertyDidChange(this,"[]"),this}})}(),function(){function i(e){return e===null||e===undefined}var e=Ember.get,t=Ember.set,n=Ember.EnumerableUtils.map,r=Ember.cacheFor;Ember.Array=Ember.Mixin.create(Ember.Enumerable,{isSCArray:!0,length:Ember.required(),objectAt:function(t){return t<0||t>=e(this,"length")?undefined:e(this,t)},objectsAt:function(e){var t=this;return n(e,function(e){return t.objectAt(e)})},nextObject:function(e){return this.objectAt(e)},"[]":Ember.computed(function(t,n){return n!==undefined&&this.replace(0,e(this,"length"),n),this}),firstObject:Ember.computed(function(){return this.objectAt(0)}),lastObject:Ember.computed(function(){return this.objectAt(e(this,"length")-1)}),contains:function(e){return this.indexOf(e)>=0},slice:function(t,n){var r=Ember.A([]),s=e(this,"length");i(t)&&(t=0);if(i(n)||n>s)n=s;t<0&&(t=s+t),n<0&&(n=s+n);while(t<n)r[r.length]=this.objectAt(t++);return r},indexOf:function(t,n){var r,i=e(this,"length");n===undefined&&(n=0),n<0&&(n+=i);for(r=n;r<i;r++)if(this.objectAt(r,!0)===t)return r;return-1},lastIndexOf:function(t,n){var r,i=e(this,"length");if(n===undefined||n>=i)n=i-1;n<0&&(n+=i);for(r=n;r>=0;r--)if(this.objectAt(r)===t)return r;return-1},addArrayObserver:function(t,n){var r=n&&n.willChange||"arrayWillChange",i=n&&n.didChange||"arrayDidChange",s=e(this,"hasArrayObservers");return s||Ember.propertyWillChange(this,"hasArrayObservers"),Ember.addListener(this,"@array:before",t,r),Ember.addListener(this,"@array:change",t,i),s||Ember.propertyDidChange(this,"hasArrayObservers"),this},removeArrayObserver:function(t,n){var r=n&&n.willChange||"arrayWillChange",i=n&&n.didChange||"arrayDidChange",s=e(this,"hasArrayObservers");return s&&Ember.propertyWillChange(this,"hasArrayObservers"),Ember.removeListener(this,"@array:before",t,r),Ember.removeListener(this,"@array:change",t,i),s&&Ember.propertyDidChange(this,"hasArrayObservers"),this},hasArrayObservers:Ember.computed(function(){return Ember.hasListeners(this,"@array:change")||Ember.hasListeners(this,"@array:before")}),arrayContentWillChange:function(t,n,r){t===undefined?(t=0,n=r=-1):(n===undefined&&(n=-1),r===undefined&&(r=-1)),Ember.isWatching(this,"@each")&&e(this,"@each"),Ember.sendEvent(this,"@array:before",[this,t,n,r]);var i,s;if(t>=0&&n>=0&&e(this,"hasEnumerableObservers")){i=[],s=t+n;for(var o=t;o<s;o++)i.push(this.objectAt(o))}else i=n;return this.enumerableContentWillChange(i,r),this},arrayContentDidChange:function(t,n,i){t===undefined?(t=0,n=i=-1):(n===undefined&&(n=-1),i===undefined&&(i=-1));var s,o;if(t>=0&&i>=0&&e(this,"hasEnumerableObservers")){s=[],o=t+i;for(var u=t;u<o;u++)s.push(this.objectAt(u))}else s=i;this.enumerableContentDidChange(n,s),Ember.sendEvent(this,"@array:change",[this,t,n,i]);var a=e(this,"length"),f=r(this,"firstObject"),l=r(this,"lastObject");return this.objectAt(0)!==f&&(Ember.propertyWillChange(this,"firstObject"),Ember.propertyDidChange(this,"firstObject")),this.objectAt(a-1)!==l&&(Ember.propertyWillChange(this,"lastObject"),Ember.propertyDidChange(this,"lastObject")),this},"@each":Ember.computed(function(){return this.__each||(this.__each=new Ember.EachProxy(this)),this.__each})})}(),function(){Ember.Comparable=Ember.Mixin.create({isComparable:!0,compare:Ember.required(Function)})}(),function(){var e=Ember.get,t=Ember.set;Ember.Copyable=Ember.Mixin.create({copy:Ember.required(Function),frozenCopy:function(){if(Ember.Freezable&&Ember.Freezable.detect(this))return e(this,"isFrozen")?this:this.copy().freeze();throw new Error(Ember.String.fmt("%@ does not support freezing",[this]))}})}(),function(){var e=Ember.get,t=Ember.set;Ember.Freezable=Ember.Mixin.create({isFrozen:!1,freeze:function(){return e(this,"isFrozen")?this:(t(this,"isFrozen",!0),this)}}),Ember.FROZEN_ERROR="Frozen object cannot be modified."}(),function(){var e=Ember.EnumerableUtils.forEach;Ember.MutableEnumerable=Ember.Mixin.create(Ember.Enumerable,{addObject:Ember.required(Function),addObjects:function(t){return Ember.beginPropertyChanges(this),e(t,function(e){this.addObject(e)},this),Ember.endPropertyChanges(this),this},removeObject:Ember.required(Function),removeObjects:function(t){return Ember.beginPropertyChanges(this),e(t,function(e){this.removeObject(e)},this),Ember.endPropertyChanges(this),this}})}(),function(){var e="Index out of range",t=[],n=Ember.get,r=Ember.set;Ember.MutableArray=Ember.Mixin.create(Ember.Array,Ember.MutableEnumerable,{replace:Ember.required(),clear:function(){var e=n(this,"length");return e===0?this:(this.replace(0,e,t),this)},insertAt:function(t,r){if(t>n(this,"length"))throw new Error(e);return this.replace(t,0,[r]),this},removeAt:function(r,i){if("number"==typeof r){if(r<0||r>=n(this,"length"))throw new Error(e);i===undefined&&(i=1),this.replace(r,i,t)}return this},pushObject:function(e){return this.insertAt(n(this,"length"),e),e},pushObjects:function(e){return this.replace(n(this,"length"),0,e),this},popObject:function(){var e=n(this,"length");if(e===0)return null;var t=this.objectAt(e-1);return this.removeAt(e-1,1),t},shiftObject:function(){if(n(this,"length")===0)return null;var e=this.objectAt(0);return this.removeAt(0),e},unshiftObject:function(e){return this.insertAt(0,e),e},unshiftObjects:function(e){return this.replace(0,0,e),this},reverseObjects:function(){var e=n(this,"length");if(e===0)return this;var t=this.toArray().reverse();return this.replace(0,e,t),this},setObjects:function(e){if(e.length===0)return this.clear();var t=n(this,"length");return this.replace(0,t,e),this},removeObject:function(e){var t=n(this,"length")||0;while(--t>=0){var r=this.objectAt(t);r===e&&this.removeAt(t)}return this},addObject:function(e){return this.contains(e)||this.pushObject(e),this}})}(),function(){var e=Ember.get,t=Ember.set;Ember.Observable=Ember.Mixin.create({get:function(t){return e(this,t)},getProperties:function(){var t={},n=arguments;arguments.length===1&&Ember.typeOf(arguments[0])==="array"&&(n=arguments[0]);for(var r=0;r<n.length;r++)t[n[r]]=e(this,n[r]);return t},set:function(e,n){return t(this,e,n),this},setProperties:function(e){return Ember.setProperties(this,e)},beginPropertyChanges:function(){return Ember.beginPropertyChanges(),this},endPropertyChanges:function(){return Ember.endPropertyChanges(),this},propertyWillChange:function(e){return Ember.propertyWillChange(this,e),this},propertyDidChange:function(e){return Ember.propertyDidChange(this,e),this},notifyPropertyChange:function(e){return this.propertyWillChange(e),this.propertyDidChange(e),this},addBeforeObserver:function(e,t,n){Ember.addBeforeObserver(this,e,t,n)},addObserver:function(e,t,n){Ember.addObserver(this,e,t,n)},removeObserver:function(e,t,n){Ember.removeObserver(this,e,t,n)},hasObserverFor:function(e){return Ember.hasListeners(this,e+":change")},getPath:function(e){return this.get(e)},setPath:function(e,t){return this.set(e,t)},getWithDefault:function(e,t){return Ember.getWithDefault(this,e,t)},incrementProperty:function(n,r){return r||(r=1),t(this,n,(e(this,n)||0)+r),e(this,n)},decrementProperty:function(n,r){return r||(r=1),t(this,n,(e(this,n)||0)-r),e(this,n)},toggleProperty:function(n){return t(this,n,!e(this,n)),e(this,n)},cacheFor:function(e){return Ember.cacheFor(this,e)},observersForKey:function(e){return Ember.observersFor(this,e)}})}(),function(){var e=Ember.get,t=Ember.set;Ember.TargetActionSupport=Ember.Mixin.create({target:null,action:null,targetObject:Ember.computed(function(){var t=e(this,"target");if(Ember.typeOf(t)==="string"){var n=e(this,t);return n===undefined&&(n=e(Ember.lookup,t)),n}return t}).property("target"),triggerAction:function(){var t=e(this,"action"),n=e(this,"targetObject");if(n&&t){var r;return typeof n.send=="function"?r=n.send(t,this):(typeof t=="string"&&(t=n[t]),r=t.call(n,this)),r!==!1&&(r=!0),r}return!1}})}(),function(){Ember.Evented=
17
+ Ember.Mixin.create({on:function(e,t,n){return Ember.addListener(this,e,t,n),this},one:function(e,t,n){return n||(n=t,t=null),Ember.addListener(this,e,t,n,!0),this},trigger:function(e){var t=[],n,r;for(n=1,r=arguments.length;n<r;n++)t.push(arguments[n]);Ember.sendEvent(this,e,t)},fire:function(e){this.trigger.apply(this,arguments)},off:function(e,t,n){return Ember.removeListener(this,e,t,n),this},has:function(e){return Ember.hasListeners(this,e)}})}(),function(){var e=t("rsvp");e.async=function(e,t){Ember.run.schedule("actions",t,e)};var n=Ember.get;Ember.DeferredMixin=Ember.Mixin.create({then:function(e,t){var r=n(this,"promise");return r.then.apply(r,arguments)},resolve:function(e){n(this,"promise").resolve(e)},reject:function(e){n(this,"promise").reject(e)},promise:Ember.computed(function(){return new e.Promise})})}(),function(){}(),function(){Ember.Container=t("container"),Ember.Container.set=Ember.set}(),function(){function b(){var e=!1,t,s,o=function(){e||o.proto(),r(this,i,y),r(this,"_super",y);var a=u(this);a.proto=this;if(t){var l=t;t=null,this.reopen.apply(this,l)}if(s){var c=s;s=null;var h=this.concatenatedProperties;for(var p=0,v=c.length;p<v;p++){var b=c[p];for(var w in b){if(!b.hasOwnProperty(w))continue;var E=b[w],S=Ember.IS_BINDING;if(S.test(w)){var x=a.bindings;x?a.hasOwnProperty("bindings")||(x=a.bindings=n(a.bindings)):x=a.bindings={},x[w]=E}var T=a.descs[w];if(h&&g(h,w)>=0){var N=this[w];N?"function"==typeof N.concat?E=N.concat(E):E=Ember.makeArray(N).concat(E):E=Ember.makeArray(E)}T?T.set(this,w,E):typeof this.setUnknownProperty!="function"||w in this?m?Ember.defineProperty(this,w,null,E):this[w]=E:this.setUnknownProperty(w,E)}}}d(this,a),delete a.proto,f(this),this.init.apply(this,arguments)};return o.toString=h.prototype.toString,o.willReopen=function(){e&&(o.PrototypeMixin=h.create(o.PrototypeMixin)),e=!1},o._initMixins=function(e){t=e},o._initProperties=function(e){s=e},o.proto=function(){var t=o.superclass;return t&&t.proto(),e||(e=!0,o.PrototypeMixin.applyPartial(o.prototype),a(o.prototype)),this.prototype},o}function E(e){return function(){return e}}var e=Ember.set,t=Ember.get,n=Ember.create,r=Ember.platform.defineProperty,i=Ember.GUID_KEY,s=Ember.guidFor,o=Ember.generateGuid,u=Ember.meta,a=Ember.rewatch,f=Ember.finishChains,l=Ember.destroy,c=Ember.run.schedule,h=Ember.Mixin,p=h._apply,d=h.finishPartial,v=h.prototype.reopen,m=Ember.ENV.MANDATORY_SETTER,g=Ember.EnumerableUtils.indexOf,y={configurable:!0,writable:!0,enumerable:!1,value:undefined},w=b();w.toString=function(){return"Ember.CoreObject"},w.PrototypeMixin=h.create({reopen:function(){return p(this,arguments,!0),this},isInstance:!0,init:function(){},concatenatedProperties:null,isDestroyed:!1,isDestroying:!1,destroy:function(){if(this._didCallDestroy)return;return this.isDestroying=!0,this._didCallDestroy=!0,this.willDestroy&&this.willDestroy(),c("destroy",this,this._scheduledDestroy),this},_scheduledDestroy:function(){l(this),e(this,"isDestroyed",!0),this.didDestroy&&this.didDestroy()},bind:function(e,t){return t instanceof Ember.Binding||(t=Ember.Binding.from(t)),t.to(e).connect(this),t},toString:function x(){var e=typeof this.toStringExtension=="function",t=e?":"+this.toStringExtension():"",n="<"+this.constructor.toString()+":"+s(this)+t+">";return this.toString=E(n),n}}),w.PrototypeMixin.ownerConstructor=w,Ember.config.overridePrototypeMixin&&Ember.config.overridePrototypeMixin(w.PrototypeMixin),w.__super__=null;var S=h.create({ClassMixin:Ember.required(),PrototypeMixin:Ember.required(),isClass:!0,isMethod:!1,extend:function(){var e=b(),t;return e.ClassMixin=h.create(this.ClassMixin),e.PrototypeMixin=h.create(this.PrototypeMixin),e.ClassMixin.ownerConstructor=e,e.PrototypeMixin.ownerConstructor=e,v.apply(e.PrototypeMixin,arguments),e.superclass=this,e.__super__=this.prototype,t=e.prototype=n(this.prototype),t.constructor=e,o(t,"ember"),u(t).proto=t,e.ClassMixin.apply(e),e},createWithMixins:function(){var e=this;return arguments.length>0&&this._initMixins(arguments),new e},create:function(){var e=this;return arguments.length>0&&this._initProperties(arguments),new e},reopen:function(){return this.willReopen(),v.apply(this.PrototypeMixin,arguments),this},reopenClass:function(){return v.apply(this.ClassMixin,arguments),p(this,arguments,!1),this},detect:function(e){if("function"!=typeof e)return!1;while(e){if(e===this)return!0;e=e.superclass}return!1},detectInstance:function(e){return e instanceof this},metaForProperty:function(e){var t=u(this.proto(),!1).descs[e];return t._meta||{}},eachComputedProperty:function(e,t){var n=this.proto(),r=u(n).descs,i={},s;for(var o in r)s=r[o],s instanceof Ember.ComputedProperty&&e.call(t||this,o,s._meta||i)}});S.ownerConstructor=w,Ember.config.overrideClassMixin&&Ember.config.overrideClassMixin(S),w.ClassMixin=S,S.apply(w),Ember.CoreObject=w}(),function(){Ember.Object=Ember.CoreObject.extend(Ember.Observable),Ember.Object.toString=function(){return"Ember.Object"}}(),function(){function o(e,t,n){var u=e.length;r[e.join(".")]=t;for(var f in t){if(!i.call(t,f))continue;var c=t[f];e[u]=f;if(c&&c.toString===l)c.toString=h(e.join(".")),c[a]=e.join(".");else if(c&&c.isNamespace){if(n[s(c)])continue;n[s(c)]=!0,o(e,c,n)}}e.length=u}function u(){var e=Ember.Namespace,t=Ember.lookup,n,r;if(e.PROCESSED)return;for(var i in t){if(i==="parent"||i==="top"||i==="frameElement")continue;if(i==="globalStorage"&&t.StorageList&&t.globalStorage instanceof t.StorageList)continue;if(t.hasOwnProperty&&!t.hasOwnProperty(i))continue;try{n=Ember.lookup[i],r=n&&n.isNamespace}catch(s){continue}r&&(n[a]=i)}}function f(e){var t=e.superclass;if(t)return t[a]?t[a]:f(t);return}function l(){!Ember.BOOTED&&!this[a]&&c();var e;if(this[a])e=this[a];else{var t=f(this);t?e="(subclass of "+t+")":e="(unknown mixin)",this.toString=h(e)}return e}function c(){var e=!n.PROCESSED,t=Ember.anyUnprocessedMixins;e&&(u(),n.PROCESSED=!0);if(e||t){var r=n.NAMESPACES,i;for(var s=0,a=r.length;s<a;s++)i=r[s],o([i.toString()],i,{});Ember.anyUnprocessedMixins=!1}}function h(e){return function(){return e}}var e=Ember.get,t=Ember.ArrayPolyfills.indexOf,n=Ember.Namespace=Ember.Object.extend({isNamespace:!0,init:function(){Ember.Namespace.NAMESPACES.push(this),Ember.Namespace.PROCESSED=!1},toString:function(){var t=e(this,"name");return t?t:(u(),this[Ember.GUID_KEY+"_name"])},nameClasses:function(){o([this.toString()],this,{})},destroy:function(){var e=Ember.Namespace.NAMESPACES;Ember.lookup[this.toString()]=undefined,e.splice(t.call(e,this),1),this._super()}});n.reopenClass({NAMESPACES:[Ember],NAMESPACES_BY_ID:{},PROCESSED:!1,processAll:c,byName:function(e){return Ember.BOOTED||c(),r[e]}});var r=n.NAMESPACES_BY_ID,i={}.hasOwnProperty,s=Ember.guidFor,a=Ember.NAME_KEY=Ember.GUID_KEY+"_name";Ember.Mixin.prototype.toString=l}(),function(){Ember.Application=Ember.Namespace.extend()}(),function(){var e="Index out of range",t=[],n=Ember.get,r=Ember.set;Ember.ArrayProxy=Ember.Object.extend(Ember.MutableArray,{content:null,arrangedContent:Ember.computed.alias("content"),objectAtContent:function(e){return n(this,"arrangedContent").objectAt(e)},replaceContent:function(e,t,r){n(this,"content").replace(e,t,r)},_contentWillChange:Ember.beforeObserver(function(){this._teardownContent()},"content"),_teardownContent:function(){var e=n(this,"content");e&&e.removeArrayObserver(this,{willChange:"contentArrayWillChange",didChange:"contentArrayDidChange"})},contentArrayWillChange:Ember.K,contentArrayDidChange:Ember.K,_contentDidChange:Ember.observer(function(){var e=n(this,"content");this._setupContent()},"content"),_setupContent:function(){var e=n(this,"content");e&&e.addArrayObserver(this,{willChange:"contentArrayWillChange",didChange:"contentArrayDidChange"})},_arrangedContentWillChange:Ember.beforeObserver(function(){var e=n(this,"arrangedContent"),t=e?n(e,"length"):0;this.arrangedContentArrayWillChange(this,0,t,undefined),this.arrangedContentWillChange(this),this._teardownArrangedContent(e)},"arrangedContent"),_arrangedContentDidChange:Ember.observer(function(){var e=n(this,"arrangedContent"),t=e?n(e,"length"):0;this._setupArrangedContent(),this.arrangedContentDidChange(this),this.arrangedContentArrayDidChange(this,0,undefined,t)},"arrangedContent"),_setupArrangedContent:function(){var e=n(this,"arrangedContent");e&&e.addArrayObserver(this,{willChange:"arrangedContentArrayWillChange",didChange:"arrangedContentArrayDidChange"})},_teardownArrangedContent:function(){var e=n(this,"arrangedContent");e&&e.removeArrayObserver(this,{willChange:"arrangedContentArrayWillChange",didChange:"arrangedContentArrayDidChange"})},arrangedContentWillChange:Ember.K,arrangedContentDidChange:Ember.K,objectAt:function(e){return n(this,"content")&&this.objectAtContent(e)},length:Ember.computed(function(){var e=n(this,"arrangedContent");return e?n(e,"length"):0}),_replace:function(e,t,r){var i=n(this,"content");return i&&this.replaceContent(e,t,r),this},replace:function(){if(n(this,"arrangedContent")!==n(this,"content"))throw new Ember.Error("Using replace on an arranged ArrayProxy is not allowed.");this._replace.apply(this,arguments)},_insertAt:function(t,r){if(t>n(this,"content.length"))throw new Error(e);return this._replace(t,0,[r]),this},insertAt:function(e,t){if(n(this,"arrangedContent")===n(this,"content"))return this._insertAt(e,t);throw new Ember.Error("Using insertAt on an arranged ArrayProxy is not allowed.")},removeAt:function(r,i){if("number"==typeof r){var s=n(this,"content"),o=n(this,"arrangedContent"),u=[],a;if(r<0||r>=n(this,"length"))throw new Error(e);i===undefined&&(i=1);for(a=r;a<r+i;a++)u.push(s.indexOf(o.objectAt(a)));u.sort(function(e,t){return t-e}),Ember.beginPropertyChanges();for(a=0;a<u.length;a++)this._replace(u[a],1,t);Ember.endPropertyChanges()}return this},pushObject:function(e){return this._insertAt(n(this,"content.length"),e),e},pushObjects:function(e){return this._replace(n(this,"length"),0,e),this},setObjects:function(e){if(e.length===0)return this.clear();var t=n(this,"length");return this._replace(0,t,e),this},unshiftObject:function(e){return this._insertAt(0,e),e},unshiftObjects:function(e){return this._replace(0,0,e),this},slice:function(){var e=this.toArray();return e.slice.apply(e,arguments)},arrangedContentArrayWillChange:function(e,t,n,r){this.arrayContentWillChange(t,n,r)},arrangedContentArrayDidChange:function(e,t,n,r){this.arrayContentDidChange(t,n,r)},init:function(){this._super(),this._setupContent(),this._setupArrangedContent()},willDestroy:function(){this._teardownArrangedContent(),this._teardownContent()}})}(),function(){function f(e,t){var n=t.slice(8);if(n in this)return;u(this,n)}function l(e,t){var n=t.slice(8);if(n in this)return;a(this,n)}var e=Ember.get,t=Ember.set,n=Ember.String.fmt,r=Ember.addBeforeObserver,i=Ember.addObserver,s=Ember.removeBeforeObserver,o=Ember.removeObserver,u=Ember.propertyWillChange,a=Ember.propertyDidChange;Ember.ObjectProxy=Ember.Object.extend({content:null,_contentDidChange:Ember.observer(function(){},"content"),isTruthy:Ember.computed.bool("content"),_debugContainerKey:null,willWatchProperty:function(e){var t="content."+e;r(this,t,null,f),i(this,t,null,l)},didUnwatchProperty:function(e){var t="content."+e;s(this,t,null,f),o(this,t,null,l)},unknownProperty:function(t){var n=e(this,"content");if(n)return e(n,t)},setUnknownProperty:function(n,r){var i=e(this,"content");return t(i,n,r)}}),Ember.ObjectProxy.reopenClass({create:function(){var e,t,n,r,i,s;if(arguments.length){t=this.proto();for(n=0,r=arguments.length;n<r;n++){i=arguments[n];for(s in i){if(!i.hasOwnProperty(s)||s in t)continue;e||(e={}),e[s]=null}}e&&this._initMixins([e])}return this._super.apply(this,arguments)}})}(),function(){function o(e,t,r,i,s){var o=r._objects,u;o||(o=r._objects={});while(--s>=i){var a=e.objectAt(s);a&&(Ember.addBeforeObserver(a,t,r,"contentKeyWillChange"),Ember.addObserver(a,t,r,"contentKeyDidChange"),u=n(a),o[u]||(o[u]=[]),o[u].push(s))}}function u(e,t,r,i,s){var o=r._objects;o||(o=r._objects={});var u,a;while(--s>=i){var f=e.objectAt(s);f&&(Ember.removeBeforeObserver(f,t,r,"contentKeyWillChange"),Ember.removeObserver(f,t,r,"contentKeyDidChange"),a=n(f),u=o[a],u[u.indexOf(s)]=null)}}var e=Ember.set,t=Ember.get,n=Ember.guidFor,r=Ember.EnumerableUtils.forEach,i=Ember.Object.extend(Ember.Array,{init:function(e,t,n){this._super(),this._keyName=t,this._owner=n,this._content=e},objectAt:function(e){var n=this._content.objectAt(e);return n&&t(n,this._keyName)},length:Ember.computed(function(){var e=this._content;return e?t(e,"length"):0})}),s=/^.+:(before|change)$/;Ember.EachProxy=Ember.Object.extend({init:function(e){this._super(),this._content=e,e.addArrayObserver(this),r(Ember.watchedEvents(this),function(e){this.didAddListener(e)},this)},unknownProperty:function(e,t){var n;return n=new i(this._content,e,this),Ember.defineProperty(this,e,null,n),this.beginObservingContentKey(e),n},arrayWillChange:function(e,t,n,r){var i=this._keys,s,o;o=n>0?t+n:-1,Ember.beginPropertyChanges(this);for(s in i){if(!i.hasOwnProperty(s))continue;o>0&&u(e,s,this,t,o),Ember.propertyWillChange(this,s)}Ember.propertyWillChange(this._content,"@each"),Ember.endPropertyChanges(this)},arrayDidChange:function(e,t,n,r){var i=this._keys,s,u;u=r>0?t+r:-1,Ember.beginPropertyChanges(this);for(s in i){if(!i.hasOwnProperty(s))continue;u>0&&o(e,s,this,t,u),Ember.propertyDidChange(this,s)}Ember.propertyDidChange(this._content,"@each"),Ember.endPropertyChanges(this)},didAddListener:function(e){s.test(e)&&this.beginObservingContentKey(e.slice(0,-7))},didRemoveListener:function(e){s.test(e)&&this.stopObservingContentKey(e.slice(0,-7))},beginObservingContentKey:function(e){var n=this._keys;n||(n=this._keys={});if(!n[e]){n[e]=1;var r=this._content,i=t(r,"length");o(r,e,this,0,i)}else n[e]++},stopObservingContentKey:function(e){var n=this._keys;if(n&&n[e]>0&&--n[e]<=0){var r=this._content,i=t(r,"length");u(r,e,this,0,i)}},contentKeyWillChange:function(e,t){Ember.propertyWillChange(this,t)},contentKeyDidChange:function(e,t){Ember.propertyDidChange(this,t)}})}(),function(){var e=Ember.get,t=Ember.set,n=Ember.Mixin.create(Ember.MutableArray,Ember.Observable,Ember.Copyable,{get:function(e){return e==="length"?this.length:"number"==typeof e?this[e]:this._super(e)},objectAt:function(e){return this[e]},replace:function(t,n,r){if(this.isFrozen)throw Ember.FROZEN_ERROR;var i=r?e(r,"length"):0;this.arrayContentWillChange(t,n,i);if(!r||r.length===0)this.splice(t,n);else{var s=[t,n].concat(r);this.splice.apply(this,s)}return this.arrayContentDidChange(t,n,i),this},unknownProperty:function(e,t){var n;return t!==undefined&&n===undefined&&(n=this[e]=t),n},indexOf:function(e,t){var n,r=this.length;t===undefined?t=0:t=t<0?Math.ceil(t):Math.floor(t),t<0&&(t+=r);for(n=t;n<r;n++)if(this[n]===e)return n;return-1},lastIndexOf:function(e,t){var n,r=this.length;t===undefined?t=r-1:t=t<0?Math.ceil(t):Math.floor(t),t<0&&(t+=r);for(n=t;n>=0;n--)if(this[n]===e)return n;return-1},copy:function(e){return e?this.map(function(e){return Ember.copy(e,!0)}):this.slice()}}),r=["length"];Ember.EnumerableUtils.forEach(n.keys(),function(e){Array.prototype[e]&&r.push(e)}),r.length>0&&(n=n.without.apply(n,r)),Ember.NativeArray=n,Ember.A=function(e){return e===undefined&&(e=[]),Ember.Array.detect(e)?e:Ember.NativeArray.apply(e)},Ember.NativeArray.activate=function(){n.apply(Array.prototype),Ember.A=function(e){return e||[]}},(Ember.EXTEND_PROTOTYPES===!0||Ember.EXTEND_PROTOTYPES.Array)&&Ember.NativeArray.activate()}(),function(){var e=Ember.get,t=Ember.set,n=Ember.guidFor,r=Ember.isNone,i=Ember.String.fmt;Ember.Set=Ember.CoreObject.extend(Ember.MutableEnumerable,Ember.Copyable,Ember.Freezable,{length:0,clear:function(){if(this.isFrozen)throw new Error(Ember.FROZEN_ERROR);var r=e(this,"length");if(r===0)return this;var i;this.enumerableContentWillChange(r,0),Ember.propertyWillChange(this,"firstObject"),Ember.propertyWillChange(this,"lastObject");for(var s=0;s<r;s++)i=n(this[s]),delete this[i],delete this[s];return t(this,"length",0),Ember.propertyDidChange(this,"firstObject"),Ember.propertyDidChange(this,"lastObject"),this.enumerableContentDidChange(r,0),this},isEqual:function(t){if(!Ember.Enumerable.detect(t))return!1;var n=e(this,"length");if(e(t,"length")!==n)return!1;while(--n>=0)if(!t.contains(this[n]))return!1;return!0},add:Ember.aliasMethod("addObject"),remove:Ember.aliasMethod("removeObject"),pop:function(){if(e(this,"isFrozen"))throw new Error(Ember.FROZEN_ERROR);var t=this.length>0?this[this.length-1]:null;return this.remove(t),t},push:Ember.aliasMethod("addObject"),shift:Ember.aliasMethod("pop"),unshift:Ember.aliasMethod("push"),addEach:Ember.aliasMethod("addObjects"),removeEach:Ember.aliasMethod("removeObjects"),init:function(e){this._super(),e&&this.addObjects(e)},nextObject:function(e){return this[e]},firstObject:Ember.computed(function(){return this.length>0?this[0]:undefined}),lastObject:Ember.computed(function(){return this.length>0?this[this.length-1]:undefined}),addObject:function(i){if(e(this,"isFrozen"))throw new Error(Ember.FROZEN_ERROR);if(r(i))return this;var s=n(i),o=this[s],u=e(this,"length"),a;return o>=0&&o<u&&this[o]===i?this:(a=[i],this.enumerableContentWillChange(null,a),Ember.propertyWillChange(this,"lastObject"),u=e(this,"length"),this[s]=u,this[u]=i,t(this,"length",u+1),Ember.propertyDidChange(this,"lastObject"),this.enumerableContentDidChange(null,a),this)},removeObject:function(i){if(e(this,"isFrozen"))throw new Error(Ember.FROZEN_ERROR);if(r(i))return this;var s=n(i),o=this[s],u=e(this,"length"),a=o===0,f=o===u-1,l,c;return o>=0&&o<u&&this[o]===i&&(c=[i],this.enumerableContentWillChange(c,null),a&&Ember.propertyWillChange(this,"firstObject"),f&&Ember.propertyWillChange(this,"lastObject"),o<u-1&&(l=this[u-1],this[o]=l,this[n(l)]=o),delete this[s],delete this[u-1],t(this,"length",u-1),a&&Ember.propertyDidChange(this,"firstObject"),f&&Ember.propertyDidChange(this,"lastObject"),this.enumerableContentDidChange(c,null)),this},contains:function(e){return this[n(e)]>=0},copy:function(){var r=this.constructor,i=new r,s=e(this,"length");t(i,"length",s);while(--s>=0)i[s]=this[s],i[n(this[s])]=s;return i},toString:function(){var e=this.length,t,n=[];for(t=0;t<e;t++)n[t]=this[t];return i("Ember.Set<%@>",[n.join(",")])}})}(),function(){var e=Ember.DeferredMixin,t=Ember.get,n=Ember.Object.extend(e);n.reopenClass({promise:function(e,r){var i=n.create();return e.call(r,i),t(i,"promise")}}),Ember.Deferred=n}(),function(){var e=Ember.ENV.EMBER_LOAD_HOOKS||{},t={};Ember.onLoad=function(n,r){var i;e[n]=e[n]||Ember.A(),e[n].pushObject(r),(i=t[n])&&r(i)},Ember.runLoadHooks=function(n,r){var i;t[n]=r,(i=e[n])&&e[n].forEach(function(e){e(r)})}}(),function(){}(),function(){var e=Ember.get;Ember.ControllerMixin=Ember.Mixin.create({isController:!0,target:null,container:null,store:null,model:Ember.computed.alias("content"),send:function(t){var n=[].slice.call(arguments,1),r;this[t]?this[t].apply(this,n):(r=e(this,"target"))&&r.send.apply(r,arguments)}}),Ember.Controller=Ember.Object.extend(Ember.ControllerMixin)}(),function(){var e=Ember.get,t=Ember.set,n=Ember.EnumerableUtils.forEach;Ember.SortableMixin=Ember.Mixin.create(Ember.MutableEnumerable,{sortProperties:null,sortAscending:!0,orderBy:function(t,r){var i=0,s=e(this,"sortProperties"),o=e(this,"sortAscending");return n(s,function(n){i===0&&(i=Ember.compare(e(t,n),e(r,n)),i!==0&&!o&&(i=-1*i))}),i},destroy:function(){var t=e(this,"content"),r=e(this,"sortProperties");return t&&r&&n(t,function(e){n(r,function(t){Ember.removeObserver(e,t,this,"contentItemSortPropertyDidChange")},this)},this),this._super()},isSorted:Ember.computed.bool("sortProperties"),arrangedContent:Ember.computed("content","sortProperties.@each",function(t,r){var i=e(this,"content"),s=e(this,"isSorted"),o=e(this,"sortProperties"),u=this;return i&&s?(i=i.slice(),i.sort(function(e,t){return u.orderBy(e,t)}),n(i,function(e){n(o,function(t){Ember.addObserver(e,t,this,"contentItemSortPropertyDidChange")},this)},this),Ember.A(i)):i}),_contentWillChange:Ember.beforeObserver(function(){var t=e(this,"content"),r=e(this,"sortProperties");t&&r&&n(t,function(e){n(r,function(t){Ember.removeObserver(e,t,this,"contentItemSortPropertyDidChange")},this)},this),this._super()},"content"),sortAscendingWillChange:Ember.beforeObserver(function(){this._lastSortAscending=e(this,"sortAscending")},"sortAscending"),sortAscendingDidChange:Ember.observer(function(){if(e(this,"sortAscending")!==this._lastSortAscending){var t=e(this,"arrangedContent");t.reverseObjects()}},"sortAscending"),contentArrayWillChange:function(t,r,i,s){var o=e(this,"isSorted");if(o){var u=e(this,"arrangedContent"),a=t.slice(r,r+i),f=e(this,"sortProperties");n(a,function(e){u.removeObject(e),n(f,function(t){Ember.removeObserver(e,t,this,"contentItemSortPropertyDidChange")},this)},this)}return this._super(t,r,i,s)},contentArrayDidChange:function(t,r,i,s){var o=e(this,"isSorted"),u=e(this,"sortProperties");if(o){var a=t.slice(r,r+s);n(a,function(e){this.insertItemSorted(e),n(u,function(t){Ember.addObserver(e,t,this,"contentItemSortPropertyDidChange")},this)},this)}return this._super(t,r,i,s)},insertItemSorted:function(t){var n=e(this,"arrangedContent"),r=e(n,"length"),i=this._binarySearch(t,0,r);n.insertAt(i,t)},contentItemSortPropertyDidChange:function(t){var n=e(this,"arrangedContent"),r=n.indexOf(t),i=n.objectAt(r-1),s=n.objectAt(r+1),o=i&&this.orderBy(t,i),u=s&&this.orderBy(t,s);if(o<0||u>0)n.removeObject(t),this.insertItemSorted(t)},_binarySearch:function(t,n,r){var i,s,o,u;return n===r?n:(u=e(this,"arrangedContent"),i=n+Math.floor((r-n)/2),s=u.objectAt(i),o=this.orderBy(s,t),o<0?this._binarySearch(t,i+1,r):o>0?this._binarySearch(t,n,i):i)}})}(),function(){var e=Ember.get,t=Ember.set,n=Ember.EnumerableUtils.forEach,r=Ember.EnumerableUtils.replace;Ember.ArrayController=Ember.ArrayProxy.extend(Ember.ControllerMixin,Ember.SortableMixin,{itemController:null,lookupItemController:function(t){return e(this,"itemController")},objectAtContent:function(t){var n=e(this,"length"),r=e(this,"arrangedContent"),i=r&&r.objectAt(t);if(t>=0&&t<n){var s=this.lookupItemController(i);if(s)return this.controllerAt(t,i,s)}return i},arrangedContentDidChange:function(){this._super(),this._resetSubControllers()},arrayContentDidChange:function(t,i,s){var o=e(this,"_subControllers"),u=o.slice(t,t+i);n(u,function(e){e&&e.destroy()}),r(o,t,i,new Array(s)),this._super(t,i,s)},init:function(){this._super(),this.get("content")||Ember.defineProperty(this,"content",undefined,Ember.A()),this.set("_subControllers",Ember.A())},controllerAt:function(t,n,r){var i=e(this,"container"),s=e(this,"_subControllers"),o=s[t];o||(o=i.lookup("controller:"+r,{singleton:!1}),s[t]=o);if(!o)throw new Error('Could not resolve itemController: "'+r+'"');return o.set("target",this),o.set("content",n),o},_subControllers:null,_resetSubControllers:function(){var t=e(this,"_subControllers");n(t,function(e){e&&e.destroy()}),this.set("_subControllers",Ember.A())}})}(),function(){Ember.ObjectController=Ember.ObjectProxy.extend(Ember.ControllerMixin)}(),function(){}(),function(){}(),function(){var e=Ember.get,t=Ember.set;Ember.State=Ember.Object.extend(Ember.Evented,{isState:!0,parentState:null,start:null,name:null,path:Ember.computed(function(){var t=e(this,"parentState.path"),n=e(this,"name");return t&&(n=t+"."+n),n}),trigger:function(e){this[e]&&this[e].apply(this,[].slice.call(arguments,1)),this._super.apply(this,arguments)},init:function(){var n=e(this,"states");t(this,"childStates",Ember.A()),t(this,"eventTransitions",e(this,"eventTransitions")||{});var r,i,s;if(!n){n={};for(r in this){if(r==="constructor")continue;if(i=this[r]){if(s=i.transitionTarget)this.eventTransitions[r]=s;this.setupChild(n,r,i)}}t(this,"states",n)}else for(r in n)this.setupChild(n,r,n[r]);t(this,"pathsCache",{}),t(this,"pathsCacheNoContext",{})},setupChild:function(n,r,i){if(!i)return!1;i.isState?t(i,"name",r):Ember.State.detect(i)&&(i=i.create({name:r}));if(i.isState)return t(i,"parentState",this),e(this,"childStates").pushObject(i),n[r]=i,i},lookupEventTransition:function(e){var t,n=this;while(n&&!t)t=n.eventTransitions[e],n=n.get("parentState");return t},isLeaf:Ember.computed(function(){return!e(this,"childStates").length}),hasContext:!0,setup:Ember.K,enter:Ember.K,exit:Ember.K}),Ember.State.reopenClass({transitionTo:function(e){var t=function(t,n){var r=[],i=Ember.$&&Ember.$.Event;n&&i&&n instanceof i?n.hasOwnProperty("contexts")&&(r=n.contexts.slice()):r=[].slice.call(arguments,1),r.unshift(e),t.transitionTo.apply(t,r)};return t.transitionTarget=e,t}})}(),function(){var e=Ember.get,t=Ember.set,n=Ember.String.fmt,r=Ember.ArrayPolyfills.forEach,i=function(e){this.enterStates=e.enterStates.slice(),this.exitStates=e.exitStates.slice(),this.resolveState=e.resolveState,this.finalState=e.enterStates[e.enterStates.length-1]||e.resolveState};i.prototype={normalize:function(e,t){return this.matchContextsToStates(t),this.addInitialStates(),this.removeUnchangedContexts(e),this},matchContextsToStates:function(t){var n=this.enterStates.length-1,r=[],i,s;while(t.length>0){if(n>=0)i=this.enterStates[n--];else{if(this.enterStates.length){i=e(this.enterStates[0],"parentState");if(!i)throw"Cannot match all contexts to states"}else i=this.resolveState;this.enterStates.unshift(i),this.exitStates.unshift(i)}e(i,"hasContext")?s=t.pop():s=null,r.unshift(s)}this.contexts=r},addInitialStates:function(){var t=this.finalState,n;for(;;){n=e(t,"initialState")||"start",t=e(t,"states."+n);if(!t)break;this.finalState=t,this.enterStates.push(t),this.contexts.push(undefined)}},removeUnchangedContexts:function(e){while(this.enterStates.length>0){if(this.enterStates[0]!==this.exitStates[0])break;if(this.enterStates.length===this.contexts.length){if(e.getStateMeta(this.enterStates[0],"context")!==this.contexts[0])break;this.contexts.shift()}this.resolveState=this.enterStates.shift(),this.exitStates.shift()}}};var s=function(t,r,i){var u=this.enableLogging,a=i?"unhandledEvent":t,f=r[a],l,c,h;l=[].slice.call(arguments,3);if(typeof f=="function")return u&&(i?Ember.Logger.log(n("STATEMANAGER: Unhandled event '%@' being sent to state %@.",[t,e(r,"path")])):Ember.Logger.log(n("STATEMANAGER: Sending event '%@' to state %@.",[t,e(r,"path")]))),h=l,i&&h.unshift(t),h.unshift(this),f.apply(r,h);var p=e(r,"parentState");if(p)return c=l,c.unshift(t,p,i),s.apply(this,c);if(!i)return o.call(this,t,l,!0)},o=function(t,n,r){return n.unshift(t,e(this,"currentState"),r),s.apply(this,n)};Ember.StateManager=Ember.State.extend({init:function(){this._super(),t(this,"stateMeta",Ember.Map.create());var n=e(this,"initialState");!n&&e(this,"states.start")&&(n="start"),n&&this.transitionTo(n)},stateMetaFor:function(t){var n=e(this,"stateMeta"),r=n.get(t);return r||(r={},n.set(t,r)),r},setStateMeta:function(e,n,r){return t(this.stateMetaFor(e),n,r)},getStateMeta:function(t,n){return e(this.stateMetaFor(t),n)},currentState:null,currentPath:Ember.computed.alias("currentState.path"),transitionEvent:"setup",errorOnUnhandledEvent:!0,send:function(e){var t=[].slice.call(arguments,1);return o.call(this,e,t,!1)},unhandledEvent:function(t,n){if(e(this,"errorOnUnhandledEvent"))throw new Ember.Error(this.toString()+" could not respond to event "+n+" in state "+e(this,"currentState.path")+".")},getStateByPath:function(t,n){var r=n.split("."),i=t;for(var s=0,o=r.length;s<o;s++){i=e(e(i,"states"),r[s]);if(!i)break}return i},findStateByPath:function(t,n){var r;while(!r&&t)r=this.getStateByPath(t,n),t=e(t,"parentState");return r},getStatesInPath:function(t,n){if(!n||n==="")return undefined;var r=n.split("."),i=[],s,o;for(var u=0,a=r.length;u<a;u++){s=e(t,"states");if(!s)return undefined;o=e(s,r[u]);if(!o)return undefined;t=o,i.push(o)}return i},goToState:function(){return this.transitionTo.apply(this,arguments)},transitionTo:function(t,n){if(Ember.isEmpty(t))return;var r=n?Array.prototype.slice.call(arguments,1):[],s=e(this,"currentState")||this,o=this.contextFreeTransition(s,t),u=(new i(o)).normalize(this,r);this.enterState(u),this.triggerSetupContext(u)},contextFreeTransition:function(t,n){var r=t.pathsCache[n];if(r)return r;var i=this.getStatesInPath(t,n),s=[],o=t;while(o&&!i){s.unshift(o),o=e(o,"parentState");if(!o){i=this.getStatesInPath(this,n);if(!i)return}i=this.getStatesInPath(o,n)}while(i.length>0&&i[0]===s[0])o=i.shift(),s.shift();var u=t.pathsCache[n]={exitStates:s,enterStates:i,resolveState:o};return u},triggerSetupContext:function(t){var n=t.contexts,i=t.enterStates.length-n.length,s=t.enterStates,o=e(this,"transitionEvent");r.call(s,function(e,t){e.trigger(o,this,n[t-i])},this)},getState:function(t){var n=e(this,t),r=e(this,"parentState");if(n)return n;if(r)return r.getState(t)},enterState:function(n){var i=this.enableLogging,s=n.exitStates.slice(0).reverse();r.call(s,function(e){e.trigger("exit",this)},this),r.call(n.enterStates,function(t){i&&Ember.Logger.log("STATEMANAGER: Entering "+e(t,"path")),t.trigger("enter",this)},this),t(this,"currentState",n.finalState)}})}(),function(){}()})(),typeof location!="undefined"&&(location.hostname==="localhost"||location.hostname==="127.0.0.1")&&console.warn("You are running a production build of Ember on localhost and won't receive detailed error messages. If you want full error messages please use the non-minified build provided on the Ember website.");
@@ -477,159 +477,6 @@ if (Ember.ENV.MANDATORY_SETTER && !platform.hasPropertyAccessors) {
477
477
 
478
478
 
479
479
 
480
- (function() {
481
- var utils = Ember.EnumerableUtils = {
482
- map: function(obj, callback, thisArg) {
483
- return obj.map ? obj.map.call(obj, callback, thisArg) : Array.prototype.map.call(obj, callback, thisArg);
484
- },
485
-
486
- forEach: function(obj, callback, thisArg) {
487
- return obj.forEach ? obj.forEach.call(obj, callback, thisArg) : Array.prototype.forEach.call(obj, callback, thisArg);
488
- },
489
-
490
- indexOf: function(obj, element, index) {
491
- return obj.indexOf ? obj.indexOf.call(obj, element, index) : Array.prototype.indexOf.call(obj, element, index);
492
- },
493
-
494
- indexesOf: function(obj, elements) {
495
- return elements === undefined ? [] : utils.map(elements, function(item) {
496
- return utils.indexOf(obj, item);
497
- });
498
- },
499
-
500
- addObject: function(array, item) {
501
- var index = utils.indexOf(array, item);
502
- if (index === -1) { array.push(item); }
503
- },
504
-
505
- removeObject: function(array, item) {
506
- var index = utils.indexOf(array, item);
507
- if (index !== -1) { array.splice(index, 1); }
508
- },
509
-
510
- replace: function(array, idx, amt, objects) {
511
- if (array.replace) {
512
- return array.replace(idx, amt, objects);
513
- } else {
514
- var args = Array.prototype.concat.apply([idx, amt], objects);
515
- return array.splice.apply(array, args);
516
- }
517
- },
518
-
519
- intersection: function(array1, array2) {
520
- var intersection = [];
521
-
522
- array1.forEach(function(element) {
523
- if (array2.indexOf(element) >= 0) {
524
- intersection.push(element);
525
- }
526
- });
527
-
528
- return intersection;
529
- }
530
- };
531
-
532
- })();
533
-
534
-
535
-
536
- (function() {
537
- /*jshint newcap:false*/
538
- /**
539
- @module ember-metal
540
- */
541
-
542
- // NOTE: There is a bug in jshint that doesn't recognize `Object()` without `new`
543
- // as being ok unless both `newcap:false` and not `use strict`.
544
- // https://github.com/jshint/jshint/issues/392
545
-
546
- // Testing this is not ideal, but we want to use native functions
547
- // if available, but not to use versions created by libraries like Prototype
548
- var isNativeFunc = function(func) {
549
- // This should probably work in all browsers likely to have ES5 array methods
550
- return func && Function.prototype.toString.call(func).indexOf('[native code]') > -1;
551
- };
552
-
553
- // From: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/map
554
- var arrayMap = isNativeFunc(Array.prototype.map) ? Array.prototype.map : function(fun /*, thisp */) {
555
- //"use strict";
556
-
557
- if (this === void 0 || this === null) {
558
- throw new TypeError();
559
- }
560
-
561
- var t = Object(this);
562
- var len = t.length >>> 0;
563
- if (typeof fun !== "function") {
564
- throw new TypeError();
565
- }
566
-
567
- var res = new Array(len);
568
- var thisp = arguments[1];
569
- for (var i = 0; i < len; i++) {
570
- if (i in t) {
571
- res[i] = fun.call(thisp, t[i], i, t);
572
- }
573
- }
574
-
575
- return res;
576
- };
577
-
578
- // From: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/foreach
579
- var arrayForEach = isNativeFunc(Array.prototype.forEach) ? Array.prototype.forEach : function(fun /*, thisp */) {
580
- //"use strict";
581
-
582
- if (this === void 0 || this === null) {
583
- throw new TypeError();
584
- }
585
-
586
- var t = Object(this);
587
- var len = t.length >>> 0;
588
- if (typeof fun !== "function") {
589
- throw new TypeError();
590
- }
591
-
592
- var thisp = arguments[1];
593
- for (var i = 0; i < len; i++) {
594
- if (i in t) {
595
- fun.call(thisp, t[i], i, t);
596
- }
597
- }
598
- };
599
-
600
- var arrayIndexOf = isNativeFunc(Array.prototype.indexOf) ? Array.prototype.indexOf : function (obj, fromIndex) {
601
- if (fromIndex === null || fromIndex === undefined) { fromIndex = 0; }
602
- else if (fromIndex < 0) { fromIndex = Math.max(0, this.length + fromIndex); }
603
- for (var i = fromIndex, j = this.length; i < j; i++) {
604
- if (this[i] === obj) { return i; }
605
- }
606
- return -1;
607
- };
608
-
609
- Ember.ArrayPolyfills = {
610
- map: arrayMap,
611
- forEach: arrayForEach,
612
- indexOf: arrayIndexOf
613
- };
614
-
615
- if (Ember.SHIM_ES5) {
616
- if (!Array.prototype.map) {
617
- Array.prototype.map = arrayMap;
618
- }
619
-
620
- if (!Array.prototype.forEach) {
621
- Array.prototype.forEach = arrayForEach;
622
- }
623
-
624
- if (!Array.prototype.indexOf) {
625
- Array.prototype.indexOf = arrayIndexOf;
626
- }
627
- }
628
-
629
- })();
630
-
631
-
632
-
633
480
  (function() {
634
481
  /**
635
482
  @module ember-metal
@@ -1032,7 +879,7 @@ Ember.canInvoke = canInvoke;
1032
879
  @param {Object} obj The object to check for the method
1033
880
  @param {String} methodName The method name to check for
1034
881
  @param {Array} [args] The arguments to pass to the method
1035
- @return {*} the return value of the invoked method or undefined if it cannot be invoked
882
+ @return {anything} the return value of the invoked method or undefined if it cannot be invoked
1036
883
  */
1037
884
  Ember.tryInvoke = function(obj, methodName, args) {
1038
885
  if (canInvoke(obj, methodName)) {
@@ -1063,7 +910,7 @@ var needsFinallyFix = (function() {
1063
910
  @param {Function} tryable The function to run the try callback
1064
911
  @param {Function} finalizer The function to run the finally callback
1065
912
  @param [binding]
1066
- @return {*} The return value is the that of the finalizer,
913
+ @return {anything} The return value is the that of the finalizer,
1067
914
  unless that valueis undefined, in which case it is the return value
1068
915
  of the tryable
1069
916
  */
@@ -1114,7 +961,7 @@ if (needsFinallyFix) {
1114
961
  @param {Function} catchable The function to run the catchable callback
1115
962
  @param {Function} finalizer The function to run the finally callback
1116
963
  @param [binding]
1117
- @return {*} The return value is the that of the finalizer,
964
+ @return {anything} The return value is the that of the finalizer,
1118
965
  unless that value is undefined, in which case it is the return value
1119
966
  of the tryable.
1120
967
  */
@@ -1158,78 +1005,6 @@ if (needsFinallyFix) {
1158
1005
  };
1159
1006
  }
1160
1007
 
1161
- // ........................................
1162
- // TYPING & ARRAY MESSAGING
1163
- //
1164
-
1165
- var TYPE_MAP = {};
1166
- var t = "Boolean Number String Function Array Date RegExp Object".split(" ");
1167
- Ember.ArrayPolyfills.forEach.call(t, function(name) {
1168
- TYPE_MAP[ "[object " + name + "]" ] = name.toLowerCase();
1169
- });
1170
-
1171
- var toString = Object.prototype.toString;
1172
-
1173
- /**
1174
- Returns a consistent type for the passed item.
1175
-
1176
- Use this instead of the built-in `typeof` to get the type of an item.
1177
- It will return the same result across all browsers and includes a bit
1178
- more detail. Here is what will be returned:
1179
-
1180
- | Return Value | Meaning |
1181
- |---------------|------------------------------------------------------|
1182
- | 'string' | String primitive |
1183
- | 'number' | Number primitive |
1184
- | 'boolean' | Boolean primitive |
1185
- | 'null' | Null value |
1186
- | 'undefined' | Undefined value |
1187
- | 'function' | A function |
1188
- | 'array' | An instance of Array |
1189
- | 'class' | An Ember class (created using Ember.Object.extend()) |
1190
- | 'instance' | An Ember object instance |
1191
- | 'error' | An instance of the Error object |
1192
- | 'object' | A JavaScript object not inheriting from Ember.Object |
1193
-
1194
- Examples:
1195
-
1196
- ```javascript
1197
- Ember.typeOf(); // 'undefined'
1198
- Ember.typeOf(null); // 'null'
1199
- Ember.typeOf(undefined); // 'undefined'
1200
- Ember.typeOf('michael'); // 'string'
1201
- Ember.typeOf(101); // 'number'
1202
- Ember.typeOf(true); // 'boolean'
1203
- Ember.typeOf(Ember.makeArray); // 'function'
1204
- Ember.typeOf([1,2,90]); // 'array'
1205
- Ember.typeOf(Ember.Object.extend()); // 'class'
1206
- Ember.typeOf(Ember.Object.create()); // 'instance'
1207
- Ember.typeOf(new Error('teamocil')); // 'error'
1208
-
1209
- // "normal" JavaScript object
1210
- Ember.typeOf({a: 'b'}); // 'object'
1211
- ```
1212
-
1213
- @method typeOf
1214
- @for Ember
1215
- @param {Object} item the item to check
1216
- @return {String} the type
1217
- */
1218
- Ember.typeOf = function(item) {
1219
- var ret;
1220
-
1221
- ret = (item === null || item === undefined) ? String(item) : TYPE_MAP[toString.call(item)] || 'object';
1222
-
1223
- if (ret === 'function') {
1224
- if (Ember.Object && Ember.Object.detect(item)) ret = 'class';
1225
- } else if (ret === 'object') {
1226
- if (item instanceof Error) ret = 'error';
1227
- else if (Ember.Object && item instanceof Ember.Object) ret = 'instance';
1228
- else ret = 'object';
1229
- }
1230
-
1231
- return ret;
1232
- };
1233
1008
  })();
1234
1009
 
1235
1010
 
@@ -1410,25 +1185,178 @@ Ember.subscribe = Ember.Instrumentation.subscribe;
1410
1185
 
1411
1186
 
1412
1187
  (function() {
1413
- /**
1414
- @module ember-metal
1415
- */
1188
+ var utils = Ember.EnumerableUtils = {
1189
+ map: function(obj, callback, thisArg) {
1190
+ return obj.map ? obj.map.call(obj, callback, thisArg) : Array.prototype.map.call(obj, callback, thisArg);
1191
+ },
1416
1192
 
1417
- /*
1418
- JavaScript (before ES6) does not have a Map implementation. Objects,
1419
- which are often used as dictionaries, may only have Strings as keys.
1193
+ forEach: function(obj, callback, thisArg) {
1194
+ return obj.forEach ? obj.forEach.call(obj, callback, thisArg) : Array.prototype.forEach.call(obj, callback, thisArg);
1195
+ },
1420
1196
 
1421
- Because Ember has a way to get a unique identifier for every object
1422
- via `Ember.guidFor`, we can implement a performant Map with arbitrary
1423
- keys. Because it is commonly used in low-level bookkeeping, Map is
1424
- implemented as a pure JavaScript object for performance.
1197
+ indexOf: function(obj, element, index) {
1198
+ return obj.indexOf ? obj.indexOf.call(obj, element, index) : Array.prototype.indexOf.call(obj, element, index);
1199
+ },
1425
1200
 
1426
- This implementation follows the current iteration of the ES6 proposal for
1427
- maps (http://wiki.ecmascript.org/doku.php?id=harmony:simple_maps_and_sets),
1428
- with two exceptions. First, because we need our implementation to be pleasant
1429
- on older browsers, we do not use the `delete` name (using `remove` instead).
1430
- Second, as we do not have the luxury of in-VM iteration, we implement a
1431
- forEach method for iteration.
1201
+ indexesOf: function(obj, elements) {
1202
+ return elements === undefined ? [] : utils.map(elements, function(item) {
1203
+ return utils.indexOf(obj, item);
1204
+ });
1205
+ },
1206
+
1207
+ addObject: function(array, item) {
1208
+ var index = utils.indexOf(array, item);
1209
+ if (index === -1) { array.push(item); }
1210
+ },
1211
+
1212
+ removeObject: function(array, item) {
1213
+ var index = utils.indexOf(array, item);
1214
+ if (index !== -1) { array.splice(index, 1); }
1215
+ },
1216
+
1217
+ replace: function(array, idx, amt, objects) {
1218
+ if (array.replace) {
1219
+ return array.replace(idx, amt, objects);
1220
+ } else {
1221
+ var args = Array.prototype.concat.apply([idx, amt], objects);
1222
+ return array.splice.apply(array, args);
1223
+ }
1224
+ },
1225
+
1226
+ intersection: function(array1, array2) {
1227
+ var intersection = [];
1228
+
1229
+ array1.forEach(function(element) {
1230
+ if (array2.indexOf(element) >= 0) {
1231
+ intersection.push(element);
1232
+ }
1233
+ });
1234
+
1235
+ return intersection;
1236
+ }
1237
+ };
1238
+
1239
+ })();
1240
+
1241
+
1242
+
1243
+ (function() {
1244
+ /*jshint newcap:false*/
1245
+ /**
1246
+ @module ember-metal
1247
+ */
1248
+
1249
+ // NOTE: There is a bug in jshint that doesn't recognize `Object()` without `new`
1250
+ // as being ok unless both `newcap:false` and not `use strict`.
1251
+ // https://github.com/jshint/jshint/issues/392
1252
+
1253
+ // Testing this is not ideal, but we want to use native functions
1254
+ // if available, but not to use versions created by libraries like Prototype
1255
+ var isNativeFunc = function(func) {
1256
+ // This should probably work in all browsers likely to have ES5 array methods
1257
+ return func && Function.prototype.toString.call(func).indexOf('[native code]') > -1;
1258
+ };
1259
+
1260
+ // From: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/map
1261
+ var arrayMap = isNativeFunc(Array.prototype.map) ? Array.prototype.map : function(fun /*, thisp */) {
1262
+ //"use strict";
1263
+
1264
+ if (this === void 0 || this === null) {
1265
+ throw new TypeError();
1266
+ }
1267
+
1268
+ var t = Object(this);
1269
+ var len = t.length >>> 0;
1270
+ if (typeof fun !== "function") {
1271
+ throw new TypeError();
1272
+ }
1273
+
1274
+ var res = new Array(len);
1275
+ var thisp = arguments[1];
1276
+ for (var i = 0; i < len; i++) {
1277
+ if (i in t) {
1278
+ res[i] = fun.call(thisp, t[i], i, t);
1279
+ }
1280
+ }
1281
+
1282
+ return res;
1283
+ };
1284
+
1285
+ // From: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/foreach
1286
+ var arrayForEach = isNativeFunc(Array.prototype.forEach) ? Array.prototype.forEach : function(fun /*, thisp */) {
1287
+ //"use strict";
1288
+
1289
+ if (this === void 0 || this === null) {
1290
+ throw new TypeError();
1291
+ }
1292
+
1293
+ var t = Object(this);
1294
+ var len = t.length >>> 0;
1295
+ if (typeof fun !== "function") {
1296
+ throw new TypeError();
1297
+ }
1298
+
1299
+ var thisp = arguments[1];
1300
+ for (var i = 0; i < len; i++) {
1301
+ if (i in t) {
1302
+ fun.call(thisp, t[i], i, t);
1303
+ }
1304
+ }
1305
+ };
1306
+
1307
+ var arrayIndexOf = isNativeFunc(Array.prototype.indexOf) ? Array.prototype.indexOf : function (obj, fromIndex) {
1308
+ if (fromIndex === null || fromIndex === undefined) { fromIndex = 0; }
1309
+ else if (fromIndex < 0) { fromIndex = Math.max(0, this.length + fromIndex); }
1310
+ for (var i = fromIndex, j = this.length; i < j; i++) {
1311
+ if (this[i] === obj) { return i; }
1312
+ }
1313
+ return -1;
1314
+ };
1315
+
1316
+ Ember.ArrayPolyfills = {
1317
+ map: arrayMap,
1318
+ forEach: arrayForEach,
1319
+ indexOf: arrayIndexOf
1320
+ };
1321
+
1322
+ if (Ember.SHIM_ES5) {
1323
+ if (!Array.prototype.map) {
1324
+ Array.prototype.map = arrayMap;
1325
+ }
1326
+
1327
+ if (!Array.prototype.forEach) {
1328
+ Array.prototype.forEach = arrayForEach;
1329
+ }
1330
+
1331
+ if (!Array.prototype.indexOf) {
1332
+ Array.prototype.indexOf = arrayIndexOf;
1333
+ }
1334
+ }
1335
+
1336
+ })();
1337
+
1338
+
1339
+
1340
+ (function() {
1341
+ /**
1342
+ @module ember-metal
1343
+ */
1344
+
1345
+ /*
1346
+ JavaScript (before ES6) does not have a Map implementation. Objects,
1347
+ which are often used as dictionaries, may only have Strings as keys.
1348
+
1349
+ Because Ember has a way to get a unique identifier for every object
1350
+ via `Ember.guidFor`, we can implement a performant Map with arbitrary
1351
+ keys. Because it is commonly used in low-level bookkeeping, Map is
1352
+ implemented as a pure JavaScript object for performance.
1353
+
1354
+ This implementation follows the current iteration of the ES6 proposal for
1355
+ maps (http://wiki.ecmascript.org/doku.php?id=harmony:simple_maps_and_sets),
1356
+ with two exceptions. First, because we need our implementation to be pleasant
1357
+ on older browsers, we do not use the `delete` name (using `remove` instead).
1358
+ Second, as we do not have the luxury of in-VM iteration, we implement a
1359
+ forEach method for iteration.
1432
1360
 
1433
1361
  Map is mocked out to look like an Ember object, so you can do
1434
1362
  `Ember.Map.create()` for symmetry with other Ember classes.
@@ -1615,8 +1543,8 @@ Map.prototype = {
1615
1543
  Retrieve the value associated with a given key.
1616
1544
 
1617
1545
  @method get
1618
- @param {*} key
1619
- @return {*} the value associated with the key, or `undefined`
1546
+ @param {anything} key
1547
+ @return {anything} the value associated with the key, or `undefined`
1620
1548
  */
1621
1549
  get: function(key) {
1622
1550
  var values = this.values,
@@ -1630,8 +1558,8 @@ Map.prototype = {
1630
1558
  provided, the new value will replace the old value.
1631
1559
 
1632
1560
  @method set
1633
- @param {*} key
1634
- @param {*} value
1561
+ @param {anything} key
1562
+ @param {anything} value
1635
1563
  */
1636
1564
  set: function(key, value) {
1637
1565
  var keys = this.keys,
@@ -1646,7 +1574,7 @@ Map.prototype = {
1646
1574
  Removes a value from the map for an associated key.
1647
1575
 
1648
1576
  @method remove
1649
- @param {*} key
1577
+ @param {anything} key
1650
1578
  @return {Boolean} true if an item was removed, false otherwise
1651
1579
  */
1652
1580
  remove: function(key) {
@@ -1671,7 +1599,7 @@ Map.prototype = {
1671
1599
  Check whether a key is present.
1672
1600
 
1673
1601
  @method has
1674
- @param {*} key
1602
+ @param {anything} key
1675
1603
  @return {Boolean} true if the item was present, false otherwise
1676
1604
  */
1677
1605
  has: function(key) {
@@ -1689,7 +1617,7 @@ Map.prototype = {
1689
1617
 
1690
1618
  @method forEach
1691
1619
  @param {Function} callback
1692
- @param {*} self if passed, the `this` value inside the
1620
+ @param {anything} self if passed, the `this` value inside the
1693
1621
  callback. By default, `this` is the map.
1694
1622
  */
1695
1623
  forEach: function(callback, self) {
@@ -1718,7 +1646,7 @@ Map.prototype = {
1718
1646
  @private
1719
1647
  @constructor
1720
1648
  @param [options]
1721
- @param {*} [options.defaultValue]
1649
+ @param {anything} [options.defaultValue]
1722
1650
  */
1723
1651
  var MapWithDefault = Ember.MapWithDefault = function(options) {
1724
1652
  Map.call(this);
@@ -1729,7 +1657,7 @@ var MapWithDefault = Ember.MapWithDefault = function(options) {
1729
1657
  @method create
1730
1658
  @static
1731
1659
  @param [options]
1732
- @param {*} [options.defaultValue]
1660
+ @param {anything} [options.defaultValue]
1733
1661
  @return {Ember.MapWithDefault|Ember.Map} If options are passed, returns
1734
1662
  `Ember.MapWithDefault` otherwise returns `Ember.Map`
1735
1663
  */
@@ -1747,8 +1675,8 @@ MapWithDefault.prototype = Ember.create(Map.prototype);
1747
1675
  Retrieve the value associated with a given key.
1748
1676
 
1749
1677
  @method get
1750
- @param {*} key
1751
- @return {*} the value associated with the key, or the default value
1678
+ @param {anything} key
1679
+ @return {anything} the value associated with the key, or the default value
1752
1680
  */
1753
1681
  MapWithDefault.prototype.get = function(key) {
1754
1682
  var hasValue = this.has(key);
@@ -1781,10 +1709,11 @@ MapWithDefault.prototype.copy = function() {
1781
1709
  @module ember-metal
1782
1710
  */
1783
1711
 
1784
- var META_KEY = Ember.META_KEY, get;
1712
+ var META_KEY = Ember.META_KEY, get, set;
1785
1713
 
1786
1714
  var MANDATORY_SETTER = Ember.ENV.MANDATORY_SETTER;
1787
1715
 
1716
+ var IS_GLOBAL = /^([A-Z$]|([0-9][A-Z$]))/;
1788
1717
  var IS_GLOBAL_PATH = /^([A-Z$]|([0-9][A-Z$])).*[\.\*]/;
1789
1718
  var HAS_THIS = /^this[\.\*]/;
1790
1719
  var FIRST_KEY = /^([^\.\*]+)/;
@@ -1856,11 +1785,89 @@ get = function get(obj, keyName) {
1856
1785
  }
1857
1786
  };
1858
1787
 
1788
+ /**
1789
+ Sets the value of a property on an object, respecting computed properties
1790
+ and notifying observers and other listeners of the change. If the
1791
+ property is not defined but the object implements the `unknownProperty`
1792
+ method then that will be invoked as well.
1793
+
1794
+ If you plan to run on IE8 and older browsers then you should use this
1795
+ method anytime you want to set a property on an object that you don't
1796
+ know for sure is private. (Properties beginning with an underscore '_'
1797
+ are considered private.)
1798
+
1799
+ On all newer browsers, you only need to use this method to set
1800
+ properties if the property might not be defined on the object and you want
1801
+ to respect the `unknownProperty` handler. Otherwise you can ignore this
1802
+ method.
1803
+
1804
+ @method set
1805
+ @for Ember
1806
+ @param {Object} obj The object to modify.
1807
+ @param {String} keyName The property key to set
1808
+ @param {Object} value The value to set
1809
+ @return {Object} the passed value.
1810
+ */
1811
+ set = function set(obj, keyName, value, tolerant) {
1812
+ if (typeof obj === 'string') {
1813
+
1814
+ value = keyName;
1815
+ keyName = obj;
1816
+ obj = null;
1817
+ }
1818
+
1819
+ if (!obj || keyName.indexOf('.') !== -1) {
1820
+ return setPath(obj, keyName, value, tolerant);
1821
+ }
1822
+
1823
+
1824
+
1825
+ var meta = obj[META_KEY], desc = meta && meta.descs[keyName],
1826
+ isUnknown, currentValue;
1827
+ if (desc) {
1828
+ desc.set(obj, keyName, value);
1829
+ } else {
1830
+ isUnknown = 'object' === typeof obj && !(keyName in obj);
1831
+
1832
+ // setUnknownProperty is called if `obj` is an object,
1833
+ // the property does not already exist, and the
1834
+ // `setUnknownProperty` method exists on the object
1835
+ if (isUnknown && 'function' === typeof obj.setUnknownProperty) {
1836
+ obj.setUnknownProperty(keyName, value);
1837
+ } else if (meta && meta.watching[keyName] > 0) {
1838
+ if (MANDATORY_SETTER) {
1839
+ currentValue = meta.values[keyName];
1840
+ } else {
1841
+ currentValue = obj[keyName];
1842
+ }
1843
+ // only trigger a change if the value has changed
1844
+ if (value !== currentValue) {
1845
+ Ember.propertyWillChange(obj, keyName);
1846
+ if (MANDATORY_SETTER) {
1847
+ if (currentValue === undefined && !(keyName in obj)) {
1848
+ Ember.defineProperty(obj, keyName, null, value); // setup mandatory setter
1849
+ } else {
1850
+ meta.values[keyName] = value;
1851
+ }
1852
+ } else {
1853
+ obj[keyName] = value;
1854
+ }
1855
+ Ember.propertyDidChange(obj, keyName);
1856
+ }
1857
+ } else {
1858
+ obj[keyName] = value;
1859
+ }
1860
+ }
1861
+ return value;
1862
+ };
1863
+
1859
1864
  // Currently used only by Ember Data tests
1860
1865
  if (Ember.config.overrideAccessors) {
1861
1866
  Ember.get = get;
1867
+ Ember.set = set;
1862
1868
  Ember.config.overrideAccessors();
1863
1869
  get = Ember.get;
1870
+ set = Ember.set;
1864
1871
  }
1865
1872
 
1866
1873
  function firstKey(path) {
@@ -1888,7 +1895,7 @@ function normalizeTuple(target, path) {
1888
1895
  return [ target, path ];
1889
1896
  }
1890
1897
 
1891
- var getPath = Ember._getPath = function(root, path) {
1898
+ function getPath(root, path) {
1892
1899
  var hasThis, parts, tuple, idx, len;
1893
1900
 
1894
1901
  // If there is no root and path is a key name, return that
@@ -1913,28 +1920,55 @@ var getPath = Ember._getPath = function(root, path) {
1913
1920
  if (root && root.isDestroyed) { return undefined; }
1914
1921
  }
1915
1922
  return root;
1916
- };
1923
+ }
1917
1924
 
1918
- /**
1919
- @private
1925
+ function setPath(root, path, value, tolerant) {
1926
+ var keyName;
1920
1927
 
1921
- Normalizes a target/path pair to reflect that actual target/path that should
1922
- be observed, etc. This takes into account passing in global property
1923
- paths (i.e. a path beginning with a captial letter not defined on the
1924
- target) and * separators.
1928
+ // get the last part of the path
1929
+ keyName = path.slice(path.lastIndexOf('.') + 1);
1925
1930
 
1926
- @method normalizeTuple
1927
- @for Ember
1928
- @param {Object} target The current target. May be `null`.
1929
- @param {String} path A path on the target or a global property path.
1930
- @return {Array} a temporary array with the normalized target/path pair.
1931
- */
1932
- Ember.normalizeTuple = function(target, path) {
1933
- return normalizeTuple(target, path);
1934
- };
1931
+ // get the first part of the part
1932
+ path = path.slice(0, path.length-(keyName.length+1));
1935
1933
 
1936
- Ember.getWithDefault = function(root, key, defaultValue) {
1937
- var value = get(root, key);
1934
+ // unless the path is this, look up the first part to
1935
+ // get the root
1936
+ if (path !== 'this') {
1937
+ root = getPath(root, path);
1938
+ }
1939
+
1940
+ if (!keyName || keyName.length === 0) {
1941
+ throw new Error('You passed an empty path');
1942
+ }
1943
+
1944
+ if (!root) {
1945
+ if (tolerant) { return; }
1946
+ else { throw new Error('Object in path '+path+' could not be found or was destroyed.'); }
1947
+ }
1948
+
1949
+ return set(root, keyName, value);
1950
+ }
1951
+
1952
+ /**
1953
+ @private
1954
+
1955
+ Normalizes a target/path pair to reflect that actual target/path that should
1956
+ be observed, etc. This takes into account passing in global property
1957
+ paths (i.e. a path beginning with a captial letter not defined on the
1958
+ target) and * separators.
1959
+
1960
+ @method normalizeTuple
1961
+ @for Ember
1962
+ @param {Object} target The current target. May be `null`.
1963
+ @param {String} path A path on the target or a global property path.
1964
+ @return {Array} a temporary array with the normalized target/path pair.
1965
+ */
1966
+ Ember.normalizeTuple = function(target, path) {
1967
+ return normalizeTuple(target, path);
1968
+ };
1969
+
1970
+ Ember.getWithDefault = function(root, key, defaultValue) {
1971
+ var value = get(root, key);
1938
1972
 
1939
1973
  if (value === undefined) { return defaultValue; }
1940
1974
  return value;
@@ -1943,393 +1977,215 @@ Ember.getWithDefault = function(root, key, defaultValue) {
1943
1977
 
1944
1978
  Ember.get = get;
1945
1979
  Ember.getPath = Ember.deprecateFunc('getPath is deprecated since get now supports paths', Ember.get);
1946
- })();
1947
-
1948
1980
 
1981
+ Ember.set = set;
1982
+ Ember.setPath = Ember.deprecateFunc('setPath is deprecated since set now supports paths', Ember.set);
1949
1983
 
1950
- (function() {
1951
1984
  /**
1952
- @module ember-metal
1953
- */
1954
-
1955
- var o_create = Ember.create,
1956
- metaFor = Ember.meta,
1957
- META_KEY = Ember.META_KEY;
1985
+ Error-tolerant form of `Ember.set`. Will not blow up if any part of the
1986
+ chain is `undefined`, `null`, or destroyed.
1958
1987
 
1959
- /*
1960
- The event system uses a series of nested hashes to store listeners on an
1961
- object. When a listener is registered, or when an event arrives, these
1962
- hashes are consulted to determine which target and action pair to invoke.
1988
+ This is primarily used when syncing bindings, which may try to update after
1989
+ an object has been destroyed.
1963
1990
 
1964
- The hashes are stored in the object's meta hash, and look like this:
1991
+ @method trySet
1992
+ @for Ember
1993
+ @param {Object} obj The object to modify.
1994
+ @param {String} path The property path to set
1995
+ @param {Object} value The value to set
1996
+ */
1997
+ Ember.trySet = function(root, path, value) {
1998
+ return set(root, path, value, true);
1999
+ };
2000
+ Ember.trySetPath = Ember.deprecateFunc('trySetPath has been renamed to trySet', Ember.trySet);
1965
2001
 
1966
- // Object's meta hash
1967
- {
1968
- listeners: { // variable name: `listenerSet`
1969
- "foo:changed": [ // variable name: `actions`
1970
- [target, method, onceFlag, suspendedFlag]
1971
- ]
1972
- }
1973
- }
2002
+ /**
2003
+ Returns true if the provided path is global (e.g., `MyApp.fooController.bar`)
2004
+ instead of local (`foo.bar.baz`).
1974
2005
 
2006
+ @method isGlobalPath
2007
+ @for Ember
2008
+ @private
2009
+ @param {String} path
2010
+ @return Boolean
1975
2011
  */
2012
+ Ember.isGlobalPath = function(path) {
2013
+ return IS_GLOBAL.test(path);
2014
+ };
1976
2015
 
1977
- function indexOf(array, target, method) {
1978
- var index = -1;
1979
- for (var i = 0, l = array.length; i < l; i++) {
1980
- if (target === array[i][0] && method === array[i][1]) { index = i; break; }
1981
- }
1982
- return index;
1983
- }
1984
2016
 
1985
- function actionsFor(obj, eventName) {
1986
- var meta = metaFor(obj, true),
1987
- actions;
2017
+ })();
1988
2018
 
1989
- if (!meta.listeners) { meta.listeners = {}; }
1990
2019
 
1991
- if (!meta.hasOwnProperty('listeners')) {
1992
- // setup inherited copy of the listeners object
1993
- meta.listeners = o_create(meta.listeners);
1994
- }
1995
2020
 
1996
- actions = meta.listeners[eventName];
2021
+ (function() {
2022
+ /**
2023
+ @module ember-metal
2024
+ */
1997
2025
 
1998
- // if there are actions, but the eventName doesn't exist in our listeners, then copy them from the prototype
1999
- if (actions && !meta.listeners.hasOwnProperty(eventName)) {
2000
- actions = meta.listeners[eventName] = meta.listeners[eventName].slice();
2001
- } else if (!actions) {
2002
- actions = meta.listeners[eventName] = [];
2003
- }
2026
+ var META_KEY = Ember.META_KEY,
2027
+ metaFor = Ember.meta,
2028
+ objectDefineProperty = Ember.platform.defineProperty;
2004
2029
 
2005
- return actions;
2006
- }
2030
+ var MANDATORY_SETTER = Ember.ENV.MANDATORY_SETTER;
2007
2031
 
2008
- function actionsUnion(obj, eventName, otherActions) {
2009
- var meta = obj[META_KEY],
2010
- actions = meta && meta.listeners && meta.listeners[eventName];
2032
+ // ..........................................................
2033
+ // DESCRIPTOR
2034
+ //
2011
2035
 
2012
- if (!actions) { return; }
2013
- for (var i = actions.length - 1; i >= 0; i--) {
2014
- var target = actions[i][0],
2015
- method = actions[i][1],
2016
- once = actions[i][2],
2017
- suspended = actions[i][3],
2018
- actionIndex = indexOf(otherActions, target, method);
2036
+ /**
2037
+ Objects of this type can implement an interface to responds requests to
2038
+ get and set. The default implementation handles simple properties.
2019
2039
 
2020
- if (actionIndex === -1) {
2021
- otherActions.push([target, method, once, suspended]);
2022
- }
2023
- }
2024
- }
2040
+ You generally won't need to create or subclass this directly.
2025
2041
 
2026
- function actionsDiff(obj, eventName, otherActions) {
2027
- var meta = obj[META_KEY],
2028
- actions = meta && meta.listeners && meta.listeners[eventName],
2029
- diffActions = [];
2042
+ @class Descriptor
2043
+ @namespace Ember
2044
+ @private
2045
+ @constructor
2046
+ */
2047
+ var Descriptor = Ember.Descriptor = function() {};
2030
2048
 
2031
- if (!actions) { return; }
2032
- for (var i = actions.length - 1; i >= 0; i--) {
2033
- var target = actions[i][0],
2034
- method = actions[i][1],
2035
- once = actions[i][2],
2036
- suspended = actions[i][3],
2037
- actionIndex = indexOf(otherActions, target, method);
2049
+ // ..........................................................
2050
+ // DEFINING PROPERTIES API
2051
+ //
2038
2052
 
2039
- if (actionIndex !== -1) { continue; }
2053
+ var MANDATORY_SETTER_FUNCTION = Ember.MANDATORY_SETTER_FUNCTION = function(value) {
2040
2054
 
2041
- otherActions.push([target, method, once, suspended]);
2042
- diffActions.push([target, method, once, suspended]);
2043
- }
2055
+ };
2044
2056
 
2045
- return diffActions;
2046
- }
2057
+ var DEFAULT_GETTER_FUNCTION = Ember.DEFAULT_GETTER_FUNCTION = function(name) {
2058
+ return function() {
2059
+ var meta = this[META_KEY];
2060
+ return meta && meta.values[name];
2061
+ };
2062
+ };
2047
2063
 
2048
2064
  /**
2049
- Add an event listener
2050
-
2051
- @method addListener
2052
- @for Ember
2053
- @param obj
2054
- @param {String} eventName
2055
- @param {Object|Function} targetOrMethod A target object or a function
2056
- @param {Function|String} method A function or the name of a function to be called on `target`
2057
- @param {Boolean} once A flag whether a function should only be called once
2058
- */
2059
- function addListener(obj, eventName, target, method, once) {
2060
-
2065
+ @private
2061
2066
 
2062
- if (!method && 'function' === typeof target) {
2063
- method = target;
2064
- target = null;
2065
- }
2067
+ NOTE: This is a low-level method used by other parts of the API. You almost
2068
+ never want to call this method directly. Instead you should use
2069
+ `Ember.mixin()` to define new properties.
2066
2070
 
2067
- var actions = actionsFor(obj, eventName),
2068
- actionIndex = indexOf(actions, target, method);
2071
+ Defines a property on an object. This method works much like the ES5
2072
+ `Object.defineProperty()` method except that it can also accept computed
2073
+ properties and other special descriptors.
2069
2074
 
2070
- if (actionIndex !== -1) { return; }
2075
+ Normally this method takes only three parameters. However if you pass an
2076
+ instance of `Ember.Descriptor` as the third param then you can pass an
2077
+ optional value as the fourth parameter. This is often more efficient than
2078
+ creating new descriptor hashes for each property.
2071
2079
 
2072
- actions.push([target, method, once, undefined]);
2080
+ ## Examples
2073
2081
 
2074
- if ('function' === typeof obj.didAddListener) {
2075
- obj.didAddListener(eventName, target, method);
2076
- }
2077
- }
2082
+ ```javascript
2083
+ // ES5 compatible mode
2084
+ Ember.defineProperty(contact, 'firstName', {
2085
+ writable: true,
2086
+ configurable: false,
2087
+ enumerable: true,
2088
+ value: 'Charles'
2089
+ });
2078
2090
 
2079
- /**
2080
- Remove an event listener
2091
+ // define a simple property
2092
+ Ember.defineProperty(contact, 'lastName', undefined, 'Jolley');
2081
2093
 
2082
- Arguments should match those passed to {{#crossLink "Ember/addListener"}}{{/crossLink}}
2094
+ // define a computed property
2095
+ Ember.defineProperty(contact, 'fullName', Ember.computed(function() {
2096
+ return this.firstName+' '+this.lastName;
2097
+ }).property('firstName', 'lastName'));
2098
+ ```
2083
2099
 
2084
- @method removeListener
2100
+ @method defineProperty
2085
2101
  @for Ember
2086
- @param obj
2087
- @param {String} eventName
2088
- @param {Object|Function} targetOrMethod A target object or a function
2089
- @param {Function|String} method A function or the name of a function to be called on `target`
2102
+ @param {Object} obj the object to define this property on. This may be a prototype.
2103
+ @param {String} keyName the name of the property
2104
+ @param {Ember.Descriptor} [desc] an instance of `Ember.Descriptor` (typically a
2105
+ computed property) or an ES5 descriptor.
2106
+ You must provide this or `data` but not both.
2107
+ @param {anything} [data] something other than a descriptor, that will
2108
+ become the explicit value of this property.
2090
2109
  */
2091
- function removeListener(obj, eventName, target, method) {
2110
+ Ember.defineProperty = function(obj, keyName, desc, data, meta) {
2111
+ var descs, existingDesc, watching, value;
2092
2112
 
2113
+ if (!meta) meta = metaFor(obj);
2114
+ descs = meta.descs;
2115
+ existingDesc = meta.descs[keyName];
2116
+ watching = meta.watching[keyName] > 0;
2093
2117
 
2094
- if (!method && 'function' === typeof target) {
2095
- method = target;
2096
- target = null;
2118
+ if (existingDesc instanceof Ember.Descriptor) {
2119
+ existingDesc.teardown(obj, keyName);
2097
2120
  }
2098
2121
 
2099
- function _removeListener(target, method, once) {
2100
- var actions = actionsFor(obj, eventName),
2101
- actionIndex = indexOf(actions, target, method);
2102
-
2103
- // action doesn't exist, give up silently
2104
- if (actionIndex === -1) { return; }
2105
-
2106
- actions.splice(actionIndex, 1);
2122
+ if (desc instanceof Ember.Descriptor) {
2123
+ value = desc;
2107
2124
 
2108
- if ('function' === typeof obj.didRemoveListener) {
2109
- obj.didRemoveListener(eventName, target, method);
2125
+ descs[keyName] = desc;
2126
+ if (MANDATORY_SETTER && watching) {
2127
+ objectDefineProperty(obj, keyName, {
2128
+ configurable: true,
2129
+ enumerable: true,
2130
+ writable: true,
2131
+ value: undefined // make enumerable
2132
+ });
2133
+ } else {
2134
+ obj[keyName] = undefined; // make enumerable
2110
2135
  }
2111
- }
2112
-
2113
- if (method) {
2114
- _removeListener(target, method);
2136
+ desc.setup(obj, keyName);
2115
2137
  } else {
2116
- var meta = obj[META_KEY],
2117
- actions = meta && meta.listeners && meta.listeners[eventName];
2118
-
2119
- if (!actions) { return; }
2120
- for (var i = actions.length - 1; i >= 0; i--) {
2121
- _removeListener(actions[i][0], actions[i][1]);
2122
- }
2123
- }
2124
- }
2125
-
2126
- /**
2127
- @private
2128
-
2129
- Suspend listener during callback.
2130
-
2131
- This should only be used by the target of the event listener
2132
- when it is taking an action that would cause the event, e.g.
2133
- an object might suspend its property change listener while it is
2134
- setting that property.
2135
-
2136
- @method suspendListener
2137
- @for Ember
2138
- @param obj
2139
- @param {String} eventName
2140
- @param {Object|Function} targetOrMethod A target object or a function
2141
- @param {Function|String} method A function or the name of a function to be called on `target`
2142
- @param {Function} callback
2143
- */
2144
- function suspendListener(obj, eventName, target, method, callback) {
2145
- if (!method && 'function' === typeof target) {
2146
- method = target;
2147
- target = null;
2148
- }
2149
-
2150
- var actions = actionsFor(obj, eventName),
2151
- actionIndex = indexOf(actions, target, method),
2152
- action;
2153
-
2154
- if (actionIndex !== -1) {
2155
- action = actions[actionIndex].slice(); // copy it, otherwise we're modifying a shared object
2156
- action[3] = true; // mark the action as suspended
2157
- actions[actionIndex] = action; // replace the shared object with our copy
2158
- }
2159
-
2160
- function tryable() { return callback.call(target); }
2161
- function finalizer() { if (action) { action[3] = undefined; } }
2162
-
2163
- return Ember.tryFinally(tryable, finalizer);
2164
- }
2165
-
2166
- /**
2167
- @private
2168
-
2169
- Suspend listener during callback.
2170
-
2171
- This should only be used by the target of the event listener
2172
- when it is taking an action that would cause the event, e.g.
2173
- an object might suspend its property change listener while it is
2174
- setting that property.
2175
-
2176
- @method suspendListener
2177
- @for Ember
2178
- @param obj
2179
- @param {Array} eventName Array of event names
2180
- @param {Object|Function} targetOrMethod A target object or a function
2181
- @param {Function|String} method A function or the name of a function to be called on `target`
2182
- @param {Function} callback
2183
- */
2184
- function suspendListeners(obj, eventNames, target, method, callback) {
2185
- if (!method && 'function' === typeof target) {
2186
- method = target;
2187
- target = null;
2188
- }
2189
-
2190
- var suspendedActions = [],
2191
- eventName, actions, action, i, l;
2192
-
2193
- for (i=0, l=eventNames.length; i<l; i++) {
2194
- eventName = eventNames[i];
2195
- actions = actionsFor(obj, eventName);
2196
- var actionIndex = indexOf(actions, target, method);
2197
-
2198
- if (actionIndex !== -1) {
2199
- action = actions[actionIndex].slice();
2200
- action[3] = true;
2201
- actions[actionIndex] = action;
2202
- suspendedActions.push(action);
2203
- }
2204
- }
2205
-
2206
- function tryable() { return callback.call(target); }
2207
-
2208
- function finalizer() {
2209
- for (i = 0, l = suspendedActions.length; i < l; i++) {
2210
- suspendedActions[i][3] = undefined;
2211
- }
2212
- }
2213
-
2214
- return Ember.tryFinally(tryable, finalizer);
2215
- }
2216
-
2217
- /**
2218
- @private
2219
-
2220
- Return a list of currently watched events
2138
+ descs[keyName] = undefined; // shadow descriptor in proto
2139
+ if (desc == null) {
2140
+ value = data;
2221
2141
 
2222
- @method watchedEvents
2223
- @for Ember
2224
- @param obj
2225
- */
2226
- function watchedEvents(obj) {
2227
- var listeners = obj[META_KEY].listeners, ret = [];
2142
+ if (MANDATORY_SETTER && watching) {
2143
+ meta.values[keyName] = data;
2144
+ objectDefineProperty(obj, keyName, {
2145
+ configurable: true,
2146
+ enumerable: true,
2147
+ set: MANDATORY_SETTER_FUNCTION,
2148
+ get: DEFAULT_GETTER_FUNCTION(keyName)
2149
+ });
2150
+ } else {
2151
+ obj[keyName] = data;
2152
+ }
2153
+ } else {
2154
+ value = desc;
2228
2155
 
2229
- if (listeners) {
2230
- for(var eventName in listeners) {
2231
- if (listeners[eventName]) { ret.push(eventName); }
2156
+ // compatibility with ES5
2157
+ objectDefineProperty(obj, keyName, desc);
2232
2158
  }
2233
2159
  }
2234
- return ret;
2235
- }
2236
-
2237
- /**
2238
- @method sendEvent
2239
- @for Ember
2240
- @param obj
2241
- @param {String} eventName
2242
- @param {Array} params
2243
- @param {Array} actions
2244
- @return true
2245
- */
2246
- function sendEvent(obj, eventName, params, actions) {
2247
- // first give object a chance to handle it
2248
- if (obj !== Ember && 'function' === typeof obj.sendEvent) {
2249
- obj.sendEvent(eventName, params);
2250
- }
2251
2160
 
2252
- if (!actions) {
2253
- var meta = obj[META_KEY];
2254
- actions = meta && meta.listeners && meta.listeners[eventName];
2255
- }
2161
+ // if key is being watched, override chains that
2162
+ // were initialized with the prototype
2163
+ if (watching) { Ember.overrideChains(obj, keyName, meta); }
2256
2164
 
2257
- if (!actions) { return; }
2165
+ // The `value` passed to the `didDefineProperty` hook is
2166
+ // either the descriptor or data, whichever was passed.
2167
+ if (obj.didDefineProperty) { obj.didDefineProperty(obj, keyName, value); }
2258
2168
 
2259
- for (var i = actions.length - 1; i >= 0; i--) { // looping in reverse for once listeners
2260
- if (!actions[i] || actions[i][3] === true) { continue; }
2169
+ return this;
2170
+ };
2261
2171
 
2262
- var target = actions[i][0],
2263
- method = actions[i][1],
2264
- once = actions[i][2];
2265
2172
 
2266
- if (once) { removeListener(obj, eventName, target, method); }
2267
- if (!target) { target = obj; }
2268
- if ('string' === typeof method) { method = target[method]; }
2269
- if (params) {
2270
- method.apply(target, params);
2271
- } else {
2272
- method.call(target);
2273
- }
2274
- }
2275
- return true;
2276
- }
2173
+ })();
2277
2174
 
2278
- /**
2279
- @private
2280
- @method hasListeners
2281
- @for Ember
2282
- @param obj
2283
- @param {String} eventName
2284
- */
2285
- function hasListeners(obj, eventName) {
2286
- var meta = obj[META_KEY],
2287
- actions = meta && meta.listeners && meta.listeners[eventName];
2288
2175
 
2289
- return !!(actions && actions.length);
2290
- }
2291
2176
 
2177
+ (function() {
2178
+ // Ember.tryFinally
2292
2179
  /**
2293
- @private
2294
- @method listenersFor
2295
- @for Ember
2296
- @param obj
2297
- @param {String} eventName
2180
+ @module ember-metal
2298
2181
  */
2299
- function listenersFor(obj, eventName) {
2300
- var ret = [];
2301
- var meta = obj[META_KEY],
2302
- actions = meta && meta.listeners && meta.listeners[eventName];
2303
-
2304
- if (!actions) { return ret; }
2305
-
2306
- for (var i = 0, l = actions.length; i < l; i++) {
2307
- var target = actions[i][0],
2308
- method = actions[i][1];
2309
- ret.push([target, method]);
2310
- }
2311
-
2312
- return ret;
2313
- }
2314
-
2315
- Ember.addListener = addListener;
2316
- Ember.removeListener = removeListener;
2317
- Ember._suspendListener = suspendListener;
2318
- Ember._suspendListeners = suspendListeners;
2319
- Ember.sendEvent = sendEvent;
2320
- Ember.hasListeners = hasListeners;
2321
- Ember.watchedEvents = watchedEvents;
2322
- Ember.listenersFor = listenersFor;
2323
- Ember.listenersDiff = actionsDiff;
2324
- Ember.listenersUnion = actionsUnion;
2325
-
2326
- })();
2327
2182
 
2183
+ var AFTER_OBSERVERS = ':change';
2184
+ var BEFORE_OBSERVERS = ':before';
2328
2185
 
2186
+ var guidFor = Ember.guidFor;
2329
2187
 
2330
- (function() {
2331
- var guidFor = Ember.guidFor,
2332
- sendEvent = Ember.sendEvent;
2188
+ var deferred = 0;
2333
2189
 
2334
2190
  /*
2335
2191
  this.observerSet = {
@@ -2349,14 +2205,14 @@ var guidFor = Ember.guidFor,
2349
2205
  ...
2350
2206
  ]
2351
2207
  */
2352
- var ObserverSet = Ember._ObserverSet = function() {
2208
+ function ObserverSet() {
2353
2209
  this.clear();
2354
- };
2210
+ }
2355
2211
 
2356
2212
  ObserverSet.prototype.add = function(sender, keyName, eventName) {
2357
2213
  var observerSet = this.observerSet,
2358
2214
  observers = this.observers,
2359
- senderGuid = guidFor(sender),
2215
+ senderGuid = Ember.guidFor(sender),
2360
2216
  keySet = observerSet[senderGuid],
2361
2217
  index;
2362
2218
 
@@ -2383,7 +2239,7 @@ ObserverSet.prototype.flush = function() {
2383
2239
  observer = observers[i];
2384
2240
  sender = observer.sender;
2385
2241
  if (sender.isDestroying || sender.isDestroyed) { continue; }
2386
- sendEvent(sender, observer.eventName, [sender, observer.keyName], observer.listeners);
2242
+ Ember.sendEvent(sender, observer.eventName, [sender, observer.keyName], observer.listeners);
2387
2243
  }
2388
2244
  };
2389
2245
 
@@ -2391,911 +2247,710 @@ ObserverSet.prototype.clear = function() {
2391
2247
  this.observerSet = {};
2392
2248
  this.observers = [];
2393
2249
  };
2394
- })();
2395
-
2396
-
2397
-
2398
- (function() {
2399
- var metaFor = Ember.meta,
2400
- guidFor = Ember.guidFor,
2401
- tryFinally = Ember.tryFinally,
2402
- sendEvent = Ember.sendEvent,
2403
- listenersUnion = Ember.listenersUnion,
2404
- listenersDiff = Ember.listenersDiff,
2405
- ObserverSet = Ember._ObserverSet,
2406
- beforeObserverSet = new ObserverSet(),
2407
- observerSet = new ObserverSet(),
2408
- deferred = 0;
2409
2250
 
2410
- // ..........................................................
2411
- // PROPERTY CHANGES
2412
- //
2251
+ var beforeObserverSet = new ObserverSet(), observerSet = new ObserverSet();
2413
2252
 
2414
2253
  /**
2415
- This function is called just before an object property is about to change.
2416
- It will notify any before observers and prepare caches among other things.
2417
-
2418
- Normally you will not need to call this method directly but if for some
2419
- reason you can't directly watch a property you can invoke this method
2420
- manually along with `Ember.propertyDidChange()` which you should call just
2421
- after the property value changes.
2422
-
2423
- @method propertyWillChange
2424
- @for Ember
2425
- @param {Object} obj The object with the property that will change
2426
- @param {String} keyName The property key (or path) that will change.
2427
- @return {void}
2254
+ @method beginPropertyChanges
2255
+ @chainable
2428
2256
  */
2429
- var propertyWillChange = Ember.propertyWillChange = function(obj, keyName) {
2430
- var m = metaFor(obj, false),
2431
- watching = m.watching[keyName] > 0 || keyName === 'length',
2432
- proto = m.proto,
2433
- desc = m.descs[keyName];
2434
-
2435
- if (!watching) { return; }
2436
- if (proto === obj) { return; }
2437
- if (desc && desc.willChange) { desc.willChange(obj, keyName); }
2438
- dependentKeysWillChange(obj, keyName, m);
2439
- chainsWillChange(obj, keyName, m);
2440
- notifyBeforeObservers(obj, keyName);
2257
+ Ember.beginPropertyChanges = function() {
2258
+ deferred++;
2441
2259
  };
2442
2260
 
2443
2261
  /**
2444
- This function is called just after an object property has changed.
2445
- It will notify any observers and clear caches among other things.
2446
-
2447
- Normally you will not need to call this method directly but if for some
2448
- reason you can't directly watch a property you can invoke this method
2449
- manually along with `Ember.propertyWilLChange()` which you should call just
2450
- before the property value changes.
2451
-
2452
- @method propertyDidChange
2453
- @for Ember
2454
- @param {Object} obj The object with the property that will change
2455
- @param {String} keyName The property key (or path) that will change.
2456
- @return {void}
2262
+ @method endPropertyChanges
2457
2263
  */
2458
- var propertyDidChange = Ember.propertyDidChange = function(obj, keyName) {
2459
- var m = metaFor(obj, false),
2460
- watching = m.watching[keyName] > 0 || keyName === 'length',
2461
- proto = m.proto,
2462
- desc = m.descs[keyName];
2264
+ Ember.endPropertyChanges = function() {
2265
+ deferred--;
2266
+ if (deferred<=0) {
2267
+ beforeObserverSet.clear();
2268
+ observerSet.flush();
2269
+ }
2270
+ };
2463
2271
 
2464
- if (proto === obj) { return; }
2272
+ /**
2273
+ Make a series of property changes together in an
2274
+ exception-safe way.
2465
2275
 
2466
- // shouldn't this mean that we're watching this key?
2467
- if (desc && desc.didChange) { desc.didChange(obj, keyName); }
2468
- if (!watching && keyName !== 'length') { return; }
2276
+ ```javascript
2277
+ Ember.changeProperties(function() {
2278
+ obj1.set('foo', mayBlowUpWhenSet);
2279
+ obj2.set('bar', baz);
2280
+ });
2281
+ ```
2469
2282
 
2470
- dependentKeysDidChange(obj, keyName, m);
2471
- chainsDidChange(obj, keyName, m);
2472
- notifyObservers(obj, keyName);
2283
+ @method changeProperties
2284
+ @param {Function} callback
2285
+ @param [binding]
2286
+ */
2287
+ Ember.changeProperties = function(cb, binding){
2288
+ Ember.beginPropertyChanges();
2289
+ Ember.tryFinally(cb, Ember.endPropertyChanges, binding);
2473
2290
  };
2474
2291
 
2475
- var WILL_SEEN, DID_SEEN;
2476
-
2477
- // called whenever a property is about to change to clear the cache of any dependent keys (and notify those properties of changes, etc...)
2478
- function dependentKeysWillChange(obj, depKey, meta) {
2479
- if (obj.isDestroying) { return; }
2292
+ /**
2293
+ Set a list of properties on an object. These properties are set inside
2294
+ a single `beginPropertyChanges` and `endPropertyChanges` batch, so
2295
+ observers will be buffered.
2480
2296
 
2481
- var seen = WILL_SEEN, top = !seen;
2482
- if (top) { seen = WILL_SEEN = {}; }
2483
- iterDeps(propertyWillChange, obj, depKey, seen, meta);
2484
- if (top) { WILL_SEEN = null; }
2485
- }
2297
+ @method setProperties
2298
+ @param target
2299
+ @param {Hash} properties
2300
+ @return target
2301
+ */
2302
+ Ember.setProperties = function(self, hash) {
2303
+ Ember.changeProperties(function(){
2304
+ for(var prop in hash) {
2305
+ if (hash.hasOwnProperty(prop)) Ember.set(self, prop, hash[prop]);
2306
+ }
2307
+ });
2308
+ return self;
2309
+ };
2486
2310
 
2487
- // called whenever a property has just changed to update dependent keys
2488
- function dependentKeysDidChange(obj, depKey, meta) {
2489
- if (obj.isDestroying) { return; }
2490
2311
 
2491
- var seen = DID_SEEN, top = !seen;
2492
- if (top) { seen = DID_SEEN = {}; }
2493
- iterDeps(propertyDidChange, obj, depKey, seen, meta);
2494
- if (top) { DID_SEEN = null; }
2312
+ function changeEvent(keyName) {
2313
+ return keyName+AFTER_OBSERVERS;
2495
2314
  }
2496
2315
 
2497
- function iterDeps(method, obj, depKey, seen, meta) {
2498
- var guid = guidFor(obj);
2499
- if (!seen[guid]) seen[guid] = {};
2500
- if (seen[guid][depKey]) return;
2501
- seen[guid][depKey] = true;
2502
-
2503
- var deps = meta.deps;
2504
- deps = deps && deps[depKey];
2505
- if (deps) {
2506
- for(var key in deps) {
2507
- var desc = meta.descs[key];
2508
- if (desc && desc._suspended === obj) continue;
2509
- method(obj, key);
2510
- }
2511
- }
2316
+ function beforeEvent(keyName) {
2317
+ return keyName+BEFORE_OBSERVERS;
2512
2318
  }
2513
2319
 
2514
- var chainsWillChange = function(obj, keyName, m, arg) {
2515
- if (!m.hasOwnProperty('chainWatchers')) { return; } // nothing to do
2516
-
2517
- var nodes = m.chainWatchers;
2518
-
2519
- nodes = nodes[keyName];
2520
- if (!nodes) { return; }
2320
+ /**
2321
+ @method addObserver
2322
+ @param obj
2323
+ @param {String} path
2324
+ @param {Object|Function} targetOrMethod
2325
+ @param {Function|String} [method]
2326
+ */
2327
+ Ember.addObserver = function(obj, path, target, method) {
2328
+ Ember.addListener(obj, changeEvent(path), target, method);
2329
+ Ember.watch(obj, path);
2330
+ return this;
2331
+ };
2521
2332
 
2522
- for(var i = 0, l = nodes.length; i < l; i++) {
2523
- nodes[i].willChange(arg);
2524
- }
2333
+ Ember.observersFor = function(obj, path) {
2334
+ return Ember.listenersFor(obj, changeEvent(path));
2525
2335
  };
2526
2336
 
2527
- var chainsDidChange = function(obj, keyName, m, arg) {
2528
- if (!m.hasOwnProperty('chainWatchers')) { return; } // nothing to do
2337
+ /**
2338
+ @method removeObserver
2339
+ @param obj
2340
+ @param {String} path
2341
+ @param {Object|Function} targetOrMethod
2342
+ @param {Function|String} [method]
2343
+ */
2344
+ Ember.removeObserver = function(obj, path, target, method) {
2345
+ Ember.unwatch(obj, path);
2346
+ Ember.removeListener(obj, changeEvent(path), target, method);
2347
+ return this;
2348
+ };
2529
2349
 
2530
- var nodes = m.chainWatchers;
2350
+ /**
2351
+ @method addBeforeObserver
2352
+ @param obj
2353
+ @param {String} path
2354
+ @param {Object|Function} targetOrMethod
2355
+ @param {Function|String} [method]
2356
+ */
2357
+ Ember.addBeforeObserver = function(obj, path, target, method) {
2358
+ Ember.addListener(obj, beforeEvent(path), target, method);
2359
+ Ember.watch(obj, path);
2360
+ return this;
2361
+ };
2531
2362
 
2532
- nodes = nodes[keyName];
2533
- if (!nodes) { return; }
2363
+ // Suspend observer during callback.
2364
+ //
2365
+ // This should only be used by the target of the observer
2366
+ // while it is setting the observed path.
2367
+ Ember._suspendBeforeObserver = function(obj, path, target, method, callback) {
2368
+ return Ember._suspendListener(obj, beforeEvent(path), target, method, callback);
2369
+ };
2534
2370
 
2535
- // looping in reverse because the chainWatchers array can be modified inside didChange
2536
- for (var i = nodes.length - 1; i >= 0; i--) {
2537
- nodes[i].didChange(arg);
2538
- }
2371
+ Ember._suspendObserver = function(obj, path, target, method, callback) {
2372
+ return Ember._suspendListener(obj, changeEvent(path), target, method, callback);
2539
2373
  };
2540
2374
 
2541
- Ember.overrideChains = function(obj, keyName, m) {
2542
- chainsDidChange(obj, keyName, m, true);
2375
+ var map = Ember.ArrayPolyfills.map;
2376
+
2377
+ Ember._suspendBeforeObservers = function(obj, paths, target, method, callback) {
2378
+ var events = map.call(paths, beforeEvent);
2379
+ return Ember._suspendListeners(obj, events, target, method, callback);
2543
2380
  };
2544
2381
 
2545
- /**
2546
- @method beginPropertyChanges
2547
- @chainable
2548
- */
2549
- var beginPropertyChanges = Ember.beginPropertyChanges = function() {
2550
- deferred++;
2382
+ Ember._suspendObservers = function(obj, paths, target, method, callback) {
2383
+ var events = map.call(paths, changeEvent);
2384
+ return Ember._suspendListeners(obj, events, target, method, callback);
2551
2385
  };
2552
2386
 
2553
- /**
2554
- @method endPropertyChanges
2555
- */
2556
- var endPropertyChanges = Ember.endPropertyChanges = function() {
2557
- deferred--;
2558
- if (deferred<=0) {
2559
- beforeObserverSet.clear();
2560
- observerSet.flush();
2561
- }
2387
+ Ember.beforeObserversFor = function(obj, path) {
2388
+ return Ember.listenersFor(obj, beforeEvent(path));
2562
2389
  };
2563
2390
 
2564
2391
  /**
2565
- Make a series of property changes together in an
2566
- exception-safe way.
2567
-
2568
- ```javascript
2569
- Ember.changeProperties(function() {
2570
- obj1.set('foo', mayBlowUpWhenSet);
2571
- obj2.set('bar', baz);
2572
- });
2573
- ```
2574
-
2575
- @method changePropertiess
2576
- @param {Function} callback
2577
- @param [binding]
2392
+ @method removeBeforeObserver
2393
+ @param obj
2394
+ @param {String} path
2395
+ @param {Object|Function} targetOrMethod
2396
+ @param {Function|String} [method]
2578
2397
  */
2579
- var changeProperties = Ember.changeProperties = function(cb, binding){
2580
- beginPropertyChanges();
2581
- tryFinally(cb, endPropertyChanges, binding);
2398
+ Ember.removeBeforeObserver = function(obj, path, target, method) {
2399
+ Ember.unwatch(obj, path);
2400
+ Ember.removeListener(obj, beforeEvent(path), target, method);
2401
+ return this;
2582
2402
  };
2583
2403
 
2584
- var notifyBeforeObservers = function(obj, keyName) {
2404
+ Ember.notifyBeforeObservers = function(obj, keyName) {
2585
2405
  if (obj.isDestroying) { return; }
2586
2406
 
2587
- var eventName = keyName + ':before', listeners, diff;
2407
+ var eventName = beforeEvent(keyName), listeners, listenersDiff;
2588
2408
  if (deferred) {
2589
2409
  listeners = beforeObserverSet.add(obj, keyName, eventName);
2590
- diff = listenersDiff(obj, eventName, listeners);
2591
- sendEvent(obj, eventName, [obj, keyName], diff);
2410
+ listenersDiff = Ember.listenersDiff(obj, eventName, listeners);
2411
+ Ember.sendEvent(obj, eventName, [obj, keyName], listenersDiff);
2592
2412
  } else {
2593
- sendEvent(obj, eventName, [obj, keyName]);
2413
+ Ember.sendEvent(obj, eventName, [obj, keyName]);
2594
2414
  }
2595
2415
  };
2596
2416
 
2597
- var notifyObservers = function(obj, keyName) {
2417
+ Ember.notifyObservers = function(obj, keyName) {
2598
2418
  if (obj.isDestroying) { return; }
2599
2419
 
2600
- var eventName = keyName + ':change', listeners;
2420
+ var eventName = changeEvent(keyName), listeners;
2601
2421
  if (deferred) {
2602
2422
  listeners = observerSet.add(obj, keyName, eventName);
2603
- listenersUnion(obj, eventName, listeners);
2423
+ Ember.listenersUnion(obj, eventName, listeners);
2604
2424
  } else {
2605
- sendEvent(obj, eventName, [obj, keyName]);
2425
+ Ember.sendEvent(obj, eventName, [obj, keyName]);
2606
2426
  }
2607
2427
  };
2428
+
2608
2429
  })();
2609
2430
 
2610
2431
 
2611
2432
 
2612
2433
  (function() {
2613
- // META_KEY
2614
- // _getPath
2615
- // propertyWillChange, propertyDidChange
2434
+ /**
2435
+ @module ember-metal
2436
+ */
2616
2437
 
2617
- var META_KEY = Ember.META_KEY,
2618
- MANDATORY_SETTER = Ember.ENV.MANDATORY_SETTER,
2619
- IS_GLOBAL = /^([A-Z$]|([0-9][A-Z$]))/,
2620
- propertyWillChange = Ember.propertyWillChange,
2621
- propertyDidChange = Ember.propertyDidChange,
2622
- getPath = Ember._getPath;
2438
+ var guidFor = Ember.guidFor, // utils.js
2439
+ metaFor = Ember.meta, // utils.js
2440
+ get = Ember.get, // accessors.js
2441
+ set = Ember.set, // accessors.js
2442
+ normalizeTuple = Ember.normalizeTuple, // accessors.js
2443
+ GUID_KEY = Ember.GUID_KEY, // utils.js
2444
+ META_KEY = Ember.META_KEY, // utils.js
2445
+ // circular reference observer depends on Ember.watch
2446
+ // we should move change events to this file or its own property_events.js
2447
+ forEach = Ember.ArrayPolyfills.forEach, // array.js
2448
+ FIRST_KEY = /^([^\.\*]+)/,
2449
+ IS_PATH = /[\.\*]/;
2623
2450
 
2624
- /**
2625
- Sets the value of a property on an object, respecting computed properties
2626
- and notifying observers and other listeners of the change. If the
2627
- property is not defined but the object implements the `unknownProperty`
2628
- method then that will be invoked as well.
2451
+ var MANDATORY_SETTER = Ember.ENV.MANDATORY_SETTER,
2452
+ o_defineProperty = Ember.platform.defineProperty;
2629
2453
 
2630
- If you plan to run on IE8 and older browsers then you should use this
2631
- method anytime you want to set a property on an object that you don't
2632
- know for sure is private. (Properties beginning with an underscore '_'
2633
- are considered private.)
2454
+ function firstKey(path) {
2455
+ return path.match(FIRST_KEY)[0];
2456
+ }
2634
2457
 
2635
- On all newer browsers, you only need to use this method to set
2636
- properties if the property might not be defined on the object and you want
2637
- to respect the `unknownProperty` handler. Otherwise you can ignore this
2638
- method.
2458
+ // returns true if the passed path is just a keyName
2459
+ function isKeyName(path) {
2460
+ return path==='*' || !IS_PATH.test(path);
2461
+ }
2639
2462
 
2640
- @method set
2641
- @for Ember
2642
- @param {Object} obj The object to modify.
2643
- @param {String} keyName The property key to set
2644
- @param {Object} value The value to set
2645
- @return {Object} the passed value.
2646
- */
2647
- var set = function set(obj, keyName, value, tolerant) {
2648
- if (typeof obj === 'string') {
2463
+ // ..........................................................
2464
+ // DEPENDENT KEYS
2465
+ //
2649
2466
 
2650
- value = keyName;
2651
- keyName = obj;
2652
- obj = null;
2653
- }
2467
+ function iterDeps(method, obj, depKey, seen, meta) {
2654
2468
 
2655
- if (!obj || keyName.indexOf('.') !== -1) {
2656
- return setPath(obj, keyName, value, tolerant);
2657
- }
2469
+ var guid = guidFor(obj);
2470
+ if (!seen[guid]) seen[guid] = {};
2471
+ if (seen[guid][depKey]) return;
2472
+ seen[guid][depKey] = true;
2658
2473
 
2474
+ var deps = meta.deps;
2475
+ deps = deps && deps[depKey];
2476
+ if (deps) {
2477
+ for(var key in deps) {
2478
+ var desc = meta.descs[key];
2479
+ if (desc && desc._suspended === obj) continue;
2480
+ method(obj, key);
2481
+ }
2482
+ }
2483
+ }
2659
2484
 
2660
2485
 
2661
- var meta = obj[META_KEY], desc = meta && meta.descs[keyName],
2662
- isUnknown, currentValue;
2663
- if (desc) {
2664
- desc.set(obj, keyName, value);
2665
- } else {
2666
- isUnknown = 'object' === typeof obj && !(keyName in obj);
2486
+ var WILL_SEEN, DID_SEEN;
2667
2487
 
2668
- // setUnknownProperty is called if `obj` is an object,
2669
- // the property does not already exist, and the
2670
- // `setUnknownProperty` method exists on the object
2671
- if (isUnknown && 'function' === typeof obj.setUnknownProperty) {
2672
- obj.setUnknownProperty(keyName, value);
2673
- } else if (meta && meta.watching[keyName] > 0) {
2674
- if (MANDATORY_SETTER) {
2675
- currentValue = meta.values[keyName];
2676
- } else {
2677
- currentValue = obj[keyName];
2678
- }
2679
- // only trigger a change if the value has changed
2680
- if (value !== currentValue) {
2681
- Ember.propertyWillChange(obj, keyName);
2682
- if (MANDATORY_SETTER) {
2683
- if (currentValue === undefined && !(keyName in obj)) {
2684
- Ember.defineProperty(obj, keyName, null, value); // setup mandatory setter
2685
- } else {
2686
- meta.values[keyName] = value;
2687
- }
2688
- } else {
2689
- obj[keyName] = value;
2690
- }
2691
- Ember.propertyDidChange(obj, keyName);
2692
- }
2693
- } else {
2694
- obj[keyName] = value;
2695
- }
2696
- }
2697
- return value;
2698
- };
2488
+ // called whenever a property is about to change to clear the cache of any dependent keys (and notify those properties of changes, etc...)
2489
+ function dependentKeysWillChange(obj, depKey, meta) {
2490
+ if (obj.isDestroying) { return; }
2699
2491
 
2700
- // Currently used only by Ember Data tests
2701
- if (Ember.config.overrideAccessors) {
2702
- Ember.set = set;
2703
- Ember.config.overrideAccessors();
2704
- set = Ember.set;
2492
+ var seen = WILL_SEEN, top = !seen;
2493
+ if (top) { seen = WILL_SEEN = {}; }
2494
+ iterDeps(propertyWillChange, obj, depKey, seen, meta);
2495
+ if (top) { WILL_SEEN = null; }
2705
2496
  }
2706
2497
 
2707
- function setPath(root, path, value, tolerant) {
2708
- var keyName;
2498
+ // called whenever a property has just changed to update dependent keys
2499
+ function dependentKeysDidChange(obj, depKey, meta) {
2500
+ if (obj.isDestroying) { return; }
2709
2501
 
2710
- // get the last part of the path
2711
- keyName = path.slice(path.lastIndexOf('.') + 1);
2502
+ var seen = DID_SEEN, top = !seen;
2503
+ if (top) { seen = DID_SEEN = {}; }
2504
+ iterDeps(propertyDidChange, obj, depKey, seen, meta);
2505
+ if (top) { DID_SEEN = null; }
2506
+ }
2712
2507
 
2713
- // get the first part of the part
2714
- path = path.slice(0, path.length-(keyName.length+1));
2508
+ // ..........................................................
2509
+ // CHAIN
2510
+ //
2715
2511
 
2716
- // unless the path is this, look up the first part to
2717
- // get the root
2718
- if (path !== 'this') {
2719
- root = getPath(root, path);
2720
- }
2512
+ function addChainWatcher(obj, keyName, node) {
2513
+ if (!obj || ('object' !== typeof obj)) { return; } // nothing to do
2721
2514
 
2722
- if (!keyName || keyName.length === 0) {
2723
- throw new Error('You passed an empty path');
2724
- }
2515
+ var m = metaFor(obj), nodes = m.chainWatchers;
2725
2516
 
2726
- if (!root) {
2727
- if (tolerant) { return; }
2728
- else { throw new Error('Object in path '+path+' could not be found or was destroyed.'); }
2517
+ if (!m.hasOwnProperty('chainWatchers')) {
2518
+ nodes = m.chainWatchers = {};
2729
2519
  }
2730
2520
 
2731
- return set(root, keyName, value);
2521
+ if (!nodes[keyName]) { nodes[keyName] = []; }
2522
+ nodes[keyName].push(node);
2523
+ Ember.watch(obj, keyName);
2732
2524
  }
2733
2525
 
2734
- Ember.set = set;
2735
- Ember.setPath = Ember.deprecateFunc('setPath is deprecated since set now supports paths', Ember.set);
2526
+ function removeChainWatcher(obj, keyName, node) {
2527
+ if (!obj || 'object' !== typeof obj) { return; } // nothing to do
2736
2528
 
2737
- /**
2738
- Error-tolerant form of `Ember.set`. Will not blow up if any part of the
2739
- chain is `undefined`, `null`, or destroyed.
2529
+ var m = metaFor(obj, false);
2530
+ if (!m.hasOwnProperty('chainWatchers')) { return; } // nothing to do
2740
2531
 
2741
- This is primarily used when syncing bindings, which may try to update after
2742
- an object has been destroyed.
2532
+ var nodes = m.chainWatchers;
2743
2533
 
2744
- @method trySet
2745
- @for Ember
2746
- @param {Object} obj The object to modify.
2747
- @param {String} path The property path to set
2748
- @param {Object} value The value to set
2749
- */
2750
- Ember.trySet = function(root, path, value) {
2751
- return set(root, path, value, true);
2752
- };
2753
- Ember.trySetPath = Ember.deprecateFunc('trySetPath has been renamed to trySet', Ember.trySet);
2534
+ if (nodes[keyName]) {
2535
+ nodes = nodes[keyName];
2536
+ for (var i = 0, l = nodes.length; i < l; i++) {
2537
+ if (nodes[i] === node) { nodes.splice(i, 1); }
2538
+ }
2539
+ }
2540
+ Ember.unwatch(obj, keyName);
2541
+ }
2754
2542
 
2755
- })();
2543
+ var pendingQueue = [];
2756
2544
 
2545
+ // attempts to add the pendingQueue chains again. If some of them end up
2546
+ // back in the queue and reschedule is true, schedules a timeout to try
2547
+ // again.
2548
+ function flushPendingChains() {
2549
+ if (pendingQueue.length === 0) { return; } // nothing to do
2757
2550
 
2551
+ var queue = pendingQueue;
2552
+ pendingQueue = [];
2758
2553
 
2759
- (function() {
2760
- /**
2761
- @module ember-metal
2762
- */
2554
+ forEach.call(queue, function(q) { q[0].add(q[1]); });
2763
2555
 
2764
- var META_KEY = Ember.META_KEY,
2765
- metaFor = Ember.meta,
2766
- objectDefineProperty = Ember.platform.defineProperty;
2556
+ }
2767
2557
 
2768
- var MANDATORY_SETTER = Ember.ENV.MANDATORY_SETTER;
2558
+ function isProto(pvalue) {
2559
+ return metaFor(pvalue, false).proto === pvalue;
2560
+ }
2769
2561
 
2770
- // ..........................................................
2771
- // DESCRIPTOR
2772
- //
2562
+ // A ChainNode watches a single key on an object. If you provide a starting
2563
+ // value for the key then the node won't actually watch it. For a root node
2564
+ // pass null for parent and key and object for value.
2565
+ var ChainNode = function(parent, key, value) {
2566
+ var obj;
2567
+ this._parent = parent;
2568
+ this._key = key;
2773
2569
 
2774
- /**
2775
- Objects of this type can implement an interface to responds requests to
2776
- get and set. The default implementation handles simple properties.
2570
+ // _watching is true when calling get(this._parent, this._key) will
2571
+ // return the value of this node.
2572
+ //
2573
+ // It is false for the root of a chain (because we have no parent)
2574
+ // and for global paths (because the parent node is the object with
2575
+ // the observer on it)
2576
+ this._watching = value===undefined;
2777
2577
 
2778
- You generally won't need to create or subclass this directly.
2578
+ this._value = value;
2579
+ this._paths = {};
2580
+ if (this._watching) {
2581
+ this._object = parent.value();
2582
+ if (this._object) { addChainWatcher(this._object, this._key, this); }
2583
+ }
2779
2584
 
2780
- @class Descriptor
2781
- @namespace Ember
2782
- @private
2783
- @constructor
2784
- */
2785
- var Descriptor = Ember.Descriptor = function() {};
2585
+ // Special-case: the EachProxy relies on immediate evaluation to
2586
+ // establish its observers.
2587
+ //
2588
+ // TODO: Replace this with an efficient callback that the EachProxy
2589
+ // can implement.
2590
+ if (this._parent && this._parent._key === '@each') {
2591
+ this.value();
2592
+ }
2593
+ };
2786
2594
 
2787
- // ..........................................................
2788
- // DEFINING PROPERTIES API
2789
- //
2595
+ var ChainNodePrototype = ChainNode.prototype;
2790
2596
 
2791
- var MANDATORY_SETTER_FUNCTION = Ember.MANDATORY_SETTER_FUNCTION = function(value) {
2597
+ ChainNodePrototype.value = function() {
2598
+ if (this._value === undefined && this._watching) {
2599
+ var obj = this._parent.value();
2600
+ this._value = (obj && !isProto(obj)) ? get(obj, this._key) : undefined;
2601
+ }
2602
+ return this._value;
2603
+ };
2792
2604
 
2605
+ ChainNodePrototype.destroy = function() {
2606
+ if (this._watching) {
2607
+ var obj = this._object;
2608
+ if (obj) { removeChainWatcher(obj, this._key, this); }
2609
+ this._watching = false; // so future calls do nothing
2610
+ }
2793
2611
  };
2794
2612
 
2795
- var DEFAULT_GETTER_FUNCTION = Ember.DEFAULT_GETTER_FUNCTION = function(name) {
2796
- return function() {
2797
- var meta = this[META_KEY];
2798
- return meta && meta.values[name];
2799
- };
2613
+ // copies a top level object only
2614
+ ChainNodePrototype.copy = function(obj) {
2615
+ var ret = new ChainNode(null, null, obj),
2616
+ paths = this._paths, path;
2617
+ for (path in paths) {
2618
+ if (paths[path] <= 0) { continue; } // this check will also catch non-number vals.
2619
+ ret.add(path);
2620
+ }
2621
+ return ret;
2800
2622
  };
2801
2623
 
2802
- /**
2803
- @private
2804
-
2805
- NOTE: This is a low-level method used by other parts of the API. You almost
2806
- never want to call this method directly. Instead you should use
2807
- `Ember.mixin()` to define new properties.
2808
-
2809
- Defines a property on an object. This method works much like the ES5
2810
- `Object.defineProperty()` method except that it can also accept computed
2811
- properties and other special descriptors.
2812
-
2813
- Normally this method takes only three parameters. However if you pass an
2814
- instance of `Ember.Descriptor` as the third param then you can pass an
2815
- optional value as the fourth parameter. This is often more efficient than
2816
- creating new descriptor hashes for each property.
2817
-
2818
- ## Examples
2819
-
2820
- ```javascript
2821
- // ES5 compatible mode
2822
- Ember.defineProperty(contact, 'firstName', {
2823
- writable: true,
2824
- configurable: false,
2825
- enumerable: true,
2826
- value: 'Charles'
2827
- });
2624
+ // called on the root node of a chain to setup watchers on the specified
2625
+ // path.
2626
+ ChainNodePrototype.add = function(path) {
2627
+ var obj, tuple, key, src, paths;
2828
2628
 
2829
- // define a simple property
2830
- Ember.defineProperty(contact, 'lastName', undefined, 'Jolley');
2629
+ paths = this._paths;
2630
+ paths[path] = (paths[path] || 0) + 1;
2831
2631
 
2832
- // define a computed property
2833
- Ember.defineProperty(contact, 'fullName', Ember.computed(function() {
2834
- return this.firstName+' '+this.lastName;
2835
- }).property('firstName', 'lastName'));
2836
- ```
2632
+ obj = this.value();
2633
+ tuple = normalizeTuple(obj, path);
2837
2634
 
2838
- @method defineProperty
2839
- @for Ember
2840
- @param {Object} obj the object to define this property on. This may be a prototype.
2841
- @param {String} keyName the name of the property
2842
- @param {Ember.Descriptor} [desc] an instance of `Ember.Descriptor` (typically a
2843
- computed property) or an ES5 descriptor.
2844
- You must provide this or `data` but not both.
2845
- @param {*} [data] something other than a descriptor, that will
2846
- become the explicit value of this property.
2847
- */
2848
- Ember.defineProperty = function(obj, keyName, desc, data, meta) {
2849
- var descs, existingDesc, watching, value;
2635
+ // the path was a local path
2636
+ if (tuple[0] && tuple[0] === obj) {
2637
+ path = tuple[1];
2638
+ key = firstKey(path);
2639
+ path = path.slice(key.length+1);
2850
2640
 
2851
- if (!meta) meta = metaFor(obj);
2852
- descs = meta.descs;
2853
- existingDesc = meta.descs[keyName];
2854
- watching = meta.watching[keyName] > 0;
2641
+ // global path, but object does not exist yet.
2642
+ // put into a queue and try to connect later.
2643
+ } else if (!tuple[0]) {
2644
+ pendingQueue.push([this, path]);
2645
+ tuple.length = 0;
2646
+ return;
2855
2647
 
2856
- if (existingDesc instanceof Ember.Descriptor) {
2857
- existingDesc.teardown(obj, keyName);
2648
+ // global path, and object already exists
2649
+ } else {
2650
+ src = tuple[0];
2651
+ key = path.slice(0, 0-(tuple[1].length+1));
2652
+ path = tuple[1];
2858
2653
  }
2859
2654
 
2860
- if (desc instanceof Ember.Descriptor) {
2861
- value = desc;
2655
+ tuple.length = 0;
2656
+ this.chain(key, path, src);
2657
+ };
2862
2658
 
2863
- descs[keyName] = desc;
2864
- if (MANDATORY_SETTER && watching) {
2865
- objectDefineProperty(obj, keyName, {
2866
- configurable: true,
2867
- enumerable: true,
2868
- writable: true,
2869
- value: undefined // make enumerable
2870
- });
2871
- } else {
2872
- obj[keyName] = undefined; // make enumerable
2873
- }
2874
- desc.setup(obj, keyName);
2875
- } else {
2876
- descs[keyName] = undefined; // shadow descriptor in proto
2877
- if (desc == null) {
2878
- value = data;
2659
+ // called on the root node of a chain to teardown watcher on the specified
2660
+ // path
2661
+ ChainNodePrototype.remove = function(path) {
2662
+ var obj, tuple, key, src, paths;
2879
2663
 
2880
- if (MANDATORY_SETTER && watching) {
2881
- meta.values[keyName] = data;
2882
- objectDefineProperty(obj, keyName, {
2883
- configurable: true,
2884
- enumerable: true,
2885
- set: MANDATORY_SETTER_FUNCTION,
2886
- get: DEFAULT_GETTER_FUNCTION(keyName)
2887
- });
2888
- } else {
2889
- obj[keyName] = data;
2890
- }
2891
- } else {
2892
- value = desc;
2664
+ paths = this._paths;
2665
+ if (paths[path] > 0) { paths[path]--; }
2893
2666
 
2894
- // compatibility with ES5
2895
- objectDefineProperty(obj, keyName, desc);
2896
- }
2667
+ obj = this.value();
2668
+ tuple = normalizeTuple(obj, path);
2669
+ if (tuple[0] === obj) {
2670
+ path = tuple[1];
2671
+ key = firstKey(path);
2672
+ path = path.slice(key.length+1);
2673
+ } else {
2674
+ src = tuple[0];
2675
+ key = path.slice(0, 0-(tuple[1].length+1));
2676
+ path = tuple[1];
2897
2677
  }
2898
2678
 
2899
- // if key is being watched, override chains that
2900
- // were initialized with the prototype
2901
- if (watching) { Ember.overrideChains(obj, keyName, meta); }
2902
-
2903
- // The `value` passed to the `didDefineProperty` hook is
2904
- // either the descriptor or data, whichever was passed.
2905
- if (obj.didDefineProperty) { obj.didDefineProperty(obj, keyName, value); }
2906
-
2907
- return this;
2679
+ tuple.length = 0;
2680
+ this.unchain(key, path);
2908
2681
  };
2909
2682
 
2683
+ ChainNodePrototype.count = 0;
2910
2684
 
2911
- })();
2912
-
2913
-
2914
-
2915
- (function() {
2916
- var changeProperties = Ember.changeProperties,
2917
- set = Ember.set;
2685
+ ChainNodePrototype.chain = function(key, path, src) {
2686
+ var chains = this._chains, node;
2687
+ if (!chains) { chains = this._chains = {}; }
2918
2688
 
2919
- /**
2920
- Set a list of properties on an object. These properties are set inside
2921
- a single `beginPropertyChanges` and `endPropertyChanges` batch, so
2922
- observers will be buffered.
2689
+ node = chains[key];
2690
+ if (!node) { node = chains[key] = new ChainNode(this, key, src); }
2691
+ node.count++; // count chains...
2923
2692
 
2924
- @method setProperties
2925
- @param target
2926
- @param {Hash} properties
2927
- @return target
2928
- */
2929
- Ember.setProperties = function(self, hash) {
2930
- changeProperties(function(){
2931
- for(var prop in hash) {
2932
- if (hash.hasOwnProperty(prop)) { set(self, prop, hash[prop]); }
2933
- }
2934
- });
2935
- return self;
2693
+ // chain rest of path if there is one
2694
+ if (path && path.length>0) {
2695
+ key = firstKey(path);
2696
+ path = path.slice(key.length+1);
2697
+ node.chain(key, path); // NOTE: no src means it will observe changes...
2698
+ }
2936
2699
  };
2937
- })();
2938
2700
 
2701
+ ChainNodePrototype.unchain = function(key, path) {
2702
+ var chains = this._chains, node = chains[key];
2939
2703
 
2704
+ // unchain rest of path first...
2705
+ if (path && path.length>1) {
2706
+ key = firstKey(path);
2707
+ path = path.slice(key.length+1);
2708
+ node.unchain(key, path);
2709
+ }
2940
2710
 
2941
- (function() {
2942
- var metaFor = Ember.meta, // utils.js
2943
- typeOf = Ember.typeOf, // utils.js
2944
- MANDATORY_SETTER = Ember.ENV.MANDATORY_SETTER,
2945
- o_defineProperty = Ember.platform.defineProperty;
2711
+ // delete node if needed.
2712
+ node.count--;
2713
+ if (node.count<=0) {
2714
+ delete chains[node._key];
2715
+ node.destroy();
2716
+ }
2946
2717
 
2947
- Ember.watchKey = function(obj, keyName) {
2948
- // can't watch length on Array - it is special...
2949
- if (keyName === 'length' && typeOf(obj) === 'array') { return; }
2718
+ };
2950
2719
 
2951
- var m = metaFor(obj), watching = m.watching, desc;
2720
+ ChainNodePrototype.willChange = function() {
2721
+ var chains = this._chains;
2722
+ if (chains) {
2723
+ for(var key in chains) {
2724
+ if (!chains.hasOwnProperty(key)) { continue; }
2725
+ chains[key].willChange();
2726
+ }
2727
+ }
2952
2728
 
2953
- // activate watching first time
2954
- if (!watching[keyName]) {
2955
- watching[keyName] = 1;
2956
- desc = m.descs[keyName];
2957
- if (desc && desc.willWatch) { desc.willWatch(obj, keyName); }
2729
+ if (this._parent) { this._parent.chainWillChange(this, this._key, 1); }
2730
+ };
2958
2731
 
2959
- if ('function' === typeof obj.willWatchProperty) {
2960
- obj.willWatchProperty(keyName);
2961
- }
2732
+ ChainNodePrototype.chainWillChange = function(chain, path, depth) {
2733
+ if (this._key) { path = this._key + '.' + path; }
2962
2734
 
2963
- if (MANDATORY_SETTER && keyName in obj) {
2964
- m.values[keyName] = obj[keyName];
2965
- o_defineProperty(obj, keyName, {
2966
- configurable: true,
2967
- enumerable: true,
2968
- set: Ember.MANDATORY_SETTER_FUNCTION,
2969
- get: Ember.DEFAULT_GETTER_FUNCTION(keyName)
2970
- });
2971
- }
2735
+ if (this._parent) {
2736
+ this._parent.chainWillChange(this, path, depth+1);
2972
2737
  } else {
2973
- watching[keyName] = (watching[keyName] || 0) + 1;
2738
+ if (depth > 1) { Ember.propertyWillChange(this.value(), path); }
2739
+ path = 'this.' + path;
2740
+ if (this._paths[path] > 0) { Ember.propertyWillChange(this.value(), path); }
2974
2741
  }
2975
2742
  };
2976
2743
 
2744
+ ChainNodePrototype.chainDidChange = function(chain, path, depth) {
2745
+ if (this._key) { path = this._key + '.' + path; }
2746
+ if (this._parent) {
2747
+ this._parent.chainDidChange(this, path, depth+1);
2748
+ } else {
2749
+ if (depth > 1) { Ember.propertyDidChange(this.value(), path); }
2750
+ path = 'this.' + path;
2751
+ if (this._paths[path] > 0) { Ember.propertyDidChange(this.value(), path); }
2752
+ }
2753
+ };
2977
2754
 
2978
- Ember.unwatchKey = function(obj, keyName) {
2979
- var m = metaFor(obj), watching = m.watching, desc;
2980
-
2981
- if (watching[keyName] === 1) {
2982
- watching[keyName] = 0;
2983
- desc = m.descs[keyName];
2984
-
2985
- if (desc && desc.didUnwatch) { desc.didUnwatch(obj, keyName); }
2986
-
2987
- if ('function' === typeof obj.didUnwatchProperty) {
2988
- obj.didUnwatchProperty(keyName);
2755
+ ChainNodePrototype.didChange = function(suppressEvent) {
2756
+ // invalidate my own value first.
2757
+ if (this._watching) {
2758
+ var obj = this._parent.value();
2759
+ if (obj !== this._object) {
2760
+ removeChainWatcher(this._object, this._key, this);
2761
+ this._object = obj;
2762
+ addChainWatcher(obj, this._key, this);
2989
2763
  }
2764
+ this._value = undefined;
2990
2765
 
2991
- if (MANDATORY_SETTER && keyName in obj) {
2992
- o_defineProperty(obj, keyName, {
2993
- configurable: true,
2994
- enumerable: true,
2995
- writable: true,
2996
- value: m.values[keyName]
2997
- });
2998
- delete m.values[keyName];
2766
+ // Special-case: the EachProxy relies on immediate evaluation to
2767
+ // establish its observers.
2768
+ if (this._parent && this._parent._key === '@each')
2769
+ this.value();
2770
+ }
2771
+
2772
+ // then notify chains...
2773
+ var chains = this._chains;
2774
+ if (chains) {
2775
+ for(var key in chains) {
2776
+ if (!chains.hasOwnProperty(key)) { continue; }
2777
+ chains[key].didChange(suppressEvent);
2999
2778
  }
3000
- } else if (watching[keyName] > 1) {
3001
- watching[keyName]--;
3002
2779
  }
3003
- };
3004
- })();
3005
2780
 
2781
+ if (suppressEvent) { return; }
3006
2782
 
2783
+ // and finally tell parent about my path changing...
2784
+ if (this._parent) { this._parent.chainDidChange(this, this._key, 1); }
2785
+ };
3007
2786
 
3008
- (function() {
3009
- var metaFor = Ember.meta, // utils.js
3010
- get = Ember.get, // property_get.js
3011
- normalizeTuple = Ember.normalizeTuple, // property_get.js
3012
- forEach = Ember.ArrayPolyfills.forEach, // array.js
3013
- warn = Ember.warn,
3014
- watchKey = Ember.watchKey,
3015
- unwatchKey = Ember.unwatchKey,
3016
- propertyWillChange = Ember.propertyWillChange,
3017
- propertyDidChange = Ember.propertyDidChange,
3018
- FIRST_KEY = /^([^\.\*]+)/;
3019
-
3020
- function firstKey(path) {
3021
- return path.match(FIRST_KEY)[0];
2787
+ // get the chains for the current object. If the current object has
2788
+ // chains inherited from the proto they will be cloned and reconfigured for
2789
+ // the current object.
2790
+ function chainsFor(obj) {
2791
+ var m = metaFor(obj), ret = m.chains;
2792
+ if (!ret) {
2793
+ ret = m.chains = new ChainNode(null, null, obj);
2794
+ } else if (ret.value() !== obj) {
2795
+ ret = m.chains = ret.copy(obj);
2796
+ }
2797
+ return ret;
3022
2798
  }
3023
2799
 
3024
- var pendingQueue = [];
3025
-
3026
- // attempts to add the pendingQueue chains again. If some of them end up
3027
- // back in the queue and reschedule is true, schedules a timeout to try
3028
- // again.
3029
- Ember.flushPendingChains = function() {
3030
- if (pendingQueue.length === 0) { return; } // nothing to do
3031
-
3032
- var queue = pendingQueue;
3033
- pendingQueue = [];
3034
-
3035
- forEach.call(queue, function(q) { q[0].add(q[1]); });
3036
-
3037
- warn('Watching an undefined global, Ember expects watched globals to be setup by the time the run loop is flushed, check for typos', pendingQueue.length === 0);
2800
+ Ember.overrideChains = function(obj, keyName, m) {
2801
+ chainsDidChange(obj, keyName, m, true);
3038
2802
  };
3039
2803
 
2804
+ function chainsWillChange(obj, keyName, m, arg) {
2805
+ if (!m.hasOwnProperty('chainWatchers')) { return; } // nothing to do
3040
2806
 
3041
- function addChainWatcher(obj, keyName, node) {
3042
- if (!obj || ('object' !== typeof obj)) { return; } // nothing to do
2807
+ var nodes = m.chainWatchers;
3043
2808
 
3044
- var m = metaFor(obj), nodes = m.chainWatchers;
2809
+ nodes = nodes[keyName];
2810
+ if (!nodes) { return; }
3045
2811
 
3046
- if (!m.hasOwnProperty('chainWatchers')) {
3047
- nodes = m.chainWatchers = {};
2812
+ for(var i = 0, l = nodes.length; i < l; i++) {
2813
+ nodes[i].willChange(arg);
3048
2814
  }
3049
-
3050
- if (!nodes[keyName]) { nodes[keyName] = []; }
3051
- nodes[keyName].push(node);
3052
- watchKey(obj, keyName);
3053
2815
  }
3054
2816
 
3055
- var removeChainWatcher = Ember.removeChainWatcher = function(obj, keyName, node) {
3056
- if (!obj || 'object' !== typeof obj) { return; } // nothing to do
3057
-
3058
- var m = metaFor(obj, false);
2817
+ function chainsDidChange(obj, keyName, m, arg) {
3059
2818
  if (!m.hasOwnProperty('chainWatchers')) { return; } // nothing to do
3060
2819
 
3061
2820
  var nodes = m.chainWatchers;
3062
2821
 
3063
- if (nodes[keyName]) {
3064
- nodes = nodes[keyName];
3065
- for (var i = 0, l = nodes.length; i < l; i++) {
3066
- if (nodes[i] === node) { nodes.splice(i, 1); }
3067
- }
3068
- }
3069
- unwatchKey(obj, keyName);
3070
- };
2822
+ nodes = nodes[keyName];
2823
+ if (!nodes) { return; }
3071
2824
 
3072
- function isProto(pvalue) {
3073
- return metaFor(pvalue, false).proto === pvalue;
2825
+ // looping in reverse because the chainWatchers array can be modified inside didChange
2826
+ for (var i = nodes.length - 1; i >= 0; i--) {
2827
+ nodes[i].didChange(arg);
2828
+ }
3074
2829
  }
3075
2830
 
3076
- // A ChainNode watches a single key on an object. If you provide a starting
3077
- // value for the key then the node won't actually watch it. For a root node
3078
- // pass null for parent and key and object for value.
3079
- var ChainNode = Ember._ChainNode = function(parent, key, value) {
3080
- var obj;
3081
- this._parent = parent;
3082
- this._key = key;
2831
+ // ..........................................................
2832
+ // WATCH
2833
+ //
3083
2834
 
3084
- // _watching is true when calling get(this._parent, this._key) will
3085
- // return the value of this node.
3086
- //
3087
- // It is false for the root of a chain (because we have no parent)
3088
- // and for global paths (because the parent node is the object with
3089
- // the observer on it)
3090
- this._watching = value===undefined;
2835
+ /**
2836
+ @private
3091
2837
 
3092
- this._value = value;
3093
- this._paths = {};
3094
- if (this._watching) {
3095
- this._object = parent.value();
3096
- if (this._object) { addChainWatcher(this._object, this._key, this); }
3097
- }
2838
+ Starts watching a property on an object. Whenever the property changes,
2839
+ invokes `Ember.propertyWillChange` and `Ember.propertyDidChange`. This is the
2840
+ primitive used by observers and dependent keys; usually you will never call
2841
+ this method directly but instead use higher level methods like
2842
+ `Ember.addObserver()`
3098
2843
 
3099
- // Special-case: the EachProxy relies on immediate evaluation to
3100
- // establish its observers.
3101
- //
3102
- // TODO: Replace this with an efficient callback that the EachProxy
3103
- // can implement.
3104
- if (this._parent && this._parent._key === '@each') {
3105
- this.value();
3106
- }
3107
- };
2844
+ @method watch
2845
+ @for Ember
2846
+ @param obj
2847
+ @param {String} keyName
2848
+ */
2849
+ Ember.watch = function(obj, keyName) {
2850
+ // can't watch length on Array - it is special...
2851
+ if (keyName === 'length' && Ember.typeOf(obj) === 'array') { return this; }
3108
2852
 
3109
- var ChainNodePrototype = ChainNode.prototype;
2853
+ var m = metaFor(obj), watching = m.watching, desc;
3110
2854
 
3111
- ChainNodePrototype.value = function() {
3112
- if (this._value === undefined && this._watching) {
3113
- var obj = this._parent.value();
3114
- this._value = (obj && !isProto(obj)) ? get(obj, this._key) : undefined;
3115
- }
3116
- return this._value;
3117
- };
2855
+ // activate watching first time
2856
+ if (!watching[keyName]) {
2857
+ watching[keyName] = 1;
2858
+ if (isKeyName(keyName)) {
2859
+ desc = m.descs[keyName];
2860
+ if (desc && desc.willWatch) { desc.willWatch(obj, keyName); }
3118
2861
 
3119
- ChainNodePrototype.destroy = function() {
3120
- if (this._watching) {
3121
- var obj = this._object;
3122
- if (obj) { removeChainWatcher(obj, this._key, this); }
3123
- this._watching = false; // so future calls do nothing
3124
- }
3125
- };
2862
+ if ('function' === typeof obj.willWatchProperty) {
2863
+ obj.willWatchProperty(keyName);
2864
+ }
3126
2865
 
3127
- // copies a top level object only
3128
- ChainNodePrototype.copy = function(obj) {
3129
- var ret = new ChainNode(null, null, obj),
3130
- paths = this._paths, path;
3131
- for (path in paths) {
3132
- if (paths[path] <= 0) { continue; } // this check will also catch non-number vals.
3133
- ret.add(path);
2866
+ if (MANDATORY_SETTER && keyName in obj) {
2867
+ m.values[keyName] = obj[keyName];
2868
+ o_defineProperty(obj, keyName, {
2869
+ configurable: true,
2870
+ enumerable: true,
2871
+ set: Ember.MANDATORY_SETTER_FUNCTION,
2872
+ get: Ember.DEFAULT_GETTER_FUNCTION(keyName)
2873
+ });
2874
+ }
2875
+ } else {
2876
+ chainsFor(obj).add(keyName);
2877
+ }
2878
+
2879
+ } else {
2880
+ watching[keyName] = (watching[keyName] || 0) + 1;
3134
2881
  }
3135
- return ret;
2882
+ return this;
3136
2883
  };
3137
2884
 
3138
- // called on the root node of a chain to setup watchers on the specified
3139
- // path.
3140
- ChainNodePrototype.add = function(path) {
3141
- var obj, tuple, key, src, paths;
3142
-
3143
- paths = this._paths;
3144
- paths[path] = (paths[path] || 0) + 1;
2885
+ Ember.isWatching = function isWatching(obj, key) {
2886
+ var meta = obj[META_KEY];
2887
+ return (meta && meta.watching[key]) > 0;
2888
+ };
3145
2889
 
3146
- obj = this.value();
3147
- tuple = normalizeTuple(obj, path);
2890
+ Ember.watch.flushPending = flushPendingChains;
3148
2891
 
3149
- // the path was a local path
3150
- if (tuple[0] && tuple[0] === obj) {
3151
- path = tuple[1];
3152
- key = firstKey(path);
3153
- path = path.slice(key.length+1);
2892
+ Ember.unwatch = function(obj, keyName) {
2893
+ // can't watch length on Array - it is special...
2894
+ if (keyName === 'length' && Ember.typeOf(obj) === 'array') { return this; }
3154
2895
 
3155
- // global path, but object does not exist yet.
3156
- // put into a queue and try to connect later.
3157
- } else if (!tuple[0]) {
3158
- pendingQueue.push([this, path]);
3159
- tuple.length = 0;
3160
- return;
2896
+ var m = metaFor(obj), watching = m.watching, desc;
3161
2897
 
3162
- // global path, and object already exists
3163
- } else {
3164
- src = tuple[0];
3165
- key = path.slice(0, 0-(tuple[1].length+1));
3166
- path = tuple[1];
3167
- }
2898
+ if (watching[keyName] === 1) {
2899
+ watching[keyName] = 0;
3168
2900
 
3169
- tuple.length = 0;
3170
- this.chain(key, path, src);
3171
- };
2901
+ if (isKeyName(keyName)) {
2902
+ desc = m.descs[keyName];
2903
+ if (desc && desc.didUnwatch) { desc.didUnwatch(obj, keyName); }
3172
2904
 
3173
- // called on the root node of a chain to teardown watcher on the specified
3174
- // path
3175
- ChainNodePrototype.remove = function(path) {
3176
- var obj, tuple, key, src, paths;
2905
+ if ('function' === typeof obj.didUnwatchProperty) {
2906
+ obj.didUnwatchProperty(keyName);
2907
+ }
3177
2908
 
3178
- paths = this._paths;
3179
- if (paths[path] > 0) { paths[path]--; }
2909
+ if (MANDATORY_SETTER && keyName in obj) {
2910
+ o_defineProperty(obj, keyName, {
2911
+ configurable: true,
2912
+ enumerable: true,
2913
+ writable: true,
2914
+ value: m.values[keyName]
2915
+ });
2916
+ delete m.values[keyName];
2917
+ }
2918
+ } else {
2919
+ chainsFor(obj).remove(keyName);
2920
+ }
3180
2921
 
3181
- obj = this.value();
3182
- tuple = normalizeTuple(obj, path);
3183
- if (tuple[0] === obj) {
3184
- path = tuple[1];
3185
- key = firstKey(path);
3186
- path = path.slice(key.length+1);
3187
- } else {
3188
- src = tuple[0];
3189
- key = path.slice(0, 0-(tuple[1].length+1));
3190
- path = tuple[1];
2922
+ } else if (watching[keyName]>1) {
2923
+ watching[keyName]--;
3191
2924
  }
3192
2925
 
3193
- tuple.length = 0;
3194
- this.unchain(key, path);
2926
+ return this;
3195
2927
  };
3196
2928
 
3197
- ChainNodePrototype.count = 0;
3198
-
3199
- ChainNodePrototype.chain = function(key, path, src) {
3200
- var chains = this._chains, node;
3201
- if (!chains) { chains = this._chains = {}; }
3202
-
3203
- node = chains[key];
3204
- if (!node) { node = chains[key] = new ChainNode(this, key, src); }
3205
- node.count++; // count chains...
2929
+ /**
2930
+ @private
3206
2931
 
3207
- // chain rest of path if there is one
3208
- if (path && path.length>0) {
3209
- key = firstKey(path);
3210
- path = path.slice(key.length+1);
3211
- node.chain(key, path); // NOTE: no src means it will observe changes...
3212
- }
3213
- };
2932
+ Call on an object when you first beget it from another object. This will
2933
+ setup any chained watchers on the object instance as needed. This method is
2934
+ safe to call multiple times.
3214
2935
 
3215
- ChainNodePrototype.unchain = function(key, path) {
3216
- var chains = this._chains, node = chains[key];
2936
+ @method rewatch
2937
+ @for Ember
2938
+ @param obj
2939
+ */
2940
+ Ember.rewatch = function(obj) {
2941
+ var m = metaFor(obj, false), chains = m.chains;
3217
2942
 
3218
- // unchain rest of path first...
3219
- if (path && path.length>1) {
3220
- key = firstKey(path);
3221
- path = path.slice(key.length+1);
3222
- node.unchain(key, path);
2943
+ // make sure the object has its own guid.
2944
+ if (GUID_KEY in obj && !obj.hasOwnProperty(GUID_KEY)) {
2945
+ Ember.generateGuid(obj, 'ember');
3223
2946
  }
3224
2947
 
3225
- // delete node if needed.
3226
- node.count--;
3227
- if (node.count<=0) {
3228
- delete chains[node._key];
3229
- node.destroy();
2948
+ // make sure any chained watchers update.
2949
+ if (chains && chains.value() !== obj) {
2950
+ m.chains = chains.copy(obj);
3230
2951
  }
3231
2952
 
3232
- };
3233
-
3234
- ChainNodePrototype.willChange = function() {
3235
- var chains = this._chains;
3236
- if (chains) {
3237
- for(var key in chains) {
3238
- if (!chains.hasOwnProperty(key)) { continue; }
3239
- chains[key].willChange();
3240
- }
3241
- }
3242
-
3243
- if (this._parent) { this._parent.chainWillChange(this, this._key, 1); }
3244
- };
3245
-
3246
- ChainNodePrototype.chainWillChange = function(chain, path, depth) {
3247
- if (this._key) { path = this._key + '.' + path; }
3248
-
3249
- if (this._parent) {
3250
- this._parent.chainWillChange(this, path, depth+1);
3251
- } else {
3252
- if (depth > 1) { propertyWillChange(this.value(), path); }
3253
- path = 'this.' + path;
3254
- if (this._paths[path] > 0) { propertyWillChange(this.value(), path); }
3255
- }
3256
- };
3257
-
3258
- ChainNodePrototype.chainDidChange = function(chain, path, depth) {
3259
- if (this._key) { path = this._key + '.' + path; }
3260
- if (this._parent) {
3261
- this._parent.chainDidChange(this, path, depth+1);
3262
- } else {
3263
- if (depth > 1) { propertyDidChange(this.value(), path); }
3264
- path = 'this.' + path;
3265
- if (this._paths[path] > 0) { propertyDidChange(this.value(), path); }
3266
- }
3267
- };
3268
-
3269
- ChainNodePrototype.didChange = function(suppressEvent) {
3270
- // invalidate my own value first.
3271
- if (this._watching) {
3272
- var obj = this._parent.value();
3273
- if (obj !== this._object) {
3274
- removeChainWatcher(this._object, this._key, this);
3275
- this._object = obj;
3276
- addChainWatcher(obj, this._key, this);
3277
- }
3278
- this._value = undefined;
3279
-
3280
- // Special-case: the EachProxy relies on immediate evaluation to
3281
- // establish its observers.
3282
- if (this._parent && this._parent._key === '@each')
3283
- this.value();
3284
- }
3285
-
3286
- // then notify chains...
3287
- var chains = this._chains;
3288
- if (chains) {
3289
- for(var key in chains) {
3290
- if (!chains.hasOwnProperty(key)) { continue; }
3291
- chains[key].didChange(suppressEvent);
3292
- }
3293
- }
3294
-
3295
- if (suppressEvent) { return; }
3296
-
3297
- // and finally tell parent about my path changing...
3298
- if (this._parent) { this._parent.chainDidChange(this, this._key, 1); }
2953
+ return this;
3299
2954
  };
3300
2955
 
3301
2956
  Ember.finishChains = function(obj) {
@@ -3307,145 +2962,75 @@ Ember.finishChains = function(obj) {
3307
2962
  chains.didChange(true);
3308
2963
  }
3309
2964
  };
3310
- })();
3311
-
3312
-
3313
-
3314
- (function() {
3315
- var metaFor = Ember.meta, // utils.js
3316
- typeOf = Ember.typeOf, // utils.js
3317
- ChainNode = Ember._ChainNode; // chains.js
3318
-
3319
- // get the chains for the current object. If the current object has
3320
- // chains inherited from the proto they will be cloned and reconfigured for
3321
- // the current object.
3322
- function chainsFor(obj) {
3323
- var m = metaFor(obj), ret = m.chains;
3324
- if (!ret) {
3325
- ret = m.chains = new ChainNode(null, null, obj);
3326
- } else if (ret.value() !== obj) {
3327
- ret = m.chains = ret.copy(obj);
3328
- }
3329
- return ret;
3330
- }
3331
-
3332
- Ember.watchPath = function(obj, keyPath) {
3333
- // can't watch length on Array - it is special...
3334
- if (keyPath === 'length' && typeOf(obj) === 'array') { return; }
3335
-
3336
- var m = metaFor(obj), watching = m.watching;
3337
-
3338
- if (!watching[keyPath]) { // activate watching first time
3339
- watching[keyPath] = 1;
3340
- chainsFor(obj).add(keyPath);
3341
- } else {
3342
- watching[keyPath] = (watching[keyPath] || 0) + 1;
3343
- }
3344
- };
3345
2965
 
3346
- Ember.unwatchPath = function(obj, keyPath) {
3347
- var m = metaFor(obj), watching = m.watching, desc;
3348
-
3349
- if (watching[keyPath] === 1) {
3350
- watching[keyPath] = 0;
3351
- chainsFor(obj).remove(keyPath);
3352
- } else if (watching[keyPath] > 1) {
3353
- watching[keyPath]--;
3354
- }
3355
- };
3356
- })();
3357
-
3358
-
3359
-
3360
- (function() {
3361
- /**
3362
- @module ember-metal
3363
- */
3364
-
3365
- var metaFor = Ember.meta, // utils.js
3366
- GUID_KEY = Ember.GUID_KEY, // utils.js
3367
- META_KEY = Ember.META_KEY, // utils.js
3368
- removeChainWatcher = Ember.removeChainWatcher,
3369
- watchKey = Ember.watchKey, // watch_key.js
3370
- unwatchKey = Ember.unwatchKey,
3371
- watchPath = Ember.watchPath, // watch_path.js
3372
- unwatchPath = Ember.unwatchPath,
3373
- typeOf = Ember.typeOf, // utils.js
3374
- generateGuid = Ember.generateGuid,
3375
- IS_PATH = /[\.\*]/;
3376
-
3377
- // returns true if the passed path is just a keyName
3378
- function isKeyName(path) {
3379
- return path==='*' || !IS_PATH.test(path);
3380
- }
2966
+ // ..........................................................
2967
+ // PROPERTY CHANGES
2968
+ //
3381
2969
 
3382
2970
  /**
3383
- @private
2971
+ This function is called just before an object property is about to change.
2972
+ It will notify any before observers and prepare caches among other things.
3384
2973
 
3385
- Starts watching a property on an object. Whenever the property changes,
3386
- invokes `Ember.propertyWillChange` and `Ember.propertyDidChange`. This is the
3387
- primitive used by observers and dependent keys; usually you will never call
3388
- this method directly but instead use higher level methods like
3389
- `Ember.addObserver()`
2974
+ Normally you will not need to call this method directly but if for some
2975
+ reason you can't directly watch a property you can invoke this method
2976
+ manually along with `Ember.propertyDidChange()` which you should call just
2977
+ after the property value changes.
3390
2978
 
3391
- @method watch
2979
+ @method propertyWillChange
3392
2980
  @for Ember
3393
- @param obj
3394
- @param {String} keyName
2981
+ @param {Object} obj The object with the property that will change
2982
+ @param {String} keyName The property key (or path) that will change.
2983
+ @return {void}
3395
2984
  */
3396
- Ember.watch = function(obj, keyPath) {
3397
- // can't watch length on Array - it is special...
3398
- if (keyPath === 'length' && typeOf(obj) === 'array') { return; }
3399
-
3400
- if (isKeyName(keyPath)) {
3401
- watchKey(obj, keyPath);
3402
- } else {
3403
- watchPath(obj, keyPath);
3404
- }
3405
- };
3406
-
3407
- Ember.isWatching = function isWatching(obj, key) {
3408
- var meta = obj[META_KEY];
3409
- return (meta && meta.watching[key]) > 0;
3410
- };
3411
-
3412
- Ember.watch.flushPending = Ember.flushPendingChains;
2985
+ function propertyWillChange(obj, keyName) {
2986
+ var m = metaFor(obj, false),
2987
+ watching = m.watching[keyName] > 0 || keyName === 'length',
2988
+ proto = m.proto,
2989
+ desc = m.descs[keyName];
3413
2990
 
3414
- Ember.unwatch = function(obj, keyPath) {
3415
- // can't watch length on Array - it is special...
3416
- if (keyPath === 'length' && typeOf(obj) === 'array') { return; }
2991
+ if (!watching) { return; }
2992
+ if (proto === obj) { return; }
2993
+ if (desc && desc.willChange) { desc.willChange(obj, keyName); }
2994
+ dependentKeysWillChange(obj, keyName, m);
2995
+ chainsWillChange(obj, keyName, m);
2996
+ Ember.notifyBeforeObservers(obj, keyName);
2997
+ }
3417
2998
 
3418
- if (isKeyName(keyPath)) {
3419
- unwatchKey(obj, keyPath);
3420
- } else {
3421
- unwatchPath(obj, keyPath);
3422
- }
3423
- };
2999
+ Ember.propertyWillChange = propertyWillChange;
3424
3000
 
3425
3001
  /**
3426
- @private
3002
+ This function is called just after an object property has changed.
3003
+ It will notify any observers and clear caches among other things.
3427
3004
 
3428
- Call on an object when you first beget it from another object. This will
3429
- setup any chained watchers on the object instance as needed. This method is
3430
- safe to call multiple times.
3005
+ Normally you will not need to call this method directly but if for some
3006
+ reason you can't directly watch a property you can invoke this method
3007
+ manually along with `Ember.propertyWilLChange()` which you should call just
3008
+ before the property value changes.
3431
3009
 
3432
- @method rewatch
3010
+ @method propertyDidChange
3433
3011
  @for Ember
3434
- @param obj
3012
+ @param {Object} obj The object with the property that will change
3013
+ @param {String} keyName The property key (or path) that will change.
3014
+ @return {void}
3435
3015
  */
3436
- Ember.rewatch = function(obj) {
3437
- var m = metaFor(obj, false), chains = m.chains;
3016
+ function propertyDidChange(obj, keyName) {
3017
+ var m = metaFor(obj, false),
3018
+ watching = m.watching[keyName] > 0 || keyName === 'length',
3019
+ proto = m.proto,
3020
+ desc = m.descs[keyName];
3438
3021
 
3439
- // make sure the object has its own guid.
3440
- if (GUID_KEY in obj && !obj.hasOwnProperty(GUID_KEY)) {
3441
- generateGuid(obj, 'ember');
3442
- }
3022
+ if (proto === obj) { return; }
3443
3023
 
3444
- // make sure any chained watchers update.
3445
- if (chains && chains.value() !== obj) {
3446
- m.chains = chains.copy(obj);
3447
- }
3448
- };
3024
+ // shouldn't this mean that we're watching this key?
3025
+ if (desc && desc.didChange) { desc.didChange(obj, keyName); }
3026
+ if (!watching && keyName !== 'length') { return; }
3027
+
3028
+ dependentKeysDidChange(obj, keyName, m);
3029
+ chainsDidChange(obj, keyName, m);
3030
+ Ember.notifyObservers(obj, keyName);
3031
+ }
3032
+
3033
+ Ember.propertyDidChange = propertyDidChange;
3449
3034
 
3450
3035
  var NODE_STACK = [];
3451
3036
 
@@ -3923,7 +3508,7 @@ Ember.computed = function(func) {
3923
3508
  @param {Object} obj the object whose property you want to check
3924
3509
  @param {String} key the name of the property whose cached value you want
3925
3510
  to return
3926
- @return {*} the cached value
3511
+ @return {any} the cached value
3927
3512
  */
3928
3513
  Ember.cacheFor = function cacheFor(obj, key) {
3929
3514
  var cache = metaFor(obj, false).cache;
@@ -4198,108 +3783,382 @@ Ember.computed.defaultTo = function(defaultPath) {
4198
3783
 
4199
3784
 
4200
3785
 
4201
- (function() {
4202
- // Ember.tryFinally
3786
+ (function() {
3787
+ /**
3788
+ @module ember-metal
3789
+ */
3790
+
3791
+ var o_create = Ember.create,
3792
+ metaFor = Ember.meta,
3793
+ META_KEY = Ember.META_KEY;
3794
+
3795
+ /*
3796
+ The event system uses a series of nested hashes to store listeners on an
3797
+ object. When a listener is registered, or when an event arrives, these
3798
+ hashes are consulted to determine which target and action pair to invoke.
3799
+
3800
+ The hashes are stored in the object's meta hash, and look like this:
3801
+
3802
+ // Object's meta hash
3803
+ {
3804
+ listeners: { // variable name: `listenerSet`
3805
+ "foo:changed": [ // variable name: `actions`
3806
+ [target, method, onceFlag, suspendedFlag]
3807
+ ]
3808
+ }
3809
+ }
3810
+
3811
+ */
3812
+
3813
+ function indexOf(array, target, method) {
3814
+ var index = -1;
3815
+ for (var i = 0, l = array.length; i < l; i++) {
3816
+ if (target === array[i][0] && method === array[i][1]) { index = i; break; }
3817
+ }
3818
+ return index;
3819
+ }
3820
+
3821
+ function actionsFor(obj, eventName) {
3822
+ var meta = metaFor(obj, true),
3823
+ actions;
3824
+
3825
+ if (!meta.listeners) { meta.listeners = {}; }
3826
+
3827
+ if (!meta.hasOwnProperty('listeners')) {
3828
+ // setup inherited copy of the listeners object
3829
+ meta.listeners = o_create(meta.listeners);
3830
+ }
3831
+
3832
+ actions = meta.listeners[eventName];
3833
+
3834
+ // if there are actions, but the eventName doesn't exist in our listeners, then copy them from the prototype
3835
+ if (actions && !meta.listeners.hasOwnProperty(eventName)) {
3836
+ actions = meta.listeners[eventName] = meta.listeners[eventName].slice();
3837
+ } else if (!actions) {
3838
+ actions = meta.listeners[eventName] = [];
3839
+ }
3840
+
3841
+ return actions;
3842
+ }
3843
+
3844
+ function actionsUnion(obj, eventName, otherActions) {
3845
+ var meta = obj[META_KEY],
3846
+ actions = meta && meta.listeners && meta.listeners[eventName];
3847
+
3848
+ if (!actions) { return; }
3849
+ for (var i = actions.length - 1; i >= 0; i--) {
3850
+ var target = actions[i][0],
3851
+ method = actions[i][1],
3852
+ once = actions[i][2],
3853
+ suspended = actions[i][3],
3854
+ actionIndex = indexOf(otherActions, target, method);
3855
+
3856
+ if (actionIndex === -1) {
3857
+ otherActions.push([target, method, once, suspended]);
3858
+ }
3859
+ }
3860
+ }
3861
+
3862
+ function actionsDiff(obj, eventName, otherActions) {
3863
+ var meta = obj[META_KEY],
3864
+ actions = meta && meta.listeners && meta.listeners[eventName],
3865
+ diffActions = [];
3866
+
3867
+ if (!actions) { return; }
3868
+ for (var i = actions.length - 1; i >= 0; i--) {
3869
+ var target = actions[i][0],
3870
+ method = actions[i][1],
3871
+ once = actions[i][2],
3872
+ suspended = actions[i][3],
3873
+ actionIndex = indexOf(otherActions, target, method);
3874
+
3875
+ if (actionIndex !== -1) { continue; }
3876
+
3877
+ otherActions.push([target, method, once, suspended]);
3878
+ diffActions.push([target, method, once, suspended]);
3879
+ }
3880
+
3881
+ return diffActions;
3882
+ }
3883
+
3884
+ /**
3885
+ Add an event listener
3886
+
3887
+ @method addListener
3888
+ @for Ember
3889
+ @param obj
3890
+ @param {String} eventName
3891
+ @param {Object|Function} targetOrMethod A target object or a function
3892
+ @param {Function|String} method A function or the name of a function to be called on `target`
3893
+ @param {Boolean} once A flag whether a function should only be called once
3894
+ */
3895
+ function addListener(obj, eventName, target, method, once) {
3896
+
3897
+
3898
+ if (!method && 'function' === typeof target) {
3899
+ method = target;
3900
+ target = null;
3901
+ }
3902
+
3903
+ var actions = actionsFor(obj, eventName),
3904
+ actionIndex = indexOf(actions, target, method);
3905
+
3906
+ if (actionIndex !== -1) { return; }
3907
+
3908
+ actions.push([target, method, once, undefined]);
3909
+
3910
+ if ('function' === typeof obj.didAddListener) {
3911
+ obj.didAddListener(eventName, target, method);
3912
+ }
3913
+ }
3914
+
3915
+ /**
3916
+ Remove an event listener
3917
+
3918
+ Arguments should match those passed to {{#crossLink "Ember/addListener"}}{{/crossLink}}
3919
+
3920
+ @method removeListener
3921
+ @for Ember
3922
+ @param obj
3923
+ @param {String} eventName
3924
+ @param {Object|Function} targetOrMethod A target object or a function
3925
+ @param {Function|String} method A function or the name of a function to be called on `target`
3926
+ */
3927
+ function removeListener(obj, eventName, target, method) {
3928
+
3929
+
3930
+ if (!method && 'function' === typeof target) {
3931
+ method = target;
3932
+ target = null;
3933
+ }
3934
+
3935
+ function _removeListener(target, method, once) {
3936
+ var actions = actionsFor(obj, eventName),
3937
+ actionIndex = indexOf(actions, target, method);
3938
+
3939
+ // action doesn't exist, give up silently
3940
+ if (actionIndex === -1) { return; }
3941
+
3942
+ actions.splice(actionIndex, 1);
3943
+
3944
+ if ('function' === typeof obj.didRemoveListener) {
3945
+ obj.didRemoveListener(eventName, target, method);
3946
+ }
3947
+ }
3948
+
3949
+ if (method) {
3950
+ _removeListener(target, method);
3951
+ } else {
3952
+ var meta = obj[META_KEY],
3953
+ actions = meta && meta.listeners && meta.listeners[eventName];
3954
+
3955
+ if (!actions) { return; }
3956
+ for (var i = actions.length - 1; i >= 0; i--) {
3957
+ _removeListener(actions[i][0], actions[i][1]);
3958
+ }
3959
+ }
3960
+ }
3961
+
3962
+ /**
3963
+ @private
3964
+
3965
+ Suspend listener during callback.
3966
+
3967
+ This should only be used by the target of the event listener
3968
+ when it is taking an action that would cause the event, e.g.
3969
+ an object might suspend its property change listener while it is
3970
+ setting that property.
3971
+
3972
+ @method suspendListener
3973
+ @for Ember
3974
+ @param obj
3975
+ @param {String} eventName
3976
+ @param {Object|Function} targetOrMethod A target object or a function
3977
+ @param {Function|String} method A function or the name of a function to be called on `target`
3978
+ @param {Function} callback
3979
+ */
3980
+ function suspendListener(obj, eventName, target, method, callback) {
3981
+ if (!method && 'function' === typeof target) {
3982
+ method = target;
3983
+ target = null;
3984
+ }
3985
+
3986
+ var actions = actionsFor(obj, eventName),
3987
+ actionIndex = indexOf(actions, target, method),
3988
+ action;
3989
+
3990
+ if (actionIndex !== -1) {
3991
+ action = actions[actionIndex].slice(); // copy it, otherwise we're modifying a shared object
3992
+ action[3] = true; // mark the action as suspended
3993
+ actions[actionIndex] = action; // replace the shared object with our copy
3994
+ }
3995
+
3996
+ function tryable() { return callback.call(target); }
3997
+ function finalizer() { if (action) { action[3] = undefined; } }
3998
+
3999
+ return Ember.tryFinally(tryable, finalizer);
4000
+ }
4001
+
4002
+ /**
4003
+ @private
4004
+
4005
+ Suspend listener during callback.
4006
+
4007
+ This should only be used by the target of the event listener
4008
+ when it is taking an action that would cause the event, e.g.
4009
+ an object might suspend its property change listener while it is
4010
+ setting that property.
4011
+
4012
+ @method suspendListener
4013
+ @for Ember
4014
+ @param obj
4015
+ @param {Array} eventName Array of event names
4016
+ @param {Object|Function} targetOrMethod A target object or a function
4017
+ @param {Function|String} method A function or the name of a function to be called on `target`
4018
+ @param {Function} callback
4019
+ */
4020
+ function suspendListeners(obj, eventNames, target, method, callback) {
4021
+ if (!method && 'function' === typeof target) {
4022
+ method = target;
4023
+ target = null;
4024
+ }
4025
+
4026
+ var suspendedActions = [],
4027
+ eventName, actions, action, i, l;
4028
+
4029
+ for (i=0, l=eventNames.length; i<l; i++) {
4030
+ eventName = eventNames[i];
4031
+ actions = actionsFor(obj, eventName);
4032
+ var actionIndex = indexOf(actions, target, method);
4033
+
4034
+ if (actionIndex !== -1) {
4035
+ action = actions[actionIndex].slice();
4036
+ action[3] = true;
4037
+ actions[actionIndex] = action;
4038
+ suspendedActions.push(action);
4039
+ }
4040
+ }
4041
+
4042
+ function tryable() { return callback.call(target); }
4043
+
4044
+ function finalizer() {
4045
+ for (i = 0, l = suspendedActions.length; i < l; i++) {
4046
+ suspendedActions[i][3] = undefined;
4047
+ }
4048
+ }
4049
+
4050
+ return Ember.tryFinally(tryable, finalizer);
4051
+ }
4052
+
4053
+ /**
4054
+ @private
4055
+
4056
+ Return a list of currently watched events
4057
+
4058
+ @method watchedEvents
4059
+ @for Ember
4060
+ @param obj
4061
+ */
4062
+ function watchedEvents(obj) {
4063
+ var listeners = obj[META_KEY].listeners, ret = [];
4064
+
4065
+ if (listeners) {
4066
+ for(var eventName in listeners) {
4067
+ if (listeners[eventName]) { ret.push(eventName); }
4068
+ }
4069
+ }
4070
+ return ret;
4071
+ }
4072
+
4203
4073
  /**
4204
- @module ember-metal
4074
+ @method sendEvent
4075
+ @for Ember
4076
+ @param obj
4077
+ @param {String} eventName
4078
+ @param {Array} params
4079
+ @param {Array} actions
4080
+ @return true
4205
4081
  */
4082
+ function sendEvent(obj, eventName, params, actions) {
4083
+ // first give object a chance to handle it
4084
+ if (obj !== Ember && 'function' === typeof obj.sendEvent) {
4085
+ obj.sendEvent(eventName, params);
4086
+ }
4206
4087
 
4207
- var AFTER_OBSERVERS = ':change';
4208
- var BEFORE_OBSERVERS = ':before';
4088
+ if (!actions) {
4089
+ var meta = obj[META_KEY];
4090
+ actions = meta && meta.listeners && meta.listeners[eventName];
4091
+ }
4209
4092
 
4210
- var guidFor = Ember.guidFor;
4093
+ if (!actions) { return; }
4211
4094
 
4212
- function changeEvent(keyName) {
4213
- return keyName+AFTER_OBSERVERS;
4214
- }
4095
+ for (var i = actions.length - 1; i >= 0; i--) { // looping in reverse for once listeners
4096
+ if (!actions[i] || actions[i][3] === true) { continue; }
4215
4097
 
4216
- function beforeEvent(keyName) {
4217
- return keyName+BEFORE_OBSERVERS;
4098
+ var target = actions[i][0],
4099
+ method = actions[i][1],
4100
+ once = actions[i][2];
4101
+
4102
+ if (once) { removeListener(obj, eventName, target, method); }
4103
+ if (!target) { target = obj; }
4104
+ if ('string' === typeof method) { method = target[method]; }
4105
+ if (params) {
4106
+ method.apply(target, params);
4107
+ } else {
4108
+ method.call(target);
4109
+ }
4110
+ }
4111
+ return true;
4218
4112
  }
4219
4113
 
4220
4114
  /**
4221
- @method addObserver
4115
+ @private
4116
+ @method hasListeners
4117
+ @for Ember
4222
4118
  @param obj
4223
- @param {String} path
4224
- @param {Object|Function} targetOrMethod
4225
- @param {Function|String} [method]
4119
+ @param {String} eventName
4226
4120
  */
4227
- Ember.addObserver = function(obj, path, target, method) {
4228
- Ember.addListener(obj, changeEvent(path), target, method);
4229
- Ember.watch(obj, path);
4230
- return this;
4231
- };
4232
-
4233
- Ember.observersFor = function(obj, path) {
4234
- return Ember.listenersFor(obj, changeEvent(path));
4235
- };
4121
+ function hasListeners(obj, eventName) {
4122
+ var meta = obj[META_KEY],
4123
+ actions = meta && meta.listeners && meta.listeners[eventName];
4236
4124
 
4237
- /**
4238
- @method removeObserver
4239
- @param obj
4240
- @param {String} path
4241
- @param {Object|Function} targetOrMethod
4242
- @param {Function|String} [method]
4243
- */
4244
- Ember.removeObserver = function(obj, path, target, method) {
4245
- Ember.unwatch(obj, path);
4246
- Ember.removeListener(obj, changeEvent(path), target, method);
4247
- return this;
4248
- };
4125
+ return !!(actions && actions.length);
4126
+ }
4249
4127
 
4250
4128
  /**
4251
- @method addBeforeObserver
4129
+ @private
4130
+ @method listenersFor
4131
+ @for Ember
4252
4132
  @param obj
4253
- @param {String} path
4254
- @param {Object|Function} targetOrMethod
4255
- @param {Function|String} [method]
4133
+ @param {String} eventName
4256
4134
  */
4257
- Ember.addBeforeObserver = function(obj, path, target, method) {
4258
- Ember.addListener(obj, beforeEvent(path), target, method);
4259
- Ember.watch(obj, path);
4260
- return this;
4261
- };
4262
-
4263
- // Suspend observer during callback.
4264
- //
4265
- // This should only be used by the target of the observer
4266
- // while it is setting the observed path.
4267
- Ember._suspendBeforeObserver = function(obj, path, target, method, callback) {
4268
- return Ember._suspendListener(obj, beforeEvent(path), target, method, callback);
4269
- };
4270
-
4271
- Ember._suspendObserver = function(obj, path, target, method, callback) {
4272
- return Ember._suspendListener(obj, changeEvent(path), target, method, callback);
4273
- };
4135
+ function listenersFor(obj, eventName) {
4136
+ var ret = [];
4137
+ var meta = obj[META_KEY],
4138
+ actions = meta && meta.listeners && meta.listeners[eventName];
4274
4139
 
4275
- var map = Ember.ArrayPolyfills.map;
4140
+ if (!actions) { return ret; }
4276
4141
 
4277
- Ember._suspendBeforeObservers = function(obj, paths, target, method, callback) {
4278
- var events = map.call(paths, beforeEvent);
4279
- return Ember._suspendListeners(obj, events, target, method, callback);
4280
- };
4142
+ for (var i = 0, l = actions.length; i < l; i++) {
4143
+ var target = actions[i][0],
4144
+ method = actions[i][1];
4145
+ ret.push([target, method]);
4146
+ }
4281
4147
 
4282
- Ember._suspendObservers = function(obj, paths, target, method, callback) {
4283
- var events = map.call(paths, changeEvent);
4284
- return Ember._suspendListeners(obj, events, target, method, callback);
4285
- };
4148
+ return ret;
4149
+ }
4286
4150
 
4287
- Ember.beforeObserversFor = function(obj, path) {
4288
- return Ember.listenersFor(obj, beforeEvent(path));
4289
- };
4151
+ Ember.addListener = addListener;
4152
+ Ember.removeListener = removeListener;
4153
+ Ember._suspendListener = suspendListener;
4154
+ Ember._suspendListeners = suspendListeners;
4155
+ Ember.sendEvent = sendEvent;
4156
+ Ember.hasListeners = hasListeners;
4157
+ Ember.watchedEvents = watchedEvents;
4158
+ Ember.listenersFor = listenersFor;
4159
+ Ember.listenersDiff = actionsDiff;
4160
+ Ember.listenersUnion = actionsUnion;
4290
4161
 
4291
- /**
4292
- @method removeBeforeObserver
4293
- @param obj
4294
- @param {String} path
4295
- @param {Object|Function} targetOrMethod
4296
- @param {Function|String} [method]
4297
- */
4298
- Ember.removeBeforeObserver = function(obj, path, target, method) {
4299
- Ember.unwatch(obj, path);
4300
- Ember.removeListener(obj, beforeEvent(path), target, method);
4301
- return this;
4302
- };
4303
4162
  })();
4304
4163
 
4305
4164
 
@@ -4971,9 +4830,8 @@ Ember.run.cancel = function(timer) {
4971
4830
 
4972
4831
  (function() {
4973
4832
  // Ember.Logger
4974
- // get
4975
- // set
4976
- // guidFor, meta
4833
+ // get, set, trySet
4834
+ // guidFor, isArray, meta
4977
4835
  // addObserver, removeObserver
4978
4836
  // Ember.run.schedule
4979
4837
  /**
@@ -4999,21 +4857,8 @@ Ember.LOG_BINDINGS = false || !!Ember.ENV.LOG_BINDINGS;
4999
4857
  var get = Ember.get,
5000
4858
  set = Ember.set,
5001
4859
  guidFor = Ember.guidFor,
5002
- IS_GLOBAL = /^([A-Z$]|([0-9][A-Z$]))/;
5003
-
5004
- /**
5005
- Returns true if the provided path is global (e.g., `MyApp.fooController.bar`)
5006
- instead of local (`foo.bar.baz`).
4860
+ isGlobalPath = Ember.isGlobalPath;
5007
4861
 
5008
- @method isGlobalPath
5009
- @for Ember
5010
- @private
5011
- @param {String} path
5012
- @return Boolean
5013
- */
5014
- var isGlobalPath = Ember.isGlobalPath = function(path) {
5015
- return IS_GLOBAL.test(path);
5016
- };
5017
4862
 
5018
4863
  function getWithGlobals(obj, path) {
5019
4864
  return get(isGlobalPath(path) ? Ember.lookup : obj, path);
@@ -5605,7 +5450,7 @@ function addNormalizedProperty(base, key, value, meta, descs, values, concats) {
5605
5450
  }
5606
5451
  }
5607
5452
 
5608
- function mergeMixins(mixins, m, descs, values, base, keys) {
5453
+ function mergeMixins(mixins, m, descs, values, base) {
5609
5454
  var mixin, props, key, concats, meta;
5610
5455
 
5611
5456
  function removeKeys(keyName) {
@@ -5626,14 +5471,13 @@ function mergeMixins(mixins, m, descs, values, base, keys) {
5626
5471
 
5627
5472
  for (key in props) {
5628
5473
  if (!props.hasOwnProperty(key)) { continue; }
5629
- keys.push(key);
5630
5474
  addNormalizedProperty(base, key, props[key], meta, descs, values, concats);
5631
5475
  }
5632
5476
 
5633
5477
  // manually copy toString() because some JS engines do not enumerate it
5634
5478
  if (props.hasOwnProperty('toString')) { base.toString = props.toString; }
5635
5479
  } else if (mixin.mixins) {
5636
- mergeMixins(mixin.mixins, m, descs, values, base, keys);
5480
+ mergeMixins(mixin.mixins, m, descs, values, base);
5637
5481
  if (mixin._without) { a_forEach.call(mixin._without, removeKeys); }
5638
5482
  }
5639
5483
  }
@@ -5729,7 +5573,7 @@ function replaceObservers(obj, key, observer) {
5729
5573
 
5730
5574
  function applyMixin(obj, mixins, partial) {
5731
5575
  var descs = {}, values = {}, m = Ember.meta(obj),
5732
- key, value, desc, keys = [];
5576
+ key, value, desc;
5733
5577
 
5734
5578
  // Go through all mixins and hashes passed in, and:
5735
5579
  //
@@ -5737,11 +5581,10 @@ function applyMixin(obj, mixins, partial) {
5737
5581
  // * Set up _super wrapping if necessary
5738
5582
  // * Set up computed property descriptors
5739
5583
  // * Copying `toString` in broken browsers
5740
- mergeMixins(mixins, mixinsMeta(obj), descs, values, obj, keys);
5584
+ mergeMixins(mixins, mixinsMeta(obj), descs, values, obj);
5741
5585
 
5742
- for(var i = 0, l = keys.length; i < l; i++) {
5743
- key = keys[i];
5744
- if (key === 'constructor' || !values.hasOwnProperty(key)) { continue; }
5586
+ for(key in values) {
5587
+ if (key === 'contructor' || !values.hasOwnProperty(key)) { continue; }
5745
5588
 
5746
5589
  desc = descs[key];
5747
5590
  value = values[key];
@@ -5795,7 +5638,7 @@ Ember.mixin = function(obj) {
5795
5638
  });
5796
5639
 
5797
5640
  // Mix mixins into classes by passing them as the first arguments to
5798
- // .extend.
5641
+ // .extend or .create.
5799
5642
  App.CommentView = Ember.View.extend(App.Editable, {
5800
5643
  template: Ember.Handlebars.compile('{{#if isEditing}}...{{else}}...{{/if}}')
5801
5644
  });
@@ -5814,12 +5657,6 @@ Ember.Mixin = function() { return initMixin(this, arguments); };
5814
5657
 
5815
5658
  Mixin = Ember.Mixin;
5816
5659
 
5817
- Mixin.prototype = {
5818
- properties: null,
5819
- mixins: null,
5820
- ownerConstructor: null
5821
- };
5822
-
5823
5660
  Mixin._apply = applyMixin;
5824
5661
 
5825
5662
  Mixin.applyPartial = function(obj) {
@@ -6710,6 +6547,79 @@ define("container",
6710
6547
 
6711
6548
  var indexOf = Ember.EnumerableUtils.indexOf;
6712
6549
 
6550
+ // ........................................
6551
+ // TYPING & ARRAY MESSAGING
6552
+ //
6553
+
6554
+ var TYPE_MAP = {};
6555
+ var t = "Boolean Number String Function Array Date RegExp Object".split(" ");
6556
+ Ember.ArrayPolyfills.forEach.call(t, function(name) {
6557
+ TYPE_MAP[ "[object " + name + "]" ] = name.toLowerCase();
6558
+ });
6559
+
6560
+ var toString = Object.prototype.toString;
6561
+
6562
+ /**
6563
+ Returns a consistent type for the passed item.
6564
+
6565
+ Use this instead of the built-in `typeof` to get the type of an item.
6566
+ It will return the same result across all browsers and includes a bit
6567
+ more detail. Here is what will be returned:
6568
+
6569
+ | Return Value | Meaning |
6570
+ |---------------|------------------------------------------------------|
6571
+ | 'string' | String primitive |
6572
+ | 'number' | Number primitive |
6573
+ | 'boolean' | Boolean primitive |
6574
+ | 'null' | Null value |
6575
+ | 'undefined' | Undefined value |
6576
+ | 'function' | A function |
6577
+ | 'array' | An instance of Array |
6578
+ | 'class' | An Ember class (created using Ember.Object.extend()) |
6579
+ | 'instance' | An Ember object instance |
6580
+ | 'error' | An instance of the Error object |
6581
+ | 'object' | A JavaScript object not inheriting from Ember.Object |
6582
+
6583
+ Examples:
6584
+
6585
+ ```javascript
6586
+ Ember.typeOf(); // 'undefined'
6587
+ Ember.typeOf(null); // 'null'
6588
+ Ember.typeOf(undefined); // 'undefined'
6589
+ Ember.typeOf('michael'); // 'string'
6590
+ Ember.typeOf(101); // 'number'
6591
+ Ember.typeOf(true); // 'boolean'
6592
+ Ember.typeOf(Ember.makeArray); // 'function'
6593
+ Ember.typeOf([1,2,90]); // 'array'
6594
+ Ember.typeOf(Ember.Object.extend()); // 'class'
6595
+ Ember.typeOf(Ember.Object.create()); // 'instance'
6596
+ Ember.typeOf(new Error('teamocil')); // 'error'
6597
+
6598
+ // "normal" JavaScript object
6599
+ Ember.typeOf({a: 'b'}); // 'object'
6600
+ ```
6601
+
6602
+ @method typeOf
6603
+ @for Ember
6604
+ @param {Object} item the item to check
6605
+ @return {String} the type
6606
+ */
6607
+ Ember.typeOf = function(item) {
6608
+ var ret;
6609
+
6610
+ ret = (item === null || item === undefined) ? String(item) : TYPE_MAP[toString.call(item)] || 'object';
6611
+
6612
+ if (ret === 'function') {
6613
+ if (Ember.Object && Ember.Object.detect(item)) ret = 'class';
6614
+ } else if (ret === 'object') {
6615
+ if (item instanceof Error) ret = 'error';
6616
+ else if (Ember.Object && item instanceof Ember.Object) ret = 'instance';
6617
+ else ret = 'object';
6618
+ }
6619
+
6620
+ return ret;
6621
+ };
6622
+
6713
6623
  /**
6714
6624
  This will compare two javascript values of possibly different types.
6715
6625
  It will tell you which one is greater than the other by returning:
@@ -8470,7 +8380,7 @@ Ember.Array = Ember.Mixin.create(Ember.Enumerable, /** @scope Ember.Array.protot
8470
8380
 
8471
8381
  @method objectAt
8472
8382
  @param {Number} idx The index of the item to return.
8473
- @return {*} item at index or undefined
8383
+ @return {any} item at index or undefined
8474
8384
  */
8475
8385
  objectAt: function(idx) {
8476
8386
  if ((idx < 0) || (idx>=get(this, 'length'))) return undefined ;
@@ -9279,8 +9189,8 @@ Ember.MutableArray = Ember.Mixin.create(Ember.Array, Ember.MutableEnumerable,
9279
9189
  ```
9280
9190
 
9281
9191
  @method pushObject
9282
- @param {*} obj object to push
9283
- @return {*} the same obj passed as param
9192
+ @param {anything} obj object to push
9193
+ @return {any} the same obj passed as param
9284
9194
  */
9285
9195
  pushObject: function(obj) {
9286
9196
  this.insertAt(get(this, 'length'), obj) ;
@@ -9359,8 +9269,8 @@ Ember.MutableArray = Ember.Mixin.create(Ember.Array, Ember.MutableEnumerable,
9359
9269
  ```
9360
9270
 
9361
9271
  @method unshiftObject
9362
- @param {*} obj object to unshift
9363
- @return {*} the same obj passed as param
9272
+ @param {anything} obj object to unshift
9273
+ @return {any} the same obj passed as param
9364
9274
  */
9365
9275
  unshiftObject: function(obj) {
9366
9276
  this.insertAt(0, obj) ;
@@ -10321,8 +10231,6 @@ function makeCtor() {
10321
10231
 
10322
10232
  for (var i = 0, l = props.length; i < l; i++) {
10323
10233
  var properties = props[i];
10324
-
10325
-
10326
10234
  for (var keyName in properties) {
10327
10235
  if (!properties.hasOwnProperty(keyName)) { continue; }
10328
10236
 
@@ -10443,6 +10351,8 @@ CoreObject.PrototypeMixin = Mixin.create({
10443
10351
  do important setup work, and you'll see strange behavior in your
10444
10352
  application.
10445
10353
 
10354
+ ```
10355
+
10446
10356
  @method init
10447
10357
  */
10448
10358
  init: function() {},
@@ -10553,12 +10463,12 @@ CoreObject.PrototypeMixin = Mixin.create({
10553
10463
  this.isDestroying = true;
10554
10464
  this._didCallDestroy = true;
10555
10465
 
10466
+ if (this.willDestroy) { this.willDestroy(); }
10467
+
10556
10468
  schedule('destroy', this, this._scheduledDestroy);
10557
10469
  return this;
10558
10470
  },
10559
10471
 
10560
- willDestroy: Ember.K,
10561
-
10562
10472
  /**
10563
10473
  @private
10564
10474
 
@@ -10568,9 +10478,9 @@ CoreObject.PrototypeMixin = Mixin.create({
10568
10478
  @method _scheduledDestroy
10569
10479
  */
10570
10480
  _scheduledDestroy: function() {
10571
- if (this.willDestroy) { this.willDestroy(); }
10572
10481
  destroy(this);
10573
- this.isDestroyed = true;
10482
+ set(this, 'isDestroyed', true);
10483
+
10574
10484
  if (this.didDestroy) { this.didDestroy(); }
10575
10485
  },
10576
10486
 
@@ -11603,7 +11513,7 @@ Ember.EachProxy = Ember.Object.extend({
11603
11513
 
11604
11514
  @method unknownProperty
11605
11515
  @param keyName {String}
11606
- @param value {*}
11516
+ @param value {anything}
11607
11517
  */
11608
11518
  unknownProperty: function(keyName, value) {
11609
11519
  var ret;
@@ -12890,8 +12800,8 @@ Ember.ArrayController = Ember.ArrayProxy.extend(Ember.ControllerMixin,
12890
12800
  },
12891
12801
 
12892
12802
  init: function() {
12893
- if (!this.get('content')) { Ember.defineProperty(this, 'content', undefined, Ember.A()); }
12894
12803
  this._super();
12804
+ if (!this.get('content')) { Ember.defineProperty(this, 'content', undefined, Ember.A()); }
12895
12805
  this.set('_subControllers', Ember.A());
12896
12806
  },
12897
12807