"use strict";this.Promise={};if(typeof(require)==="function"){module.exports=Promise;}else{this.EXPORTED_SYMBOLS=["Promise"];}
function fulfilled(value){return{then:function then(fulfill){fulfill(value);}};}
function rejected(reason){return{then:function then(fulfill,reject){reject(reason);}};}
function isPromise(value){return value&&typeof(value.then)==='function';}
function defer(){var observers=[];var result=null;var promise={then:function then(onFulfill,onError){var deferred=defer();function resolve(value){try{deferred.resolve(onFulfill?onFulfill(value):value);}catch(error){deferred.resolve(rejected(error));}}
function reject(reason){try{if(onError)deferred.resolve(onError(reason));else deferred.resolve(rejected(reason));}catch(error){deferred.resolve(rejected(error));}}
if(observers){observers.push({resolve:resolve,reject:reject});}else{result.then(resolve,reject);}
return deferred.promise;}};var deferred={promise:promise,resolve:function resolve(value){if(!result){result=isPromise(value)?value:fulfilled(value);while(observers.length){var observer=observers.shift();result.then(observer.resolve,observer.reject);}
observers=null;}},reject:function reject(reason){deferred.resolve(rejected(reason));}};return deferred;}
Promise.defer=defer;function resolve(value){var deferred=defer();deferred.resolve(value);return deferred.promise;}
Promise.resolve=resolve;function reject(reason){var deferred=defer();deferred.reject(reason);return deferred.promise;}
Promise.reject=reject;var promised=(function(){var call=Function.call;var concat=Array.prototype.concat;function execute(args){return call.apply(call,args)}
function promisedConcat(promises,unknown){return promises.then(function(values){return resolve(unknown).then(function(value){return values.concat([value]);});});}
return function promised(f){return function promised(){return concat.apply([f,this],arguments).reduce(promisedConcat,resolve([])).then(execute);};}})();Promise.all=promised(Array);