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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

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-pre.4-293-ge707ffa
12
- // Last commit: e707ffa (2013-02-23 17:35:13 -0500)
11
+ // Version: v1.0.0-rc.1-188-gb6bb967
12
+ // Last commit: b6bb967 (2013-03-16 18:09:42 -0700)
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.1",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.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.apply(t||this);try{return e.apply(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]}}}(),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.GUID_KEY,t=Ember.META_KEY,n=Ember.EMPTY_META,r=Ember.meta,i=Ember.create,s=Ember.platform.defineProperty,o=Ember.ENV.MANDATORY_SETTER,u=Ember.Descriptor=function(){},a=Ember.MANDATORY_SETTER_FUNCTION=function(e){},f=Ember.DEFAULT_GETTER_FUNCTION=function(e){return function(){var n=this[t];return n&&n.values[e]}};Ember.defineProperty=function(e,t,n,i,u){var l,c,h,p;return u||(u=r(e)),l=u.descs,c=u.descs[t],h=u.watching[t]>0,c instanceof Ember.Descriptor&&c.teardown(e,t),n instanceof Ember.Descriptor?(p=n,l[t]=n,o&&h?s(e,t,{configurable:!0,enumerable:!0,writable:!0,value:undefined}):e[t]=undefined,n.setup(e,t)):(l[t]=undefined,n==null?(p=i,o&&h?(u.values[t]=i,s(e,t,{configurable:!0,enumerable:!0,set:a,get:f(t)})):e[t]=i):(p=n,s(e,t,n))),h&&Ember.overrideChains(e,t,u),e.didDefineProperty&&e.didDefineProperty(e,t,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 p(e){return e.match(f)[0]}function d(e){return e==="*"||!l.test(e)}function v(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 y(e,t,n){if(e.isDestroying)return;var r=m,i=!r;i&&(r=m={}),v(O,e,t,r,n),i&&(m=null)}function b(e,t,n){if(e.isDestroying)return;var r=g,i=!r;i&&(r=g={}),v(M,e,t,r,n),i&&(g=null)}function w(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 E(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 x(){if(S.length===0)return;var e=S;S=[],a.call(e,function(e){e[0].add(e[1])})}function T(e){return t(e,!1).proto===e}function k(e){var n=t(e),r=n.chains;return r?r.value()!==e&&(r=n.chains=r.copy(e)):r=n.chains=new N(null,null,e),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=0,o=i.length;s<o;s++)i[s].willChange(r)}function A(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 O(e,n,r){var i=t(e,!1),s=i.watching[n]>0||n==="length",o=i.proto,u=i.descs[n];if(!s)return;if(o===e)return;u&&u.willChange&&u.willChange(e,n),y(e,n,i),L(e,n,i),Ember.notifyBeforeObservers(e,n)}function M(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;b(e,n,r),A(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.notifyObservers,a=Ember.ArrayPolyfills.forEach,f=/^([^\.\*]+)/,l=/[\.\*]/,c=Ember.ENV.MANDATORY_SETTER,h=Ember.platform.defineProperty,m,g,S=[],N=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&&w(this._object,this._key,this)),this._parent&&this._parent._key==="@each"&&this.value()},C=N.prototype;C.value=function(){if(this._value===undefined&&this._watching){var e=this._parent.value();this._value=e&&!T(e)?n(e,this._key):undefined}return this._value},C.destroy=function(){if(this._watching){var e=this._object;e&&E(e,this._key,this),this._watching=!1}},C.copy=function(e){var t=new N(null,null,e),n=this._paths,r;for(r in n){if(n[r]<=0)continue;t.add(r)}return t},C.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=p(e),e=e.slice(r.length+1);else{if(!n[0]){S.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)},C.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=p(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)},C.count=0,C.chain=function(e,t,n){var r=this._chains,i;r||(r=this._chains={}),i=r[e],i||(i=r[e]=new N(this,e,n)),i.count++,t&&t.length>0&&(e=p(t),t=t.slice(e.length+1),i.chain(e,t))},C.unchain=function(e,t){var n=this._chains,r=n[e];t&&t.length>1&&(e=p(t),t=t.slice(e.length+1),r.unchain(e,t)),r.count--,r.count<=0&&(delete n[r._key],r.destroy())},C.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)},C.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))},C.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))},C.didChange=function(e){if(this._watching){var t=this._parent.value();t!==this._object&&(E(this._object,this._key,this),this._object=t,w(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){A(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,d(n)?(s=r.descs[n],s&&s.willWatch&&s.willWatch(e,n),"function"==typeof e.willWatchProperty&&e.willWatchProperty(n),c&&n in e&&(r.values[n]=e[n],h(e,n,{configurable:!0,enumerable:!0,set:Ember.MANDATORY_SETTER_FUNCTION,get:Ember.DEFAULT_GETTER_FUNCTION(n)}))):k(e).add(n)),this},Ember.isWatching=function(t,n){var r=t[o];return(r&&r.watching[n])>0},Ember.watch.flushPending=x,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,d(n)?(s=r.descs[n],s&&s.didUnwatch&&s.didUnwatch(e,n),"function"==typeof e.didUnwatchProperty&&e.didUnwatchProperty(n),c&&n in e&&(h(e,n,{configurable:!0,enumerable:!0,writable:!0,value:r.values[n]}),delete r.values[n])):k(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=O,Ember.propertyDidChange=M;var _=[];Ember.destroy=function(e){var t=e[o],n,r,i,s;if(t){e[o]=null,n=t.chains;if(n){_.push(n);while(_.length>0){n=_.pop(),r=n._chains;if(r)for(i in r)r.hasOwnProperty(i)&&_.push(r[i]);n._watching&&(s=n._object,s&&E(s,n._key,n))}}}}}(),function(){function f(e,t,n){var r=t[n];return r?t.hasOwnProperty(n)||(r=t[n]=s(r)):r=t[n]={},r}function l(e,t){var n=t.deps;return n?t.hasOwnProperty("deps")||(n=t.deps=s(n)):n=t.deps={},n}function c(e,t,n,r){var i=e._dependentKeys,s,o,a,c,h;if(!i)return;s=l(t,r);for(o=0,a=i.length;o<a;o++)c=i[o],h=f(t,s,c),h[n]=(h[n]||0)+1,u(t,c)}function h(e,t,n,r){var i=e._dependentKeys,s,o,u,c,h;if(!i)return;s=l(t,r);for(o=0,u=i.length;o<u;o++)c=i[o],h=f(t,s,c),h[n]=(h[n]||0)-1,a(t,c)}function p(e,t){this.func=e,this._cacheable=t&&t.cacheable!==undefined?t.cacheable:!0,this._dependentKeys=t&&t.dependentKeys}var e=Ember.get,t=Ember.set,n=Ember.meta,r=Ember.guidFor,i=[].slice,s=Ember.create,o=Ember.META_KEY,u=Ember.watch,a=Ember.unwatch;Ember.ComputedProperty=p,p.prototype=new Ember.Descriptor;var d=p.prototype;d.cacheable=function(e){return this._cacheable=e!==!1,this},d.volatile=function(){return this.cacheable(!1)},d.property=function(){var e=[];for(var t=0,n=arguments.length;t<n;t++)e.push(arguments[t]);return this._dependentKeys=e,this},d.meta=function(e){return arguments.length===0?this._meta||{}:(this._meta=e,this)},d.willWatch=function(e,t){var n=e[o];t in n.cache||c(this,e,t,n)},d.didUnwatch=function(e,t){var n=e[o];t in n.cache||h(this,e,t,n)},d.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]||h(this,e,t,r))}},d.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]||c(this,e,t,s)}else r=this.func.call(e,t);return r},d.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,l=o.cache,h,p;this._suspended=e;try{i&&l.hasOwnProperty(t)&&(h=l[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 l[t],i&&(!u&&!f&&c(this,e,t,o),l[t]=p),u&&Ember.propertyDidChange(e,t)}finally{this._suspended=a}return p},d.setup=function(e,t){var r=e[o];r&&r.watching[t]&&c(this,e,t,n(e))},d.teardown=function(e,t){var r=n(e);return(r.watching[t]||t in r.cache)&&h(this,e,t,r),this._cacheable&&delete r.cache[t],null},Ember.computed=function(e){var t;arguments.length>1&&(t=i.call(arguments,0,-1),e=i.call(arguments,-1)[0]);var n=new p(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]},Ember.computed.not=function(t){return Ember.computed(t,function(n){return!e(this,t)})},Ember.computed.empty=function(t){return Ember.computed(t,function(n){var r=e(this,t);return r===undefined||r===null||r===""||Ember.isArray(r)&&e(r,"length")===0})},Ember.computed.bool=function(t){return Ember.computed(t,function(n){return!!e(this,t)})},Ember.computed.alias=function(n){return Ember.computed(n,function(r,i){return arguments.length===1?e(this,n):(t(this,n,i),i)})}}(),function(){function i(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 s(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 o(e,t,n){var s=e[r],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=i(n,a,f);h===-1&&n.push([a,f,l,c])}}function u(e,t,n){var s=e[r],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=i(n,f,l);if(p!==-1)continue;n.push([f,l,c,h]),u.push([f,l,c,h])}return u}function a(e,t,n,r,o){!r&&"function"==typeof n&&(r=n,n=null);var u=s(e,t),a=i(u,n,r);if(a!==-1)return;u.push([n,r,o,undefined]),"function"==typeof e.didAddListener&&e.didAddListener(t,n,r)}function f(e,t,n,o){function u(n,r,o){var u=s(e,t),a=i(u,n,r);if(a===-1)return;u.splice(a,1),"function"==typeof e.didRemoveListener&&e.didRemoveListener(t,n,r)}!o&&"function"==typeof n&&(o=n,n=null);if(o)u(n,o);else{var a=e[r],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 l(e,t,n,r,o){function l(){return o.call(n)}function c(){f&&(f[3]=undefined)}!r&&"function"==typeof n&&(r=n,n=null);var u=s(e,t),a=i(u,n,r),f;return a!==-1&&(f=u[a].slice(),f[3]=!0,u[a]=f),Ember.tryFinally(l,c)}function c(e,t,n,r,o){function d(){return o.call(n)}function v(){for(c=0,h=u.length;c<h;c++)u[c][3]=undefined}!r&&"function"==typeof n&&(r=n,n=null);var u=[],a,f,l,c,h;for(c=0,h=t.length;c<h;c++){a=t[c],f=s(e,a);var p=i(f,n,r);p!==-1&&(l=f[p].slice(),l[3]=!0,f[p]=l,u.push(l))}return Ember.tryFinally(d,v)}function h(e){var t=e[r].listeners,n=[];if(t)for(var i in t)t[i]&&n.push(i);return n}function p(e,t,n,i){e!==Ember&&"function"==typeof e.sendEvent&&e.sendEvent(t,n);if(!i){var s=e[r];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],a=i[o][1],l=i[o][2];l&&f(e,t,u,a),u||(u=e),"string"==typeof a&&(a=u[a]),n?a.apply(u,n):a.apply(u)}return!0}function d(e,t){var n=e[r],i=n&&n.listeners&&n.listeners[t];return!!i&&!!i.length}function v(e,t){var n=[],i=e[r],s=i&&i.listeners&&i.listeners[t];if(!s)return n;for(var o=0,u=s.length;o<u;o++){var a=s[o][0],f=s[o][1];n.push([a,f])}return n}var e=Ember.create,t=Ember.meta,n=Ember.metaPath,r=Ember.META_KEY;Ember.addListener=a,Ember.removeListener=f,Ember._suspendListener=l,Ember._suspendListeners=c,Ember.sendEvent=p,Ember.hasListeners=d,Ember.watchedEvents=h,Ember.listenersFor=v,Ember.listenersDiff=u,Ember.listenersUnion=o}(),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 l(){f=null;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(l,t- +(new Date)))}function c(e,t){t[this.tguid]&&delete t[this.tguid][this.mguid],a[e]&&n(this.target,this.method,this.args),delete a[e]}function h(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,c,f,u)),f}function d(){p=null;for(var e in a){if(!a.hasOwnProperty(e))continue;var t=a[e];t.next&&(delete a[e],n(t.target,t.method,t.args,2))}}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 o(){if(e||t)return n(e,t,i,2)}var r,i=arguments;return s.begin(),Ember.tryFinally(o,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","timers"],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||p)},Ember.run.cancelTimers=function(){o&&(clearTimeout(o),o=null),f&&(clearTimeout(f),f=null),p&&(clearTimeout(p),p=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;Ember.run.later=function(t,n){var r,i,o,u,f;return arguments.length===2&&"function"==typeof t?(f=n,n=t,t=undefined,r=[t,n]):(r=e.call(arguments),f=r.pop()),i=+(new Date)+f,o={target:t,method:n,expires:i,args:r},u=Ember.guidFor(o),a[u]=o,s.once(a,l),u},Ember.run.once=function(t,n){return h("actions",t,n,e.call(arguments,2))},Ember.run.scheduleOnce=function(t,n,r,i){return h(t,n,r,e.call(arguments,3))};var p;Ember.run.next=function(t,n){var r,i={target:t,method:n,args:e.call(arguments),next:!0};return r=Ember.guidFor(i),a[r]=i,p||(p=setTimeout(d,1)),r},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=
16
- 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 c(e){var t=Ember.meta(e,!0),n=t.mixins;return n?t.hasOwnProperty("mixins")||(n=t.mixins=a(n)):n=t.mixins={},n}function h(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 p(e){return"function"==typeof e&&e.isMethod!==!1&&e!==Boolean&&e!==Object&&e!==Number&&e!==Array&&e!==Date&&e!==String}function v(t,n){var r;return n instanceof e?(r=l(n),t[r]?d:(t[r]=n,n.properties)):n}function m(e,t,n){var r;return r=t.concatenatedProperties||n.concatenatedProperties,e.concatenatedProperties&&(r=r?r.concat(e.concatenatedProperties):e.concatenatedProperties),r}function g(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=a(n),n.func=Ember.wrap(n.func,s.func),n):n}function y(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 b(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 w(e,n,r,s,o,u,a){if(r instanceof Ember.Descriptor){if(r===t&&o[n])return d;r.func&&(r=g(s,n,r,u,o)),o[n]=r,u[n]=undefined}else{if(p(r))r=y(e,n,r,u,o);else if(a&&i.call(a,n)>=0||n==="concatenatedProperties")r=b(e,n,r,u);o[n]=undefined,u[n]=r}}function E(e,t,n,r,i){function c(e){delete n[e],delete r[e]}var o,u,a,f,l;for(var h=0,p=e.length;h<p;h++){o=e[h],u=v(t,o);if(u===d)continue;if(u){l=Ember.meta(i),f=m(u,r,i);for(a in u){if(!u.hasOwnProperty(a))continue;w(i,a,u[a],l,n,r,f)}u.hasOwnProperty("toString")&&(i.toString=u.toString)}else o.mixins&&(E(o.mixins,t,n,r,i),o._without&&s.call(o._without,c))}}function S(e){var t=Ember.meta(e),n=t.required;if(!n||!t.hasOwnProperty("required"))n=t.required=n?a(n):{};return n}function T(e,t,n,r){if(x.test(t)){var i=r.bindings;i?r.hasOwnProperty("bindings")||(i=r.bindings=a(r.bindings)):i=r.bindings={},i[t]=n}}function N(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 C(e,t){return N(e,t||Ember.meta(e)),e}function k(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 L(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 A(e,t,n){var r=e[t];L(e,t,r,"__ember_observesBefore__","removeBeforeObserver"),L(e,t,r,"__ember_observes__","removeObserver"),L(e,t,n,"__ember_observesBefore__","addBeforeObserver"),L(e,t,n,"__ember_observes__","addObserver")}function O(e,r,i){var s={},o={},u=Ember.meta(e),a,l,h;E(r,c(e),s,o,e);for(a in o){if(a==="contructor"||!o.hasOwnProperty(a))continue;h=s[a],l=o[a];if(h===t)continue;while(h&&h instanceof n){var p=k(e,h,u,s,o);h=p.desc,l=p.value}if(h===undefined&&l===undefined)continue;A(e,a,l),T(e,a,l,u),f(e,a,h,l,u)}return i||C(e,u),e}function _(e,t,n){var r=l(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(_(i[s],t,n))return!0;return!1}function D(e,t,n){if(n[l(t)])return;n[l(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){D(e,t,n)})}var e,t,n,r=Ember.ArrayPolyfills.map,i=Ember.ArrayPolyfills.indexOf,s=Ember.ArrayPolyfills.forEach,o=[].slice,u={},a=Ember.create,f=Ember.defineProperty,l=Ember.guidFor,d={},x=Ember.IS_BINDING=/^.+Binding$/;Ember.mixin=function(e){var t=o.call(arguments,1);return O(e,t,!1),e},Ember.Mixin=function(){return h(this,arguments)},e=Ember.Mixin,e._apply=O,e.applyPartial=function(e){var t=o.call(arguments,1);return O(e,t,!0)},e.finishPartial=C,Ember.anyUnprocessedMixins=!1,e.create=function(){Ember.anyUnprocessedMixins=!0;var e=this;return h(new e,arguments)};var M=e.prototype;M.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},M.apply=function(e){return O(e,[this],!1)},M.applyPartial=function(e){return O(e,[this],!0)},M.detect=function(t){if(!t)return!1;if(t instanceof e)return _(t,this,{});var n=Ember.meta(t,!1).mixins;return n?!!n[l(this)]:!1},M.without=function(){var t=new e(this);return t._without=o.call(arguments),t},M.keys=function(){var e={},t={},n=[];D(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.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),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(){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[n];return i?i:(i=Ember.String.decamelize(n).replace(e,"-"),r[n]=i,i)},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=[];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=[];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=[];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=[];return this.forEach(function(t,n){e[n]=t}),e},compact:function(){return this.without(null)},without:function(e){if(!this.contains(e))return this;var t=[];return this.forEach(function(n){n!==e&&(t[t.length]=n)}),t},uniq:function(){var e=[];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=this.propertyDidChange,i,s,o;return"number"==typeof t?i=t:t?i=e(t,"length"):i=t=-1,"number"==typeof n?s=n:n?s=e(n,"length"):s=n=-1,o=s<0||i<0||s-i!==0,t===-1&&(t=null),n===-1&&(n=null),Ember.sendEvent(this,"@enumerable:change",[this,t,n]),o&&Ember.propertyDidChange(this,"length"),Ember.propertyDidChange(this,"[]"),this}})}(),function(){function s(e){return e===null||e===undefined}var e=Ember.get,t=Ember.set,n=Ember.meta,r=Ember.EnumerableUtils.map,i=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 r(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=[],i=e(this,"length");s(t)&&(t=0);if(s(n)||n>i)n=i;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,r){t===undefined?(t=0,n=r=-1):(n===undefined&&(n=-1),r===undefined&&(r=-1));var s,o;if(t>=0&&r>=0&&e(this,"hasEnumerableObservers")){s=[],o=t+r;for(var u=t;u<o;u++)s.push(this.objectAt(u))}else s=r;this.enumerableContentDidChange(n,s),Ember.sendEvent(this,"@array:change",[this,t,n,r]);var a=e(this,"length"),f=i(this,"firstObject"),l=i(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,i=Ember.EnumerableUtils.forEach;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,n=Ember.defineProperty;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=Ember.Mixin.create({on:function(e,t,n){Ember.addListener(this,e,t,n)},one:function(e,t,n){n||(n=t,t=null),Ember.addListener(this,e,t,n,!0)},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){Ember.removeListener(this,e,t,n)},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,r=Array.prototype.slice;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 w(){var e=!1,t,i,o=function(){e||o.proto(),r(this,s,b),r(this,"_super",b);var u=a(this);u.proto=this;if(t){var f=t;t=null,this.reopen.apply(this,f)}if(i){var c=i;i=null;var h=this.concatenatedProperties;for(var p=0,d=c.length;p<d;p++){var m=c[p];for(var w in
17
- m){if(!m.hasOwnProperty(w))continue;var E=m[w],S=Ember.IS_BINDING;if(S.test(w)){var x=u.bindings;x?u.hasOwnProperty("bindings")||(x=u.bindings=n(u.bindings)):x=u.bindings={},x[w]=E}var T=u.descs[w];if(h&&y(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?g?Ember.defineProperty(this,w,null,E):this[w]=E:this.setUnknownProperty(w,E)}}}v(this,u),delete u.proto,l(this),this.init.apply(this,arguments)};return o.toString=p.prototype.toString,o.willReopen=function(){e&&(o.PrototypeMixin=p.create(o.PrototypeMixin)),e=!1},o._initMixins=function(e){t=e},o._initProperties=function(e){i=e},o.proto=function(){var t=o.superclass;return t&&t.proto(),e||(e=!0,o.PrototypeMixin.applyPartial(o.prototype),f(o.prototype)),this.prototype},o}function S(e){return function(){return e}}var e=Ember.set,t=Ember.get,n=Ember.create,r=Ember.platform.defineProperty,i=Array.prototype.slice,s=Ember.GUID_KEY,o=Ember.guidFor,u=Ember.generateGuid,a=Ember.meta,f=Ember.rewatch,l=Ember.finishChains,c=Ember.destroy,h=Ember.run.schedule,p=Ember.Mixin,d=p._apply,v=p.finishPartial,m=p.prototype.reopen,g=Ember.ENV.MANDATORY_SETTER,y=Ember.EnumerableUtils.indexOf,b={configurable:!0,writable:!0,enumerable:!1,value:undefined},E=w();E.toString=function(){return"Ember.CoreObject"},E.PrototypeMixin=p.create({reopen:function(){return d(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(),h("destroy",this,this._scheduledDestroy),this},_scheduledDestroy:function(){c(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 T(){var e=typeof this.toStringExtension=="function",t=e?":"+this.toStringExtension():"",n="<"+this.constructor.toString()+":"+o(this)+t+">";return this.toString=S(n),n}}),E.PrototypeMixin.ownerConstructor=E,Ember.config.overridePrototypeMixin&&Ember.config.overridePrototypeMixin(E.PrototypeMixin),E.__super__=null;var x=p.create({ClassMixin:Ember.required(),PrototypeMixin:Ember.required(),isClass:!0,isMethod:!1,extend:function(){var e=w(),t;return e.ClassMixin=p.create(this.ClassMixin),e.PrototypeMixin=p.create(this.PrototypeMixin),e.ClassMixin.ownerConstructor=e,e.PrototypeMixin.ownerConstructor=e,m.apply(e.PrototypeMixin,arguments),e.superclass=this,e.__super__=this.prototype,t=e.prototype=n(this.prototype),t.constructor=e,u(t,"ember"),a(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(),m.apply(this.PrototypeMixin,arguments),this},reopenClass:function(){return m.apply(this.ClassMixin,arguments),d(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=a(this.proto(),!1).descs[e];return t._meta||{}},eachComputedProperty:function(e,t){var n=this.proto(),r=a(n).descs,i={},s;for(var o in r)s=r[o],s instanceof Ember.ComputedProperty&&e.call(t||this,o,s._meta||i)}});x.ownerConstructor=E,Ember.config.overrideClassMixin&&Ember.config.overrideClassMixin(x),E.ClassMixin=x,x.apply(E),Ember.CoreObject=E}(),function(){var e=Ember.get,t=Ember.set,n=Ember.guidFor,r=Ember.isNone;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"Ember.Set<%@>".fmt(n.join(","))}})}(),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=Ember.get,t=Ember.set;Ember.ArrayProxy=Ember.Object.extend(Ember.MutableArray,{content:null,arrangedContent:Ember.computed.alias("content"),objectAtContent:function(t){return e(this,"arrangedContent").objectAt(t)},replaceContent:function(t,n,r){e(this,"content").replace(t,n,r)},_contentWillChange:Ember.beforeObserver(function(){this._teardownContent()},"content"),_teardownContent:function(){var t=e(this,"content");t&&t.removeArrayObserver(this,{willChange:"contentArrayWillChange",didChange:"contentArrayDidChange"})},contentArrayWillChange:Ember.K,contentArrayDidChange:Ember.K,_contentDidChange:Ember.observer(function(){var t=e(this,"content");this._setupContent()},"content"),_setupContent:function(){var t=e(this,"content");t&&t.addArrayObserver(this,{willChange:"contentArrayWillChange",didChange:"contentArrayDidChange"})},_arrangedContentWillChange:Ember.beforeObserver(function(){var t=e(this,"arrangedContent"),n=t?e(t,"length"):0;this.arrangedContentArrayWillChange(this,0,n,undefined),this.arrangedContentWillChange(this),this._teardownArrangedContent(t)},"arrangedContent"),_arrangedContentDidChange:Ember.observer(function(){var t=e(this,"arrangedContent"),n=t?e(t,"length"):0;this._setupArrangedContent(),this.arrangedContentDidChange(this),this.arrangedContentArrayDidChange(this,0,undefined,n)},"arrangedContent"),_setupArrangedContent:function(){var t=e(this,"arrangedContent");t&&t.addArrayObserver(this,{willChange:"arrangedContentArrayWillChange",didChange:"arrangedContentArrayDidChange"})},_teardownArrangedContent:function(){var t=e(this,"arrangedContent");t&&t.removeArrayObserver(this,{willChange:"arrangedContentArrayWillChange",didChange:"arrangedContentArrayDidChange"})},arrangedContentWillChange:Ember.K,arrangedContentDidChange:Ember.K,objectAt:function(t){return e(this,"content")&&this.objectAtContent(t)},length:Ember.computed(function(){var t=e(this,"arrangedContent");return t?e(t,"length"):0}),replace:function(t,n,r){return e(this,"content")&&this.replaceContent(t,n,r),this},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)}})}(),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,a;a=n>0?t+n:-1,Ember.beginPropertyChanges(this);for(s in i){if(!i.hasOwnProperty(s))continue;a>0&&u(e,s,this,t,a),Ember.propertyWillChange(this,s)}Ember.propertyWillChange(this._content,"@each"),Ember.endPropertyChanges(this)},arrayDidChange:function(e,t,n,r){var i=this._keys,s,u,a;a=r>0?t+r:-1,Ember.beginPropertyChanges(this);for(s in i){if(!i.hasOwnProperty(s))continue;a>0&&o(e,s,this,t,a),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.DeferredMixin,t=Ember.Object,n=Ember.get,r=Ember.Object.extend(e);r.reopenClass({promise:function(e,t){var i=r.create();return e.call(t,i),n(i,"promise")}}),Ember.Deferred=r}(),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),f=e(this,"arrangedContent");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.isGlobalPath,r=Ember.EnumerableUtils.forEach,i=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,n,s){var o=e(this,"_subControllers"),u=o.slice(t,t+n);r(u,function(e){e&&e.destroy()}),i(o,t,n,new Array(s)),this._super(t,n,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");r(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"),r;t(this,"childStates",Ember.A()),t(this,"eventTransitions",e(this,"eventTransitions")||{});var i,s,o;if(!n){n={};for(i in this){if(i==="constructor")continue;if(s=this[i]){if(o=s.transitionTarget)this.eventTransitions[i]=o;this.setupChild(n,i,s)}}t(this,"states",n)}else for(i in n)this.setupChild(n,i,n[i]);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,s=Ember.$&&Ember.$.Event;n&&s&&n instanceof s?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.1",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.apply(t||this);try{return e.apply(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]}},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)}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]},Ember.computed.not=function(t){return Ember.computed(t,function(n){return!e(this,t)})},Ember.computed.none=function(t){return Ember.computed(t,function(n){var r=e(this,t);return Ember.isNone(r)})},Ember.computed.empty=function(t){return Ember.computed(t,function(n){var r=e(this,t);return Ember.isEmpty(r)})},Ember.computed.bool=function(t){return Ember.computed(t,function(n){return!!e(this,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)})}}(),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.apply(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.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
16
+ ,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.without(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=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
17
+ ,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.");
@@ -141,6 +141,15 @@ Ember.LOG_STACKTRACE_ON_DEPRECATION = (Ember.ENV.LOG_STACKTRACE_ON_DEPRECATION !
141
141
  */
142
142
  Ember.SHIM_ES5 = (Ember.ENV.SHIM_ES5 === false) ? false : Ember.EXTEND_PROTOTYPES;
143
143
 
144
+ /**
145
+ Determines whether Ember logs info about version of used libraries
146
+
147
+ @property LOG_VERSION
148
+ @type Boolean
149
+ @default true
150
+ */
151
+ Ember.LOG_VERSION = (Ember.ENV.LOG_VERSION === false) ? false : true;
152
+
144
153
  /**
145
154
  Empty function. Useful for some operations.
146
155
 
@@ -253,6 +262,58 @@ Ember.merge = function(original, updates) {
253
262
  }
254
263
  };
255
264
 
265
+ /**
266
+ Returns true if the passed value is null or undefined. This avoids errors
267
+ from JSLint complaining about use of ==, which can be technically
268
+ confusing.
269
+
270
+ ```javascript
271
+ Ember.isNone(); // true
272
+ Ember.isNone(null); // true
273
+ Ember.isNone(undefined); // true
274
+ Ember.isNone(''); // false
275
+ Ember.isNone([]); // false
276
+ Ember.isNone(function(){}); // false
277
+ ```
278
+
279
+ @method isNone
280
+ @for Ember
281
+ @param {Object} obj Value to test
282
+ @return {Boolean}
283
+ */
284
+ Ember.isNone = function(obj) {
285
+ return obj === null || obj === undefined;
286
+ };
287
+ Ember.none = Ember.deprecateFunc("Ember.none is deprecated. Please use Ember.isNone instead.", Ember.isNone);
288
+
289
+ /**
290
+ Verifies that a value is `null` or an empty string, empty array,
291
+ or empty function.
292
+
293
+ Constrains the rules on `Ember.isNone` by returning false for empty
294
+ string and empty arrays.
295
+
296
+ ```javascript
297
+ Ember.isEmpty(); // true
298
+ Ember.isEmpty(null); // true
299
+ Ember.isEmpty(undefined); // true
300
+ Ember.isEmpty(''); // true
301
+ Ember.isEmpty([]); // true
302
+ Ember.isEmpty('Adam Hawkins'); // false
303
+ Ember.isEmpty([0,1,2]); // false
304
+ ```
305
+
306
+ @method isEmpty
307
+ @for Ember
308
+ @param {Object} obj Value to test
309
+ @return {Boolean}
310
+ */
311
+ Ember.isEmpty = function(obj) {
312
+ return obj === null || obj === undefined || (obj.length === 0 && typeof obj !== 'function') || (typeof obj === 'object' && Ember.get(obj, 'length') === 0);
313
+ };
314
+ Ember.empty = Ember.deprecateFunc("Ember.empty is deprecated. Please use Ember.isEmpty instead.", Ember.isEmpty) ;
315
+
316
+
256
317
  })();
257
318
 
258
319
 
@@ -1596,7 +1657,7 @@ var MapWithDefault = Ember.MapWithDefault = function(options) {
1596
1657
  @static
1597
1658
  @param [options]
1598
1659
  @param {anything} [options.defaultValue]
1599
- @return {Ember.MapWithDefault|Ember.Map} If options are passed, returns
1660
+ @return {Ember.MapWithDefault|Ember.Map} If options are passed, returns
1600
1661
  `Ember.MapWithDefault` otherwise returns `Ember.Map`
1601
1662
  */
1602
1663
  MapWithDefault.create = function(options) {
@@ -1659,7 +1720,7 @@ var FIRST_KEY = /^([^\.\*]+)/;
1659
1720
  // ..........................................................
1660
1721
  // GET AND SET
1661
1722
  //
1662
- // If we are on a platform that supports accessors we can get use those.
1723
+ // If we are on a platform that supports accessors we can use those.
1663
1724
  // Otherwise simulate accessors by looking up the property directly on the
1664
1725
  // object.
1665
1726
 
@@ -1670,7 +1731,7 @@ var FIRST_KEY = /^([^\.\*]+)/;
1670
1731
 
1671
1732
  If you plan to run on IE8 and older browsers then you should use this
1672
1733
  method anytime you want to retrieve a property on an object that you don't
1673
- know for sure is private. (Properties beginning with an underscore '_'
1734
+ know for sure is private. (Properties beginning with an underscore '_'
1674
1735
  are considered private.)
1675
1736
 
1676
1737
  On all newer browsers, you only need to use this method to retrieve
@@ -1731,7 +1792,7 @@ get = function get(obj, keyName) {
1731
1792
 
1732
1793
  If you plan to run on IE8 and older browsers then you should use this
1733
1794
  method anytime you want to set a property on an object that you don't
1734
- know for sure is private. (Properties beginning with an underscore '_'
1795
+ know for sure is private. (Properties beginning with an underscore '_'
1735
1796
  are considered private.)
1736
1797
 
1737
1798
  On all newer browsers, you only need to use this method to set
@@ -1961,11 +2022,8 @@ Ember.isGlobalPath = function(path) {
1961
2022
  @module ember-metal
1962
2023
  */
1963
2024
 
1964
- var GUID_KEY = Ember.GUID_KEY,
1965
- META_KEY = Ember.META_KEY,
1966
- EMPTY_META = Ember.EMPTY_META,
2025
+ var META_KEY = Ember.META_KEY,
1967
2026
  metaFor = Ember.meta,
1968
- o_create = Ember.create,
1969
2027
  objectDefineProperty = Ember.platform.defineProperty;
1970
2028
 
1971
2029
  var MANDATORY_SETTER = Ember.ENV.MANDATORY_SETTER;
@@ -2385,7 +2443,6 @@ var guidFor = Ember.guidFor, // utils.js
2385
2443
  META_KEY = Ember.META_KEY, // utils.js
2386
2444
  // circular reference observer depends on Ember.watch
2387
2445
  // we should move change events to this file or its own property_events.js
2388
- notifyObservers = Ember.notifyObservers, // observer.js
2389
2446
  forEach = Ember.ArrayPolyfills.forEach, // array.js
2390
2447
  FIRST_KEY = /^([^\.\*]+)/,
2391
2448
  IS_PATH = /[\.\*]/;
@@ -2924,7 +2981,7 @@ Ember.finishChains = function(obj) {
2924
2981
  @param {String} keyName The property key (or path) that will change.
2925
2982
  @return {void}
2926
2983
  */
2927
- function propertyWillChange(obj, keyName, value) {
2984
+ function propertyWillChange(obj, keyName) {
2928
2985
  var m = metaFor(obj, false),
2929
2986
  watching = m.watching[keyName] > 0 || keyName === 'length',
2930
2987
  proto = m.proto,
@@ -3031,7 +3088,6 @@ Ember.destroy = function (obj) {
3031
3088
  var get = Ember.get,
3032
3089
  set = Ember.set,
3033
3090
  metaFor = Ember.meta,
3034
- guidFor = Ember.guidFor,
3035
3091
  a_slice = [].slice,
3036
3092
  o_create = Ember.create,
3037
3093
  META_KEY = Ember.META_KEY,
@@ -3067,20 +3123,8 @@ function keysForDep(obj, depsMeta, depKey) {
3067
3123
  return keys;
3068
3124
  }
3069
3125
 
3070
- /* return obj[META_KEY].deps */
3071
3126
  function metaForDeps(obj, meta) {
3072
- var deps = meta.deps;
3073
- // If the current object has no dependencies...
3074
- if (!deps) {
3075
- // initialize the dependencies with a pointer back to
3076
- // the current object
3077
- deps = meta.deps = {};
3078
- } else if (!meta.hasOwnProperty('deps')) {
3079
- // otherwise if the dependencies are inherited from the
3080
- // object's superclass, clone the deps
3081
- deps = meta.deps = o_create(deps);
3082
- }
3083
- return deps;
3127
+ return keysForDep(obj, meta, 'deps');
3084
3128
  }
3085
3129
 
3086
3130
  function addDependentKeys(desc, obj, keyName, meta) {
@@ -3133,8 +3177,10 @@ function removeDependentKeys(desc, obj, keyName, meta) {
3133
3177
  */
3134
3178
  function ComputedProperty(func, opts) {
3135
3179
  this.func = func;
3180
+
3136
3181
  this._cacheable = (opts && opts.cacheable !== undefined) ? opts.cacheable : true;
3137
3182
  this._dependentKeys = opts && opts.dependentKeys;
3183
+ this._readOnly = opts && (opts.readOnly !== undefined || !!opts.readOnly);
3138
3184
  }
3139
3185
 
3140
3186
  Ember.ComputedProperty = ComputedProperty;
@@ -3189,6 +3235,28 @@ ComputedPropertyPrototype.volatile = function() {
3189
3235
  return this.cacheable(false);
3190
3236
  };
3191
3237
 
3238
+ /**
3239
+ Call on a computed property to set it into read-only mode. When in this
3240
+ mode the computed property will throw an error when set.
3241
+
3242
+ ```javascript
3243
+ MyApp.person = Ember.Object.create({
3244
+ guid: function() {
3245
+ return 'guid-guid-guid';
3246
+ }.property().readOnly()
3247
+ });
3248
+
3249
+ MyApp.person.set('guid', 'new-guid'); // will throw an exception
3250
+ ```
3251
+
3252
+ @method readOnly
3253
+ @chainable
3254
+ */
3255
+ ComputedPropertyPrototype.readOnly = function(readOnly) {
3256
+ this._readOnly = readOnly === undefined || !!readOnly;
3257
+ return this;
3258
+ };
3259
+
3192
3260
  /**
3193
3261
  Sets the dependent keys on this computed property. Pass any number of
3194
3262
  arguments containing key paths that this computed property depends on.
@@ -3313,9 +3381,14 @@ ComputedPropertyPrototype.set = function(obj, keyName, value) {
3313
3381
  cache = meta.cache,
3314
3382
  cachedValue, ret;
3315
3383
 
3384
+ if (this._readOnly) {
3385
+ throw new Error('Cannot Set: ' + keyName + ' on: ' + obj.toString() );
3386
+ }
3387
+
3316
3388
  this._suspended = obj;
3317
3389
 
3318
3390
  try {
3391
+
3319
3392
  if (cacheable && cache.hasOwnProperty(keyName)) {
3320
3393
  cachedValue = cache[keyName];
3321
3394
  hadCachedValue = true;
@@ -3406,6 +3479,10 @@ Ember.computed = function(func) {
3406
3479
  func = a_slice.call(arguments, -1)[0];
3407
3480
  }
3408
3481
 
3482
+ if ( typeof func !== "function" ) {
3483
+ throw new Error("Computed Property declared without a property function");
3484
+ }
3485
+
3409
3486
  var cp = new ComputedProperty(func);
3410
3487
 
3411
3488
  if (args) {
@@ -3446,6 +3523,18 @@ Ember.computed.not = function(dependentKey) {
3446
3523
  });
3447
3524
  };
3448
3525
 
3526
+ /**
3527
+ @method computed.none
3528
+ @for Ember
3529
+ @param {String} dependentKey
3530
+ */
3531
+ Ember.computed.none = function(dependentKey) {
3532
+ return Ember.computed(dependentKey, function(key) {
3533
+ var val = get(this, dependentKey);
3534
+ return Ember.isNone(val);
3535
+ });
3536
+ };
3537
+
3449
3538
  /**
3450
3539
  @method computed.empty
3451
3540
  @for Ember
@@ -3454,7 +3543,7 @@ Ember.computed.not = function(dependentKey) {
3454
3543
  Ember.computed.empty = function(dependentKey) {
3455
3544
  return Ember.computed(dependentKey, function(key) {
3456
3545
  var val = get(this, dependentKey);
3457
- return val === undefined || val === null || val === '' || (Ember.isArray(val) && get(val, 'length') === 0);
3546
+ return Ember.isEmpty(val);
3458
3547
  });
3459
3548
  };
3460
3549
 
@@ -3472,15 +3561,16 @@ Ember.computed.bool = function(dependentKey) {
3472
3561
  /**
3473
3562
  @method computed.alias
3474
3563
  @for Ember
3564
+
3475
3565
  @param {String} dependentKey
3476
3566
  */
3477
3567
  Ember.computed.alias = function(dependentKey) {
3478
3568
  return Ember.computed(dependentKey, function(key, value){
3479
- if (arguments.length === 1) {
3480
- return get(this, dependentKey);
3481
- } else {
3569
+ if (arguments.length > 1) {
3482
3570
  set(this, dependentKey, value);
3483
3571
  return value;
3572
+ } else {
3573
+ return get(this, dependentKey);
3484
3574
  }
3485
3575
  });
3486
3576
  };
@@ -3496,7 +3586,6 @@ Ember.computed.alias = function(dependentKey) {
3496
3586
 
3497
3587
  var o_create = Ember.create,
3498
3588
  metaFor = Ember.meta,
3499
- metaPath = Ember.metaPath,
3500
3589
  META_KEY = Ember.META_KEY;
3501
3590
 
3502
3591
  /*
@@ -4069,7 +4158,7 @@ Ember.RunLoop = RunLoop;
4069
4158
 
4070
4159
  ```javascript
4071
4160
  Ember.run(function(){
4072
- // code to be execute within a RunLoop
4161
+ // code to be execute within a RunLoop
4073
4162
  });
4074
4163
  ```
4075
4164
 
@@ -4085,8 +4174,7 @@ Ember.RunLoop = RunLoop;
4085
4174
  @return {Object} return value from invoking the passed function.
4086
4175
  */
4087
4176
  Ember.run = function(target, method) {
4088
- var loop,
4089
- args = arguments;
4177
+ var args = arguments;
4090
4178
  run.begin();
4091
4179
 
4092
4180
  function tryable() {
@@ -4104,11 +4192,11 @@ var run = Ember.run;
4104
4192
  /**
4105
4193
  Begins a new RunLoop. Any deferred actions invoked after the begin will
4106
4194
  be buffered until you invoke a matching call to `Ember.run.end()`. This is
4107
- an lower-level way to use a RunLoop instead of using `Ember.run()`.
4195
+ a lower-level way to use a RunLoop instead of using `Ember.run()`.
4108
4196
 
4109
4197
  ```javascript
4110
4198
  Ember.run.begin();
4111
- // code to be execute within a RunLoop
4199
+ // code to be execute within a RunLoop
4112
4200
  Ember.run.end();
4113
4201
  ```
4114
4202
 
@@ -4126,7 +4214,7 @@ Ember.run.begin = function() {
4126
4214
 
4127
4215
  ```javascript
4128
4216
  Ember.run.begin();
4129
- // code to be execute within a RunLoop
4217
+ // code to be execute within a RunLoop
4130
4218
  Ember.run.end();
4131
4219
  ```
4132
4220
 
@@ -4150,9 +4238,9 @@ Ember.run.end = function() {
4150
4238
 
4151
4239
  @property queues
4152
4240
  @type Array
4153
- @default ['sync', 'actions', 'destroy', 'timers']
4241
+ @default ['sync', 'actions', 'destroy']
4154
4242
  */
4155
- Ember.run.queues = ['sync', 'actions', 'destroy', 'timers'];
4243
+ Ember.run.queues = ['sync', 'actions', 'destroy'];
4156
4244
 
4157
4245
  /**
4158
4246
  Adds the passed target/method and any optional arguments to the named
@@ -4165,19 +4253,19 @@ Ember.run.queues = ['sync', 'actions', 'destroy', 'timers'];
4165
4253
  the `run.queues` property.
4166
4254
 
4167
4255
  ```javascript
4168
- Ember.run.schedule('timers', this, function(){
4169
- // this will be executed at the end of the RunLoop, when timers are run
4170
- console.log("scheduled on timers queue");
4171
- });
4172
-
4173
4256
  Ember.run.schedule('sync', this, function(){
4174
- // this will be executed at the end of the RunLoop, when bindings are synced
4257
+ // this will be executed in the first RunLoop queue, when bindings are synced
4175
4258
  console.log("scheduled on sync queue");
4176
4259
  });
4177
4260
 
4261
+ Ember.run.schedule('actions', this, function(){
4262
+ // this will be executed in the 'actions' queue, after bindings have synced.
4263
+ console.log("scheduled on actions queue");
4264
+ });
4265
+
4178
4266
  // Note the functions will be run in order based on the run queues order. Output would be:
4179
4267
  // scheduled on sync queue
4180
- // scheduled on timers queue
4268
+ // scheduled on actions queue
4181
4269
  ```
4182
4270
 
4183
4271
  @method schedule
@@ -4203,7 +4291,7 @@ function autorun() {
4203
4291
 
4204
4292
  // Used by global test teardown
4205
4293
  Ember.run.hasScheduledTimers = function() {
4206
- return !!(scheduledAutorun || scheduledLater || scheduledNext);
4294
+ return !!(scheduledAutorun || scheduledLater);
4207
4295
  };
4208
4296
 
4209
4297
  // Used by global test teardown
@@ -4216,10 +4304,6 @@ Ember.run.cancelTimers = function () {
4216
4304
  clearTimeout(scheduledLater);
4217
4305
  scheduledLater = null;
4218
4306
  }
4219
- if (scheduledNext) {
4220
- clearTimeout(scheduledNext);
4221
- scheduledNext = null;
4222
- }
4223
4307
  timers = {};
4224
4308
  };
4225
4309
 
@@ -4254,7 +4338,8 @@ Ember.run.autorun = function() {
4254
4338
  bindings in the application to sync.
4255
4339
 
4256
4340
  You should call this method anytime you need any changed state to propagate
4257
- throughout the app immediately without repainting the UI.
4341
+ throughout the app immediately without repainting the UI (which happens
4342
+ in the later 'render' queue added by the `ember-views` package).
4258
4343
 
4259
4344
  ```javascript
4260
4345
  Ember.run.sync();
@@ -4274,25 +4359,30 @@ Ember.run.sync = function() {
4274
4359
 
4275
4360
  var timers = {}; // active timers...
4276
4361
 
4277
- var scheduledLater;
4362
+ var scheduledLater, scheduledLaterExpires;
4278
4363
  function invokeLaterTimers() {
4279
4364
  scheduledLater = null;
4280
- var now = (+ new Date()), earliest = -1;
4281
- for (var key in timers) {
4282
- if (!timers.hasOwnProperty(key)) { continue; }
4283
- var timer = timers[key];
4284
- if (timer && timer.expires) {
4285
- if (now >= timer.expires) {
4286
- delete timers[key];
4287
- invoke(timer.target, timer.method, timer.args, 2);
4288
- } else {
4289
- if (earliest<0 || (timer.expires < earliest)) earliest=timer.expires;
4365
+ run(function() {
4366
+ var now = (+ new Date()), earliest = -1;
4367
+ for (var key in timers) {
4368
+ if (!timers.hasOwnProperty(key)) { continue; }
4369
+ var timer = timers[key];
4370
+ if (timer && timer.expires) {
4371
+ if (now >= timer.expires) {
4372
+ delete timers[key];
4373
+ invoke(timer.target, timer.method, timer.args, 2);
4374
+ } else {
4375
+ if (earliest < 0 || (timer.expires < earliest)) { earliest = timer.expires; }
4376
+ }
4290
4377
  }
4291
4378
  }
4292
- }
4293
4379
 
4294
- // schedule next timeout to fire...
4295
- if (earliest > 0) { scheduledLater = setTimeout(invokeLaterTimers, earliest-(+ new Date())); }
4380
+ // schedule next timeout to fire when the earliest timer expires
4381
+ if (earliest > 0) {
4382
+ scheduledLater = setTimeout(invokeLaterTimers, earliest - now);
4383
+ scheduledLaterExpires = earliest;
4384
+ }
4385
+ });
4296
4386
  }
4297
4387
 
4298
4388
  /**
@@ -4340,7 +4430,19 @@ Ember.run.later = function(target, method) {
4340
4430
  timer = { target: target, method: method, expires: expires, args: args };
4341
4431
  guid = Ember.guidFor(timer);
4342
4432
  timers[guid] = timer;
4343
- run.once(timers, invokeLaterTimers);
4433
+
4434
+ if(scheduledLater && expires < scheduledLaterExpires) {
4435
+ // Cancel later timer (then reschedule earlier timer below)
4436
+ clearTimeout(scheduledLater);
4437
+ scheduledLater = null;
4438
+ }
4439
+
4440
+ if (!scheduledLater) {
4441
+ // Schedule later timers to be run.
4442
+ scheduledLater = setTimeout(invokeLaterTimers, wait);
4443
+ scheduledLaterExpires = expires;
4444
+ }
4445
+
4344
4446
  return guid;
4345
4447
  };
4346
4448
 
@@ -4396,6 +4498,21 @@ function scheduleOnce(queue, target, method, args) {
4396
4498
  });
4397
4499
  ```
4398
4500
 
4501
+ Also note that passing an anonymous function to `Ember.run.once` will
4502
+ not prevent additional calls with an identical anonymous function from
4503
+ scheduling the items multiple times, e.g.:
4504
+
4505
+ ```javascript
4506
+ function scheduleIt() {
4507
+ Ember.run.once(myContext, function() { console.log("Closure"); });
4508
+ }
4509
+ scheduleIt();
4510
+ scheduleIt();
4511
+ // "Closure" will print twice, even though we're using `Ember.run.once`,
4512
+ // because the function we pass to it is anonymous and won't match the
4513
+ // previously scheduled operation.
4514
+ ```
4515
+
4399
4516
  @method once
4400
4517
  @param {Object} [target] target of method to invoke
4401
4518
  @param {Function|String} method The method to invoke.
@@ -4412,22 +4529,9 @@ Ember.run.scheduleOnce = function(queue, target, method, args) {
4412
4529
  return scheduleOnce(queue, target, method, slice.call(arguments, 3));
4413
4530
  };
4414
4531
 
4415
- var scheduledNext;
4416
- function invokeNextTimers() {
4417
- scheduledNext = null;
4418
- for(var key in timers) {
4419
- if (!timers.hasOwnProperty(key)) { continue; }
4420
- var timer = timers[key];
4421
- if (timer.next) {
4422
- delete timers[key];
4423
- invoke(timer.target, timer.method, timer.args, 2);
4424
- }
4425
- }
4426
- }
4427
-
4428
4532
  /**
4429
4533
  Schedules an item to run after control has been returned to the system.
4430
- This is often equivalent to calling `setTimeout(function() {}, 1)`.
4534
+ This is equivalent to calling `Ember.run.later` with a wait time of 1ms.
4431
4535
 
4432
4536
  ```javascript
4433
4537
  Ember.run.next(myContext, function(){
@@ -4443,20 +4547,10 @@ function invokeNextTimers() {
4443
4547
  @param {Object} [args*] Optional arguments to pass to the timeout.
4444
4548
  @return {Object} timer
4445
4549
  */
4446
- Ember.run.next = function(target, method) {
4447
- var guid,
4448
- timer = {
4449
- target: target,
4450
- method: method,
4451
- args: slice.call(arguments),
4452
- next: true
4453
- };
4454
-
4455
- guid = Ember.guidFor(timer);
4456
- timers[guid] = timer;
4457
-
4458
- if (!scheduledNext) { scheduledNext = setTimeout(invokeNextTimers, 1); }
4459
- return guid;
4550
+ Ember.run.next = function() {
4551
+ var args = slice.call(arguments);
4552
+ args.push(1); // 1 millisecond wait
4553
+ return run.later.apply(this, args);
4460
4554
  };
4461
4555
 
4462
4556
  /**
@@ -4961,7 +5055,6 @@ var Mixin, REQUIRED, Alias,
4961
5055
  a_indexOf = Ember.ArrayPolyfills.indexOf,
4962
5056
  a_forEach = Ember.ArrayPolyfills.forEach,
4963
5057
  a_slice = [].slice,
4964
- EMPTY_META = {}, // dummy for non-writable meta
4965
5058
  o_create = Ember.create,
4966
5059
  defineProperty = Ember.defineProperty,
4967
5060
  guidFor = Ember.guidFor;
@@ -5330,6 +5423,38 @@ Mixin.finishPartial = finishPartial;
5330
5423
  Ember.anyUnprocessedMixins = false;
5331
5424
 
5332
5425
  /**
5426
+ Creates an instance of a class. Accepts either no arguments, or an object
5427
+ containing values to initialize the newly instantiated object with.
5428
+
5429
+ ```javascript
5430
+ App.Person = Ember.Object.extend({
5431
+ helloWorld: function() {
5432
+ alert("Hi, my name is " + this.get('name'));
5433
+ }
5434
+ });
5435
+
5436
+ var tom = App.Person.create({
5437
+ name: 'Tom Dale'
5438
+ });
5439
+
5440
+ tom.helloWorld(); // alerts "Hi, my name is Tom Dale".
5441
+ ```
5442
+
5443
+ `create` will call the `init` function if defined during
5444
+ `Ember.AnyObject.extend`
5445
+
5446
+ If no arguments are passed to `create`, it will not set values to the new
5447
+ instance during initialization:
5448
+
5449
+ ```javascript
5450
+ var noName = App.Person.create();
5451
+ noName.helloWorld(); // alerts undefined
5452
+ ```
5453
+
5454
+ NOTE: For performance reasons, you cannot declare methods or computed
5455
+ properties during `create`. You should instead declare methods and computed
5456
+ properties when using `extend`.
5457
+
5333
5458
  @method create
5334
5459
  @static
5335
5460
  @param arguments*
@@ -5845,35 +5970,35 @@ define("rsvp",
5845
5970
  }
5846
5971
 
5847
5972
  function all(promises) {
5848
- var i, results = [];
5849
- var allPromise = new Promise();
5850
- var remaining = promises.length;
5973
+ var i, results = [];
5974
+ var allPromise = new Promise();
5975
+ var remaining = promises.length;
5851
5976
 
5852
5977
  if (remaining === 0) {
5853
5978
  allPromise.resolve([]);
5854
5979
  }
5855
5980
 
5856
- var resolver = function(index) {
5857
- return function(value) {
5858
- resolve(index, value);
5859
- };
5860
- };
5981
+ var resolver = function(index) {
5982
+ return function(value) {
5983
+ resolve(index, value);
5984
+ };
5985
+ };
5861
5986
 
5862
- var resolve = function(index, value) {
5863
- results[index] = value;
5864
- if (--remaining === 0) {
5865
- allPromise.resolve(results);
5866
- }
5867
- };
5987
+ var resolve = function(index, value) {
5988
+ results[index] = value;
5989
+ if (--remaining === 0) {
5990
+ allPromise.resolve(results);
5991
+ }
5992
+ };
5868
5993
 
5869
- var reject = function(error) {
5870
- allPromise.reject(error);
5871
- };
5994
+ var reject = function(error) {
5995
+ allPromise.reject(error);
5996
+ };
5872
5997
 
5873
- for (i = 0; i < remaining; i++) {
5874
- promises[i].then(resolver(i), reject);
5875
- }
5876
- return allPromise;
5998
+ for (i = 0; i < remaining; i++) {
5999
+ promises[i].then(resolver(i), reject);
6000
+ }
6001
+ return allPromise;
5877
6002
  }
5878
6003
 
5879
6004
  EventTarget.mixin(Promise.prototype);
@@ -6249,57 +6374,6 @@ Ember.typeOf = function(item) {
6249
6374
  return ret;
6250
6375
  };
6251
6376
 
6252
- /**
6253
- Returns true if the passed value is null or undefined. This avoids errors
6254
- from JSLint complaining about use of ==, which can be technically
6255
- confusing.
6256
-
6257
- ```javascript
6258
- Ember.isNone(); // true
6259
- Ember.isNone(null); // true
6260
- Ember.isNone(undefined); // true
6261
- Ember.isNone(''); // false
6262
- Ember.isNone([]); // false
6263
- Ember.isNone(function(){}); // false
6264
- ```
6265
-
6266
- @method isNone
6267
- @for Ember
6268
- @param {Object} obj Value to test
6269
- @return {Boolean}
6270
- */
6271
- Ember.isNone = function(obj) {
6272
- return obj === null || obj === undefined;
6273
- };
6274
- Ember.none = Ember.deprecateFunc("Ember.none is deprecated. Please use Ember.isNone instead.", Ember.isNone);
6275
-
6276
- /**
6277
- Verifies that a value is `null` or an empty string, empty array,
6278
- or empty function.
6279
-
6280
- Constrains the rules on `Ember.isNone` by returning false for empty
6281
- string and empty arrays.
6282
-
6283
- ```javascript
6284
- Ember.isEmpty(); // true
6285
- Ember.isEmpty(null); // true
6286
- Ember.isEmpty(undefined); // true
6287
- Ember.isEmpty(''); // true
6288
- Ember.isEmpty([]); // true
6289
- Ember.isEmpty('Adam Hawkins'); // false
6290
- Ember.isEmpty([0,1,2]); // false
6291
- ```
6292
-
6293
- @method isEmpty
6294
- @for Ember
6295
- @param {Object} obj Value to test
6296
- @return {Boolean}
6297
- */
6298
- Ember.isEmpty = function(obj) {
6299
- return obj === null || obj === undefined || (obj.length === 0 && typeof obj !== 'function') || (typeof obj === 'object' && Ember.get(obj, 'length') === 0);
6300
- };
6301
- Ember.empty = Ember.deprecateFunc("Ember.empty is deprecated. Please use Ember.isEmpty instead.", Ember.isEmpty) ;
6302
-
6303
6377
  /**
6304
6378
  This will compare two javascript values of possibly different types.
6305
6379
  It will tell you which one is greater than the other by returning:
@@ -6592,6 +6666,20 @@ Ember.Error.prototype = Ember.create(Error.prototype);
6592
6666
 
6593
6667
 
6594
6668
 
6669
+ (function() {
6670
+ /**
6671
+ Expose RSVP implementation
6672
+
6673
+ @class RSVP
6674
+ @namespace Ember
6675
+ @constructor
6676
+ */
6677
+ Ember.RSVP = requireModule('rsvp');
6678
+
6679
+ })();
6680
+
6681
+
6682
+
6595
6683
  (function() {
6596
6684
  /**
6597
6685
  @module ember
@@ -6740,10 +6828,11 @@ Ember.String = {
6740
6828
  */
6741
6829
  dasherize: function(str) {
6742
6830
  var cache = STRING_DASHERIZE_CACHE,
6743
- ret = cache[str];
6831
+ hit = cache.hasOwnProperty(str),
6832
+ ret;
6744
6833
 
6745
- if (ret) {
6746
- return ret;
6834
+ if (hit) {
6835
+ return cache[str];
6747
6836
  } else {
6748
6837
  ret = Ember.String.decamelize(str).replace(STRING_DASHERIZE_REGEXP,'-');
6749
6838
  cache[str] = ret;
@@ -6753,7 +6842,7 @@ Ember.String = {
6753
6842
  },
6754
6843
 
6755
6844
  /**
6756
- Returns the lowerCaseCamel form of a string.
6845
+ Returns the lowerCamelCase form of a string.
6757
6846
 
6758
6847
  ```javascript
6759
6848
  'innerHTML'.camelize(); // 'innerHTML'
@@ -6824,10 +6913,10 @@ Ember.String = {
6824
6913
  /**
6825
6914
  Returns the Capitalized form of a string
6826
6915
 
6827
- 'innerHTML'.capitalize() => 'InnerHTML'
6828
- 'action_name'.capitalize() => 'Action_name'
6829
- 'css-class-name'.capitalize() => 'Css-class-name'
6830
- 'my favorite items'.capitalize() => 'My favorite items'
6916
+ 'innerHTML'.capitalize() // 'InnerHTML'
6917
+ 'action_name'.capitalize() // 'Action_name'
6918
+ 'css-class-name'.capitalize() // 'Css-class-name'
6919
+ 'my favorite items'.capitalize() // 'My favorite items'
6831
6920
 
6832
6921
  @method capitalize
6833
6922
  @param {String} str
@@ -7171,8 +7260,7 @@ function iter(key, value) {
7171
7260
  @extends Ember.Mixin
7172
7261
  @since Ember 0.9
7173
7262
  */
7174
- Ember.Enumerable = Ember.Mixin.create(
7175
- /** @scope Ember.Enumerable.prototype */ {
7263
+ Ember.Enumerable = Ember.Mixin.create({
7176
7264
 
7177
7265
  // compatibility
7178
7266
  isEnumerable: true,
@@ -7205,7 +7293,7 @@ Ember.Enumerable = Ember.Mixin.create(
7205
7293
 
7206
7294
  @method nextObject
7207
7295
  @param {Number} index the current index of the iteration
7208
- @param {Object} previousObject the value returned by the last call to
7296
+ @param {Object} previousObject the value returned by the last call to
7209
7297
  `nextObject`.
7210
7298
  @param {Object} context a context object you can use to maintain state.
7211
7299
  @return {Object} the next object in the iteration or undefined
@@ -7224,10 +7312,10 @@ Ember.Enumerable = Ember.Mixin.create(
7224
7312
 
7225
7313
  ```javascript
7226
7314
  var arr = ["a", "b", "c"];
7227
- arr.firstObject(); // "a"
7315
+ arr.get('firstObject'); // "a"
7228
7316
 
7229
7317
  var arr = [];
7230
- arr.firstObject(); // undefined
7318
+ arr.get('firstObject'); // undefined
7231
7319
  ```
7232
7320
 
7233
7321
  @property firstObject
@@ -7250,10 +7338,10 @@ Ember.Enumerable = Ember.Mixin.create(
7250
7338
 
7251
7339
  ```javascript
7252
7340
  var arr = ["a", "b", "c"];
7253
- arr.lastObject(); // "c"
7341
+ arr.get('lastObject'); // "c"
7254
7342
 
7255
7343
  var arr = [];
7256
- arr.lastObject(); // undefined
7344
+ arr.get('lastObject'); // undefined
7257
7345
  ```
7258
7346
 
7259
7347
  @property lastObject
@@ -7386,7 +7474,7 @@ Ember.Enumerable = Ember.Mixin.create(
7386
7474
  @return {Array} The mapped array.
7387
7475
  */
7388
7476
  map: function(callback, target) {
7389
- var ret = [];
7477
+ var ret = Ember.A([]);
7390
7478
  this.forEach(function(x, idx, i) {
7391
7479
  ret[idx] = callback.call(target, x, idx,i);
7392
7480
  });
@@ -7436,7 +7524,7 @@ Ember.Enumerable = Ember.Mixin.create(
7436
7524
  @return {Array} A filtered array.
7437
7525
  */
7438
7526
  filter: function(callback, target) {
7439
- var ret = [];
7527
+ var ret = Ember.A([]);
7440
7528
  this.forEach(function(x, idx, i) {
7441
7529
  if (callback.call(target, x, idx, i)) ret.push(x);
7442
7530
  });
@@ -7725,7 +7813,7 @@ Ember.Enumerable = Ember.Mixin.create(
7725
7813
  @return {Array} return values from calling invoke.
7726
7814
  */
7727
7815
  invoke: function(methodName) {
7728
- var args, ret = [];
7816
+ var args, ret = Ember.A([]);
7729
7817
  if (arguments.length>1) args = a_slice.call(arguments, 1);
7730
7818
 
7731
7819
  this.forEach(function(x, idx) {
@@ -7746,7 +7834,7 @@ Ember.Enumerable = Ember.Mixin.create(
7746
7834
  @return {Array} the enumerable as an array.
7747
7835
  */
7748
7836
  toArray: function() {
7749
- var ret = [];
7837
+ var ret = Ember.A([]);
7750
7838
  this.forEach(function(o, idx) { ret[idx] = o; });
7751
7839
  return ret ;
7752
7840
  },
@@ -7780,7 +7868,7 @@ Ember.Enumerable = Ember.Mixin.create(
7780
7868
  */
7781
7869
  without: function(value) {
7782
7870
  if (!this.contains(value)) return this; // nothing to do
7783
- var ret = [] ;
7871
+ var ret = Ember.A([]);
7784
7872
  this.forEach(function(k) {
7785
7873
  if (k !== value) ret[ret.length] = k;
7786
7874
  }) ;
@@ -7800,7 +7888,7 @@ Ember.Enumerable = Ember.Mixin.create(
7800
7888
  @return {Ember.Enumerable}
7801
7889
  */
7802
7890
  uniq: function() {
7803
- var ret = [];
7891
+ var ret = Ember.A([]);
7804
7892
  this.forEach(function(k){
7805
7893
  if (a_indexOf(ret, k)<0) ret.push(k);
7806
7894
  });
@@ -7832,7 +7920,7 @@ Ember.Enumerable = Ember.Mixin.create(
7832
7920
 
7833
7921
  @method addEnumerableObserver
7834
7922
  @param {Object} target
7835
- @param {Hash} opts
7923
+ @param {Hash} [opts]
7836
7924
  */
7837
7925
  addEnumerableObserver: function(target, opts) {
7838
7926
  var willChange = (opts && opts.willChange) || 'enumerableWillChange',
@@ -7930,7 +8018,7 @@ Ember.Enumerable = Ember.Mixin.create(
7930
8018
  @chainable
7931
8019
  */
7932
8020
  enumerableContentDidChange: function(removing, adding) {
7933
- var notify = this.propertyDidChange, removeCnt, addCnt, hasDelta;
8021
+ var removeCnt, addCnt, hasDelta;
7934
8022
 
7935
8023
  if ('number' === typeof removing) removeCnt = removing;
7936
8024
  else if (removing) removeCnt = get(removing, 'length');
@@ -7968,7 +8056,7 @@ Ember.Enumerable = Ember.Mixin.create(
7968
8056
  // HELPERS
7969
8057
  //
7970
8058
 
7971
- var get = Ember.get, set = Ember.set, meta = Ember.meta, map = Ember.EnumerableUtils.map, cacheFor = Ember.cacheFor;
8059
+ var get = Ember.get, set = Ember.set, map = Ember.EnumerableUtils.map, cacheFor = Ember.cacheFor;
7972
8060
 
7973
8061
  function none(obj) { return obj===null || obj===undefined; }
7974
8062
 
@@ -8110,15 +8198,19 @@ Ember.Array = Ember.Mixin.create(Ember.Enumerable, /** @scope Ember.Array.protot
8110
8198
  ```
8111
8199
 
8112
8200
  @method slice
8113
- @param beginIndex {Integer} (Optional) index to begin slicing from.
8114
- @param endIndex {Integer} (Optional) index to end the slice at.
8201
+ @param {Integer} beginIndex (Optional) index to begin slicing from.
8202
+ @param {Integer} endIndex (Optional) index to end the slice at.
8115
8203
  @return {Array} New array with specified slice
8116
8204
  */
8117
8205
  slice: function(beginIndex, endIndex) {
8118
- var ret = [];
8206
+ var ret = Ember.A([]);
8119
8207
  var length = get(this, 'length') ;
8120
8208
  if (none(beginIndex)) beginIndex = 0 ;
8121
8209
  if (none(endIndex) || (endIndex > length)) endIndex = length ;
8210
+
8211
+ if (beginIndex < 0) beginIndex = length + beginIndex;
8212
+ if (endIndex < 0) endIndex = length + endIndex;
8213
+
8122
8214
  while(beginIndex < endIndex) {
8123
8215
  ret[ret.length] = this.objectAt(beginIndex++) ;
8124
8216
  }
@@ -8272,9 +8364,9 @@ Ember.Array = Ember.Mixin.create(Ember.Enumerable, /** @scope Ember.Array.protot
8272
8364
 
8273
8365
  @method arrayContentWillChange
8274
8366
  @param {Number} startIdx The starting index in the array that will change.
8275
- @param {Number} removeAmt The number of items that will be removed. If you
8367
+ @param {Number} removeAmt The number of items that will be removed. If you
8276
8368
  pass `null` assumes 0
8277
- @param {Number} addAmt The number of items that will be added If you
8369
+ @param {Number} addAmt The number of items that will be added If you
8278
8370
  pass `null` assumes 0.
8279
8371
  @return {Ember.Array} receiver
8280
8372
  */
@@ -8635,8 +8727,7 @@ var forEach = Ember.EnumerableUtils.forEach;
8635
8727
  @extends Ember.Mixin
8636
8728
  @uses Ember.Enumerable
8637
8729
  */
8638
- Ember.MutableEnumerable = Ember.Mixin.create(Ember.Enumerable,
8639
- /** @scope Ember.MutableEnumerable.prototype */ {
8730
+ Ember.MutableEnumerable = Ember.Mixin.create(Ember.Enumerable, {
8640
8731
 
8641
8732
  /**
8642
8733
  __Required.__ You must implement this method to apply this mixin.
@@ -8721,7 +8812,7 @@ var EMPTY = [];
8721
8812
  // HELPERS
8722
8813
  //
8723
8814
 
8724
- var get = Ember.get, set = Ember.set, forEach = Ember.EnumerableUtils.forEach;
8815
+ var get = Ember.get, set = Ember.set;
8725
8816
 
8726
8817
  /**
8727
8818
  This mixin defines the API for modifying array-like objects. These methods
@@ -8748,11 +8839,11 @@ Ember.MutableArray = Ember.Mixin.create(Ember.Array, Ember.MutableEnumerable,
8748
8839
  passed array. You should also call `this.enumerableContentDidChange()`
8749
8840
 
8750
8841
  @method replace
8751
- @param {Number} idx Starting index in the array to replace. If
8842
+ @param {Number} idx Starting index in the array to replace. If
8752
8843
  idx >= length, then append to the end of the array.
8753
- @param {Number} amt Number of elements that should be removed from
8844
+ @param {Number} amt Number of elements that should be removed from
8754
8845
  the array, starting at *idx*.
8755
- @param {Array} objects An array of zero or more objects that should be
8846
+ @param {Array} objects An array of zero or more objects that should be
8756
8847
  inserted into the array at *idx*
8757
8848
  */
8758
8849
  replace: Ember.required(),
@@ -9017,7 +9108,7 @@ Ember.MutableArray = Ember.Mixin.create(Ember.Array, Ember.MutableEnumerable,
9017
9108
  @submodule ember-runtime
9018
9109
  */
9019
9110
 
9020
- var get = Ember.get, set = Ember.set, defineProperty = Ember.defineProperty;
9111
+ var get = Ember.get, set = Ember.set;
9021
9112
 
9022
9113
  /**
9023
9114
  ## Overview
@@ -9615,6 +9706,16 @@ Ember.TargetActionSupport = Ember.Mixin.create({
9615
9706
  // outputs: 'Our person has greeted'
9616
9707
  ```
9617
9708
 
9709
+ You can also chain multiple event subscriptions:
9710
+
9711
+ ```javascript
9712
+ person.on('greet', function() {
9713
+ console.log('Our person has greeted');
9714
+ }).one('greet', function() {
9715
+ console.log('Offer one-time special');
9716
+ }).off('event', this, forgetThis);
9717
+ ```
9718
+
9618
9719
  @class Evented
9619
9720
  @namespace Ember
9620
9721
  @extends Ember.Mixin
@@ -9642,6 +9743,7 @@ Ember.Evented = Ember.Mixin.create({
9642
9743
  */
9643
9744
  on: function(name, target, method) {
9644
9745
  Ember.addListener(this, name, target, method);
9746
+ return this;
9645
9747
  },
9646
9748
 
9647
9749
  /**
@@ -9665,6 +9767,7 @@ Ember.Evented = Ember.Mixin.create({
9665
9767
  }
9666
9768
 
9667
9769
  Ember.addListener(this, name, target, method, true);
9770
+ return this;
9668
9771
  },
9669
9772
 
9670
9773
  /**
@@ -9708,6 +9811,7 @@ Ember.Evented = Ember.Mixin.create({
9708
9811
  */
9709
9812
  off: function(name, target, method) {
9710
9813
  Ember.removeListener(this, name, target, method);
9814
+ return this;
9711
9815
  },
9712
9816
 
9713
9817
  /**
@@ -9738,8 +9842,7 @@ RSVP.async = function(callback, binding) {
9738
9842
  @submodule ember-runtime
9739
9843
  */
9740
9844
 
9741
- var get = Ember.get,
9742
- slice = Array.prototype.slice;
9845
+ var get = Ember.get;
9743
9846
 
9744
9847
  /**
9745
9848
  @class Deferred
@@ -9815,7 +9918,6 @@ Ember.Container.set = Ember.set;
9815
9918
  var set = Ember.set, get = Ember.get,
9816
9919
  o_create = Ember.create,
9817
9920
  o_defineProperty = Ember.platform.defineProperty,
9818
- a_slice = Array.prototype.slice,
9819
9921
  GUID_KEY = Ember.GUID_KEY,
9820
9922
  guidFor = Ember.guidFor,
9821
9923
  generateGuid = Ember.generateGuid,
@@ -9962,6 +10064,37 @@ CoreObject.PrototypeMixin = Mixin.create({
9962
10064
 
9963
10065
  isInstance: true,
9964
10066
 
10067
+ /**
10068
+ An overridable method called when objects are instantiated. By default,
10069
+ does nothing unless it is overridden during class definition.
10070
+
10071
+ Example:
10072
+
10073
+ ```javascript
10074
+ App.Person = Ember.Object.extend({
10075
+ init: function() {
10076
+ this._super();
10077
+ alert('Name is ' + this.get('name'));
10078
+ }
10079
+ });
10080
+
10081
+ var steve = App.Person.create({
10082
+ name: "Steve"
10083
+ });
10084
+
10085
+ // alerts 'Name is Steve'.
10086
+ ```
10087
+
10088
+ NOTE: If you do override `init` for a framework class like `Ember.View` or
10089
+ `Ember.ArrayController`, be sure to call `this._super()` in your
10090
+ `init` declaration! If you don't, Ember may not have an opportunity to
10091
+ do important setup work, and you'll see strange behavior in your
10092
+ application.
10093
+
10094
+ ```
10095
+
10096
+ @method init
10097
+ */
9965
10098
  init: function() {},
9966
10099
 
9967
10100
  /**
@@ -10006,14 +10139,14 @@ CoreObject.PrototypeMixin = Mixin.create({
10006
10139
  view.get('classNames'); // ['ember-view', 'bar', 'foo', 'baz']
10007
10140
  ```
10008
10141
  Adding a single property that is not an array will just add it in the array:
10009
-
10142
+
10010
10143
  ```javascript
10011
10144
  var view = App.FooBarView.create({
10012
10145
  classNames: 'baz'
10013
10146
  })
10014
10147
  view.get('classNames'); // ['ember-view', 'bar', 'foo', 'baz']
10015
10148
  ```
10016
-
10149
+
10017
10150
  Using the `concatenatedProperties` property, we can tell to Ember that mix
10018
10151
  the content of the properties.
10019
10152
 
@@ -10112,7 +10245,7 @@ CoreObject.PrototypeMixin = Mixin.create({
10112
10245
  }
10113
10246
  });
10114
10247
  teacher = App.Teacher.create()
10115
- teacher.toString(); // #=> "<App.Teacher:ember1026:Tom Dale>"
10248
+ teacher.toString(); //=> "<App.Teacher:ember1026:Tom Dale>"
10116
10249
 
10117
10250
  @method toString
10118
10251
  @return {String} string representation
@@ -10290,687 +10423,721 @@ Ember.CoreObject = CoreObject;
10290
10423
  @submodule ember-runtime
10291
10424
  */
10292
10425
 
10293
- var get = Ember.get, set = Ember.set, guidFor = Ember.guidFor, none = Ember.isNone;
10294
-
10295
10426
  /**
10296
- An unordered collection of objects.
10427
+ `Ember.Object` is the main base class for all Ember objects. It is a subclass
10428
+ of `Ember.CoreObject` with the `Ember.Observable` mixin applied. For details,
10429
+ see the documentation for each of these.
10297
10430
 
10298
- A Set works a bit like an array except that its items are not ordered. You
10299
- can create a set to efficiently test for membership for an object. You can
10300
- also iterate through a set just like an array, even accessing objects by
10301
- index, however there is no guarantee as to their order.
10431
+ @class Object
10432
+ @namespace Ember
10433
+ @extends Ember.CoreObject
10434
+ @uses Ember.Observable
10435
+ */
10436
+ Ember.Object = Ember.CoreObject.extend(Ember.Observable);
10437
+ Ember.Object.toString = function() { return "Ember.Object"; };
10302
10438
 
10303
- All Sets are observable via the Enumerable Observer API - which works
10304
- on any enumerable object including both Sets and Arrays.
10439
+ })();
10305
10440
 
10306
- ## Creating a Set
10307
10441
 
10308
- You can create a set like you would most objects using
10309
- `new Ember.Set()`. Most new sets you create will be empty, but you can
10310
- also initialize the set with some content by passing an array or other
10311
- enumerable of objects to the constructor.
10312
10442
 
10313
- Finally, you can pass in an existing set and the set will be copied. You
10314
- can also create a copy of a set by calling `Ember.Set#copy()`.
10443
+ (function() {
10444
+ /**
10445
+ @module ember
10446
+ @submodule ember-runtime
10447
+ */
10315
10448
 
10316
- ```javascript
10317
- // creates a new empty set
10318
- var foundNames = new Ember.Set();
10449
+ var get = Ember.get, indexOf = Ember.ArrayPolyfills.indexOf;
10319
10450
 
10320
- // creates a set with four names in it.
10321
- var names = new Ember.Set(["Charles", "Tom", "Juan", "Alex"]); // :P
10451
+ /**
10452
+ A Namespace is an object usually used to contain other objects or methods
10453
+ such as an application or framework. Create a namespace anytime you want
10454
+ to define one of these new containers.
10322
10455
 
10323
- // creates a copy of the names set.
10324
- var namesCopy = new Ember.Set(names);
10456
+ # Example Usage
10325
10457
 
10326
- // same as above.
10327
- var anotherNamesCopy = names.copy();
10458
+ ```javascript
10459
+ MyFramework = Ember.Namespace.create({
10460
+ VERSION: '1.0.0'
10461
+ });
10328
10462
  ```
10329
10463
 
10330
- ## Adding/Removing Objects
10331
-
10332
- You generally add or remove objects from a set using `add()` or
10333
- `remove()`. You can add any type of object including primitives such as
10334
- numbers, strings, and booleans.
10464
+ @class Namespace
10465
+ @namespace Ember
10466
+ @extends Ember.Object
10467
+ */
10468
+ var Namespace = Ember.Namespace = Ember.Object.extend({
10469
+ isNamespace: true,
10335
10470
 
10336
- Unlike arrays, objects can only exist one time in a set. If you call `add()`
10337
- on a set with the same object multiple times, the object will only be added
10338
- once. Likewise, calling `remove()` with the same object multiple times will
10339
- remove the object the first time and have no effect on future calls until
10340
- you add the object to the set again.
10471
+ init: function() {
10472
+ Ember.Namespace.NAMESPACES.push(this);
10473
+ Ember.Namespace.PROCESSED = false;
10474
+ },
10341
10475
 
10342
- NOTE: You cannot add/remove `null` or `undefined` to a set. Any attempt to do
10343
- so will be ignored.
10476
+ toString: function() {
10477
+ var name = get(this, 'name');
10478
+ if (name) { return name; }
10344
10479
 
10345
- In addition to add/remove you can also call `push()`/`pop()`. Push behaves
10346
- just like `add()` but `pop()`, unlike `remove()` will pick an arbitrary
10347
- object, remove it and return it. This is a good way to use a set as a job
10348
- queue when you don't care which order the jobs are executed in.
10480
+ findNamespaces();
10481
+ return this[Ember.GUID_KEY+'_name'];
10482
+ },
10349
10483
 
10350
- ## Testing for an Object
10484
+ nameClasses: function() {
10485
+ processNamespace([this.toString()], this, {});
10486
+ },
10351
10487
 
10352
- To test for an object's presence in a set you simply call
10353
- `Ember.Set#contains()`.
10488
+ destroy: function() {
10489
+ var namespaces = Ember.Namespace.NAMESPACES;
10490
+ Ember.lookup[this.toString()] = undefined;
10491
+ namespaces.splice(indexOf.call(namespaces, this), 1);
10492
+ this._super();
10493
+ }
10494
+ });
10354
10495
 
10355
- ## Observing changes
10496
+ Namespace.reopenClass({
10497
+ NAMESPACES: [Ember],
10498
+ NAMESPACES_BY_ID: {},
10499
+ PROCESSED: false,
10500
+ processAll: processAllNamespaces,
10501
+ byName: function(name) {
10502
+ if (!Ember.BOOTED) {
10503
+ processAllNamespaces();
10504
+ }
10356
10505
 
10357
- When using `Ember.Set`, you can observe the `"[]"` property to be
10358
- alerted whenever the content changes. You can also add an enumerable
10359
- observer to the set to be notified of specific objects that are added and
10360
- removed from the set. See `Ember.Enumerable` for more information on
10361
- enumerables.
10506
+ return NAMESPACES_BY_ID[name];
10507
+ }
10508
+ });
10362
10509
 
10363
- This is often unhelpful. If you are filtering sets of objects, for instance,
10364
- it is very inefficient to re-filter all of the items each time the set
10365
- changes. It would be better if you could just adjust the filtered set based
10366
- on what was changed on the original set. The same issue applies to merging
10367
- sets, as well.
10510
+ var NAMESPACES_BY_ID = Namespace.NAMESPACES_BY_ID;
10368
10511
 
10369
- ## Other Methods
10512
+ var hasOwnProp = ({}).hasOwnProperty,
10513
+ guidFor = Ember.guidFor;
10370
10514
 
10371
- `Ember.Set` primary implements other mixin APIs. For a complete reference
10372
- on the methods you will use with `Ember.Set`, please consult these mixins.
10373
- The most useful ones will be `Ember.Enumerable` and
10374
- `Ember.MutableEnumerable` which implement most of the common iterator
10375
- methods you are used to on Array.
10515
+ function processNamespace(paths, root, seen) {
10516
+ var idx = paths.length;
10376
10517
 
10377
- Note that you can also use the `Ember.Copyable` and `Ember.Freezable`
10378
- APIs on `Ember.Set` as well. Once a set is frozen it can no longer be
10379
- modified. The benefit of this is that when you call `frozenCopy()` on it,
10380
- Ember will avoid making copies of the set. This allows you to write
10381
- code that can know with certainty when the underlying set data will or
10382
- will not be modified.
10518
+ NAMESPACES_BY_ID[paths.join('.')] = root;
10383
10519
 
10384
- @class Set
10385
- @namespace Ember
10386
- @extends Ember.CoreObject
10387
- @uses Ember.MutableEnumerable
10388
- @uses Ember.Copyable
10389
- @uses Ember.Freezable
10390
- @since Ember 0.9
10391
- */
10392
- Ember.Set = Ember.CoreObject.extend(Ember.MutableEnumerable, Ember.Copyable, Ember.Freezable,
10393
- /** @scope Ember.Set.prototype */ {
10520
+ // Loop over all of the keys in the namespace, looking for classes
10521
+ for(var key in root) {
10522
+ if (!hasOwnProp.call(root, key)) { continue; }
10523
+ var obj = root[key];
10394
10524
 
10395
- // ..........................................................
10396
- // IMPLEMENT ENUMERABLE APIS
10397
- //
10525
+ // If we are processing the `Ember` namespace, for example, the
10526
+ // `paths` will start with `["Ember"]`. Every iteration through
10527
+ // the loop will update the **second** element of this list with
10528
+ // the key, so processing `Ember.View` will make the Array
10529
+ // `['Ember', 'View']`.
10530
+ paths[idx] = key;
10398
10531
 
10399
- /**
10400
- This property will change as the number of objects in the set changes.
10532
+ // If we have found an unprocessed class
10533
+ if (obj && obj.toString === classToString) {
10534
+ // Replace the class' `toString` with the dot-separated path
10535
+ // and set its `NAME_KEY`
10536
+ obj.toString = makeToString(paths.join('.'));
10537
+ obj[NAME_KEY] = paths.join('.');
10401
10538
 
10402
- @property length
10403
- @type number
10404
- @default 0
10405
- */
10406
- length: 0,
10539
+ // Support nested namespaces
10540
+ } else if (obj && obj.isNamespace) {
10541
+ // Skip aliased namespaces
10542
+ if (seen[guidFor(obj)]) { continue; }
10543
+ seen[guidFor(obj)] = true;
10407
10544
 
10408
- /**
10409
- Clears the set. This is useful if you want to reuse an existing set
10410
- without having to recreate it.
10545
+ // Process the child namespace
10546
+ processNamespace(paths, obj, seen);
10547
+ }
10548
+ }
10411
10549
 
10412
- ```javascript
10413
- var colors = new Ember.Set(["red", "green", "blue"]);
10414
- colors.length; // 3
10415
- colors.clear();
10416
- colors.length; // 0
10417
- ```
10550
+ paths.length = idx; // cut out last item
10551
+ }
10418
10552
 
10419
- @method clear
10420
- @return {Ember.Set} An empty Set
10421
- */
10422
- clear: function() {
10423
- if (this.isFrozen) { throw new Error(Ember.FROZEN_ERROR); }
10553
+ function findNamespaces() {
10554
+ var Namespace = Ember.Namespace, lookup = Ember.lookup, obj, isNamespace;
10424
10555
 
10425
- var len = get(this, 'length');
10426
- if (len === 0) { return this; }
10556
+ if (Namespace.PROCESSED) { return; }
10427
10557
 
10428
- var guid;
10558
+ for (var prop in lookup) {
10559
+ // These don't raise exceptions but can cause warnings
10560
+ if (prop === "parent" || prop === "top" || prop === "frameElement") { continue; }
10429
10561
 
10430
- this.enumerableContentWillChange(len, 0);
10431
- Ember.propertyWillChange(this, 'firstObject');
10432
- Ember.propertyWillChange(this, 'lastObject');
10562
+ // get(window.globalStorage, 'isNamespace') would try to read the storage for domain isNamespace and cause exception in Firefox.
10563
+ // globalStorage is a storage obsoleted by the WhatWG storage specification. See https://developer.mozilla.org/en/DOM/Storage#globalStorage
10564
+ if (prop === "globalStorage" && lookup.StorageList && lookup.globalStorage instanceof lookup.StorageList) { continue; }
10565
+ // Unfortunately, some versions of IE don't support window.hasOwnProperty
10566
+ if (lookup.hasOwnProperty && !lookup.hasOwnProperty(prop)) { continue; }
10433
10567
 
10434
- for (var i=0; i < len; i++){
10435
- guid = guidFor(this[i]);
10436
- delete this[guid];
10437
- delete this[i];
10568
+ // At times we are not allowed to access certain properties for security reasons.
10569
+ // There are also times where even if we can access them, we are not allowed to access their properties.
10570
+ try {
10571
+ obj = Ember.lookup[prop];
10572
+ isNamespace = obj && obj.isNamespace;
10573
+ } catch (e) {
10574
+ continue;
10438
10575
  }
10439
10576
 
10440
- set(this, 'length', 0);
10577
+ if (isNamespace) {
10441
10578
 
10442
- Ember.propertyDidChange(this, 'firstObject');
10443
- Ember.propertyDidChange(this, 'lastObject');
10444
- this.enumerableContentDidChange(len, 0);
10579
+ obj[NAME_KEY] = prop;
10580
+ }
10581
+ }
10582
+ }
10445
10583
 
10446
- return this;
10447
- },
10584
+ var NAME_KEY = Ember.NAME_KEY = Ember.GUID_KEY + '_name';
10448
10585
 
10449
- /**
10450
- Returns true if the passed object is also an enumerable that contains the
10451
- same objects as the receiver.
10586
+ function superClassString(mixin) {
10587
+ var superclass = mixin.superclass;
10588
+ if (superclass) {
10589
+ if (superclass[NAME_KEY]) { return superclass[NAME_KEY]; }
10590
+ else { return superClassString(superclass); }
10591
+ } else {
10592
+ return;
10593
+ }
10594
+ }
10452
10595
 
10453
- ```javascript
10454
- var colors = ["red", "green", "blue"],
10455
- same_colors = new Ember.Set(colors);
10596
+ function classToString() {
10597
+ if (!Ember.BOOTED && !this[NAME_KEY]) {
10598
+ processAllNamespaces();
10599
+ }
10456
10600
 
10457
- same_colors.isEqual(colors); // true
10458
- same_colors.isEqual(["purple", "brown"]); // false
10459
- ```
10601
+ var ret;
10460
10602
 
10461
- @method isEqual
10462
- @param {Ember.Set} obj the other object.
10463
- @return {Boolean}
10464
- */
10465
- isEqual: function(obj) {
10466
- // fail fast
10467
- if (!Ember.Enumerable.detect(obj)) return false;
10603
+ if (this[NAME_KEY]) {
10604
+ ret = this[NAME_KEY];
10605
+ } else {
10606
+ var str = superClassString(this);
10607
+ if (str) {
10608
+ ret = "(subclass of " + str + ")";
10609
+ } else {
10610
+ ret = "(unknown mixin)";
10611
+ }
10612
+ this.toString = makeToString(ret);
10613
+ }
10468
10614
 
10469
- var loc = get(this, 'length');
10470
- if (get(obj, 'length') !== loc) return false;
10615
+ return ret;
10616
+ }
10471
10617
 
10472
- while(--loc >= 0) {
10473
- if (!obj.contains(this[loc])) return false;
10474
- }
10618
+ function processAllNamespaces() {
10619
+ var unprocessedNamespaces = !Namespace.PROCESSED,
10620
+ unprocessedMixins = Ember.anyUnprocessedMixins;
10475
10621
 
10476
- return true;
10477
- },
10622
+ if (unprocessedNamespaces) {
10623
+ findNamespaces();
10624
+ Namespace.PROCESSED = true;
10625
+ }
10478
10626
 
10479
- /**
10480
- Adds an object to the set. Only non-`null` objects can be added to a set
10481
- and those can only be added once. If the object is already in the set or
10482
- the passed value is null this method will have no effect.
10627
+ if (unprocessedNamespaces || unprocessedMixins) {
10628
+ var namespaces = Namespace.NAMESPACES, namespace;
10629
+ for (var i=0, l=namespaces.length; i<l; i++) {
10630
+ namespace = namespaces[i];
10631
+ processNamespace([namespace.toString()], namespace, {});
10632
+ }
10483
10633
 
10484
- This is an alias for `Ember.MutableEnumerable.addObject()`.
10634
+ Ember.anyUnprocessedMixins = false;
10635
+ }
10636
+ }
10485
10637
 
10486
- ```javascript
10487
- var colors = new Ember.Set();
10488
- colors.add("blue"); // ["blue"]
10489
- colors.add("blue"); // ["blue"]
10490
- colors.add("red"); // ["blue", "red"]
10491
- colors.add(null); // ["blue", "red"]
10492
- colors.add(undefined); // ["blue", "red"]
10493
- ```
10638
+ function makeToString(ret) {
10639
+ return function() { return ret; };
10640
+ }
10494
10641
 
10495
- @method add
10496
- @param {Object} obj The object to add.
10497
- @return {Ember.Set} The set itself.
10498
- */
10499
- add: Ember.aliasMethod('addObject'),
10642
+ Ember.Mixin.prototype.toString = classToString;
10500
10643
 
10501
- /**
10502
- Removes the object from the set if it is found. If you pass a `null` value
10503
- or an object that is already not in the set, this method will have no
10504
- effect. This is an alias for `Ember.MutableEnumerable.removeObject()`.
10644
+ })();
10505
10645
 
10506
- ```javascript
10507
- var colors = new Ember.Set(["red", "green", "blue"]);
10508
- colors.remove("red"); // ["blue", "green"]
10509
- colors.remove("purple"); // ["blue", "green"]
10510
- colors.remove(null); // ["blue", "green"]
10511
- ```
10512
10646
 
10513
- @method remove
10514
- @param {Object} obj The object to remove
10515
- @return {Ember.Set} The set itself.
10516
- */
10517
- remove: Ember.aliasMethod('removeObject'),
10518
10647
 
10519
- /**
10520
- Removes the last element from the set and returns it, or `null` if it's empty.
10648
+ (function() {
10649
+ Ember.Application = Ember.Namespace.extend();
10521
10650
 
10522
- ```javascript
10523
- var colors = new Ember.Set(["green", "blue"]);
10524
- colors.pop(); // "blue"
10525
- colors.pop(); // "green"
10526
- colors.pop(); // null
10527
- ```
10651
+ })();
10528
10652
 
10529
- @method pop
10530
- @return {Object} The removed object from the set or null.
10531
- */
10532
- pop: function() {
10533
- if (get(this, 'isFrozen')) throw new Error(Ember.FROZEN_ERROR);
10534
- var obj = this.length > 0 ? this[this.length-1] : null;
10535
- this.remove(obj);
10536
- return obj;
10537
- },
10538
10653
 
10539
- /**
10540
- Inserts the given object on to the end of the set. It returns
10541
- the set itself.
10542
10654
 
10543
- This is an alias for `Ember.MutableEnumerable.addObject()`.
10655
+ (function() {
10656
+ /**
10657
+ @module ember
10658
+ @submodule ember-runtime
10659
+ */
10544
10660
 
10545
- ```javascript
10546
- var colors = new Ember.Set();
10547
- colors.push("red"); // ["red"]
10548
- colors.push("green"); // ["red", "green"]
10549
- colors.push("blue"); // ["red", "green", "blue"]
10550
- ```
10661
+ var OUT_OF_RANGE_EXCEPTION = "Index out of range";
10662
+ var EMPTY = [];
10551
10663
 
10552
- @method push
10553
- @return {Ember.Set} The set itself.
10554
- */
10555
- push: Ember.aliasMethod('addObject'),
10664
+ var get = Ember.get, set = Ember.set;
10556
10665
 
10557
- /**
10558
- Removes the last element from the set and returns it, or `null` if it's empty.
10666
+ /**
10667
+ An ArrayProxy wraps any other object that implements `Ember.Array` and/or
10668
+ `Ember.MutableArray,` forwarding all requests. This makes it very useful for
10669
+ a number of binding use cases or other cases where being able to swap
10670
+ out the underlying array is useful.
10559
10671
 
10560
- This is an alias for `Ember.Set.pop()`.
10672
+ A simple example of usage:
10561
10673
 
10562
- ```javascript
10563
- var colors = new Ember.Set(["green", "blue"]);
10564
- colors.shift(); // "blue"
10565
- colors.shift(); // "green"
10566
- colors.shift(); // null
10567
- ```
10674
+ ```javascript
10675
+ var pets = ['dog', 'cat', 'fish'];
10676
+ var ap = Ember.ArrayProxy.create({ content: Ember.A(pets) });
10568
10677
 
10569
- @method shift
10570
- @return {Object} The removed object from the set or null.
10571
- */
10572
- shift: Ember.aliasMethod('pop'),
10678
+ ap.get('firstObject'); // 'dog'
10679
+ ap.set('content', ['amoeba', 'paramecium']);
10680
+ ap.get('firstObject'); // 'amoeba'
10681
+ ```
10573
10682
 
10574
- /**
10575
- Inserts the given object on to the end of the set. It returns
10576
- the set itself.
10683
+ This class can also be useful as a layer to transform the contents of
10684
+ an array, as they are accessed. This can be done by overriding
10685
+ `objectAtContent`:
10577
10686
 
10578
- This is an alias of `Ember.Set.push()`
10687
+ ```javascript
10688
+ var pets = ['dog', 'cat', 'fish'];
10689
+ var ap = Ember.ArrayProxy.create({
10690
+ content: Ember.A(pets),
10691
+ objectAtContent: function(idx) {
10692
+ return this.get('content').objectAt(idx).toUpperCase();
10693
+ }
10694
+ });
10579
10695
 
10580
- ```javascript
10581
- var colors = new Ember.Set();
10582
- colors.unshift("red"); // ["red"]
10583
- colors.unshift("green"); // ["red", "green"]
10584
- colors.unshift("blue"); // ["red", "green", "blue"]
10585
- ```
10696
+ ap.get('firstObject'); // . 'DOG'
10697
+ ```
10586
10698
 
10587
- @method unshift
10588
- @return {Ember.Set} The set itself.
10589
- */
10590
- unshift: Ember.aliasMethod('push'),
10699
+ @class ArrayProxy
10700
+ @namespace Ember
10701
+ @extends Ember.Object
10702
+ @uses Ember.MutableArray
10703
+ */
10704
+ Ember.ArrayProxy = Ember.Object.extend(Ember.MutableArray,
10705
+ /** @scope Ember.ArrayProxy.prototype */ {
10591
10706
 
10592
10707
  /**
10593
- Adds each object in the passed enumerable to the set.
10708
+ The content array. Must be an object that implements `Ember.Array` and/or
10709
+ `Ember.MutableArray.`
10594
10710
 
10595
- This is an alias of `Ember.MutableEnumerable.addObjects()`
10711
+ @property content
10712
+ @type Ember.Array
10713
+ */
10714
+ content: null,
10596
10715
 
10597
- ```javascript
10598
- var colors = new Ember.Set();
10599
- colors.addEach(["red", "green", "blue"]); // ["red", "green", "blue"]
10600
- ```
10716
+ /**
10717
+ The array that the proxy pretends to be. In the default `ArrayProxy`
10718
+ implementation, this and `content` are the same. Subclasses of `ArrayProxy`
10719
+ can override this property to provide things like sorting and filtering.
10601
10720
 
10602
- @method addEach
10603
- @param {Ember.Enumerable} objects the objects to add.
10604
- @return {Ember.Set} The set itself.
10721
+ @property arrangedContent
10605
10722
  */
10606
- addEach: Ember.aliasMethod('addObjects'),
10723
+ arrangedContent: Ember.computed.alias('content'),
10607
10724
 
10608
10725
  /**
10609
- Removes each object in the passed enumerable to the set.
10610
-
10611
- This is an alias of `Ember.MutableEnumerable.removeObjects()`
10726
+ Should actually retrieve the object at the specified index from the
10727
+ content. You can override this method in subclasses to transform the
10728
+ content item to something new.
10612
10729
 
10613
- ```javascript
10614
- var colors = new Ember.Set(["red", "green", "blue"]);
10615
- colors.removeEach(["red", "blue"]); // ["green"]
10616
- ```
10730
+ This method will only be called if content is non-`null`.
10617
10731
 
10618
- @method removeEach
10619
- @param {Ember.Enumerable} objects the objects to remove.
10620
- @return {Ember.Set} The set itself.
10732
+ @method objectAtContent
10733
+ @param {Number} idx The index to retrieve.
10734
+ @return {Object} the value or undefined if none found
10621
10735
  */
10622
- removeEach: Ember.aliasMethod('removeObjects'),
10736
+ objectAtContent: function(idx) {
10737
+ return get(this, 'arrangedContent').objectAt(idx);
10738
+ },
10623
10739
 
10624
- // ..........................................................
10625
- // PRIVATE ENUMERABLE SUPPORT
10626
- //
10740
+ /**
10741
+ Should actually replace the specified objects on the content array.
10742
+ You can override this method in subclasses to transform the content item
10743
+ into something new.
10627
10744
 
10628
- init: function(items) {
10629
- this._super();
10630
- if (items) this.addObjects(items);
10631
- },
10745
+ This method will only be called if content is non-`null`.
10632
10746
 
10633
- // implement Ember.Enumerable
10634
- nextObject: function(idx) {
10635
- return this[idx];
10747
+ @method replaceContent
10748
+ @param {Number} idx The starting index
10749
+ @param {Number} amt The number of items to remove from the content.
10750
+ @param {Array} objects Optional array of objects to insert or null if no
10751
+ objects.
10752
+ @return {void}
10753
+ */
10754
+ replaceContent: function(idx, amt, objects) {
10755
+ get(this, 'content').replace(idx, amt, objects);
10636
10756
  },
10637
10757
 
10638
- // more optimized version
10639
- firstObject: Ember.computed(function() {
10640
- return this.length > 0 ? this[0] : undefined;
10641
- }),
10758
+ /**
10759
+ @private
10642
10760
 
10643
- // more optimized version
10644
- lastObject: Ember.computed(function() {
10645
- return this.length > 0 ? this[this.length-1] : undefined;
10646
- }),
10761
+ Invoked when the content property is about to change. Notifies observers that the
10762
+ entire array content will change.
10647
10763
 
10648
- // implements Ember.MutableEnumerable
10649
- addObject: function(obj) {
10650
- if (get(this, 'isFrozen')) throw new Error(Ember.FROZEN_ERROR);
10651
- if (none(obj)) return this; // nothing to do
10764
+ @method _contentWillChange
10765
+ */
10766
+ _contentWillChange: Ember.beforeObserver(function() {
10767
+ this._teardownContent();
10768
+ }, 'content'),
10652
10769
 
10653
- var guid = guidFor(obj),
10654
- idx = this[guid],
10655
- len = get(this, 'length'),
10656
- added ;
10770
+ _teardownContent: function() {
10771
+ var content = get(this, 'content');
10657
10772
 
10658
- if (idx>=0 && idx<len && (this[idx] === obj)) return this; // added
10773
+ if (content) {
10774
+ content.removeArrayObserver(this, {
10775
+ willChange: 'contentArrayWillChange',
10776
+ didChange: 'contentArrayDidChange'
10777
+ });
10778
+ }
10779
+ },
10659
10780
 
10660
- added = [obj];
10781
+ contentArrayWillChange: Ember.K,
10782
+ contentArrayDidChange: Ember.K,
10661
10783
 
10662
- this.enumerableContentWillChange(null, added);
10663
- Ember.propertyWillChange(this, 'lastObject');
10784
+ /**
10785
+ @private
10664
10786
 
10665
- len = get(this, 'length');
10666
- this[guid] = len;
10667
- this[len] = obj;
10668
- set(this, 'length', len+1);
10787
+ Invoked when the content property changes. Notifies observers that the
10788
+ entire array content has changed.
10669
10789
 
10670
- Ember.propertyDidChange(this, 'lastObject');
10671
- this.enumerableContentDidChange(null, added);
10790
+ @method _contentDidChange
10791
+ */
10792
+ _contentDidChange: Ember.observer(function() {
10793
+ var content = get(this, 'content');
10672
10794
 
10673
- return this;
10795
+
10796
+ this._setupContent();
10797
+ }, 'content'),
10798
+
10799
+ _setupContent: function() {
10800
+ var content = get(this, 'content');
10801
+
10802
+ if (content) {
10803
+ content.addArrayObserver(this, {
10804
+ willChange: 'contentArrayWillChange',
10805
+ didChange: 'contentArrayDidChange'
10806
+ });
10807
+ }
10674
10808
  },
10675
10809
 
10676
- // implements Ember.MutableEnumerable
10677
- removeObject: function(obj) {
10678
- if (get(this, 'isFrozen')) throw new Error(Ember.FROZEN_ERROR);
10679
- if (none(obj)) return this; // nothing to do
10810
+ _arrangedContentWillChange: Ember.beforeObserver(function() {
10811
+ var arrangedContent = get(this, 'arrangedContent'),
10812
+ len = arrangedContent ? get(arrangedContent, 'length') : 0;
10680
10813
 
10681
- var guid = guidFor(obj),
10682
- idx = this[guid],
10683
- len = get(this, 'length'),
10684
- isFirst = idx === 0,
10685
- isLast = idx === len-1,
10686
- last, removed;
10814
+ this.arrangedContentArrayWillChange(this, 0, len, undefined);
10815
+ this.arrangedContentWillChange(this);
10687
10816
 
10817
+ this._teardownArrangedContent(arrangedContent);
10818
+ }, 'arrangedContent'),
10688
10819
 
10689
- if (idx>=0 && idx<len && (this[idx] === obj)) {
10690
- removed = [obj];
10820
+ _arrangedContentDidChange: Ember.observer(function() {
10821
+ var arrangedContent = get(this, 'arrangedContent'),
10822
+ len = arrangedContent ? get(arrangedContent, 'length') : 0;
10691
10823
 
10692
- this.enumerableContentWillChange(removed, null);
10693
- if (isFirst) { Ember.propertyWillChange(this, 'firstObject'); }
10694
- if (isLast) { Ember.propertyWillChange(this, 'lastObject'); }
10695
10824
 
10696
- // swap items - basically move the item to the end so it can be removed
10697
- if (idx < len-1) {
10698
- last = this[len-1];
10699
- this[idx] = last;
10700
- this[guidFor(last)] = idx;
10701
- }
10825
+ this._setupArrangedContent();
10702
10826
 
10703
- delete this[guid];
10704
- delete this[len-1];
10705
- set(this, 'length', len-1);
10827
+ this.arrangedContentDidChange(this);
10828
+ this.arrangedContentArrayDidChange(this, 0, undefined, len);
10829
+ }, 'arrangedContent'),
10706
10830
 
10707
- if (isFirst) { Ember.propertyDidChange(this, 'firstObject'); }
10708
- if (isLast) { Ember.propertyDidChange(this, 'lastObject'); }
10709
- this.enumerableContentDidChange(removed, null);
10710
- }
10831
+ _setupArrangedContent: function() {
10832
+ var arrangedContent = get(this, 'arrangedContent');
10711
10833
 
10712
- return this;
10834
+ if (arrangedContent) {
10835
+ arrangedContent.addArrayObserver(this, {
10836
+ willChange: 'arrangedContentArrayWillChange',
10837
+ didChange: 'arrangedContentArrayDidChange'
10838
+ });
10839
+ }
10713
10840
  },
10714
10841
 
10715
- // optimized version
10716
- contains: function(obj) {
10717
- return this[guidFor(obj)]>=0;
10718
- },
10842
+ _teardownArrangedContent: function() {
10843
+ var arrangedContent = get(this, 'arrangedContent');
10719
10844
 
10720
- copy: function() {
10721
- var C = this.constructor, ret = new C(), loc = get(this, 'length');
10722
- set(ret, 'length', loc);
10723
- while(--loc>=0) {
10724
- ret[loc] = this[loc];
10725
- ret[guidFor(this[loc])] = loc;
10845
+ if (arrangedContent) {
10846
+ arrangedContent.removeArrayObserver(this, {
10847
+ willChange: 'arrangedContentArrayWillChange',
10848
+ didChange: 'arrangedContentArrayDidChange'
10849
+ });
10726
10850
  }
10727
- return ret;
10728
10851
  },
10729
10852
 
10730
- toString: function() {
10731
- var len = this.length, idx, array = [];
10732
- for(idx = 0; idx < len; idx++) {
10733
- array[idx] = this[idx];
10734
- }
10735
- return "Ember.Set<%@>".fmt(array.join(','));
10736
- }
10853
+ arrangedContentWillChange: Ember.K,
10854
+ arrangedContentDidChange: Ember.K,
10737
10855
 
10738
- });
10856
+ objectAt: function(idx) {
10857
+ return get(this, 'content') && this.objectAtContent(idx);
10858
+ },
10739
10859
 
10740
- })();
10860
+ length: Ember.computed(function() {
10861
+ var arrangedContent = get(this, 'arrangedContent');
10862
+ return arrangedContent ? get(arrangedContent, 'length') : 0;
10863
+ // No dependencies since Enumerable notifies length of change
10864
+ }),
10741
10865
 
10866
+ _replace: function(idx, amt, objects) {
10867
+ var content = get(this, 'content');
10742
10868
 
10869
+ if (content) this.replaceContent(idx, amt, objects);
10870
+ return this;
10871
+ },
10743
10872
 
10744
- (function() {
10745
- /**
10746
- @module ember
10747
- @submodule ember-runtime
10748
- */
10873
+ replace: function() {
10874
+ if (get(this, 'arrangedContent') === get(this, 'content')) {
10875
+ this._replace.apply(this, arguments);
10876
+ } else {
10877
+ throw new Ember.Error("Using replace on an arranged ArrayProxy is not allowed.");
10878
+ }
10879
+ },
10749
10880
 
10750
- /**
10751
- `Ember.Object` is the main base class for all Ember objects. It is a subclass
10752
- of `Ember.CoreObject` with the `Ember.Observable` mixin applied. For details,
10753
- see the documentation for each of these.
10881
+ _insertAt: function(idx, object) {
10882
+ if (idx > get(this, 'content.length')) throw new Error(OUT_OF_RANGE_EXCEPTION);
10883
+ this._replace(idx, 0, [object]);
10884
+ return this;
10885
+ },
10754
10886
 
10755
- @class Object
10756
- @namespace Ember
10757
- @extends Ember.CoreObject
10758
- @uses Ember.Observable
10759
- */
10760
- Ember.Object = Ember.CoreObject.extend(Ember.Observable);
10761
- Ember.Object.toString = function() { return "Ember.Object"; };
10887
+ insertAt: function(idx, object) {
10888
+ if (get(this, 'arrangedContent') === get(this, 'content')) {
10889
+ return this._insertAt(idx, object);
10890
+ } else {
10891
+ throw new Ember.Error("Using insertAt on an arranged ArrayProxy is not allowed.");
10892
+ }
10893
+ },
10762
10894
 
10763
- })();
10895
+ removeAt: function(start, len) {
10896
+ if ('number' === typeof start) {
10897
+ var content = get(this, 'content'),
10898
+ arrangedContent = get(this, 'arrangedContent'),
10899
+ indices = [], i;
10764
10900
 
10901
+ if ((start < 0) || (start >= get(this, 'length'))) {
10902
+ throw new Error(OUT_OF_RANGE_EXCEPTION);
10903
+ }
10765
10904
 
10905
+ if (len === undefined) len = 1;
10766
10906
 
10767
- (function() {
10768
- /**
10769
- @module ember
10770
- @submodule ember-runtime
10771
- */
10907
+ // Get a list of indices in original content to remove
10908
+ for (i=start; i<start+len; i++) {
10909
+ // Use arrangedContent here so we avoid confusion with objects transformed by objectAtContent
10910
+ indices.push(content.indexOf(arrangedContent.objectAt(i)));
10911
+ }
10772
10912
 
10773
- var get = Ember.get, indexOf = Ember.ArrayPolyfills.indexOf;
10913
+ // Replace in reverse order since indices will change
10914
+ indices.sort(function(a,b) { return b - a; });
10774
10915
 
10775
- /**
10776
- A Namespace is an object usually used to contain other objects or methods
10777
- such as an application or framework. Create a namespace anytime you want
10778
- to define one of these new containers.
10916
+ Ember.beginPropertyChanges();
10917
+ for (i=0; i<indices.length; i++) {
10918
+ this._replace(indices[i], 1, EMPTY);
10919
+ }
10920
+ Ember.endPropertyChanges();
10921
+ }
10779
10922
 
10780
- # Example Usage
10923
+ return this ;
10924
+ },
10781
10925
 
10782
- ```javascript
10783
- MyFramework = Ember.Namespace.create({
10784
- VERSION: '1.0.0'
10785
- });
10786
- ```
10926
+ pushObject: function(obj) {
10927
+ this._insertAt(get(this, 'content.length'), obj) ;
10928
+ return obj ;
10929
+ },
10787
10930
 
10788
- @class Namespace
10789
- @namespace Ember
10790
- @extends Ember.Object
10791
- */
10792
- var Namespace = Ember.Namespace = Ember.Object.extend({
10793
- isNamespace: true,
10931
+ pushObjects: function(objects) {
10932
+ this._replace(get(this, 'length'), 0, objects);
10933
+ return this;
10934
+ },
10794
10935
 
10795
- init: function() {
10796
- Ember.Namespace.NAMESPACES.push(this);
10797
- Ember.Namespace.PROCESSED = false;
10936
+ setObjects: function(objects) {
10937
+ if (objects.length === 0) return this.clear();
10938
+
10939
+ var len = get(this, 'length');
10940
+ this._replace(0, len, objects);
10941
+ return this;
10798
10942
  },
10799
10943
 
10800
- toString: function() {
10801
- var name = get(this, 'name');
10802
- if (name) { return name; }
10944
+ unshiftObject: function(obj) {
10945
+ this._insertAt(0, obj) ;
10946
+ return obj ;
10947
+ },
10803
10948
 
10804
- findNamespaces();
10805
- return this[Ember.GUID_KEY+'_name'];
10949
+ unshiftObjects: function(objects) {
10950
+ this._replace(0, 0, objects);
10951
+ return this;
10806
10952
  },
10807
10953
 
10808
- nameClasses: function() {
10809
- processNamespace([this.toString()], this, {});
10954
+ slice: function() {
10955
+ var arr = this.toArray();
10956
+ return arr.slice.apply(arr, arguments);
10810
10957
  },
10811
10958
 
10812
- destroy: function() {
10813
- var namespaces = Ember.Namespace.NAMESPACES;
10814
- Ember.lookup[this.toString()] = undefined;
10815
- namespaces.splice(indexOf.call(namespaces, this), 1);
10959
+ arrangedContentArrayWillChange: function(item, idx, removedCnt, addedCnt) {
10960
+ this.arrayContentWillChange(idx, removedCnt, addedCnt);
10961
+ },
10962
+
10963
+ arrangedContentArrayDidChange: function(item, idx, removedCnt, addedCnt) {
10964
+ this.arrayContentDidChange(idx, removedCnt, addedCnt);
10965
+ },
10966
+
10967
+ init: function() {
10816
10968
  this._super();
10969
+ this._setupContent();
10970
+ this._setupArrangedContent();
10971
+ },
10972
+
10973
+ willDestroy: function() {
10974
+ this._teardownArrangedContent();
10975
+ this._teardownContent();
10817
10976
  }
10818
10977
  });
10819
10978
 
10820
- Namespace.reopenClass({
10821
- NAMESPACES: [Ember],
10822
- NAMESPACES_BY_ID: {},
10823
- PROCESSED: false,
10824
- processAll: processAllNamespaces,
10825
- byName: function(name) {
10826
- if (!Ember.BOOTED) {
10827
- processAllNamespaces();
10828
- }
10829
-
10830
- return NAMESPACES_BY_ID[name];
10831
- }
10832
- });
10833
-
10834
- var NAMESPACES_BY_ID = Namespace.NAMESPACES_BY_ID;
10835
-
10836
- var hasOwnProp = ({}).hasOwnProperty,
10837
- guidFor = Ember.guidFor;
10838
-
10839
- function processNamespace(paths, root, seen) {
10840
- var idx = paths.length;
10841
10979
 
10842
- NAMESPACES_BY_ID[paths.join('.')] = root;
10980
+ })();
10843
10981
 
10844
- // Loop over all of the keys in the namespace, looking for classes
10845
- for(var key in root) {
10846
- if (!hasOwnProp.call(root, key)) { continue; }
10847
- var obj = root[key];
10848
10982
 
10849
- // If we are processing the `Ember` namespace, for example, the
10850
- // `paths` will start with `["Ember"]`. Every iteration through
10851
- // the loop will update the **second** element of this list with
10852
- // the key, so processing `Ember.View` will make the Array
10853
- // `['Ember', 'View']`.
10854
- paths[idx] = key;
10855
10983
 
10856
- // If we have found an unprocessed class
10857
- if (obj && obj.toString === classToString) {
10858
- // Replace the class' `toString` with the dot-separated path
10859
- // and set its `NAME_KEY`
10860
- obj.toString = makeToString(paths.join('.'));
10861
- obj[NAME_KEY] = paths.join('.');
10984
+ (function() {
10985
+ /**
10986
+ @module ember
10987
+ @submodule ember-runtime
10988
+ */
10862
10989
 
10863
- // Support nested namespaces
10864
- } else if (obj && obj.isNamespace) {
10865
- // Skip aliased namespaces
10866
- if (seen[guidFor(obj)]) { continue; }
10867
- seen[guidFor(obj)] = true;
10990
+ var get = Ember.get,
10991
+ set = Ember.set,
10992
+ fmt = Ember.String.fmt,
10993
+ addBeforeObserver = Ember.addBeforeObserver,
10994
+ addObserver = Ember.addObserver,
10995
+ removeBeforeObserver = Ember.removeBeforeObserver,
10996
+ removeObserver = Ember.removeObserver,
10997
+ propertyWillChange = Ember.propertyWillChange,
10998
+ propertyDidChange = Ember.propertyDidChange;
10868
10999
 
10869
- // Process the child namespace
10870
- processNamespace(paths, obj, seen);
10871
- }
10872
- }
11000
+ function contentPropertyWillChange(content, contentKey) {
11001
+ var key = contentKey.slice(8); // remove "content."
11002
+ if (key in this) { return; } // if shadowed in proxy
11003
+ propertyWillChange(this, key);
11004
+ }
10873
11005
 
10874
- paths.length = idx; // cut out last item
11006
+ function contentPropertyDidChange(content, contentKey) {
11007
+ var key = contentKey.slice(8); // remove "content."
11008
+ if (key in this) { return; } // if shadowed in proxy
11009
+ propertyDidChange(this, key);
10875
11010
  }
10876
11011
 
10877
- function findNamespaces() {
10878
- var Namespace = Ember.Namespace, lookup = Ember.lookup, obj, isNamespace;
11012
+ /**
11013
+ `Ember.ObjectProxy` forwards all properties not defined by the proxy itself
11014
+ to a proxied `content` object.
10879
11015
 
10880
- if (Namespace.PROCESSED) { return; }
11016
+ ```javascript
11017
+ object = Ember.Object.create({
11018
+ name: 'Foo'
11019
+ });
10881
11020
 
10882
- for (var prop in lookup) {
10883
- // These don't raise exceptions but can cause warnings
10884
- if (prop === "parent" || prop === "top" || prop === "frameElement") { continue; }
11021
+ proxy = Ember.ObjectProxy.create({
11022
+ content: object
11023
+ });
10885
11024
 
10886
- // get(window.globalStorage, 'isNamespace') would try to read the storage for domain isNamespace and cause exception in Firefox.
10887
- // globalStorage is a storage obsoleted by the WhatWG storage specification. See https://developer.mozilla.org/en/DOM/Storage#globalStorage
10888
- if (prop === "globalStorage" && lookup.StorageList && lookup.globalStorage instanceof lookup.StorageList) { continue; }
10889
- // Unfortunately, some versions of IE don't support window.hasOwnProperty
10890
- if (lookup.hasOwnProperty && !lookup.hasOwnProperty(prop)) { continue; }
11025
+ // Access and change existing properties
11026
+ proxy.get('name') // 'Foo'
11027
+ proxy.set('name', 'Bar');
11028
+ object.get('name') // 'Bar'
10891
11029
 
10892
- // At times we are not allowed to access certain properties for security reasons.
10893
- // There are also times where even if we can access them, we are not allowed to access their properties.
10894
- try {
10895
- obj = Ember.lookup[prop];
10896
- isNamespace = obj && obj.isNamespace;
10897
- } catch (e) {
10898
- continue;
10899
- }
11030
+ // Create new 'description' property on `object`
11031
+ proxy.set('description', 'Foo is a whizboo baz');
11032
+ object.get('description') // 'Foo is a whizboo baz'
11033
+ ```
10900
11034
 
10901
- if (isNamespace) {
11035
+ While `content` is unset, setting a property to be delegated will throw an
11036
+ Error.
10902
11037
 
10903
- obj[NAME_KEY] = prop;
10904
- }
10905
- }
10906
- }
11038
+ ```javascript
11039
+ proxy = Ember.ObjectProxy.create({
11040
+ content: null,
11041
+ flag: null
11042
+ });
11043
+ proxy.set('flag', true);
11044
+ proxy.get('flag'); // true
11045
+ proxy.get('foo'); // undefined
11046
+ proxy.set('foo', 'data'); // throws Error
11047
+ ```
10907
11048
 
10908
- var NAME_KEY = Ember.NAME_KEY = Ember.GUID_KEY + '_name';
11049
+ Delegated properties can be bound to and will change when content is updated.
10909
11050
 
10910
- function superClassString(mixin) {
10911
- var superclass = mixin.superclass;
10912
- if (superclass) {
10913
- if (superclass[NAME_KEY]) { return superclass[NAME_KEY]; }
10914
- else { return superClassString(superclass); }
10915
- } else {
10916
- return;
10917
- }
10918
- }
11051
+ Computed properties on the proxy itself can depend on delegated properties.
10919
11052
 
10920
- function classToString() {
10921
- if (!Ember.BOOTED && !this[NAME_KEY]) {
10922
- processAllNamespaces();
10923
- }
11053
+ ```javascript
11054
+ ProxyWithComputedProperty = Ember.ObjectProxy.extend({
11055
+ fullName: function () {
11056
+ var firstName = this.get('firstName'),
11057
+ lastName = this.get('lastName');
11058
+ if (firstName && lastName) {
11059
+ return firstName + ' ' + lastName;
11060
+ }
11061
+ return firstName || lastName;
11062
+ }.property('firstName', 'lastName')
11063
+ });
10924
11064
 
10925
- var ret;
11065
+ proxy = ProxyWithComputedProperty.create();
10926
11066
 
10927
- if (this[NAME_KEY]) {
10928
- ret = this[NAME_KEY];
10929
- } else {
10930
- var str = superClassString(this);
10931
- if (str) {
10932
- ret = "(subclass of " + str + ")";
10933
- } else {
10934
- ret = "(unknown mixin)";
10935
- }
10936
- this.toString = makeToString(ret);
10937
- }
11067
+ proxy.get('fullName'); // undefined
11068
+ proxy.set('content', {
11069
+ firstName: 'Tom', lastName: 'Dale'
11070
+ }); // triggers property change for fullName on proxy
10938
11071
 
10939
- return ret;
10940
- }
11072
+ proxy.get('fullName'); // 'Tom Dale'
11073
+ ```
10941
11074
 
10942
- function processAllNamespaces() {
10943
- var unprocessedNamespaces = !Namespace.PROCESSED,
10944
- unprocessedMixins = Ember.anyUnprocessedMixins;
11075
+ @class ObjectProxy
11076
+ @namespace Ember
11077
+ @extends Ember.Object
11078
+ */
11079
+ Ember.ObjectProxy = Ember.Object.extend(
11080
+ /** @scope Ember.ObjectProxy.prototype */ {
11081
+ /**
11082
+ The object whose properties will be forwarded.
10945
11083
 
10946
- if (unprocessedNamespaces) {
10947
- findNamespaces();
10948
- Namespace.PROCESSED = true;
10949
- }
11084
+ @property content
11085
+ @type Ember.Object
11086
+ @default null
11087
+ */
11088
+ content: null,
11089
+ _contentDidChange: Ember.observer(function() {
10950
11090
 
10951
- if (unprocessedNamespaces || unprocessedMixins) {
10952
- var namespaces = Namespace.NAMESPACES, namespace;
10953
- for (var i=0, l=namespaces.length; i<l; i++) {
10954
- namespace = namespaces[i];
10955
- processNamespace([namespace.toString()], namespace, {});
10956
- }
11091
+ }, 'content'),
10957
11092
 
10958
- Ember.anyUnprocessedMixins = false;
10959
- }
10960
- }
11093
+ isTruthy: Ember.computed.bool('content'),
10961
11094
 
10962
- function makeToString(ret) {
10963
- return function() { return ret; };
10964
- }
11095
+ _debugContainerKey: null,
10965
11096
 
10966
- Ember.Mixin.prototype.toString = classToString;
11097
+ willWatchProperty: function (key) {
11098
+ var contentKey = 'content.' + key;
11099
+ addBeforeObserver(this, contentKey, null, contentPropertyWillChange);
11100
+ addObserver(this, contentKey, null, contentPropertyDidChange);
11101
+ },
10967
11102
 
10968
- })();
11103
+ didUnwatchProperty: function (key) {
11104
+ var contentKey = 'content.' + key;
11105
+ removeBeforeObserver(this, contentKey, null, contentPropertyWillChange);
11106
+ removeObserver(this, contentKey, null, contentPropertyDidChange);
11107
+ },
11108
+
11109
+ unknownProperty: function (key) {
11110
+ var content = get(this, 'content');
11111
+ if (content) {
11112
+ return get(content, key);
11113
+ }
11114
+ },
10969
11115
 
11116
+ setUnknownProperty: function (key, value) {
11117
+ var content = get(this, 'content');
10970
11118
 
11119
+ return set(content, key, value);
11120
+ }
11121
+ });
10971
11122
 
10972
- (function() {
10973
- Ember.Application = Ember.Namespace.extend();
11123
+ Ember.ObjectProxy.reopenClass({
11124
+ create: function () {
11125
+ var mixin, prototype, i, l, properties, keyName;
11126
+ if (arguments.length) {
11127
+ prototype = this.proto();
11128
+ for (i = 0, l = arguments.length; i < l; i++) {
11129
+ properties = arguments[i];
11130
+ for (keyName in properties) {
11131
+ if (!properties.hasOwnProperty(keyName) || keyName in prototype) { continue; }
11132
+ if (!mixin) mixin = {};
11133
+ mixin[keyName] = null;
11134
+ }
11135
+ }
11136
+ if (mixin) this._initMixins([mixin]);
11137
+ }
11138
+ return this._super.apply(this, arguments);
11139
+ }
11140
+ });
10974
11141
 
10975
11142
  })();
10976
11143
 
@@ -10983,234 +11150,361 @@ Ember.Application = Ember.Namespace.extend();
10983
11150
  */
10984
11151
 
10985
11152
 
10986
- var get = Ember.get, set = Ember.set;
11153
+ var set = Ember.set, get = Ember.get, guidFor = Ember.guidFor;
11154
+ var forEach = Ember.EnumerableUtils.forEach;
10987
11155
 
10988
- /**
10989
- An ArrayProxy wraps any other object that implements `Ember.Array` and/or
10990
- `Ember.MutableArray,` forwarding all requests. This makes it very useful for
10991
- a number of binding use cases or other cases where being able to swap
10992
- out the underlying array is useful.
11156
+ var EachArray = Ember.Object.extend(Ember.Array, {
10993
11157
 
10994
- A simple example of usage:
11158
+ init: function(content, keyName, owner) {
11159
+ this._super();
11160
+ this._keyName = keyName;
11161
+ this._owner = owner;
11162
+ this._content = content;
11163
+ },
10995
11164
 
10996
- ```javascript
10997
- var pets = ['dog', 'cat', 'fish'];
10998
- var ap = Ember.ArrayProxy.create({ content: Ember.A(pets) });
11165
+ objectAt: function(idx) {
11166
+ var item = this._content.objectAt(idx);
11167
+ return item && get(item, this._keyName);
11168
+ },
10999
11169
 
11000
- ap.get('firstObject'); // 'dog'
11001
- ap.set('content', ['amoeba', 'paramecium']);
11002
- ap.get('firstObject'); // 'amoeba'
11003
- ```
11170
+ length: Ember.computed(function() {
11171
+ var content = this._content;
11172
+ return content ? get(content, 'length') : 0;
11173
+ })
11004
11174
 
11005
- This class can also be useful as a layer to transform the contents of
11006
- an array, as they are accessed. This can be done by overriding
11007
- `objectAtContent`:
11175
+ });
11008
11176
 
11009
- ```javascript
11010
- var pets = ['dog', 'cat', 'fish'];
11011
- var ap = Ember.ArrayProxy.create({
11012
- content: Ember.A(pets),
11013
- objectAtContent: function(idx) {
11014
- return this.get('content').objectAt(idx).toUpperCase();
11015
- }
11016
- });
11177
+ var IS_OBSERVER = /^.+:(before|change)$/;
11017
11178
 
11018
- ap.get('firstObject'); // . 'DOG'
11019
- ```
11179
+ function addObserverForContentKey(content, keyName, proxy, idx, loc) {
11180
+ var objects = proxy._objects, guid;
11181
+ if (!objects) objects = proxy._objects = {};
11020
11182
 
11021
- @class ArrayProxy
11183
+ while(--loc>=idx) {
11184
+ var item = content.objectAt(loc);
11185
+ if (item) {
11186
+ Ember.addBeforeObserver(item, keyName, proxy, 'contentKeyWillChange');
11187
+ Ember.addObserver(item, keyName, proxy, 'contentKeyDidChange');
11188
+
11189
+ // keep track of the index each item was found at so we can map
11190
+ // it back when the obj changes.
11191
+ guid = guidFor(item);
11192
+ if (!objects[guid]) objects[guid] = [];
11193
+ objects[guid].push(loc);
11194
+ }
11195
+ }
11196
+ }
11197
+
11198
+ function removeObserverForContentKey(content, keyName, proxy, idx, loc) {
11199
+ var objects = proxy._objects;
11200
+ if (!objects) objects = proxy._objects = {};
11201
+ var indicies, guid;
11202
+
11203
+ while(--loc>=idx) {
11204
+ var item = content.objectAt(loc);
11205
+ if (item) {
11206
+ Ember.removeBeforeObserver(item, keyName, proxy, 'contentKeyWillChange');
11207
+ Ember.removeObserver(item, keyName, proxy, 'contentKeyDidChange');
11208
+
11209
+ guid = guidFor(item);
11210
+ indicies = objects[guid];
11211
+ indicies[indicies.indexOf(loc)] = null;
11212
+ }
11213
+ }
11214
+ }
11215
+
11216
+ /**
11217
+ This is the object instance returned when you get the `@each` property on an
11218
+ array. It uses the unknownProperty handler to automatically create
11219
+ EachArray instances for property names.
11220
+
11221
+ @private
11222
+ @class EachProxy
11022
11223
  @namespace Ember
11023
11224
  @extends Ember.Object
11024
- @uses Ember.MutableArray
11025
11225
  */
11026
- Ember.ArrayProxy = Ember.Object.extend(Ember.MutableArray,
11027
- /** @scope Ember.ArrayProxy.prototype */ {
11226
+ Ember.EachProxy = Ember.Object.extend({
11028
11227
 
11029
- /**
11030
- The content array. Must be an object that implements `Ember.Array` and/or
11031
- `Ember.MutableArray.`
11228
+ init: function(content) {
11229
+ this._super();
11230
+ this._content = content;
11231
+ content.addArrayObserver(this);
11032
11232
 
11033
- @property content
11034
- @type Ember.Array
11035
- */
11036
- content: null,
11233
+ // in case someone is already observing some keys make sure they are
11234
+ // added
11235
+ forEach(Ember.watchedEvents(this), function(eventName) {
11236
+ this.didAddListener(eventName);
11237
+ }, this);
11238
+ },
11037
11239
 
11038
11240
  /**
11039
- The array that the proxy pretends to be. In the default `ArrayProxy`
11040
- implementation, this and `content` are the same. Subclasses of `ArrayProxy`
11041
- can override this property to provide things like sorting and filtering.
11241
+ You can directly access mapped properties by simply requesting them.
11242
+ The `unknownProperty` handler will generate an EachArray of each item.
11042
11243
 
11043
- @property arrangedContent
11244
+ @method unknownProperty
11245
+ @param keyName {String}
11246
+ @param value {anything}
11044
11247
  */
11045
- arrangedContent: Ember.computed.alias('content'),
11248
+ unknownProperty: function(keyName, value) {
11249
+ var ret;
11250
+ ret = new EachArray(this._content, keyName, this);
11251
+ Ember.defineProperty(this, keyName, null, ret);
11252
+ this.beginObservingContentKey(keyName);
11253
+ return ret;
11254
+ },
11046
11255
 
11047
- /**
11048
- Should actually retrieve the object at the specified index from the
11049
- content. You can override this method in subclasses to transform the
11050
- content item to something new.
11256
+ // ..........................................................
11257
+ // ARRAY CHANGES
11258
+ // Invokes whenever the content array itself changes.
11051
11259
 
11052
- This method will only be called if content is non-`null`.
11260
+ arrayWillChange: function(content, idx, removedCnt, addedCnt) {
11261
+ var keys = this._keys, key, lim;
11053
11262
 
11054
- @method objectAtContent
11055
- @param {Number} idx The index to retrieve.
11056
- @return {Object} the value or undefined if none found
11057
- */
11058
- objectAtContent: function(idx) {
11059
- return get(this, 'arrangedContent').objectAt(idx);
11060
- },
11263
+ lim = removedCnt>0 ? idx+removedCnt : -1;
11264
+ Ember.beginPropertyChanges(this);
11061
11265
 
11062
- /**
11063
- Should actually replace the specified objects on the content array.
11064
- You can override this method in subclasses to transform the content item
11065
- into something new.
11266
+ for(key in keys) {
11267
+ if (!keys.hasOwnProperty(key)) { continue; }
11066
11268
 
11067
- This method will only be called if content is non-`null`.
11269
+ if (lim>0) removeObserverForContentKey(content, key, this, idx, lim);
11068
11270
 
11069
- @method replaceContent
11070
- @param {Number} idx The starting index
11071
- @param {Number} amt The number of items to remove from the content.
11072
- @param {Array} objects Optional array of objects to insert or null if no
11073
- objects.
11074
- @return {void}
11075
- */
11076
- replaceContent: function(idx, amt, objects) {
11077
- get(this, 'content').replace(idx, amt, objects);
11271
+ Ember.propertyWillChange(this, key);
11272
+ }
11273
+
11274
+ Ember.propertyWillChange(this._content, '@each');
11275
+ Ember.endPropertyChanges(this);
11078
11276
  },
11079
11277
 
11080
- /**
11081
- @private
11278
+ arrayDidChange: function(content, idx, removedCnt, addedCnt) {
11279
+ var keys = this._keys, key, lim;
11082
11280
 
11083
- Invoked when the content property is about to change. Notifies observers that the
11084
- entire array content will change.
11281
+ lim = addedCnt>0 ? idx+addedCnt : -1;
11282
+ Ember.beginPropertyChanges(this);
11085
11283
 
11086
- @method _contentWillChange
11087
- */
11088
- _contentWillChange: Ember.beforeObserver(function() {
11089
- this._teardownContent();
11090
- }, 'content'),
11284
+ for(key in keys) {
11285
+ if (!keys.hasOwnProperty(key)) { continue; }
11091
11286
 
11092
- _teardownContent: function() {
11093
- var content = get(this, 'content');
11287
+ if (lim>0) addObserverForContentKey(content, key, this, idx, lim);
11094
11288
 
11095
- if (content) {
11096
- content.removeArrayObserver(this, {
11097
- willChange: 'contentArrayWillChange',
11098
- didChange: 'contentArrayDidChange'
11099
- });
11289
+ Ember.propertyDidChange(this, key);
11100
11290
  }
11101
- },
11102
-
11103
- contentArrayWillChange: Ember.K,
11104
- contentArrayDidChange: Ember.K,
11105
11291
 
11106
- /**
11107
- @private
11292
+ Ember.propertyDidChange(this._content, '@each');
11293
+ Ember.endPropertyChanges(this);
11294
+ },
11108
11295
 
11109
- Invoked when the content property changes. Notifies observers that the
11110
- entire array content has changed.
11296
+ // ..........................................................
11297
+ // LISTEN FOR NEW OBSERVERS AND OTHER EVENT LISTENERS
11298
+ // Start monitoring keys based on who is listening...
11111
11299
 
11112
- @method _contentDidChange
11113
- */
11114
- _contentDidChange: Ember.observer(function() {
11115
- var content = get(this, 'content');
11300
+ didAddListener: function(eventName) {
11301
+ if (IS_OBSERVER.test(eventName)) {
11302
+ this.beginObservingContentKey(eventName.slice(0, -7));
11303
+ }
11304
+ },
11116
11305
 
11306
+ didRemoveListener: function(eventName) {
11307
+ if (IS_OBSERVER.test(eventName)) {
11308
+ this.stopObservingContentKey(eventName.slice(0, -7));
11309
+ }
11310
+ },
11117
11311
 
11118
- this._setupContent();
11119
- }, 'content'),
11312
+ // ..........................................................
11313
+ // CONTENT KEY OBSERVING
11314
+ // Actual watch keys on the source content.
11120
11315
 
11121
- _setupContent: function() {
11122
- var content = get(this, 'content');
11316
+ beginObservingContentKey: function(keyName) {
11317
+ var keys = this._keys;
11318
+ if (!keys) keys = this._keys = {};
11319
+ if (!keys[keyName]) {
11320
+ keys[keyName] = 1;
11321
+ var content = this._content,
11322
+ len = get(content, 'length');
11323
+ addObserverForContentKey(content, keyName, this, 0, len);
11324
+ } else {
11325
+ keys[keyName]++;
11326
+ }
11327
+ },
11123
11328
 
11124
- if (content) {
11125
- content.addArrayObserver(this, {
11126
- willChange: 'contentArrayWillChange',
11127
- didChange: 'contentArrayDidChange'
11128
- });
11329
+ stopObservingContentKey: function(keyName) {
11330
+ var keys = this._keys;
11331
+ if (keys && (keys[keyName]>0) && (--keys[keyName]<=0)) {
11332
+ var content = this._content,
11333
+ len = get(content, 'length');
11334
+ removeObserverForContentKey(content, keyName, this, 0, len);
11129
11335
  }
11130
11336
  },
11131
11337
 
11132
- _arrangedContentWillChange: Ember.beforeObserver(function() {
11133
- var arrangedContent = get(this, 'arrangedContent'),
11134
- len = arrangedContent ? get(arrangedContent, 'length') : 0;
11338
+ contentKeyWillChange: function(obj, keyName) {
11339
+ Ember.propertyWillChange(this, keyName);
11340
+ },
11135
11341
 
11136
- this.arrangedContentArrayWillChange(this, 0, len, undefined);
11137
- this.arrangedContentWillChange(this);
11342
+ contentKeyDidChange: function(obj, keyName) {
11343
+ Ember.propertyDidChange(this, keyName);
11344
+ }
11138
11345
 
11139
- this._teardownArrangedContent(arrangedContent);
11140
- }, 'arrangedContent'),
11346
+ });
11141
11347
 
11142
- _arrangedContentDidChange: Ember.observer(function() {
11143
- var arrangedContent = get(this, 'arrangedContent'),
11144
- len = arrangedContent ? get(arrangedContent, 'length') : 0;
11145
11348
 
11146
11349
 
11147
- this._setupArrangedContent();
11350
+ })();
11148
11351
 
11149
- this.arrangedContentDidChange(this);
11150
- this.arrangedContentArrayDidChange(this, 0, undefined, len);
11151
- }, 'arrangedContent'),
11152
11352
 
11153
- _setupArrangedContent: function() {
11154
- var arrangedContent = get(this, 'arrangedContent');
11155
11353
 
11156
- if (arrangedContent) {
11157
- arrangedContent.addArrayObserver(this, {
11158
- willChange: 'arrangedContentArrayWillChange',
11159
- didChange: 'arrangedContentArrayDidChange'
11160
- });
11161
- }
11162
- },
11354
+ (function() {
11355
+ /**
11356
+ @module ember
11357
+ @submodule ember-runtime
11358
+ */
11163
11359
 
11164
- _teardownArrangedContent: function() {
11165
- var arrangedContent = get(this, 'arrangedContent');
11166
11360
 
11167
- if (arrangedContent) {
11168
- arrangedContent.removeArrayObserver(this, {
11169
- willChange: 'arrangedContentArrayWillChange',
11170
- didChange: 'arrangedContentArrayDidChange'
11171
- });
11172
- }
11173
- },
11361
+ var get = Ember.get, set = Ember.set;
11174
11362
 
11175
- arrangedContentWillChange: Ember.K,
11176
- arrangedContentDidChange: Ember.K,
11363
+ // Add Ember.Array to Array.prototype. Remove methods with native
11364
+ // implementations and supply some more optimized versions of generic methods
11365
+ // because they are so common.
11366
+ var NativeArray = Ember.Mixin.create(Ember.MutableArray, Ember.Observable, Ember.Copyable, {
11177
11367
 
11178
- objectAt: function(idx) {
11179
- return get(this, 'content') && this.objectAtContent(idx);
11368
+ // because length is a built-in property we need to know to just get the
11369
+ // original property.
11370
+ get: function(key) {
11371
+ if (key==='length') return this.length;
11372
+ else if ('number' === typeof key) return this[key];
11373
+ else return this._super(key);
11180
11374
  },
11181
11375
 
11182
- length: Ember.computed(function() {
11183
- var arrangedContent = get(this, 'arrangedContent');
11184
- return arrangedContent ? get(arrangedContent, 'length') : 0;
11185
- // No dependencies since Enumerable notifies length of change
11186
- }),
11376
+ objectAt: function(idx) {
11377
+ return this[idx];
11378
+ },
11187
11379
 
11380
+ // primitive for array support.
11188
11381
  replace: function(idx, amt, objects) {
11189
11382
 
11190
- if (get(this, 'content')) this.replaceContent(idx, amt, objects);
11191
- return this;
11383
+ if (this.isFrozen) throw Ember.FROZEN_ERROR ;
11384
+
11385
+ // if we replaced exactly the same number of items, then pass only the
11386
+ // replaced range. Otherwise, pass the full remaining array length
11387
+ // since everything has shifted
11388
+ var len = objects ? get(objects, 'length') : 0;
11389
+ this.arrayContentWillChange(idx, amt, len);
11390
+
11391
+ if (!objects || objects.length === 0) {
11392
+ this.splice(idx, amt) ;
11393
+ } else {
11394
+ var args = [idx, amt].concat(objects) ;
11395
+ this.splice.apply(this,args) ;
11396
+ }
11397
+
11398
+ this.arrayContentDidChange(idx, amt, len);
11399
+ return this ;
11192
11400
  },
11193
11401
 
11194
- arrangedContentArrayWillChange: function(item, idx, removedCnt, addedCnt) {
11195
- this.arrayContentWillChange(idx, removedCnt, addedCnt);
11402
+ // If you ask for an unknown property, then try to collect the value
11403
+ // from member items.
11404
+ unknownProperty: function(key, value) {
11405
+ var ret;// = this.reducedProperty(key, value) ;
11406
+ if ((value !== undefined) && ret === undefined) {
11407
+ ret = this[key] = value;
11408
+ }
11409
+ return ret ;
11196
11410
  },
11197
11411
 
11198
- arrangedContentArrayDidChange: function(item, idx, removedCnt, addedCnt) {
11199
- this.arrayContentDidChange(idx, removedCnt, addedCnt);
11412
+ // If browser did not implement indexOf natively, then override with
11413
+ // specialized version
11414
+ indexOf: function(object, startAt) {
11415
+ var idx, len = this.length;
11416
+
11417
+ if (startAt === undefined) startAt = 0;
11418
+ else startAt = (startAt < 0) ? Math.ceil(startAt) : Math.floor(startAt);
11419
+ if (startAt < 0) startAt += len;
11420
+
11421
+ for(idx=startAt;idx<len;idx++) {
11422
+ if (this[idx] === object) return idx ;
11423
+ }
11424
+ return -1;
11200
11425
  },
11201
11426
 
11202
- init: function() {
11203
- this._super();
11204
- this._setupContent();
11205
- this._setupArrangedContent();
11427
+ lastIndexOf: function(object, startAt) {
11428
+ var idx, len = this.length;
11429
+
11430
+ if (startAt === undefined) startAt = len-1;
11431
+ else startAt = (startAt < 0) ? Math.ceil(startAt) : Math.floor(startAt);
11432
+ if (startAt < 0) startAt += len;
11433
+
11434
+ for(idx=startAt;idx>=0;idx--) {
11435
+ if (this[idx] === object) return idx ;
11436
+ }
11437
+ return -1;
11206
11438
  },
11207
11439
 
11208
- willDestroy: function() {
11209
- this._teardownArrangedContent();
11210
- this._teardownContent();
11440
+ copy: function(deep) {
11441
+ if (deep) {
11442
+ return this.map(function(item){ return Ember.copy(item, true); });
11443
+ }
11444
+
11445
+ return this.slice();
11211
11446
  }
11212
11447
  });
11213
11448
 
11449
+ // Remove any methods implemented natively so we don't override them
11450
+ var ignore = ['length'];
11451
+ Ember.EnumerableUtils.forEach(NativeArray.keys(), function(methodName) {
11452
+ if (Array.prototype[methodName]) ignore.push(methodName);
11453
+ });
11454
+
11455
+ if (ignore.length>0) {
11456
+ NativeArray = NativeArray.without.apply(NativeArray, ignore);
11457
+ }
11458
+
11459
+ /**
11460
+ The NativeArray mixin contains the properties needed to to make the native
11461
+ Array support Ember.MutableArray and all of its dependent APIs. Unless you
11462
+ have `Ember.EXTEND_PROTOTYPES` or `Ember.EXTEND_PROTOTYPES.Array` set to
11463
+ false, this will be applied automatically. Otherwise you can apply the mixin
11464
+ at anytime by calling `Ember.NativeArray.activate`.
11465
+
11466
+ @class NativeArray
11467
+ @namespace Ember
11468
+ @extends Ember.Mixin
11469
+ @uses Ember.MutableArray
11470
+ @uses Ember.MutableEnumerable
11471
+ @uses Ember.Copyable
11472
+ @uses Ember.Freezable
11473
+ */
11474
+ Ember.NativeArray = NativeArray;
11475
+
11476
+ /**
11477
+ Creates an `Ember.NativeArray` from an Array like object.
11478
+ Does not modify the original object.
11479
+
11480
+ @method A
11481
+ @for Ember
11482
+ @return {Ember.NativeArray}
11483
+ */
11484
+ Ember.A = function(arr){
11485
+ if (arr === undefined) { arr = []; }
11486
+ return Ember.Array.detect(arr) ? arr : Ember.NativeArray.apply(arr);
11487
+ };
11488
+
11489
+ /**
11490
+ Activates the mixin on the Array.prototype if not already applied. Calling
11491
+ this method more than once is safe.
11492
+
11493
+ @method activate
11494
+ @for Ember.NativeArray
11495
+ @static
11496
+ @return {void}
11497
+ */
11498
+ Ember.NativeArray.activate = function() {
11499
+ NativeArray.apply(Array.prototype);
11500
+
11501
+ Ember.A = function(arr) { return arr || []; };
11502
+ };
11503
+
11504
+ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Array) {
11505
+ Ember.NativeArray.activate();
11506
+ }
11507
+
11214
11508
 
11215
11509
  })();
11216
11510
 
@@ -11222,505 +11516,452 @@ Ember.ArrayProxy = Ember.Object.extend(Ember.MutableArray,
11222
11516
  @submodule ember-runtime
11223
11517
  */
11224
11518
 
11225
- var get = Ember.get,
11226
- set = Ember.set,
11227
- fmt = Ember.String.fmt,
11228
- addBeforeObserver = Ember.addBeforeObserver,
11229
- addObserver = Ember.addObserver,
11230
- removeBeforeObserver = Ember.removeBeforeObserver,
11231
- removeObserver = Ember.removeObserver,
11232
- propertyWillChange = Ember.propertyWillChange,
11233
- propertyDidChange = Ember.propertyDidChange;
11519
+ var get = Ember.get, set = Ember.set, guidFor = Ember.guidFor, none = Ember.isNone, fmt = Ember.String.fmt;
11234
11520
 
11235
- function contentPropertyWillChange(content, contentKey) {
11236
- var key = contentKey.slice(8); // remove "content."
11237
- if (key in this) { return; } // if shadowed in proxy
11238
- propertyWillChange(this, key);
11239
- }
11521
+ /**
11522
+ An unordered collection of objects.
11240
11523
 
11241
- function contentPropertyDidChange(content, contentKey) {
11242
- var key = contentKey.slice(8); // remove "content."
11243
- if (key in this) { return; } // if shadowed in proxy
11244
- propertyDidChange(this, key);
11245
- }
11524
+ A Set works a bit like an array except that its items are not ordered. You
11525
+ can create a set to efficiently test for membership for an object. You can
11526
+ also iterate through a set just like an array, even accessing objects by
11527
+ index, however there is no guarantee as to their order.
11246
11528
 
11247
- /**
11248
- `Ember.ObjectProxy` forwards all properties not defined by the proxy itself
11249
- to a proxied `content` object.
11529
+ All Sets are observable via the Enumerable Observer API - which works
11530
+ on any enumerable object including both Sets and Arrays.
11531
+
11532
+ ## Creating a Set
11533
+
11534
+ You can create a set like you would most objects using
11535
+ `new Ember.Set()`. Most new sets you create will be empty, but you can
11536
+ also initialize the set with some content by passing an array or other
11537
+ enumerable of objects to the constructor.
11538
+
11539
+ Finally, you can pass in an existing set and the set will be copied. You
11540
+ can also create a copy of a set by calling `Ember.Set#copy()`.
11250
11541
 
11251
11542
  ```javascript
11252
- object = Ember.Object.create({
11253
- name: 'Foo'
11254
- });
11543
+ // creates a new empty set
11544
+ var foundNames = new Ember.Set();
11255
11545
 
11256
- proxy = Ember.ObjectProxy.create({
11257
- content: object
11258
- });
11546
+ // creates a set with four names in it.
11547
+ var names = new Ember.Set(["Charles", "Tom", "Juan", "Alex"]); // :P
11259
11548
 
11260
- // Access and change existing properties
11261
- proxy.get('name') // 'Foo'
11262
- proxy.set('name', 'Bar');
11263
- object.get('name') // 'Bar'
11549
+ // creates a copy of the names set.
11550
+ var namesCopy = new Ember.Set(names);
11264
11551
 
11265
- // Create new 'description' property on `object`
11266
- proxy.set('description', 'Foo is a whizboo baz');
11267
- object.get('description') // 'Foo is a whizboo baz'
11552
+ // same as above.
11553
+ var anotherNamesCopy = names.copy();
11268
11554
  ```
11269
11555
 
11270
- While `content` is unset, setting a property to be delegated will throw an
11271
- Error.
11556
+ ## Adding/Removing Objects
11272
11557
 
11273
- ```javascript
11274
- proxy = Ember.ObjectProxy.create({
11275
- content: null,
11276
- flag: null
11277
- });
11278
- proxy.set('flag', true);
11279
- proxy.get('flag'); // true
11280
- proxy.get('foo'); // undefined
11281
- proxy.set('foo', 'data'); // throws Error
11282
- ```
11558
+ You generally add or remove objects from a set using `add()` or
11559
+ `remove()`. You can add any type of object including primitives such as
11560
+ numbers, strings, and booleans.
11283
11561
 
11284
- Delegated properties can be bound to and will change when content is updated.
11562
+ Unlike arrays, objects can only exist one time in a set. If you call `add()`
11563
+ on a set with the same object multiple times, the object will only be added
11564
+ once. Likewise, calling `remove()` with the same object multiple times will
11565
+ remove the object the first time and have no effect on future calls until
11566
+ you add the object to the set again.
11285
11567
 
11286
- Computed properties on the proxy itself can depend on delegated properties.
11568
+ NOTE: You cannot add/remove `null` or `undefined` to a set. Any attempt to do
11569
+ so will be ignored.
11287
11570
 
11288
- ```javascript
11289
- ProxyWithComputedProperty = Ember.ObjectProxy.extend({
11290
- fullName: function () {
11291
- var firstName = this.get('firstName'),
11292
- lastName = this.get('lastName');
11293
- if (firstName && lastName) {
11294
- return firstName + ' ' + lastName;
11295
- }
11296
- return firstName || lastName;
11297
- }.property('firstName', 'lastName')
11298
- });
11571
+ In addition to add/remove you can also call `push()`/`pop()`. Push behaves
11572
+ just like `add()` but `pop()`, unlike `remove()` will pick an arbitrary
11573
+ object, remove it and return it. This is a good way to use a set as a job
11574
+ queue when you don't care which order the jobs are executed in.
11299
11575
 
11300
- proxy = ProxyWithComputedProperty.create();
11576
+ ## Testing for an Object
11301
11577
 
11302
- proxy.get('fullName'); // undefined
11303
- proxy.set('content', {
11304
- firstName: 'Tom', lastName: 'Dale'
11305
- }); // triggers property change for fullName on proxy
11578
+ To test for an object's presence in a set you simply call
11579
+ `Ember.Set#contains()`.
11306
11580
 
11307
- proxy.get('fullName'); // 'Tom Dale'
11308
- ```
11581
+ ## Observing changes
11309
11582
 
11310
- @class ObjectProxy
11311
- @namespace Ember
11312
- @extends Ember.Object
11313
- */
11314
- Ember.ObjectProxy = Ember.Object.extend(
11315
- /** @scope Ember.ObjectProxy.prototype */ {
11316
- /**
11317
- The object whose properties will be forwarded.
11583
+ When using `Ember.Set`, you can observe the `"[]"` property to be
11584
+ alerted whenever the content changes. You can also add an enumerable
11585
+ observer to the set to be notified of specific objects that are added and
11586
+ removed from the set. See `Ember.Enumerable` for more information on
11587
+ enumerables.
11318
11588
 
11319
- @property content
11320
- @type Ember.Object
11321
- @default null
11322
- */
11323
- content: null,
11324
- _contentDidChange: Ember.observer(function() {
11589
+ This is often unhelpful. If you are filtering sets of objects, for instance,
11590
+ it is very inefficient to re-filter all of the items each time the set
11591
+ changes. It would be better if you could just adjust the filtered set based
11592
+ on what was changed on the original set. The same issue applies to merging
11593
+ sets, as well.
11325
11594
 
11326
- }, 'content'),
11595
+ ## Other Methods
11327
11596
 
11328
- isTruthy: Ember.computed.bool('content'),
11597
+ `Ember.Set` primary implements other mixin APIs. For a complete reference
11598
+ on the methods you will use with `Ember.Set`, please consult these mixins.
11599
+ The most useful ones will be `Ember.Enumerable` and
11600
+ `Ember.MutableEnumerable` which implement most of the common iterator
11601
+ methods you are used to on Array.
11329
11602
 
11330
- _debugContainerKey: null,
11603
+ Note that you can also use the `Ember.Copyable` and `Ember.Freezable`
11604
+ APIs on `Ember.Set` as well. Once a set is frozen it can no longer be
11605
+ modified. The benefit of this is that when you call `frozenCopy()` on it,
11606
+ Ember will avoid making copies of the set. This allows you to write
11607
+ code that can know with certainty when the underlying set data will or
11608
+ will not be modified.
11331
11609
 
11332
- willWatchProperty: function (key) {
11333
- var contentKey = 'content.' + key;
11334
- addBeforeObserver(this, contentKey, null, contentPropertyWillChange);
11335
- addObserver(this, contentKey, null, contentPropertyDidChange);
11336
- },
11610
+ @class Set
11611
+ @namespace Ember
11612
+ @extends Ember.CoreObject
11613
+ @uses Ember.MutableEnumerable
11614
+ @uses Ember.Copyable
11615
+ @uses Ember.Freezable
11616
+ @since Ember 0.9
11617
+ */
11618
+ Ember.Set = Ember.CoreObject.extend(Ember.MutableEnumerable, Ember.Copyable, Ember.Freezable,
11619
+ /** @scope Ember.Set.prototype */ {
11337
11620
 
11338
- didUnwatchProperty: function (key) {
11339
- var contentKey = 'content.' + key;
11340
- removeBeforeObserver(this, contentKey, null, contentPropertyWillChange);
11341
- removeObserver(this, contentKey, null, contentPropertyDidChange);
11342
- },
11621
+ // ..........................................................
11622
+ // IMPLEMENT ENUMERABLE APIS
11623
+ //
11343
11624
 
11344
- unknownProperty: function (key) {
11345
- var content = get(this, 'content');
11346
- if (content) {
11347
- return get(content, key);
11348
- }
11349
- },
11625
+ /**
11626
+ This property will change as the number of objects in the set changes.
11350
11627
 
11351
- setUnknownProperty: function (key, value) {
11352
- var content = get(this, 'content');
11628
+ @property length
11629
+ @type number
11630
+ @default 0
11631
+ */
11632
+ length: 0,
11353
11633
 
11354
- return set(content, key, value);
11355
- }
11356
- });
11634
+ /**
11635
+ Clears the set. This is useful if you want to reuse an existing set
11636
+ without having to recreate it.
11357
11637
 
11358
- })();
11638
+ ```javascript
11639
+ var colors = new Ember.Set(["red", "green", "blue"]);
11640
+ colors.length; // 3
11641
+ colors.clear();
11642
+ colors.length; // 0
11643
+ ```
11359
11644
 
11645
+ @method clear
11646
+ @return {Ember.Set} An empty Set
11647
+ */
11648
+ clear: function() {
11649
+ if (this.isFrozen) { throw new Error(Ember.FROZEN_ERROR); }
11360
11650
 
11651
+ var len = get(this, 'length');
11652
+ if (len === 0) { return this; }
11361
11653
 
11362
- (function() {
11363
- /**
11364
- @module ember
11365
- @submodule ember-runtime
11366
- */
11654
+ var guid;
11367
11655
 
11656
+ this.enumerableContentWillChange(len, 0);
11657
+ Ember.propertyWillChange(this, 'firstObject');
11658
+ Ember.propertyWillChange(this, 'lastObject');
11368
11659
 
11369
- var set = Ember.set, get = Ember.get, guidFor = Ember.guidFor;
11370
- var forEach = Ember.EnumerableUtils.forEach;
11660
+ for (var i=0; i < len; i++){
11661
+ guid = guidFor(this[i]);
11662
+ delete this[guid];
11663
+ delete this[i];
11664
+ }
11371
11665
 
11372
- var EachArray = Ember.Object.extend(Ember.Array, {
11666
+ set(this, 'length', 0);
11373
11667
 
11374
- init: function(content, keyName, owner) {
11375
- this._super();
11376
- this._keyName = keyName;
11377
- this._owner = owner;
11378
- this._content = content;
11379
- },
11668
+ Ember.propertyDidChange(this, 'firstObject');
11669
+ Ember.propertyDidChange(this, 'lastObject');
11670
+ this.enumerableContentDidChange(len, 0);
11380
11671
 
11381
- objectAt: function(idx) {
11382
- var item = this._content.objectAt(idx);
11383
- return item && get(item, this._keyName);
11672
+ return this;
11384
11673
  },
11385
11674
 
11386
- length: Ember.computed(function() {
11387
- var content = this._content;
11388
- return content ? get(content, 'length') : 0;
11389
- })
11390
-
11391
- });
11392
-
11393
- var IS_OBSERVER = /^.+:(before|change)$/;
11394
-
11395
- function addObserverForContentKey(content, keyName, proxy, idx, loc) {
11396
- var objects = proxy._objects, guid;
11397
- if (!objects) objects = proxy._objects = {};
11675
+ /**
11676
+ Returns true if the passed object is also an enumerable that contains the
11677
+ same objects as the receiver.
11398
11678
 
11399
- while(--loc>=idx) {
11400
- var item = content.objectAt(loc);
11401
- if (item) {
11402
- Ember.addBeforeObserver(item, keyName, proxy, 'contentKeyWillChange');
11403
- Ember.addObserver(item, keyName, proxy, 'contentKeyDidChange');
11679
+ ```javascript
11680
+ var colors = ["red", "green", "blue"],
11681
+ same_colors = new Ember.Set(colors);
11404
11682
 
11405
- // keep track of the indicies each item was found at so we can map
11406
- // it back when the obj changes.
11407
- guid = guidFor(item);
11408
- if (!objects[guid]) objects[guid] = [];
11409
- objects[guid].push(loc);
11410
- }
11411
- }
11412
- }
11683
+ same_colors.isEqual(colors); // true
11684
+ same_colors.isEqual(["purple", "brown"]); // false
11685
+ ```
11413
11686
 
11414
- function removeObserverForContentKey(content, keyName, proxy, idx, loc) {
11415
- var objects = proxy._objects;
11416
- if (!objects) objects = proxy._objects = {};
11417
- var indicies, guid;
11687
+ @method isEqual
11688
+ @param {Ember.Set} obj the other object.
11689
+ @return {Boolean}
11690
+ */
11691
+ isEqual: function(obj) {
11692
+ // fail fast
11693
+ if (!Ember.Enumerable.detect(obj)) return false;
11418
11694
 
11419
- while(--loc>=idx) {
11420
- var item = content.objectAt(loc);
11421
- if (item) {
11422
- Ember.removeBeforeObserver(item, keyName, proxy, 'contentKeyWillChange');
11423
- Ember.removeObserver(item, keyName, proxy, 'contentKeyDidChange');
11695
+ var loc = get(this, 'length');
11696
+ if (get(obj, 'length') !== loc) return false;
11424
11697
 
11425
- guid = guidFor(item);
11426
- indicies = objects[guid];
11427
- indicies[indicies.indexOf(loc)] = null;
11698
+ while(--loc >= 0) {
11699
+ if (!obj.contains(this[loc])) return false;
11428
11700
  }
11429
- }
11430
- }
11431
11701
 
11432
- /**
11433
- This is the object instance returned when you get the `@each` property on an
11434
- array. It uses the unknownProperty handler to automatically create
11435
- EachArray instances for property names.
11436
-
11437
- @private
11438
- @class EachProxy
11439
- @namespace Ember
11440
- @extends Ember.Object
11441
- */
11442
- Ember.EachProxy = Ember.Object.extend({
11443
-
11444
- init: function(content) {
11445
- this._super();
11446
- this._content = content;
11447
- content.addArrayObserver(this);
11448
-
11449
- // in case someone is already observing some keys make sure they are
11450
- // added
11451
- forEach(Ember.watchedEvents(this), function(eventName) {
11452
- this.didAddListener(eventName);
11453
- }, this);
11702
+ return true;
11454
11703
  },
11455
11704
 
11456
11705
  /**
11457
- You can directly access mapped properties by simply requesting them.
11458
- The `unknownProperty` handler will generate an EachArray of each item.
11459
-
11460
- @method unknownProperty
11461
- @param keyName {String}
11462
- @param value {anything}
11463
- */
11464
- unknownProperty: function(keyName, value) {
11465
- var ret;
11466
- ret = new EachArray(this._content, keyName, this);
11467
- Ember.defineProperty(this, keyName, null, ret);
11468
- this.beginObservingContentKey(keyName);
11469
- return ret;
11470
- },
11471
-
11472
- // ..........................................................
11473
- // ARRAY CHANGES
11474
- // Invokes whenever the content array itself changes.
11475
-
11476
- arrayWillChange: function(content, idx, removedCnt, addedCnt) {
11477
- var keys = this._keys, key, array, lim;
11706
+ Adds an object to the set. Only non-`null` objects can be added to a set
11707
+ and those can only be added once. If the object is already in the set or
11708
+ the passed value is null this method will have no effect.
11478
11709
 
11479
- lim = removedCnt>0 ? idx+removedCnt : -1;
11480
- Ember.beginPropertyChanges(this);
11710
+ This is an alias for `Ember.MutableEnumerable.addObject()`.
11481
11711
 
11482
- for(key in keys) {
11483
- if (!keys.hasOwnProperty(key)) { continue; }
11712
+ ```javascript
11713
+ var colors = new Ember.Set();
11714
+ colors.add("blue"); // ["blue"]
11715
+ colors.add("blue"); // ["blue"]
11716
+ colors.add("red"); // ["blue", "red"]
11717
+ colors.add(null); // ["blue", "red"]
11718
+ colors.add(undefined); // ["blue", "red"]
11719
+ ```
11484
11720
 
11485
- if (lim>0) removeObserverForContentKey(content, key, this, idx, lim);
11721
+ @method add
11722
+ @param {Object} obj The object to add.
11723
+ @return {Ember.Set} The set itself.
11724
+ */
11725
+ add: Ember.aliasMethod('addObject'),
11486
11726
 
11487
- Ember.propertyWillChange(this, key);
11488
- }
11727
+ /**
11728
+ Removes the object from the set if it is found. If you pass a `null` value
11729
+ or an object that is already not in the set, this method will have no
11730
+ effect. This is an alias for `Ember.MutableEnumerable.removeObject()`.
11489
11731
 
11490
- Ember.propertyWillChange(this._content, '@each');
11491
- Ember.endPropertyChanges(this);
11492
- },
11732
+ ```javascript
11733
+ var colors = new Ember.Set(["red", "green", "blue"]);
11734
+ colors.remove("red"); // ["blue", "green"]
11735
+ colors.remove("purple"); // ["blue", "green"]
11736
+ colors.remove(null); // ["blue", "green"]
11737
+ ```
11493
11738
 
11494
- arrayDidChange: function(content, idx, removedCnt, addedCnt) {
11495
- var keys = this._keys, key, array, lim;
11739
+ @method remove
11740
+ @param {Object} obj The object to remove
11741
+ @return {Ember.Set} The set itself.
11742
+ */
11743
+ remove: Ember.aliasMethod('removeObject'),
11496
11744
 
11497
- lim = addedCnt>0 ? idx+addedCnt : -1;
11498
- Ember.beginPropertyChanges(this);
11745
+ /**
11746
+ Removes the last element from the set and returns it, or `null` if it's empty.
11499
11747
 
11500
- for(key in keys) {
11501
- if (!keys.hasOwnProperty(key)) { continue; }
11748
+ ```javascript
11749
+ var colors = new Ember.Set(["green", "blue"]);
11750
+ colors.pop(); // "blue"
11751
+ colors.pop(); // "green"
11752
+ colors.pop(); // null
11753
+ ```
11502
11754
 
11503
- if (lim>0) addObserverForContentKey(content, key, this, idx, lim);
11755
+ @method pop
11756
+ @return {Object} The removed object from the set or null.
11757
+ */
11758
+ pop: function() {
11759
+ if (get(this, 'isFrozen')) throw new Error(Ember.FROZEN_ERROR);
11760
+ var obj = this.length > 0 ? this[this.length-1] : null;
11761
+ this.remove(obj);
11762
+ return obj;
11763
+ },
11504
11764
 
11505
- Ember.propertyDidChange(this, key);
11506
- }
11765
+ /**
11766
+ Inserts the given object on to the end of the set. It returns
11767
+ the set itself.
11507
11768
 
11508
- Ember.propertyDidChange(this._content, '@each');
11509
- Ember.endPropertyChanges(this);
11510
- },
11769
+ This is an alias for `Ember.MutableEnumerable.addObject()`.
11511
11770
 
11512
- // ..........................................................
11513
- // LISTEN FOR NEW OBSERVERS AND OTHER EVENT LISTENERS
11514
- // Start monitoring keys based on who is listening...
11771
+ ```javascript
11772
+ var colors = new Ember.Set();
11773
+ colors.push("red"); // ["red"]
11774
+ colors.push("green"); // ["red", "green"]
11775
+ colors.push("blue"); // ["red", "green", "blue"]
11776
+ ```
11515
11777
 
11516
- didAddListener: function(eventName) {
11517
- if (IS_OBSERVER.test(eventName)) {
11518
- this.beginObservingContentKey(eventName.slice(0, -7));
11519
- }
11520
- },
11778
+ @method push
11779
+ @return {Ember.Set} The set itself.
11780
+ */
11781
+ push: Ember.aliasMethod('addObject'),
11521
11782
 
11522
- didRemoveListener: function(eventName) {
11523
- if (IS_OBSERVER.test(eventName)) {
11524
- this.stopObservingContentKey(eventName.slice(0, -7));
11525
- }
11526
- },
11783
+ /**
11784
+ Removes the last element from the set and returns it, or `null` if it's empty.
11527
11785
 
11528
- // ..........................................................
11529
- // CONTENT KEY OBSERVING
11530
- // Actual watch keys on the source content.
11786
+ This is an alias for `Ember.Set.pop()`.
11531
11787
 
11532
- beginObservingContentKey: function(keyName) {
11533
- var keys = this._keys;
11534
- if (!keys) keys = this._keys = {};
11535
- if (!keys[keyName]) {
11536
- keys[keyName] = 1;
11537
- var content = this._content,
11538
- len = get(content, 'length');
11539
- addObserverForContentKey(content, keyName, this, 0, len);
11540
- } else {
11541
- keys[keyName]++;
11542
- }
11543
- },
11788
+ ```javascript
11789
+ var colors = new Ember.Set(["green", "blue"]);
11790
+ colors.shift(); // "blue"
11791
+ colors.shift(); // "green"
11792
+ colors.shift(); // null
11793
+ ```
11544
11794
 
11545
- stopObservingContentKey: function(keyName) {
11546
- var keys = this._keys;
11547
- if (keys && (keys[keyName]>0) && (--keys[keyName]<=0)) {
11548
- var content = this._content,
11549
- len = get(content, 'length');
11550
- removeObserverForContentKey(content, keyName, this, 0, len);
11551
- }
11552
- },
11795
+ @method shift
11796
+ @return {Object} The removed object from the set or null.
11797
+ */
11798
+ shift: Ember.aliasMethod('pop'),
11553
11799
 
11554
- contentKeyWillChange: function(obj, keyName) {
11555
- Ember.propertyWillChange(this, keyName);
11556
- },
11800
+ /**
11801
+ Inserts the given object on to the end of the set. It returns
11802
+ the set itself.
11557
11803
 
11558
- contentKeyDidChange: function(obj, keyName) {
11559
- Ember.propertyDidChange(this, keyName);
11560
- }
11804
+ This is an alias of `Ember.Set.push()`
11561
11805
 
11562
- });
11806
+ ```javascript
11807
+ var colors = new Ember.Set();
11808
+ colors.unshift("red"); // ["red"]
11809
+ colors.unshift("green"); // ["red", "green"]
11810
+ colors.unshift("blue"); // ["red", "green", "blue"]
11811
+ ```
11563
11812
 
11813
+ @method unshift
11814
+ @return {Ember.Set} The set itself.
11815
+ */
11816
+ unshift: Ember.aliasMethod('push'),
11564
11817
 
11818
+ /**
11819
+ Adds each object in the passed enumerable to the set.
11565
11820
 
11566
- })();
11821
+ This is an alias of `Ember.MutableEnumerable.addObjects()`
11567
11822
 
11823
+ ```javascript
11824
+ var colors = new Ember.Set();
11825
+ colors.addEach(["red", "green", "blue"]); // ["red", "green", "blue"]
11826
+ ```
11568
11827
 
11828
+ @method addEach
11829
+ @param {Ember.Enumerable} objects the objects to add.
11830
+ @return {Ember.Set} The set itself.
11831
+ */
11832
+ addEach: Ember.aliasMethod('addObjects'),
11569
11833
 
11570
- (function() {
11571
- /**
11572
- @module ember
11573
- @submodule ember-runtime
11574
- */
11834
+ /**
11835
+ Removes each object in the passed enumerable to the set.
11575
11836
 
11837
+ This is an alias of `Ember.MutableEnumerable.removeObjects()`
11576
11838
 
11577
- var get = Ember.get, set = Ember.set;
11839
+ ```javascript
11840
+ var colors = new Ember.Set(["red", "green", "blue"]);
11841
+ colors.removeEach(["red", "blue"]); // ["green"]
11842
+ ```
11578
11843
 
11579
- // Add Ember.Array to Array.prototype. Remove methods with native
11580
- // implementations and supply some more optimized versions of generic methods
11581
- // because they are so common.
11582
- var NativeArray = Ember.Mixin.create(Ember.MutableArray, Ember.Observable, Ember.Copyable, {
11844
+ @method removeEach
11845
+ @param {Ember.Enumerable} objects the objects to remove.
11846
+ @return {Ember.Set} The set itself.
11847
+ */
11848
+ removeEach: Ember.aliasMethod('removeObjects'),
11583
11849
 
11584
- // because length is a built-in property we need to know to just get the
11585
- // original property.
11586
- get: function(key) {
11587
- if (key==='length') return this.length;
11588
- else if ('number' === typeof key) return this[key];
11589
- else return this._super(key);
11850
+ // ..........................................................
11851
+ // PRIVATE ENUMERABLE SUPPORT
11852
+ //
11853
+
11854
+ init: function(items) {
11855
+ this._super();
11856
+ if (items) this.addObjects(items);
11590
11857
  },
11591
11858
 
11592
- objectAt: function(idx) {
11859
+ // implement Ember.Enumerable
11860
+ nextObject: function(idx) {
11593
11861
  return this[idx];
11594
11862
  },
11595
11863
 
11596
- // primitive for array support.
11597
- replace: function(idx, amt, objects) {
11598
-
11599
- if (this.isFrozen) throw Ember.FROZEN_ERROR ;
11600
-
11601
- // if we replaced exactly the same number of items, then pass only the
11602
- // replaced range. Otherwise, pass the full remaining array length
11603
- // since everything has shifted
11604
- var len = objects ? get(objects, 'length') : 0;
11605
- this.arrayContentWillChange(idx, amt, len);
11864
+ // more optimized version
11865
+ firstObject: Ember.computed(function() {
11866
+ return this.length > 0 ? this[0] : undefined;
11867
+ }),
11606
11868
 
11607
- if (!objects || objects.length === 0) {
11608
- this.splice(idx, amt) ;
11609
- } else {
11610
- var args = [idx, amt].concat(objects) ;
11611
- this.splice.apply(this,args) ;
11612
- }
11869
+ // more optimized version
11870
+ lastObject: Ember.computed(function() {
11871
+ return this.length > 0 ? this[this.length-1] : undefined;
11872
+ }),
11613
11873
 
11614
- this.arrayContentDidChange(idx, amt, len);
11615
- return this ;
11616
- },
11874
+ // implements Ember.MutableEnumerable
11875
+ addObject: function(obj) {
11876
+ if (get(this, 'isFrozen')) throw new Error(Ember.FROZEN_ERROR);
11877
+ if (none(obj)) return this; // nothing to do
11617
11878
 
11618
- // If you ask for an unknown property, then try to collect the value
11619
- // from member items.
11620
- unknownProperty: function(key, value) {
11621
- var ret;// = this.reducedProperty(key, value) ;
11622
- if ((value !== undefined) && ret === undefined) {
11623
- ret = this[key] = value;
11624
- }
11625
- return ret ;
11626
- },
11879
+ var guid = guidFor(obj),
11880
+ idx = this[guid],
11881
+ len = get(this, 'length'),
11882
+ added ;
11627
11883
 
11628
- // If browser did not implement indexOf natively, then override with
11629
- // specialized version
11630
- indexOf: function(object, startAt) {
11631
- var idx, len = this.length;
11884
+ if (idx>=0 && idx<len && (this[idx] === obj)) return this; // added
11632
11885
 
11633
- if (startAt === undefined) startAt = 0;
11634
- else startAt = (startAt < 0) ? Math.ceil(startAt) : Math.floor(startAt);
11635
- if (startAt < 0) startAt += len;
11886
+ added = [obj];
11636
11887
 
11637
- for(idx=startAt;idx<len;idx++) {
11638
- if (this[idx] === object) return idx ;
11639
- }
11640
- return -1;
11641
- },
11888
+ this.enumerableContentWillChange(null, added);
11889
+ Ember.propertyWillChange(this, 'lastObject');
11642
11890
 
11643
- lastIndexOf: function(object, startAt) {
11644
- var idx, len = this.length;
11891
+ len = get(this, 'length');
11892
+ this[guid] = len;
11893
+ this[len] = obj;
11894
+ set(this, 'length', len+1);
11645
11895
 
11646
- if (startAt === undefined) startAt = len-1;
11647
- else startAt = (startAt < 0) ? Math.ceil(startAt) : Math.floor(startAt);
11648
- if (startAt < 0) startAt += len;
11896
+ Ember.propertyDidChange(this, 'lastObject');
11897
+ this.enumerableContentDidChange(null, added);
11649
11898
 
11650
- for(idx=startAt;idx>=0;idx--) {
11651
- if (this[idx] === object) return idx ;
11652
- }
11653
- return -1;
11899
+ return this;
11654
11900
  },
11655
11901
 
11656
- copy: function(deep) {
11657
- if (deep) {
11658
- return this.map(function(item){ return Ember.copy(item, true); });
11659
- }
11902
+ // implements Ember.MutableEnumerable
11903
+ removeObject: function(obj) {
11904
+ if (get(this, 'isFrozen')) throw new Error(Ember.FROZEN_ERROR);
11905
+ if (none(obj)) return this; // nothing to do
11660
11906
 
11661
- return this.slice();
11662
- }
11663
- });
11907
+ var guid = guidFor(obj),
11908
+ idx = this[guid],
11909
+ len = get(this, 'length'),
11910
+ isFirst = idx === 0,
11911
+ isLast = idx === len-1,
11912
+ last, removed;
11664
11913
 
11665
- // Remove any methods implemented natively so we don't override them
11666
- var ignore = ['length'];
11667
- Ember.EnumerableUtils.forEach(NativeArray.keys(), function(methodName) {
11668
- if (Array.prototype[methodName]) ignore.push(methodName);
11669
- });
11670
11914
 
11671
- if (ignore.length>0) {
11672
- NativeArray = NativeArray.without.apply(NativeArray, ignore);
11673
- }
11915
+ if (idx>=0 && idx<len && (this[idx] === obj)) {
11916
+ removed = [obj];
11674
11917
 
11675
- /**
11676
- The NativeArray mixin contains the properties needed to to make the native
11677
- Array support Ember.MutableArray and all of its dependent APIs. Unless you
11678
- have `Ember.EXTEND_PROTOTYPES or `Ember.EXTEND_PROTOTYPES.Array` set to
11679
- false, this will be applied automatically. Otherwise you can apply the mixin
11680
- at anytime by calling `Ember.NativeArray.activate`.
11918
+ this.enumerableContentWillChange(removed, null);
11919
+ if (isFirst) { Ember.propertyWillChange(this, 'firstObject'); }
11920
+ if (isLast) { Ember.propertyWillChange(this, 'lastObject'); }
11681
11921
 
11682
- @class NativeArray
11683
- @namespace Ember
11684
- @extends Ember.Mixin
11685
- @uses Ember.MutableArray
11686
- @uses Ember.MutableEnumerable
11687
- @uses Ember.Copyable
11688
- @uses Ember.Freezable
11689
- */
11690
- Ember.NativeArray = NativeArray;
11922
+ // swap items - basically move the item to the end so it can be removed
11923
+ if (idx < len-1) {
11924
+ last = this[len-1];
11925
+ this[idx] = last;
11926
+ this[guidFor(last)] = idx;
11927
+ }
11691
11928
 
11692
- /**
11693
- Creates an `Ember.NativeArray` from an Array like object.
11694
- Does not modify the original object.
11929
+ delete this[guid];
11930
+ delete this[len-1];
11931
+ set(this, 'length', len-1);
11695
11932
 
11696
- @method A
11697
- @for Ember
11698
- @return {Ember.NativeArray}
11699
- */
11700
- Ember.A = function(arr){
11701
- if (arr === undefined) { arr = []; }
11702
- return Ember.Array.detect(arr) ? arr : Ember.NativeArray.apply(arr);
11703
- };
11933
+ if (isFirst) { Ember.propertyDidChange(this, 'firstObject'); }
11934
+ if (isLast) { Ember.propertyDidChange(this, 'lastObject'); }
11935
+ this.enumerableContentDidChange(removed, null);
11936
+ }
11704
11937
 
11705
- /**
11706
- Activates the mixin on the Array.prototype if not already applied. Calling
11707
- this method more than once is safe.
11938
+ return this;
11939
+ },
11708
11940
 
11709
- @method activate
11710
- @for Ember.NativeArray
11711
- @static
11712
- @return {void}
11713
- */
11714
- Ember.NativeArray.activate = function() {
11715
- NativeArray.apply(Array.prototype);
11941
+ // optimized version
11942
+ contains: function(obj) {
11943
+ return this[guidFor(obj)]>=0;
11944
+ },
11716
11945
 
11717
- Ember.A = function(arr) { return arr || []; };
11718
- };
11946
+ copy: function() {
11947
+ var C = this.constructor, ret = new C(), loc = get(this, 'length');
11948
+ set(ret, 'length', loc);
11949
+ while(--loc>=0) {
11950
+ ret[loc] = this[loc];
11951
+ ret[guidFor(this[loc])] = loc;
11952
+ }
11953
+ return ret;
11954
+ },
11719
11955
 
11720
- if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Array) {
11721
- Ember.NativeArray.activate();
11722
- }
11956
+ toString: function() {
11957
+ var len = this.length, idx, array = [];
11958
+ for(idx = 0; idx < len; idx++) {
11959
+ array[idx] = this[idx];
11960
+ }
11961
+ return fmt("Ember.Set<%@>", [array.join(',')]);
11962
+ }
11723
11963
 
11964
+ });
11724
11965
 
11725
11966
  })();
11726
11967
 
@@ -11728,7 +11969,6 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Array) {
11728
11969
 
11729
11970
  (function() {
11730
11971
  var DeferredMixin = Ember.DeferredMixin, // mixins/deferred
11731
- EmberObject = Ember.Object, // system/object
11732
11972
  get = Ember.get;
11733
11973
 
11734
11974
  var Deferred = Ember.Object.extend(DeferredMixin);
@@ -12051,7 +12291,6 @@ Ember.SortableMixin = Ember.Mixin.create(Ember.MutableEnumerable, {
12051
12291
 
12052
12292
  if (isSorted) {
12053
12293
  var addedObjects = array.slice(idx, idx+addedCount);
12054
- var arrangedContent = get(this, 'arrangedContent');
12055
12294
 
12056
12295
  forEach(addedObjects, function(item) {
12057
12296
  this.insertItemSorted(item);
@@ -12121,8 +12360,8 @@ Ember.SortableMixin = Ember.Mixin.create(Ember.MutableEnumerable, {
12121
12360
  @submodule ember-runtime
12122
12361
  */
12123
12362
 
12124
- var get = Ember.get, set = Ember.set, isGlobalPath = Ember.isGlobalPath,
12125
- forEach = Ember.EnumerableUtils.forEach, replace = Ember.EnumerableUtils.replace;
12363
+ var get = Ember.get, set = Ember.set, forEach = Ember.EnumerableUtils.forEach,
12364
+ replace = Ember.EnumerableUtils.replace;
12126
12365
 
12127
12366
  /**
12128
12367
  `Ember.ArrayController` provides a way for you to publish a collection of
@@ -12445,7 +12684,7 @@ Ember.State = Ember.Object.extend(Ember.Evented,
12445
12684
  },
12446
12685
 
12447
12686
  init: function() {
12448
- var states = get(this, 'states'), foundStates;
12687
+ var states = get(this, 'states');
12449
12688
  set(this, 'childStates', Ember.A());
12450
12689
  set(this, 'eventTransitions', get(this, 'eventTransitions') || {});
12451
12690
 
@@ -12595,7 +12834,7 @@ Ember.State.reopenClass({
12595
12834
  transitionTo: function(target) {
12596
12835
 
12597
12836
  var transitionFunction = function(stateManager, contextOrEvent) {
12598
- var contexts = [], transitionArgs,
12837
+ var contexts = [],
12599
12838
  Event = Ember.$ && Ember.$.Event;
12600
12839
 
12601
12840
  if (contextOrEvent && (Event && contextOrEvent instanceof Event)) {