From ccf6c2478d2c5b02fff4f99edd20fc84b5157242 Mon Sep 17 00:00:00 2001
From: Nicholas Penree
- * require_once 'PATH_TO_CSScomb/csscomb.php';
- *
- * $c = new csscomb();
- * $result_code = $c->csscomb(
- * 'div {margin-top:0; color: red; display: inline;}',
- * false,
- * $MY_JSON_SORT_ORDER
- * );
- *
- *
- */
- function csscomb($css = '', $debug = false, $custom_sort_order = null) {
- $this->output = $debug ? true : false;
-
- if ($css && is_string($css)) {
- $this->code['original'] = $this->code['edited'] = $css;
- $this->set_mode();
- $this->set_sort_order($custom_sort_order);
- $this->preprocess();
- $this->parse_rules();
- $this->postprocess();
- return $this->end_of_process();
- } else {
- return false;
- }
- }
-
-
- /**
- * Функция устанавливает $this->sort_order
- *
- * @param json_array {string/JSON}
- *
- */
- function set_sort_order($json_array = null) {
- $this->sort_order = json_decode($this->default_sort_order);
-
- if ($json_array !== null) {
- $custom_sort_order = json_decode($json_array);
- if (is_array($custom_sort_order) AND count($custom_sort_order) > 0) {
- $this->sort_order = $custom_sort_order;
- }
- }
-
- if ($json_array === 'yandex') {
- $this->sort_order = json_decode($this->yandex_sort_order);
- //switch(json_last_error()) {
- //case JSON_ERROR_DEPTH:
- //echo 'JSON parse error: Достигнута максимальная глубина стека';
- //break;
- //case JSON_ERROR_STATE_MISMATCH:
- //echo 'JSON parse error: Некорректные разряды или не совпадение режимов';
- //break;
- //case JSON_ERROR_CTRL_CHAR:
- //echo 'JSON parse error: Некорректный управляющий символ';
- //break;
- //case JSON_ERROR_SYNTAX:
- //echo 'JSON parse error: Синтаксическая ошибка, не корректный JSON';
- //break;
- //}
- }
- }
-
-
- /**
- * Функция устанавливает $this->mode
- *
- * @TODO: а если и тег
-'.$before.'';
- echo '
';
- echo '
';
- echo ''.var_dump($after).'<)YzW6oLRDL^`vg~JIkmY
zJuva~*CywzW3A?tWnCj~OI_L>!AgOR
') + '
+Vow [](http://travis-ci.org/dfilatov/vow)
+=========
+
+Promises/A+ implementation.
+See https://github.com/promises-aplus/promises-spec.
+
+Getting Started
+---------------
+###In Node.js###
+You can install using Node Package Manager (npm):
+
+ npm install vow
+
+###In Browsers###
+```html
+
+```
+It also supports RequireJS module format and [YM module](https://github.com/ymaps/modules) format.
+
+Vow has been tested in IE6+, Mozilla Firefox 3+, Chrome 5+, Safari 5+, Opera 10+.
+
+API
+---
+ * [Creating promise](#vowpromisevalue)
+ * [Promise API](#promise-api)
+ * [fulfill](#fulfillvalue)
+ * [reject](#rejectreason)
+ * [notify](#notifyvalue)
+ * [isFulfilled](#isfulfilled)
+ * [isRejected](#isrejected)
+ * [isResolved](#isresolved)
+ * [valueOf](#valueof)
+ * [then](#thenonfulfilled-onrejected-onprogress-context)
+ * [fail](#failonrejected-context)
+ * [always](#alwaysonresolved-context)
+ * [progress](#progressonprogress-context)
+ * [spread](#spreadonfulfilled-onrejected-context)
+ * [done](#doneonfulfilled-onrejected-onprogress-context)
+ * [delay](#delaydelay)
+ * [timeout](#timeouttimeout)
+ * [sync](#syncwithpromise)
+ * [Vow API](#vow-api)
+ * [isPromise](#ispromisevalue)
+ * [when](#whenvalue-onfulfilled-onrejected-onprogress-context)
+ * [fail](#failvalue-onrejected-context)
+ * [always](#alwaysvalue-onresolved-context)
+ * [progress](#progressvalue-onprogress-context)
+ * [spread](#spreadvalue-onfulfilled-onrejected-context)
+ * [done](#donevalue-onfulfilled-onrejected-onprogress-context)
+ * [isFulfilled](#isfulfilledvalue)
+ * [isRejected](#isrejectedvalue)
+ * [isResolved](#isresolvededvalue)
+ * [fulfill](#fulfillvalue-1)
+ * [reject](#rejectreason-1)
+ * [resolve](#resolvevalue)
+ * [invoke](#invokefn-args)
+ * [all](#allpromisesorvalues)
+ * [allResolved](#allresolvedpromisesorvalues)
+ * [any](#anypromisesorvalues)
+ * [delay](#delayvalue-delay)
+ * [timeout](#timeoutvalue-timeout)
+
+####Vow.promise([value])####
+Creates a new promise if no ````value```` given, or creates a new fulfilled promise if the ````value```` is not a promise, or returns ````value```` if the given ````value```` is a promise.
+````javascript
+var promise = Vow.promise(), // creating a new promise
+ fulfilledPromise = Vow.promise('ok'), // creating a new fulfilled promise
+ anotherPromise = Vow.promise(existingPromise); // anotherPromise is equal to the existingPromise
+````
+###Promise API###
+####fulfill(value)####
+Fulfills promise with given ````value````
+````javascript
+var promise = Vow.promise();
+promise.fulfill('completed'); // fulfilling promise with 'completed' value
+````
+####reject(reason)####
+Rejects promise with given ````reason````
+````javascript
+var promise = Vow.promise();
+promise.reject(Error('internal error')); // rejecting promise with Error object
+````
+####notify(value)####
+Notifies promise about progress with given ````value````
+````javascript
+var promise = Vow.promise();
+promise.notify(20); // notifying promise with 20 value
+````
+
+####isFulfilled()####
+Returns true if the promise is fulfilled
+````javascript
+var promise = Vow.promise();
+promise.isFulfilled(); // returns false
+promise.fulfill('completed');
+promise.isFulfilled(); // returns true
+````
+
+####isRejected()####
+Returns true if the promise is rejected
+````javascript
+var promise = Vow.promise();
+promise.isRejected(); // returns false
+promise.reject(Error('internal error'));
+promise.isRejected(); // returns true
+````
+
+####isResolved()####
+Returns true if the promise is fulfilled or rejected
+````javascript
+var promise = Vow.promise();
+promise.isResolved(); // returns false
+promise.fulfill('completed'); // or promise.reject(Error('internal error'));
+promise.isResolved(); // returns true
+````
+
+####valueOf()####
+Returns value of the promise:
+ * value of fulfillment, if promise is fullfilled
+ * reason of rejection, if promise is rejected
+ * undefined, if promise is not resolved
+
+####then([onFulfilled], [onRejected], [onProgress], [context])####
+Are arranged for:
+ * ````onFulfilled```` to be called with the value after promise is fulfilled,
+ * ````onRejected```` to be called with the rejection reason after promise is rejected.
+ * ````onProgress```` to be called with the value when promise is notified about progress.
+ * ````context```` context of callbacks
+
+Returns a new promise. See [Promises/A+ specification](https://github.com/promises-aplus/promises-spec) for details.
+````javascript
+var promise = Vow.promise();
+promise.then(
+ function() { }, // to be called after promise is fulfilled
+ function() { }, // to be called after promise is rejected
+ function() { } // to be called when promise is notified
+ );
+````
+
+####fail(onRejected, [context])####
+Arranges to call ````onRejected```` with given ````context```` on the promise rejection reason if it is rejected. Shortcut for ````then(null, onRejected)````.
+````javascript
+var promise = Vow.promise();
+promise.fail(
+ function() { // to be called after promise is rejected
+ });
+promise.reject(Error('error'));
+````
+
+####always(onResolved, [context])####
+Arranges to call ````onResolved```` with given ````context```` on the promise if it is fulfilled or rejected.
+````javascript
+var promise = Vow.promise();
+promise.always(
+ function(promise) { // to be called after promise is fulfilled or rejected
+ });
+promise.fulfill('ok'); // or promise.reject(Error('error'));
+````
+
+####progress(onProgress, [context])####
+Arranges to call ````onProgress```` with given ````context```` on the promise if it is notified.
+Shortcut for ````then(null, null, onProgress)````.
+````javascript
+var promise = Vow.promise();
+promise.notify(
+ function(val) { // to be called when promise is notified
+ console.log('performed ' + val + '% of the job'); // -> performed 20% of the job
+ });
+promise.notify(20);
+````
+
+####spread([onFulfilled], [onRejected], [context])####
+Like "then", but "spreads" the array into a variadic value handler.
+It useful with [Vow.all](#allpromises), [Vow.allResolved](#allresolvedpromises) methods.
+````javascript
+var promise1 = Vow.promise(),
+ promise2 = Vow.promise();
+
+Vow.all([promise1, promise2]).spread(function(arg1, arg2) {
+ // arg1 should be "1", arg2 should be "'two'"
+});
+
+promise1.fulfill(1);
+promise2.fulfill('two');
+````
+
+####done([onFulfilled], [onRejected], [onProgress], [context])####
+Terminates a chain of promises. If the promise is rejected, throws it as an exception in a future turn of the event loop.
+````javascript
+var promise = Vow.promise();
+promise.reject(Error('Internal error'));
+promise.done(); // exception to be thrown
+````
+####delay(delay)####
+Returns a new promise that will be fulfilled in ````delay```` milliseconds if the promise is fulfilled, or immediately rejected if promise is rejected.
+
+####timeout(timeout)####
+Returns a new promise that will be rejected in ````timeout```` milliseconds if the promise is not resolved beforehand.
+````javascript
+var promise = Vow.promise(),
+ promiseWithTimeout1 = promise.timeout(50),
+ promiseWithTimeout2 = promise.timeout(200);
+
+setTimeout(
+ function() {
+ promise.fulfill('ok');
+ },
+ 100);
+
+promiseWithTimeout1.fail(function(e) {
+ // promiseWithTimeout to be rejected in 50ms
+});
+
+promiseWithTimeout2.then(function(val) {
+ // promiseWithTimeout to be fulfilled with "'ok'" value
+});
+````
+
+####sync(withPromise)####
+Synchronizes promise state with ````withPromise```` state. Shortcut for:
+````javascript
+withPromise.then(
+ function(val) {
+ promise.fulfill(val);
+ },
+ function(err) {
+ promise.reject(err);
+ },
+ function(val) {
+ promise.notify(val);
+ });
+````
+
+###Vow API###
+
+####isPromise(value)####
+Returns true if the given ````value```` is a promise.
+````javascript
+Vow.isPromise('value'); // returns false
+Vow.isPromise(Vow.promise()); // returns true
+````
+
+####when(value, [onFulfilled], [onRejected], [onProgress], [context])####
+Static equivalent to [promise.then](#thenonfulfilled-onrejected-onprogress-context). If given ````value```` is not a promise, then ````value```` is equivalent to fulfilled promise.
+
+####fail(value, onRejected, [context])####
+Static equivalent to [promise.fail](#failonrejected-context). If given ````value```` is not a promise, then ````value```` is equivalent to fulfilled promise.
+
+####always(value, onResolved, [context])####
+Static equivalent to [promise.always](#alwaysonresolved-context). If given ````value```` is not a promise, then ````value```` is equivalent to fulfilled promise.
+
+####progress(value, onProgress, [context])####
+Static equivalent to [promise.progress](#progressonprogress-context). If given ````value```` is not a promise, then ````value```` is equivalent to fulfilled promise.
+
+####spread(value, [onFulfilled], [onRejected], [context])####
+Static equivalent to [promise.spread](#spreadonfulfilled-onrejected-context).
+If given ````value```` is not a promise, then ````value```` is equivalent to fulfilled promise.
+
+####done(value, [onFulfilled], [onRejected], [onProgress], [context]])####
+Static equivalent to [promise.done](#doneonfulfilled-onrejected-onprogress-context).
+If given ````value```` is not a promise, then ````value```` is equivalent to fulfilled promise.
+
+####isFulfilled(value)####
+Static equivalent to [promise.isFulfilled](#isfulfilled).
+If given ````value```` is not a promise, then ````value```` is equivalent to fulfilled promise.
+
+####isRejected(value)####
+Static equivalent to [promise.isRejected](#isrejected).
+If given ````value```` is not a promise, then ````value```` is equivalent to fulfilled promise.
+
+####isResolved(value)####
+Static equivalent to [promise.isResolved](#isresolved).
+If given ````value```` is not a promise, then ````value```` is equivalent to fulfilled promise.
+
+####fulfill(value)####
+Returns a promise that has already been fulfilled with the given ````value````. If ````value```` is a promise, returned promise will be fulfilled with fulfill/rejection value of given promise.
+
+####reject(reason)####
+Returns a promise that has already been rejected with the given ````reason````. If ````reason```` is a promise, returned promise will be rejected with fulfill/rejection value of given promise.
+
+####resolve(value)####
+Returns a promise that has already been fulfilled with the given ````value````. If ````value```` is a promise, returns ````promise````.
+
+####invoke(fn, ...args)####
+Invokes a given function ````fn```` with arguments ````args````. Returned promise:
+ * will be fulfilled with returned value if value is not a promise
+ * will be rejected if function throw exception
+ * value will be returned if value is a promise
+
+````javascript
+var promise1 = Vow.invoke(function(value) {
+ return value;
+ }, 'ok'),
+ promise2 = Vow.invoke(function() {
+ throw Error();
+ });
+
+promise1.isFulfilled(); // true
+promise1.valueOf(); // 'ok'
+promise2.isRejected(); // true
+promise2.valueOf(); // instance of Error
+````
+
+####all(promisesOrValues)####
+Returns a promise to be fulfilled only after all the items in ````promisesOrValues```` are fulfilled, or to be rejected when any of the promises is rejected.
+
+````promisesOrValues```` can be Array:
+````javascript
+var promise1 = Vow.promise(),
+ promise2 = Vow.promise();
+
+Vow.all([promise1, promise2, 3])
+ .then(function(value) {
+ // value is [1, 2, 3]
+ });
+
+promise1.fulfill(1);
+promise2.fulfill(2);
+````
+or Object:
+````javascript
+var promise1 = Vow.promise(),
+ promise2 = Vow.promise();
+
+Vow.all({ a : promise1, b : promise2, c : 3 })
+ .then(function(value) {
+ // value is { a : 1, b : 2, c : 3 }
+ });
+
+promise1.fulfill(1);
+promise2.fulfill(2);
+````
+
+####allResolved(promisesOrValues)####
+Returns a promise to be fulfilled only after all the items in ````promisesOrValues```` are resolved.
+````javascript
+var promise1 = Vow.promise(),
+ promise2 = Vow.promise();
+
+Vow.allResolved([promise1, promise2])
+ .spread(function(promise1, promise2) {
+ promise1.valueOf(); // returns 'error'
+ promise2.valueOf(); // returns 'ok'
+ });
+
+promise1.reject('error');
+promise2.fulfill('ok');
+````
+
+####any(promisesOrValues)####
+Returns a promise to be fulfilled only when any of the items in ````promisesOrValues```` are fulfilled, or to be rejected when all the items are rejected (with the reason of the first rejected item).
+
+####delay(value, delay)####
+Static equivalent to [promise.delay](#delaydelay). If given ````value```` is not a promise, then ````value```` is equivalent to fulfilled promise.
+
+####timeout(value, timeout)####
+Static equivalent to [promise.timeout](#timeouttimeout). If given ````value```` is not a promise, then ````value```` is equivalent to fulfilled promise.
diff --git a/node_modules/csscomb/node_modules/vow/bower.json b/node_modules/csscomb/node_modules/vow/bower.json
new file mode 100644
index 0000000..4e5d1ec
--- /dev/null
+++ b/node_modules/csscomb/node_modules/vow/bower.json
@@ -0,0 +1,6 @@
+{
+ "name" : "vow",
+ "version" : "0.3.11",
+ "main" : "lib/vow.js",
+ "ignore" : ["**/.*", "node_modules", "benchmarks", "test", "Makefile"]
+}
\ No newline at end of file
diff --git a/node_modules/csscomb/node_modules/vow/lib/vow.js b/node_modules/csscomb/node_modules/vow/lib/vow.js
new file mode 100644
index 0000000..8e21afb
--- /dev/null
+++ b/node_modules/csscomb/node_modules/vow/lib/vow.js
@@ -0,0 +1,578 @@
+/**
+ * Vow
+ *
+ * Copyright (c) 2012-2013 Filatov Dmitry (dfilatov@yandex-team.ru)
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * @version 0.3.11
+ */
+
+(function(global) {
+
+var Promise = function(val) {
+ this._res = val;
+
+ this._isFulfilled = !!arguments.length;
+ this._isRejected = false;
+
+ this._fulfilledCallbacks = [];
+ this._rejectedCallbacks = [];
+ this._progressCallbacks = [];
+};
+
+Promise.prototype = {
+ valueOf : function() {
+ return this._res;
+ },
+
+ isFulfilled : function() {
+ return this._isFulfilled;
+ },
+
+ isRejected : function() {
+ return this._isRejected;
+ },
+
+ isResolved : function() {
+ return this._isFulfilled || this._isRejected;
+ },
+
+ fulfill : function(val) {
+ if(this.isResolved()) {
+ return;
+ }
+
+ this._isFulfilled = true;
+ this._res = val;
+
+ this._callCallbacks(this._fulfilledCallbacks, val);
+ this._fulfilledCallbacks = this._rejectedCallbacks = this._progressCallbacks = undef;
+ },
+
+ reject : function(err) {
+ if(this.isResolved()) {
+ return;
+ }
+
+ this._isRejected = true;
+ this._res = err;
+
+ this._callCallbacks(this._rejectedCallbacks, err);
+ this._fulfilledCallbacks = this._rejectedCallbacks = this._progressCallbacks = undef;
+ },
+
+ notify : function(val) {
+ if(this.isResolved()) {
+ return;
+ }
+
+ this._callCallbacks(this._progressCallbacks, val);
+ },
+
+ then : function(onFulfilled, onRejected, onProgress, ctx) {
+ if(onRejected && !isFunction(onRejected)) {
+ ctx = onRejected;
+ onRejected = undef;
+ }
+ else if(onProgress && !isFunction(onProgress)) {
+ ctx = onProgress;
+ onProgress = undef;
+ }
+
+ var promise = new Promise(),
+ cb;
+
+ if(!this._isRejected) {
+ cb = { promise : promise, fn : isFunction(onFulfilled)? onFulfilled : undef, ctx : ctx };
+ this._isFulfilled?
+ this._callCallbacks([cb], this._res) :
+ this._fulfilledCallbacks.push(cb);
+ }
+
+ if(!this._isFulfilled) {
+ cb = { promise : promise, fn : onRejected, ctx : ctx };
+ this._isRejected?
+ this._callCallbacks([cb], this._res) :
+ this._rejectedCallbacks.push(cb);
+ }
+
+ this.isResolved() || this._progressCallbacks.push({ promise : promise, fn : onProgress, ctx : ctx });
+
+ return promise;
+ },
+
+ fail : function(onRejected, ctx) {
+ return this.then(undef, onRejected, ctx);
+ },
+
+ always : function(onResolved, ctx) {
+ var _this = this,
+ cb = function() {
+ return onResolved.call(this, _this);
+ };
+
+ return this.then(cb, cb, ctx);
+ },
+
+ progress : function(onProgress, ctx) {
+ return this.then(undef, undef, onProgress, ctx);
+ },
+
+ spread : function(onFulfilled, onRejected, ctx) {
+ return this.then(
+ function(val) {
+ return onFulfilled.apply(this, val);
+ },
+ onRejected,
+ ctx);
+ },
+
+ done : function(onFulfilled, onRejected, onProgress, ctx) {
+ this
+ .then(onFulfilled, onRejected, onProgress, ctx)
+ .fail(throwException);
+ },
+
+ delay : function(delay) {
+ var timer,
+ promise = this.then(function(val) {
+ var promise = new Promise();
+ timer = setTimeout(
+ function() {
+ promise.fulfill(val);
+ },
+ delay);
+
+ return promise;
+ });
+
+ promise.always(function() {
+ clearTimeout(timer);
+ });
+
+ return promise;
+ },
+
+ timeout : function(timeout) {
+ var promise = new Promise(),
+ timer = setTimeout(
+ function() {
+ promise.reject(Error('timed out'));
+ },
+ timeout);
+
+ promise.sync(this);
+ promise.always(function() {
+ clearTimeout(timer);
+ });
+
+ return promise;
+ },
+
+ sync : function(promise) {
+ promise.then(
+ this.fulfill,
+ this.reject,
+ this.notify,
+ this);
+ },
+
+ _callCallbacks : function(callbacks, arg) {
+ var len = callbacks.length;
+ if(!len) {
+ return;
+ }
+
+ var isResolved = this.isResolved(),
+ isFulfilled = this.isFulfilled();
+
+ nextTick(function() {
+ var i = 0, cb, promise, fn;
+ while(i < len) {
+ cb = callbacks[i++];
+ promise = cb.promise;
+ fn = cb.fn;
+
+ if(fn) {
+ var ctx = cb.ctx,
+ res;
+ try {
+ res = ctx? fn.call(ctx, arg) : fn(arg);
+ }
+ catch(e) {
+ promise.reject(e);
+ continue;
+ }
+
+ isResolved?
+ Vow.isPromise(res)?
+ (function(promise) {
+ res.then(
+ function(val) {
+ promise.fulfill(val);
+ },
+ function(err) {
+ promise.reject(err);
+ },
+ function(val) {
+ promise.notify(val);
+ });
+ })(promise) :
+ promise.fulfill(res) :
+ promise.notify(res);
+ }
+ else {
+ isResolved?
+ isFulfilled?
+ promise.fulfill(arg) :
+ promise.reject(arg) :
+ promise.notify(arg);
+ }
+ }
+ });
+ }
+};
+
+var Vow = {
+ promise : function(val) {
+ return arguments.length?
+ Vow.isPromise(val)?
+ val :
+ new Promise(val) :
+ new Promise();
+ },
+
+ when : function(obj, onFulfilled, onRejected, onProgress, ctx) {
+ return Vow.promise(obj).then(onFulfilled, onRejected, onProgress, ctx);
+ },
+
+ fail : function(obj, onRejected, ctx) {
+ return Vow.when(obj, undef, onRejected, ctx);
+ },
+
+ always : function(obj, onResolved, ctx) {
+ return Vow.promise(obj).always(onResolved, ctx);
+ },
+
+ progress : function(obj, onProgress, ctx) {
+ return Vow.promise(obj).progress(onProgress, ctx);
+ },
+
+ spread : function(obj, onFulfilled, onRejected, ctx) {
+ return Vow.promise(obj).spread(onFulfilled, onRejected, ctx);
+ },
+
+ done : function(obj, onFulfilled, onRejected, onProgress, ctx) {
+ Vow.promise(obj).done(onFulfilled, onRejected, onProgress, ctx);
+ },
+
+ isPromise : function(obj) {
+ return obj && isFunction(obj.then);
+ },
+
+ valueOf : function(obj) {
+ return Vow.isPromise(obj)? obj.valueOf() : obj;
+ },
+
+ isFulfilled : function(obj) {
+ return Vow.isPromise(obj)? obj.isFulfilled() : true;
+ },
+
+ isRejected : function(obj) {
+ return Vow.isPromise(obj)? obj.isRejected() : false;
+ },
+
+ isResolved : function(obj) {
+ return Vow.isPromise(obj)? obj.isResolved() : true;
+ },
+
+ fulfill : function(val) {
+ return Vow.when(val, undef, function(err) {
+ return err;
+ });
+ },
+
+ reject : function(err) {
+ return Vow.when(err, function(val) {
+ var promise = new Promise();
+ promise.reject(val);
+ return promise;
+ });
+ },
+
+ resolve : function(val) {
+ return Vow.isPromise(val)? val : Vow.when(val);
+ },
+
+ invoke : function(fn) {
+ try {
+ return Vow.promise(fn.apply(global, slice.call(arguments, 1)));
+ }
+ catch(e) {
+ return Vow.reject(e);
+ }
+ },
+
+ forEach : function(promises, onFulfilled, onRejected, keys) {
+ var len = keys? keys.length : promises.length,
+ i = 0;
+ while(i < len) {
+ Vow.when(promises[keys? keys[i] : i], onFulfilled, onRejected);
+ ++i;
+ }
+ },
+
+ all : function(promises) {
+ var resPromise = new Promise(),
+ isPromisesArray = isArray(promises),
+ keys = isPromisesArray?
+ getArrayKeys(promises) :
+ getObjectKeys(promises),
+ len = keys.length,
+ res = isPromisesArray? [] : {};
+
+ if(!len) {
+ resPromise.fulfill(res);
+ return resPromise;
+ }
+
+ var i = len,
+ onFulfilled = function() {
+ if(!--i) {
+ var j = 0;
+ while(j < len) {
+ res[keys[j]] = Vow.valueOf(promises[keys[j++]]);
+ }
+ resPromise.fulfill(res);
+ }
+ },
+ onRejected = function(err) {
+ resPromise.reject(err);
+ };
+
+ Vow.forEach(promises, onFulfilled, onRejected, keys);
+
+ return resPromise;
+ },
+
+ allResolved : function(promises) {
+ var resPromise = new Promise(),
+ isPromisesArray = isArray(promises),
+ keys = isPromisesArray?
+ getArrayKeys(promises) :
+ getObjectKeys(promises),
+ i = keys.length,
+ res = isPromisesArray? [] : {};
+
+ if(!i) {
+ resPromise.fulfill(res);
+ return resPromise;
+ }
+
+ var onProgress = function() {
+ --i || resPromise.fulfill(promises);
+ };
+
+ Vow.forEach(promises, onProgress, onProgress, keys);
+
+ return resPromise;
+ },
+
+ allPatiently : function(promises) {
+ return Vow.allResolved(promises).then(function() {
+ var isPromisesArray = isArray(promises),
+ keys = isPromisesArray?
+ getArrayKeys(promises) :
+ getObjectKeys(promises),
+ rejectedPromises, fulfilledPromises,
+ len = keys.length, i = 0, key, promise;
+
+ if(!len) {
+ return isPromisesArray? [] : {};
+ }
+
+ while(i < len) {
+ key = keys[i++];
+ promise = promises[key];
+ if(Vow.isRejected(promise)) {
+ rejectedPromises || (rejectedPromises = isPromisesArray? [] : {});
+ isPromisesArray?
+ rejectedPromises.push(promise.valueOf()) :
+ rejectedPromises[key] = promise.valueOf();
+ }
+ else if(!rejectedPromises) {
+ (fulfilledPromises || (fulfilledPromises = isPromisesArray? [] : {}))[key] = Vow.valueOf(promise);
+ }
+ }
+
+ if(rejectedPromises) {
+ throw rejectedPromises;
+ }
+
+ return fulfilledPromises;
+ });
+ },
+
+ any : function(promises) {
+ var resPromise = new Promise(),
+ len = promises.length;
+
+ if(!len) {
+ resPromise.reject(Error());
+ return resPromise;
+ }
+
+ var i = 0, err,
+ onFulfilled = function(val) {
+ resPromise.fulfill(val);
+ },
+ onRejected = function(e) {
+ i || (err = e);
+ ++i === len && resPromise.reject(err);
+ };
+
+ Vow.forEach(promises, onFulfilled, onRejected);
+
+ return resPromise;
+ },
+
+ delay : function(val, timeout) {
+ return Vow.promise(val).delay(timeout);
+ },
+
+ timeout : function(val, timeout) {
+ return Vow.promise(val).timeout(timeout);
+ }
+};
+
+var undef,
+ nextTick = (function() {
+ var fns = [],
+ enqueueFn = function(fn) {
+ return fns.push(fn) === 1;
+ },
+ callFns = function() {
+ var fnsToCall = fns, i = 0, len = fns.length;
+ fns = [];
+ while(i < len) {
+ fnsToCall[i++]();
+ }
+ };
+
+ if(typeof setImmediate === 'function') { // ie10, nodejs >= 0.10
+ return function(fn) {
+ enqueueFn(fn) && setImmediate(callFns);
+ };
+ }
+
+ if(typeof process === 'object' && process.nextTick) { // nodejs < 0.10
+ return function(fn) {
+ enqueueFn(fn) && process.nextTick(callFns);
+ };
+ }
+
+ if(global.postMessage) { // modern browsers
+ var isPostMessageAsync = true;
+ if(global.attachEvent) {
+ var checkAsync = function() {
+ isPostMessageAsync = false;
+ };
+ global.attachEvent('onmessage', checkAsync);
+ global.postMessage('__checkAsync', '*');
+ global.detachEvent('onmessage', checkAsync);
+ }
+
+ if(isPostMessageAsync) {
+ var msg = '__promise' + +new Date,
+ onMessage = function(e) {
+ if(e.data === msg) {
+ e.stopPropagation && e.stopPropagation();
+ callFns();
+ }
+ };
+
+ global.addEventListener?
+ global.addEventListener('message', onMessage, true) :
+ global.attachEvent('onmessage', onMessage);
+
+ return function(fn) {
+ enqueueFn(fn) && global.postMessage(msg, '*');
+ };
+ }
+ }
+
+ var doc = global.document;
+ if('onreadystatechange' in doc.createElement('script')) { // ie6-ie8
+ var createScript = function() {
+ var script = doc.createElement('script');
+ script.onreadystatechange = function() {
+ script.parentNode.removeChild(script);
+ script = script.onreadystatechange = null;
+ callFns();
+ };
+ (doc.documentElement || doc.body).appendChild(script);
+ };
+
+ return function(fn) {
+ enqueueFn(fn) && createScript();
+ };
+ }
+
+ return function(fn) { // old browsers
+ enqueueFn(fn) && setTimeout(callFns, 0);
+ };
+ })(),
+ throwException = function(e) {
+ nextTick(function() {
+ throw e;
+ });
+ },
+ isFunction = function(obj) {
+ return typeof obj === 'function';
+ },
+ slice = Array.prototype.slice,
+ toStr = Object.prototype.toString,
+ isArray = Array.isArray || function(obj) {
+ return toStr.call(obj) === '[object Array]';
+ },
+ getArrayKeys = function(arr) {
+ var res = [],
+ i = 0, len = arr.length;
+ while(i < len) {
+ res.push(i++);
+ }
+ return res;
+ },
+ getObjectKeys = Object.keys || function(obj) {
+ var res = [];
+ for(var i in obj) {
+ obj.hasOwnProperty(i) && res.push(i);
+ }
+ return res;
+ };
+
+var defineAsGlobal = true;
+if(typeof exports === 'object') {
+ module.exports = Vow;
+ defineAsGlobal = false;
+}
+
+if(typeof modules === 'object') {
+ modules.define('vow', function(provide) {
+ provide(Vow);
+ });
+ defineAsGlobal = false;
+}
+
+if(typeof define === 'function') {
+ define(function(require, exports, module) {
+ module.exports = Vow;
+ });
+ defineAsGlobal = false;
+}
+
+defineAsGlobal && (global.Vow = Vow);
+
+})(this);
\ No newline at end of file
diff --git a/node_modules/csscomb/node_modules/vow/package.json b/node_modules/csscomb/node_modules/vow/package.json
new file mode 100644
index 0000000..a27ed09
--- /dev/null
+++ b/node_modules/csscomb/node_modules/vow/package.json
@@ -0,0 +1,52 @@
+{
+ "name": "vow",
+ "version": "0.3.11",
+ "description": "Promises/A+ proposal compatible promises library",
+ "homepage": "https://github.com/dfilatov/vow",
+ "keywords": [
+ "nodejs",
+ "browser",
+ "async",
+ "promise",
+ "a+"
+ ],
+ "author": {
+ "name": "Dmitry Filatov",
+ "email": "dfilatov@yandex-team.ru"
+ },
+ "contributors": [
+ {
+ "name": "Dmitry Filatov",
+ "email": "dfilatov@yandex-team.ru"
+ }
+ ],
+ "repository": {
+ "type": "git",
+ "url": "http://github.com/dfilatov/vow.git"
+ },
+ "dependencies": {},
+ "devDependencies": {
+ "nodeunit": "",
+ "istanbul": "",
+ "uglify-js": "1.3.4",
+ "promises-aplus-tests": "1.3.2"
+ },
+ "main": "lib/vow",
+ "engines": {
+ "node": ">= 0.4.0"
+ },
+ "scripts": {
+ "test": "./node_modules/istanbul/lib/cli.js test test/utils/runner.js"
+ },
+ "readme": "
\r\nVow [](http://travis-ci.org/dfilatov/vow)\r\n=========\r\n\r\nPromises/A+ implementation.\r\nSee https://github.com/promises-aplus/promises-spec.\r\n\r\nGetting Started\r\n---------------\r\n###In Node.js###\r\nYou can install using Node Package Manager (npm):\r\n\r\n npm install vow\r\n\r\n###In Browsers###\r\n```html\r\n\r\n```\r\nIt also supports RequireJS module format and [YM module](https://github.com/ymaps/modules) format.\r\n\r\nVow has been tested in IE6+, Mozilla Firefox 3+, Chrome 5+, Safari 5+, Opera 10+.\r\n\r\nAPI\r\n---\r\n * [Creating promise](#vowpromisevalue)\r\n * [Promise API](#promise-api)\r\n * [fulfill](#fulfillvalue)\r\n * [reject](#rejectreason)\r\n * [notify](#notifyvalue)\r\n * [isFulfilled](#isfulfilled)\r\n * [isRejected](#isrejected)\r\n * [isResolved](#isresolved)\r\n * [valueOf](#valueof)\r\n * [then](#thenonfulfilled-onrejected-onprogress-context)\r\n * [fail](#failonrejected-context)\r\n * [always](#alwaysonresolved-context)\r\n * [progress](#progressonprogress-context)\r\n * [spread](#spreadonfulfilled-onrejected-context)\r\n * [done](#doneonfulfilled-onrejected-onprogress-context)\r\n * [delay](#delaydelay)\r\n * [timeout](#timeouttimeout)\r\n * [sync](#syncwithpromise)\r\n * [Vow API](#vow-api)\r\n * [isPromise](#ispromisevalue)\r\n * [when](#whenvalue-onfulfilled-onrejected-onprogress-context)\r\n * [fail](#failvalue-onrejected-context)\r\n * [always](#alwaysvalue-onresolved-context)\r\n * [progress](#progressvalue-onprogress-context)\r\n * [spread](#spreadvalue-onfulfilled-onrejected-context)\r\n * [done](#donevalue-onfulfilled-onrejected-onprogress-context)\r\n * [isFulfilled](#isfulfilledvalue)\r\n * [isRejected](#isrejectedvalue)\r\n * [isResolved](#isresolvededvalue)\r\n * [fulfill](#fulfillvalue-1)\r\n * [reject](#rejectreason-1)\r\n * [resolve](#resolvevalue)\r\n * [invoke](#invokefn-args)\r\n * [all](#allpromisesorvalues)\r\n * [allResolved](#allresolvedpromisesorvalues)\r\n * [any](#anypromisesorvalues)\r\n * [delay](#delayvalue-delay)\r\n * [timeout](#timeoutvalue-timeout)\r\n\r\n####Vow.promise([value])####\r\nCreates a new promise if no ````value```` given, or creates a new fulfilled promise if the ````value```` is not a promise, or returns ````value```` if the given ````value```` is a promise.\r\n````javascript\r\nvar promise = Vow.promise(), // creating a new promise\r\n fulfilledPromise = Vow.promise('ok'), // creating a new fulfilled promise\r\n anotherPromise = Vow.promise(existingPromise); // anotherPromise is equal to the existingPromise\r\n````\r\n###Promise API###\r\n####fulfill(value)####\r\nFulfills promise with given ````value````\r\n````javascript\r\nvar promise = Vow.promise();\r\npromise.fulfill('completed'); // fulfilling promise with 'completed' value\r\n````\r\n####reject(reason)####\r\nRejects promise with given ````reason````\r\n````javascript\r\nvar promise = Vow.promise();\r\npromise.reject(Error('internal error')); // rejecting promise with Error object\r\n````\r\n####notify(value)####\r\nNotifies promise about progress with given ````value````\r\n````javascript\r\nvar promise = Vow.promise();\r\npromise.notify(20); // notifying promise with 20 value\r\n````\r\n\r\n####isFulfilled()####\r\nReturns true if the promise is fulfilled\r\n````javascript\r\nvar promise = Vow.promise();\r\npromise.isFulfilled(); // returns false\r\npromise.fulfill('completed');\r\npromise.isFulfilled(); // returns true\r\n````\r\n\r\n####isRejected()####\r\nReturns true if the promise is rejected\r\n````javascript\r\nvar promise = Vow.promise();\r\npromise.isRejected(); // returns false\r\npromise.reject(Error('internal error'));\r\npromise.isRejected(); // returns true\r\n````\r\n\r\n####isResolved()####\r\nReturns true if the promise is fulfilled or rejected\r\n````javascript\r\nvar promise = Vow.promise();\r\npromise.isResolved(); // returns false\r\npromise.fulfill('completed'); // or promise.reject(Error('internal error'));\r\npromise.isResolved(); // returns true\r\n````\r\n\r\n####valueOf()####\r\nReturns value of the promise:\r\n * value of fulfillment, if promise is fullfilled\r\n * reason of rejection, if promise is rejected\r\n * undefined, if promise is not resolved\r\n\r\n####then([onFulfilled], [onRejected], [onProgress], [context])####\r\nAre arranged for:\r\n * ````onFulfilled```` to be called with the value after promise is fulfilled,\r\n * ````onRejected```` to be called with the rejection reason after promise is rejected.\r\n * ````onProgress```` to be called with the value when promise is notified about progress.\r\n * ````context```` context of callbacks\r\n\r\nReturns a new promise. See [Promises/A+ specification](https://github.com/promises-aplus/promises-spec) for details.\r\n````javascript\r\nvar promise = Vow.promise();\r\npromise.then(\r\n function() { }, // to be called after promise is fulfilled\r\n function() { }, // to be called after promise is rejected\r\n function() { } // to be called when promise is notified\r\n );\r\n````\r\n\r\n####fail(onRejected, [context])####\r\nArranges to call ````onRejected```` with given ````context```` on the promise rejection reason if it is rejected. Shortcut for ````then(null, onRejected)````.\r\n````javascript\r\nvar promise = Vow.promise();\r\npromise.fail(\r\n function() { // to be called after promise is rejected\r\n });\r\npromise.reject(Error('error'));\r\n````\r\n\r\n####always(onResolved, [context])####\r\nArranges to call ````onResolved```` with given ````context```` on the promise if it is fulfilled or rejected.\r\n````javascript\r\nvar promise = Vow.promise();\r\npromise.always(\r\n function(promise) { // to be called after promise is fulfilled or rejected\r\n });\r\npromise.fulfill('ok'); // or promise.reject(Error('error'));\r\n````\r\n\r\n####progress(onProgress, [context])####\r\nArranges to call ````onProgress```` with given ````context```` on the promise if it is notified.\r\nShortcut for ````then(null, null, onProgress)````.\r\n````javascript\r\nvar promise = Vow.promise();\r\npromise.notify(\r\n function(val) { // to be called when promise is notified\r\n console.log('performed ' + val + '% of the job'); // -> performed 20% of the job\r\n });\r\npromise.notify(20);\r\n````\r\n\r\n####spread([onFulfilled], [onRejected], [context])####\r\nLike \"then\", but \"spreads\" the array into a variadic value handler.\r\nIt useful with [Vow.all](#allpromises), [Vow.allResolved](#allresolvedpromises) methods.\r\n````javascript\r\nvar promise1 = Vow.promise(),\r\n promise2 = Vow.promise();\r\n\r\nVow.all([promise1, promise2]).spread(function(arg1, arg2) {\r\n // arg1 should be \"1\", arg2 should be \"'two'\"\r\n});\r\n\r\npromise1.fulfill(1);\r\npromise2.fulfill('two');\r\n````\r\n\r\n####done([onFulfilled], [onRejected], [onProgress], [context])####\r\nTerminates a chain of promises. If the promise is rejected, throws it as an exception in a future turn of the event loop.\r\n````javascript\r\nvar promise = Vow.promise();\r\npromise.reject(Error('Internal error'));\r\npromise.done(); // exception to be thrown\r\n````\r\n####delay(delay)####\r\nReturns a new promise that will be fulfilled in ````delay```` milliseconds if the promise is fulfilled, or immediately rejected if promise is rejected.\r\n\r\n####timeout(timeout)####\r\nReturns a new promise that will be rejected in ````timeout```` milliseconds if the promise is not resolved beforehand.\r\n````javascript\r\nvar promise = Vow.promise(),\r\n promiseWithTimeout1 = promise.timeout(50),\r\n promiseWithTimeout2 = promise.timeout(200);\r\n\r\nsetTimeout(\r\n function() {\r\n promise.fulfill('ok');\r\n },\r\n 100);\r\n\r\npromiseWithTimeout1.fail(function(e) {\r\n // promiseWithTimeout to be rejected in 50ms\r\n});\r\n\r\npromiseWithTimeout2.then(function(val) {\r\n // promiseWithTimeout to be fulfilled with \"'ok'\" value\r\n});\r\n````\r\n\r\n####sync(withPromise)####\r\nSynchronizes promise state with ````withPromise```` state. Shortcut for:\r\n````javascript\r\nwithPromise.then(\r\n function(val) {\r\n promise.fulfill(val);\r\n },\r\n function(err) {\r\n promise.reject(err);\r\n },\r\n function(val) {\r\n promise.notify(val);\r\n });\r\n````\r\n\r\n###Vow API###\r\n\r\n####isPromise(value)####\r\nReturns true if the given ````value```` is a promise.\r\n````javascript\r\nVow.isPromise('value'); // returns false\r\nVow.isPromise(Vow.promise()); // returns true\r\n````\r\n\r\n####when(value, [onFulfilled], [onRejected], [onProgress], [context])####\r\nStatic equivalent to [promise.then](#thenonfulfilled-onrejected-onprogress-context). If given ````value```` is not a promise, then ````value```` is equivalent to fulfilled promise.\r\n\r\n####fail(value, onRejected, [context])####\r\nStatic equivalent to [promise.fail](#failonrejected-context). If given ````value```` is not a promise, then ````value```` is equivalent to fulfilled promise.\r\n\r\n####always(value, onResolved, [context])####\r\nStatic equivalent to [promise.always](#alwaysonresolved-context). If given ````value```` is not a promise, then ````value```` is equivalent to fulfilled promise.\r\n\r\n####progress(value, onProgress, [context])####\r\nStatic equivalent to [promise.progress](#progressonprogress-context). If given ````value```` is not a promise, then ````value```` is equivalent to fulfilled promise.\r\n\r\n####spread(value, [onFulfilled], [onRejected], [context])####\r\nStatic equivalent to [promise.spread](#spreadonfulfilled-onrejected-context).\r\nIf given ````value```` is not a promise, then ````value```` is equivalent to fulfilled promise.\r\n\r\n####done(value, [onFulfilled], [onRejected], [onProgress], [context]])####\r\nStatic equivalent to [promise.done](#doneonfulfilled-onrejected-onprogress-context).\r\nIf given ````value```` is not a promise, then ````value```` is equivalent to fulfilled promise.\r\n\r\n####isFulfilled(value)####\r\nStatic equivalent to [promise.isFulfilled](#isfulfilled).\r\nIf given ````value```` is not a promise, then ````value```` is equivalent to fulfilled promise.\r\n\r\n####isRejected(value)####\r\nStatic equivalent to [promise.isRejected](#isrejected).\r\nIf given ````value```` is not a promise, then ````value```` is equivalent to fulfilled promise.\r\n\r\n####isResolved(value)####\r\nStatic equivalent to [promise.isResolved](#isresolved).\r\nIf given ````value```` is not a promise, then ````value```` is equivalent to fulfilled promise.\r\n\r\n####fulfill(value)####\r\nReturns a promise that has already been fulfilled with the given ````value````. If ````value```` is a promise, returned promise will be fulfilled with fulfill/rejection value of given promise.\r\n\r\n####reject(reason)####\r\nReturns a promise that has already been rejected with the given ````reason````. If ````reason```` is a promise, returned promise will be rejected with fulfill/rejection value of given promise.\r\n\r\n####resolve(value)####\r\nReturns a promise that has already been fulfilled with the given ````value````. If ````value```` is a promise, returns ````promise````.\r\n\r\n####invoke(fn, ...args)####\r\nInvokes a given function ````fn```` with arguments ````args````. Returned promise:\r\n * will be fulfilled with returned value if value is not a promise\r\n * will be rejected if function throw exception\r\n * value will be returned if value is a promise\r\n\r\n````javascript\r\nvar promise1 = Vow.invoke(function(value) {\r\n return value;\r\n }, 'ok'),\r\n promise2 = Vow.invoke(function() {\r\n throw Error();\r\n });\r\n\r\npromise1.isFulfilled(); // true\r\npromise1.valueOf(); // 'ok'\r\npromise2.isRejected(); // true\r\npromise2.valueOf(); // instance of Error\r\n````\r\n\r\n####all(promisesOrValues)####\r\nReturns a promise to be fulfilled only after all the items in ````promisesOrValues```` are fulfilled, or to be rejected when any of the promises is rejected.\r\n\r\n````promisesOrValues```` can be Array:\r\n````javascript\r\nvar promise1 = Vow.promise(),\r\n promise2 = Vow.promise();\r\n\r\nVow.all([promise1, promise2, 3])\r\n .then(function(value) {\r\n // value is [1, 2, 3]\r\n });\r\n\r\npromise1.fulfill(1);\r\npromise2.fulfill(2);\r\n````\r\nor Object:\r\n````javascript\r\nvar promise1 = Vow.promise(),\r\n promise2 = Vow.promise();\r\n\r\nVow.all({ a : promise1, b : promise2, c : 3 })\r\n .then(function(value) {\r\n // value is { a : 1, b : 2, c : 3 }\r\n });\r\n\r\npromise1.fulfill(1);\r\npromise2.fulfill(2);\r\n````\r\n\r\n####allResolved(promisesOrValues)####\r\nReturns a promise to be fulfilled only after all the items in ````promisesOrValues```` are resolved.\r\n````javascript\r\nvar promise1 = Vow.promise(),\r\n promise2 = Vow.promise();\r\n\r\nVow.allResolved([promise1, promise2])\r\n .spread(function(promise1, promise2) {\r\n promise1.valueOf(); // returns 'error'\r\n promise2.valueOf(); // returns 'ok'\r\n });\r\n\r\npromise1.reject('error');\r\npromise2.fulfill('ok');\r\n````\r\n\r\n####any(promisesOrValues)####\r\nReturns a promise to be fulfilled only when any of the items in ````promisesOrValues```` are fulfilled, or to be rejected when all the items are rejected (with the reason of the first rejected item).\r\n\r\n####delay(value, delay)####\r\nStatic equivalent to [promise.delay](#delaydelay). If given ````value```` is not a promise, then ````value```` is equivalent to fulfilled promise.\r\n\r\n####timeout(value, timeout)####\r\nStatic equivalent to [promise.timeout](#timeouttimeout). If given ````value```` is not a promise, then ````value```` is equivalent to fulfilled promise.\r\n",
+ "readmeFilename": "README.md",
+ "bugs": {
+ "url": "https://github.com/dfilatov/vow/issues"
+ },
+ "_id": "vow@0.3.11",
+ "dist": {
+ "shasum": "9f8e740544c56010a621fd15fa6214257011b7d7"
+ },
+ "_from": "vow@0.3.11",
+ "_resolved": "https://registry.npmjs.org/vow/-/vow-0.3.11.tgz"
+}
diff --git a/node_modules/csscomb/node_modules/vow/vow.min.js b/node_modules/csscomb/node_modules/vow/vow.min.js
new file mode 100644
index 0000000..10aeb34
--- /dev/null
+++ b/node_modules/csscomb/node_modules/vow/vow.min.js
@@ -0,0 +1,10 @@
+/**
+ * Vow
+ *
+ * Copyright (c) 2012-2013 Filatov Dmitry (dfilatov@yandex-team.ru)
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * @version 0.3.10
+ */(function(e){var t=function(e){this._res=e,this._isFulfilled=!!arguments.length,this._isRejected=!1,this._fulfilledCallbacks=[],this._rejectedCallbacks=[],this._progressCallbacks=[]};t.prototype={valueOf:function(){return this._res},isFulfilled:function(){return this._isFulfilled},isRejected:function(){return this._isRejected},isResolved:function(){return this._isFulfilled||this._isRejected},fulfill:function(e){if(this.isResolved())return;this._isFulfilled=!0,this._res=e,this._callCallbacks(this._fulfilledCallbacks,e),this._fulfilledCallbacks=this._rejectedCallbacks=this._progressCallbacks=r},reject:function(e){if(this.isResolved())return;this._isRejected=!0,this._res=e,this._callCallbacks(this._rejectedCallbacks,e),this._fulfilledCallbacks=this._rejectedCallbacks=this._progressCallbacks=r},notify:function(e){if(this.isResolved())return;this._callCallbacks(this._progressCallbacks,e)},then:function(e,n,i,s){n&&!o(n)?(s=n,n=r):i&&!o(i)&&(s=i,i=r);var u=new t,a;return this._isRejected||(a={promise:u,fn:o(e)?e:r,ctx:s},this._isFulfilled?this._callCallbacks([a],this._res):this._fulfilledCallbacks.push(a)),this._isFulfilled||(a={promise:u,fn:n,ctx:s},this._isRejected?this._callCallbacks([a],this._res):this._rejectedCallbacks.push(a)),this.isResolved()||this._progressCallbacks.push({promise:u,fn:i,ctx:s}),u},fail:function(e,t){return this.then(r,e,t)},always:function(e,t){var n=this,r=function(){return e.call(this,n)};return this.then(r,r,t)},progress:function(e,t){return this.then(r,r,e,t)},spread:function(e,t,n){return this.then(function(t){return e.apply(this,t)},t,n)},done:function(e,t,n,r){this.then(e,t,n,r).fail(s)},delay:function(e){return this.then(function(n){var r=new t;return setTimeout(function(){r.fulfill(n)},e),r})},timeout:function(e){var n=new t,r=setTimeout(function(){n.reject(Error("timed out"))},e);return n.sync(this),n.always(function(){clearTimeout(r)}),n},sync:function(e){e.then(this.fulfill,this.reject,this.notify,this)},_callCallbacks:function(e,t){var r=e.length;if(!r)return;var s=this.isResolved(),o=this.isFulfilled();i(function(){var i=0,u,a,f;while(i