From f8262d8fbc2adcdef49e04dcbc8060822fa84e3e Mon Sep 17 00:00:00 2001 From: Peter Dave Hello Date: Sun, 13 Jul 2014 01:33:37 +0800 Subject: [PATCH] add RxJS v2.2.28 --- ajax/libs/rxjs/2.2.28/rx.aggregates.js | 702 ++ ajax/libs/rxjs/2.2.28/rx.aggregates.min.js | 1 + ajax/libs/rxjs/2.2.28/rx.all.compat.js | 9421 ++++++++++++++++++ ajax/libs/rxjs/2.2.28/rx.all.compat.min.js | 3 + ajax/libs/rxjs/2.2.28/rx.all.js | 9235 +++++++++++++++++ ajax/libs/rxjs/2.2.28/rx.all.min.js | 3 + ajax/libs/rxjs/2.2.28/rx.async.compat.js | 397 + ajax/libs/rxjs/2.2.28/rx.async.compat.min.js | 1 + ajax/libs/rxjs/2.2.28/rx.async.js | 329 + ajax/libs/rxjs/2.2.28/rx.async.min.js | 1 + ajax/libs/rxjs/2.2.28/rx.backpressure.js | 410 + ajax/libs/rxjs/2.2.28/rx.backpressure.min.js | 1 + ajax/libs/rxjs/2.2.28/rx.binding.js | 561 ++ ajax/libs/rxjs/2.2.28/rx.binding.min.js | 1 + ajax/libs/rxjs/2.2.28/rx.coincidence.js | 733 ++ ajax/libs/rxjs/2.2.28/rx.coincidence.min.js | 1 + ajax/libs/rxjs/2.2.28/rx.compat.js | 4758 +++++++++ ajax/libs/rxjs/2.2.28/rx.compat.min.js | 2 + ajax/libs/rxjs/2.2.28/rx.core.compat.js | 2627 +++++ ajax/libs/rxjs/2.2.28/rx.core.compat.min.js | 1 + ajax/libs/rxjs/2.2.28/rx.core.js | 2509 +++++ ajax/libs/rxjs/2.2.28/rx.core.min.js | 1 + ajax/libs/rxjs/2.2.28/rx.experimental.js | 471 + ajax/libs/rxjs/2.2.28/rx.experimental.min.js | 1 + ajax/libs/rxjs/2.2.28/rx.joinpatterns.js | 415 + ajax/libs/rxjs/2.2.28/rx.joinpatterns.min.js | 1 + ajax/libs/rxjs/2.2.28/rx.js | 4640 +++++++++ ajax/libs/rxjs/2.2.28/rx.lite.compat.js | 6038 +++++++++++ ajax/libs/rxjs/2.2.28/rx.lite.compat.min.js | 2 + ajax/libs/rxjs/2.2.28/rx.lite.extras.js | 664 ++ ajax/libs/rxjs/2.2.28/rx.lite.extras.min.js | 1 + ajax/libs/rxjs/2.2.28/rx.lite.js | 5852 +++++++++++ ajax/libs/rxjs/2.2.28/rx.lite.min.js | 2 + ajax/libs/rxjs/2.2.28/rx.min.js | 2 + ajax/libs/rxjs/2.2.28/rx.testing.js | 500 + ajax/libs/rxjs/2.2.28/rx.testing.min.js | 1 + ajax/libs/rxjs/2.2.28/rx.time.js | 1166 +++ ajax/libs/rxjs/2.2.28/rx.time.min.js | 1 + ajax/libs/rxjs/2.2.28/rx.virtualtime.js | 335 + ajax/libs/rxjs/2.2.28/rx.virtualtime.min.js | 1 + ajax/libs/rxjs/2.2.28/v2.2.28.tar.gz | Bin 0 -> 1400793 bytes ajax/libs/rxjs/package.json | 2 +- 42 files changed, 51792 insertions(+), 1 deletion(-) create mode 100644 ajax/libs/rxjs/2.2.28/rx.aggregates.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.aggregates.min.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.all.compat.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.all.compat.min.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.all.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.all.min.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.async.compat.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.async.compat.min.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.async.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.async.min.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.backpressure.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.backpressure.min.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.binding.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.binding.min.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.coincidence.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.coincidence.min.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.compat.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.compat.min.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.core.compat.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.core.compat.min.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.core.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.core.min.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.experimental.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.experimental.min.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.joinpatterns.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.joinpatterns.min.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.lite.compat.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.lite.compat.min.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.lite.extras.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.lite.extras.min.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.lite.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.lite.min.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.min.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.testing.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.testing.min.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.time.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.time.min.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.virtualtime.js create mode 100644 ajax/libs/rxjs/2.2.28/rx.virtualtime.min.js create mode 100644 ajax/libs/rxjs/2.2.28/v2.2.28.tar.gz diff --git a/ajax/libs/rxjs/2.2.28/rx.aggregates.js b/ajax/libs/rxjs/2.2.28/rx.aggregates.js new file mode 100644 index 000000000..032a2a166 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.aggregates.js @@ -0,0 +1,702 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +;(function (factory) { + var objectTypes = { + 'boolean': false, + 'function': true, + 'object': true, + 'number': false, + 'string': false, + 'undefined': false + }; + + var root = (objectTypes[typeof window] && window) || this, + freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports, + freeModule = objectTypes[typeof module] && module && !module.nodeType && module, + moduleExports = freeModule && freeModule.exports === freeExports && freeExports, + freeGlobal = objectTypes[typeof global] && global; + + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) { + root = freeGlobal; + } + + // Because of build optimizers + if (typeof define === 'function' && define.amd) { + define(['rx', 'exports'], function (Rx, exports) { + root.Rx = factory(root, exports, Rx); + return root.Rx; + }); + } else if (typeof module === 'object' && module && module.exports === freeExports) { + module.exports = factory(root, module.exports, require('./rx')); + } else { + root.Rx = factory(root, {}, root.Rx); + } +}.call(this, function (root, exp, Rx, undefined) { + + // References + var Observable = Rx.Observable, + observableProto = Observable.prototype, + CompositeDisposable = Rx.CompositeDisposable, + AnonymousObservable = Rx.AnonymousObservable, + isEqual = Rx.internals.isEqual, + helpers = Rx.helpers, + defaultComparer = helpers.defaultComparer, + identity = helpers.identity, + defaultSubComparer = helpers.defaultSubComparer, + isPromise = helpers.isPromise, + observableFromPromise = Observable.fromPromise; + + // Defaults + var argumentOutOfRange = 'Argument out of range', + sequenceContainsNoElements = "Sequence contains no elements."; + + observableProto.finalValue = function () { + var source = this; + return new AnonymousObservable(function (observer) { + var hasValue = false, value; + return source.subscribe(function (x) { + hasValue = true; + value = x; + }, observer.onError.bind(observer), function () { + if (!hasValue) { + observer.onError(new Error(sequenceContainsNoElements)); + } else { + observer.onNext(value); + observer.onCompleted(); + } + }); + }); + }; + + function extremaBy(source, keySelector, comparer) { + return new AnonymousObservable(function (observer) { + var hasValue = false, lastKey = null, list = []; + return source.subscribe(function (x) { + var comparison, key; + try { + key = keySelector(x); + } catch (ex) { + observer.onError(ex); + return; + } + comparison = 0; + if (!hasValue) { + hasValue = true; + lastKey = key; + } else { + try { + comparison = comparer(key, lastKey); + } catch (ex1) { + observer.onError(ex1); + return; + } + } + if (comparison > 0) { + lastKey = key; + list = []; + } + if (comparison >= 0) { + list.push(x); + } + }, observer.onError.bind(observer), function () { + observer.onNext(list); + observer.onCompleted(); + }); + }); + } + + function firstOnly(x) { + if (x.length === 0) { + throw new Error(sequenceContainsNoElements); + } + return x[0]; + } + + /** + * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value. + * For aggregation behavior with incremental intermediate results, see Observable.scan. + * @example + * 1 - res = source.aggregate(function (acc, x) { return acc + x; }); + * 2 - res = source.aggregate(0, function (acc, x) { return acc + x; }); + * @param {Mixed} [seed] The initial accumulator value. + * @param {Function} accumulator An accumulator function to be invoked on each element. + * @returns {Observable} An observable sequence containing a single element with the final accumulator value. + */ + observableProto.aggregate = function () { + var seed, hasSeed, accumulator; + if (arguments.length === 2) { + seed = arguments[0]; + hasSeed = true; + accumulator = arguments[1]; + } else { + accumulator = arguments[0]; + } + return hasSeed ? this.scan(seed, accumulator).startWith(seed).finalValue() : this.scan(accumulator).finalValue(); + }; + + /** + * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value. + * For aggregation behavior with incremental intermediate results, see Observable.scan. + * @example + * 1 - res = source.reduce(function (acc, x) { return acc + x; }); + * 2 - res = source.reduce(function (acc, x) { return acc + x; }, 0); + * @param {Function} accumulator An accumulator function to be invoked on each element. + * @param {Any} [seed] The initial accumulator value. + * @returns {Observable} An observable sequence containing a single element with the final accumulator value. + */ + observableProto.reduce = function (accumulator) { + var seed, hasSeed; + if (arguments.length === 2) { + hasSeed = true; + seed = arguments[1]; + } + return hasSeed ? this.scan(seed, accumulator).startWith(seed).finalValue() : this.scan(accumulator).finalValue(); + }; + + /** + * Determines whether any element of an observable sequence satisfies a condition if present, else if any items are in the sequence. + * @example + * var result = source.any(); + * var result = source.any(function (x) { return x > 3; }); + * @param {Function} [predicate] A function to test each element for a condition. + * @returns {Observable} An observable sequence containing a single element determining whether any elements in the source sequence pass the test in the specified predicate if given, else if any items are in the sequence. + */ + observableProto.some = observableProto.any = function (predicate, thisArg) { + var source = this; + return predicate ? + source.where(predicate, thisArg).any() : + new AnonymousObservable(function (observer) { + return source.subscribe(function () { + observer.onNext(true); + observer.onCompleted(); + }, observer.onError.bind(observer), function () { + observer.onNext(false); + observer.onCompleted(); + }); + }); + }; + + /** + * Determines whether an observable sequence is empty. + * + * @memberOf Observable# + * @returns {Observable} An observable sequence containing a single element determining whether the source sequence is empty. + */ + observableProto.isEmpty = function () { + return this.any().select(function (b) { return !b; }); + }; + + /** + * Determines whether all elements of an observable sequence satisfy a condition. + * + * 1 - res = source.all(function (value) { return value.length > 3; }); + * @memberOf Observable# + * @param {Function} [predicate] A function to test each element for a condition. + * @param {Any} [thisArg] Object to use as this when executing callback. + * @returns {Observable} An observable sequence containing a single element determining whether all elements in the source sequence pass the test in the specified predicate. + */ + observableProto.every = observableProto.all = function (predicate, thisArg) { + return this.where(function (v) { + return !predicate(v); + }, thisArg).any().select(function (b) { + return !b; + }); + }; + + /** + * Determines whether an observable sequence contains a specified element with an optional equality comparer. + * @example + * 1 - res = source.contains(42); + * 2 - res = source.contains({ value: 42 }, function (x, y) { return x.value === y.value; }); + * @param value The value to locate in the source sequence. + * @param {Function} [comparer] An equality comparer to compare elements. + * @returns {Observable} An observable sequence containing a single element determining whether the source sequence contains an element that has the specified value. + */ + observableProto.contains = function (value, comparer) { + comparer || (comparer = defaultComparer); + return this.where(function (v) { + return comparer(v, value); + }).any(); + }; + + /** + * Returns an observable sequence containing a value that represents how many elements in the specified observable sequence satisfy a condition if provided, else the count of items. + * @example + * res = source.count(); + * res = source.count(function (x) { return x > 3; }); + * @param {Function} [predicate]A function to test each element for a condition. + * @param {Any} [thisArg] Object to use as this when executing callback. + * @returns {Observable} An observable sequence containing a single element with a number that represents how many elements in the input sequence satisfy the condition in the predicate function if provided, else the count of items in the sequence. + */ + observableProto.count = function (predicate, thisArg) { + return predicate ? + this.where(predicate, thisArg).count() : + this.aggregate(0, function (count) { + return count + 1; + }); + }; + + /** + * Computes the sum of a sequence of values that are obtained by invoking an optional transform function on each element of the input sequence, else if not specified computes the sum on each item in the sequence. + * @example + * var res = source.sum(); + * var res = source.sum(function (x) { return x.value; }); + * @param {Function} [selector] A transform function to apply to each element. + * @param {Any} [thisArg] Object to use as this when executing callback. + * @returns {Observable} An observable sequence containing a single element with the sum of the values in the source sequence. + */ + observableProto.sum = function (keySelector, thisArg) { + return keySelector ? + this.select(keySelector, thisArg).sum() : + this.aggregate(0, function (prev, curr) { + return prev + curr; + }); + }; + + /** + * Returns the elements in an observable sequence with the minimum key value according to the specified comparer. + * @example + * var res = source.minBy(function (x) { return x.value; }); + * var res = source.minBy(function (x) { return x.value; }, function (x, y) { return x - y; }); + * @param {Function} keySelector Key selector function. + * @param {Function} [comparer] Comparer used to compare key values. + * @returns {Observable} An observable sequence containing a list of zero or more elements that have a minimum key value. + */ + observableProto.minBy = function (keySelector, comparer) { + comparer || (comparer = defaultSubComparer); + return extremaBy(this, keySelector, function (x, y) { + return comparer(x, y) * -1; + }); + }; + + /** + * Returns the minimum element in an observable sequence according to the optional comparer else a default greater than less than check. + * @example + * var res = source.min(); + * var res = source.min(function (x, y) { return x.value - y.value; }); + * @param {Function} [comparer] Comparer used to compare elements. + * @returns {Observable} An observable sequence containing a single element with the minimum element in the source sequence. + */ + observableProto.min = function (comparer) { + return this.minBy(identity, comparer).select(function (x) { + return firstOnly(x); + }); + }; + + /** + * Returns the elements in an observable sequence with the maximum key value according to the specified comparer. + * @example + * var res = source.maxBy(function (x) { return x.value; }); + * var res = source.maxBy(function (x) { return x.value; }, function (x, y) { return x - y;; }); + * @param {Function} keySelector Key selector function. + * @param {Function} [comparer] Comparer used to compare key values. + * @returns {Observable} An observable sequence containing a list of zero or more elements that have a maximum key value. + */ + observableProto.maxBy = function (keySelector, comparer) { + comparer || (comparer = defaultSubComparer); + return extremaBy(this, keySelector, comparer); + }; + + /** + * Returns the maximum value in an observable sequence according to the specified comparer. + * @example + * var res = source.max(); + * var res = source.max(function (x, y) { return x.value - y.value; }); + * @param {Function} [comparer] Comparer used to compare elements. + * @returns {Observable} An observable sequence containing a single element with the maximum element in the source sequence. + */ + observableProto.max = function (comparer) { + return this.maxBy(identity, comparer).select(function (x) { + return firstOnly(x); + }); + }; + + /** + * Computes the average of an observable sequence of values that are in the sequence or obtained by invoking a transform function on each element of the input sequence if present. + * @example + * var res = res = source.average(); + * var res = res = source.average(function (x) { return x.value; }); + * @param {Function} [selector] A transform function to apply to each element. + * @param {Any} [thisArg] Object to use as this when executing callback. + * @returns {Observable} An observable sequence containing a single element with the average of the sequence of values. + */ + observableProto.average = function (keySelector, thisArg) { + return keySelector ? + this.select(keySelector, thisArg).average() : + this.scan({ + sum: 0, + count: 0 + }, function (prev, cur) { + return { + sum: prev.sum + cur, + count: prev.count + 1 + }; + }).finalValue().select(function (s) { + if (s.count === 0) { + throw new Error('The input sequence was empty'); + } + return s.sum / s.count; + }); + }; + + function sequenceEqualArray(first, second, comparer) { + return new AnonymousObservable(function (observer) { + var count = 0, len = second.length; + return first.subscribe(function (value) { + var equal = false; + try { + if (count < len) { + equal = comparer(value, second[count++]); + } + } catch (e) { + observer.onError(e); + return; + } + if (!equal) { + observer.onNext(false); + observer.onCompleted(); + } + }, observer.onError.bind(observer), function () { + observer.onNext(count === len); + observer.onCompleted(); + }); + }); + } + + /** + * Determines whether two sequences are equal by comparing the elements pairwise using a specified equality comparer. + * + * @example + * var res = res = source.sequenceEqual([1,2,3]); + * var res = res = source.sequenceEqual([{ value: 42 }], function (x, y) { return x.value === y.value; }); + * 3 - res = source.sequenceEqual(Rx.Observable.returnValue(42)); + * 4 - res = source.sequenceEqual(Rx.Observable.returnValue({ value: 42 }), function (x, y) { return x.value === y.value; }); + * @param {Observable} second Second observable sequence or array to compare. + * @param {Function} [comparer] Comparer used to compare elements of both sequences. + * @returns {Observable} An observable sequence that contains a single element which indicates whether both sequences are of equal length and their corresponding elements are equal according to the specified equality comparer. + */ + observableProto.sequenceEqual = function (second, comparer) { + var first = this; + comparer || (comparer = defaultComparer); + if (Array.isArray(second)) { + return sequenceEqualArray(first, second, comparer); + } + return new AnonymousObservable(function (observer) { + var donel = false, doner = false, ql = [], qr = []; + var subscription1 = first.subscribe(function (x) { + var equal, v; + if (qr.length > 0) { + v = qr.shift(); + try { + equal = comparer(v, x); + } catch (e) { + observer.onError(e); + return; + } + if (!equal) { + observer.onNext(false); + observer.onCompleted(); + } + } else if (doner) { + observer.onNext(false); + observer.onCompleted(); + } else { + ql.push(x); + } + }, observer.onError.bind(observer), function () { + donel = true; + if (ql.length === 0) { + if (qr.length > 0) { + observer.onNext(false); + observer.onCompleted(); + } else if (doner) { + observer.onNext(true); + observer.onCompleted(); + } + } + }); + + isPromise(second) && (second = observableFromPromise(second)); + var subscription2 = second.subscribe(function (x) { + var equal, v; + if (ql.length > 0) { + v = ql.shift(); + try { + equal = comparer(v, x); + } catch (exception) { + observer.onError(exception); + return; + } + if (!equal) { + observer.onNext(false); + observer.onCompleted(); + } + } else if (donel) { + observer.onNext(false); + observer.onCompleted(); + } else { + qr.push(x); + } + }, observer.onError.bind(observer), function () { + doner = true; + if (qr.length === 0) { + if (ql.length > 0) { + observer.onNext(false); + observer.onCompleted(); + } else if (donel) { + observer.onNext(true); + observer.onCompleted(); + } + } + }); + return new CompositeDisposable(subscription1, subscription2); + }); + }; + + function elementAtOrDefault(source, index, hasDefault, defaultValue) { + if (index < 0) { + throw new Error(argumentOutOfRange); + } + return new AnonymousObservable(function (observer) { + var i = index; + return source.subscribe(function (x) { + if (i === 0) { + observer.onNext(x); + observer.onCompleted(); + } + i--; + }, observer.onError.bind(observer), function () { + if (!hasDefault) { + observer.onError(new Error(argumentOutOfRange)); + } else { + observer.onNext(defaultValue); + observer.onCompleted(); + } + }); + }); + } + + /** + * Returns the element at a specified index in a sequence. + * @example + * var res = source.elementAt(5); + * @param {Number} index The zero-based index of the element to retrieve. + * @returns {Observable} An observable sequence that produces the element at the specified position in the source sequence. + */ + observableProto.elementAt = function (index) { + return elementAtOrDefault(this, index, false); + }; + + /** + * Returns the element at a specified index in a sequence or a default value if the index is out of range. + * @example + * var res = source.elementAtOrDefault(5); + * var res = source.elementAtOrDefault(5, 0); + * @param {Number} index The zero-based index of the element to retrieve. + * @param [defaultValue] The default value if the index is outside the bounds of the source sequence. + * @returns {Observable} An observable sequence that produces the element at the specified position in the source sequence, or a default value if the index is outside the bounds of the source sequence. + */ + observableProto.elementAtOrDefault = function (index, defaultValue) { + return elementAtOrDefault(this, index, true, defaultValue); + }; + + function singleOrDefaultAsync(source, hasDefault, defaultValue) { + return new AnonymousObservable(function (observer) { + var value = defaultValue, seenValue = false; + return source.subscribe(function (x) { + if (seenValue) { + observer.onError(new Error('Sequence contains more than one element')); + } else { + value = x; + seenValue = true; + } + }, observer.onError.bind(observer), function () { + if (!seenValue && !hasDefault) { + observer.onError(new Error(sequenceContainsNoElements)); + } else { + observer.onNext(value); + observer.onCompleted(); + } + }); + }); + } + + /** + * Returns the only element of an observable sequence that satisfies the condition in the optional predicate, and reports an exception if there is not exactly one element in the observable sequence. + * @example + * var res = res = source.single(); + * var res = res = source.single(function (x) { return x === 42; }); + * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence. + * @param {Any} [thisArg] Object to use as `this` when executing the predicate. + * @returns {Observable} Sequence containing the single element in the observable sequence that satisfies the condition in the predicate. + */ + observableProto.single = function (predicate, thisArg) { + return predicate ? + this.where(predicate, thisArg).single() : + singleOrDefaultAsync(this, false); + }; + + /** + * Returns the only element of an observable sequence that matches the predicate, or a default value if no such element exists; this method reports an exception if there is more than one element in the observable sequence. + * @example + * var res = res = source.singleOrDefault(); + * var res = res = source.singleOrDefault(function (x) { return x === 42; }); + * res = source.singleOrDefault(function (x) { return x === 42; }, 0); + * res = source.singleOrDefault(null, 0); + * @memberOf Observable# + * @param {Function} predicate A predicate function to evaluate for elements in the source sequence. + * @param [defaultValue] The default value if the index is outside the bounds of the source sequence. + * @param {Any} [thisArg] Object to use as `this` when executing the predicate. + * @returns {Observable} Sequence containing the single element in the observable sequence that satisfies the condition in the predicate, or a default value if no such element exists. + */ + observableProto.singleOrDefault = function (predicate, defaultValue, thisArg) { + return predicate? + this.where(predicate, thisArg).singleOrDefault(null, defaultValue) : + singleOrDefaultAsync(this, true, defaultValue) + }; + function firstOrDefaultAsync(source, hasDefault, defaultValue) { + return new AnonymousObservable(function (observer) { + return source.subscribe(function (x) { + observer.onNext(x); + observer.onCompleted(); + }, observer.onError.bind(observer), function () { + if (!hasDefault) { + observer.onError(new Error(sequenceContainsNoElements)); + } else { + observer.onNext(defaultValue); + observer.onCompleted(); + } + }); + }); + } + + /** + * Returns the first element of an observable sequence that satisfies the condition in the predicate if present else the first item in the sequence. + * @example + * var res = res = source.first(); + * var res = res = source.first(function (x) { return x > 3; }); + * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence. + * @param {Any} [thisArg] Object to use as `this` when executing the predicate. + * @returns {Observable} Sequence containing the first element in the observable sequence that satisfies the condition in the predicate if provided, else the first item in the sequence. + */ + observableProto.first = function (predicate, thisArg) { + return predicate ? + this.where(predicate, thisArg).first() : + firstOrDefaultAsync(this, false); + }; + + /** + * Returns the first element of an observable sequence that satisfies the condition in the predicate, or a default value if no such element exists. + * @example + * var res = res = source.firstOrDefault(); + * var res = res = source.firstOrDefault(function (x) { return x > 3; }); + * var res = source.firstOrDefault(function (x) { return x > 3; }, 0); + * var res = source.firstOrDefault(null, 0); + * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence. + * @param {Any} [defaultValue] The default value if no such element exists. If not specified, defaults to null. + * @param {Any} [thisArg] Object to use as `this` when executing the predicate. + * @returns {Observable} Sequence containing the first element in the observable sequence that satisfies the condition in the predicate, or a default value if no such element exists. + */ + observableProto.firstOrDefault = function (predicate, defaultValue, thisArg) { + return predicate ? + this.where(predicate).firstOrDefault(null, defaultValue) : + firstOrDefaultAsync(this, true, defaultValue); + }; + + function lastOrDefaultAsync(source, hasDefault, defaultValue) { + return new AnonymousObservable(function (observer) { + var value = defaultValue, seenValue = false; + return source.subscribe(function (x) { + value = x; + seenValue = true; + }, observer.onError.bind(observer), function () { + if (!seenValue && !hasDefault) { + observer.onError(new Error(sequenceContainsNoElements)); + } else { + observer.onNext(value); + observer.onCompleted(); + } + }); + }); + } + + /** + * Returns the last element of an observable sequence that satisfies the condition in the predicate if specified, else the last element. + * @example + * var res = source.last(); + * var res = source.last(function (x) { return x > 3; }); + * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence. + * @param {Any} [thisArg] Object to use as `this` when executing the predicate. + * @returns {Observable} Sequence containing the last element in the observable sequence that satisfies the condition in the predicate. + */ + observableProto.last = function (predicate, thisArg) { + return predicate ? + this.where(predicate, thisArg).last() : + lastOrDefaultAsync(this, false); + }; + + /** + * Returns the last element of an observable sequence that satisfies the condition in the predicate, or a default value if no such element exists. + * @example + * var res = source.lastOrDefault(); + * var res = source.lastOrDefault(function (x) { return x > 3; }); + * var res = source.lastOrDefault(function (x) { return x > 3; }, 0); + * var res = source.lastOrDefault(null, 0); + * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence. + * @param [defaultValue] The default value if no such element exists. If not specified, defaults to null. + * @param {Any} [thisArg] Object to use as `this` when executing the predicate. + * @returns {Observable} Sequence containing the last element in the observable sequence that satisfies the condition in the predicate, or a default value if no such element exists. + */ + observableProto.lastOrDefault = function (predicate, defaultValue, thisArg) { + return predicate ? + this.where(predicate, thisArg).lastOrDefault(null, defaultValue) : + lastOrDefaultAsync(this, true, defaultValue); + }; + + function findValue (source, predicate, thisArg, yieldIndex) { + return new AnonymousObservable(function (observer) { + var i = 0; + return source.subscribe(function (x) { + var shouldRun; + try { + shouldRun = predicate.call(thisArg, x, i, source); + } catch(e) { + observer.onError(e); + return; + } + if (shouldRun) { + observer.onNext(yieldIndex ? i : x); + observer.onCompleted(); + } else { + i++; + } + }, observer.onError.bind(observer), function () { + observer.onNext(yieldIndex ? -1 : undefined); + observer.onCompleted(); + }); + }); + } + + /** + * Searches for an element that matches the conditions defined by the specified predicate, and returns the first occurrence within the entire Observable sequence. + * @param {Function} predicate The predicate that defines the conditions of the element to search for. + * @param {Any} [thisArg] Object to use as `this` when executing the predicate. + * @returns {Observable} An Observable sequence with the first element that matches the conditions defined by the specified predicate, if found; otherwise, undefined. + */ + observableProto.find = function (predicate, thisArg) { + return findValue(this, predicate, thisArg, false); + }; + + /** + * Searches for an element that matches the conditions defined by the specified predicate, and returns + * an Observable sequence with the zero-based index of the first occurrence within the entire Observable sequence. + * @param {Function} predicate The predicate that defines the conditions of the element to search for. + * @param {Any} [thisArg] Object to use as `this` when executing the predicate. + * @returns {Observable} An Observable sequence with the zero-based index of the first occurrence of an element that matches the conditions defined by match, if found; otherwise, –1. + */ + observableProto.findIndex = function (predicate, thisArg) { + return findValue(this, predicate, thisArg, true); + }; + + return Rx; +})); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.aggregates.min.js b/ajax/libs/rxjs/2.2.28/rx.aggregates.min.js new file mode 100644 index 000000000..4f631a12b --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.aggregates.min.js @@ -0,0 +1 @@ +(function(t){var e={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},n=e[typeof window]&&window||this,r=e[typeof exports]&&exports&&!exports.nodeType&&exports,i=e[typeof module]&&module&&!module.nodeType&&module,o=(i&&i.exports===r&&r,e[typeof global]&&global);!o||o.global!==o&&o.window!==o||(n=o),"function"==typeof define&&define.amd?define(["rx","exports"],function(e,r){return n.Rx=t(n,r,e),n.Rx}):"object"==typeof module&&module&&module.exports===r?module.exports=t(n,module.exports,require("./rx")):n.Rx=t(n,{},n.Rx)}).call(this,function(t,e,n,r){function i(t,e,n){return new v(function(i){var o=!1,s=null,u=[];return t.subscribe(function(t){var c,a;try{a=e(t)}catch(h){return i.onError(h),r}if(c=0,o)try{c=n(a,s)}catch(l){return i.onError(l),r}else o=!0,s=a;c>0&&(s=a,u=[]),c>=0&&u.push(t)},i.onError.bind(i),function(){i.onNext(u),i.onCompleted()})})}function o(t){if(0===t.length)throw Error(C);return t[0]}function s(t,e,n){return new v(function(i){var o=0,s=e.length;return t.subscribe(function(t){var u=!1;try{s>o&&(u=n(t,e[o++]))}catch(c){return i.onError(c),r}u||(i.onNext(!1),i.onCompleted())},i.onError.bind(i),function(){i.onNext(o===s),i.onCompleted()})})}function u(t,e,n,r){if(0>e)throw Error(x);return new v(function(i){var o=e;return t.subscribe(function(t){0===o&&(i.onNext(t),i.onCompleted()),o--},i.onError.bind(i),function(){n?(i.onNext(r),i.onCompleted()):i.onError(Error(x))})})}function c(t,e,n){return new v(function(r){var i=n,o=!1;return t.subscribe(function(t){o?r.onError(Error("Sequence contains more than one element")):(i=t,o=!0)},r.onError.bind(r),function(){o||e?(r.onNext(i),r.onCompleted()):r.onError(Error(C))})})}function a(t,e,n){return new v(function(r){return t.subscribe(function(t){r.onNext(t),r.onCompleted()},r.onError.bind(r),function(){e?(r.onNext(n),r.onCompleted()):r.onError(Error(C))})})}function h(t,e,n){return new v(function(r){var i=n,o=!1;return t.subscribe(function(t){i=t,o=!0},r.onError.bind(r),function(){o||e?(r.onNext(i),r.onCompleted()):r.onError(Error(C))})})}function l(t,e,n,i){return new v(function(o){var s=0;return t.subscribe(function(u){var c;try{c=e.call(n,u,s,t)}catch(a){return o.onError(a),r}c?(o.onNext(i?s:u),o.onCompleted()):s++},o.onError.bind(o),function(){o.onNext(i?-1:r),o.onCompleted()})})}var f=n.Observable,p=f.prototype,d=n.CompositeDisposable,v=n.AnonymousObservable,b=(n.internals.isEqual,n.helpers),m=b.defaultComparer,y=b.identity,w=b.defaultSubComparer,g=b.isPromise,E=f.fromPromise,x="Argument out of range",C="Sequence contains no elements.";return p.finalValue=function(){var t=this;return new v(function(e){var n,r=!1;return t.subscribe(function(t){r=!0,n=t},e.onError.bind(e),function(){r?(e.onNext(n),e.onCompleted()):e.onError(Error(C))})})},p.aggregate=function(){var t,e,n;return 2===arguments.length?(t=arguments[0],e=!0,n=arguments[1]):n=arguments[0],e?this.scan(t,n).startWith(t).finalValue():this.scan(n).finalValue()},p.reduce=function(t){var e,n;return 2===arguments.length&&(n=!0,e=arguments[1]),n?this.scan(e,t).startWith(e).finalValue():this.scan(t).finalValue()},p.some=p.any=function(t,e){var n=this;return t?n.where(t,e).any():new v(function(t){return n.subscribe(function(){t.onNext(!0),t.onCompleted()},t.onError.bind(t),function(){t.onNext(!1),t.onCompleted()})})},p.isEmpty=function(){return this.any().select(function(t){return!t})},p.every=p.all=function(t,e){return this.where(function(e){return!t(e)},e).any().select(function(t){return!t})},p.contains=function(t,e){return e||(e=m),this.where(function(n){return e(n,t)}).any()},p.count=function(t,e){return t?this.where(t,e).count():this.aggregate(0,function(t){return t+1})},p.sum=function(t,e){return t?this.select(t,e).sum():this.aggregate(0,function(t,e){return t+e})},p.minBy=function(t,e){return e||(e=w),i(this,t,function(t,n){return-1*e(t,n)})},p.min=function(t){return this.minBy(y,t).select(function(t){return o(t)})},p.maxBy=function(t,e){return e||(e=w),i(this,t,e)},p.max=function(t){return this.maxBy(y,t).select(function(t){return o(t)})},p.average=function(t,e){return t?this.select(t,e).average():this.scan({sum:0,count:0},function(t,e){return{sum:t.sum+e,count:t.count+1}}).finalValue().select(function(t){if(0===t.count)throw Error("The input sequence was empty");return t.sum/t.count})},p.sequenceEqual=function(t,e){var n=this;return e||(e=m),Array.isArray(t)?s(n,t,e):new v(function(i){var o=!1,s=!1,u=[],c=[],a=n.subscribe(function(t){var n,o;if(c.length>0){o=c.shift();try{n=e(o,t)}catch(a){return i.onError(a),r}n||(i.onNext(!1),i.onCompleted())}else s?(i.onNext(!1),i.onCompleted()):u.push(t)},i.onError.bind(i),function(){o=!0,0===u.length&&(c.length>0?(i.onNext(!1),i.onCompleted()):s&&(i.onNext(!0),i.onCompleted()))});g(t)&&(t=E(t));var h=t.subscribe(function(t){var n,s;if(u.length>0){s=u.shift();try{n=e(s,t)}catch(a){return i.onError(a),r}n||(i.onNext(!1),i.onCompleted())}else o?(i.onNext(!1),i.onCompleted()):c.push(t)},i.onError.bind(i),function(){s=!0,0===c.length&&(u.length>0?(i.onNext(!1),i.onCompleted()):o&&(i.onNext(!0),i.onCompleted()))});return new d(a,h)})},p.elementAt=function(t){return u(this,t,!1)},p.elementAtOrDefault=function(t,e){return u(this,t,!0,e)},p.single=function(t,e){return t?this.where(t,e).single():c(this,!1)},p.singleOrDefault=function(t,e,n){return t?this.where(t,n).singleOrDefault(null,e):c(this,!0,e)},p.first=function(t,e){return t?this.where(t,e).first():a(this,!1)},p.firstOrDefault=function(t,e){return t?this.where(t).firstOrDefault(null,e):a(this,!0,e)},p.last=function(t,e){return t?this.where(t,e).last():h(this,!1)},p.lastOrDefault=function(t,e,n){return t?this.where(t,n).lastOrDefault(null,e):h(this,!0,e)},p.find=function(t,e){return l(this,t,e,!1)},p.findIndex=function(t,e){return l(this,t,e,!0)},n}); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.all.compat.js b/ajax/libs/rxjs/2.2.28/rx.all.compat.js new file mode 100644 index 000000000..30712de72 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.all.compat.js @@ -0,0 +1,9421 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +;(function (undefined) { + + var objectTypes = { + 'boolean': false, + 'function': true, + 'object': true, + 'number': false, + 'string': false, + 'undefined': false + }; + + var root = (objectTypes[typeof window] && window) || this, + freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports, + freeModule = objectTypes[typeof module] && module && !module.nodeType && module, + moduleExports = freeModule && freeModule.exports === freeExports && freeExports, + freeGlobal = objectTypes[typeof global] && global; + + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) { + root = freeGlobal; + } + + var Rx = { + internals: {}, + config: { + Promise: root.Promise // Detect if promise exists + }, + helpers: { } + }; + + // Defaults + var noop = Rx.helpers.noop = function () { }, + identity = Rx.helpers.identity = function (x) { return x; }, + pluck = Rx.helpers.pluck = function (property) { return function (x) { return x[property]; }; }, + just = Rx.helpers.just = function (value) { return function () { return value; }; }, + defaultNow = Rx.helpers.defaultNow = (function () { return !!Date.now ? Date.now : function () { return +new Date; }; }()), + defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); }, + defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); }, + defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); }, + defaultError = Rx.helpers.defaultError = function (err) { throw err; }, + isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.then === 'function' && p.then !== Rx.Observable.prototype.then; }, + asArray = Rx.helpers.asArray = function () { return Array.prototype.slice.call(arguments); }, + not = Rx.helpers.not = function (a) { return !a; }; + + // Errors + var sequenceContainsNoElements = 'Sequence contains no elements.'; + var argumentOutOfRange = 'Argument out of range'; + var objectDisposed = 'Object has been disposed'; + function checkDisposed() { if (this.isDisposed) { throw new Error(objectDisposed); } } + + // Shim in iterator support + var $iterator$ = (typeof Symbol === 'object' && Symbol.iterator) || + '_es6shim_iterator_'; + // Firefox ships a partial implementation using the name @@iterator. + // https://bugzilla.mozilla.org/show_bug.cgi?id=907077#c14 + // So use that name if we detect it. + if (root.Set && typeof new root.Set()['@@iterator'] === 'function') { + $iterator$ = '@@iterator'; + } + var doneEnumerator = { done: true, value: undefined }; + + /** `Object#toString` result shortcuts */ + var argsClass = '[object Arguments]', + arrayClass = '[object Array]', + boolClass = '[object Boolean]', + dateClass = '[object Date]', + errorClass = '[object Error]', + funcClass = '[object Function]', + numberClass = '[object Number]', + objectClass = '[object Object]', + regexpClass = '[object RegExp]', + stringClass = '[object String]'; + + var toString = Object.prototype.toString, + hasOwnProperty = Object.prototype.hasOwnProperty, + supportsArgsClass = toString.call(arguments) == argsClass, // For less -1); + } + }); + } + } + stackA.pop(); + stackB.pop(); + + return result; + } + var slice = Array.prototype.slice; + function argsOrArray(args, idx) { + return args.length === 1 && Array.isArray(args[idx]) ? + args[idx] : + slice.call(args); + } + var hasProp = {}.hasOwnProperty; + + /** @private */ + var inherits = this.inherits = Rx.internals.inherits = function (child, parent) { + function __() { this.constructor = child; } + __.prototype = parent.prototype; + child.prototype = new __(); + }; + + /** @private */ + var addProperties = Rx.internals.addProperties = function (obj) { + var sources = slice.call(arguments, 1); + for (var i = 0, len = sources.length; i < len; i++) { + var source = sources[i]; + for (var prop in source) { + obj[prop] = source[prop]; + } + } + }; + + // Rx Utils + var addRef = Rx.internals.addRef = function (xs, r) { + return new AnonymousObservable(function (observer) { + return new CompositeDisposable(r.getDisposable(), xs.subscribe(observer)); + }); + }; + + // Collection polyfills + function arrayInitialize(count, factory) { + var a = new Array(count); + for (var i = 0; i < count; i++) { + a[i] = factory(); + } + return a; + } + + // Utilities + if (!Function.prototype.bind) { + Function.prototype.bind = function (that) { + var target = this, + args = slice.call(arguments, 1); + var bound = function () { + if (this instanceof bound) { + function F() { } + F.prototype = target.prototype; + var self = new F(); + var result = target.apply(self, args.concat(slice.call(arguments))); + if (Object(result) === result) { + return result; + } + return self; + } else { + return target.apply(that, args.concat(slice.call(arguments))); + } + }; + + return bound; + }; + } + + var boxedString = Object("a"), + splitString = boxedString[0] != "a" || !(0 in boxedString); + if (!Array.prototype.every) { + Array.prototype.every = function every(fun /*, thisp */) { + var object = Object(this), + self = splitString && {}.toString.call(this) == stringClass ? + this.split("") : + object, + length = self.length >>> 0, + thisp = arguments[1]; + + if ({}.toString.call(fun) != funcClass) { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self && !fun.call(thisp, self[i], i, object)) { + return false; + } + } + return true; + }; + } + + if (!Array.prototype.map) { + Array.prototype.map = function map(fun /*, thisp*/) { + var object = Object(this), + self = splitString && {}.toString.call(this) == stringClass ? + this.split("") : + object, + length = self.length >>> 0, + result = Array(length), + thisp = arguments[1]; + + if ({}.toString.call(fun) != funcClass) { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self) + result[i] = fun.call(thisp, self[i], i, object); + } + return result; + }; + } + + if (!Array.prototype.filter) { + Array.prototype.filter = function (predicate) { + var results = [], item, t = new Object(this); + for (var i = 0, len = t.length >>> 0; i < len; i++) { + item = t[i]; + if (i in t && predicate.call(arguments[1], item, i, t)) { + results.push(item); + } + } + return results; + }; + } + + if (!Array.isArray) { + Array.isArray = function (arg) { + return Object.prototype.toString.call(arg) == arrayClass; + }; + } + + if (!Array.prototype.indexOf) { + Array.prototype.indexOf = function indexOf(searchElement) { + var t = Object(this); + var len = t.length >>> 0; + if (len === 0) { + return -1; + } + var n = 0; + if (arguments.length > 1) { + n = Number(arguments[1]); + if (n !== n) { + n = 0; + } else if (n !== 0 && n != Infinity && n !== -Infinity) { + n = (n > 0 || -1) * Math.floor(Math.abs(n)); + } + } + if (n >= len) { + return -1; + } + var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); + for (; k < len; k++) { + if (k in t && t[k] === searchElement) { + return k; + } + } + return -1; + }; + } + + // Collections + var IndexedItem = function (id, value) { + this.id = id; + this.value = value; + }; + + IndexedItem.prototype.compareTo = function (other) { + var c = this.value.compareTo(other.value); + if (c === 0) { + c = this.id - other.id; + } + return c; + }; + + // Priority Queue for Scheduling + var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) { + this.items = new Array(capacity); + this.length = 0; + }; + + var priorityProto = PriorityQueue.prototype; + priorityProto.isHigherPriority = function (left, right) { + return this.items[left].compareTo(this.items[right]) < 0; + }; + + priorityProto.percolate = function (index) { + if (index >= this.length || index < 0) { + return; + } + var parent = index - 1 >> 1; + if (parent < 0 || parent === index) { + return; + } + if (this.isHigherPriority(index, parent)) { + var temp = this.items[index]; + this.items[index] = this.items[parent]; + this.items[parent] = temp; + this.percolate(parent); + } + }; + + priorityProto.heapify = function (index) { + if (index === undefined) { + index = 0; + } + if (index >= this.length || index < 0) { + return; + } + var left = 2 * index + 1, + right = 2 * index + 2, + first = index; + if (left < this.length && this.isHigherPriority(left, first)) { + first = left; + } + if (right < this.length && this.isHigherPriority(right, first)) { + first = right; + } + if (first !== index) { + var temp = this.items[index]; + this.items[index] = this.items[first]; + this.items[first] = temp; + this.heapify(first); + } + }; + + priorityProto.peek = function () { return this.items[0].value; }; + + priorityProto.removeAt = function (index) { + this.items[index] = this.items[--this.length]; + delete this.items[this.length]; + this.heapify(); + }; + + priorityProto.dequeue = function () { + var result = this.peek(); + this.removeAt(0); + return result; + }; + + priorityProto.enqueue = function (item) { + var index = this.length++; + this.items[index] = new IndexedItem(PriorityQueue.count++, item); + this.percolate(index); + }; + + priorityProto.remove = function (item) { + for (var i = 0; i < this.length; i++) { + if (this.items[i].value === item) { + this.removeAt(i); + return true; + } + } + return false; + }; + PriorityQueue.count = 0; + /** + * Represents a group of disposable resources that are disposed together. + * @constructor + */ + var CompositeDisposable = Rx.CompositeDisposable = function () { + this.disposables = argsOrArray(arguments, 0); + this.isDisposed = false; + this.length = this.disposables.length; + }; + + var CompositeDisposablePrototype = CompositeDisposable.prototype; + + /** + * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed. + * @param {Mixed} item Disposable to add. + */ + CompositeDisposablePrototype.add = function (item) { + if (this.isDisposed) { + item.dispose(); + } else { + this.disposables.push(item); + this.length++; + } + }; + + /** + * Removes and disposes the first occurrence of a disposable from the CompositeDisposable. + * @param {Mixed} item Disposable to remove. + * @returns {Boolean} true if found; false otherwise. + */ + CompositeDisposablePrototype.remove = function (item) { + var shouldDispose = false; + if (!this.isDisposed) { + var idx = this.disposables.indexOf(item); + if (idx !== -1) { + shouldDispose = true; + this.disposables.splice(idx, 1); + this.length--; + item.dispose(); + } + + } + return shouldDispose; + }; + + /** + * Disposes all disposables in the group and removes them from the group. + */ + CompositeDisposablePrototype.dispose = function () { + if (!this.isDisposed) { + this.isDisposed = true; + var currentDisposables = this.disposables.slice(0); + this.disposables = []; + this.length = 0; + + for (var i = 0, len = currentDisposables.length; i < len; i++) { + currentDisposables[i].dispose(); + } + } + }; + + /** + * Removes and disposes all disposables from the CompositeDisposable, but does not dispose the CompositeDisposable. + */ + CompositeDisposablePrototype.clear = function () { + var currentDisposables = this.disposables.slice(0); + this.disposables = []; + this.length = 0; + for (var i = 0, len = currentDisposables.length; i < len; i++) { + currentDisposables[i].dispose(); + } + }; + + /** + * Determines whether the CompositeDisposable contains a specific disposable. + * @param {Mixed} item Disposable to search for. + * @returns {Boolean} true if the disposable was found; otherwise, false. + */ + CompositeDisposablePrototype.contains = function (item) { + return this.disposables.indexOf(item) !== -1; + }; + + /** + * Converts the existing CompositeDisposable to an array of disposables + * @returns {Array} An array of disposable objects. + */ + CompositeDisposablePrototype.toArray = function () { + return this.disposables.slice(0); + }; + + /** + * Provides a set of static methods for creating Disposables. + * + * @constructor + * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once. + */ + var Disposable = Rx.Disposable = function (action) { + this.isDisposed = false; + this.action = action || noop; + }; + + /** Performs the task of cleaning up resources. */ + Disposable.prototype.dispose = function () { + if (!this.isDisposed) { + this.action(); + this.isDisposed = true; + } + }; + + /** + * Creates a disposable object that invokes the specified action when disposed. + * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once. + * @return {Disposable} The disposable object that runs the given action upon disposal. + */ + var disposableCreate = Disposable.create = function (action) { return new Disposable(action); }; + + /** + * Gets the disposable that does nothing when disposed. + */ + var disposableEmpty = Disposable.empty = { dispose: noop }; + + var BooleanDisposable = (function () { + function BooleanDisposable (isSingle) { + this.isSingle = isSingle; + this.isDisposed = false; + this.current = null; + } + + var booleanDisposablePrototype = BooleanDisposable.prototype; + + /** + * Gets the underlying disposable. + * @return The underlying disposable. + */ + booleanDisposablePrototype.getDisposable = function () { + return this.current; + }; + + /** + * Sets the underlying disposable. + * @param {Disposable} value The new underlying disposable. + */ + booleanDisposablePrototype.setDisposable = function (value) { + if (this.current && this.isSingle) { + throw new Error('Disposable has already been assigned'); + } + + var shouldDispose = this.isDisposed, old; + if (!shouldDispose) { + old = this.current; + this.current = value; + } + if (old) { + old.dispose(); + } + if (shouldDispose && value) { + value.dispose(); + } + }; + + /** + * Disposes the underlying disposable as well as all future replacements. + */ + booleanDisposablePrototype.dispose = function () { + var old; + if (!this.isDisposed) { + this.isDisposed = true; + old = this.current; + this.current = null; + } + if (old) { + old.dispose(); + } + }; + + return BooleanDisposable; + }()); + + /** + * Represents a disposable resource which only allows a single assignment of its underlying disposable resource. + * If an underlying disposable resource has already been set, future attempts to set the underlying disposable resource will throw an Error. + */ + var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = (function (super_) { + inherits(SingleAssignmentDisposable, super_); + + function SingleAssignmentDisposable() { + super_.call(this, true); + } + + return SingleAssignmentDisposable; + }(BooleanDisposable)); + + /** + * Represents a disposable resource whose underlying disposable resource can be replaced by another disposable resource, causing automatic disposal of the previous underlying disposable resource. + */ + var SerialDisposable = Rx.SerialDisposable = (function (super_) { + inherits(SerialDisposable, super_); + + function SerialDisposable() { + super_.call(this, false); + } + + return SerialDisposable; + }(BooleanDisposable)); + + /** + * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed. + */ + var RefCountDisposable = Rx.RefCountDisposable = (function () { + + function InnerDisposable(disposable) { + this.disposable = disposable; + this.disposable.count++; + this.isInnerDisposed = false; + } + + InnerDisposable.prototype.dispose = function () { + if (!this.disposable.isDisposed) { + if (!this.isInnerDisposed) { + this.isInnerDisposed = true; + this.disposable.count--; + if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) { + this.disposable.isDisposed = true; + this.disposable.underlyingDisposable.dispose(); + } + } + } + }; + + /** + * Initializes a new instance of the RefCountDisposable with the specified disposable. + * @constructor + * @param {Disposable} disposable Underlying disposable. + */ + function RefCountDisposable(disposable) { + this.underlyingDisposable = disposable; + this.isDisposed = false; + this.isPrimaryDisposed = false; + this.count = 0; + } + + /** + * Disposes the underlying disposable only when all dependent disposables have been disposed + */ + RefCountDisposable.prototype.dispose = function () { + if (!this.isDisposed) { + if (!this.isPrimaryDisposed) { + this.isPrimaryDisposed = true; + if (this.count === 0) { + this.isDisposed = true; + this.underlyingDisposable.dispose(); + } + } + } + }; + + /** + * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable. + * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime. + */ + RefCountDisposable.prototype.getDisposable = function () { + return this.isDisposed ? disposableEmpty : new InnerDisposable(this); + }; + + return RefCountDisposable; + })(); + + function ScheduledDisposable(scheduler, disposable) { + this.scheduler = scheduler; + this.disposable = disposable; + this.isDisposed = false; + } + + ScheduledDisposable.prototype.dispose = function () { + var parent = this; + this.scheduler.schedule(function () { + if (!parent.isDisposed) { + parent.isDisposed = true; + parent.disposable.dispose(); + } + }); + }; + + var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) { + this.scheduler = scheduler; + this.state = state; + this.action = action; + this.dueTime = dueTime; + this.comparer = comparer || defaultSubComparer; + this.disposable = new SingleAssignmentDisposable(); + } + + ScheduledItem.prototype.invoke = function () { + this.disposable.setDisposable(this.invokeCore()); + }; + + ScheduledItem.prototype.compareTo = function (other) { + return this.comparer(this.dueTime, other.dueTime); + }; + + ScheduledItem.prototype.isCancelled = function () { + return this.disposable.isDisposed; + }; + + ScheduledItem.prototype.invokeCore = function () { + return this.action(this.scheduler, this.state); + }; + + /** Provides a set of static properties to access commonly used schedulers. */ + var Scheduler = Rx.Scheduler = (function () { + + /** + * @constructor + * @private + */ + function Scheduler(now, schedule, scheduleRelative, scheduleAbsolute) { + this.now = now; + this._schedule = schedule; + this._scheduleRelative = scheduleRelative; + this._scheduleAbsolute = scheduleAbsolute; + } + + function invokeRecImmediate(scheduler, pair) { + var state = pair.first, action = pair.second, group = new CompositeDisposable(), + recursiveAction = function (state1) { + action(state1, function (state2) { + var isAdded = false, isDone = false, + d = scheduler.scheduleWithState(state2, function (scheduler1, state3) { + if (isAdded) { + group.remove(d); + } else { + isDone = true; + } + recursiveAction(state3); + return disposableEmpty; + }); + if (!isDone) { + group.add(d); + isAdded = true; + } + }); + }; + recursiveAction(state); + return group; + } + + function invokeRecDate(scheduler, pair, method) { + var state = pair.first, action = pair.second, group = new CompositeDisposable(), + recursiveAction = function (state1) { + action(state1, function (state2, dueTime1) { + var isAdded = false, isDone = false, + d = scheduler[method].call(scheduler, state2, dueTime1, function (scheduler1, state3) { + if (isAdded) { + group.remove(d); + } else { + isDone = true; + } + recursiveAction(state3); + return disposableEmpty; + }); + if (!isDone) { + group.add(d); + isAdded = true; + } + }); + }; + recursiveAction(state); + return group; + } + + function invokeAction(scheduler, action) { + action(); + return disposableEmpty; + } + + var schedulerProto = Scheduler.prototype; + + /** + * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions. + * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false. + * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling. + */ + schedulerProto.catchException = schedulerProto['catch'] = function (handler) { + return new CatchScheduler(this, handler); + }; + + /** + * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation. + * @param {Number} period Period for running the work periodically. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort). + */ + schedulerProto.schedulePeriodic = function (period, action) { + return this.schedulePeriodicWithState(null, period, function () { + action(); + }); + }; + + /** + * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation. + * @param {Mixed} state Initial state passed to the action upon the first iteration. + * @param {Number} period Period for running the work periodically. + * @param {Function} action Action to be executed, potentially updating the state. + * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort). + */ + schedulerProto.schedulePeriodicWithState = function (state, period, action) { + var s = state, id = setInterval(function () { + s = action(s); + }, period); + return disposableCreate(function () { + clearInterval(id); + }); + }; + + /** + * Schedules an action to be executed. + * @param {Function} action Action to execute. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.schedule = function (action) { + return this._schedule(action, invokeAction); + }; + + /** + * Schedules an action to be executed. + * @param state State passed to the action to be executed. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithState = function (state, action) { + return this._schedule(state, action); + }; + + /** + * Schedules an action to be executed after the specified relative due time. + * @param {Function} action Action to execute. + * @param {Number} dueTime Relative time after which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithRelative = function (dueTime, action) { + return this._scheduleRelative(action, dueTime, invokeAction); + }; + + /** + * Schedules an action to be executed after dueTime. + * @param state State passed to the action to be executed. + * @param {Function} action Action to be executed. + * @param {Number} dueTime Relative time after which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithRelativeAndState = function (state, dueTime, action) { + return this._scheduleRelative(state, dueTime, action); + }; + + /** + * Schedules an action to be executed at the specified absolute due time. + * @param {Function} action Action to execute. + * @param {Number} dueTime Absolute time at which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithAbsolute = function (dueTime, action) { + return this._scheduleAbsolute(action, dueTime, invokeAction); + }; + + /** + * Schedules an action to be executed at dueTime. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to be executed. + * @param {Number}dueTime Absolute time at which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithAbsoluteAndState = function (state, dueTime, action) { + return this._scheduleAbsolute(state, dueTime, action); + }; + + /** + * Schedules an action to be executed recursively. + * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursive = function (action) { + return this.scheduleRecursiveWithState(action, function (_action, self) { + _action(function () { + self(_action); + }); + }); + }; + + /** + * Schedules an action to be executed recursively. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithState = function (state, action) { + return this.scheduleWithState({ first: state, second: action }, function (s, p) { + return invokeRecImmediate(s, p); + }); + }; + + /** + * Schedules an action to be executed recursively after a specified relative due time. + * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified relative time. + * @param {Number}dueTime Relative time after which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithRelative = function (dueTime, action) { + return this.scheduleRecursiveWithRelativeAndState(action, dueTime, function (_action, self) { + _action(function (dt) { + self(_action, dt); + }); + }); + }; + + /** + * Schedules an action to be executed recursively after a specified relative due time. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state. + * @param {Number}dueTime Relative time after which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithRelativeAndState = function (state, dueTime, action) { + return this._scheduleRelative({ first: state, second: action }, dueTime, function (s, p) { + return invokeRecDate(s, p, 'scheduleWithRelativeAndState'); + }); + }; + + /** + * Schedules an action to be executed recursively at a specified absolute due time. + * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified absolute time. + * @param {Number}dueTime Absolute time at which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithAbsolute = function (dueTime, action) { + return this.scheduleRecursiveWithAbsoluteAndState(action, dueTime, function (_action, self) { + _action(function (dt) { + self(_action, dt); + }); + }); + }; + + /** + * Schedules an action to be executed recursively at a specified absolute due time. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state. + * @param {Number}dueTime Absolute time at which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithAbsoluteAndState = function (state, dueTime, action) { + return this._scheduleAbsolute({ first: state, second: action }, dueTime, function (s, p) { + return invokeRecDate(s, p, 'scheduleWithAbsoluteAndState'); + }); + }; + + /** Gets the current time according to the local machine's system clock. */ + Scheduler.now = defaultNow; + + /** + * Normalizes the specified TimeSpan value to a positive value. + * @param {Number} timeSpan The time span value to normalize. + * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0 + */ + Scheduler.normalize = function (timeSpan) { + if (timeSpan < 0) { + timeSpan = 0; + } + return timeSpan; + }; + + return Scheduler; + }()); + + var normalizeTime = Scheduler.normalize; + + var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () { + function tick(command, recurse) { + recurse(0, this._period); + try { + this._state = this._action(this._state); + } catch (e) { + this._cancel.dispose(); + throw e; + } + } + + function SchedulePeriodicRecursive(scheduler, state, period, action) { + this._scheduler = scheduler; + this._state = state; + this._period = period; + this._action = action; + } + + SchedulePeriodicRecursive.prototype.start = function () { + var d = new SingleAssignmentDisposable(); + this._cancel = d; + d.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0, this._period, tick.bind(this))); + + return d; + }; + + return SchedulePeriodicRecursive; + }()); + + /** + * Gets a scheduler that schedules work immediately on the current thread. + */ + var immediateScheduler = Scheduler.immediate = (function () { + + function scheduleNow(state, action) { return action(this, state); } + + function scheduleRelative(state, dueTime, action) { + var dt = normalizeTime(dt); + while (dt - this.now() > 0) { } + return action(this, state); + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); + } + + return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); + }()); + + /** + * Gets a scheduler that schedules work as soon as possible on the current thread. + */ + var currentThreadScheduler = Scheduler.currentThread = (function () { + var queue; + + function runTrampoline (q) { + var item; + while (q.length > 0) { + item = q.dequeue(); + if (!item.isCancelled()) { + // Note, do not schedule blocking work! + while (item.dueTime - Scheduler.now() > 0) { + } + if (!item.isCancelled()) { + item.invoke(); + } + } + } + } + + function scheduleNow(state, action) { + return this.scheduleWithRelativeAndState(state, 0, action); + } + + function scheduleRelative(state, dueTime, action) { + var dt = this.now() + Scheduler.normalize(dueTime), + si = new ScheduledItem(this, state, action, dt), + t; + if (!queue) { + queue = new PriorityQueue(4); + queue.enqueue(si); + try { + runTrampoline(queue); + } catch (e) { + throw e; + } finally { + queue = null; + } + } else { + queue.enqueue(si); + } + return si.disposable; + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); + } + + var currentScheduler = new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); + currentScheduler.scheduleRequired = function () { return queue === null; }; + currentScheduler.ensureTrampoline = function (action) { + if (queue === null) { + return this.schedule(action); + } else { + return action(); + } + }; + + return currentScheduler; + }()); + + + var scheduleMethod, clearMethod = noop; + (function () { + + var reNative = RegExp('^' + + String(toString) + .replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + .replace(/toString| for [^\]]+/g, '.*?') + '$' + ); + + var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' && + !reNative.test(setImmediate) && setImmediate, + clearImmediate = typeof (clearImmediate = freeGlobal && moduleExports && freeGlobal.clearImmediate) == 'function' && + !reNative.test(clearImmediate) && clearImmediate; + + function postMessageSupported () { + // Ensure not in a worker + if (!root.postMessage || root.importScripts) { return false; } + var isAsync = false, + oldHandler = root.onmessage; + // Test for async + root.onmessage = function () { isAsync = true; }; + root.postMessage('','*'); + root.onmessage = oldHandler; + + return isAsync; + } + + // Use in order, nextTick, setImmediate, postMessage, MessageChannel, script readystatechanged, setTimeout + if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') { + scheduleMethod = process.nextTick; + } else if (typeof setImmediate === 'function') { + scheduleMethod = setImmediate; + clearMethod = clearImmediate; + } else if (postMessageSupported()) { + var MSG_PREFIX = 'ms.rx.schedule' + Math.random(), + tasks = {}, + taskId = 0; + + function onGlobalPostMessage(event) { + // Only if we're a match to avoid any other global events + if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) { + var handleId = event.data.substring(MSG_PREFIX.length), + action = tasks[handleId]; + action(); + delete tasks[handleId]; + } + } + + if (root.addEventListener) { + root.addEventListener('message', onGlobalPostMessage, false); + } else { + root.attachEvent('onmessage', onGlobalPostMessage, false); + } + + scheduleMethod = function (action) { + var currentId = taskId++; + tasks[currentId] = action; + root.postMessage(MSG_PREFIX + currentId, '*'); + }; + } else if (!!root.MessageChannel) { + var channel = new root.MessageChannel(), + channelTasks = {}, + channelTaskId = 0; + + channel.port1.onmessage = function (event) { + var id = event.data, + action = channelTasks[id]; + action(); + delete channelTasks[id]; + }; + + scheduleMethod = function (action) { + var id = channelTaskId++; + channelTasks[id] = action; + channel.port2.postMessage(id); + }; + } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) { + + scheduleMethod = function (action) { + var scriptElement = root.document.createElement('script'); + scriptElement.onreadystatechange = function () { + action(); + scriptElement.onreadystatechange = null; + scriptElement.parentNode.removeChild(scriptElement); + scriptElement = null; + }; + root.document.documentElement.appendChild(scriptElement); + }; + + } else { + scheduleMethod = function (action) { return setTimeout(action, 0); }; + clearMethod = clearTimeout; + } + }()); + + /** + * Gets a scheduler that schedules work via a timed callback based upon platform. + */ + var timeoutScheduler = Scheduler.timeout = (function () { + + function scheduleNow(state, action) { + var scheduler = this, + disposable = new SingleAssignmentDisposable(); + var id = scheduleMethod(function () { + if (!disposable.isDisposed) { + disposable.setDisposable(action(scheduler, state)); + } + }); + return new CompositeDisposable(disposable, disposableCreate(function () { + clearMethod(id); + })); + } + + function scheduleRelative(state, dueTime, action) { + var scheduler = this, + dt = Scheduler.normalize(dueTime); + if (dt === 0) { + return scheduler.scheduleWithState(state, action); + } + var disposable = new SingleAssignmentDisposable(); + var id = setTimeout(function () { + if (!disposable.isDisposed) { + disposable.setDisposable(action(scheduler, state)); + } + }, dt); + return new CompositeDisposable(disposable, disposableCreate(function () { + clearTimeout(id); + })); + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); + } + + return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); + })(); + + /** @private */ + var CatchScheduler = (function (_super) { + + function localNow() { + return this._scheduler.now(); + } + + function scheduleNow(state, action) { + return this._scheduler.scheduleWithState(state, this._wrap(action)); + } + + function scheduleRelative(state, dueTime, action) { + return this._scheduler.scheduleWithRelativeAndState(state, dueTime, this._wrap(action)); + } + + function scheduleAbsolute(state, dueTime, action) { + return this._scheduler.scheduleWithAbsoluteAndState(state, dueTime, this._wrap(action)); + } + + inherits(CatchScheduler, _super); + + /** @private */ + function CatchScheduler(scheduler, handler) { + this._scheduler = scheduler; + this._handler = handler; + this._recursiveOriginal = null; + this._recursiveWrapper = null; + _super.call(this, localNow, scheduleNow, scheduleRelative, scheduleAbsolute); + } + + /** @private */ + CatchScheduler.prototype._clone = function (scheduler) { + return new CatchScheduler(scheduler, this._handler); + }; + + /** @private */ + CatchScheduler.prototype._wrap = function (action) { + var parent = this; + return function (self, state) { + try { + return action(parent._getRecursiveWrapper(self), state); + } catch (e) { + if (!parent._handler(e)) { throw e; } + return disposableEmpty; + } + }; + }; + + /** @private */ + CatchScheduler.prototype._getRecursiveWrapper = function (scheduler) { + if (this._recursiveOriginal !== scheduler) { + this._recursiveOriginal = scheduler; + var wrapper = this._clone(scheduler); + wrapper._recursiveOriginal = scheduler; + wrapper._recursiveWrapper = wrapper; + this._recursiveWrapper = wrapper; + } + return this._recursiveWrapper; + }; + + /** @private */ + CatchScheduler.prototype.schedulePeriodicWithState = function (state, period, action) { + var self = this, failed = false, d = new SingleAssignmentDisposable(); + + d.setDisposable(this._scheduler.schedulePeriodicWithState(state, period, function (state1) { + if (failed) { return null; } + try { + return action(state1); + } catch (e) { + failed = true; + if (!self._handler(e)) { throw e; } + d.dispose(); + return null; + } + })); + + return d; + }; + + return CatchScheduler; + }(Scheduler)); + + /** + * Represents a notification to an observer. + */ + var Notification = Rx.Notification = (function () { + function Notification(kind, hasValue) { + this.hasValue = hasValue == null ? false : hasValue; + this.kind = kind; + } + + var NotificationPrototype = Notification.prototype; + + /** + * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result. + * + * @memberOf Notification + * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on.. + * @param {Function} onError Delegate to invoke for an OnError notification. + * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification. + * @returns {Any} Result produced by the observation. + */ + NotificationPrototype.accept = function (observerOrOnNext, onError, onCompleted) { + if (arguments.length === 1 && typeof observerOrOnNext === 'object') { + return this._acceptObservable(observerOrOnNext); + } + return this._accept(observerOrOnNext, onError, onCompleted); + }; + + /** + * Returns an observable sequence with a single notification. + * + * @memberOf Notification + * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on. + * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription. + */ + NotificationPrototype.toObservable = function (scheduler) { + var notification = this; + scheduler || (scheduler = immediateScheduler); + return new AnonymousObservable(function (observer) { + return scheduler.schedule(function () { + notification._acceptObservable(observer); + if (notification.kind === 'N') { + observer.onCompleted(); + } + }); + }); + }; + + return Notification; + })(); + + /** + * Creates an object that represents an OnNext notification to an observer. + * @param {Any} value The value contained in the notification. + * @returns {Notification} The OnNext notification containing the value. + */ + var notificationCreateOnNext = Notification.createOnNext = (function () { + + function _accept (onNext) { + return onNext(this.value); + } + + function _acceptObservable(observer) { + return observer.onNext(this.value); + } + + function toString () { + return 'OnNext(' + this.value + ')'; + } + + return function (value) { + var notification = new Notification('N', true); + notification.value = value; + notification._accept = _accept; + notification._acceptObservable = _acceptObservable; + notification.toString = toString; + return notification; + }; + }()); + + /** + * Creates an object that represents an OnError notification to an observer. + * @param {Any} error The exception contained in the notification. + * @returns {Notification} The OnError notification containing the exception. + */ + var notificationCreateOnError = Notification.createOnError = (function () { + + function _accept (onNext, onError) { + return onError(this.exception); + } + + function _acceptObservable(observer) { + return observer.onError(this.exception); + } + + function toString () { + return 'OnError(' + this.exception + ')'; + } + + return function (exception) { + var notification = new Notification('E'); + notification.exception = exception; + notification._accept = _accept; + notification._acceptObservable = _acceptObservable; + notification.toString = toString; + return notification; + }; + }()); + + /** + * Creates an object that represents an OnCompleted notification to an observer. + * @returns {Notification} The OnCompleted notification. + */ + var notificationCreateOnCompleted = Notification.createOnCompleted = (function () { + + function _accept (onNext, onError, onCompleted) { + return onCompleted(); + } + + function _acceptObservable(observer) { + return observer.onCompleted(); + } + + function toString () { + return 'OnCompleted()'; + } + + return function () { + var notification = new Notification('C'); + notification._accept = _accept; + notification._acceptObservable = _acceptObservable; + notification.toString = toString; + return notification; + }; + }()); + + var Enumerator = Rx.internals.Enumerator = function (next) { + this._next = next; + }; + + Enumerator.prototype.next = function () { + return this._next(); + }; + + Enumerator.prototype[$iterator$] = function () { return this; } + + var Enumerable = Rx.internals.Enumerable = function (iterator) { + this._iterator = iterator; + }; + + Enumerable.prototype[$iterator$] = function () { + return this._iterator(); + }; + + Enumerable.prototype.concat = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var e; + try { + e = sources[$iterator$](); + } catch(err) { + observer.onError(); + return; + } + + var isDisposed, + subscription = new SerialDisposable(); + var cancelable = immediateScheduler.scheduleRecursive(function (self) { + var currentItem; + if (isDisposed) { return; } + + try { + currentItem = e.next(); + } catch (ex) { + observer.onError(ex); + return; + } + + if (currentItem.done) { + observer.onCompleted(); + return; + } + + // Check if promise + var currentValue = currentItem.value; + isPromise(currentValue) && (currentValue = observableFromPromise(currentValue)); + + var d = new SingleAssignmentDisposable(); + subscription.setDisposable(d); + d.setDisposable(currentValue.subscribe( + observer.onNext.bind(observer), + observer.onError.bind(observer), + function () { self(); }) + ); + }); + + return new CompositeDisposable(subscription, cancelable, disposableCreate(function () { + isDisposed = true; + })); + }); + }; + + Enumerable.prototype.catchException = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var e; + try { + e = sources[$iterator$](); + } catch(err) { + observer.onError(); + return; + } + + var isDisposed, + lastException, + subscription = new SerialDisposable(); + var cancelable = immediateScheduler.scheduleRecursive(function (self) { + if (isDisposed) { return; } + + var currentItem; + try { + currentItem = e.next(); + } catch (ex) { + observer.onError(ex); + return; + } + + if (currentItem.done) { + if (lastException) { + observer.onError(lastException); + } else { + observer.onCompleted(); + } + return; + } + + // Check if promise + var currentValue = currentItem.value; + isPromise(currentValue) && (currentValue = observableFromPromise(currentValue)); + + var d = new SingleAssignmentDisposable(); + subscription.setDisposable(d); + d.setDisposable(currentValue.subscribe( + observer.onNext.bind(observer), + function (exn) { + lastException = exn; + self(); + }, + observer.onCompleted.bind(observer))); + }); + return new CompositeDisposable(subscription, cancelable, disposableCreate(function () { + isDisposed = true; + })); + }); + }; + + var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) { + if (repeatCount == null) { repeatCount = -1; } + return new Enumerable(function () { + var left = repeatCount; + return new Enumerator(function () { + if (left === 0) { return doneEnumerator; } + if (left > 0) { left--; } + return { done: false, value: value }; + }); + }); + }; + + var enumerableFor = Enumerable.forEach = function (source, selector, thisArg) { + selector || (selector = identity); + return new Enumerable(function () { + var index = -1; + return new Enumerator( + function () { + return ++index < source.length ? + { done: false, value: selector.call(thisArg, source[index], index, source) } : + doneEnumerator; + }); + }); + }; + + /** + * Supports push-style iteration over an observable sequence. + */ + var Observer = Rx.Observer = function () { }; + + /** + * Creates a notification callback from an observer. + * + * @param observer Observer object. + * @returns The action that forwards its input notification to the underlying observer. + */ + Observer.prototype.toNotifier = function () { + var observer = this; + return function (n) { + return n.accept(observer); + }; + }; + + /** + * Hides the identity of an observer. + + * @returns An observer that hides the identity of the specified observer. + */ + Observer.prototype.asObserver = function () { + return new AnonymousObserver(this.onNext.bind(this), this.onError.bind(this), this.onCompleted.bind(this)); + }; + + /** + * Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods. + * If a violation is detected, an Error is thrown from the offending observer method call. + * + * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer. + */ + Observer.prototype.checked = function () { return new CheckedObserver(this); }; + + /** + * Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions. + * + * @static + * @memberOf Observer + * @param {Function} [onNext] Observer's OnNext action implementation. + * @param {Function} [onError] Observer's OnError action implementation. + * @param {Function} [onCompleted] Observer's OnCompleted action implementation. + * @returns {Observer} The observer object implemented using the given actions. + */ + var observerCreate = Observer.create = function (onNext, onError, onCompleted) { + onNext || (onNext = noop); + onError || (onError = defaultError); + onCompleted || (onCompleted = noop); + return new AnonymousObserver(onNext, onError, onCompleted); + }; + + /** + * Creates an observer from a notification callback. + * + * @static + * @memberOf Observer + * @param {Function} handler Action that handles a notification. + * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives. + */ + Observer.fromNotifier = function (handler) { + return new AnonymousObserver(function (x) { + return handler(notificationCreateOnNext(x)); + }, function (exception) { + return handler(notificationCreateOnError(exception)); + }, function () { + return handler(notificationCreateOnCompleted()); + }); + }; + + /** + * Schedules the invocation of observer methods on the given scheduler. + * @param {Scheduler} scheduler Scheduler to schedule observer messages on. + * @returns {Observer} Observer whose messages are scheduled on the given scheduler. + */ + Observer.notifyOn = function (scheduler) { + return new ObserveOnObserver(scheduler, this); + }; + + /** + * Abstract base class for implementations of the Observer class. + * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages. + */ + var AbstractObserver = Rx.internals.AbstractObserver = (function (_super) { + inherits(AbstractObserver, _super); + + /** + * Creates a new observer in a non-stopped state. + * + * @constructor + */ + function AbstractObserver() { + this.isStopped = false; + _super.call(this); + } + + /** + * Notifies the observer of a new element in the sequence. + * + * @memberOf AbstractObserver + * @param {Any} value Next element in the sequence. + */ + AbstractObserver.prototype.onNext = function (value) { + if (!this.isStopped) { + this.next(value); + } + }; + + /** + * Notifies the observer that an exception has occurred. + * + * @memberOf AbstractObserver + * @param {Any} error The error that has occurred. + */ + AbstractObserver.prototype.onError = function (error) { + if (!this.isStopped) { + this.isStopped = true; + this.error(error); + } + }; + + /** + * Notifies the observer of the end of the sequence. + */ + AbstractObserver.prototype.onCompleted = function () { + if (!this.isStopped) { + this.isStopped = true; + this.completed(); + } + }; + + /** + * Disposes the observer, causing it to transition to the stopped state. + */ + AbstractObserver.prototype.dispose = function () { + this.isStopped = true; + }; + + AbstractObserver.prototype.fail = function (e) { + if (!this.isStopped) { + this.isStopped = true; + this.error(e); + return true; + } + + return false; + }; + + return AbstractObserver; + }(Observer)); + + /** + * Class to create an Observer instance from delegate-based implementations of the on* methods. + */ + var AnonymousObserver = Rx.AnonymousObserver = (function (_super) { + inherits(AnonymousObserver, _super); + + /** + * Creates an observer from the specified OnNext, OnError, and OnCompleted actions. + * @param {Any} onNext Observer's OnNext action implementation. + * @param {Any} onError Observer's OnError action implementation. + * @param {Any} onCompleted Observer's OnCompleted action implementation. + */ + function AnonymousObserver(onNext, onError, onCompleted) { + _super.call(this); + this._onNext = onNext; + this._onError = onError; + this._onCompleted = onCompleted; + } + + /** + * Calls the onNext action. + * @param {Any} value Next element in the sequence. + */ + AnonymousObserver.prototype.next = function (value) { + this._onNext(value); + }; + + /** + * Calls the onError action. + * @param {Any} error The error that has occurred. + */ + AnonymousObserver.prototype.error = function (exception) { + this._onError(exception); + }; + + /** + * Calls the onCompleted action. + */ + AnonymousObserver.prototype.completed = function () { + this._onCompleted(); + }; + + return AnonymousObserver; + }(AbstractObserver)); + + var CheckedObserver = (function (_super) { + inherits(CheckedObserver, _super); + + function CheckedObserver(observer) { + _super.call(this); + this._observer = observer; + this._state = 0; // 0 - idle, 1 - busy, 2 - done + } + + var CheckedObserverPrototype = CheckedObserver.prototype; + + CheckedObserverPrototype.onNext = function (value) { + this.checkAccess(); + try { + this._observer.onNext(value); + } catch (e) { + throw e; + } finally { + this._state = 0; + } + }; + + CheckedObserverPrototype.onError = function (err) { + this.checkAccess(); + try { + this._observer.onError(err); + } catch (e) { + throw e; + } finally { + this._state = 2; + } + }; + + CheckedObserverPrototype.onCompleted = function () { + this.checkAccess(); + try { + this._observer.onCompleted(); + } catch (e) { + throw e; + } finally { + this._state = 2; + } + }; + + CheckedObserverPrototype.checkAccess = function () { + if (this._state === 1) { throw new Error('Re-entrancy detected'); } + if (this._state === 2) { throw new Error('Observer completed'); } + if (this._state === 0) { this._state = 1; } + }; + + return CheckedObserver; + }(Observer)); + + var ScheduledObserver = Rx.internals.ScheduledObserver = (function (_super) { + inherits(ScheduledObserver, _super); + + function ScheduledObserver(scheduler, observer) { + _super.call(this); + this.scheduler = scheduler; + this.observer = observer; + this.isAcquired = false; + this.hasFaulted = false; + this.queue = []; + this.disposable = new SerialDisposable(); + } + + ScheduledObserver.prototype.next = function (value) { + var self = this; + this.queue.push(function () { + self.observer.onNext(value); + }); + }; + + ScheduledObserver.prototype.error = function (exception) { + var self = this; + this.queue.push(function () { + self.observer.onError(exception); + }); + }; + + ScheduledObserver.prototype.completed = function () { + var self = this; + this.queue.push(function () { + self.observer.onCompleted(); + }); + }; + + ScheduledObserver.prototype.ensureActive = function () { + var isOwner = false, parent = this; + if (!this.hasFaulted && this.queue.length > 0) { + isOwner = !this.isAcquired; + this.isAcquired = true; + } + if (isOwner) { + this.disposable.setDisposable(this.scheduler.scheduleRecursive(function (self) { + var work; + if (parent.queue.length > 0) { + work = parent.queue.shift(); + } else { + parent.isAcquired = false; + return; + } + try { + work(); + } catch (ex) { + parent.queue = []; + parent.hasFaulted = true; + throw ex; + } + self(); + })); + } + }; + + ScheduledObserver.prototype.dispose = function () { + _super.prototype.dispose.call(this); + this.disposable.dispose(); + }; + + return ScheduledObserver; + }(AbstractObserver)); + + /** @private */ + var ObserveOnObserver = (function (_super) { + inherits(ObserveOnObserver, _super); + + /** @private */ + function ObserveOnObserver() { + _super.apply(this, arguments); + } + + /** @private */ + ObserveOnObserver.prototype.next = function (value) { + _super.prototype.next.call(this, value); + this.ensureActive(); + }; + + /** @private */ + ObserveOnObserver.prototype.error = function (e) { + _super.prototype.error.call(this, e); + this.ensureActive(); + }; + + /** @private */ + ObserveOnObserver.prototype.completed = function () { + _super.prototype.completed.call(this); + this.ensureActive(); + }; + + return ObserveOnObserver; + })(ScheduledObserver); + + var observableProto; + + /** + * Represents a push-style collection. + */ + var Observable = Rx.Observable = (function () { + + function Observable(subscribe) { + this._subscribe = subscribe; + } + + observableProto = Observable.prototype; + + /** + * Subscribes an observer to the observable sequence. + * + * @example + * 1 - source.subscribe(); + * 2 - source.subscribe(observer); + * 3 - source.subscribe(function (x) { console.log(x); }); + * 4 - source.subscribe(function (x) { console.log(x); }, function (err) { console.log(err); }); + * 5 - source.subscribe(function (x) { console.log(x); }, function (err) { console.log(err); }, function () { console.log('done'); }); + * @param {Mixed} [observerOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence. + * @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence. + * @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence. + * @returns {Diposable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler. + */ + observableProto.subscribe = observableProto.forEach = function (observerOrOnNext, onError, onCompleted) { + var subscriber = typeof observerOrOnNext === 'object' ? + observerOrOnNext : + observerCreate(observerOrOnNext, onError, onCompleted); + + return this._subscribe(subscriber); + }; + + return Observable; + })(); + + /** + * Wraps the source sequence in order to run its observer callbacks on the specified scheduler. + * + * This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects + * that require to be run on a scheduler, use subscribeOn. + * + * @param {Scheduler} scheduler Scheduler to notify observers on. + * @returns {Observable} The source sequence whose observations happen on the specified scheduler. + */ + observableProto.observeOn = function (scheduler) { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(new ObserveOnObserver(scheduler, observer)); + }); + }; + + /** + * Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used; + * see the remarks section for more information on the distinction between subscribeOn and observeOn. + + * This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer + * callbacks on a scheduler, use observeOn. + + * @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on. + * @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler. + */ + observableProto.subscribeOn = function (scheduler) { + var source = this; + return new AnonymousObservable(function (observer) { + var m = new SingleAssignmentDisposable(), d = new SerialDisposable(); + d.setDisposable(m); + m.setDisposable(scheduler.schedule(function () { + d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(observer))); + })); + return d; + }); + }; + + /** + * Converts a Promise to an Observable sequence + * @param {Promise} An ES6 Compliant promise. + * @returns {Observable} An Observable sequence which wraps the existing promise success and failure. + */ + var observableFromPromise = Observable.fromPromise = function (promise) { + return new AnonymousObservable(function (observer) { + promise.then( + function (value) { + observer.onNext(value); + observer.onCompleted(); + }, + function (reason) { + observer.onError(reason); + }); + + return function () { + if (promise && promise.abort) { + promise.abort(); + } + } + }); + }; + /* + * Converts an existing observable sequence to an ES6 Compatible Promise + * @example + * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise); + * + * // With config + * Rx.config.Promise = RSVP.Promise; + * var promise = Rx.Observable.return(42).toPromise(); + * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise. + * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence. + */ + observableProto.toPromise = function (promiseCtor) { + promiseCtor || (promiseCtor = Rx.config.Promise); + if (!promiseCtor) { + throw new Error('Promise type not provided nor in Rx.config.Promise'); + } + var source = this; + return new promiseCtor(function (resolve, reject) { + // No cancellation can be done + var value, hasValue = false; + source.subscribe(function (v) { + value = v; + hasValue = true; + }, function (err) { + reject(err); + }, function () { + if (hasValue) { + resolve(value); + } + }); + }); + }; + /** + * Creates a list from an observable sequence. + * @returns An observable sequence containing a single element with a list containing all the elements of the source sequence. + */ + observableProto.toArray = function () { + var self = this; + return new AnonymousObservable(function(observer) { + var arr = []; + return self.subscribe( + arr.push.bind(arr), + observer.onError.bind(observer), + function () { + observer.onNext(arr); + observer.onCompleted(); + }); + }); + }; + + /** + * Creates an observable sequence from a specified subscribe method implementation. + * + * @example + * var res = Rx.Observable.create(function (observer) { return function () { } ); + * var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } ); + * var res = Rx.Observable.create(function (observer) { } ); + * + * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable. + * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method. + */ + Observable.create = Observable.createWithDisposable = function (subscribe) { + return new AnonymousObservable(subscribe); + }; + + /** + * Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes. + * + * @example + * var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); }); + * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise. + * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function. + */ + var observableDefer = Observable.defer = function (observableFactory) { + return new AnonymousObservable(function (observer) { + var result; + try { + result = observableFactory(); + } catch (e) { + return observableThrow(e).subscribe(observer); + } + isPromise(result) && (result = observableFromPromise(result)); + return result.subscribe(observer); + }); + }; + + /** + * Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message. + * + * @example + * var res = Rx.Observable.empty(); + * var res = Rx.Observable.empty(Rx.Scheduler.timeout); + * @param {Scheduler} [scheduler] Scheduler to send the termination call on. + * @returns {Observable} An observable sequence with no elements. + */ + var observableEmpty = Observable.empty = function (scheduler) { + scheduler || (scheduler = immediateScheduler); + return new AnonymousObservable(function (observer) { + return scheduler.schedule(function () { + observer.onCompleted(); + }); + }); + }; + + /** + * Converts an array to an observable sequence, using an optional scheduler to enumerate the array. + * + * @example + * var res = Rx.Observable.fromArray([1,2,3]); + * var res = Rx.Observable.fromArray([1,2,3], Rx.Scheduler.timeout); + * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on. + * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence. + */ + var observableFromArray = Observable.fromArray = function (array, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + return new AnonymousObservable(function (observer) { + var count = 0, len = array.length; + return scheduler.scheduleRecursive(function (self) { + if (count < len) { + observer.onNext(array[count++]); + self(); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * Converts an iterable into an Observable sequence + * + * @example + * var res = Rx.Observable.fromIterable(new Map()); + * var res = Rx.Observable.fromIterable(new Set(), Rx.Scheduler.timeout); + * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on. + * @returns {Observable} The observable sequence whose elements are pulled from the given generator sequence. + */ + Observable.fromIterable = function (iterable, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + return new AnonymousObservable(function (observer) { + var iterator; + try { + iterator = iterable[$iterator$](); + } catch (e) { + observer.onError(e); + return; + } + + return scheduler.scheduleRecursive(function (self) { + var next; + try { + next = iterator.next(); + } catch (err) { + observer.onError(err); + return; + } + + if (next.done) { + observer.onCompleted(); + } else { + observer.onNext(next.value); + self(); + } + }); + }); + }; + + /** + * Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages. + * + * @example + * var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }); + * var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout); + * @param {Mixed} initialState Initial state. + * @param {Function} condition Condition to terminate generation (upon returning false). + * @param {Function} iterate Iteration step function. + * @param {Function} resultSelector Selector function for results produced in the sequence. + * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread. + * @returns {Observable} The generated sequence. + */ + Observable.generate = function (initialState, condition, iterate, resultSelector, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + return new AnonymousObservable(function (observer) { + var first = true, state = initialState; + return scheduler.scheduleRecursive(function (self) { + var hasResult, result; + try { + if (first) { + first = false; + } else { + state = iterate(state); + } + hasResult = condition(state); + if (hasResult) { + result = resultSelector(state); + } + } catch (exception) { + observer.onError(exception); + return; + } + if (hasResult) { + observer.onNext(result); + self(); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments. + * @example + * var res = Rx.Observable.of(1,2,3); + * @returns {Observable} The observable sequence whose elements are pulled from the given arguments. + */ + Observable.of = function () { + var len = arguments.length, args = new Array(len); + for(var i = 0; i < len; i++) { args[i] = arguments[i]; } + return observableFromArray(args); + }; + + /** + * This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments. + * @example + * var res = Rx.Observable.of(1,2,3); + * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments. + * @returns {Observable} The observable sequence whose elements are pulled from the given arguments. + */ + var observableOf = Observable.ofWithScheduler = function (scheduler) { + var len = arguments.length - 1, args = new Array(len); + for(var i = 0; i < len; i++) { args[i] = arguments[i + 1]; } + return observableFromArray(args, scheduler); + }; + + /** + * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins). + * @returns {Observable} An observable sequence whose observers will never get called. + */ + var observableNever = Observable.never = function () { + return new AnonymousObservable(function () { + return disposableEmpty; + }); + }; + + /** + * Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages. + * + * @example + * var res = Rx.Observable.range(0, 10); + * var res = Rx.Observable.range(0, 10, Rx.Scheduler.timeout); + * @param {Number} start The value of the first integer in the sequence. + * @param {Number} count The number of sequential integers to generate. + * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread. + * @returns {Observable} An observable sequence that contains a range of sequential integral numbers. + */ + Observable.range = function (start, count, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + return new AnonymousObservable(function (observer) { + return scheduler.scheduleRecursiveWithState(0, function (i, self) { + if (i < count) { + observer.onNext(start + i); + self(i + 1); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages. + * + * @example + * var res = Rx.Observable.repeat(42); + * var res = Rx.Observable.repeat(42, 4); + * 3 - res = Rx.Observable.repeat(42, 4, Rx.Scheduler.timeout); + * 4 - res = Rx.Observable.repeat(42, null, Rx.Scheduler.timeout); + * @param {Mixed} value Element to repeat. + * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely. + * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate. + * @returns {Observable} An observable sequence that repeats the given element the specified number of times. + */ + Observable.repeat = function (value, repeatCount, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + if (repeatCount == null) { + repeatCount = -1; + } + return observableReturn(value, scheduler).repeat(repeatCount); + }; + + /** + * Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages. + * There is an alias called 'just', and 'returnValue' for browsers 0) { + s = q.shift(); + subscribe(s); + } else { + activeCount--; + if (isStopped && activeCount === 0) { + observer.onCompleted(); + } + } + })); + }; + group.add(sources.subscribe(function (innerSource) { + if (activeCount < maxConcurrentOrOther) { + activeCount++; + subscribe(innerSource); + } else { + q.push(innerSource); + } + }, observer.onError.bind(observer), function () { + isStopped = true; + if (activeCount === 0) { + observer.onCompleted(); + } + })); + return group; + }); + }; + + /** + * Merges all the observable sequences into a single observable sequence. + * The scheduler is optional and if not specified, the immediate scheduler is used. + * + * @example + * 1 - merged = Rx.Observable.merge(xs, ys, zs); + * 2 - merged = Rx.Observable.merge([xs, ys, zs]); + * 3 - merged = Rx.Observable.merge(scheduler, xs, ys, zs); + * 4 - merged = Rx.Observable.merge(scheduler, [xs, ys, zs]); + * @returns {Observable} The observable sequence that merges the elements of the observable sequences. + */ + var observableMerge = Observable.merge = function () { + var scheduler, sources; + if (!arguments[0]) { + scheduler = immediateScheduler; + sources = slice.call(arguments, 1); + } else if (arguments[0].now) { + scheduler = arguments[0]; + sources = slice.call(arguments, 1); + } else { + scheduler = immediateScheduler; + sources = slice.call(arguments, 0); + } + if (Array.isArray(sources[0])) { + sources = sources[0]; + } + return observableFromArray(sources, scheduler).mergeObservable(); + }; + + /** + * Merges an observable sequence of observable sequences into an observable sequence. + * @returns {Observable} The observable sequence that merges the elements of the inner sequences. + */ + observableProto.mergeObservable = observableProto.mergeAll =function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var group = new CompositeDisposable(), + isStopped = false, + m = new SingleAssignmentDisposable(); + + group.add(m); + m.setDisposable(sources.subscribe(function (innerSource) { + var innerSubscription = new SingleAssignmentDisposable(); + group.add(innerSubscription); + + // Check if Promise or Observable + if (isPromise(innerSource)) { + innerSource = observableFromPromise(innerSource); + } + + innerSubscription.setDisposable(innerSource.subscribe(function (x) { + observer.onNext(x); + }, observer.onError.bind(observer), function () { + group.remove(innerSubscription); + if (isStopped && group.length === 1) { observer.onCompleted(); } + })); + }, observer.onError.bind(observer), function () { + isStopped = true; + if (group.length === 1) { observer.onCompleted(); } + })); + return group; + }); + }; + + /** + * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence. + * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates. + * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally. + */ + observableProto.onErrorResumeNext = function (second) { + if (!second) { + throw new Error('Second observable is required'); + } + return onErrorResumeNext([this, second]); + }; + + /** + * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence. + * + * @example + * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs); + * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]); + * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally. + */ + var onErrorResumeNext = Observable.onErrorResumeNext = function () { + var sources = argsOrArray(arguments, 0); + return new AnonymousObservable(function (observer) { + var pos = 0, subscription = new SerialDisposable(), + cancelable = immediateScheduler.scheduleRecursive(function (self) { + var current, d; + if (pos < sources.length) { + current = sources[pos++]; + isPromise(current) && (current = observableFromPromise(current)); + d = new SingleAssignmentDisposable(); + subscription.setDisposable(d); + d.setDisposable(current.subscribe(observer.onNext.bind(observer), function () { + self(); + }, function () { + self(); + })); + } else { + observer.onCompleted(); + } + }); + return new CompositeDisposable(subscription, cancelable); + }); + }; + + /** + * Returns the values from the source observable sequence only after the other observable sequence produces a value. + * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence. + * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation. + */ + observableProto.skipUntil = function (other) { + var source = this; + return new AnonymousObservable(function (observer) { + var isOpen = false; + var disposables = new CompositeDisposable(source.subscribe(function (left) { + isOpen && observer.onNext(left); + }, observer.onError.bind(observer), function () { + isOpen && observer.onCompleted(); + })); + + isPromise(other) && (other = observableFromPromise(other)); + + var rightSubscription = new SingleAssignmentDisposable(); + disposables.add(rightSubscription); + rightSubscription.setDisposable(other.subscribe(function () { + isOpen = true; + rightSubscription.dispose(); + }, observer.onError.bind(observer), function () { + rightSubscription.dispose(); + })); + + return disposables; + }); + }; + + /** + * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence. + * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received. + */ + observableProto['switch'] = observableProto.switchLatest = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var hasLatest = false, + innerSubscription = new SerialDisposable(), + isStopped = false, + latest = 0, + subscription = sources.subscribe(function (innerSource) { + var d = new SingleAssignmentDisposable(), id = ++latest; + hasLatest = true; + innerSubscription.setDisposable(d); + + // Check if Promise or Observable + if (isPromise(innerSource)) { + innerSource = observableFromPromise(innerSource); + } + + d.setDisposable(innerSource.subscribe(function (x) { + if (latest === id) { + observer.onNext(x); + } + }, function (e) { + if (latest === id) { + observer.onError(e); + } + }, function () { + if (latest === id) { + hasLatest = false; + if (isStopped) { + observer.onCompleted(); + } + } + })); + }, observer.onError.bind(observer), function () { + isStopped = true; + if (!hasLatest) { + observer.onCompleted(); + } + }); + return new CompositeDisposable(subscription, innerSubscription); + }); + }; + + /** + * Returns the values from the source observable sequence until the other observable sequence produces a value. + * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence. + * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation. + */ + observableProto.takeUntil = function (other) { + var source = this; + return new AnonymousObservable(function (observer) { + isPromise(other) && (other = observableFromPromise(other)); + return new CompositeDisposable( + source.subscribe(observer), + other.subscribe(observer.onCompleted.bind(observer), observer.onError.bind(observer), noop) + ); + }); + }; + + function zipArray(second, resultSelector) { + var first = this; + return new AnonymousObservable(function (observer) { + var index = 0, len = second.length; + return first.subscribe(function (left) { + if (index < len) { + var right = second[index++], result; + try { + result = resultSelector(left, right); + } catch (e) { + observer.onError(e); + return; + } + observer.onNext(result); + } else { + observer.onCompleted(); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + } + + /** + * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index. + * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the sources. + * + * @example + * 1 - res = obs1.zip(obs2, fn); + * 1 - res = x1.zip([1,2,3], fn); + * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + observableProto.zip = function () { + if (Array.isArray(arguments[0])) { + return zipArray.apply(this, arguments); + } + var parent = this, sources = slice.call(arguments), resultSelector = sources.pop(); + sources.unshift(parent); + return new AnonymousObservable(function (observer) { + var n = sources.length, + queues = arrayInitialize(n, function () { return []; }), + isDone = arrayInitialize(n, function () { return false; }); + + function next(i) { + var res, queuedValues; + if (queues.every(function (x) { return x.length > 0; })) { + try { + queuedValues = queues.map(function (x) { return x.shift(); }); + res = resultSelector.apply(parent, queuedValues); + } catch (ex) { + observer.onError(ex); + return; + } + observer.onNext(res); + } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) { + observer.onCompleted(); + } + }; + + function done(i) { + isDone[i] = true; + if (isDone.every(function (x) { return x; })) { + observer.onCompleted(); + } + } + + var subscriptions = new Array(n); + for (var idx = 0; idx < n; idx++) { + (function (i) { + var source = sources[i], sad = new SingleAssignmentDisposable(); + isPromise(source) && (source = observableFromPromise(source)); + sad.setDisposable(source.subscribe(function (x) { + queues[i].push(x); + next(i); + }, observer.onError.bind(observer), function () { + done(i); + })); + subscriptions[i] = sad; + })(idx); + } + + return new CompositeDisposable(subscriptions); + }); + }; + /** + * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. + * @param arguments Observable sources. + * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources. + * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + Observable.zip = function () { + var args = slice.call(arguments, 0), + first = args.shift(); + return first.zip.apply(first, args); + }; + + /** + * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes. + * @param arguments Observable sources. + * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes. + */ + Observable.zipArray = function () { + var sources = argsOrArray(arguments, 0); + return new AnonymousObservable(function (observer) { + var n = sources.length, + queues = arrayInitialize(n, function () { return []; }), + isDone = arrayInitialize(n, function () { return false; }); + + function next(i) { + if (queues.every(function (x) { return x.length > 0; })) { + var res = queues.map(function (x) { return x.shift(); }); + observer.onNext(res); + } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) { + observer.onCompleted(); + return; + } + }; + + function done(i) { + isDone[i] = true; + if (isDone.every(identity)) { + observer.onCompleted(); + return; + } + } + + var subscriptions = new Array(n); + for (var idx = 0; idx < n; idx++) { + (function (i) { + subscriptions[i] = new SingleAssignmentDisposable(); + subscriptions[i].setDisposable(sources[i].subscribe(function (x) { + queues[i].push(x); + next(i); + }, observer.onError.bind(observer), function () { + done(i); + })); + })(idx); + } + + var compositeDisposable = new CompositeDisposable(subscriptions); + compositeDisposable.add(disposableCreate(function () { + for (var qIdx = 0, qLen = queues.length; qIdx < qLen; qIdx++) { + queues[qIdx] = []; + } + })); + return compositeDisposable; + }); + }; + + /** + * Hides the identity of an observable sequence. + * @returns {Observable} An observable sequence that hides the identity of the source sequence. + */ + observableProto.asObservable = function () { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(observer); + }); + }; + + /** + * Projects each element of an observable sequence into zero or more buffers which are produced based on element count information. + * + * @example + * var res = xs.bufferWithCount(10); + * var res = xs.bufferWithCount(10, 1); + * @param {Number} count Length of each buffer. + * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count. + * @returns {Observable} An observable sequence of buffers. + */ + observableProto.bufferWithCount = function (count, skip) { + if (typeof skip !== 'number') { + skip = count; + } + return this.windowWithCount(count, skip).selectMany(function (x) { + return x.toArray(); + }).where(function (x) { + return x.length > 0; + }); + }; + + /** + * Dematerializes the explicit notification values of an observable sequence as implicit notifications. + * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values. + */ + observableProto.dematerialize = function () { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(function (x) { + return x.accept(observer); + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer. + * + * var obs = observable.distinctUntilChanged(); + * var obs = observable.distinctUntilChanged(function (x) { return x.id; }); + * var obs = observable.distinctUntilChanged(function (x) { return x.id; }, function (x, y) { return x === y; }); + * + * @param {Function} [keySelector] A function to compute the comparison key for each element. If not provided, it projects the value. + * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function. + * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence. + */ + observableProto.distinctUntilChanged = function (keySelector, comparer) { + var source = this; + keySelector || (keySelector = identity); + comparer || (comparer = defaultComparer); + return new AnonymousObservable(function (observer) { + var hasCurrentKey = false, currentKey; + return source.subscribe(function (value) { + var comparerEquals = false, key; + try { + key = keySelector(value); + } catch (exception) { + observer.onError(exception); + return; + } + if (hasCurrentKey) { + try { + comparerEquals = comparer(currentKey, key); + } catch (exception) { + observer.onError(exception); + return; + } + } + if (!hasCurrentKey || !comparerEquals) { + hasCurrentKey = true; + currentKey = key; + observer.onNext(value); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence. + * This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline. + * + * @example + * var res = observable.doAction(observer); + * var res = observable.doAction(onNext); + * var res = observable.doAction(onNext, onError); + * var res = observable.doAction(onNext, onError, onCompleted); + * @param {Mixed} observerOrOnNext Action to invoke for each element in the observable sequence or an observer. + * @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function. + * @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function. + * @returns {Observable} The source sequence with the side-effecting behavior applied. + */ + observableProto['do'] = observableProto.doAction = function (observerOrOnNext, onError, onCompleted) { + var source = this, onNextFunc; + if (typeof observerOrOnNext === 'function') { + onNextFunc = observerOrOnNext; + } else { + onNextFunc = observerOrOnNext.onNext.bind(observerOrOnNext); + onError = observerOrOnNext.onError.bind(observerOrOnNext); + onCompleted = observerOrOnNext.onCompleted.bind(observerOrOnNext); + } + return new AnonymousObservable(function (observer) { + return source.subscribe(function (x) { + try { + onNextFunc(x); + } catch (e) { + observer.onError(e); + } + observer.onNext(x); + }, function (exception) { + if (!onError) { + observer.onError(exception); + } else { + try { + onError(exception); + } catch (e) { + observer.onError(e); + } + observer.onError(exception); + } + }, function () { + if (!onCompleted) { + observer.onCompleted(); + } else { + try { + onCompleted(); + } catch (e) { + observer.onError(e); + } + observer.onCompleted(); + } + }); + }); + }; + + /** + * Invokes a specified action after the source observable sequence terminates gracefully or exceptionally. + * + * @example + * var res = observable.finallyAction(function () { console.log('sequence ended'; }); + * @param {Function} finallyAction Action to invoke after the source observable sequence terminates. + * @returns {Observable} Source sequence with the action-invoking termination behavior applied. + */ + observableProto['finally'] = observableProto.finallyAction = function (action) { + var source = this; + return new AnonymousObservable(function (observer) { + var subscription; + try { + subscription = source.subscribe(observer); + } catch (e) { + action(); + throw e; + } + return disposableCreate(function () { + try { + subscription.dispose(); + } catch (e) { + throw e; + } finally { + action(); + } + }); + }); + }; + + /** + * Ignores all elements in an observable sequence leaving only the termination messages. + * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence. + */ + observableProto.ignoreElements = function () { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(noop, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Materializes the implicit notifications of an observable sequence as explicit notification values. + * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence. + */ + observableProto.materialize = function () { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(function (value) { + observer.onNext(notificationCreateOnNext(value)); + }, function (e) { + observer.onNext(notificationCreateOnError(e)); + observer.onCompleted(); + }, function () { + observer.onNext(notificationCreateOnCompleted()); + observer.onCompleted(); + }); + }); + }; + + /** + * Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely. + * + * @example + * var res = repeated = source.repeat(); + * var res = repeated = source.repeat(42); + * @param {Number} [repeatCount] Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely. + * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly. + */ + observableProto.repeat = function (repeatCount) { + return enumerableRepeat(this, repeatCount).concat(); + }; + + /** + * Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely. + * + * @example + * var res = retried = retry.repeat(); + * var res = retried = retry.repeat(42); + * @param {Number} [retryCount] Number of times to retry the sequence. If not provided, retry the sequence indefinitely. + * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully. + */ + observableProto.retry = function (retryCount) { + return enumerableRepeat(this, retryCount).catchException(); + }; + + /** + * Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value. + * For aggregation behavior with no intermediate results, see Observable.aggregate. + * @example + * var res = source.scan(function (acc, x) { return acc + x; }); + * var res = source.scan(0, function (acc, x) { return acc + x; }); + * @param {Mixed} [seed] The initial accumulator value. + * @param {Function} accumulator An accumulator function to be invoked on each element. + * @returns {Observable} An observable sequence containing the accumulated values. + */ + observableProto.scan = function () { + var hasSeed = false, seed, accumulator, source = this; + if (arguments.length === 2) { + hasSeed = true; + seed = arguments[0]; + accumulator = arguments[1]; + } else { + accumulator = arguments[0]; + } + return new AnonymousObservable(function (observer) { + var hasAccumulation, accumulation, hasValue; + return source.subscribe ( + function (x) { + try { + if (!hasValue) { + hasValue = true; + } + + if (hasAccumulation) { + accumulation = accumulator(accumulation, x); + } else { + accumulation = hasSeed ? accumulator(seed, x) : x; + hasAccumulation = true; + } + } catch (e) { + observer.onError(e); + return; + } + + observer.onNext(accumulation); + }, + observer.onError.bind(observer), + function () { + if (!hasValue && hasSeed) { + observer.onNext(seed); + } + observer.onCompleted(); + } + ); + }); + }; + + /** + * Bypasses a specified number of elements at the end of an observable sequence. + * @description + * This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are + * received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed. + * @param count Number of elements to bypass at the end of the source sequence. + * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end. + */ + observableProto.skipLast = function (count) { + var source = this; + return new AnonymousObservable(function (observer) { + var q = []; + return source.subscribe(function (x) { + q.push(x); + if (q.length > count) { + observer.onNext(q.shift()); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend. + * + * var res = source.startWith(1, 2, 3); + * var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3); + * + * @memberOf Observable# + * @returns {Observable} The source sequence prepended with the specified values. + */ + observableProto.startWith = function () { + var values, scheduler, start = 0; + if (!!arguments.length && 'now' in Object(arguments[0])) { + scheduler = arguments[0]; + start = 1; + } else { + scheduler = immediateScheduler; + } + values = slice.call(arguments, start); + return enumerableFor([observableFromArray(values, scheduler), this]).concat(); + }; + + /** + * Returns a specified number of contiguous elements from the end of an observable sequence, using an optional scheduler to drain the queue. + * + * @example + * var res = source.takeLast(5); + * var res = source.takeLast(5, Rx.Scheduler.timeout); + * + * @description + * This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of + * the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed. + * @param {Number} count Number of elements to take from the end of the source sequence. + * @param {Scheduler} [scheduler] Scheduler used to drain the queue upon completion of the source sequence. + * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence. + */ + observableProto.takeLast = function (count, scheduler) { + return this.takeLastBuffer(count).selectMany(function (xs) { return observableFromArray(xs, scheduler); }); + }; + + /** + * Returns an array with the specified number of contiguous elements from the end of an observable sequence. + * + * @description + * This operator accumulates a buffer with a length enough to store count elements. Upon completion of the + * source sequence, this buffer is produced on the result sequence. + * @param {Number} count Number of elements to take from the end of the source sequence. + * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence. + */ + observableProto.takeLastBuffer = function (count) { + var source = this; + return new AnonymousObservable(function (observer) { + var q = []; + return source.subscribe(function (x) { + q.push(x); + if (q.length > count) { + q.shift(); + } + }, observer.onError.bind(observer), function () { + observer.onNext(q); + observer.onCompleted(); + }); + }); + }; + + /** + * Projects each element of an observable sequence into zero or more windows which are produced based on element count information. + * + * var res = xs.windowWithCount(10); + * var res = xs.windowWithCount(10, 1); + * @param {Number} count Length of each window. + * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count. + * @returns {Observable} An observable sequence of windows. + */ + observableProto.windowWithCount = function (count, skip) { + var source = this; + if (count <= 0) { + throw new Error(argumentOutOfRange); + } + if (arguments.length === 1) { + skip = count; + } + if (skip <= 0) { + throw new Error(argumentOutOfRange); + } + return new AnonymousObservable(function (observer) { + var m = new SingleAssignmentDisposable(), + refCountDisposable = new RefCountDisposable(m), + n = 0, + q = [], + createWindow = function () { + var s = new Subject(); + q.push(s); + observer.onNext(addRef(s, refCountDisposable)); + }; + createWindow(); + m.setDisposable(source.subscribe(function (x) { + var s; + for (var i = 0, len = q.length; i < len; i++) { + q[i].onNext(x); + } + var c = n - count + 1; + if (c >= 0 && c % skip === 0) { + s = q.shift(); + s.onCompleted(); + } + n++; + if (n % skip === 0) { + createWindow(); + } + }, function (exception) { + while (q.length > 0) { + q.shift().onError(exception); + } + observer.onError(exception); + }, function () { + while (q.length > 0) { + q.shift().onCompleted(); + } + observer.onCompleted(); + })); + return refCountDisposable; + }); + }; + + function concatMap(selector) { + return this.map(function (x, i) { + var result = selector(x, i); + return isPromise(result) ? observableFromPromise(result) : result; + }).concatAll(); + } + + function concatMapObserver(onNext, onError, onCompleted) { + var source = this; + return new AnonymousObservable(function (observer) { + var index = 0; + + return source.subscribe( + function (x) { + observer.onNext(onNext(x, index++)); + }, + function (err) { + observer.onNext(onError(err)); + observer.completed(); + }, + function () { + observer.onNext(onCompleted()); + observer.onCompleted(); + }); + }).concatAll(); + } + + /** + * One of the Following: + * Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence. + * + * @example + * var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }); + * Or: + * Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence. + * + * var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; }); + * Or: + * Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence. + * + * var res = source.selectMany(Rx.Observable.fromArray([1,2,3])); + * @param selector A transform function to apply to each element or an observable sequence to project each element from the + * source sequence onto which could be either an observable or Promise. + * @param {Function} [resultSelector] A transform function to apply to each element of the intermediate sequence. + * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element. + */ + observableProto.selectConcat = observableProto.concatMap = function (selector, resultSelector) { + if (resultSelector) { + return this.concatMap(function (x, i) { + var selectorResult = selector(x, i), + result = isPromise(selectorResult) ? observableFromPromise(selectorResult) : selectorResult; + + return result.map(function (y) { + return resultSelector(x, y, i); + }); + }); + } + if (typeof selector === 'function') { + return concatMap.call(this, selector); + } + return concatMap.call(this, function () { + return selector; + }); + }; + + /** + * Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty. + * + * var res = obs = xs.defaultIfEmpty(); + * 2 - obs = xs.defaultIfEmpty(false); + * + * @memberOf Observable# + * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null. + * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself. + */ + observableProto.defaultIfEmpty = function (defaultValue) { + var source = this; + if (defaultValue === undefined) { + defaultValue = null; + } + return new AnonymousObservable(function (observer) { + var found = false; + return source.subscribe(function (x) { + found = true; + observer.onNext(x); + }, observer.onError.bind(observer), function () { + if (!found) { + observer.onNext(defaultValue); + } + observer.onCompleted(); + }); + }); + }; + + /** + * Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer. + * Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large. + * + * @example + * var res = obs = xs.distinct(); + * 2 - obs = xs.distinct(function (x) { return x.id; }); + * 2 - obs = xs.distinct(function (x) { return x.id; }, function (x) { return x.toString(); }); + * @param {Function} [keySelector] A function to compute the comparison key for each element. + * @param {Function} [keySerializer] Used to serialize the given object into a string for object comparison. + * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence. + */ + observableProto.distinct = function (keySelector, keySerializer) { + var source = this; + keySelector || (keySelector = identity); + keySerializer || (keySerializer = defaultKeySerializer); + return new AnonymousObservable(function (observer) { + var hashSet = {}; + return source.subscribe(function (x) { + var key, serializedKey, otherKey, hasMatch = false; + try { + key = keySelector(x); + serializedKey = keySerializer(key); + } catch (exception) { + observer.onError(exception); + return; + } + for (otherKey in hashSet) { + if (serializedKey === otherKey) { + hasMatch = true; + break; + } + } + if (!hasMatch) { + hashSet[serializedKey] = null; + observer.onNext(x); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function. + * + * @example + * var res = observable.groupBy(function (x) { return x.id; }); + * 2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }); + * 3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); }); + * @param {Function} keySelector A function to extract the key for each element. + * @param {Function} [elementSelector] A function to map each source element to an element in an observable group. + * @param {Function} [keySerializer] Used to serialize the given object into a string for object comparison. + * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value. + */ + observableProto.groupBy = function (keySelector, elementSelector, keySerializer) { + return this.groupByUntil(keySelector, elementSelector, function () { + return observableNever(); + }, keySerializer); + }; + + /** + * Groups the elements of an observable sequence according to a specified key selector function. + * A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same + * key value as a reclaimed group occurs, the group will be reborn with a new lifetime request. + * + * @example + * var res = observable.groupByUntil(function (x) { return x.id; }, null, function () { return Rx.Observable.never(); }); + * 2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function () { return Rx.Observable.never(); }); + * 3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function () { return Rx.Observable.never(); }, function (x) { return x.toString(); }); + * @param {Function} keySelector A function to extract the key for each element. + * @param {Function} durationSelector A function to signal the expiration of a group. + * @param {Function} [keySerializer] Used to serialize the given object into a string for object comparison. + * @returns {Observable} + * A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value. + * If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered. + * + */ + observableProto.groupByUntil = function (keySelector, elementSelector, durationSelector, keySerializer) { + var source = this; + elementSelector || (elementSelector = identity); + keySerializer || (keySerializer = defaultKeySerializer); + return new AnonymousObservable(function (observer) { + var map = {}, + groupDisposable = new CompositeDisposable(), + refCountDisposable = new RefCountDisposable(groupDisposable); + groupDisposable.add(source.subscribe(function (x) { + var duration, durationGroup, element, fireNewMapEntry, group, key, serializedKey, md, writer, w; + try { + key = keySelector(x); + serializedKey = keySerializer(key); + } catch (e) { + for (w in map) { + map[w].onError(e); + } + observer.onError(e); + return; + } + fireNewMapEntry = false; + try { + writer = map[serializedKey]; + if (!writer) { + writer = new Subject(); + map[serializedKey] = writer; + fireNewMapEntry = true; + } + } catch (e) { + for (w in map) { + map[w].onError(e); + } + observer.onError(e); + return; + } + if (fireNewMapEntry) { + group = new GroupedObservable(key, writer, refCountDisposable); + durationGroup = new GroupedObservable(key, writer); + try { + duration = durationSelector(durationGroup); + } catch (e) { + for (w in map) { + map[w].onError(e); + } + observer.onError(e); + return; + } + observer.onNext(group); + md = new SingleAssignmentDisposable(); + groupDisposable.add(md); + var expire = function () { + if (serializedKey in map) { + delete map[serializedKey]; + writer.onCompleted(); + } + groupDisposable.remove(md); + }; + md.setDisposable(duration.take(1).subscribe(noop, function (exn) { + for (w in map) { + map[w].onError(exn); + } + observer.onError(exn); + }, function () { + expire(); + })); + } + try { + element = elementSelector(x); + } catch (e) { + for (w in map) { + map[w].onError(e); + } + observer.onError(e); + return; + } + writer.onNext(element); + }, function (ex) { + for (var w in map) { + map[w].onError(ex); + } + observer.onError(ex); + }, function () { + for (var w in map) { + map[w].onCompleted(); + } + observer.onCompleted(); + })); + return refCountDisposable; + }); + }; + + /** + * Projects each element of an observable sequence into a new form by incorporating the element's index. + * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element. + * @param {Any} [thisArg] Object to use as this when executing callback. + * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source. + */ + observableProto.select = observableProto.map = function (selector, thisArg) { + var parent = this; + return new AnonymousObservable(function (observer) { + var count = 0; + return parent.subscribe(function (value) { + var result; + try { + result = selector.call(thisArg, value, count++, parent); + } catch (exception) { + observer.onError(exception); + return; + } + observer.onNext(result); + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Retrieves the value of a specified property from all elements in the Observable sequence. + * @param {String} property The property to pluck. + * @returns {Observable} Returns a new Observable sequence of property values. + */ + observableProto.pluck = function (property) { + return this.select(function (x) { return x[property]; }); + }; + + function selectMany(selector) { + return this.select(function (x, i) { + var result = selector(x, i); + return isPromise(result) ? observableFromPromise(result) : result; + }).mergeObservable(); + } + + function selectManyObserver(onNext, onError, onCompleted) { + var source = this; + return new AnonymousObservable(function (observer) { + var index = 0; + + return source.subscribe( + function (x) { + observer.onNext(onNext(x, index++)); + }, + function (err) { + observer.onNext(onError(err)); + observer.completed(); + }, + function () { + observer.onNext(onCompleted()); + observer.onCompleted(); + }); + }).mergeAll(); + } + + /** + * One of the Following: + * Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence. + * + * @example + * var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }); + * Or: + * Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence. + * + * var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; }); + * Or: + * Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence. + * + * var res = source.selectMany(Rx.Observable.fromArray([1,2,3])); + * @param selector A transform function to apply to each element or an observable sequence to project each element from the + * source sequence onto which could be either an observable or Promise. + * @param {Function} [resultSelector] A transform function to apply to each element of the intermediate sequence. + * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element. + */ + observableProto.selectMany = observableProto.flatMap = function (selector, resultSelector) { + if (resultSelector) { + return this.selectMany(function (x, i) { + var selectorResult = selector(x, i), + result = isPromise(selectorResult) ? observableFromPromise(selectorResult) : selectorResult; + + return result.select(function (y) { + return resultSelector(x, y, i); + }); + }); + } + if (typeof selector === 'function') { + return selectMany.call(this, selector); + } + return selectMany.call(this, function () { + return selector; + }); + }; + + /** + * Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then + * transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence. + * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element. + * @param {Any} [thisArg] Object to use as this when executing callback. + * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences + * and that at any point in time produces the elements of the most recent inner observable sequence that has been received. + */ + observableProto.selectSwitch = observableProto.flatMapLatest = observableProto.switchMap = function (selector, thisArg) { + return this.select(selector, thisArg).switchLatest(); + }; + + /** + * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements. + * @param {Number} count The number of elements to skip before returning the remaining elements. + * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence. + */ + observableProto.skip = function (count) { + if (count < 0) { + throw new Error(argumentOutOfRange); + } + var observable = this; + return new AnonymousObservable(function (observer) { + var remaining = count; + return observable.subscribe(function (x) { + if (remaining <= 0) { + observer.onNext(x); + } else { + remaining--; + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements. + * The element's index is used in the logic of the predicate function. + * + * var res = source.skipWhile(function (value) { return value < 10; }); + * var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; }); + * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element. + * @param {Any} [thisArg] Object to use as this when executing callback. + * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate. + */ + observableProto.skipWhile = function (predicate, thisArg) { + var source = this; + return new AnonymousObservable(function (observer) { + var i = 0, running = false; + return source.subscribe(function (x) { + if (!running) { + try { + running = !predicate.call(thisArg, x, i++, source); + } catch (e) { + observer.onError(e); + return; + } + } + if (running) { + observer.onNext(x); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0). + * + * var res = source.take(5); + * var res = source.take(0, Rx.Scheduler.timeout); + * @param {Number} count The number of elements to return. + * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case 0; + }, + /** + * Notifies all subscribed observers about the end of the sequence. + */ + onCompleted: function () { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + for (var i = 0, len = os.length; i < len; i++) { + os[i].onCompleted(); + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the exception. + * @param {Mixed} error The exception to send to all observers. + */ + onError: function (error) { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + this.exception = error; + + for (var i = 0, len = os.length; i < len; i++) { + os[i].onError(error); + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the arrival of the specified element in the sequence. + * @param {Mixed} value The value to send to all observers. + */ + onNext: function (value) { + checkDisposed.call(this); + if (!this.isStopped) { + this.value = value; + var os = this.observers.slice(0); + for (var i = 0, len = os.length; i < len; i++) { + os[i].onNext(value); + } + } + }, + /** + * Unsubscribe all observers and release resources. + */ + dispose: function () { + this.isDisposed = true; + this.observers = null; + this.value = null; + this.exception = null; + } + }); + + return BehaviorSubject; + }(Observable)); + + /** + * Represents an object that is both an observable sequence as well as an observer. + * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies. + */ + var ReplaySubject = Rx.ReplaySubject = (function (_super) { + + function RemovableDisposable (subject, observer) { + this.subject = subject; + this.observer = observer; + }; + + RemovableDisposable.prototype.dispose = function () { + this.observer.dispose(); + if (!this.subject.isDisposed) { + var idx = this.subject.observers.indexOf(this.observer); + this.subject.observers.splice(idx, 1); + } + }; + + function subscribe(observer) { + var so = new ScheduledObserver(this.scheduler, observer), + subscription = new RemovableDisposable(this, so); + checkDisposed.call(this); + this._trim(this.scheduler.now()); + this.observers.push(so); + + var n = this.q.length; + + for (var i = 0, len = this.q.length; i < len; i++) { + so.onNext(this.q[i].value); + } + + if (this.hasError) { + n++; + so.onError(this.error); + } else if (this.isStopped) { + n++; + so.onCompleted(); + } + + so.ensureActive(n); + return subscription; + } + + inherits(ReplaySubject, _super); + + /** + * Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler. + * @param {Number} [bufferSize] Maximum element count of the replay buffer. + * @param {Number} [windowSize] Maximum time length of the replay buffer. + * @param {Scheduler} [scheduler] Scheduler the observers are invoked on. + */ + function ReplaySubject(bufferSize, windowSize, scheduler) { + this.bufferSize = bufferSize == null ? Number.MAX_VALUE : bufferSize; + this.windowSize = windowSize == null ? Number.MAX_VALUE : windowSize; + this.scheduler = scheduler || currentThreadScheduler; + this.q = []; + this.observers = []; + this.isStopped = false; + this.isDisposed = false; + this.hasError = false; + this.error = null; + _super.call(this, subscribe); + } + + addProperties(ReplaySubject.prototype, Observer, { + /** + * Indicates whether the subject has observers subscribed to it. + * @returns {Boolean} Indicates whether the subject has observers subscribed to it. + */ + hasObservers: function () { + return this.observers.length > 0; + }, + /* @private */ + _trim: function (now) { + while (this.q.length > this.bufferSize) { + this.q.shift(); + } + while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) { + this.q.shift(); + } + }, + /** + * Notifies all subscribed observers about the arrival of the specified element in the sequence. + * @param {Mixed} value The value to send to all observers. + */ + onNext: function (value) { + var observer; + checkDisposed.call(this); + if (!this.isStopped) { + var now = this.scheduler.now(); + this.q.push({ interval: now, value: value }); + this._trim(now); + + var o = this.observers.slice(0); + for (var i = 0, len = o.length; i < len; i++) { + observer = o[i]; + observer.onNext(value); + observer.ensureActive(); + } + } + }, + /** + * Notifies all subscribed observers about the exception. + * @param {Mixed} error The exception to send to all observers. + */ + onError: function (error) { + var observer; + checkDisposed.call(this); + if (!this.isStopped) { + this.isStopped = true; + this.error = error; + this.hasError = true; + var now = this.scheduler.now(); + this._trim(now); + var o = this.observers.slice(0); + for (var i = 0, len = o.length; i < len; i++) { + observer = o[i]; + observer.onError(error); + observer.ensureActive(); + } + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the end of the sequence. + */ + onCompleted: function () { + var observer; + checkDisposed.call(this); + if (!this.isStopped) { + this.isStopped = true; + var now = this.scheduler.now(); + this._trim(now); + var o = this.observers.slice(0); + for (var i = 0, len = o.length; i < len; i++) { + observer = o[i]; + observer.onCompleted(); + observer.ensureActive(); + } + this.observers = []; + } + }, + /** + * Unsubscribe all observers and release resources. + */ + dispose: function () { + this.isDisposed = true; + this.observers = null; + } + }); + + return ReplaySubject; + }(Observable)); + + /** @private */ + var ConnectableObservable = Rx.ConnectableObservable = (function (_super) { + inherits(ConnectableObservable, _super); + + /** + * @constructor + * @private + */ + function ConnectableObservable(source, subject) { + var state = { + subject: subject, + source: source.asObservable(), + hasSubscription: false, + subscription: null + }; + + this.connect = function () { + if (!state.hasSubscription) { + state.hasSubscription = true; + state.subscription = new CompositeDisposable(state.source.subscribe(state.subject), disposableCreate(function () { + state.hasSubscription = false; + })); + } + return state.subscription; + }; + + function subscribe(observer) { + return state.subject.subscribe(observer); + } + + _super.call(this, subscribe); + } + + /** + * @private + * @memberOf ConnectableObservable + */ + ConnectableObservable.prototype.connect = function () { return this.connect(); }; + + /** + * @private + * @memberOf ConnectableObservable + */ + ConnectableObservable.prototype.refCount = function () { + var connectableSubscription = null, count = 0, source = this; + return new AnonymousObservable(function (observer) { + var shouldConnect, subscription; + count++; + shouldConnect = count === 1; + subscription = source.subscribe(observer); + if (shouldConnect) { + connectableSubscription = source.connect(); + } + return disposableCreate(function () { + subscription.dispose(); + count--; + if (count === 0) { + connectableSubscription.dispose(); + } + }); + }); + }; + + return ConnectableObservable; + }(Observable)); + + // Real Dictionary + var primes = [1, 3, 7, 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191, 16381, 32749, 65521, 131071, 262139, 524287, 1048573, 2097143, 4194301, 8388593, 16777213, 33554393, 67108859, 134217689, 268435399, 536870909, 1073741789, 2147483647]; + var noSuchkey = "no such key"; + var duplicatekey = "duplicate key"; + + function isPrime(candidate) { + if (candidate & 1 === 0) { + return candidate === 2; + } + var num1 = Math.sqrt(candidate), + num2 = 3; + while (num2 <= num1) { + if (candidate % num2 === 0) { + return false; + } + num2 += 2; + } + return true; + } + + function getPrime(min) { + var index, num, candidate; + for (index = 0; index < primes.length; ++index) { + num = primes[index]; + if (num >= min) { + return num; + } + } + candidate = min | 1; + while (candidate < primes[primes.length - 1]) { + if (isPrime(candidate)) { + return candidate; + } + candidate += 2; + } + return min; + } + + function stringHashFn(str) { + var hash = 757602046; + if (!str.length) { + return hash; + } + for (var i = 0, len = str.length; i < len; i++) { + var character = str.charCodeAt(i); + hash = ((hash<<5)-hash)+character; + hash = hash & hash; + } + return hash; + } + + function numberHashFn(key) { + var c2 = 0x27d4eb2d; + key = (key ^ 61) ^ (key >>> 16); + key = key + (key << 3); + key = key ^ (key >>> 4); + key = key * c2; + key = key ^ (key >>> 15); + return key; + } + + var getHashCode = (function () { + var uniqueIdCounter = 0; + + return function (obj) { + if (obj == null) { + throw new Error(noSuchkey); + } + + // Check for built-ins before tacking on our own for any object + if (typeof obj === 'string') { + return stringHashFn(obj); + } + + if (typeof obj === 'number') { + return numberHashFn(obj); + } + + if (typeof obj === 'boolean') { + return obj === true ? 1 : 0; + } + + if (obj instanceof Date) { + return obj.getTime(); + } + + if (obj.getHashCode) { + return obj.getHashCode(); + } + + var id = 17 * uniqueIdCounter++; + obj.getHashCode = function () { return id; }; + return id; + }; + } ()); + + function newEntry() { + return { key: null, value: null, next: 0, hashCode: 0 }; + } + + // Dictionary implementation + + var Dictionary = function (capacity, comparer) { + if (capacity < 0) { + throw new Error('out of range') + } + if (capacity > 0) { + this._initialize(capacity); + } + + this.comparer = comparer || defaultComparer; + this.freeCount = 0; + this.size = 0; + this.freeList = -1; + }; + + Dictionary.prototype._initialize = function (capacity) { + var prime = getPrime(capacity), i; + this.buckets = new Array(prime); + this.entries = new Array(prime); + for (i = 0; i < prime; i++) { + this.buckets[i] = -1; + this.entries[i] = newEntry(); + } + this.freeList = -1; + }; + Dictionary.prototype.count = function () { + return this.size; + }; + Dictionary.prototype.add = function (key, value) { + return this._insert(key, value, true); + }; + Dictionary.prototype._insert = function (key, value, add) { + if (!this.buckets) { + this._initialize(0); + } + var index3; + var num = getHashCode(key) & 2147483647; + var index1 = num % this.buckets.length; + for (var index2 = this.buckets[index1]; index2 >= 0; index2 = this.entries[index2].next) { + if (this.entries[index2].hashCode === num && this.comparer(this.entries[index2].key, key)) { + if (add) { + throw new Error(duplicatekey); + } + this.entries[index2].value = value; + return; + } + } + if (this.freeCount > 0) { + index3 = this.freeList; + this.freeList = this.entries[index3].next; + --this.freeCount; + } else { + if (this.size === this.entries.length) { + this._resize(); + index1 = num % this.buckets.length; + } + index3 = this.size; + ++this.size; + } + this.entries[index3].hashCode = num; + this.entries[index3].next = this.buckets[index1]; + this.entries[index3].key = key; + this.entries[index3].value = value; + this.buckets[index1] = index3; + }; + + Dictionary.prototype._resize = function () { + var prime = getPrime(this.size * 2), + numArray = new Array(prime); + for (index = 0; index < numArray.length; ++index) { + numArray[index] = -1; + } + var entryArray = new Array(prime); + for (index = 0; index < this.size; ++index) { + entryArray[index] = this.entries[index]; + } + for (var index = this.size; index < prime; ++index) { + entryArray[index] = newEntry(); + } + for (var index1 = 0; index1 < this.size; ++index1) { + var index2 = entryArray[index1].hashCode % prime; + entryArray[index1].next = numArray[index2]; + numArray[index2] = index1; + } + this.buckets = numArray; + this.entries = entryArray; + }; + + Dictionary.prototype.remove = function (key) { + if (this.buckets) { + var num = getHashCode(key) & 2147483647; + var index1 = num % this.buckets.length; + var index2 = -1; + for (var index3 = this.buckets[index1]; index3 >= 0; index3 = this.entries[index3].next) { + if (this.entries[index3].hashCode === num && this.comparer(this.entries[index3].key, key)) { + if (index2 < 0) { + this.buckets[index1] = this.entries[index3].next; + } else { + this.entries[index2].next = this.entries[index3].next; + } + this.entries[index3].hashCode = -1; + this.entries[index3].next = this.freeList; + this.entries[index3].key = null; + this.entries[index3].value = null; + this.freeList = index3; + ++this.freeCount; + return true; + } else { + index2 = index3; + } + } + } + return false; + }; + + Dictionary.prototype.clear = function () { + var index, len; + if (this.size <= 0) { + return; + } + for (index = 0, len = this.buckets.length; index < len; ++index) { + this.buckets[index] = -1; + } + for (index = 0; index < this.size; ++index) { + this.entries[index] = newEntry(); + } + this.freeList = -1; + this.size = 0; + }; + + Dictionary.prototype._findEntry = function (key) { + if (this.buckets) { + var num = getHashCode(key) & 2147483647; + for (var index = this.buckets[num % this.buckets.length]; index >= 0; index = this.entries[index].next) { + if (this.entries[index].hashCode === num && this.comparer(this.entries[index].key, key)) { + return index; + } + } + } + return -1; + }; + + Dictionary.prototype.count = function () { + return this.size - this.freeCount; + }; + + Dictionary.prototype.tryGetValue = function (key) { + var entry = this._findEntry(key); + if (entry >= 0) { + return this.entries[entry].value; + } + return undefined; + }; + + Dictionary.prototype.getValues = function () { + var index = 0, results = []; + if (this.entries) { + for (var index1 = 0; index1 < this.size; index1++) { + if (this.entries[index1].hashCode >= 0) { + results[index++] = this.entries[index1].value; + } + } + } + return results; + }; + + Dictionary.prototype.get = function (key) { + var entry = this._findEntry(key); + if (entry >= 0) { + return this.entries[entry].value; + } + throw new Error(noSuchkey); + }; + + Dictionary.prototype.set = function (key, value) { + this._insert(key, value, false); + }; + + Dictionary.prototype.containskey = function (key) { + return this._findEntry(key) >= 0; + }; + + /** + * Correlates the elements of two sequences based on overlapping durations. + * + * @param {Observable} right The right observable sequence to join elements for. + * @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap. + * @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap. + * @param {Function} resultSelector A function invoked to compute a result element for any two overlapping elements of the left and right observable sequences. The parameters passed to the function correspond with the elements from the left and right source sequences for which overlap occurs. + * @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration. + */ + observableProto.join = function (right, leftDurationSelector, rightDurationSelector, resultSelector) { + var left = this; + return new AnonymousObservable(function (observer) { + var group = new CompositeDisposable(), + leftDone = false, + leftId = 0, + leftMap = new Dictionary(), + rightDone = false, + rightId = 0, + rightMap = new Dictionary(); + group.add(left.subscribe(function (value) { + var duration, + expire, + id = leftId++, + md = new SingleAssignmentDisposable(), + result, + values; + leftMap.add(id, value); + group.add(md); + expire = function () { + if (leftMap.remove(id) && leftMap.count() === 0 && leftDone) { + observer.onCompleted(); + } + return group.remove(md); + }; + try { + duration = leftDurationSelector(value); + } catch (e) { + observer.onError(e); + return; + } + md.setDisposable(duration.take(1).subscribe(noop, observer.onError.bind(observer), function () { expire(); })); + values = rightMap.getValues(); + for (var i = 0; i < values.length; i++) { + try { + result = resultSelector(value, values[i]); + } catch (exception) { + observer.onError(exception); + return; + } + observer.onNext(result); + } + }, observer.onError.bind(observer), function () { + leftDone = true; + if (rightDone || leftMap.count() === 0) { + observer.onCompleted(); + } + })); + group.add(right.subscribe(function (value) { + var duration, + expire, + id = rightId++, + md = new SingleAssignmentDisposable(), + result, + values; + rightMap.add(id, value); + group.add(md); + expire = function () { + if (rightMap.remove(id) && rightMap.count() === 0 && rightDone) { + observer.onCompleted(); + } + return group.remove(md); + }; + try { + duration = rightDurationSelector(value); + } catch (exception) { + observer.onError(exception); + return; + } + md.setDisposable(duration.take(1).subscribe(noop, observer.onError.bind(observer), function () { expire(); })); + values = leftMap.getValues(); + for (var i = 0; i < values.length; i++) { + try { + result = resultSelector(values[i], value); + } catch (exception) { + observer.onError(exception); + return; + } + observer.onNext(result); + } + }, observer.onError.bind(observer), function () { + rightDone = true; + if (leftDone || rightMap.count() === 0) { + observer.onCompleted(); + } + })); + return group; + }); + }; + + /** + * Correlates the elements of two sequences based on overlapping durations, and groups the results. + * + * @param {Observable} right The right observable sequence to join elements for. + * @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap. + * @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap. + * @param {Function} resultSelector A function invoked to compute a result element for any element of the left sequence with overlapping elements from the right observable sequence. The first parameter passed to the function is an element of the left sequence. The second parameter passed to the function is an observable sequence with elements from the right sequence that overlap with the left sequence's element. + * @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration. + */ + observableProto.groupJoin = function (right, leftDurationSelector, rightDurationSelector, resultSelector) { + var left = this; + return new AnonymousObservable(function (observer) { + var nothing = function () {}; + var group = new CompositeDisposable(); + var r = new RefCountDisposable(group); + var leftMap = new Dictionary(); + var rightMap = new Dictionary(); + var leftID = 0; + var rightID = 0; + + group.add(left.subscribe( + function (value) { + var s = new Subject(); + var id = leftID++; + leftMap.add(id, s); + var i, len, leftValues, rightValues; + + var result; + try { + result = resultSelector(value, addRef(s, r)); + } catch (e) { + leftValues = leftMap.getValues(); + for (i = 0, len = leftValues.length; i < len; i++) { + leftValues[i].onError(e); + } + observer.onError(e); + return; + } + observer.onNext(result); + + rightValues = rightMap.getValues(); + for (i = 0, len = rightValues.length; i < len; i++) { + s.onNext(rightValues[i]); + } + + var md = new SingleAssignmentDisposable(); + group.add(md); + + var expire = function () { + if (leftMap.remove(id)) { + s.onCompleted(); + } + + group.remove(md); + }; + + var duration; + try { + duration = leftDurationSelector(value); + } catch (e) { + leftValues = leftMap.getValues(); + for (i = 0, len = leftMap.length; i < len; i++) { + leftValues[i].onError(e); + } + observer.onError(e); + return; + } + + md.setDisposable(duration.take(1).subscribe( + nothing, + function (e) { + leftValues = leftMap.getValues(); + for (i = 0, len = leftValues.length; i < len; i++) { + leftValues[i].onError(e); + } + observer.onError(e); + }, + expire) + ); + }, + function (e) { + var leftValues = leftMap.getValues(); + for (var i = 0, len = leftValues.length; i < len; i++) { + leftValues[i].onError(e); + } + observer.onError(e); + }, + observer.onCompleted.bind(observer))); + + group.add(right.subscribe( + function (value) { + var leftValues, i, len; + var id = rightID++; + rightMap.add(id, value); + + var md = new SingleAssignmentDisposable(); + group.add(md); + + var expire = function () { + rightMap.remove(id); + group.remove(md); + }; + + var duration; + try { + duration = rightDurationSelector(value); + } catch (e) { + leftValues = leftMap.getValues(); + for (i = 0, len = leftMap.length; i < len; i++) { + leftValues[i].onError(e); + } + observer.onError(e); + return; + } + md.setDisposable(duration.take(1).subscribe( + nothing, + function (e) { + leftValues = leftMap.getValues(); + for (i = 0, len = leftMap.length; i < len; i++) { + leftValues[i].onError(e); + } + observer.onError(e); + }, + expire) + ); + + leftValues = leftMap.getValues(); + for (i = 0, len = leftValues.length; i < len; i++) { + leftValues[i].onNext(value); + } + }, + function (e) { + var leftValues = leftMap.getValues(); + for (var i = 0, len = leftValues.length; i < len; i++) { + leftValues[i].onError(e); + } + observer.onError(e); + })); + + return r; + }); + }; + + /** + * Projects each element of an observable sequence into zero or more buffers. + * + * @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows). + * @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored. + * @returns {Observable} An observable sequence of windows. + */ + observableProto.buffer = function (bufferOpeningsOrClosingSelector, bufferClosingSelector) { + return this.window.apply(this, arguments).selectMany(function (x) { return x.toArray(); }); + }; + + /** + * Projects each element of an observable sequence into zero or more windows. + * + * @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows). + * @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored. + * @returns {Observable} An observable sequence of windows. + */ + observableProto.window = function (windowOpeningsOrClosingSelector, windowClosingSelector) { + if (arguments.length === 1 && typeof arguments[0] !== 'function') { + return observableWindowWithBounaries.call(this, windowOpeningsOrClosingSelector); + } + return typeof windowOpeningsOrClosingSelector === 'function' ? + observableWindowWithClosingSelector.call(this, windowOpeningsOrClosingSelector) : + observableWindowWithOpenings.call(this, windowOpeningsOrClosingSelector, windowClosingSelector); + }; + + function observableWindowWithOpenings(windowOpenings, windowClosingSelector) { + return windowOpenings.groupJoin(this, windowClosingSelector, function () { + return observableEmpty(); + }, function (_, window) { + return window; + }); + } + + function observableWindowWithBounaries(windowBoundaries) { + var source = this; + return new AnonymousObservable(function (observer) { + var window = new Subject(), + d = new CompositeDisposable(), + r = new RefCountDisposable(d); + + observer.onNext(addRef(window, r)); + + d.add(source.subscribe(function (x) { + window.onNext(x); + }, function (err) { + window.onError(err); + observer.onError(err); + }, function () { + window.onCompleted(); + observer.onCompleted(); + })); + + d.add(windowBoundaries.subscribe(function (w) { + window.onCompleted(); + window = new Subject(); + observer.onNext(addRef(window, r)); + }, function (err) { + window.onError(err); + observer.onError(err); + }, function () { + window.onCompleted(); + observer.onCompleted(); + })); + + return r; + }); + } + + function observableWindowWithClosingSelector(windowClosingSelector) { + var source = this; + return new AnonymousObservable(function (observer) { + var createWindowClose, + m = new SerialDisposable(), + d = new CompositeDisposable(m), + r = new RefCountDisposable(d), + window = new Subject(); + observer.onNext(addRef(window, r)); + d.add(source.subscribe(function (x) { + window.onNext(x); + }, function (ex) { + window.onError(ex); + observer.onError(ex); + }, function () { + window.onCompleted(); + observer.onCompleted(); + })); + createWindowClose = function () { + var m1, windowClose; + try { + windowClose = windowClosingSelector(); + } catch (exception) { + observer.onError(exception); + return; + } + m1 = new SingleAssignmentDisposable(); + m.setDisposable(m1); + m1.setDisposable(windowClose.take(1).subscribe(noop, function (ex) { + window.onError(ex); + observer.onError(ex); + }, function () { + window.onCompleted(); + window = new Subject(); + observer.onNext(addRef(window, r)); + createWindowClose(); + })); + }; + createWindowClose(); + return r; + }); + } + + /** + * Returns a new observable that triggers on the second and subsequent triggerings of the input observable. + * The Nth triggering of the input observable passes the arguments from the N-1th and Nth triggering as a pair. + * The argument passed to the N-1th triggering is held in hidden internal state until the Nth triggering occurs. + * @returns {Observable} An observable that triggers on successive pairs of observations from the input observable as an array. + */ + observableProto.pairwise = function () { + var source = this; + return new AnonymousObservable(function (observer) { + var previous, hasPrevious = false; + return source.subscribe( + function (x) { + if (hasPrevious) { + observer.onNext([previous, x]); + } else { + hasPrevious = true; + } + previous = x; + }, + observer.onError.bind(observer), + observer.onCompleted.bind(observer)); + }); + }; + /** + * Returns two observables which partition the observations of the source by the given function. + * The first will trigger observations for those values for which the predicate returns true. + * The second will trigger observations for those values where the predicate returns false. + * The predicate is executed once for each subscribed observer. + * Both also propagate all error observations arising from the source and each completes + * when the source completes. + * @param {Function} predicate + * The function to determine which output Observable will trigger a particular observation. + * @returns {Array} + * An array of observables. The first triggers when the predicate returns true, + * and the second triggers when the predicate returns false. + */ + observableProto.partition = function(predicate, thisArg) { + var published = this.publish().refCount(); + return [ + published.filter(predicate, thisArg), + published.filter(function (x, i, o) { return !predicate.call(thisArg, x, i, o); }) + ]; + }; + + function enumerableWhile(condition, source) { + return new Enumerable(function () { + return new Enumerator(function () { + return condition() ? + { done: false, value: source } : + { done: true, value: undefined }; + }); + }); + } + + /** + * Returns an observable sequence that is the result of invoking the selector on the source sequence, without sharing subscriptions. + * This operator allows for a fluent style of writing queries that use the same sequence multiple times. + * + * @param {Function} selector Selector function which can use the source sequence as many times as needed, without sharing subscriptions to the source sequence. + * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function. + */ + observableProto.letBind = observableProto['let'] = function (func) { + return func(this); + }; + + /** + * Determines whether an observable collection contains values. There is an alias for this method called 'ifThen' for browsers 0) { + isOwner = !isAcquired; + isAcquired = true; + } + if (isOwner) { + m.setDisposable(scheduler.scheduleRecursive(function (self) { + var work; + if (q.length > 0) { + work = q.shift(); + } else { + isAcquired = false; + return; + } + var m1 = new SingleAssignmentDisposable(); + d.add(m1); + m1.setDisposable(work.subscribe(function (x) { + observer.onNext(x); + var result = null; + try { + result = selector(x); + } catch (e) { + observer.onError(e); + } + q.push(result); + activeCount++; + ensureActive(); + }, observer.onError.bind(observer), function () { + d.remove(m1); + activeCount--; + if (activeCount === 0) { + observer.onCompleted(); + } + })); + self(); + })); + } + }; + + q.push(source); + activeCount++; + ensureActive(); + return d; + }); + }; + + /** + * Runs all observable sequences in parallel and collect their last elements. + * + * @example + * 1 - res = Rx.Observable.forkJoin([obs1, obs2]); + * 1 - res = Rx.Observable.forkJoin(obs1, obs2, ...); + * @returns {Observable} An observable sequence with an array collecting the last elements of all the input sequences. + */ + Observable.forkJoin = function () { + var allSources = argsOrArray(arguments, 0); + return new AnonymousObservable(function (subscriber) { + var count = allSources.length; + if (count === 0) { + subscriber.onCompleted(); + return disposableEmpty; + } + var group = new CompositeDisposable(), + finished = false, + hasResults = new Array(count), + hasCompleted = new Array(count), + results = new Array(count); + + for (var idx = 0; idx < count; idx++) { + (function (i) { + var source = allSources[i]; + isPromise(source) && (source = observableFromPromise(source)); + group.add( + source.subscribe( + function (value) { + if (!finished) { + hasResults[i] = true; + results[i] = value; + } + }, + function (e) { + finished = true; + subscriber.onError(e); + group.dispose(); + }, + function () { + if (!finished) { + if (!hasResults[i]) { + subscriber.onCompleted(); + return; + } + hasCompleted[i] = true; + for (var ix = 0; ix < count; ix++) { + if (!hasCompleted[ix]) { return; } + } + finished = true; + subscriber.onNext(results); + subscriber.onCompleted(); + } + })); + })(idx); + } + + return group; + }); + }; + + /** + * Runs two observable sequences in parallel and combines their last elemenets. + * + * @param {Observable} second Second observable sequence. + * @param {Function} resultSelector Result selector function to invoke with the last elements of both sequences. + * @returns {Observable} An observable sequence with the result of calling the selector function with the last elements of both input sequences. + */ + observableProto.forkJoin = function (second, resultSelector) { + var first = this; + + return new AnonymousObservable(function (observer) { + var leftStopped = false, rightStopped = false, + hasLeft = false, hasRight = false, + lastLeft, lastRight, + leftSubscription = new SingleAssignmentDisposable(), rightSubscription = new SingleAssignmentDisposable(); + + isPromise(second) && (second = observableFromPromise(second)); + + leftSubscription.setDisposable( + first.subscribe(function (left) { + hasLeft = true; + lastLeft = left; + }, function (err) { + rightSubscription.dispose(); + observer.onError(err); + }, function () { + leftStopped = true; + if (rightStopped) { + if (!hasLeft) { + observer.onCompleted(); + } else if (!hasRight) { + observer.onCompleted(); + } else { + var result; + try { + result = resultSelector(lastLeft, lastRight); + } catch (e) { + observer.onError(e); + return; + } + observer.onNext(result); + observer.onCompleted(); + } + } + }) + ); + + rightSubscription.setDisposable( + second.subscribe(function (right) { + hasRight = true; + lastRight = right; + }, function (err) { + leftSubscription.dispose(); + observer.onError(err); + }, function () { + rightStopped = true; + if (leftStopped) { + if (!hasLeft) { + observer.onCompleted(); + } else if (!hasRight) { + observer.onCompleted(); + } else { + var result; + try { + result = resultSelector(lastLeft, lastRight); + } catch (e) { + observer.onError(e); + return; + } + observer.onNext(result); + observer.onCompleted(); + } + } + }) + ); + + return new CompositeDisposable(leftSubscription, rightSubscription); + }); + }; + + /** + * Comonadic bind operator. + * @param {Function} selector A transform function to apply to each element. + * @param {Object} scheduler Scheduler used to execute the operation. If not specified, defaults to the ImmediateScheduler. + * @returns {Observable} An observable sequence which results from the comonadic bind operation. + */ + observableProto.manySelect = function (selector, scheduler) { + scheduler || (scheduler = immediateScheduler); + var source = this; + return observableDefer(function () { + var chain; + + return source + .select( + function (x) { + var curr = new ChainObservable(x); + if (chain) { + chain.onNext(x); + } + chain = curr; + + return curr; + }) + .doAction( + noop, + function (e) { + if (chain) { + chain.onError(e); + } + }, + function () { + if (chain) { + chain.onCompleted(); + } + }) + .observeOn(scheduler) + .select(function (x, i, o) { return selector(x, i, o); }); + }); + }; + + var ChainObservable = (function (_super) { + + function subscribe (observer) { + var self = this, g = new CompositeDisposable(); + g.add(currentThreadScheduler.schedule(function () { + observer.onNext(self.head); + g.add(self.tail.mergeObservable().subscribe(observer)); + })); + + return g; + } + + inherits(ChainObservable, _super); + + function ChainObservable(head) { + _super.call(this, subscribe); + this.head = head; + this.tail = new AsyncSubject(); + } + + addProperties(ChainObservable.prototype, Observer, { + onCompleted: function () { + this.onNext(Observable.empty()); + }, + onError: function (e) { + this.onNext(Observable.throwException(e)); + }, + onNext: function (v) { + this.tail.onNext(v); + this.tail.onCompleted(); + } + }); + + return ChainObservable; + + }(Observable)); + + /** @private */ + var Map = (function () { + + /** + * @constructor + * @private + */ + function Map() { + this.keys = []; + this.values = []; + } + + /** + * @private + * @memberOf Map# + */ + Map.prototype['delete'] = function (key) { + var i = this.keys.indexOf(key); + if (i !== -1) { + this.keys.splice(i, 1); + this.values.splice(i, 1); + } + return i !== -1; + }; + + /** + * @private + * @memberOf Map# + */ + Map.prototype.get = function (key, fallback) { + var i = this.keys.indexOf(key); + return i !== -1 ? this.values[i] : fallback; + }; + + /** + * @private + * @memberOf Map# + */ + Map.prototype.set = function (key, value) { + var i = this.keys.indexOf(key); + if (i !== -1) { + this.values[i] = value; + } + this.values[this.keys.push(key) - 1] = value; + }; + + /** + * @private + * @memberOf Map# + */ + Map.prototype.size = function () { return this.keys.length; }; + + /** + * @private + * @memberOf Map# + */ + Map.prototype.has = function (key) { + return this.keys.indexOf(key) !== -1; + }; + + /** + * @private + * @memberOf Map# + */ + Map.prototype.getKeys = function () { return this.keys.slice(0); }; + + /** + * @private + * @memberOf Map# + */ + Map.prototype.getValues = function () { return this.values.slice(0); }; + + return Map; + }()); + + /** + * @constructor + * Represents a join pattern over observable sequences. + */ + function Pattern(patterns) { + this.patterns = patterns; + } + + /** + * Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value. + * + * @param other Observable sequence to match in addition to the current pattern. + * @return Pattern object that matches when all observable sequences in the pattern have an available value. + */ + Pattern.prototype.and = function (other) { + var patterns = this.patterns.slice(0); + patterns.push(other); + return new Pattern(patterns); + }; + + /** + * Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values. + * + * @param selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern. + * @return Plan that produces the projected values, to be fed (with other plans) to the when operator. + */ + Pattern.prototype.then = function (selector) { + return new Plan(this, selector); + }; + + function Plan(expression, selector) { + this.expression = expression; + this.selector = selector; + } + + Plan.prototype.activate = function (externalSubscriptions, observer, deactivate) { + var self = this; + var joinObservers = []; + for (var i = 0, len = this.expression.patterns.length; i < len; i++) { + joinObservers.push(planCreateObserver(externalSubscriptions, this.expression.patterns[i], observer.onError.bind(observer))); + } + var activePlan = new ActivePlan(joinObservers, function () { + var result; + try { + result = self.selector.apply(self, arguments); + } catch (exception) { + observer.onError(exception); + return; + } + observer.onNext(result); + }, function () { + for (var j = 0, jlen = joinObservers.length; j < jlen; j++) { + joinObservers[j].removeActivePlan(activePlan); + } + deactivate(activePlan); + }); + for (i = 0, len = joinObservers.length; i < len; i++) { + joinObservers[i].addActivePlan(activePlan); + } + return activePlan; + }; + + function planCreateObserver(externalSubscriptions, observable, onError) { + var entry = externalSubscriptions.get(observable); + if (!entry) { + var observer = new JoinObserver(observable, onError); + externalSubscriptions.set(observable, observer); + return observer; + } + return entry; + } + + // Active Plan + function ActivePlan(joinObserverArray, onNext, onCompleted) { + var i, joinObserver; + this.joinObserverArray = joinObserverArray; + this.onNext = onNext; + this.onCompleted = onCompleted; + this.joinObservers = new Map(); + for (i = 0; i < this.joinObserverArray.length; i++) { + joinObserver = this.joinObserverArray[i]; + this.joinObservers.set(joinObserver, joinObserver); + } + } + + ActivePlan.prototype.dequeue = function () { + var values = this.joinObservers.getValues(); + for (var i = 0, len = values.length; i < len; i++) { + values[i].queue.shift(); + } + }; + ActivePlan.prototype.match = function () { + var firstValues, i, len, isCompleted, values, hasValues = true; + for (i = 0, len = this.joinObserverArray.length; i < len; i++) { + if (this.joinObserverArray[i].queue.length === 0) { + hasValues = false; + break; + } + } + if (hasValues) { + firstValues = []; + isCompleted = false; + for (i = 0, len = this.joinObserverArray.length; i < len; i++) { + firstValues.push(this.joinObserverArray[i].queue[0]); + if (this.joinObserverArray[i].queue[0].kind === 'C') { + isCompleted = true; + } + } + if (isCompleted) { + this.onCompleted(); + } else { + this.dequeue(); + values = []; + for (i = 0; i < firstValues.length; i++) { + values.push(firstValues[i].value); + } + this.onNext.apply(this, values); + } + } + }; + + /** @private */ + var JoinObserver = (function (_super) { + + inherits(JoinObserver, _super); + + /** + * @constructor + * @private + */ + function JoinObserver(source, onError) { + _super.call(this); + this.source = source; + this.onError = onError; + this.queue = []; + this.activePlans = []; + this.subscription = new SingleAssignmentDisposable(); + this.isDisposed = false; + } + + var JoinObserverPrototype = JoinObserver.prototype; + + /** + * @memberOf JoinObserver# + * @private + */ + JoinObserverPrototype.next = function (notification) { + if (!this.isDisposed) { + if (notification.kind === 'E') { + this.onError(notification.exception); + return; + } + this.queue.push(notification); + var activePlans = this.activePlans.slice(0); + for (var i = 0, len = activePlans.length; i < len; i++) { + activePlans[i].match(); + } + } + }; + + /** + * @memberOf JoinObserver# + * @private + */ + JoinObserverPrototype.error = noop; + + /** + * @memberOf JoinObserver# + * @private + */ + JoinObserverPrototype.completed = noop; + + /** + * @memberOf JoinObserver# + * @private + */ + JoinObserverPrototype.addActivePlan = function (activePlan) { + this.activePlans.push(activePlan); + }; + + /** + * @memberOf JoinObserver# + * @private + */ + JoinObserverPrototype.subscribe = function () { + this.subscription.setDisposable(this.source.materialize().subscribe(this)); + }; + + /** + * @memberOf JoinObserver# + * @private + */ + JoinObserverPrototype.removeActivePlan = function (activePlan) { + var idx = this.activePlans.indexOf(activePlan); + this.activePlans.splice(idx, 1); + if (this.activePlans.length === 0) { + this.dispose(); + } + }; + + /** + * @memberOf JoinObserver# + * @private + */ + JoinObserverPrototype.dispose = function () { + _super.prototype.dispose.call(this); + if (!this.isDisposed) { + this.isDisposed = true; + this.subscription.dispose(); + } + }; + + return JoinObserver; + } (AbstractObserver)); + + /** + * Creates a pattern that matches when both observable sequences have an available value. + * + * @param right Observable sequence to match with the current sequence. + * @return {Pattern} Pattern object that matches when both observable sequences have an available value. + */ + observableProto.and = function (right) { + return new Pattern([this, right]); + }; + + /** + * Matches when the observable sequence has an available value and projects the value. + * + * @param selector Selector that will be invoked for values in the source sequence. + * @returns {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator. + */ + observableProto.then = function (selector) { + return new Pattern([this]).then(selector); + }; + + /** + * Joins together the results from several patterns. + * + * @param plans A series of plans (specified as an Array of as a series of arguments) created by use of the Then operator on patterns. + * @returns {Observable} Observable sequence with the results form matching several patterns. + */ + Observable.when = function () { + var plans = argsOrArray(arguments, 0); + return new AnonymousObservable(function (observer) { + var activePlans = [], + externalSubscriptions = new Map(), + group, + i, len, + joinObserver, + joinValues, + outObserver; + outObserver = observerCreate(observer.onNext.bind(observer), function (exception) { + var values = externalSubscriptions.getValues(); + for (var j = 0, jlen = values.length; j < jlen; j++) { + values[j].onError(exception); + } + observer.onError(exception); + }, observer.onCompleted.bind(observer)); + try { + for (i = 0, len = plans.length; i < len; i++) { + activePlans.push(plans[i].activate(externalSubscriptions, outObserver, function (activePlan) { + var idx = activePlans.indexOf(activePlan); + activePlans.splice(idx, 1); + if (activePlans.length === 0) { + outObserver.onCompleted(); + } + })); + } + } catch (e) { + observableThrow(e).subscribe(observer); + } + group = new CompositeDisposable(); + joinValues = externalSubscriptions.getValues(); + for (i = 0, len = joinValues.length; i < len; i++) { + joinObserver = joinValues[i]; + joinObserver.subscribe(); + group.add(joinObserver); + } + return group; + }); + }; + + function observableTimerDate(dueTime, scheduler) { + return new AnonymousObservable(function (observer) { + return scheduler.scheduleWithAbsolute(dueTime, function () { + observer.onNext(0); + observer.onCompleted(); + }); + }); + } + + function observableTimerDateAndPeriod(dueTime, period, scheduler) { + var p = normalizeTime(period); + return new AnonymousObservable(function (observer) { + var count = 0, d = dueTime; + return scheduler.scheduleRecursiveWithAbsolute(d, function (self) { + var now; + if (p > 0) { + now = scheduler.now(); + d = d + p; + if (d <= now) { + d = now + p; + } + } + observer.onNext(count++); + self(d); + }); + }); + } + + function observableTimerTimeSpan(dueTime, scheduler) { + var d = normalizeTime(dueTime); + return new AnonymousObservable(function (observer) { + return scheduler.scheduleWithRelative(d, function () { + observer.onNext(0); + observer.onCompleted(); + }); + }); + } + + function observableTimerTimeSpanAndPeriod(dueTime, period, scheduler) { + if (dueTime === period) { + return new AnonymousObservable(function (observer) { + return scheduler.schedulePeriodicWithState(0, period, function (count) { + observer.onNext(count); + return count + 1; + }); + }); + } + return observableDefer(function () { + return observableTimerDateAndPeriod(scheduler.now() + dueTime, period, scheduler); + }); + } + + /** + * Returns an observable sequence that produces a value after each period. + * + * @example + * 1 - res = Rx.Observable.interval(1000); + * 2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout); + * + * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds). + * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used. + * @returns {Observable} An observable sequence that produces a value after each period. + */ + var observableinterval = Observable.interval = function (period, scheduler) { + scheduler || (scheduler = timeoutScheduler); + return observableTimerTimeSpanAndPeriod(period, period, scheduler); + }; + + /** + * Returns an observable sequence that produces a value after dueTime has elapsed and then after each period. + * + * @example + * 1 - res = Rx.Observable.timer(new Date()); + * 2 - res = Rx.Observable.timer(new Date(), 1000); + * 3 - res = Rx.Observable.timer(new Date(), Rx.Scheduler.timeout); + * 4 - res = Rx.Observable.timer(new Date(), 1000, Rx.Scheduler.timeout); + * + * 5 - res = Rx.Observable.timer(5000); + * 6 - res = Rx.Observable.timer(5000, 1000); + * 7 - res = Rx.Observable.timer(5000, Rx.Scheduler.timeout); + * 8 - res = Rx.Observable.timer(5000, 1000, Rx.Scheduler.timeout); + * + * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value. + * @param {Mixed} [periodOrScheduler] Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring. + * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period. + */ + var observableTimer = Observable.timer = function (dueTime, periodOrScheduler, scheduler) { + var period; + scheduler || (scheduler = timeoutScheduler); + if (periodOrScheduler !== undefined && typeof periodOrScheduler === 'number') { + period = periodOrScheduler; + } else if (periodOrScheduler !== undefined && typeof periodOrScheduler === 'object') { + scheduler = periodOrScheduler; + } + if (dueTime instanceof Date && period === undefined) { + return observableTimerDate(dueTime.getTime(), scheduler); + } + if (dueTime instanceof Date && period !== undefined) { + period = periodOrScheduler; + return observableTimerDateAndPeriod(dueTime.getTime(), period, scheduler); + } + if (period === undefined) { + return observableTimerTimeSpan(dueTime, scheduler); + } + return observableTimerTimeSpanAndPeriod(dueTime, period, scheduler); + }; + + function observableDelayTimeSpan(dueTime, scheduler) { + var source = this; + return new AnonymousObservable(function (observer) { + var active = false, + cancelable = new SerialDisposable(), + exception = null, + q = [], + running = false, + subscription; + subscription = source.materialize().timestamp(scheduler).subscribe(function (notification) { + var d, shouldRun; + if (notification.value.kind === 'E') { + q = []; + q.push(notification); + exception = notification.value.exception; + shouldRun = !running; + } else { + q.push({ value: notification.value, timestamp: notification.timestamp + dueTime }); + shouldRun = !active; + active = true; + } + if (shouldRun) { + if (exception !== null) { + observer.onError(exception); + } else { + d = new SingleAssignmentDisposable(); + cancelable.setDisposable(d); + d.setDisposable(scheduler.scheduleRecursiveWithRelative(dueTime, function (self) { + var e, recurseDueTime, result, shouldRecurse; + if (exception !== null) { + return; + } + running = true; + do { + result = null; + if (q.length > 0 && q[0].timestamp - scheduler.now() <= 0) { + result = q.shift().value; + } + if (result !== null) { + result.accept(observer); + } + } while (result !== null); + shouldRecurse = false; + recurseDueTime = 0; + if (q.length > 0) { + shouldRecurse = true; + recurseDueTime = Math.max(0, q[0].timestamp - scheduler.now()); + } else { + active = false; + } + e = exception; + running = false; + if (e !== null) { + observer.onError(e); + } else if (shouldRecurse) { + self(recurseDueTime); + } + })); + } + } + }); + return new CompositeDisposable(subscription, cancelable); + }); + } + + function observableDelayDate(dueTime, scheduler) { + var self = this; + return observableDefer(function () { + var timeSpan = dueTime - scheduler.now(); + return observableDelayTimeSpan.call(self, timeSpan, scheduler); + }); + } + + /** + * Time shifts the observable sequence by dueTime. The relative time intervals between the values are preserved. + * + * @example + * 1 - res = Rx.Observable.delay(new Date()); + * 2 - res = Rx.Observable.delay(new Date(), Rx.Scheduler.timeout); + * + * 3 - res = Rx.Observable.delay(5000); + * 4 - res = Rx.Observable.delay(5000, 1000, Rx.Scheduler.timeout); + * @memberOf Observable# + * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence. + * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} Time-shifted sequence. + */ + observableProto.delay = function (dueTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + return dueTime instanceof Date ? + observableDelayDate.call(this, dueTime.getTime(), scheduler) : + observableDelayTimeSpan.call(this, dueTime, scheduler); + }; + + /** + * Ignores values from an observable sequence which are followed by another value before dueTime. + * + * @example + * 1 - res = source.throttle(5000); // 5 seconds + * 2 - res = source.throttle(5000, scheduler); + * + * @param {Number} dueTime Duration of the throttle period for each value (specified as an integer denoting milliseconds). + * @param {Scheduler} [scheduler] Scheduler to run the throttle timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} The throttled sequence. + */ + observableProto.throttle = function (dueTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + var source = this; + return this.throttleWithSelector(function () { return observableTimer(dueTime, scheduler); }) + }; + + /** + * Projects each element of an observable sequence into zero or more windows which are produced based on timing information. + * + * @example + * 1 - res = xs.windowWithTime(1000, scheduler); // non-overlapping segments of 1 second + * 2 - res = xs.windowWithTime(1000, 500 , scheduler); // segments of 1 second with time shift 0.5 seconds + * + * @param {Number} timeSpan Length of each window (specified as an integer denoting milliseconds). + * @param {Mixed} [timeShiftOrScheduler] Interval between creation of consecutive windows (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent windows. + * @param {Scheduler} [scheduler] Scheduler to run windowing timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence of windows. + */ + observableProto.windowWithTime = function (timeSpan, timeShiftOrScheduler, scheduler) { + var source = this, timeShift; + if (timeShiftOrScheduler === undefined) { + timeShift = timeSpan; + } + if (scheduler === undefined) { + scheduler = timeoutScheduler; + } + if (typeof timeShiftOrScheduler === 'number') { + timeShift = timeShiftOrScheduler; + } else if (typeof timeShiftOrScheduler === 'object') { + timeShift = timeSpan; + scheduler = timeShiftOrScheduler; + } + return new AnonymousObservable(function (observer) { + var groupDisposable, + nextShift = timeShift, + nextSpan = timeSpan, + q = [], + refCountDisposable, + timerD = new SerialDisposable(), + totalTime = 0; + groupDisposable = new CompositeDisposable(timerD), + refCountDisposable = new RefCountDisposable(groupDisposable); + + function createTimer () { + var m = new SingleAssignmentDisposable(), + isSpan = false, + isShift = false; + timerD.setDisposable(m); + if (nextSpan === nextShift) { + isSpan = true; + isShift = true; + } else if (nextSpan < nextShift) { + isSpan = true; + } else { + isShift = true; + } + var newTotalTime = isSpan ? nextSpan : nextShift, + ts = newTotalTime - totalTime; + totalTime = newTotalTime; + if (isSpan) { + nextSpan += timeShift; + } + if (isShift) { + nextShift += timeShift; + } + m.setDisposable(scheduler.scheduleWithRelative(ts, function () { + var s; + if (isShift) { + s = new Subject(); + q.push(s); + observer.onNext(addRef(s, refCountDisposable)); + } + if (isSpan) { + s = q.shift(); + s.onCompleted(); + } + createTimer(); + })); + }; + q.push(new Subject()); + observer.onNext(addRef(q[0], refCountDisposable)); + createTimer(); + groupDisposable.add(source.subscribe(function (x) { + var i, s; + for (i = 0; i < q.length; i++) { + s = q[i]; + s.onNext(x); + } + }, function (e) { + var i, s; + for (i = 0; i < q.length; i++) { + s = q[i]; + s.onError(e); + } + observer.onError(e); + }, function () { + var i, s; + for (i = 0; i < q.length; i++) { + s = q[i]; + s.onCompleted(); + } + observer.onCompleted(); + })); + return refCountDisposable; + }); + }; + + /** + * Projects each element of an observable sequence into a window that is completed when either it's full or a given amount of time has elapsed. + * @example + * 1 - res = source.windowWithTimeOrCount(5000, 50); // 5s or 50 items + * 2 - res = source.windowWithTimeOrCount(5000, 50, scheduler); //5s or 50 items + * + * @memberOf Observable# + * @param {Number} timeSpan Maximum time length of a window. + * @param {Number} count Maximum element count of a window. + * @param {Scheduler} [scheduler] Scheduler to run windowing timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence of windows. + */ + observableProto.windowWithTimeOrCount = function (timeSpan, count, scheduler) { + var source = this; + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var createTimer, + groupDisposable, + n = 0, + refCountDisposable, + s, + timerD = new SerialDisposable(), + windowId = 0; + groupDisposable = new CompositeDisposable(timerD); + refCountDisposable = new RefCountDisposable(groupDisposable); + createTimer = function (id) { + var m = new SingleAssignmentDisposable(); + timerD.setDisposable(m); + m.setDisposable(scheduler.scheduleWithRelative(timeSpan, function () { + var newId; + if (id !== windowId) { + return; + } + n = 0; + newId = ++windowId; + s.onCompleted(); + s = new Subject(); + observer.onNext(addRef(s, refCountDisposable)); + createTimer(newId); + })); + }; + s = new Subject(); + observer.onNext(addRef(s, refCountDisposable)); + createTimer(0); + groupDisposable.add(source.subscribe(function (x) { + var newId = 0, newWindow = false; + s.onNext(x); + n++; + if (n === count) { + newWindow = true; + n = 0; + newId = ++windowId; + s.onCompleted(); + s = new Subject(); + observer.onNext(addRef(s, refCountDisposable)); + } + if (newWindow) { + createTimer(newId); + } + }, function (e) { + s.onError(e); + observer.onError(e); + }, function () { + s.onCompleted(); + observer.onCompleted(); + })); + return refCountDisposable; + }); + }; + + /** + * Projects each element of an observable sequence into zero or more buffers which are produced based on timing information. + * + * @example + * 1 - res = xs.bufferWithTime(1000, scheduler); // non-overlapping segments of 1 second + * 2 - res = xs.bufferWithTime(1000, 500, scheduler; // segments of 1 second with time shift 0.5 seconds + * + * @param {Number} timeSpan Length of each buffer (specified as an integer denoting milliseconds). + * @param {Mixed} [timeShiftOrScheduler] Interval between creation of consecutive buffers (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent buffers. + * @param {Scheduler} [scheduler] Scheduler to run buffer timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence of buffers. + */ + observableProto.bufferWithTime = function (timeSpan, timeShiftOrScheduler, scheduler) { + return this.windowWithTime.apply(this, arguments).selectMany(function (x) { return x.toArray(); }); + }; + + /** + * Projects each element of an observable sequence into a buffer that is completed when either it's full or a given amount of time has elapsed. + * + * @example + * 1 - res = source.bufferWithTimeOrCount(5000, 50); // 5s or 50 items in an array + * 2 - res = source.bufferWithTimeOrCount(5000, 50, scheduler); // 5s or 50 items in an array + * + * @param {Number} timeSpan Maximum time length of a buffer. + * @param {Number} count Maximum element count of a buffer. + * @param {Scheduler} [scheduler] Scheduler to run bufferin timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence of buffers. + */ + observableProto.bufferWithTimeOrCount = function (timeSpan, count, scheduler) { + return this.windowWithTimeOrCount(timeSpan, count, scheduler).selectMany(function (x) { + return x.toArray(); + }); + }; + + /** + * Records the time interval between consecutive values in an observable sequence. + * + * @example + * 1 - res = source.timeInterval(); + * 2 - res = source.timeInterval(Rx.Scheduler.timeout); + * + * @param [scheduler] Scheduler used to compute time intervals. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence with time interval information on values. + */ + observableProto.timeInterval = function (scheduler) { + var source = this; + scheduler || (scheduler = timeoutScheduler); + return observableDefer(function () { + var last = scheduler.now(); + return source.select(function (x) { + var now = scheduler.now(), span = now - last; + last = now; + return { + value: x, + interval: span + }; + }); + }); + }; + + /** + * Records the timestamp for each value in an observable sequence. + * + * @example + * 1 - res = source.timestamp(); // produces { value: x, timestamp: ts } + * 2 - res = source.timestamp(Rx.Scheduler.timeout); + * + * @param {Scheduler} [scheduler] Scheduler used to compute timestamps. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence with timestamp information on values. + */ + observableProto.timestamp = function (scheduler) { + scheduler || (scheduler = timeoutScheduler); + return this.select(function (x) { + return { + value: x, + timestamp: scheduler.now() + }; + }); + }; + + function sampleObservable(source, sampler) { + + return new AnonymousObservable(function (observer) { + var atEnd, value, hasValue; + + function sampleSubscribe() { + if (hasValue) { + hasValue = false; + observer.onNext(value); + } + if (atEnd) { + observer.onCompleted(); + } + } + + return new CompositeDisposable( + source.subscribe(function (newValue) { + hasValue = true; + value = newValue; + }, observer.onError.bind(observer), function () { + atEnd = true; + }), + sampler.subscribe(sampleSubscribe, observer.onError.bind(observer), sampleSubscribe) + ); + }); + } + + /** + * Samples the observable sequence at each interval. + * + * @example + * 1 - res = source.sample(sampleObservable); // Sampler tick sequence + * 2 - res = source.sample(5000); // 5 seconds + * 2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds + * + * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable. + * @param {Scheduler} [scheduler] Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used. + * @returns {Observable} Sampled observable sequence. + */ + observableProto.sample = function (intervalOrSampler, scheduler) { + scheduler || (scheduler = timeoutScheduler); + if (typeof intervalOrSampler === 'number') { + return sampleObservable(this, observableinterval(intervalOrSampler, scheduler)); + } + return sampleObservable(this, intervalOrSampler); + }; + + /** + * Returns the source observable sequence or the other observable sequence if dueTime elapses. + * + * @example + * 1 - res = source.timeout(new Date()); // As a date + * 2 - res = source.timeout(5000); // 5 seconds + * 3 - res = source.timeout(new Date(), Rx.Observable.returnValue(42)); // As a date and timeout observable + * 4 - res = source.timeout(5000, Rx.Observable.returnValue(42)); // 5 seconds and timeout observable + * 5 - res = source.timeout(new Date(), Rx.Observable.returnValue(42), Rx.Scheduler.timeout); // As a date and timeout observable + * 6 - res = source.timeout(5000, Rx.Observable.returnValue(42), Rx.Scheduler.timeout); // 5 seconds and timeout observable + * + * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs. + * @param {Observable} [other] Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used. + * @param {Scheduler} [scheduler] Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} The source sequence switching to the other sequence in case of a timeout. + */ + observableProto.timeout = function (dueTime, other, scheduler) { + other || (other = observableThrow(new Error('Timeout'))); + scheduler || (scheduler = timeoutScheduler); + + var source = this, schedulerMethod = dueTime instanceof Date ? + 'scheduleWithAbsolute' : + 'scheduleWithRelative'; + + return new AnonymousObservable(function (observer) { + var id = 0, + original = new SingleAssignmentDisposable(), + subscription = new SerialDisposable(), + switched = false, + timer = new SerialDisposable(); + + subscription.setDisposable(original); + + var createTimer = function () { + var myId = id; + timer.setDisposable(scheduler[schedulerMethod](dueTime, function () { + if (id === myId) { + isPromise(other) && (other = observableFromPromise(other)); + subscription.setDisposable(other.subscribe(observer)); + } + })); + }; + + createTimer(); + + original.setDisposable(source.subscribe(function (x) { + if (!switched) { + id++; + observer.onNext(x); + createTimer(); + } + }, function (e) { + if (!switched) { + id++; + observer.onError(e); + } + }, function () { + if (!switched) { + id++; + observer.onCompleted(); + } + })); + return new CompositeDisposable(subscription, timer); + }); + }; + + /** + * Generates an observable sequence by iterating a state from an initial state until the condition fails. + * + * @example + * res = source.generateWithAbsoluteTime(0, + * function (x) { return return true; }, + * function (x) { return x + 1; }, + * function (x) { return x; }, + * function (x) { return new Date(); } + * }); + * + * @param {Mixed} initialState Initial state. + * @param {Function} condition Condition to terminate generation (upon returning false). + * @param {Function} iterate Iteration step function. + * @param {Function} resultSelector Selector function for results produced in the sequence. + * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning Date values. + * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used. + * @returns {Observable} The generated sequence. + */ + Observable.generateWithAbsoluteTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) { + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var first = true, + hasResult = false, + result, + state = initialState, + time; + return scheduler.scheduleRecursiveWithAbsolute(scheduler.now(), function (self) { + if (hasResult) { + observer.onNext(result); + } + try { + if (first) { + first = false; + } else { + state = iterate(state); + } + hasResult = condition(state); + if (hasResult) { + result = resultSelector(state); + time = timeSelector(state); + } + } catch (e) { + observer.onError(e); + return; + } + if (hasResult) { + self(time); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * Generates an observable sequence by iterating a state from an initial state until the condition fails. + * + * @example + * res = source.generateWithRelativeTime(0, + * function (x) { return return true; }, + * function (x) { return x + 1; }, + * function (x) { return x; }, + * function (x) { return 500; } + * ); + * + * @param {Mixed} initialState Initial state. + * @param {Function} condition Condition to terminate generation (upon returning false). + * @param {Function} iterate Iteration step function. + * @param {Function} resultSelector Selector function for results produced in the sequence. + * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning integer values denoting milliseconds. + * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used. + * @returns {Observable} The generated sequence. + */ + Observable.generateWithRelativeTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) { + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var first = true, + hasResult = false, + result, + state = initialState, + time; + return scheduler.scheduleRecursiveWithRelative(0, function (self) { + if (hasResult) { + observer.onNext(result); + } + try { + if (first) { + first = false; + } else { + state = iterate(state); + } + hasResult = condition(state); + if (hasResult) { + result = resultSelector(state); + time = timeSelector(state); + } + } catch (e) { + observer.onError(e); + return; + } + if (hasResult) { + self(time); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * Time shifts the observable sequence by delaying the subscription. + * + * @example + * 1 - res = source.delaySubscription(5000); // 5s + * 2 - res = source.delaySubscription(5000, Rx.Scheduler.timeout); // 5 seconds + * + * @param {Number} dueTime Absolute or relative time to perform the subscription at. + * @param {Scheduler} [scheduler] Scheduler to run the subscription delay timer on. If not specified, the timeout scheduler is used. + * @returns {Observable} Time-shifted sequence. + */ + observableProto.delaySubscription = function (dueTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + return this.delayWithSelector(observableTimer(dueTime, scheduler), function () { return observableEmpty(); }); + }; + + /** + * Time shifts the observable sequence based on a subscription delay and a delay selector function for each element. + * + * @example + * 1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(5000); }); // with selector only + * 1 - res = source.delayWithSelector(Rx.Observable.timer(2000), function (x) { return Rx.Observable.timer(x); }); // with delay and selector + * + * @param {Observable} [subscriptionDelay] Sequence indicating the delay for the subscription to the source. + * @param {Function} delayDurationSelector Selector function to retrieve a sequence indicating the delay for each given element. + * @returns {Observable} Time-shifted sequence. + */ + observableProto.delayWithSelector = function (subscriptionDelay, delayDurationSelector) { + var source = this, subDelay, selector; + if (typeof subscriptionDelay === 'function') { + selector = subscriptionDelay; + } else { + subDelay = subscriptionDelay; + selector = delayDurationSelector; + } + return new AnonymousObservable(function (observer) { + var delays = new CompositeDisposable(), atEnd = false, done = function () { + if (atEnd && delays.length === 0) { + observer.onCompleted(); + } + }, subscription = new SerialDisposable(), start = function () { + subscription.setDisposable(source.subscribe(function (x) { + var delay; + try { + delay = selector(x); + } catch (error) { + observer.onError(error); + return; + } + var d = new SingleAssignmentDisposable(); + delays.add(d); + d.setDisposable(delay.subscribe(function () { + observer.onNext(x); + delays.remove(d); + done(); + }, observer.onError.bind(observer), function () { + observer.onNext(x); + delays.remove(d); + done(); + })); + }, observer.onError.bind(observer), function () { + atEnd = true; + subscription.dispose(); + done(); + })); + }; + + if (!subDelay) { + start(); + } else { + subscription.setDisposable(subDelay.subscribe(function () { + start(); + }, observer.onError.bind(observer), function () { start(); })); + } + + return new CompositeDisposable(subscription, delays); + }); + }; + + /** + * Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled. + * + * @example + * 1 - res = source.timeoutWithSelector(Rx.Observable.timer(500)); + * 2 - res = source.timeoutWithSelector(Rx.Observable.timer(500), function (x) { return Rx.Observable.timer(200); }); + * 3 - res = source.timeoutWithSelector(Rx.Observable.timer(500), function (x) { return Rx.Observable.timer(200); }, Rx.Observable.returnValue(42)); + * + * @param {Observable} [firstTimeout] Observable sequence that represents the timeout for the first element. If not provided, this defaults to Observable.never(). + * @param {Function} [timeoutDurationSelector] Selector to retrieve an observable sequence that represents the timeout between the current element and the next element. + * @param {Observable} [other] Sequence to return in case of a timeout. If not provided, this is set to Observable.throwException(). + * @returns {Observable} The source sequence switching to the other sequence in case of a timeout. + */ + observableProto.timeoutWithSelector = function (firstTimeout, timeoutdurationSelector, other) { + if (arguments.length === 1) { + timeoutdurationSelector = firstTimeout; + var firstTimeout = observableNever(); + } + other || (other = observableThrow(new Error('Timeout'))); + var source = this; + return new AnonymousObservable(function (observer) { + var subscription = new SerialDisposable(), timer = new SerialDisposable(), original = new SingleAssignmentDisposable(); + + subscription.setDisposable(original); + + var id = 0, switched = false, setTimer = function (timeout) { + var myId = id, timerWins = function () { + return id === myId; + }; + var d = new SingleAssignmentDisposable(); + timer.setDisposable(d); + d.setDisposable(timeout.subscribe(function () { + if (timerWins()) { + subscription.setDisposable(other.subscribe(observer)); + } + d.dispose(); + }, function (e) { + if (timerWins()) { + observer.onError(e); + } + }, function () { + if (timerWins()) { + subscription.setDisposable(other.subscribe(observer)); + } + })); + }; + + setTimer(firstTimeout); + var observerWins = function () { + var res = !switched; + if (res) { + id++; + } + return res; + }; + + original.setDisposable(source.subscribe(function (x) { + if (observerWins()) { + observer.onNext(x); + var timeout; + try { + timeout = timeoutdurationSelector(x); + } catch (e) { + observer.onError(e); + return; + } + setTimer(timeout); + } + }, function (e) { + if (observerWins()) { + observer.onError(e); + } + }, function () { + if (observerWins()) { + observer.onCompleted(); + } + })); + return new CompositeDisposable(subscription, timer); + }); + }; + + /** + * Ignores values from an observable sequence which are followed by another value within a computed throttle duration. + * + * @example + * 1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(x + x); }); + * + * @param {Function} throttleDurationSelector Selector function to retrieve a sequence indicating the throttle duration for each given element. + * @returns {Observable} The throttled sequence. + */ + observableProto.throttleWithSelector = function (throttleDurationSelector) { + var source = this; + return new AnonymousObservable(function (observer) { + var value, hasValue = false, cancelable = new SerialDisposable(), id = 0, subscription = source.subscribe(function (x) { + var throttle; + try { + throttle = throttleDurationSelector(x); + } catch (e) { + observer.onError(e); + return; + } + hasValue = true; + value = x; + id++; + var currentid = id, d = new SingleAssignmentDisposable(); + cancelable.setDisposable(d); + d.setDisposable(throttle.subscribe(function () { + if (hasValue && id === currentid) { + observer.onNext(value); + } + hasValue = false; + d.dispose(); + }, observer.onError.bind(observer), function () { + if (hasValue && id === currentid) { + observer.onNext(value); + } + hasValue = false; + d.dispose(); + })); + }, function (e) { + cancelable.dispose(); + observer.onError(e); + hasValue = false; + id++; + }, function () { + cancelable.dispose(); + if (hasValue) { + observer.onNext(value); + } + observer.onCompleted(); + hasValue = false; + id++; + }); + return new CompositeDisposable(subscription, cancelable); + }); + }; + + /** + * Skips elements for the specified duration from the end of the observable source sequence, using the specified scheduler to run timers. + * + * 1 - res = source.skipLastWithTime(5000); + * 2 - res = source.skipLastWithTime(5000, scheduler); + * + * @description + * This operator accumulates a queue with a length enough to store elements received during the initial duration window. + * As more elements are received, elements older than the specified duration are taken from the queue and produced on the + * result sequence. This causes elements to be delayed with duration. + * @param {Number} duration Duration for skipping elements from the end of the sequence. + * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout + * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the end of the source sequence. + */ + observableProto.skipLastWithTime = function (duration, scheduler) { + scheduler || (scheduler = timeoutScheduler); + var source = this; + return new AnonymousObservable(function (observer) { + var q = []; + return source.subscribe(function (x) { + var now = scheduler.now(); + q.push({ interval: now, value: x }); + while (q.length > 0 && now - q[0].interval >= duration) { + observer.onNext(q.shift().value); + } + }, observer.onError.bind(observer), function () { + var now = scheduler.now(); + while (q.length > 0 && now - q[0].interval >= duration) { + observer.onNext(q.shift().value); + } + observer.onCompleted(); + }); + }); + }; + + /** + * Returns elements within the specified duration from the end of the observable source sequence, using the specified schedulers to run timers and to drain the collected elements. + * + * @example + * 1 - res = source.takeLastWithTime(5000, [optional timer scheduler], [optional loop scheduler]); + * @description + * This operator accumulates a queue with a length enough to store elements received during the initial duration window. + * As more elements are received, elements older than the specified duration are taken from the queue and produced on the + * result sequence. This causes elements to be delayed with duration. + * @param {Number} duration Duration for taking elements from the end of the sequence. + * @param {Scheduler} [timerScheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @param {Scheduler} [loopScheduler] Scheduler to drain the collected elements. If not specified, defaults to Rx.Scheduler.immediate. + * @returns {Observable} An observable sequence with the elements taken during the specified duration from the end of the source sequence. + */ + observableProto.takeLastWithTime = function (duration, timerScheduler, loopScheduler) { + return this.takeLastBufferWithTime(duration, timerScheduler).selectMany(function (xs) { return observableFromArray(xs, loopScheduler); }); + }; + + /** + * Returns an array with the elements within the specified duration from the end of the observable source sequence, using the specified scheduler to run timers. + * + * @example + * 1 - res = source.takeLastBufferWithTime(5000, [optional scheduler]); + * @description + * This operator accumulates a queue with a length enough to store elements received during the initial duration window. + * As more elements are received, elements older than the specified duration are taken from the queue and produced on the + * result sequence. This causes elements to be delayed with duration. + * @param {Number} duration Duration for taking elements from the end of the sequence. + * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @returns {Observable} An observable sequence containing a single array with the elements taken during the specified duration from the end of the source sequence. + */ + observableProto.takeLastBufferWithTime = function (duration, scheduler) { + var source = this; + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var q = []; + + return source.subscribe(function (x) { + var now = scheduler.now(); + q.push({ interval: now, value: x }); + while (q.length > 0 && now - q[0].interval >= duration) { + q.shift(); + } + }, observer.onError.bind(observer), function () { + var now = scheduler.now(), res = []; + while (q.length > 0) { + var next = q.shift(); + if (now - next.interval <= duration) { + res.push(next.value); + } + } + + observer.onNext(res); + observer.onCompleted(); + }); + }); + }; + + /** + * Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers. + * + * @example + * 1 - res = source.takeWithTime(5000, [optional scheduler]); + * @description + * This operator accumulates a queue with a length enough to store elements received during the initial duration window. + * As more elements are received, elements older than the specified duration are taken from the queue and produced on the + * result sequence. This causes elements to be delayed with duration. + * @param {Number} duration Duration for taking elements from the start of the sequence. + * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @returns {Observable} An observable sequence with the elements taken during the specified duration from the start of the source sequence. + */ + observableProto.takeWithTime = function (duration, scheduler) { + var source = this; + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var t = scheduler.scheduleWithRelative(duration, function () { + observer.onCompleted(); + }); + + return new CompositeDisposable(t, source.subscribe(observer)); + }); + }; + + /** + * Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers. + * + * @example + * 1 - res = source.skipWithTime(5000, [optional scheduler]); + * + * @description + * Specifying a zero value for duration doesn't guarantee no elements will be dropped from the start of the source sequence. + * This is a side-effect of the asynchrony introduced by the scheduler, where the action that causes callbacks from the source sequence to be forwarded + * may not execute immediately, despite the zero due time. + * + * Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the duration. + * @param {Number} duration Duration for skipping elements from the start of the sequence. + * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the start of the source sequence. + */ + observableProto.skipWithTime = function (duration, scheduler) { + var source = this; + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var open = false, + t = scheduler.scheduleWithRelative(duration, function () { open = true; }), + d = source.subscribe(function (x) { + if (open) { + observer.onNext(x); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + + return new CompositeDisposable(t, d); + }); + }; + + /** + * Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers. + * Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time. + * + * @examples + * 1 - res = source.skipUntilWithTime(new Date(), [optional scheduler]); + * 2 - res = source.skipUntilWithTime(5000, [optional scheduler]); + * @param startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped. + * @param scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @returns {Observable} An observable sequence with the elements skipped until the specified start time. + */ + observableProto.skipUntilWithTime = function (startTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + var source = this, schedulerMethod = startTime instanceof Date ? + 'scheduleWithAbsolute' : + 'scheduleWithRelative'; + return new AnonymousObservable(function (observer) { + var open = false; + + return new CompositeDisposable( + scheduler[schedulerMethod](startTime, function () { open = true; }), + source.subscribe( + function (x) { open && observer.onNext(x); }, + observer.onError.bind(observer), + observer.onCompleted.bind(observer))); + }); + }; + + /** + * Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers. + * + * @example + * 1 - res = source.takeUntilWithTime(new Date(), [optional scheduler]); + * 2 - res = source.takeUntilWithTime(5000, [optional scheduler]); + * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately. + * @param {Scheduler} scheduler Scheduler to run the timer on. + * @returns {Observable} An observable sequence with the elements taken until the specified end time. + */ + observableProto.takeUntilWithTime = function (endTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + var source = this, schedulerMethod = endTime instanceof Date ? + 'scheduleWithAbsolute' : + 'scheduleWithRelative'; + return new AnonymousObservable(function (observer) { + return new CompositeDisposable(scheduler[schedulerMethod](endTime, function () { + observer.onCompleted(); + }), source.subscribe(observer)); + }); + }; + + /* + * Performs a exclusive waiting for the first to finish before subscribing to another observable. + * Observables that come in between subscriptions will be dropped on the floor. + * @returns {Observable} A exclusive observable with only the results that happen when subscribed. + */ + observableProto.exclusive = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var hasCurrent = false, + isStopped = false, + m = new SingleAssignmentDisposable(), + g = new CompositeDisposable(); + + g.add(m); + + m.setDisposable(sources.subscribe( + function (innerSource) { + if (!hasCurrent) { + hasCurrent = true; + + isPromise(innerSource) && (innerSource = observableFromPromise(innerSource)); + + var innerSubscription = new SingleAssignmentDisposable(); + g.add(innerSubscription); + + innerSubscription.setDisposable(innerSource.subscribe( + observer.onNext.bind(observer), + observer.onError.bind(observer), + function () { + g.remove(innerSubscription); + hasCurrent = false; + if (isStopped && g.length === 1) { + observer.onCompleted(); + } + })); + } + }, + observer.onError.bind(observer), + function () { + isStopped = true; + if (!hasCurrent && g.length === 1) { + observer.onCompleted(); + } + })); + + return g; + }); + }; + /* + * Performs a exclusive map waiting for the first to finish before subscribing to another observable. + * Observables that come in between subscriptions will be dropped on the floor. + * @param {Function} selector Selector to invoke for every item in the current subscription. + * @param {Any} [thisArg] An optional context to invoke with the selector parameter. + * @returns {Observable} An exclusive observable with only the results that happen when subscribed. + */ + observableProto.exclusiveMap = function (selector, thisArg) { + var sources = this; + return new AnonymousObservable(function (observer) { + var index = 0, + hasCurrent = false, + isStopped = true, + m = new SingleAssignmentDisposable(), + g = new CompositeDisposable(); + + g.add(m); + + m.setDisposable(sources.subscribe( + function (innerSource) { + + if (!hasCurrent) { + hasCurrent = true; + + innerSubscription = new SingleAssignmentDisposable(); + g.add(innerSubscription); + + isPromise(innerSource) && (innerSource = observableFromPromise(innerSource)); + + innerSubscription.setDisposable(innerSource.subscribe( + function (x) { + var result; + try { + result = selector.call(thisArg, x, index++, innerSource); + } catch (e) { + observer.onError(e); + return; + } + + observer.onNext(result); + }, + observer.onError.bind(observer), + function () { + g.remove(innerSubscription); + hasCurrent = false; + + if (isStopped && g.length === 1) { + observer.onCompleted(); + } + })); + } + }, + observer.onError.bind(observer), + function () { + isStopped = true; + if (g.length === 1 && !hasCurrent) { + observer.onCompleted(); + } + })); + return g; + }); + }; + /** Provides a set of extension methods for virtual time scheduling. */ + Rx.VirtualTimeScheduler = (function (_super) { + + function notImplemented() { + throw new Error('Not implemented'); + } + + function localNow() { + return this.toDateTimeOffset(this.clock); + } + + function scheduleNow(state, action) { + return this.scheduleAbsoluteWithState(state, this.clock, action); + } + + function scheduleRelative(state, dueTime, action) { + return this.scheduleRelativeWithState(state, this.toRelative(dueTime), action); + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleRelativeWithState(state, this.toRelative(dueTime - this.now()), action); + } + + function invokeAction(scheduler, action) { + action(); + return disposableEmpty; + } + + inherits(VirtualTimeScheduler, _super); + + /** + * Creates a new virtual time scheduler with the specified initial clock value and absolute time comparer. + * + * @constructor + * @param {Number} initialClock Initial value for the clock. + * @param {Function} comparer Comparer to determine causality of events based on absolute time. + */ + function VirtualTimeScheduler(initialClock, comparer) { + this.clock = initialClock; + this.comparer = comparer; + this.isEnabled = false; + this.queue = new PriorityQueue(1024); + _super.call(this, localNow, scheduleNow, scheduleRelative, scheduleAbsolute); + } + + var VirtualTimeSchedulerPrototype = VirtualTimeScheduler.prototype; + + /** + * Adds a relative time value to an absolute time value. + * @param {Number} absolute Absolute virtual time value. + * @param {Number} relative Relative virtual time value to add. + * @return {Number} Resulting absolute virtual time sum value. + */ + VirtualTimeSchedulerPrototype.add = notImplemented; + + /** + * Converts an absolute time to a number + * @param {Any} The absolute time. + * @returns {Number} The absolute time in ms + */ + VirtualTimeSchedulerPrototype.toDateTimeOffset = notImplemented; + + /** + * Converts the TimeSpan value to a relative virtual time value. + * @param {Number} timeSpan TimeSpan value to convert. + * @return {Number} Corresponding relative virtual time value. + */ + VirtualTimeSchedulerPrototype.toRelative = notImplemented; + + /** + * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be emulated using recursive scheduling. + * @param {Mixed} state Initial state passed to the action upon the first iteration. + * @param {Number} period Period for running the work periodically. + * @param {Function} action Action to be executed, potentially updating the state. + * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort). + */ + VirtualTimeSchedulerPrototype.schedulePeriodicWithState = function (state, period, action) { + var s = new SchedulePeriodicRecursive(this, state, period, action); + return s.start(); + }; + + /** + * Schedules an action to be executed after dueTime. + * @param {Mixed} state State passed to the action to be executed. + * @param {Number} dueTime Relative time after which to execute the action. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + VirtualTimeSchedulerPrototype.scheduleRelativeWithState = function (state, dueTime, action) { + var runAt = this.add(this.clock, dueTime); + return this.scheduleAbsoluteWithState(state, runAt, action); + }; + + /** + * Schedules an action to be executed at dueTime. + * @param {Number} dueTime Relative time after which to execute the action. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + VirtualTimeSchedulerPrototype.scheduleRelative = function (dueTime, action) { + return this.scheduleRelativeWithState(action, dueTime, invokeAction); + }; + + /** + * Starts the virtual time scheduler. + */ + VirtualTimeSchedulerPrototype.start = function () { + var next; + if (!this.isEnabled) { + this.isEnabled = true; + do { + next = this.getNext(); + if (next !== null) { + if (this.comparer(next.dueTime, this.clock) > 0) { + this.clock = next.dueTime; + } + next.invoke(); + } else { + this.isEnabled = false; + } + } while (this.isEnabled); + } + }; + + /** + * Stops the virtual time scheduler. + */ + VirtualTimeSchedulerPrototype.stop = function () { + this.isEnabled = false; + }; + + /** + * Advances the scheduler's clock to the specified time, running all work till that point. + * @param {Number} time Absolute time to advance the scheduler's clock to. + */ + VirtualTimeSchedulerPrototype.advanceTo = function (time) { + var next; + var dueToClock = this.comparer(this.clock, time); + if (this.comparer(this.clock, time) > 0) { + throw new Error(argumentOutOfRange); + } + if (dueToClock === 0) { + return; + } + if (!this.isEnabled) { + this.isEnabled = true; + do { + next = this.getNext(); + if (next !== null && this.comparer(next.dueTime, time) <= 0) { + if (this.comparer(next.dueTime, this.clock) > 0) { + this.clock = next.dueTime; + } + next.invoke(); + } else { + this.isEnabled = false; + } + } while (this.isEnabled); + this.clock = time; + } + }; + + /** + * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan. + * @param {Number} time Relative time to advance the scheduler's clock by. + */ + VirtualTimeSchedulerPrototype.advanceBy = function (time) { + var dt = this.add(this.clock, time); + var dueToClock = this.comparer(this.clock, dt); + if (dueToClock > 0) { + throw new Error(argumentOutOfRange); + } + if (dueToClock === 0) { + return; + } + this.advanceTo(dt); + }; + + /** + * Advances the scheduler's clock by the specified relative time. + * @param {Number} time Relative time to advance the scheduler's clock by. + */ + VirtualTimeSchedulerPrototype.sleep = function (time) { + var dt = this.add(this.clock, time); + + if (this.comparer(this.clock, dt) >= 0) { + throw new Error(argumentOutOfRange); + } + + this.clock = dt; + }; + + /** + * Gets the next scheduled item to be executed. + * @returns {ScheduledItem} The next scheduled item. + */ + VirtualTimeSchedulerPrototype.getNext = function () { + var next; + while (this.queue.length > 0) { + next = this.queue.peek(); + if (next.isCancelled()) { + this.queue.dequeue(); + } else { + return next; + } + } + return null; + }; + + /** + * Schedules an action to be executed at dueTime. + * @param {Scheduler} scheduler Scheduler to execute the action on. + * @param {Number} dueTime Absolute time at which to execute the action. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + VirtualTimeSchedulerPrototype.scheduleAbsolute = function (dueTime, action) { + return this.scheduleAbsoluteWithState(action, dueTime, invokeAction); + }; + + /** + * Schedules an action to be executed at dueTime. + * @param {Mixed} state State passed to the action to be executed. + * @param {Number} dueTime Absolute time at which to execute the action. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + VirtualTimeSchedulerPrototype.scheduleAbsoluteWithState = function (state, dueTime, action) { + var self = this, + run = function (scheduler, state1) { + self.queue.remove(si); + return action(scheduler, state1); + }, + si = new ScheduledItem(self, state, run, dueTime, self.comparer); + self.queue.enqueue(si); + return si.disposable; + }; + + return VirtualTimeScheduler; + }(Scheduler)); + + /** Provides a virtual time scheduler that uses Date for absolute time and number for relative time. */ + Rx.HistoricalScheduler = (function (_super) { + inherits(HistoricalScheduler, _super); + + /** + * Creates a new historical scheduler with the specified initial clock value. + * + * @constructor + * @param {Number} initialClock Initial value for the clock. + * @param {Function} comparer Comparer to determine causality of events based on absolute time. + */ + function HistoricalScheduler(initialClock, comparer) { + var clock = initialClock == null ? 0 : initialClock; + var cmp = comparer || defaultSubComparer; + _super.call(this, clock, cmp); + } + + var HistoricalSchedulerProto = HistoricalScheduler.prototype; + + /** + * Adds a relative time value to an absolute time value. + * @param {Number} absolute Absolute virtual time value. + * @param {Number} relative Relative virtual time value to add. + * @return {Number} Resulting absolute virtual time sum value. + */ + HistoricalSchedulerProto.add = function (absolute, relative) { + return absolute + relative; + }; + + /** + * @private + */ + HistoricalSchedulerProto.toDateTimeOffset = function (absolute) { + return new Date(absolute).getTime(); + }; + + /** + * Converts the TimeSpan value to a relative virtual time value. + * + * @memberOf HistoricalScheduler + * @param {Number} timeSpan TimeSpan value to convert. + * @return {Number} Corresponding relative virtual time value. + */ + HistoricalSchedulerProto.toRelative = function (timeSpan) { + return timeSpan; + }; + + return HistoricalScheduler; + }(Rx.VirtualTimeScheduler)); + var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) { + inherits(AnonymousObservable, __super__); + + // Fix subscriber to check for undefined or function returned to decorate as Disposable + function fixSubscriber(subscriber) { + if (typeof subscriber === 'undefined') { + subscriber = disposableEmpty; + } else if (typeof subscriber === 'function') { + subscriber = disposableCreate(subscriber); + } + + return subscriber; + } + + function AnonymousObservable(subscribe) { + if (!(this instanceof AnonymousObservable)) { + return new AnonymousObservable(subscribe); + } + + function s(observer) { + var setDisposable = function () { + try { + autoDetachObserver.setDisposable(fixSubscriber(subscribe(autoDetachObserver))); + } catch (e) { + if (!autoDetachObserver.fail(e)) { + throw e; + } + } + }; + + var autoDetachObserver = new AutoDetachObserver(observer); + if (currentThreadScheduler.scheduleRequired()) { + currentThreadScheduler.schedule(setDisposable); + } else { + setDisposable(); + } + + return autoDetachObserver; + } + + __super__.call(this, s); + } + + return AnonymousObservable; + + }(Observable)); + + /** @private */ + var AutoDetachObserver = (function (_super) { + inherits(AutoDetachObserver, _super); + + function AutoDetachObserver(observer) { + _super.call(this); + this.observer = observer; + this.m = new SingleAssignmentDisposable(); + } + + var AutoDetachObserverPrototype = AutoDetachObserver.prototype; + + AutoDetachObserverPrototype.next = function (value) { + var noError = false; + try { + this.observer.onNext(value); + noError = true; + } catch (e) { + throw e; + } finally { + if (!noError) { + this.dispose(); + } + } + }; + + AutoDetachObserverPrototype.error = function (exn) { + try { + this.observer.onError(exn); + } catch (e) { + throw e; + } finally { + this.dispose(); + } + }; + + AutoDetachObserverPrototype.completed = function () { + try { + this.observer.onCompleted(); + } catch (e) { + throw e; + } finally { + this.dispose(); + } + }; + + AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); }; + AutoDetachObserverPrototype.getDisposable = function (value) { return this.m.getDisposable(); }; + /* @private */ + AutoDetachObserverPrototype.disposable = function (value) { + return arguments.length ? this.getDisposable() : setDisposable(value); + }; + + AutoDetachObserverPrototype.dispose = function () { + _super.prototype.dispose.call(this); + this.m.dispose(); + }; + + return AutoDetachObserver; + }(AbstractObserver)); + + /** @private */ + var GroupedObservable = (function (_super) { + inherits(GroupedObservable, _super); + + function subscribe(observer) { + return this.underlyingObservable.subscribe(observer); + } + + /** + * @constructor + * @private + */ + function GroupedObservable(key, underlyingObservable, mergedDisposable) { + _super.call(this, subscribe); + this.key = key; + this.underlyingObservable = !mergedDisposable ? + underlyingObservable : + new AnonymousObservable(function (observer) { + return new CompositeDisposable(mergedDisposable.getDisposable(), underlyingObservable.subscribe(observer)); + }); + } + + return GroupedObservable; + }(Observable)); + + /** + * Represents an object that is both an observable sequence as well as an observer. + * Each notification is broadcasted to all subscribed observers. + */ + var Subject = Rx.Subject = (function (_super) { + function subscribe(observer) { + checkDisposed.call(this); + if (!this.isStopped) { + this.observers.push(observer); + return new InnerSubscription(this, observer); + } + if (this.exception) { + observer.onError(this.exception); + return disposableEmpty; + } + observer.onCompleted(); + return disposableEmpty; + } + + inherits(Subject, _super); + + /** + * Creates a subject. + * @constructor + */ + function Subject() { + _super.call(this, subscribe); + this.isDisposed = false, + this.isStopped = false, + this.observers = []; + } + + addProperties(Subject.prototype, Observer, { + /** + * Indicates whether the subject has observers subscribed to it. + * @returns {Boolean} Indicates whether the subject has observers subscribed to it. + */ + hasObservers: function () { + return this.observers.length > 0; + }, + /** + * Notifies all subscribed observers about the end of the sequence. + */ + onCompleted: function () { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + for (var i = 0, len = os.length; i < len; i++) { + os[i].onCompleted(); + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the exception. + * @param {Mixed} error The exception to send to all observers. + */ + onError: function (exception) { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + this.exception = exception; + for (var i = 0, len = os.length; i < len; i++) { + os[i].onError(exception); + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the arrival of the specified element in the sequence. + * @param {Mixed} value The value to send to all observers. + */ + onNext: function (value) { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + for (var i = 0, len = os.length; i < len; i++) { + os[i].onNext(value); + } + } + }, + /** + * Unsubscribe all observers and release resources. + */ + dispose: function () { + this.isDisposed = true; + this.observers = null; + } + }); + + /** + * Creates a subject from the specified observer and observable. + * @param {Observer} observer The observer used to send messages to the subject. + * @param {Observable} observable The observable used to subscribe to messages sent from the subject. + * @returns {Subject} Subject implemented using the given observer and observable. + */ + Subject.create = function (observer, observable) { + return new AnonymousSubject(observer, observable); + }; + + return Subject; + }(Observable)); + + /** + * Represents the result of an asynchronous operation. + * The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers. + */ + var AsyncSubject = Rx.AsyncSubject = (function (_super) { + + function subscribe(observer) { + checkDisposed.call(this); + + if (!this.isStopped) { + this.observers.push(observer); + return new InnerSubscription(this, observer); + } + + var ex = this.exception, + hv = this.hasValue, + v = this.value; + + if (ex) { + observer.onError(ex); + } else if (hv) { + observer.onNext(v); + observer.onCompleted(); + } else { + observer.onCompleted(); + } + + return disposableEmpty; + } + + inherits(AsyncSubject, _super); + + /** + * Creates a subject that can only receive one value and that value is cached for all future observations. + * @constructor + */ + function AsyncSubject() { + _super.call(this, subscribe); + + this.isDisposed = false; + this.isStopped = false; + this.value = null; + this.hasValue = false; + this.observers = []; + this.exception = null; + } + + addProperties(AsyncSubject.prototype, Observer, { + /** + * Indicates whether the subject has observers subscribed to it. + * @returns {Boolean} Indicates whether the subject has observers subscribed to it. + */ + hasObservers: function () { + checkDisposed.call(this); + return this.observers.length > 0; + }, + /** + * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any). + */ + onCompleted: function () { + var o, i, len; + checkDisposed.call(this); + if (!this.isStopped) { + this.isStopped = true; + var os = this.observers.slice(0), + v = this.value, + hv = this.hasValue; + + if (hv) { + for (i = 0, len = os.length; i < len; i++) { + o = os[i]; + o.onNext(v); + o.onCompleted(); + } + } else { + for (i = 0, len = os.length; i < len; i++) { + os[i].onCompleted(); + } + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the exception. + * @param {Mixed} error The exception to send to all observers. + */ + onError: function (exception) { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + this.exception = exception; + + for (var i = 0, len = os.length; i < len; i++) { + os[i].onError(exception); + } + + this.observers = []; + } + }, + /** + * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers. + * @param {Mixed} value The value to store in the subject. + */ + onNext: function (value) { + checkDisposed.call(this); + if (!this.isStopped) { + this.value = value; + this.hasValue = true; + } + }, + /** + * Unsubscribe all observers and release resources. + */ + dispose: function () { + this.isDisposed = true; + this.observers = null; + this.exception = null; + this.value = null; + } + }); + + return AsyncSubject; + }(Observable)); + + /** @private */ + var AnonymousSubject = (function (_super) { + inherits(AnonymousSubject, _super); + + function subscribe(observer) { + return this.observable.subscribe(observer); + } + + /** + * @private + * @constructor + */ + function AnonymousSubject(observer, observable) { + _super.call(this, subscribe); + this.observer = observer; + this.observable = observable; + } + + addProperties(AnonymousSubject.prototype, Observer, { + /** + * @private + * @memberOf AnonymousSubject# + */ + onCompleted: function () { + this.observer.onCompleted(); + }, + /** + * @private + * @memberOf AnonymousSubject# + */ + onError: function (exception) { + this.observer.onError(exception); + }, + /** + * @private + * @memberOf AnonymousSubject# + */ + onNext: function (value) { + this.observer.onNext(value); + } + }); + + return AnonymousSubject; + }(Observable)); + + if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) { + root.Rx = Rx; + + define(function() { + return Rx; + }); + } else if (freeExports && freeModule) { + // in Node.js or RingoJS + if (moduleExports) { + (freeModule.exports = Rx).Rx = Rx; + } else { + freeExports.Rx = Rx; + } + } else { + // in a browser or Rhino + root.Rx = Rx; + } +}.call(this)); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.all.compat.min.js b/ajax/libs/rxjs/2.2.28/rx.all.compat.min.js new file mode 100644 index 000000000..4644279ba --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.all.compat.min.js @@ -0,0 +1,3 @@ +(function(t){function e(){if(this.isDisposed)throw Error(fe)}function n(t){var e=typeof t;return t&&("function"==e||"object"==e)||!1}function r(t){var e=[];if(!n(t))return e;Pe.nonEnumArgs&&t.length&&u(t)&&(t=Ve.call(t));var r=Pe.enumPrototypes&&"function"==typeof t,i=Pe.enumErrorProps&&(t===Oe||t instanceof Error);for(var o in t)r&&"prototype"==o||i&&("message"==o||"name"==o)||e.push(o);if(Pe.nonEnumShadows&&t!==We){var s=t.constructor,c=-1,a=Re.length;if(t===(s&&s.prototype))var h=t===stringProto?Se:t===Oe?ge:Ne.call(t),l=qe[h];for(;a>++c;)o=Re[c],l&&l[o]||!Ae.call(t,o)||e.push(o)}return e}function i(t,e,n){for(var r=-1,i=n(t),o=i.length;o>++r;){var s=i[r];if(e(t[s],s,t)===!1)break}return t}function o(t,e){return i(t,e,r)}function s(t){return"function"!=typeof t.toString&&"string"==typeof(t+"")}function u(t){return t&&"object"==typeof t?Ne.call(t)==be:!1}function c(t){return"function"==typeof t||!1}function a(e,n,r,i){if(e===n)return 0!==e||1/e==1/n;var h=typeof e,l=typeof n;if(e===e&&(null==e||null==n||"function"!=h&&"object"!=h&&"function"!=l&&"object"!=l))return!1;var f=Ne.call(e),p=Ne.call(n);if(f==be&&(f=Ce),p==be&&(p=Ce),f!=p)return!1;switch(f){case ye:case we:return+e==+n;case xe:return e!=+e?n!=+n:0==e?1/e==1/n:e==+n;case De:case Se:return e==n+""}var d=f==me;if(!d){if(f!=Ce||!Pe.nodeClass&&(s(e)||s(n)))return!1;var v=!Pe.argsObject&&u(e)?Object:e.constructor,b=!Pe.argsObject&&u(n)?Object:n.constructor;if(!(v==b||Ae.call(e,"constructor")&&Ae.call(n,"constructor")||c(v)&&v instanceof v&&c(b)&&b instanceof b||!("constructor"in e&&"constructor"in n)))return!1}r||(r=[]),i||(i=[]);for(var m=r.length;m--;)if(r[m]==e)return i[m]==n;var y=0;if(result=!0,r.push(e),i.push(n),d){if(m=e.length,y=n.length,result=y==m)for(;y--;){var w=n[y];if(!(result=a(e[y],w,r,i)))break}}else o(n,function(n,o,s){return Ae.call(s,o)?(y++,result=Ae.call(e,o)&&a(e[o],n,r,i)):t}),result&&o(e,function(e,n,r){return Ae.call(r,n)?result=--y>-1:t});return r.pop(),i.pop(),result}function h(t,e){return 1===t.length&&Array.isArray(t[e])?t[e]:Ve.call(t)}function l(t,e){for(var n=Array(t),r=0;t>r;r++)n[r]=e();return n}function f(t,e){this.scheduler=t,this.disposable=e,this.isDisposed=!1}function p(e,n){return new hr(function(r){var i=new Ge,o=new Ye;return o.setDisposable(i),i.setDisposable(e.subscribe(r.onNext.bind(r),function(e){var i,s;try{s=n(e)}catch(u){return r.onError(u),t}ae(s)&&(s=On(s)),i=new Ge,o.setDisposable(i),i.setDisposable(s.subscribe(r))},r.onCompleted.bind(r))),o})}function d(e,n){var r=this;return new hr(function(i){var o=0,s=e.length;return r.subscribe(function(r){if(s>o){var u,c=e[o++];try{u=n(r,c)}catch(a){return i.onError(a),t}i.onNext(u)}else i.onCompleted()},i.onError.bind(i),i.onCompleted.bind(i))})}function v(t){return this.map(function(e,n){var r=t(e,n);return ae(r)?On(r):r}).concatAll()}function b(t){return this.select(function(e,n){var r=t(e,n);return ae(r)?On(r):r}).mergeObservable()}function m(e,n,r){return new hr(function(i){var o=!1,s=null,u=[];return e.subscribe(function(e){var c,a;try{a=n(e)}catch(h){return i.onError(h),t}if(c=0,o)try{c=r(a,s)}catch(l){return i.onError(l),t}else o=!0,s=a;c>0&&(s=a,u=[]),c>=0&&u.push(e)},i.onError.bind(i),function(){i.onNext(u),i.onCompleted()})})}function y(t){if(0===t.length)throw Error(he);return t[0]}function w(e,n,r){return new hr(function(i){var o=0,s=n.length;return e.subscribe(function(e){var u=!1;try{s>o&&(u=r(e,n[o++]))}catch(c){return i.onError(c),t}u||(i.onNext(!1),i.onCompleted())},i.onError.bind(i),function(){i.onNext(o===s),i.onCompleted()})})}function g(t,e,n,r){if(0>e)throw Error(le);return new hr(function(i){var o=e;return t.subscribe(function(t){0===o&&(i.onNext(t),i.onCompleted()),o--},i.onError.bind(i),function(){n?(i.onNext(r),i.onCompleted()):i.onError(Error(le))})})}function E(t,e,n){return new hr(function(r){var i=n,o=!1;return t.subscribe(function(t){o?r.onError(Error("Sequence contains more than one element")):(i=t,o=!0)},r.onError.bind(r),function(){o||e?(r.onNext(i),r.onCompleted()):r.onError(Error(he))})})}function x(t,e,n){return new hr(function(r){return t.subscribe(function(t){r.onNext(t),r.onCompleted()},r.onError.bind(r),function(){e?(r.onNext(n),r.onCompleted()):r.onError(Error(he))})})}function C(t,e,n){return new hr(function(r){var i=n,o=!1;return t.subscribe(function(t){i=t,o=!0},r.onError.bind(r),function(){o||e?(r.onNext(i),r.onCompleted()):r.onError(Error(he))})})}function D(e,n,r,i){return new hr(function(o){var s=0;return e.subscribe(function(u){var c;try{c=n.call(r,u,s,e)}catch(a){return o.onError(a),t}c?(o.onNext(i?s:u),o.onCompleted()):s++},o.onError.bind(o),function(){o.onNext(i?-1:t),o.onCompleted()})})}function S(t){var e=function(){this.cancelBubble=!0},n=function(){if(this.bubbledKeyCode=this.keyCode,this.ctrlKey)try{this.keyCode=0}catch(t){}this.defaultPrevented=!0,this.returnValue=!1,this.modified=!0};if(t||(t=X.event),!t.target)switch(t.target=t.target||t.srcElement,"mouseover"==t.type&&(t.relatedTarget=t.fromElement),"mouseout"==t.type&&(t.relatedTarget=t.toElement),t.stopPropagation||(t.stopPropagation=e,t.preventDefault=n),t.type){case"keypress":var r="charCode"in t?t.charCode:t.keyCode;10==r?(r=0,t.keyCode=13):13==r||27==r?r=0:3==r&&(r=99),t.charCode=r,t.keyChar=t.charCode?String.fromCharCode(t.charCode):""}return t}function N(t,e,n){if(t.addListener)return t.addListener(e,n),Je(function(){t.removeListener(e,n)});if(t.addEventListener)return t.addEventListener(e,n,!1),Je(function(){t.removeEventListener(e,n,!1)});if(t.attachEvent){var r=function(t){n(S(t))};return t.attachEvent("on"+e,r),Je(function(){t.detachEvent("on"+e,r)})}return t["on"+e]=n,Je(function(){t["on"+e]=null})}function A(t,e,n){var r=new Qe;if("function"==typeof t.item&&"number"==typeof t.length)for(var i=0,o=t.length;o>i;i++)r.add(A(t.item(i),e,n));else t&&r.add(N(t,e,n));return r}function _(e,n,r){return new hr(function(i){function o(e,n){h[n]=e;var o;if(u[n]=!0,c||(c=u.every(re))){try{o=r.apply(null,h)}catch(s){return i.onError(s),t}i.onNext(o)}else a&&i.onCompleted()}var s=2,u=[!1,!1],c=!1,a=!1,h=Array(s);return new Qe(e.subscribe(function(t){o(t,0)},i.onError.bind(i),function(){a=!0,i.onCompleted()}),n.subscribe(function(t){o(t,1)},i.onError.bind(i)))})}function O(t){if(false&t)return 2===t;for(var e=Math.sqrt(t),n=3;e>=n;){if(0===t%n)return!1;n+=2}return!0}function W(t){var e,n,r;for(e=0;Yn.length>e;++e)if(n=Yn[e],n>=t)return n;for(r=1|t;Yn[Yn.length-1]>r;){if(O(r))return r;r+=2}return t}function j(t){var e=757602046;if(!t.length)return e;for(var n=0,r=t.length;r>n;n++){var i=t.charCodeAt(n);e=(e<<5)-e+i,e&=e}return e}function k(t){var e=668265261;return t=61^t^t>>>16,t+=t<<3,t^=t>>>4,t*=e,t^=t>>>15}function R(){return{key:null,value:null,next:0,hashCode:0}}function q(t,e){return t.groupJoin(this,e,function(){return jn()},function(t,e){return e})}function P(t){var e=this;return new hr(function(n){var r=new pr,i=new Qe,o=new tn(i);return n.onNext(Me(r,o)),i.add(e.subscribe(function(t){r.onNext(t)},function(t){r.onError(t),n.onError(t)},function(){r.onCompleted(),n.onCompleted()})),i.add(t.subscribe(function(){r.onCompleted(),r=new pr,n.onNext(Me(r,o))},function(t){r.onError(t),n.onError(t)},function(){r.onCompleted(),n.onCompleted()})),o})}function T(e){var n=this;return new hr(function(r){var i,o=new Ye,s=new Qe(o),u=new tn(s),c=new pr;return r.onNext(Me(c,u)),s.add(n.subscribe(function(t){c.onNext(t)},function(t){c.onError(t),r.onError(t)},function(){c.onCompleted(),r.onCompleted()})),i=function(){var n,s;try{s=e()}catch(a){return r.onError(a),t}n=new Ge,o.setDisposable(n),n.setDisposable(s.take(1).subscribe(ne,function(t){c.onError(t),r.onError(t)},function(){c.onCompleted(),c=new pr,r.onNext(Me(c,u)),i()}))},i(),u})}function V(e,n){return new mn(function(){return new bn(function(){return e()?{done:!1,value:n}:{done:!0,value:t}})})}function z(t){this.patterns=t}function L(t,e){this.expression=t,this.selector=e}function M(t,e,n){var r=t.get(e);if(!r){var i=new ur(e,n);return t.set(e,i),i}return r}function I(t,e,n){var r,i;for(this.joinObserverArray=t,this.onNext=e,this.onCompleted=n,this.joinObservers=new sr,r=0;this.joinObserverArray.length>r;r++)i=this.joinObserverArray[r],this.joinObservers.set(i,i)}function F(t,e){return new hr(function(n){return e.scheduleWithAbsolute(t,function(){n.onNext(0),n.onCompleted()})})}function B(t,e,n){var r=on(e);return new hr(function(e){var i=0,o=t;return n.scheduleRecursiveWithAbsolute(o,function(t){var s;r>0&&(s=n.now(),o+=r,s>=o&&(o=s+r)),e.onNext(i++),t(o)})})}function H(t,e){var n=on(t);return new hr(function(t){return e.scheduleWithRelative(n,function(){t.onNext(0),t.onCompleted()})})}function U(t,e,n){return t===e?new hr(function(t){return n.schedulePeriodicWithState(0,e,function(e){return t.onNext(e),e+1})}):Wn(function(){return B(n.now()+t,e,n)})}function Q(t,e){var n=this;return new hr(function(r){var i,o=!1,s=new Ye,u=null,c=[],a=!1;return i=n.materialize().timestamp(e).subscribe(function(n){var i,h;"E"===n.value.kind?(c=[],c.push(n),u=n.value.exception,h=!a):(c.push({value:n.value,timestamp:n.timestamp+t}),h=!o,o=!0),h&&(null!==u?r.onError(u):(i=new Ge,s.setDisposable(i),i.setDisposable(e.scheduleRecursiveWithRelative(t,function(t){var n,i,s,h;if(null===u){a=!0;do s=null,c.length>0&&0>=c[0].timestamp-e.now()&&(s=c.shift().value),null!==s&&s.accept(r);while(null!==s);h=!1,i=0,c.length>0?(h=!0,i=Math.max(0,c[0].timestamp-e.now())):o=!1,n=u,a=!1,null!==n?r.onError(n):h&&t(i)}}))))}),new Qe(i,s)})}function $(t,e){var n=this;return Wn(function(){var r=t-e.now();return Q.call(n,r,e)})}function K(t,e){return new hr(function(n){function r(){s&&(s=!1,n.onNext(o)),i&&n.onCompleted()}var i,o,s;return new Qe(t.subscribe(function(t){s=!0,o=t},n.onError.bind(n),function(){i=!0}),e.subscribe(r,n.onError.bind(n),r))})}var J={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},X=J[typeof window]&&window||this,Z=J[typeof exports]&&exports&&!exports.nodeType&&exports,G=J[typeof module]&&module&&!module.nodeType&&module,Y=G&&G.exports===Z&&Z,te=J[typeof global]&&global;!te||te.global!==te&&te.window!==te||(X=te);var ee={internals:{},config:{Promise:X.Promise},helpers:{}},ne=ee.helpers.noop=function(){},re=ee.helpers.identity=function(t){return t},ie=(ee.helpers.pluck=function(t){return function(e){return e[t]}},ee.helpers.just=function(t){return function(){return t}},ee.helpers.defaultNow=function(){return Date.now?Date.now:function(){return+new Date}}()),oe=ee.helpers.defaultComparer=function(t,e){return Te(t,e)},se=ee.helpers.defaultSubComparer=function(t,e){return t>e?1:e>t?-1:0},ue=ee.helpers.defaultKeySerializer=function(t){return""+t},ce=ee.helpers.defaultError=function(t){throw t},ae=ee.helpers.isPromise=function(t){return!!t&&"function"==typeof t.then&&t.then!==ee.Observable.prototype.then};ee.helpers.asArray=function(){return Array.prototype.slice.call(arguments)},ee.helpers.not=function(t){return!t};var he="Sequence contains no elements.",le="Argument out of range",fe="Object has been disposed",pe="object"==typeof Symbol&&Symbol.iterator||"_es6shim_iterator_";X.Set&&"function"==typeof(new X.Set)["@@iterator"]&&(pe="@@iterator");var de,ve={done:!0,value:t},be="[object Arguments]",me="[object Array]",ye="[object Boolean]",we="[object Date]",ge="[object Error]",Ee="[object Function]",xe="[object Number]",Ce="[object Object]",De="[object RegExp]",Se="[object String]",Ne=Object.prototype.toString,Ae=Object.prototype.hasOwnProperty,_e=Ne.call(arguments)==be,Oe=Error.prototype,We=Object.prototype,je=We.propertyIsEnumerable;try{de=!(Ne.call(document)==Ce&&!({toString:0}+""))}catch(ke){de=!0}var Re=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],qe={};qe[me]=qe[we]=qe[xe]={constructor:!0,toLocaleString:!0,toString:!0,valueOf:!0},qe[ye]=qe[Se]={constructor:!0,toString:!0,valueOf:!0},qe[ge]=qe[Ee]=qe[De]={constructor:!0,toString:!0},qe[Ce]={constructor:!0};var Pe={};(function(){var t=function(){this.x=1},e=[];t.prototype={valueOf:1,y:1};for(var n in new t)e.push(n);for(n in arguments);Pe.enumErrorProps=je.call(Oe,"message")||je.call(Oe,"name"),Pe.enumPrototypes=je.call(t,"prototype"),Pe.nonEnumArgs=0!=n,Pe.nonEnumShadows=!/valueOf/.test(e)})(1),_e||(u=function(t){return t&&"object"==typeof t?Ae.call(t,"callee"):!1}),c(/x/)&&(c=function(t){return"function"==typeof t&&Ne.call(t)==Ee});var Te=ee.internals.isEqual=function(t,e){return a(t,e,[],[])},Ve=Array.prototype.slice;({}).hasOwnProperty;var ze=this.inherits=ee.internals.inherits=function(t,e){function n(){this.constructor=t}n.prototype=e.prototype,t.prototype=new n},Le=ee.internals.addProperties=function(t){for(var e=Ve.call(arguments,1),n=0,r=e.length;r>n;n++){var i=e[n];for(var o in i)t[o]=i[o]}},Me=ee.internals.addRef=function(t,e){return new hr(function(n){return new Qe(e.getDisposable(),t.subscribe(n))})};Function.prototype.bind||(Function.prototype.bind=function(t){var e=this,n=Ve.call(arguments,1),r=function(){function i(){}if(this instanceof r){i.prototype=e.prototype;var o=new i,s=e.apply(o,n.concat(Ve.call(arguments)));return Object(s)===s?s:o}return e.apply(t,n.concat(Ve.call(arguments)))};return r});var Ie=Object("a"),Fe="a"!=Ie[0]||!(0 in Ie);Array.prototype.every||(Array.prototype.every=function(t){var e=Object(this),n=Fe&&{}.toString.call(this)==Se?this.split(""):e,r=n.length>>>0,i=arguments[1];if({}.toString.call(t)!=Ee)throw new TypeError(t+" is not a function");for(var o=0;r>o;o++)if(o in n&&!t.call(i,n[o],o,e))return!1;return!0}),Array.prototype.map||(Array.prototype.map=function(t){var e=Object(this),n=Fe&&{}.toString.call(this)==Se?this.split(""):e,r=n.length>>>0,i=Array(r),o=arguments[1];if({}.toString.call(t)!=Ee)throw new TypeError(t+" is not a function");for(var s=0;r>s;s++)s in n&&(i[s]=t.call(o,n[s],s,e));return i}),Array.prototype.filter||(Array.prototype.filter=function(t){for(var e,n=[],r=Object(this),i=0,o=r.length>>>0;o>i;i++)e=r[i],i in r&&t.call(arguments[1],e,i,r)&&n.push(e);return n}),Array.isArray||(Array.isArray=function(t){return Object.prototype.toString.call(t)==me}),Array.prototype.indexOf||(Array.prototype.indexOf=function(t){var e=Object(this),n=e.length>>>0;if(0===n)return-1;var r=0;if(arguments.length>1&&(r=Number(arguments[1]),r!==r?r=0:0!==r&&1/0!=r&&r!==-1/0&&(r=(r>0||-1)*Math.floor(Math.abs(r)))),r>=n)return-1;for(var i=r>=0?r:Math.max(n-Math.abs(r),0);n>i;i++)if(i in e&&e[i]===t)return i;return-1});var Be=function(t,e){this.id=t,this.value=e};Be.prototype.compareTo=function(t){var e=this.value.compareTo(t.value);return 0===e&&(e=this.id-t.id),e};var He=ee.internals.PriorityQueue=function(t){this.items=Array(t),this.length=0},Ue=He.prototype;Ue.isHigherPriority=function(t,e){return 0>this.items[t].compareTo(this.items[e])},Ue.percolate=function(t){if(!(t>=this.length||0>t)){var e=t-1>>1;if(!(0>e||e===t)&&this.isHigherPriority(t,e)){var n=this.items[t];this.items[t]=this.items[e],this.items[e]=n,this.percolate(e)}}},Ue.heapify=function(e){if(e===t&&(e=0),!(e>=this.length||0>e)){var n=2*e+1,r=2*e+2,i=e;if(this.length>n&&this.isHigherPriority(n,i)&&(i=n),this.length>r&&this.isHigherPriority(r,i)&&(i=r),i!==e){var o=this.items[e];this.items[e]=this.items[i],this.items[i]=o,this.heapify(i)}}},Ue.peek=function(){return this.items[0].value},Ue.removeAt=function(t){this.items[t]=this.items[--this.length],delete this.items[this.length],this.heapify()},Ue.dequeue=function(){var t=this.peek();return this.removeAt(0),t},Ue.enqueue=function(t){var e=this.length++;this.items[e]=new Be(He.count++,t),this.percolate(e)},Ue.remove=function(t){for(var e=0;this.length>e;e++)if(this.items[e].value===t)return this.removeAt(e),!0;return!1},He.count=0;var Qe=ee.CompositeDisposable=function(){this.disposables=h(arguments,0),this.isDisposed=!1,this.length=this.disposables.length},$e=Qe.prototype;$e.add=function(t){this.isDisposed?t.dispose():(this.disposables.push(t),this.length++)},$e.remove=function(t){var e=!1;if(!this.isDisposed){var n=this.disposables.indexOf(t);-1!==n&&(e=!0,this.disposables.splice(n,1),this.length--,t.dispose())}return e},$e.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;var t=this.disposables.slice(0);this.disposables=[],this.length=0;for(var e=0,n=t.length;n>e;e++)t[e].dispose()}},$e.clear=function(){var t=this.disposables.slice(0);this.disposables=[],this.length=0;for(var e=0,n=t.length;n>e;e++)t[e].dispose()},$e.contains=function(t){return-1!==this.disposables.indexOf(t)},$e.toArray=function(){return this.disposables.slice(0)};var Ke=ee.Disposable=function(t){this.isDisposed=!1,this.action=t||ne};Ke.prototype.dispose=function(){this.isDisposed||(this.action(),this.isDisposed=!0)};var Je=Ke.create=function(t){return new Ke(t)},Xe=Ke.empty={dispose:ne},Ze=function(){function t(t){this.isSingle=t,this.isDisposed=!1,this.current=null}var e=t.prototype;return e.getDisposable=function(){return this.current},e.setDisposable=function(t){if(this.current&&this.isSingle)throw Error("Disposable has already been assigned");var e,n=this.isDisposed;n||(e=this.current,this.current=t),e&&e.dispose(),n&&t&&t.dispose()},e.dispose=function(){var t;this.isDisposed||(this.isDisposed=!0,t=this.current,this.current=null),t&&t.dispose()},t}(),Ge=ee.SingleAssignmentDisposable=function(t){function e(){t.call(this,!0)}return ze(e,t),e}(Ze),Ye=ee.SerialDisposable=function(t){function e(){t.call(this,!1)}return ze(e,t),e}(Ze),tn=ee.RefCountDisposable=function(){function t(t){this.disposable=t,this.disposable.count++,this.isInnerDisposed=!1}function e(t){this.underlyingDisposable=t,this.isDisposed=!1,this.isPrimaryDisposed=!1,this.count=0}return t.prototype.dispose=function(){this.disposable.isDisposed||this.isInnerDisposed||(this.isInnerDisposed=!0,this.disposable.count--,0===this.disposable.count&&this.disposable.isPrimaryDisposed&&(this.disposable.isDisposed=!0,this.disposable.underlyingDisposable.dispose()))},e.prototype.dispose=function(){this.isDisposed||this.isPrimaryDisposed||(this.isPrimaryDisposed=!0,0===this.count&&(this.isDisposed=!0,this.underlyingDisposable.dispose()))},e.prototype.getDisposable=function(){return this.isDisposed?Xe:new t(this)},e}();f.prototype.dispose=function(){var t=this;this.scheduler.schedule(function(){t.isDisposed||(t.isDisposed=!0,t.disposable.dispose())})};var en=ee.internals.ScheduledItem=function(t,e,n,r,i){this.scheduler=t,this.state=e,this.action=n,this.dueTime=r,this.comparer=i||se,this.disposable=new Ge};en.prototype.invoke=function(){this.disposable.setDisposable(this.invokeCore())},en.prototype.compareTo=function(t){return this.comparer(this.dueTime,t.dueTime)},en.prototype.isCancelled=function(){return this.disposable.isDisposed},en.prototype.invokeCore=function(){return this.action(this.scheduler,this.state)};var nn,rn=ee.Scheduler=function(){function t(t,e,n,r){this.now=t,this._schedule=e,this._scheduleRelative=n,this._scheduleAbsolute=r}function e(t,e){var n=e.first,r=e.second,i=new Qe,o=function(e){r(e,function(e){var n=!1,r=!1,s=t.scheduleWithState(e,function(t,e){return n?i.remove(s):r=!0,o(e),Xe});r||(i.add(s),n=!0)})};return o(n),i}function n(t,e,n){var r=e.first,i=e.second,o=new Qe,s=function(e){i(e,function(e,r){var i=!1,u=!1,c=t[n].call(t,e,r,function(t,e){return i?o.remove(c):u=!0,s(e),Xe});u||(o.add(c),i=!0)})};return s(r),o}function r(t,e){return e(),Xe}var i=t.prototype;return i.catchException=i["catch"]=function(t){return new ln(this,t)},i.schedulePeriodic=function(t,e){return this.schedulePeriodicWithState(null,t,function(){e()})},i.schedulePeriodicWithState=function(t,e,n){var r=t,i=setInterval(function(){r=n(r)},e);return Je(function(){clearInterval(i)})},i.schedule=function(t){return this._schedule(t,r)},i.scheduleWithState=function(t,e){return this._schedule(t,e)},i.scheduleWithRelative=function(t,e){return this._scheduleRelative(e,t,r)},i.scheduleWithRelativeAndState=function(t,e,n){return this._scheduleRelative(t,e,n)},i.scheduleWithAbsolute=function(t,e){return this._scheduleAbsolute(e,t,r)},i.scheduleWithAbsoluteAndState=function(t,e,n){return this._scheduleAbsolute(t,e,n)},i.scheduleRecursive=function(t){return this.scheduleRecursiveWithState(t,function(t,e){t(function(){e(t)})})},i.scheduleRecursiveWithState=function(t,n){return this.scheduleWithState({first:t,second:n},function(t,n){return e(t,n)})},i.scheduleRecursiveWithRelative=function(t,e){return this.scheduleRecursiveWithRelativeAndState(e,t,function(t,e){t(function(n){e(t,n)})})},i.scheduleRecursiveWithRelativeAndState=function(t,e,r){return this._scheduleRelative({first:t,second:r},e,function(t,e){return n(t,e,"scheduleWithRelativeAndState")})},i.scheduleRecursiveWithAbsolute=function(t,e){return this.scheduleRecursiveWithAbsoluteAndState(e,t,function(t,e){t(function(n){e(t,n)})})},i.scheduleRecursiveWithAbsoluteAndState=function(t,e,r){return this._scheduleAbsolute({first:t,second:r},e,function(t,e){return n(t,e,"scheduleWithAbsoluteAndState")})},t.now=ie,t.normalize=function(t){return 0>t&&(t=0),t},t}(),on=rn.normalize,sn=ee.internals.SchedulePeriodicRecursive=function(){function t(t,e){e(0,this._period);try{this._state=this._action(this._state)}catch(n){throw this._cancel.dispose(),n}}function e(t,e,n,r){this._scheduler=t,this._state=e,this._period=n,this._action=r}return e.prototype.start=function(){var e=new Ge;return this._cancel=e,e.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0,this._period,t.bind(this))),e},e}(),un=rn.immediate=function(){function t(t,e){return e(this,t)}function e(t,e,n){for(var r=on(r);r-this.now()>0;);return n(this,t)}function n(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}return new rn(ie,t,e,n)}(),cn=rn.currentThread=function(){function t(t){for(var e;t.length>0;)if(e=t.dequeue(),!e.isCancelled()){for(;e.dueTime-rn.now()>0;);e.isCancelled()||e.invoke()}}function e(t,e){return this.scheduleWithRelativeAndState(t,0,e)}function n(e,n,r){var o=this.now()+rn.normalize(n),s=new en(this,e,r,o);if(i)i.enqueue(s);else{i=new He(4),i.enqueue(s);try{t(i)}catch(u){throw u}finally{i=null}}return s.disposable}function r(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}var i,o=new rn(ie,e,n,r);return o.scheduleRequired=function(){return null===i},o.ensureTrampoline=function(t){return null===i?this.schedule(t):t()},o}(),an=ne;(function(){function t(){if(!X.postMessage||X.importScripts)return!1;var t=!1,e=X.onmessage;return X.onmessage=function(){t=!0},X.postMessage("","*"),X.onmessage=e,t}function e(t){if("string"==typeof t.data&&t.data.substring(0,o.length)===o){var e=t.data.substring(o.length),n=s[e];n(),delete s[e]}}var n=RegExp("^"+(Ne+"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),r="function"==typeof(r=te&&Y&&te.setImmediate)&&!n.test(r)&&r,i="function"==typeof(i=te&&Y&&te.clearImmediate)&&!n.test(i)&&i;if("undefined"!=typeof process&&"[object process]"==={}.toString.call(process))nn=process.nextTick;else if("function"==typeof r)nn=r,an=i;else if(t()){var o="ms.rx.schedule"+Math.random(),s={},u=0;X.addEventListener?X.addEventListener("message",e,!1):X.attachEvent("onmessage",e,!1),nn=function(t){var e=u++;s[e]=t,X.postMessage(o+e,"*")}}else if(X.MessageChannel){var c=new X.MessageChannel,a={},h=0;c.port1.onmessage=function(t){var e=t.data,n=a[e];n(),delete a[e]},nn=function(t){var e=h++;a[e]=t,c.port2.postMessage(e)}}else"document"in X&&"onreadystatechange"in X.document.createElement("script")?nn=function(t){var e=X.document.createElement("script");e.onreadystatechange=function(){t(),e.onreadystatechange=null,e.parentNode.removeChild(e),e=null},X.document.documentElement.appendChild(e)}:(nn=function(t){return setTimeout(t,0)},an=clearTimeout)})();var hn=rn.timeout=function(){function t(t,e){var n=this,r=new Ge,i=nn(function(){r.isDisposed||r.setDisposable(e(n,t))});return new Qe(r,Je(function(){an(i)}))}function e(t,e,n){var r=this,i=rn.normalize(e);if(0===i)return r.scheduleWithState(t,n);var o=new Ge,s=setTimeout(function(){o.isDisposed||o.setDisposable(n(r,t))},i);return new Qe(o,Je(function(){clearTimeout(s)}))}function n(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}return new rn(ie,t,e,n)}(),ln=function(t){function e(){return this._scheduler.now()}function n(t,e){return this._scheduler.scheduleWithState(t,this._wrap(e))}function r(t,e,n){return this._scheduler.scheduleWithRelativeAndState(t,e,this._wrap(n))}function i(t,e,n){return this._scheduler.scheduleWithAbsoluteAndState(t,e,this._wrap(n))}function o(o,s){this._scheduler=o,this._handler=s,this._recursiveOriginal=null,this._recursiveWrapper=null,t.call(this,e,n,r,i)}return ze(o,t),o.prototype._clone=function(t){return new o(t,this._handler)},o.prototype._wrap=function(t){var e=this;return function(n,r){try{return t(e._getRecursiveWrapper(n),r)}catch(i){if(!e._handler(i))throw i;return Xe}}},o.prototype._getRecursiveWrapper=function(t){if(this._recursiveOriginal!==t){this._recursiveOriginal=t;var e=this._clone(t);e._recursiveOriginal=t,e._recursiveWrapper=e,this._recursiveWrapper=e}return this._recursiveWrapper},o.prototype.schedulePeriodicWithState=function(t,e,n){var r=this,i=!1,o=new Ge;return o.setDisposable(this._scheduler.schedulePeriodicWithState(t,e,function(t){if(i)return null;try{return n(t)}catch(e){if(i=!0,!r._handler(e))throw e;return o.dispose(),null}})),o},o}(rn),fn=ee.Notification=function(){function t(t,e){this.hasValue=null==e?!1:e,this.kind=t}var e=t.prototype;return e.accept=function(t,e,n){return 1===arguments.length&&"object"==typeof t?this._acceptObservable(t):this._accept(t,e,n)},e.toObservable=function(t){var e=this;return t||(t=un),new hr(function(n){return t.schedule(function(){e._acceptObservable(n),"N"===e.kind&&n.onCompleted()})})},t}(),pn=fn.createOnNext=function(){function t(t){return t(this.value)}function e(t){return t.onNext(this.value)}function n(){return"OnNext("+this.value+")"}return function(r){var i=new fn("N",!0);return i.value=r,i._accept=t,i._acceptObservable=e,i.toString=n,i}}(),dn=fn.createOnError=function(){function t(t,e){return e(this.exception)}function e(t){return t.onError(this.exception)}function n(){return"OnError("+this.exception+")"}return function(r){var i=new fn("E");return i.exception=r,i._accept=t,i._acceptObservable=e,i.toString=n,i}}(),vn=fn.createOnCompleted=function(){function t(t,e,n){return n()}function e(t){return t.onCompleted()}function n(){return"OnCompleted()"}return function(){var r=new fn("C");return r._accept=t,r._acceptObservable=e,r.toString=n,r}}(),bn=ee.internals.Enumerator=function(t){this._next=t};bn.prototype.next=function(){return this._next()},bn.prototype[pe]=function(){return this};var mn=ee.internals.Enumerable=function(t){this._iterator=t};mn.prototype[pe]=function(){return this._iterator()},mn.prototype.concat=function(){var e=this;return new hr(function(n){var r;try{r=e[pe]()}catch(i){return n.onError(),t}var o,s=new Ye,u=un.scheduleRecursive(function(e){var i;if(!o){try{i=r.next()}catch(u){return n.onError(u),t}if(i.done)return n.onCompleted(),t;var c=i.value;ae(c)&&(c=On(c));var a=new Ge;s.setDisposable(a),a.setDisposable(c.subscribe(n.onNext.bind(n),n.onError.bind(n),function(){e()}))}});return new Qe(s,u,Je(function(){o=!0}))})},mn.prototype.catchException=function(){var e=this;return new hr(function(n){var r;try{r=e[pe]()}catch(i){return n.onError(),t}var o,s,u=new Ye,c=un.scheduleRecursive(function(e){if(!o){var i;try{i=r.next()}catch(c){return n.onError(c),t}if(i.done)return s?n.onError(s):n.onCompleted(),t;var a=i.value;ae(a)&&(a=On(a));var h=new Ge;u.setDisposable(h),h.setDisposable(a.subscribe(n.onNext.bind(n),function(t){s=t,e()},n.onCompleted.bind(n)))}});return new Qe(u,c,Je(function(){o=!0}))})};var yn=mn.repeat=function(t,e){return null==e&&(e=-1),new mn(function(){var n=e;return new bn(function(){return 0===n?ve:(n>0&&n--,{done:!1,value:t})})})},wn=mn.forEach=function(t,e,n){return e||(e=re),new mn(function(){var r=-1;return new bn(function(){return++r0&&(e=!this.isAcquired,this.isAcquired=!0),e&&this.disposable.setDisposable(this.scheduler.scheduleRecursive(function(e){var r;if(!(n.queue.length>0))return n.isAcquired=!1,t;r=n.queue.shift();try{r()}catch(i){throw n.queue=[],n.hasFaulted=!0,i}e()}))},n.prototype.dispose=function(){e.prototype.dispose.call(this),this.disposable.dispose()},n}(Cn),An=function(t){function e(){t.apply(this,arguments)}return ze(e,t),e.prototype.next=function(e){t.prototype.next.call(this,e),this.ensureActive()},e.prototype.error=function(e){t.prototype.error.call(this,e),this.ensureActive()},e.prototype.completed=function(){t.prototype.completed.call(this),this.ensureActive()},e}(Nn),_n=ee.Observable=function(){function t(t){this._subscribe=t}return xn=t.prototype,xn.subscribe=xn.forEach=function(t,e,n){var r="object"==typeof t?t:En(t,e,n);return this._subscribe(r)},t}();xn.observeOn=function(t){var e=this;return new hr(function(n){return e.subscribe(new An(t,n))})},xn.subscribeOn=function(t){var e=this;return new hr(function(n){var r=new Ge,i=new Ye;return i.setDisposable(r),r.setDisposable(t.schedule(function(){i.setDisposable(new f(t,e.subscribe(n)))})),i})};var On=_n.fromPromise=function(t){return new hr(function(e){return t.then(function(t){e.onNext(t),e.onCompleted()},function(t){e.onError(t)}),function(){t&&t.abort&&t.abort()}})};xn.toPromise=function(t){if(t||(t=ee.config.Promise),!t)throw Error("Promise type not provided nor in Rx.config.Promise"); +var e=this;return new t(function(t,n){var r,i=!1;e.subscribe(function(t){r=t,i=!0},function(t){n(t)},function(){i&&t(r)})})},xn.toArray=function(){var t=this;return new hr(function(e){var n=[];return t.subscribe(n.push.bind(n),e.onError.bind(e),function(){e.onNext(n),e.onCompleted()})})},_n.create=_n.createWithDisposable=function(t){return new hr(t)};var Wn=_n.defer=function(t){return new hr(function(e){var n;try{n=t()}catch(r){return Pn(r).subscribe(e)}return ae(n)&&(n=On(n)),n.subscribe(e)})},jn=_n.empty=function(t){return t||(t=un),new hr(function(e){return t.schedule(function(){e.onCompleted()})})},kn=_n.fromArray=function(t,e){return e||(e=cn),new hr(function(n){var r=0,i=t.length;return e.scheduleRecursive(function(e){i>r?(n.onNext(t[r++]),e()):n.onCompleted()})})};_n.fromIterable=function(e,n){return n||(n=cn),new hr(function(r){var i;try{i=e[pe]()}catch(o){return r.onError(o),t}return n.scheduleRecursive(function(e){var n;try{n=i.next()}catch(o){return r.onError(o),t}n.done?r.onCompleted():(r.onNext(n.value),e())})})},_n.generate=function(e,n,r,i,o){return o||(o=cn),new hr(function(s){var u=!0,c=e;return o.scheduleRecursive(function(e){var o,a;try{u?u=!1:c=r(c),o=n(c),o&&(a=i(c))}catch(h){return s.onError(h),t}o?(s.onNext(a),e()):s.onCompleted()})})},_n.of=function(){for(var t=arguments.length,e=Array(t),n=0;t>n;n++)e[n]=arguments[n];return kn(e)},_n.ofWithScheduler=function(t){for(var e=arguments.length-1,n=Array(e),r=0;e>r;r++)n[r]=arguments[r+1];return kn(n,t)};var Rn=_n.never=function(){return new hr(function(){return Xe})};_n.range=function(t,e,n){return n||(n=cn),new hr(function(r){return n.scheduleRecursiveWithState(0,function(n,i){e>n?(r.onNext(t+n),i(n+1)):r.onCompleted()})})},_n.repeat=function(t,e,n){return n||(n=cn),null==e&&(e=-1),qn(t,n).repeat(e)};var qn=_n["return"]=_n.returnValue=_n.just=function(t,e){return e||(e=un),new hr(function(n){return e.schedule(function(){n.onNext(t),n.onCompleted()})})},Pn=_n["throw"]=_n.throwException=function(t,e){return e||(e=un),new hr(function(n){return e.schedule(function(){n.onError(t)})})};_n.using=function(t,e){return new hr(function(n){var r,i,o=Xe;try{r=t(),r&&(o=r),i=e(r)}catch(s){return new Qe(Pn(s).subscribe(n),o)}return new Qe(i.subscribe(n),o)})},xn.amb=function(t){var e=this;return new hr(function(n){function r(){o||(o=s,a.dispose())}function i(){o||(o=u,c.dispose())}var o,s="L",u="R",c=new Ge,a=new Ge;return ae(t)&&(t=On(t)),c.setDisposable(e.subscribe(function(t){r(),o===s&&n.onNext(t)},function(t){r(),o===s&&n.onError(t)},function(){r(),o===s&&n.onCompleted()})),a.setDisposable(t.subscribe(function(t){i(),o===u&&n.onNext(t)},function(t){i(),o===u&&n.onError(t)},function(){i(),o===u&&n.onCompleted()})),new Qe(c,a)})},_n.amb=function(){function t(t,e){return t.amb(e)}for(var e=Rn(),n=h(arguments,0),r=0,i=n.length;i>r;r++)e=t(e,n[r]);return e},xn["catch"]=xn.catchException=function(t){return"function"==typeof t?p(this,t):Tn([this,t])};var Tn=_n.catchException=_n["catch"]=function(){var t=h(arguments,0);return wn(t).catchException()};xn.combineLatest=function(){var t=Ve.call(arguments);return Array.isArray(t[0])?t[0].unshift(this):t.unshift(this),Vn.apply(this,t)};var Vn=_n.combineLatest=function(){var e=Ve.call(arguments),n=e.pop();return Array.isArray(e[0])&&(e=e[0]),new hr(function(r){function i(e){var i;if(c[e]=!0,a||(a=c.every(re))){try{i=n.apply(null,f)}catch(o){return r.onError(o),t}r.onNext(i)}else h.filter(function(t,n){return n!==e}).every(re)&&r.onCompleted()}function o(t){h[t]=!0,h.every(re)&&r.onCompleted()}for(var s=function(){return!1},u=e.length,c=l(u,s),a=!1,h=l(u,s),f=Array(u),p=Array(u),d=0;u>d;d++)(function(t){var n=e[t],s=new Ge;ae(n)&&(n=On(n)),s.setDisposable(n.subscribe(function(e){f[t]=e,i(t)},r.onError.bind(r),function(){o(t)})),p[t]=s})(d);return new Qe(p)})};xn.concat=function(){var t=Ve.call(arguments,0);return t.unshift(this),zn.apply(this,t)};var zn=_n.concat=function(){var t=h(arguments,0);return wn(t).concat()};xn.concatObservable=xn.concatAll=function(){return this.merge(1)},xn.merge=function(t){if("number"!=typeof t)return Ln(this,t);var e=this;return new hr(function(n){var r=0,i=new Qe,o=!1,s=[],u=function(t){var e=new Ge;i.add(e),ae(t)&&(t=On(t)),e.setDisposable(t.subscribe(n.onNext.bind(n),n.onError.bind(n),function(){var t;i.remove(e),s.length>0?(t=s.shift(),u(t)):(r--,o&&0===r&&n.onCompleted())}))};return i.add(e.subscribe(function(e){t>r?(r++,u(e)):s.push(e)},n.onError.bind(n),function(){o=!0,0===r&&n.onCompleted()})),i})};var Ln=_n.merge=function(){var t,e;return arguments[0]?arguments[0].now?(t=arguments[0],e=Ve.call(arguments,1)):(t=un,e=Ve.call(arguments,0)):(t=un,e=Ve.call(arguments,1)),Array.isArray(e[0])&&(e=e[0]),kn(e,t).mergeObservable()};xn.mergeObservable=xn.mergeAll=function(){var t=this;return new hr(function(e){var n=new Qe,r=!1,i=new Ge;return n.add(i),i.setDisposable(t.subscribe(function(t){var i=new Ge;n.add(i),ae(t)&&(t=On(t)),i.setDisposable(t.subscribe(function(t){e.onNext(t)},e.onError.bind(e),function(){n.remove(i),r&&1===n.length&&e.onCompleted()}))},e.onError.bind(e),function(){r=!0,1===n.length&&e.onCompleted()})),n})},xn.onErrorResumeNext=function(t){if(!t)throw Error("Second observable is required");return Mn([this,t])};var Mn=_n.onErrorResumeNext=function(){var t=h(arguments,0);return new hr(function(e){var n=0,r=new Ye,i=un.scheduleRecursive(function(i){var o,s;t.length>n?(o=t[n++],ae(o)&&(o=On(o)),s=new Ge,r.setDisposable(s),s.setDisposable(o.subscribe(e.onNext.bind(e),function(){i()},function(){i()}))):e.onCompleted()});return new Qe(r,i)})};xn.skipUntil=function(t){var e=this;return new hr(function(n){var r=!1,i=new Qe(e.subscribe(function(t){r&&n.onNext(t)},n.onError.bind(n),function(){r&&n.onCompleted()}));ae(t)&&(t=On(t));var o=new Ge;return i.add(o),o.setDisposable(t.subscribe(function(){r=!0,o.dispose()},n.onError.bind(n),function(){o.dispose()})),i})},xn["switch"]=xn.switchLatest=function(){var t=this;return new hr(function(e){var n=!1,r=new Ye,i=!1,o=0,s=t.subscribe(function(t){var s=new Ge,u=++o;n=!0,r.setDisposable(s),ae(t)&&(t=On(t)),s.setDisposable(t.subscribe(function(t){o===u&&e.onNext(t)},function(t){o===u&&e.onError(t)},function(){o===u&&(n=!1,i&&e.onCompleted())}))},e.onError.bind(e),function(){i=!0,n||e.onCompleted()});return new Qe(s,r)})},xn.takeUntil=function(t){var e=this;return new hr(function(n){return ae(t)&&(t=On(t)),new Qe(e.subscribe(n),t.subscribe(n.onCompleted.bind(n),n.onError.bind(n),ne))})},xn.zip=function(){if(Array.isArray(arguments[0]))return d.apply(this,arguments);var e=this,n=Ve.call(arguments),r=n.pop();return n.unshift(e),new hr(function(i){function o(n){var o,s;if(c.every(function(t){return t.length>0})){try{s=c.map(function(t){return t.shift()}),o=r.apply(e,s)}catch(u){return i.onError(u),t}i.onNext(o)}else a.filter(function(t,e){return e!==n}).every(re)&&i.onCompleted()}function s(t){a[t]=!0,a.every(function(t){return t})&&i.onCompleted()}for(var u=n.length,c=l(u,function(){return[]}),a=l(u,function(){return!1}),h=Array(u),f=0;u>f;f++)(function(t){var e=n[t],r=new Ge;ae(e)&&(e=On(e)),r.setDisposable(e.subscribe(function(e){c[t].push(e),o(t)},i.onError.bind(i),function(){s(t)})),h[t]=r})(f);return new Qe(h)})},_n.zip=function(){var t=Ve.call(arguments,0),e=t.shift();return e.zip.apply(e,t)},_n.zipArray=function(){var e=h(arguments,0);return new hr(function(n){function r(e){if(s.every(function(t){return t.length>0})){var r=s.map(function(t){return t.shift()});n.onNext(r)}else if(u.filter(function(t,n){return n!==e}).every(re))return n.onCompleted(),t}function i(e){return u[e]=!0,u.every(re)?(n.onCompleted(),t):t}for(var o=e.length,s=l(o,function(){return[]}),u=l(o,function(){return!1}),c=Array(o),a=0;o>a;a++)(function(t){c[t]=new Ge,c[t].setDisposable(e[t].subscribe(function(e){s[t].push(e),r(t)},n.onError.bind(n),function(){i(t)}))})(a);var h=new Qe(c);return h.add(Je(function(){for(var t=0,e=s.length;e>t;t++)s[t]=[]})),h})},xn.asObservable=function(){var t=this;return new hr(function(e){return t.subscribe(e)})},xn.bufferWithCount=function(t,e){return"number"!=typeof e&&(e=t),this.windowWithCount(t,e).selectMany(function(t){return t.toArray()}).where(function(t){return t.length>0})},xn.dematerialize=function(){var t=this;return new hr(function(e){return t.subscribe(function(t){return t.accept(e)},e.onError.bind(e),e.onCompleted.bind(e))})},xn.distinctUntilChanged=function(e,n){var r=this;return e||(e=re),n||(n=oe),new hr(function(i){var o,s=!1;return r.subscribe(function(r){var u,c=!1;try{u=e(r)}catch(a){return i.onError(a),t}if(s)try{c=n(o,u)}catch(a){return i.onError(a),t}s&&c||(s=!0,o=u,i.onNext(r))},i.onError.bind(i),i.onCompleted.bind(i))})},xn["do"]=xn.doAction=function(t,e,n){var r,i=this;return"function"==typeof t?r=t:(r=t.onNext.bind(t),e=t.onError.bind(t),n=t.onCompleted.bind(t)),new hr(function(t){return i.subscribe(function(e){try{r(e)}catch(n){t.onError(n)}t.onNext(e)},function(n){if(e){try{e(n)}catch(r){t.onError(r)}t.onError(n)}else t.onError(n)},function(){if(n){try{n()}catch(e){t.onError(e)}t.onCompleted()}else t.onCompleted()})})},xn["finally"]=xn.finallyAction=function(t){var e=this;return new hr(function(n){var r;try{r=e.subscribe(n)}catch(i){throw t(),i}return Je(function(){try{r.dispose()}catch(e){throw e}finally{t()}})})},xn.ignoreElements=function(){var t=this;return new hr(function(e){return t.subscribe(ne,e.onError.bind(e),e.onCompleted.bind(e))})},xn.materialize=function(){var t=this;return new hr(function(e){return t.subscribe(function(t){e.onNext(pn(t))},function(t){e.onNext(dn(t)),e.onCompleted()},function(){e.onNext(vn()),e.onCompleted()})})},xn.repeat=function(t){return yn(this,t).concat()},xn.retry=function(t){return yn(this,t).catchException()},xn.scan=function(){var e,n,r=!1,i=this;return 2===arguments.length?(r=!0,e=arguments[0],n=arguments[1]):n=arguments[0],new hr(function(o){var s,u,c;return i.subscribe(function(i){try{c||(c=!0),s?u=n(u,i):(u=r?n(e,i):i,s=!0)}catch(a){return o.onError(a),t}o.onNext(u)},o.onError.bind(o),function(){!c&&r&&o.onNext(e),o.onCompleted()})})},xn.skipLast=function(t){var e=this;return new hr(function(n){var r=[];return e.subscribe(function(e){r.push(e),r.length>t&&n.onNext(r.shift())},n.onError.bind(n),n.onCompleted.bind(n))})},xn.startWith=function(){var t,e,n=0;return arguments.length&&"now"in Object(arguments[0])?(e=arguments[0],n=1):e=un,t=Ve.call(arguments,n),wn([kn(t,e),this]).concat()},xn.takeLast=function(t,e){return this.takeLastBuffer(t).selectMany(function(t){return kn(t,e)})},xn.takeLastBuffer=function(t){var e=this;return new hr(function(n){var r=[];return e.subscribe(function(e){r.push(e),r.length>t&&r.shift()},n.onError.bind(n),function(){n.onNext(r),n.onCompleted()})})},xn.windowWithCount=function(t,e){var n=this;if(0>=t)throw Error(le);if(1===arguments.length&&(e=t),0>=e)throw Error(le);return new hr(function(r){var i=new Ge,o=new tn(i),s=0,u=[],c=function(){var t=new pr;u.push(t),r.onNext(Me(t,o))};return c(),i.setDisposable(n.subscribe(function(n){for(var r,i=0,o=u.length;o>i;i++)u[i].onNext(n);var a=s-t+1;a>=0&&0===a%e&&(r=u.shift(),r.onCompleted()),s++,0===s%e&&c()},function(t){for(;u.length>0;)u.shift().onError(t);r.onError(t)},function(){for(;u.length>0;)u.shift().onCompleted();r.onCompleted()})),o})},xn.selectConcat=xn.concatMap=function(t,e){return e?this.concatMap(function(n,r){var i=t(n,r),o=ae(i)?On(i):i;return o.map(function(t){return e(n,t,r)})}):"function"==typeof t?v.call(this,t):v.call(this,function(){return t})},xn.defaultIfEmpty=function(e){var n=this;return e===t&&(e=null),new hr(function(t){var r=!1;return n.subscribe(function(e){r=!0,t.onNext(e)},t.onError.bind(t),function(){r||t.onNext(e),t.onCompleted()})})},xn.distinct=function(e,n){var r=this;return e||(e=re),n||(n=ue),new hr(function(i){var o={};return r.subscribe(function(r){var s,u,c,a=!1;try{s=e(r),u=n(s)}catch(h){return i.onError(h),t}for(c in o)if(u===c){a=!0;break}a||(o[u]=null,i.onNext(r))},i.onError.bind(i),i.onCompleted.bind(i))})},xn.groupBy=function(t,e,n){return this.groupByUntil(t,e,function(){return Rn()},n)},xn.groupByUntil=function(e,n,r,i){var o=this;return n||(n=re),i||(i=ue),new hr(function(s){var u={},c=new Qe,a=new tn(c);return c.add(o.subscribe(function(o){var h,l,f,p,d,v,b,m,y,w;try{v=e(o),b=i(v)}catch(g){for(w in u)u[w].onError(g);return s.onError(g),t}p=!1;try{y=u[b],y||(y=new pr,u[b]=y,p=!0)}catch(g){for(w in u)u[w].onError(g);return s.onError(g),t}if(p){d=new fr(v,y,a),l=new fr(v,y);try{h=r(l)}catch(g){for(w in u)u[w].onError(g);return s.onError(g),t}s.onNext(d),m=new Ge,c.add(m);var E=function(){b in u&&(delete u[b],y.onCompleted()),c.remove(m)};m.setDisposable(h.take(1).subscribe(ne,function(t){for(w in u)u[w].onError(t);s.onError(t)},function(){E()}))}try{f=n(o)}catch(g){for(w in u)u[w].onError(g);return s.onError(g),t}y.onNext(f)},function(t){for(var e in u)u[e].onError(t);s.onError(t)},function(){for(var t in u)u[t].onCompleted();s.onCompleted()})),a})},xn.select=xn.map=function(e,n){var r=this;return new hr(function(i){var o=0;return r.subscribe(function(s){var u;try{u=e.call(n,s,o++,r)}catch(c){return i.onError(c),t}i.onNext(u)},i.onError.bind(i),i.onCompleted.bind(i))})},xn.pluck=function(t){return this.select(function(e){return e[t]})},xn.selectMany=xn.flatMap=function(t,e){return e?this.selectMany(function(n,r){var i=t(n,r),o=ae(i)?On(i):i;return o.select(function(t){return e(n,t,r)})}):"function"==typeof t?b.call(this,t):b.call(this,function(){return t})},xn.selectSwitch=xn.flatMapLatest=xn.switchMap=function(t,e){return this.select(t,e).switchLatest()},xn.skip=function(t){if(0>t)throw Error(le);var e=this;return new hr(function(n){var r=t;return e.subscribe(function(t){0>=r?n.onNext(t):r--},n.onError.bind(n),n.onCompleted.bind(n))})},xn.skipWhile=function(e,n){var r=this;return new hr(function(i){var o=0,s=!1;return r.subscribe(function(u){if(!s)try{s=!e.call(n,u,o++,r)}catch(c){return i.onError(c),t}s&&i.onNext(u)},i.onError.bind(i),i.onCompleted.bind(i))})},xn.take=function(t,e){if(0>t)throw Error(le);if(0===t)return jn(e);var n=this;return new hr(function(e){var r=t;return n.subscribe(function(t){r>0&&(r--,e.onNext(t),0===r&&e.onCompleted())},e.onError.bind(e),e.onCompleted.bind(e))})},xn.takeWhile=function(e,n){var r=this;return new hr(function(i){var o=0,s=!0;return r.subscribe(function(u){if(s){try{s=e.call(n,u,o++,r)}catch(c){return i.onError(c),t}s?i.onNext(u):i.onCompleted()}},i.onError.bind(i),i.onCompleted.bind(i))})},xn.where=xn.filter=function(e,n){var r=this;return new hr(function(i){var o=0;return r.subscribe(function(s){var u;try{u=e.call(n,s,o++,r)}catch(c){return i.onError(c),t}u&&i.onNext(s)},i.onError.bind(i),i.onCompleted.bind(i))})},xn.finalValue=function(){var t=this;return new hr(function(e){var n,r=!1;return t.subscribe(function(t){r=!0,n=t},e.onError.bind(e),function(){r?(e.onNext(n),e.onCompleted()):e.onError(Error(he))})})},xn.aggregate=function(){var t,e,n;return 2===arguments.length?(t=arguments[0],e=!0,n=arguments[1]):n=arguments[0],e?this.scan(t,n).startWith(t).finalValue():this.scan(n).finalValue()},xn.reduce=function(t){var e,n;return 2===arguments.length&&(n=!0,e=arguments[1]),n?this.scan(e,t).startWith(e).finalValue():this.scan(t).finalValue()},xn.some=xn.any=function(t,e){var n=this;return t?n.where(t,e).any():new hr(function(t){return n.subscribe(function(){t.onNext(!0),t.onCompleted()},t.onError.bind(t),function(){t.onNext(!1),t.onCompleted()})})},xn.isEmpty=function(){return this.any().select(function(t){return!t})},xn.every=xn.all=function(t,e){return this.where(function(e){return!t(e)},e).any().select(function(t){return!t})},xn.contains=function(t,e){return e||(e=oe),this.where(function(n){return e(n,t)}).any()},xn.count=function(t,e){return t?this.where(t,e).count():this.aggregate(0,function(t){return t+1})},xn.sum=function(t,e){return t?this.select(t,e).sum():this.aggregate(0,function(t,e){return t+e})},xn.minBy=function(t,e){return e||(e=se),m(this,t,function(t,n){return-1*e(t,n)})},xn.min=function(t){return this.minBy(re,t).select(function(t){return y(t)})},xn.maxBy=function(t,e){return e||(e=se),m(this,t,e)},xn.max=function(t){return this.maxBy(re,t).select(function(t){return y(t)})},xn.average=function(t,e){return t?this.select(t,e).average():this.scan({sum:0,count:0},function(t,e){return{sum:t.sum+e,count:t.count+1}}).finalValue().select(function(t){if(0===t.count)throw Error("The input sequence was empty");return t.sum/t.count})},xn.sequenceEqual=function(e,n){var r=this;return n||(n=oe),Array.isArray(e)?w(r,e,n):new hr(function(i){var o=!1,s=!1,u=[],c=[],a=r.subscribe(function(e){var r,o;if(c.length>0){o=c.shift();try{r=n(o,e)}catch(a){return i.onError(a),t}r||(i.onNext(!1),i.onCompleted())}else s?(i.onNext(!1),i.onCompleted()):u.push(e)},i.onError.bind(i),function(){o=!0,0===u.length&&(c.length>0?(i.onNext(!1),i.onCompleted()):s&&(i.onNext(!0),i.onCompleted()))});ae(e)&&(e=On(e));var h=e.subscribe(function(e){var r,s;if(u.length>0){s=u.shift();try{r=n(s,e)}catch(a){return i.onError(a),t}r||(i.onNext(!1),i.onCompleted())}else o?(i.onNext(!1),i.onCompleted()):c.push(e)},i.onError.bind(i),function(){s=!0,0===c.length&&(u.length>0?(i.onNext(!1),i.onCompleted()):o&&(i.onNext(!0),i.onCompleted()))});return new Qe(a,h)})},xn.elementAt=function(t){return g(this,t,!1)},xn.elementAtOrDefault=function(t,e){return g(this,t,!0,e)},xn.single=function(t,e){return t?this.where(t,e).single():E(this,!1)},xn.singleOrDefault=function(t,e,n){return t?this.where(t,n).singleOrDefault(null,e):E(this,!0,e)},xn.first=function(t,e){return t?this.where(t,e).first():x(this,!1)},xn.firstOrDefault=function(t,e){return t?this.where(t).firstOrDefault(null,e):x(this,!0,e)},xn.last=function(t,e){return t?this.where(t,e).last():C(this,!1)},xn.lastOrDefault=function(t,e,n){return t?this.where(t,n).lastOrDefault(null,e):C(this,!0,e)},xn.find=function(t,e){return D(this,t,e,!1)},xn.findIndex=function(t,e){return D(this,t,e,!0)},_n.start=function(t,e,n){return In(t,e,n)()};var In=_n.toAsync=function(e,n,r){return n||(n=hn),function(){var i=arguments,o=new dr;return n.schedule(function(){var n;try{n=e.apply(r,i)}catch(s){return o.onError(s),t}o.onNext(n),o.onCompleted()}),o.asObservable()}};_n.fromCallback=function(e,n,r,i){return n||(n=un),function(){var o=Ve.call(arguments,0);return new hr(function(s){return n.schedule(function(){function n(e){var n=e;if(i)try{n=i(arguments)}catch(r){return s.onError(r),t}else 1===n.length&&(n=n[0]);s.onNext(n),s.onCompleted()}o.push(n),e.apply(r,o)})})}},_n.fromNodeCallback=function(e,n,r,i){return n||(n=un),function(){var o=Ve.call(arguments,0);return new hr(function(s){return n.schedule(function(){function n(e){if(e)return s.onError(e),t;var n=Ve.call(arguments,1);if(i)try{n=i(n)}catch(r){return s.onError(r),t}else 1===n.length&&(n=n[0]);s.onNext(n),s.onCompleted()}o.push(n),e.apply(r,o)})})}};var Fn=X.angular&&angular.element?angular.element:X.jQuery?X.jQuery:X.Zepto?X.Zepto:null,Bn=!!X.Ember&&"function"==typeof X.Ember.addListener;_n.fromEvent=function(e,n,r){if(Bn)return Hn(function(t){Ember.addListener(e,n,t)},function(t){Ember.removeListener(e,n,t)},r);if(Fn){var i=Fn(e);return Hn(function(t){i.on(n,t)},function(t){i.off(n,t)},r)}return new hr(function(i){return A(e,n,function(e){var n=e;if(r)try{n=r(arguments)}catch(o){return i.onError(o),t}i.onNext(n)})}).publish().refCount()};var Hn=_n.fromEventPattern=function(e,n,r){return new hr(function(i){function o(e){var n=e;if(r)try{n=r(arguments)}catch(o){return i.onError(o),t}i.onNext(n)}var s=e(o);return Je(function(){n&&n(o,s)})}).publish().refCount()};_n.startAsync=function(t){var e;try{e=t()}catch(n){return Pn(n)}return On(e)};var Un=function(t){function e(t){var e=this.source.publish(),n=e.subscribe(t),r=Xe,i=this.subject.distinctUntilChanged().subscribe(function(t){t?r=e.connect():(r.dispose(),r=Xe)});return new Qe(n,r,i)}function n(n,r){this.source=n,this.subject=r||new pr,this.isPaused=!0,t.call(this,e)}return ze(n,t),n.prototype.pause=function(){this.isPaused!==!0&&(this.isPaused=!0,this.subject.onNext(!1))},n.prototype.resume=function(){this.isPaused!==!1&&(this.isPaused=!1,this.subject.onNext(!0))},n}(_n);xn.pausable=function(t){return new Un(this,t)};var Qn=function(t){function e(t){var e=[],n=!0,r=_(this.source,this.subject.distinctUntilChanged(),function(t,e){return{data:t,shouldFire:e}}).subscribe(function(r){if(r.shouldFire&&n&&t.onNext(r.data),r.shouldFire&&!n){for(;e.length>0;)t.onNext(e.shift());n=!0}else r.shouldFire||n?!r.shouldFire&&n&&(n=!1):e.push(r.data)},function(n){for(;e.length>0;)t.onNext(e.shift());t.onError(n)},function(){for(;e.length>0;)t.onNext(e.shift());t.onCompleted()});return this.subject.onNext(!1),r}function n(n,r){this.source=n,this.subject=r||new pr,this.isPaused=!0,t.call(this,e)}return ze(n,t),n.prototype.pause=function(){this.isPaused!==!0&&(this.isPaused=!0,this.subject.onNext(!1))},n.prototype.resume=function(){this.isPaused!==!1&&(this.isPaused=!1,this.subject.onNext(!0))},n}(_n);xn.pausableBuffered=function(t){return new Qn(this,t)},xn.controlled=function(t){return null==t&&(t=!0),new $n(this,t)};var $n=function(t){function e(t){return this.source.subscribe(t)}function n(n,r){t.call(this,e),this.subject=new Kn(r),this.source=n.multicast(this.subject).refCount()}return ze(n,t),n.prototype.request=function(t){return null==t&&(t=-1),this.subject.request(t)},n}(_n),Kn=ee.ControlledSubject=function(t){function n(t){return this.subject.subscribe(t)}function r(e){null==e&&(e=!0),t.call(this,n),this.subject=new pr,this.enableQueue=e,this.queue=e?[]:null,this.requestedCount=0,this.requestedDisposable=Xe,this.error=null,this.hasFailed=!1,this.hasCompleted=!1,this.controlledDisposable=Xe}return ze(r,t),Le(r.prototype,gn,{onCompleted:function(){e.call(this),this.hasCompleted=!0,this.enableQueue&&0!==this.queue.length||this.subject.onCompleted()},onError:function(t){e.call(this),this.hasFailed=!0,this.error=t,this.enableQueue&&0!==this.queue.length||this.subject.onError(t)},onNext:function(t){e.call(this);var n=!1;0===this.requestedCount?this.enableQueue&&this.queue.push(t):(-1!==this.requestedCount&&0===this.requestedCount--&&this.disposeCurrentRequest(),n=!0),n&&this.subject.onNext(t)},_processRequest:function(t){if(this.enableQueue){for(;this.queue.length>=t&&t>0;)this.subject.onNext(this.queue.shift()),t--;return 0!==this.queue.length?{numberOfItems:t,returnValue:!0}:{numberOfItems:t,returnValue:!1}}return this.hasFailed?(this.subject.onError(this.error),this.controlledDisposable.dispose(),this.controlledDisposable=Xe):this.hasCompleted&&(this.subject.onCompleted(),this.controlledDisposable.dispose(),this.controlledDisposable=Xe),{numberOfItems:t,returnValue:!1}},request:function(t){e.call(this),this.disposeCurrentRequest();var n=this,r=this._processRequest(t);return t=r.numberOfItems,r.returnValue?Xe:(this.requestedCount=t,this.requestedDisposable=Je(function(){n.requestedCount=0}),this.requestedDisposable)},disposeCurrentRequest:function(){this.requestedDisposable.dispose(),this.requestedDisposable=Xe},dispose:function(){this.isDisposed=!0,this.error=null,this.subject.dispose(),this.requestedDisposable.dispose()}}),r}(_n);xn.multicast=function(t,e){var n=this;return"function"==typeof t?new hr(function(r){var i=n.multicast(t());return new Qe(e(i).subscribe(r),i.connect())}):new Gn(n,t)},xn.publish=function(t){return t?this.multicast(function(){return new pr},t):this.multicast(new pr)},xn.share=function(){return this.publish(null).refCount()},xn.publishLast=function(t){return t?this.multicast(function(){return new dr},t):this.multicast(new dr)},xn.publishValue=function(t,e){return 2===arguments.length?this.multicast(function(){return new Xn(e)},t):this.multicast(new Xn(t))},xn.shareValue=function(t){return this.publishValue(t).refCount()},xn.replay=function(t,e,n,r){return t?this.multicast(function(){return new Zn(e,n,r)},t):this.multicast(new Zn(e,n,r))},xn.shareReplay=function(t,e,n){return this.replay(null,t,e,n).refCount()};var Jn=function(t,e){this.subject=t,this.observer=e};Jn.prototype.dispose=function(){if(!this.subject.isDisposed&&null!==this.observer){var t=this.subject.observers.indexOf(this.observer);this.subject.observers.splice(t,1),this.observer=null}};var Xn=ee.BehaviorSubject=function(t){function n(t){if(e.call(this),!this.isStopped)return this.observers.push(t),t.onNext(this.value),new Jn(this,t);var n=this.exception;return n?t.onError(n):t.onCompleted(),Xe}function r(e){t.call(this,n),this.value=e,this.observers=[],this.isDisposed=!1,this.isStopped=!1,this.exception=null}return ze(r,t),Le(r.prototype,gn,{hasObservers:function(){return this.observers.length>0},onCompleted:function(){if(e.call(this),!this.isStopped){var t=this.observers.slice(0);this.isStopped=!0;for(var n=0,r=t.length;r>n;n++)t[n].onCompleted();this.observers=[]}},onError:function(t){if(e.call(this),!this.isStopped){var n=this.observers.slice(0);this.isStopped=!0,this.exception=t;for(var r=0,i=n.length;i>r;r++)n[r].onError(t);this.observers=[]}},onNext:function(t){if(e.call(this),!this.isStopped){this.value=t;for(var n=this.observers.slice(0),r=0,i=n.length;i>r;r++)n[r].onNext(t)}},dispose:function(){this.isDisposed=!0,this.observers=null,this.value=null,this.exception=null}}),r}(_n),Zn=ee.ReplaySubject=function(t){function n(t,e){this.subject=t,this.observer=e}function r(t){var r=new Nn(this.scheduler,t),i=new n(this,r);e.call(this),this._trim(this.scheduler.now()),this.observers.push(r);for(var o=this.q.length,s=0,u=this.q.length;u>s;s++)r.onNext(this.q[s].value);return this.hasError?(o++,r.onError(this.error)):this.isStopped&&(o++,r.onCompleted()),r.ensureActive(o),i}function i(e,n,i){this.bufferSize=null==e?Number.MAX_VALUE:e,this.windowSize=null==n?Number.MAX_VALUE:n,this.scheduler=i||cn,this.q=[],this.observers=[],this.isStopped=!1,this.isDisposed=!1,this.hasError=!1,this.error=null,t.call(this,r)}return n.prototype.dispose=function(){if(this.observer.dispose(),!this.subject.isDisposed){var t=this.subject.observers.indexOf(this.observer);this.subject.observers.splice(t,1)}},ze(i,t),Le(i.prototype,gn,{hasObservers:function(){return this.observers.length>0},_trim:function(t){for(;this.q.length>this.bufferSize;)this.q.shift();for(;this.q.length>0&&t-this.q[0].interval>this.windowSize;)this.q.shift()},onNext:function(t){var n;if(e.call(this),!this.isStopped){var r=this.scheduler.now();this.q.push({interval:r,value:t}),this._trim(r);for(var i=this.observers.slice(0),o=0,s=i.length;s>o;o++)n=i[o],n.onNext(t),n.ensureActive()}},onError:function(t){var n;if(e.call(this),!this.isStopped){this.isStopped=!0,this.error=t,this.hasError=!0;var r=this.scheduler.now();this._trim(r);for(var i=this.observers.slice(0),o=0,s=i.length;s>o;o++)n=i[o],n.onError(t),n.ensureActive();this.observers=[]}},onCompleted:function(){var t;if(e.call(this),!this.isStopped){this.isStopped=!0;var n=this.scheduler.now();this._trim(n);for(var r=this.observers.slice(0),i=0,o=r.length;o>i;i++)t=r[i],t.onCompleted(),t.ensureActive();this.observers=[]}},dispose:function(){this.isDisposed=!0,this.observers=null}}),i}(_n),Gn=ee.ConnectableObservable=function(t){function e(e,n){function r(t){return i.subject.subscribe(t)}var i={subject:n,source:e.asObservable(),hasSubscription:!1,subscription:null};this.connect=function(){return i.hasSubscription||(i.hasSubscription=!0,i.subscription=new Qe(i.source.subscribe(i.subject),Je(function(){i.hasSubscription=!1}))),i.subscription},t.call(this,r)}return ze(e,t),e.prototype.connect=function(){return this.connect()},e.prototype.refCount=function(){var t=null,e=0,n=this;return new hr(function(r){var i,o;return e++,i=1===e,o=n.subscribe(r),i&&(t=n.connect()),Je(function(){o.dispose(),e--,0===e&&t.dispose()})})},e}(_n),Yn=[1,3,7,13,31,61,127,251,509,1021,2039,4093,8191,16381,32749,65521,131071,262139,524287,1048573,2097143,4194301,8388593,16777213,33554393,67108859,134217689,268435399,536870909,1073741789,2147483647],tr="no such key",er="duplicate key",nr=function(){var t=0;return function(e){if(null==e)throw Error(tr);if("string"==typeof e)return j(e);if("number"==typeof e)return k(e);if("boolean"==typeof e)return e===!0?1:0;if(e instanceof Date)return e.getTime();if(e.getHashCode)return e.getHashCode();var n=17*t++;return e.getHashCode=function(){return n},n}}(),rr=function(t,e){if(0>t)throw Error("out of range");t>0&&this._initialize(t),this.comparer=e||oe,this.freeCount=0,this.size=0,this.freeList=-1};rr.prototype._initialize=function(t){var e,n=W(t);for(this.buckets=Array(n),this.entries=Array(n),e=0;n>e;e++)this.buckets[e]=-1,this.entries[e]=R();this.freeList=-1},rr.prototype.count=function(){return this.size},rr.prototype.add=function(t,e){return this._insert(t,e,!0)},rr.prototype._insert=function(e,n,r){this.buckets||this._initialize(0);for(var i,o=2147483647&nr(e),s=o%this.buckets.length,u=this.buckets[s];u>=0;u=this.entries[u].next)if(this.entries[u].hashCode===o&&this.comparer(this.entries[u].key,e)){if(r)throw Error(er);return this.entries[u].value=n,t}this.freeCount>0?(i=this.freeList,this.freeList=this.entries[i].next,--this.freeCount):(this.size===this.entries.length&&(this._resize(),s=o%this.buckets.length),i=this.size,++this.size),this.entries[i].hashCode=o,this.entries[i].next=this.buckets[s],this.entries[i].key=e,this.entries[i].value=n,this.buckets[s]=i},rr.prototype._resize=function(){var t=W(2*this.size),e=Array(t);for(r=0;e.length>r;++r)e[r]=-1;var n=Array(t);for(r=0;this.size>r;++r)n[r]=this.entries[r];for(var r=this.size;t>r;++r)n[r]=R();for(var i=0;this.size>i;++i){var o=n[i].hashCode%t;n[i].next=e[o],e[o]=i}this.buckets=e,this.entries=n},rr.prototype.remove=function(t){if(this.buckets)for(var e=2147483647&nr(t),n=e%this.buckets.length,r=-1,i=this.buckets[n];i>=0;i=this.entries[i].next){if(this.entries[i].hashCode===e&&this.comparer(this.entries[i].key,t))return 0>r?this.buckets[n]=this.entries[i].next:this.entries[r].next=this.entries[i].next,this.entries[i].hashCode=-1,this.entries[i].next=this.freeList,this.entries[i].key=null,this.entries[i].value=null,this.freeList=i,++this.freeCount,!0;r=i}return!1},rr.prototype.clear=function(){var t,e;if(!(0>=this.size)){for(t=0,e=this.buckets.length;e>t;++t)this.buckets[t]=-1;for(t=0;this.size>t;++t)this.entries[t]=R();this.freeList=-1,this.size=0}},rr.prototype._findEntry=function(t){if(this.buckets)for(var e=2147483647&nr(t),n=this.buckets[e%this.buckets.length];n>=0;n=this.entries[n].next)if(this.entries[n].hashCode===e&&this.comparer(this.entries[n].key,t))return n;return-1},rr.prototype.count=function(){return this.size-this.freeCount},rr.prototype.tryGetValue=function(e){var n=this._findEntry(e);return n>=0?this.entries[n].value:t},rr.prototype.getValues=function(){var t=0,e=[];if(this.entries)for(var n=0;this.size>n;n++)this.entries[n].hashCode>=0&&(e[t++]=this.entries[n].value);return e},rr.prototype.get=function(t){var e=this._findEntry(t);if(e>=0)return this.entries[e].value;throw Error(tr)},rr.prototype.set=function(t,e){this._insert(t,e,!1)},rr.prototype.containskey=function(t){return this._findEntry(t)>=0},xn.join=function(e,n,r,i){var o=this;return new hr(function(s){var u=new Qe,c=!1,a=0,h=new rr,l=!1,f=0,p=new rr;return u.add(o.subscribe(function(e){var r,o,l,f,d=a++,v=new Ge;h.add(d,e),u.add(v),o=function(){return h.remove(d)&&0===h.count()&&c&&s.onCompleted(),u.remove(v)};try{r=n(e)}catch(b){return s.onError(b),t}v.setDisposable(r.take(1).subscribe(ne,s.onError.bind(s),function(){o()})),f=p.getValues();for(var m=0;f.length>m;m++){try{l=i(e,f[m])}catch(y){return s.onError(y),t}s.onNext(l)}},s.onError.bind(s),function(){c=!0,(l||0===h.count())&&s.onCompleted()})),u.add(e.subscribe(function(e){var n,o,c,a,d=f++,v=new Ge;p.add(d,e),u.add(v),o=function(){return p.remove(d)&&0===p.count()&&l&&s.onCompleted(),u.remove(v)};try{n=r(e)}catch(b){return s.onError(b),t}v.setDisposable(n.take(1).subscribe(ne,s.onError.bind(s),function(){o()})),a=h.getValues();for(var m=0;a.length>m;m++){try{c=i(a[m],e)}catch(b){return s.onError(b),t +}s.onNext(c)}},s.onError.bind(s),function(){l=!0,(c||0===p.count())&&s.onCompleted()})),u})},xn.groupJoin=function(e,n,r,i){var o=this;return new hr(function(s){var u=function(){},c=new Qe,a=new tn(c),h=new rr,l=new rr,f=0,p=0;return c.add(o.subscribe(function(e){var r=new pr,o=f++;h.add(o,r);var p,d,v,b,m;try{m=i(e,Me(r,a))}catch(y){for(v=h.getValues(),p=0,d=v.length;d>p;p++)v[p].onError(y);return s.onError(y),t}for(s.onNext(m),b=l.getValues(),p=0,d=b.length;d>p;p++)r.onNext(b[p]);var w=new Ge;c.add(w);var g,E=function(){h.remove(o)&&r.onCompleted(),c.remove(w)};try{g=n(e)}catch(y){for(v=h.getValues(),p=0,d=h.length;d>p;p++)v[p].onError(y);return s.onError(y),t}w.setDisposable(g.take(1).subscribe(u,function(t){for(v=h.getValues(),p=0,d=v.length;d>p;p++)v[p].onError(t);s.onError(t)},E))},function(t){for(var e=h.getValues(),n=0,r=e.length;r>n;n++)e[n].onError(t);s.onError(t)},s.onCompleted.bind(s))),c.add(e.subscribe(function(e){var n,i,o,a=p++;l.add(a,e);var f=new Ge;c.add(f);var d,v=function(){l.remove(a),c.remove(f)};try{d=r(e)}catch(b){for(n=h.getValues(),i=0,o=h.length;o>i;i++)n[i].onError(b);return s.onError(b),t}for(f.setDisposable(d.take(1).subscribe(u,function(t){for(n=h.getValues(),i=0,o=h.length;o>i;i++)n[i].onError(t);s.onError(t)},v)),n=h.getValues(),i=0,o=n.length;o>i;i++)n[i].onNext(e)},function(t){for(var e=h.getValues(),n=0,r=e.length;r>n;n++)e[n].onError(t);s.onError(t)})),a})},xn.buffer=function(){return this.window.apply(this,arguments).selectMany(function(t){return t.toArray()})},xn.window=function(t,e){return 1===arguments.length&&"function"!=typeof arguments[0]?P.call(this,t):"function"==typeof t?T.call(this,t):q.call(this,t,e)},xn.pairwise=function(){var t=this;return new hr(function(e){var n,r=!1;return t.subscribe(function(t){r?e.onNext([n,t]):r=!0,n=t},e.onError.bind(e),e.onCompleted.bind(e))})},xn.partition=function(t,e){var n=this.publish().refCount();return[n.filter(t,e),n.filter(function(n,r,i){return!t.call(e,n,r,i)})]},xn.letBind=xn.let=function(t){return t(this)},_n["if"]=_n.ifThen=function(t,e,n){return Wn(function(){return n||(n=jn()),ae(e)&&(e=On(e)),ae(n)&&(n=On(n)),"function"==typeof n.now&&(n=jn(n)),t()?e:n})},_n["for"]=_n.forIn=function(t,e){return wn(t,e).concat()};var ir=_n["while"]=_n.whileDo=function(t,e){return ae(e)&&(e=On(e)),V(t,e).concat()};xn.doWhile=function(t){return zn([this,ir(t,this)])},_n["case"]=_n.switchCase=function(t,e,n){return Wn(function(){n||(n=jn()),"function"==typeof n.now&&(n=jn(n));var r=e[t()];return ae(r)&&(r=On(r)),r||n})},xn.expand=function(e,n){n||(n=un);var r=this;return new hr(function(i){var o=[],s=new Ye,u=new Qe(s),c=0,a=!1,h=function(){var r=!1;o.length>0&&(r=!a,a=!0),r&&s.setDisposable(n.scheduleRecursive(function(n){var r;if(!(o.length>0))return a=!1,t;r=o.shift();var s=new Ge;u.add(s),s.setDisposable(r.subscribe(function(t){i.onNext(t);var n=null;try{n=e(t)}catch(r){i.onError(r)}o.push(n),c++,h()},i.onError.bind(i),function(){u.remove(s),c--,0===c&&i.onCompleted()})),n()}))};return o.push(r),c++,h(),u})},_n.forkJoin=function(){var e=h(arguments,0);return new hr(function(n){var r=e.length;if(0===r)return n.onCompleted(),Xe;for(var i=new Qe,o=!1,s=Array(r),u=Array(r),c=Array(r),a=0;r>a;a++)(function(a){var h=e[a];ae(h)&&(h=On(h)),i.add(h.subscribe(function(t){o||(s[a]=!0,c[a]=t)},function(t){o=!0,n.onError(t),i.dispose()},function(){if(!o){if(!s[a])return n.onCompleted(),t;u[a]=!0;for(var e=0;r>e;e++)if(!u[e])return;o=!0,n.onNext(c),n.onCompleted()}}))})(a);return i})},xn.forkJoin=function(e,n){var r=this;return new hr(function(i){var o,s,u=!1,c=!1,a=!1,h=!1,l=new Ge,f=new Ge;return ae(e)&&(e=On(e)),l.setDisposable(r.subscribe(function(t){a=!0,o=t},function(t){f.dispose(),i.onError(t)},function(){if(u=!0,c)if(a)if(h){var e;try{e=n(o,s)}catch(r){return i.onError(r),t}i.onNext(e),i.onCompleted()}else i.onCompleted();else i.onCompleted()})),f.setDisposable(e.subscribe(function(t){h=!0,s=t},function(t){l.dispose(),i.onError(t)},function(){if(c=!0,u)if(a)if(h){var e;try{e=n(o,s)}catch(r){return i.onError(r),t}i.onNext(e),i.onCompleted()}else i.onCompleted();else i.onCompleted()})),new Qe(l,f)})},xn.manySelect=function(t,e){e||(e=un);var n=this;return Wn(function(){var r;return n.select(function(t){var e=new or(t);return r&&r.onNext(t),r=e,e}).doAction(ne,function(t){r&&r.onError(t)},function(){r&&r.onCompleted()}).observeOn(e).select(function(e,n,r){return t(e,n,r)})})};var or=function(t){function e(t){var e=this,n=new Qe;return n.add(cn.schedule(function(){t.onNext(e.head),n.add(e.tail.mergeObservable().subscribe(t))})),n}function n(n){t.call(this,e),this.head=n,this.tail=new dr}return ze(n,t),Le(n.prototype,gn,{onCompleted:function(){this.onNext(_n.empty())},onError:function(t){this.onNext(_n.throwException(t))},onNext:function(t){this.tail.onNext(t),this.tail.onCompleted()}}),n}(_n),sr=function(){function t(){this.keys=[],this.values=[]}return t.prototype["delete"]=function(t){var e=this.keys.indexOf(t);return-1!==e&&(this.keys.splice(e,1),this.values.splice(e,1)),-1!==e},t.prototype.get=function(t,e){var n=this.keys.indexOf(t);return-1!==n?this.values[n]:e},t.prototype.set=function(t,e){var n=this.keys.indexOf(t);-1!==n&&(this.values[n]=e),this.values[this.keys.push(t)-1]=e},t.prototype.size=function(){return this.keys.length},t.prototype.has=function(t){return-1!==this.keys.indexOf(t)},t.prototype.getKeys=function(){return this.keys.slice(0)},t.prototype.getValues=function(){return this.values.slice(0)},t}();z.prototype.and=function(t){var e=this.patterns.slice(0);return e.push(t),new z(e)},z.prototype.then=function(t){return new L(this,t)},L.prototype.activate=function(e,n,r){for(var i=this,o=[],s=0,u=this.expression.patterns.length;u>s;s++)o.push(M(e,this.expression.patterns[s],n.onError.bind(n)));var c=new I(o,function(){var e;try{e=i.selector.apply(i,arguments)}catch(r){return n.onError(r),t}n.onNext(e)},function(){for(var t=0,e=o.length;e>t;t++)o[t].removeActivePlan(c);r(c)});for(s=0,u=o.length;u>s;s++)o[s].addActivePlan(c);return c},I.prototype.dequeue=function(){for(var t=this.joinObservers.getValues(),e=0,n=t.length;n>e;e++)t[e].queue.shift()},I.prototype.match=function(){var t,e,n,r,i,o=!0;for(e=0,n=this.joinObserverArray.length;n>e;e++)if(0===this.joinObserverArray[e].queue.length){o=!1;break}if(o){for(t=[],r=!1,e=0,n=this.joinObserverArray.length;n>e;e++)t.push(this.joinObserverArray[e].queue[0]),"C"===this.joinObserverArray[e].queue[0].kind&&(r=!0);if(r)this.onCompleted();else{for(this.dequeue(),i=[],e=0;t.length>e;e++)i.push(t[e].value);this.onNext.apply(this,i)}}};var ur=function(e){function n(t,n){e.call(this),this.source=t,this.onError=n,this.queue=[],this.activePlans=[],this.subscription=new Ge,this.isDisposed=!1}ze(n,e);var r=n.prototype;return r.next=function(e){if(!this.isDisposed){if("E"===e.kind)return this.onError(e.exception),t;this.queue.push(e);for(var n=this.activePlans.slice(0),r=0,i=n.length;i>r;r++)n[r].match()}},r.error=ne,r.completed=ne,r.addActivePlan=function(t){this.activePlans.push(t)},r.subscribe=function(){this.subscription.setDisposable(this.source.materialize().subscribe(this))},r.removeActivePlan=function(t){var e=this.activePlans.indexOf(t);this.activePlans.splice(e,1),0===this.activePlans.length&&this.dispose()},r.dispose=function(){e.prototype.dispose.call(this),this.isDisposed||(this.isDisposed=!0,this.subscription.dispose())},n}(Cn);xn.and=function(t){return new z([this,t])},xn.then=function(t){return new z([this]).then(t)},_n.when=function(){var t=h(arguments,0);return new hr(function(e){var n,r,i,o,s,u,c=[],a=new sr;u=En(e.onNext.bind(e),function(t){for(var n=a.getValues(),r=0,i=n.length;i>r;r++)n[r].onError(t);e.onError(t)},e.onCompleted.bind(e));try{for(r=0,i=t.length;i>r;r++)c.push(t[r].activate(a,u,function(t){var e=c.indexOf(t);c.splice(e,1),0===c.length&&u.onCompleted()}))}catch(h){Pn(h).subscribe(e)}for(n=new Qe,s=a.getValues(),r=0,i=s.length;i>r;r++)o=s[r],o.subscribe(),n.add(o);return n})};var cr=_n.interval=function(t,e){return e||(e=hn),U(t,t,e)},ar=_n.timer=function(e,n,r){var i;return r||(r=hn),n!==t&&"number"==typeof n?i=n:n!==t&&"object"==typeof n&&(r=n),e instanceof Date&&i===t?F(e.getTime(),r):e instanceof Date&&i!==t?(i=n,B(e.getTime(),i,r)):i===t?H(e,r):U(e,i,r)};xn.delay=function(t,e){return e||(e=hn),t instanceof Date?$.call(this,t.getTime(),e):Q.call(this,t,e)},xn.throttle=function(t,e){return e||(e=hn),this.throttleWithSelector(function(){return ar(t,e)})},xn.windowWithTime=function(e,n,r){var i,o=this;return n===t&&(i=e),r===t&&(r=hn),"number"==typeof n?i=n:"object"==typeof n&&(i=e,r=n),new hr(function(t){function n(){var e=new Ge,o=!1,s=!1;l.setDisposable(e),a===c?(o=!0,s=!0):c>a?o=!0:s=!0;var p=o?a:c,d=p-f;f=p,o&&(a+=i),s&&(c+=i),e.setDisposable(r.scheduleWithRelative(d,function(){var e;s&&(e=new pr,h.push(e),t.onNext(Me(e,u))),o&&(e=h.shift(),e.onCompleted()),n()}))}var s,u,c=i,a=e,h=[],l=new Ye,f=0;return s=new Qe(l),u=new tn(s),h.push(new pr),t.onNext(Me(h[0],u)),n(),s.add(o.subscribe(function(t){var e,n;for(e=0;h.length>e;e++)n=h[e],n.onNext(t)},function(e){var n,r;for(n=0;h.length>n;n++)r=h[n],r.onError(e);t.onError(e)},function(){var e,n;for(e=0;h.length>e;e++)n=h[e],n.onCompleted();t.onCompleted()})),u})},xn.windowWithTimeOrCount=function(t,e,n){var r=this;return n||(n=hn),new hr(function(i){var o,s,u,c,a=0,h=new Ye,l=0;return s=new Qe(h),u=new tn(s),o=function(e){var r=new Ge;h.setDisposable(r),r.setDisposable(n.scheduleWithRelative(t,function(){var t;e===l&&(a=0,t=++l,c.onCompleted(),c=new pr,i.onNext(Me(c,u)),o(t))}))},c=new pr,i.onNext(Me(c,u)),o(0),s.add(r.subscribe(function(t){var n=0,r=!1;c.onNext(t),a++,a===e&&(r=!0,a=0,n=++l,c.onCompleted(),c=new pr,i.onNext(Me(c,u))),r&&o(n)},function(t){c.onError(t),i.onError(t)},function(){c.onCompleted(),i.onCompleted()})),u})},xn.bufferWithTime=function(){return this.windowWithTime.apply(this,arguments).selectMany(function(t){return t.toArray()})},xn.bufferWithTimeOrCount=function(t,e,n){return this.windowWithTimeOrCount(t,e,n).selectMany(function(t){return t.toArray()})},xn.timeInterval=function(t){var e=this;return t||(t=hn),Wn(function(){var n=t.now();return e.select(function(e){var r=t.now(),i=r-n;return n=r,{value:e,interval:i}})})},xn.timestamp=function(t){return t||(t=hn),this.select(function(e){return{value:e,timestamp:t.now()}})},xn.sample=function(t,e){return e||(e=hn),"number"==typeof t?K(this,cr(t,e)):K(this,t)},xn.timeout=function(t,e,n){e||(e=Pn(Error("Timeout"))),n||(n=hn);var r=this,i=t instanceof Date?"scheduleWithAbsolute":"scheduleWithRelative";return new hr(function(o){var s=0,u=new Ge,c=new Ye,a=!1,h=new Ye;c.setDisposable(u);var l=function(){var r=s;h.setDisposable(n[i](t,function(){s===r&&(ae(e)&&(e=On(e)),c.setDisposable(e.subscribe(o)))}))};return l(),u.setDisposable(r.subscribe(function(t){a||(s++,o.onNext(t),l())},function(t){a||(s++,o.onError(t))},function(){a||(s++,o.onCompleted())})),new Qe(c,h)})},_n.generateWithAbsoluteTime=function(e,n,r,i,o,s){return s||(s=hn),new hr(function(u){var c,a,h=!0,l=!1,f=e;return s.scheduleRecursiveWithAbsolute(s.now(),function(e){l&&u.onNext(c);try{h?h=!1:f=r(f),l=n(f),l&&(c=i(f),a=o(f))}catch(s){return u.onError(s),t}l?e(a):u.onCompleted()})})},_n.generateWithRelativeTime=function(e,n,r,i,o,s){return s||(s=hn),new hr(function(u){var c,a,h=!0,l=!1,f=e;return s.scheduleRecursiveWithRelative(0,function(e){l&&u.onNext(c);try{h?h=!1:f=r(f),l=n(f),l&&(c=i(f),a=o(f))}catch(s){return u.onError(s),t}l?e(a):u.onCompleted()})})},xn.delaySubscription=function(t,e){return e||(e=hn),this.delayWithSelector(ar(t,e),function(){return jn()})},xn.delayWithSelector=function(e,n){var r,i,o=this;return"function"==typeof e?i=e:(r=e,i=n),new hr(function(e){var n=new Qe,s=!1,u=function(){s&&0===n.length&&e.onCompleted()},c=new Ye,a=function(){c.setDisposable(o.subscribe(function(r){var o;try{o=i(r)}catch(s){return e.onError(s),t}var c=new Ge;n.add(c),c.setDisposable(o.subscribe(function(){e.onNext(r),n.remove(c),u()},e.onError.bind(e),function(){e.onNext(r),n.remove(c),u()}))},e.onError.bind(e),function(){s=!0,c.dispose(),u()}))};return r?c.setDisposable(r.subscribe(function(){a()},e.onError.bind(e),function(){a()})):a(),new Qe(c,n)})},xn.timeoutWithSelector=function(e,n,r){if(1===arguments.length){n=e;var e=Rn()}r||(r=Pn(Error("Timeout")));var i=this;return new hr(function(o){var s=new Ye,u=new Ye,c=new Ge;s.setDisposable(c);var a=0,h=!1,l=function(t){var e=a,n=function(){return a===e},i=new Ge;u.setDisposable(i),i.setDisposable(t.subscribe(function(){n()&&s.setDisposable(r.subscribe(o)),i.dispose()},function(t){n()&&o.onError(t)},function(){n()&&s.setDisposable(r.subscribe(o))}))};l(e);var f=function(){var t=!h;return t&&a++,t};return c.setDisposable(i.subscribe(function(e){if(f()){o.onNext(e);var r;try{r=n(e)}catch(i){return o.onError(i),t}l(r)}},function(t){f()&&o.onError(t)},function(){f()&&o.onCompleted()})),new Qe(s,u)})},xn.throttleWithSelector=function(e){var n=this;return new hr(function(r){var i,o=!1,s=new Ye,u=0,c=n.subscribe(function(n){var c;try{c=e(n)}catch(a){return r.onError(a),t}o=!0,i=n,u++;var h=u,l=new Ge;s.setDisposable(l),l.setDisposable(c.subscribe(function(){o&&u===h&&r.onNext(i),o=!1,l.dispose()},r.onError.bind(r),function(){o&&u===h&&r.onNext(i),o=!1,l.dispose()}))},function(t){s.dispose(),r.onError(t),o=!1,u++},function(){s.dispose(),o&&r.onNext(i),r.onCompleted(),o=!1,u++});return new Qe(c,s)})},xn.skipLastWithTime=function(t,e){e||(e=hn);var n=this;return new hr(function(r){var i=[];return n.subscribe(function(n){var o=e.now();for(i.push({interval:o,value:n});i.length>0&&o-i[0].interval>=t;)r.onNext(i.shift().value)},r.onError.bind(r),function(){for(var n=e.now();i.length>0&&n-i[0].interval>=t;)r.onNext(i.shift().value);r.onCompleted()})})},xn.takeLastWithTime=function(t,e,n){return this.takeLastBufferWithTime(t,e).selectMany(function(t){return kn(t,n)})},xn.takeLastBufferWithTime=function(t,e){var n=this;return e||(e=hn),new hr(function(r){var i=[];return n.subscribe(function(n){var r=e.now();for(i.push({interval:r,value:n});i.length>0&&r-i[0].interval>=t;)i.shift()},r.onError.bind(r),function(){for(var n=e.now(),o=[];i.length>0;){var s=i.shift();t>=n-s.interval&&o.push(s.value)}r.onNext(o),r.onCompleted()})})},xn.takeWithTime=function(t,e){var n=this;return e||(e=hn),new hr(function(r){var i=e.scheduleWithRelative(t,function(){r.onCompleted()});return new Qe(i,n.subscribe(r))})},xn.skipWithTime=function(t,e){var n=this;return e||(e=hn),new hr(function(r){var i=!1,o=e.scheduleWithRelative(t,function(){i=!0}),s=n.subscribe(function(t){i&&r.onNext(t)},r.onError.bind(r),r.onCompleted.bind(r));return new Qe(o,s)})},xn.skipUntilWithTime=function(t,e){e||(e=hn);var n=this,r=t instanceof Date?"scheduleWithAbsolute":"scheduleWithRelative";return new hr(function(i){var o=!1;return new Qe(e[r](t,function(){o=!0}),n.subscribe(function(t){o&&i.onNext(t)},i.onError.bind(i),i.onCompleted.bind(i)))})},xn.takeUntilWithTime=function(t,e){e||(e=hn);var n=this,r=t instanceof Date?"scheduleWithAbsolute":"scheduleWithRelative";return new hr(function(i){return new Qe(e[r](t,function(){i.onCompleted()}),n.subscribe(i))})},xn.exclusive=function(){var t=this;return new hr(function(e){var n=!1,r=!1,i=new Ge,o=new Qe;return o.add(i),i.setDisposable(t.subscribe(function(t){if(!n){n=!0,ae(t)&&(t=On(t));var i=new Ge;o.add(i),i.setDisposable(t.subscribe(e.onNext.bind(e),e.onError.bind(e),function(){o.remove(i),n=!1,r&&1===o.length&&e.onCompleted()}))}},e.onError.bind(e),function(){r=!0,n||1!==o.length||e.onCompleted()})),o})},xn.exclusiveMap=function(e,n){var r=this;return new hr(function(i){var o=0,s=!1,u=!0,c=new Ge,a=new Qe;return a.add(c),c.setDisposable(r.subscribe(function(r){s||(s=!0,innerSubscription=new Ge,a.add(innerSubscription),ae(r)&&(r=On(r)),innerSubscription.setDisposable(r.subscribe(function(s){var u;try{u=e.call(n,s,o++,r)}catch(c){return i.onError(c),t}i.onNext(u)},i.onError.bind(i),function(){a.remove(innerSubscription),s=!1,u&&1===a.length&&i.onCompleted()})))},i.onError.bind(i),function(){u=!0,1!==a.length||s||i.onCompleted()})),a})},ee.VirtualTimeScheduler=function(t){function e(){throw Error("Not implemented")}function n(){return this.toDateTimeOffset(this.clock)}function r(t,e){return this.scheduleAbsoluteWithState(t,this.clock,e)}function i(t,e,n){return this.scheduleRelativeWithState(t,this.toRelative(e),n)}function o(t,e,n){return this.scheduleRelativeWithState(t,this.toRelative(e-this.now()),n)}function s(t,e){return e(),Xe}function u(e,s){this.clock=e,this.comparer=s,this.isEnabled=!1,this.queue=new He(1024),t.call(this,n,r,i,o)}ze(u,t);var c=u.prototype;return c.add=e,c.toDateTimeOffset=e,c.toRelative=e,c.schedulePeriodicWithState=function(t,e,n){var r=new sn(this,t,e,n);return r.start()},c.scheduleRelativeWithState=function(t,e,n){var r=this.add(this.clock,e);return this.scheduleAbsoluteWithState(t,r,n)},c.scheduleRelative=function(t,e){return this.scheduleRelativeWithState(e,t,s)},c.start=function(){var t;if(!this.isEnabled){this.isEnabled=!0;do t=this.getNext(),null!==t?(this.comparer(t.dueTime,this.clock)>0&&(this.clock=t.dueTime),t.invoke()):this.isEnabled=!1;while(this.isEnabled)}},c.stop=function(){this.isEnabled=!1},c.advanceTo=function(t){var e,n=this.comparer(this.clock,t);if(this.comparer(this.clock,t)>0)throw Error(le);if(0!==n&&!this.isEnabled){this.isEnabled=!0;do e=this.getNext(),null!==e&&0>=this.comparer(e.dueTime,t)?(this.comparer(e.dueTime,this.clock)>0&&(this.clock=e.dueTime),e.invoke()):this.isEnabled=!1;while(this.isEnabled);this.clock=t}},c.advanceBy=function(t){var e=this.add(this.clock,t),n=this.comparer(this.clock,e);if(n>0)throw Error(le);0!==n&&this.advanceTo(e)},c.sleep=function(t){var e=this.add(this.clock,t);if(this.comparer(this.clock,e)>=0)throw Error(le);this.clock=e},c.getNext=function(){for(var t;this.queue.length>0;){if(t=this.queue.peek(),!t.isCancelled())return t;this.queue.dequeue()}return null},c.scheduleAbsolute=function(t,e){return this.scheduleAbsoluteWithState(e,t,s)},c.scheduleAbsoluteWithState=function(t,e,n){var r=this,i=function(t,e){return r.queue.remove(o),n(t,e)},o=new en(r,t,i,e,r.comparer);return r.queue.enqueue(o),o.disposable},u}(rn),ee.HistoricalScheduler=function(t){function e(e,n){var r=null==e?0:e,i=n||se;t.call(this,r,i)}ze(e,t);var n=e.prototype;return n.add=function(t,e){return t+e},n.toDateTimeOffset=function(t){return new Date(t).getTime()},n.toRelative=function(t){return t},e}(ee.VirtualTimeScheduler);var hr=ee.AnonymousObservable=function(e){function n(e){return e===t?e=Xe:"function"==typeof e&&(e=Je(e)),e}function r(i){function o(t){var e=function(){try{r.setDisposable(n(i(r)))}catch(t){if(!r.fail(t))throw t}},r=new lr(t);return cn.scheduleRequired()?cn.schedule(e):e(),r}return this instanceof r?(e.call(this,o),t):new r(i)}return ze(r,e),r}(_n),lr=function(t){function e(e){t.call(this),this.observer=e,this.m=new Ge}ze(e,t);var n=e.prototype;return n.next=function(t){var e=!1;try{this.observer.onNext(t),e=!0}catch(n){throw n}finally{e||this.dispose()}},n.error=function(t){try{this.observer.onError(t)}catch(e){throw e}finally{this.dispose()}},n.completed=function(){try{this.observer.onCompleted()}catch(t){throw t}finally{this.dispose()}},n.setDisposable=function(t){this.m.setDisposable(t)},n.getDisposable=function(){return this.m.getDisposable()},n.disposable=function(t){return arguments.length?this.getDisposable():setDisposable(t)},n.dispose=function(){t.prototype.dispose.call(this),this.m.dispose()},e}(Cn),fr=function(t){function e(t){return this.underlyingObservable.subscribe(t)}function n(n,r,i){t.call(this,e),this.key=n,this.underlyingObservable=i?new hr(function(t){return new Qe(i.getDisposable(),r.subscribe(t))}):r}return ze(n,t),n}(_n),pr=ee.Subject=function(t){function n(t){return e.call(this),this.isStopped?this.exception?(t.onError(this.exception),Xe):(t.onCompleted(),Xe):(this.observers.push(t),new Jn(this,t))}function r(){t.call(this,n),this.isDisposed=!1,this.isStopped=!1,this.observers=[]}return ze(r,t),Le(r.prototype,gn,{hasObservers:function(){return this.observers.length>0},onCompleted:function(){if(e.call(this),!this.isStopped){var t=this.observers.slice(0);this.isStopped=!0;for(var n=0,r=t.length;r>n;n++)t[n].onCompleted();this.observers=[]}},onError:function(t){if(e.call(this),!this.isStopped){var n=this.observers.slice(0);this.isStopped=!0,this.exception=t;for(var r=0,i=n.length;i>r;r++)n[r].onError(t);this.observers=[]}},onNext:function(t){if(e.call(this),!this.isStopped)for(var n=this.observers.slice(0),r=0,i=n.length;i>r;r++)n[r].onNext(t)},dispose:function(){this.isDisposed=!0,this.observers=null}}),r.create=function(t,e){return new vr(t,e)},r}(_n),dr=ee.AsyncSubject=function(t){function n(t){if(e.call(this),!this.isStopped)return this.observers.push(t),new Jn(this,t);var n=this.exception,r=this.hasValue,i=this.value;return n?t.onError(n):r?(t.onNext(i),t.onCompleted()):t.onCompleted(),Xe}function r(){t.call(this,n),this.isDisposed=!1,this.isStopped=!1,this.value=null,this.hasValue=!1,this.observers=[],this.exception=null}return ze(r,t),Le(r.prototype,gn,{hasObservers:function(){return e.call(this),this.observers.length>0},onCompleted:function(){var t,n,r;if(e.call(this),!this.isStopped){this.isStopped=!0;var i=this.observers.slice(0),o=this.value,s=this.hasValue;if(s)for(n=0,r=i.length;r>n;n++)t=i[n],t.onNext(o),t.onCompleted();else for(n=0,r=i.length;r>n;n++)i[n].onCompleted();this.observers=[]}},onError:function(t){if(e.call(this),!this.isStopped){var n=this.observers.slice(0);this.isStopped=!0,this.exception=t;for(var r=0,i=n.length;i>r;r++)n[r].onError(t);this.observers=[]}},onNext:function(t){e.call(this),this.isStopped||(this.value=t,this.hasValue=!0)},dispose:function(){this.isDisposed=!0,this.observers=null,this.exception=null,this.value=null}}),r}(_n),vr=function(t){function e(t){return this.observable.subscribe(t)}function n(n,r){t.call(this,e),this.observer=n,this.observable=r}return ze(n,t),Le(n.prototype,gn,{onCompleted:function(){this.observer.onCompleted()},onError:function(t){this.observer.onError(t)},onNext:function(t){this.observer.onNext(t)}}),n}(_n);"function"==typeof define&&"object"==typeof define.amd&&define.amd?(X.Rx=ee,define(function(){return ee})):Z&&G?Y?(G.exports=ee).Rx=ee:Z.Rx=ee:X.Rx=ee}).call(this); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.all.js b/ajax/libs/rxjs/2.2.28/rx.all.js new file mode 100644 index 000000000..4666fa4c2 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.all.js @@ -0,0 +1,9235 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +;(function (undefined) { + + var objectTypes = { + 'boolean': false, + 'function': true, + 'object': true, + 'number': false, + 'string': false, + 'undefined': false + }; + + var root = (objectTypes[typeof window] && window) || this, + freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports, + freeModule = objectTypes[typeof module] && module && !module.nodeType && module, + moduleExports = freeModule && freeModule.exports === freeExports && freeExports, + freeGlobal = objectTypes[typeof global] && global; + + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) { + root = freeGlobal; + } + + var Rx = { + internals: {}, + config: { + Promise: root.Promise // Detect if promise exists + }, + helpers: { } + }; + + // Defaults + var noop = Rx.helpers.noop = function () { }, + identity = Rx.helpers.identity = function (x) { return x; }, + pluck = Rx.helpers.pluck = function (property) { return function (x) { return x[property]; }; }, + just = Rx.helpers.just = function (value) { return function () { return value; }; }, + defaultNow = Rx.helpers.defaultNow = Date.now, + defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); }, + defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); }, + defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); }, + defaultError = Rx.helpers.defaultError = function (err) { throw err; }, + isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.then === 'function' && p.then !== Rx.Observable.prototype.then; }, + asArray = Rx.helpers.asArray = function () { return Array.prototype.slice.call(arguments); }, + not = Rx.helpers.not = function (a) { return !a; }; + + // Errors + var sequenceContainsNoElements = 'Sequence contains no elements.'; + var argumentOutOfRange = 'Argument out of range'; + var objectDisposed = 'Object has been disposed'; + function checkDisposed() { if (this.isDisposed) { throw new Error(objectDisposed); } } + + // Shim in iterator support + var $iterator$ = (typeof Symbol === 'object' && Symbol.iterator) || + '_es6shim_iterator_'; + // Firefox ships a partial implementation using the name @@iterator. + // https://bugzilla.mozilla.org/show_bug.cgi?id=907077#c14 + // So use that name if we detect it. + if (root.Set && typeof new root.Set()['@@iterator'] === 'function') { + $iterator$ = '@@iterator'; + } + var doneEnumerator = { done: true, value: undefined }; + + /** `Object#toString` result shortcuts */ + var argsClass = '[object Arguments]', + arrayClass = '[object Array]', + boolClass = '[object Boolean]', + dateClass = '[object Date]', + errorClass = '[object Error]', + funcClass = '[object Function]', + numberClass = '[object Number]', + objectClass = '[object Object]', + regexpClass = '[object RegExp]', + stringClass = '[object String]'; + + var toString = Object.prototype.toString, + hasOwnProperty = Object.prototype.hasOwnProperty, + supportsArgsClass = toString.call(arguments) == argsClass, // For less -1); + } + }); + } + } + stackA.pop(); + stackB.pop(); + + return result; + } + var slice = Array.prototype.slice; + function argsOrArray(args, idx) { + return args.length === 1 && Array.isArray(args[idx]) ? + args[idx] : + slice.call(args); + } + var hasProp = {}.hasOwnProperty; + + /** @private */ + var inherits = this.inherits = Rx.internals.inherits = function (child, parent) { + function __() { this.constructor = child; } + __.prototype = parent.prototype; + child.prototype = new __(); + }; + + /** @private */ + var addProperties = Rx.internals.addProperties = function (obj) { + var sources = slice.call(arguments, 1); + for (var i = 0, len = sources.length; i < len; i++) { + var source = sources[i]; + for (var prop in source) { + obj[prop] = source[prop]; + } + } + }; + + // Rx Utils + var addRef = Rx.internals.addRef = function (xs, r) { + return new AnonymousObservable(function (observer) { + return new CompositeDisposable(r.getDisposable(), xs.subscribe(observer)); + }); + }; + + // Collection polyfills + function arrayInitialize(count, factory) { + var a = new Array(count); + for (var i = 0; i < count; i++) { + a[i] = factory(); + } + return a; + } + + // Collections + var IndexedItem = function (id, value) { + this.id = id; + this.value = value; + }; + + IndexedItem.prototype.compareTo = function (other) { + var c = this.value.compareTo(other.value); + if (c === 0) { + c = this.id - other.id; + } + return c; + }; + + // Priority Queue for Scheduling + var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) { + this.items = new Array(capacity); + this.length = 0; + }; + + var priorityProto = PriorityQueue.prototype; + priorityProto.isHigherPriority = function (left, right) { + return this.items[left].compareTo(this.items[right]) < 0; + }; + + priorityProto.percolate = function (index) { + if (index >= this.length || index < 0) { + return; + } + var parent = index - 1 >> 1; + if (parent < 0 || parent === index) { + return; + } + if (this.isHigherPriority(index, parent)) { + var temp = this.items[index]; + this.items[index] = this.items[parent]; + this.items[parent] = temp; + this.percolate(parent); + } + }; + + priorityProto.heapify = function (index) { + if (index === undefined) { + index = 0; + } + if (index >= this.length || index < 0) { + return; + } + var left = 2 * index + 1, + right = 2 * index + 2, + first = index; + if (left < this.length && this.isHigherPriority(left, first)) { + first = left; + } + if (right < this.length && this.isHigherPriority(right, first)) { + first = right; + } + if (first !== index) { + var temp = this.items[index]; + this.items[index] = this.items[first]; + this.items[first] = temp; + this.heapify(first); + } + }; + + priorityProto.peek = function () { return this.items[0].value; }; + + priorityProto.removeAt = function (index) { + this.items[index] = this.items[--this.length]; + delete this.items[this.length]; + this.heapify(); + }; + + priorityProto.dequeue = function () { + var result = this.peek(); + this.removeAt(0); + return result; + }; + + priorityProto.enqueue = function (item) { + var index = this.length++; + this.items[index] = new IndexedItem(PriorityQueue.count++, item); + this.percolate(index); + }; + + priorityProto.remove = function (item) { + for (var i = 0; i < this.length; i++) { + if (this.items[i].value === item) { + this.removeAt(i); + return true; + } + } + return false; + }; + PriorityQueue.count = 0; + /** + * Represents a group of disposable resources that are disposed together. + * @constructor + */ + var CompositeDisposable = Rx.CompositeDisposable = function () { + this.disposables = argsOrArray(arguments, 0); + this.isDisposed = false; + this.length = this.disposables.length; + }; + + var CompositeDisposablePrototype = CompositeDisposable.prototype; + + /** + * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed. + * @param {Mixed} item Disposable to add. + */ + CompositeDisposablePrototype.add = function (item) { + if (this.isDisposed) { + item.dispose(); + } else { + this.disposables.push(item); + this.length++; + } + }; + + /** + * Removes and disposes the first occurrence of a disposable from the CompositeDisposable. + * @param {Mixed} item Disposable to remove. + * @returns {Boolean} true if found; false otherwise. + */ + CompositeDisposablePrototype.remove = function (item) { + var shouldDispose = false; + if (!this.isDisposed) { + var idx = this.disposables.indexOf(item); + if (idx !== -1) { + shouldDispose = true; + this.disposables.splice(idx, 1); + this.length--; + item.dispose(); + } + + } + return shouldDispose; + }; + + /** + * Disposes all disposables in the group and removes them from the group. + */ + CompositeDisposablePrototype.dispose = function () { + if (!this.isDisposed) { + this.isDisposed = true; + var currentDisposables = this.disposables.slice(0); + this.disposables = []; + this.length = 0; + + for (var i = 0, len = currentDisposables.length; i < len; i++) { + currentDisposables[i].dispose(); + } + } + }; + + /** + * Removes and disposes all disposables from the CompositeDisposable, but does not dispose the CompositeDisposable. + */ + CompositeDisposablePrototype.clear = function () { + var currentDisposables = this.disposables.slice(0); + this.disposables = []; + this.length = 0; + for (var i = 0, len = currentDisposables.length; i < len; i++) { + currentDisposables[i].dispose(); + } + }; + + /** + * Determines whether the CompositeDisposable contains a specific disposable. + * @param {Mixed} item Disposable to search for. + * @returns {Boolean} true if the disposable was found; otherwise, false. + */ + CompositeDisposablePrototype.contains = function (item) { + return this.disposables.indexOf(item) !== -1; + }; + + /** + * Converts the existing CompositeDisposable to an array of disposables + * @returns {Array} An array of disposable objects. + */ + CompositeDisposablePrototype.toArray = function () { + return this.disposables.slice(0); + }; + + /** + * Provides a set of static methods for creating Disposables. + * + * @constructor + * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once. + */ + var Disposable = Rx.Disposable = function (action) { + this.isDisposed = false; + this.action = action || noop; + }; + + /** Performs the task of cleaning up resources. */ + Disposable.prototype.dispose = function () { + if (!this.isDisposed) { + this.action(); + this.isDisposed = true; + } + }; + + /** + * Creates a disposable object that invokes the specified action when disposed. + * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once. + * @return {Disposable} The disposable object that runs the given action upon disposal. + */ + var disposableCreate = Disposable.create = function (action) { return new Disposable(action); }; + + /** + * Gets the disposable that does nothing when disposed. + */ + var disposableEmpty = Disposable.empty = { dispose: noop }; + + var BooleanDisposable = (function () { + function BooleanDisposable (isSingle) { + this.isSingle = isSingle; + this.isDisposed = false; + this.current = null; + } + + var booleanDisposablePrototype = BooleanDisposable.prototype; + + /** + * Gets the underlying disposable. + * @return The underlying disposable. + */ + booleanDisposablePrototype.getDisposable = function () { + return this.current; + }; + + /** + * Sets the underlying disposable. + * @param {Disposable} value The new underlying disposable. + */ + booleanDisposablePrototype.setDisposable = function (value) { + if (this.current && this.isSingle) { + throw new Error('Disposable has already been assigned'); + } + + var shouldDispose = this.isDisposed, old; + if (!shouldDispose) { + old = this.current; + this.current = value; + } + if (old) { + old.dispose(); + } + if (shouldDispose && value) { + value.dispose(); + } + }; + + /** + * Disposes the underlying disposable as well as all future replacements. + */ + booleanDisposablePrototype.dispose = function () { + var old; + if (!this.isDisposed) { + this.isDisposed = true; + old = this.current; + this.current = null; + } + if (old) { + old.dispose(); + } + }; + + return BooleanDisposable; + }()); + + /** + * Represents a disposable resource which only allows a single assignment of its underlying disposable resource. + * If an underlying disposable resource has already been set, future attempts to set the underlying disposable resource will throw an Error. + */ + var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = (function (super_) { + inherits(SingleAssignmentDisposable, super_); + + function SingleAssignmentDisposable() { + super_.call(this, true); + } + + return SingleAssignmentDisposable; + }(BooleanDisposable)); + + /** + * Represents a disposable resource whose underlying disposable resource can be replaced by another disposable resource, causing automatic disposal of the previous underlying disposable resource. + */ + var SerialDisposable = Rx.SerialDisposable = (function (super_) { + inherits(SerialDisposable, super_); + + function SerialDisposable() { + super_.call(this, false); + } + + return SerialDisposable; + }(BooleanDisposable)); + + /** + * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed. + */ + var RefCountDisposable = Rx.RefCountDisposable = (function () { + + function InnerDisposable(disposable) { + this.disposable = disposable; + this.disposable.count++; + this.isInnerDisposed = false; + } + + InnerDisposable.prototype.dispose = function () { + if (!this.disposable.isDisposed) { + if (!this.isInnerDisposed) { + this.isInnerDisposed = true; + this.disposable.count--; + if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) { + this.disposable.isDisposed = true; + this.disposable.underlyingDisposable.dispose(); + } + } + } + }; + + /** + * Initializes a new instance of the RefCountDisposable with the specified disposable. + * @constructor + * @param {Disposable} disposable Underlying disposable. + */ + function RefCountDisposable(disposable) { + this.underlyingDisposable = disposable; + this.isDisposed = false; + this.isPrimaryDisposed = false; + this.count = 0; + } + + /** + * Disposes the underlying disposable only when all dependent disposables have been disposed + */ + RefCountDisposable.prototype.dispose = function () { + if (!this.isDisposed) { + if (!this.isPrimaryDisposed) { + this.isPrimaryDisposed = true; + if (this.count === 0) { + this.isDisposed = true; + this.underlyingDisposable.dispose(); + } + } + } + }; + + /** + * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable. + * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime. + */ + RefCountDisposable.prototype.getDisposable = function () { + return this.isDisposed ? disposableEmpty : new InnerDisposable(this); + }; + + return RefCountDisposable; + })(); + + function ScheduledDisposable(scheduler, disposable) { + this.scheduler = scheduler; + this.disposable = disposable; + this.isDisposed = false; + } + + ScheduledDisposable.prototype.dispose = function () { + var parent = this; + this.scheduler.schedule(function () { + if (!parent.isDisposed) { + parent.isDisposed = true; + parent.disposable.dispose(); + } + }); + }; + + var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) { + this.scheduler = scheduler; + this.state = state; + this.action = action; + this.dueTime = dueTime; + this.comparer = comparer || defaultSubComparer; + this.disposable = new SingleAssignmentDisposable(); + } + + ScheduledItem.prototype.invoke = function () { + this.disposable.setDisposable(this.invokeCore()); + }; + + ScheduledItem.prototype.compareTo = function (other) { + return this.comparer(this.dueTime, other.dueTime); + }; + + ScheduledItem.prototype.isCancelled = function () { + return this.disposable.isDisposed; + }; + + ScheduledItem.prototype.invokeCore = function () { + return this.action(this.scheduler, this.state); + }; + + /** Provides a set of static properties to access commonly used schedulers. */ + var Scheduler = Rx.Scheduler = (function () { + + /** + * @constructor + * @private + */ + function Scheduler(now, schedule, scheduleRelative, scheduleAbsolute) { + this.now = now; + this._schedule = schedule; + this._scheduleRelative = scheduleRelative; + this._scheduleAbsolute = scheduleAbsolute; + } + + function invokeRecImmediate(scheduler, pair) { + var state = pair.first, action = pair.second, group = new CompositeDisposable(), + recursiveAction = function (state1) { + action(state1, function (state2) { + var isAdded = false, isDone = false, + d = scheduler.scheduleWithState(state2, function (scheduler1, state3) { + if (isAdded) { + group.remove(d); + } else { + isDone = true; + } + recursiveAction(state3); + return disposableEmpty; + }); + if (!isDone) { + group.add(d); + isAdded = true; + } + }); + }; + recursiveAction(state); + return group; + } + + function invokeRecDate(scheduler, pair, method) { + var state = pair.first, action = pair.second, group = new CompositeDisposable(), + recursiveAction = function (state1) { + action(state1, function (state2, dueTime1) { + var isAdded = false, isDone = false, + d = scheduler[method].call(scheduler, state2, dueTime1, function (scheduler1, state3) { + if (isAdded) { + group.remove(d); + } else { + isDone = true; + } + recursiveAction(state3); + return disposableEmpty; + }); + if (!isDone) { + group.add(d); + isAdded = true; + } + }); + }; + recursiveAction(state); + return group; + } + + function invokeAction(scheduler, action) { + action(); + return disposableEmpty; + } + + var schedulerProto = Scheduler.prototype; + + /** + * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions. + * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false. + * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling. + */ + schedulerProto.catchException = schedulerProto['catch'] = function (handler) { + return new CatchScheduler(this, handler); + }; + + /** + * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation. + * @param {Number} period Period for running the work periodically. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort). + */ + schedulerProto.schedulePeriodic = function (period, action) { + return this.schedulePeriodicWithState(null, period, function () { + action(); + }); + }; + + /** + * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation. + * @param {Mixed} state Initial state passed to the action upon the first iteration. + * @param {Number} period Period for running the work periodically. + * @param {Function} action Action to be executed, potentially updating the state. + * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort). + */ + schedulerProto.schedulePeriodicWithState = function (state, period, action) { + var s = state, id = setInterval(function () { + s = action(s); + }, period); + return disposableCreate(function () { + clearInterval(id); + }); + }; + + /** + * Schedules an action to be executed. + * @param {Function} action Action to execute. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.schedule = function (action) { + return this._schedule(action, invokeAction); + }; + + /** + * Schedules an action to be executed. + * @param state State passed to the action to be executed. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithState = function (state, action) { + return this._schedule(state, action); + }; + + /** + * Schedules an action to be executed after the specified relative due time. + * @param {Function} action Action to execute. + * @param {Number} dueTime Relative time after which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithRelative = function (dueTime, action) { + return this._scheduleRelative(action, dueTime, invokeAction); + }; + + /** + * Schedules an action to be executed after dueTime. + * @param state State passed to the action to be executed. + * @param {Function} action Action to be executed. + * @param {Number} dueTime Relative time after which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithRelativeAndState = function (state, dueTime, action) { + return this._scheduleRelative(state, dueTime, action); + }; + + /** + * Schedules an action to be executed at the specified absolute due time. + * @param {Function} action Action to execute. + * @param {Number} dueTime Absolute time at which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithAbsolute = function (dueTime, action) { + return this._scheduleAbsolute(action, dueTime, invokeAction); + }; + + /** + * Schedules an action to be executed at dueTime. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to be executed. + * @param {Number}dueTime Absolute time at which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithAbsoluteAndState = function (state, dueTime, action) { + return this._scheduleAbsolute(state, dueTime, action); + }; + + /** + * Schedules an action to be executed recursively. + * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursive = function (action) { + return this.scheduleRecursiveWithState(action, function (_action, self) { + _action(function () { + self(_action); + }); + }); + }; + + /** + * Schedules an action to be executed recursively. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithState = function (state, action) { + return this.scheduleWithState({ first: state, second: action }, function (s, p) { + return invokeRecImmediate(s, p); + }); + }; + + /** + * Schedules an action to be executed recursively after a specified relative due time. + * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified relative time. + * @param {Number}dueTime Relative time after which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithRelative = function (dueTime, action) { + return this.scheduleRecursiveWithRelativeAndState(action, dueTime, function (_action, self) { + _action(function (dt) { + self(_action, dt); + }); + }); + }; + + /** + * Schedules an action to be executed recursively after a specified relative due time. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state. + * @param {Number}dueTime Relative time after which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithRelativeAndState = function (state, dueTime, action) { + return this._scheduleRelative({ first: state, second: action }, dueTime, function (s, p) { + return invokeRecDate(s, p, 'scheduleWithRelativeAndState'); + }); + }; + + /** + * Schedules an action to be executed recursively at a specified absolute due time. + * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified absolute time. + * @param {Number}dueTime Absolute time at which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithAbsolute = function (dueTime, action) { + return this.scheduleRecursiveWithAbsoluteAndState(action, dueTime, function (_action, self) { + _action(function (dt) { + self(_action, dt); + }); + }); + }; + + /** + * Schedules an action to be executed recursively at a specified absolute due time. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state. + * @param {Number}dueTime Absolute time at which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithAbsoluteAndState = function (state, dueTime, action) { + return this._scheduleAbsolute({ first: state, second: action }, dueTime, function (s, p) { + return invokeRecDate(s, p, 'scheduleWithAbsoluteAndState'); + }); + }; + + /** Gets the current time according to the local machine's system clock. */ + Scheduler.now = defaultNow; + + /** + * Normalizes the specified TimeSpan value to a positive value. + * @param {Number} timeSpan The time span value to normalize. + * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0 + */ + Scheduler.normalize = function (timeSpan) { + if (timeSpan < 0) { + timeSpan = 0; + } + return timeSpan; + }; + + return Scheduler; + }()); + + var normalizeTime = Scheduler.normalize; + + var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () { + function tick(command, recurse) { + recurse(0, this._period); + try { + this._state = this._action(this._state); + } catch (e) { + this._cancel.dispose(); + throw e; + } + } + + function SchedulePeriodicRecursive(scheduler, state, period, action) { + this._scheduler = scheduler; + this._state = state; + this._period = period; + this._action = action; + } + + SchedulePeriodicRecursive.prototype.start = function () { + var d = new SingleAssignmentDisposable(); + this._cancel = d; + d.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0, this._period, tick.bind(this))); + + return d; + }; + + return SchedulePeriodicRecursive; + }()); + + /** + * Gets a scheduler that schedules work immediately on the current thread. + */ + var immediateScheduler = Scheduler.immediate = (function () { + + function scheduleNow(state, action) { return action(this, state); } + + function scheduleRelative(state, dueTime, action) { + var dt = normalizeTime(dt); + while (dt - this.now() > 0) { } + return action(this, state); + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); + } + + return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); + }()); + + /** + * Gets a scheduler that schedules work as soon as possible on the current thread. + */ + var currentThreadScheduler = Scheduler.currentThread = (function () { + var queue; + + function runTrampoline (q) { + var item; + while (q.length > 0) { + item = q.dequeue(); + if (!item.isCancelled()) { + // Note, do not schedule blocking work! + while (item.dueTime - Scheduler.now() > 0) { + } + if (!item.isCancelled()) { + item.invoke(); + } + } + } + } + + function scheduleNow(state, action) { + return this.scheduleWithRelativeAndState(state, 0, action); + } + + function scheduleRelative(state, dueTime, action) { + var dt = this.now() + Scheduler.normalize(dueTime), + si = new ScheduledItem(this, state, action, dt), + t; + if (!queue) { + queue = new PriorityQueue(4); + queue.enqueue(si); + try { + runTrampoline(queue); + } catch (e) { + throw e; + } finally { + queue = null; + } + } else { + queue.enqueue(si); + } + return si.disposable; + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); + } + + var currentScheduler = new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); + currentScheduler.scheduleRequired = function () { return queue === null; }; + currentScheduler.ensureTrampoline = function (action) { + if (queue === null) { + return this.schedule(action); + } else { + return action(); + } + }; + + return currentScheduler; + }()); + + + var scheduleMethod, clearMethod = noop; + (function () { + + var reNative = RegExp('^' + + String(toString) + .replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + .replace(/toString| for [^\]]+/g, '.*?') + '$' + ); + + var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' && + !reNative.test(setImmediate) && setImmediate, + clearImmediate = typeof (clearImmediate = freeGlobal && moduleExports && freeGlobal.clearImmediate) == 'function' && + !reNative.test(clearImmediate) && clearImmediate; + + function postMessageSupported () { + // Ensure not in a worker + if (!root.postMessage || root.importScripts) { return false; } + var isAsync = false, + oldHandler = root.onmessage; + // Test for async + root.onmessage = function () { isAsync = true; }; + root.postMessage('','*'); + root.onmessage = oldHandler; + + return isAsync; + } + + // Use in order, nextTick, setImmediate, postMessage, MessageChannel, script readystatechanged, setTimeout + if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') { + scheduleMethod = process.nextTick; + } else if (typeof setImmediate === 'function') { + scheduleMethod = setImmediate; + clearMethod = clearImmediate; + } else if (postMessageSupported()) { + var MSG_PREFIX = 'ms.rx.schedule' + Math.random(), + tasks = {}, + taskId = 0; + + function onGlobalPostMessage(event) { + // Only if we're a match to avoid any other global events + if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) { + var handleId = event.data.substring(MSG_PREFIX.length), + action = tasks[handleId]; + action(); + delete tasks[handleId]; + } + } + + if (root.addEventListener) { + root.addEventListener('message', onGlobalPostMessage, false); + } else { + root.attachEvent('onmessage', onGlobalPostMessage, false); + } + + scheduleMethod = function (action) { + var currentId = taskId++; + tasks[currentId] = action; + root.postMessage(MSG_PREFIX + currentId, '*'); + }; + } else if (!!root.MessageChannel) { + var channel = new root.MessageChannel(), + channelTasks = {}, + channelTaskId = 0; + + channel.port1.onmessage = function (event) { + var id = event.data, + action = channelTasks[id]; + action(); + delete channelTasks[id]; + }; + + scheduleMethod = function (action) { + var id = channelTaskId++; + channelTasks[id] = action; + channel.port2.postMessage(id); + }; + } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) { + + scheduleMethod = function (action) { + var scriptElement = root.document.createElement('script'); + scriptElement.onreadystatechange = function () { + action(); + scriptElement.onreadystatechange = null; + scriptElement.parentNode.removeChild(scriptElement); + scriptElement = null; + }; + root.document.documentElement.appendChild(scriptElement); + }; + + } else { + scheduleMethod = function (action) { return setTimeout(action, 0); }; + clearMethod = clearTimeout; + } + }()); + + /** + * Gets a scheduler that schedules work via a timed callback based upon platform. + */ + var timeoutScheduler = Scheduler.timeout = (function () { + + function scheduleNow(state, action) { + var scheduler = this, + disposable = new SingleAssignmentDisposable(); + var id = scheduleMethod(function () { + if (!disposable.isDisposed) { + disposable.setDisposable(action(scheduler, state)); + } + }); + return new CompositeDisposable(disposable, disposableCreate(function () { + clearMethod(id); + })); + } + + function scheduleRelative(state, dueTime, action) { + var scheduler = this, + dt = Scheduler.normalize(dueTime); + if (dt === 0) { + return scheduler.scheduleWithState(state, action); + } + var disposable = new SingleAssignmentDisposable(); + var id = setTimeout(function () { + if (!disposable.isDisposed) { + disposable.setDisposable(action(scheduler, state)); + } + }, dt); + return new CompositeDisposable(disposable, disposableCreate(function () { + clearTimeout(id); + })); + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); + } + + return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); + })(); + + /** @private */ + var CatchScheduler = (function (_super) { + + function localNow() { + return this._scheduler.now(); + } + + function scheduleNow(state, action) { + return this._scheduler.scheduleWithState(state, this._wrap(action)); + } + + function scheduleRelative(state, dueTime, action) { + return this._scheduler.scheduleWithRelativeAndState(state, dueTime, this._wrap(action)); + } + + function scheduleAbsolute(state, dueTime, action) { + return this._scheduler.scheduleWithAbsoluteAndState(state, dueTime, this._wrap(action)); + } + + inherits(CatchScheduler, _super); + + /** @private */ + function CatchScheduler(scheduler, handler) { + this._scheduler = scheduler; + this._handler = handler; + this._recursiveOriginal = null; + this._recursiveWrapper = null; + _super.call(this, localNow, scheduleNow, scheduleRelative, scheduleAbsolute); + } + + /** @private */ + CatchScheduler.prototype._clone = function (scheduler) { + return new CatchScheduler(scheduler, this._handler); + }; + + /** @private */ + CatchScheduler.prototype._wrap = function (action) { + var parent = this; + return function (self, state) { + try { + return action(parent._getRecursiveWrapper(self), state); + } catch (e) { + if (!parent._handler(e)) { throw e; } + return disposableEmpty; + } + }; + }; + + /** @private */ + CatchScheduler.prototype._getRecursiveWrapper = function (scheduler) { + if (this._recursiveOriginal !== scheduler) { + this._recursiveOriginal = scheduler; + var wrapper = this._clone(scheduler); + wrapper._recursiveOriginal = scheduler; + wrapper._recursiveWrapper = wrapper; + this._recursiveWrapper = wrapper; + } + return this._recursiveWrapper; + }; + + /** @private */ + CatchScheduler.prototype.schedulePeriodicWithState = function (state, period, action) { + var self = this, failed = false, d = new SingleAssignmentDisposable(); + + d.setDisposable(this._scheduler.schedulePeriodicWithState(state, period, function (state1) { + if (failed) { return null; } + try { + return action(state1); + } catch (e) { + failed = true; + if (!self._handler(e)) { throw e; } + d.dispose(); + return null; + } + })); + + return d; + }; + + return CatchScheduler; + }(Scheduler)); + + /** + * Represents a notification to an observer. + */ + var Notification = Rx.Notification = (function () { + function Notification(kind, hasValue) { + this.hasValue = hasValue == null ? false : hasValue; + this.kind = kind; + } + + var NotificationPrototype = Notification.prototype; + + /** + * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result. + * + * @memberOf Notification + * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on.. + * @param {Function} onError Delegate to invoke for an OnError notification. + * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification. + * @returns {Any} Result produced by the observation. + */ + NotificationPrototype.accept = function (observerOrOnNext, onError, onCompleted) { + if (arguments.length === 1 && typeof observerOrOnNext === 'object') { + return this._acceptObservable(observerOrOnNext); + } + return this._accept(observerOrOnNext, onError, onCompleted); + }; + + /** + * Returns an observable sequence with a single notification. + * + * @memberOf Notification + * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on. + * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription. + */ + NotificationPrototype.toObservable = function (scheduler) { + var notification = this; + scheduler || (scheduler = immediateScheduler); + return new AnonymousObservable(function (observer) { + return scheduler.schedule(function () { + notification._acceptObservable(observer); + if (notification.kind === 'N') { + observer.onCompleted(); + } + }); + }); + }; + + return Notification; + })(); + + /** + * Creates an object that represents an OnNext notification to an observer. + * @param {Any} value The value contained in the notification. + * @returns {Notification} The OnNext notification containing the value. + */ + var notificationCreateOnNext = Notification.createOnNext = (function () { + + function _accept (onNext) { + return onNext(this.value); + } + + function _acceptObservable(observer) { + return observer.onNext(this.value); + } + + function toString () { + return 'OnNext(' + this.value + ')'; + } + + return function (value) { + var notification = new Notification('N', true); + notification.value = value; + notification._accept = _accept; + notification._acceptObservable = _acceptObservable; + notification.toString = toString; + return notification; + }; + }()); + + /** + * Creates an object that represents an OnError notification to an observer. + * @param {Any} error The exception contained in the notification. + * @returns {Notification} The OnError notification containing the exception. + */ + var notificationCreateOnError = Notification.createOnError = (function () { + + function _accept (onNext, onError) { + return onError(this.exception); + } + + function _acceptObservable(observer) { + return observer.onError(this.exception); + } + + function toString () { + return 'OnError(' + this.exception + ')'; + } + + return function (exception) { + var notification = new Notification('E'); + notification.exception = exception; + notification._accept = _accept; + notification._acceptObservable = _acceptObservable; + notification.toString = toString; + return notification; + }; + }()); + + /** + * Creates an object that represents an OnCompleted notification to an observer. + * @returns {Notification} The OnCompleted notification. + */ + var notificationCreateOnCompleted = Notification.createOnCompleted = (function () { + + function _accept (onNext, onError, onCompleted) { + return onCompleted(); + } + + function _acceptObservable(observer) { + return observer.onCompleted(); + } + + function toString () { + return 'OnCompleted()'; + } + + return function () { + var notification = new Notification('C'); + notification._accept = _accept; + notification._acceptObservable = _acceptObservable; + notification.toString = toString; + return notification; + }; + }()); + + var Enumerator = Rx.internals.Enumerator = function (next) { + this._next = next; + }; + + Enumerator.prototype.next = function () { + return this._next(); + }; + + Enumerator.prototype[$iterator$] = function () { return this; } + + var Enumerable = Rx.internals.Enumerable = function (iterator) { + this._iterator = iterator; + }; + + Enumerable.prototype[$iterator$] = function () { + return this._iterator(); + }; + + Enumerable.prototype.concat = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var e; + try { + e = sources[$iterator$](); + } catch(err) { + observer.onError(); + return; + } + + var isDisposed, + subscription = new SerialDisposable(); + var cancelable = immediateScheduler.scheduleRecursive(function (self) { + var currentItem; + if (isDisposed) { return; } + + try { + currentItem = e.next(); + } catch (ex) { + observer.onError(ex); + return; + } + + if (currentItem.done) { + observer.onCompleted(); + return; + } + + // Check if promise + var currentValue = currentItem.value; + isPromise(currentValue) && (currentValue = observableFromPromise(currentValue)); + + var d = new SingleAssignmentDisposable(); + subscription.setDisposable(d); + d.setDisposable(currentValue.subscribe( + observer.onNext.bind(observer), + observer.onError.bind(observer), + function () { self(); }) + ); + }); + + return new CompositeDisposable(subscription, cancelable, disposableCreate(function () { + isDisposed = true; + })); + }); + }; + + Enumerable.prototype.catchException = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var e; + try { + e = sources[$iterator$](); + } catch(err) { + observer.onError(); + return; + } + + var isDisposed, + lastException, + subscription = new SerialDisposable(); + var cancelable = immediateScheduler.scheduleRecursive(function (self) { + if (isDisposed) { return; } + + var currentItem; + try { + currentItem = e.next(); + } catch (ex) { + observer.onError(ex); + return; + } + + if (currentItem.done) { + if (lastException) { + observer.onError(lastException); + } else { + observer.onCompleted(); + } + return; + } + + // Check if promise + var currentValue = currentItem.value; + isPromise(currentValue) && (currentValue = observableFromPromise(currentValue)); + + var d = new SingleAssignmentDisposable(); + subscription.setDisposable(d); + d.setDisposable(currentValue.subscribe( + observer.onNext.bind(observer), + function (exn) { + lastException = exn; + self(); + }, + observer.onCompleted.bind(observer))); + }); + return new CompositeDisposable(subscription, cancelable, disposableCreate(function () { + isDisposed = true; + })); + }); + }; + + var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) { + if (repeatCount == null) { repeatCount = -1; } + return new Enumerable(function () { + var left = repeatCount; + return new Enumerator(function () { + if (left === 0) { return doneEnumerator; } + if (left > 0) { left--; } + return { done: false, value: value }; + }); + }); + }; + + var enumerableFor = Enumerable.forEach = function (source, selector, thisArg) { + selector || (selector = identity); + return new Enumerable(function () { + var index = -1; + return new Enumerator( + function () { + return ++index < source.length ? + { done: false, value: selector.call(thisArg, source[index], index, source) } : + doneEnumerator; + }); + }); + }; + + /** + * Supports push-style iteration over an observable sequence. + */ + var Observer = Rx.Observer = function () { }; + + /** + * Creates a notification callback from an observer. + * + * @param observer Observer object. + * @returns The action that forwards its input notification to the underlying observer. + */ + Observer.prototype.toNotifier = function () { + var observer = this; + return function (n) { + return n.accept(observer); + }; + }; + + /** + * Hides the identity of an observer. + + * @returns An observer that hides the identity of the specified observer. + */ + Observer.prototype.asObserver = function () { + return new AnonymousObserver(this.onNext.bind(this), this.onError.bind(this), this.onCompleted.bind(this)); + }; + + /** + * Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods. + * If a violation is detected, an Error is thrown from the offending observer method call. + * + * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer. + */ + Observer.prototype.checked = function () { return new CheckedObserver(this); }; + + /** + * Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions. + * + * @static + * @memberOf Observer + * @param {Function} [onNext] Observer's OnNext action implementation. + * @param {Function} [onError] Observer's OnError action implementation. + * @param {Function} [onCompleted] Observer's OnCompleted action implementation. + * @returns {Observer} The observer object implemented using the given actions. + */ + var observerCreate = Observer.create = function (onNext, onError, onCompleted) { + onNext || (onNext = noop); + onError || (onError = defaultError); + onCompleted || (onCompleted = noop); + return new AnonymousObserver(onNext, onError, onCompleted); + }; + + /** + * Creates an observer from a notification callback. + * + * @static + * @memberOf Observer + * @param {Function} handler Action that handles a notification. + * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives. + */ + Observer.fromNotifier = function (handler) { + return new AnonymousObserver(function (x) { + return handler(notificationCreateOnNext(x)); + }, function (exception) { + return handler(notificationCreateOnError(exception)); + }, function () { + return handler(notificationCreateOnCompleted()); + }); + }; + + /** + * Schedules the invocation of observer methods on the given scheduler. + * @param {Scheduler} scheduler Scheduler to schedule observer messages on. + * @returns {Observer} Observer whose messages are scheduled on the given scheduler. + */ + Observer.notifyOn = function (scheduler) { + return new ObserveOnObserver(scheduler, this); + }; + + /** + * Abstract base class for implementations of the Observer class. + * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages. + */ + var AbstractObserver = Rx.internals.AbstractObserver = (function (_super) { + inherits(AbstractObserver, _super); + + /** + * Creates a new observer in a non-stopped state. + * + * @constructor + */ + function AbstractObserver() { + this.isStopped = false; + _super.call(this); + } + + /** + * Notifies the observer of a new element in the sequence. + * + * @memberOf AbstractObserver + * @param {Any} value Next element in the sequence. + */ + AbstractObserver.prototype.onNext = function (value) { + if (!this.isStopped) { + this.next(value); + } + }; + + /** + * Notifies the observer that an exception has occurred. + * + * @memberOf AbstractObserver + * @param {Any} error The error that has occurred. + */ + AbstractObserver.prototype.onError = function (error) { + if (!this.isStopped) { + this.isStopped = true; + this.error(error); + } + }; + + /** + * Notifies the observer of the end of the sequence. + */ + AbstractObserver.prototype.onCompleted = function () { + if (!this.isStopped) { + this.isStopped = true; + this.completed(); + } + }; + + /** + * Disposes the observer, causing it to transition to the stopped state. + */ + AbstractObserver.prototype.dispose = function () { + this.isStopped = true; + }; + + AbstractObserver.prototype.fail = function (e) { + if (!this.isStopped) { + this.isStopped = true; + this.error(e); + return true; + } + + return false; + }; + + return AbstractObserver; + }(Observer)); + + /** + * Class to create an Observer instance from delegate-based implementations of the on* methods. + */ + var AnonymousObserver = Rx.AnonymousObserver = (function (_super) { + inherits(AnonymousObserver, _super); + + /** + * Creates an observer from the specified OnNext, OnError, and OnCompleted actions. + * @param {Any} onNext Observer's OnNext action implementation. + * @param {Any} onError Observer's OnError action implementation. + * @param {Any} onCompleted Observer's OnCompleted action implementation. + */ + function AnonymousObserver(onNext, onError, onCompleted) { + _super.call(this); + this._onNext = onNext; + this._onError = onError; + this._onCompleted = onCompleted; + } + + /** + * Calls the onNext action. + * @param {Any} value Next element in the sequence. + */ + AnonymousObserver.prototype.next = function (value) { + this._onNext(value); + }; + + /** + * Calls the onError action. + * @param {Any} error The error that has occurred. + */ + AnonymousObserver.prototype.error = function (exception) { + this._onError(exception); + }; + + /** + * Calls the onCompleted action. + */ + AnonymousObserver.prototype.completed = function () { + this._onCompleted(); + }; + + return AnonymousObserver; + }(AbstractObserver)); + + var CheckedObserver = (function (_super) { + inherits(CheckedObserver, _super); + + function CheckedObserver(observer) { + _super.call(this); + this._observer = observer; + this._state = 0; // 0 - idle, 1 - busy, 2 - done + } + + var CheckedObserverPrototype = CheckedObserver.prototype; + + CheckedObserverPrototype.onNext = function (value) { + this.checkAccess(); + try { + this._observer.onNext(value); + } catch (e) { + throw e; + } finally { + this._state = 0; + } + }; + + CheckedObserverPrototype.onError = function (err) { + this.checkAccess(); + try { + this._observer.onError(err); + } catch (e) { + throw e; + } finally { + this._state = 2; + } + }; + + CheckedObserverPrototype.onCompleted = function () { + this.checkAccess(); + try { + this._observer.onCompleted(); + } catch (e) { + throw e; + } finally { + this._state = 2; + } + }; + + CheckedObserverPrototype.checkAccess = function () { + if (this._state === 1) { throw new Error('Re-entrancy detected'); } + if (this._state === 2) { throw new Error('Observer completed'); } + if (this._state === 0) { this._state = 1; } + }; + + return CheckedObserver; + }(Observer)); + + var ScheduledObserver = Rx.internals.ScheduledObserver = (function (_super) { + inherits(ScheduledObserver, _super); + + function ScheduledObserver(scheduler, observer) { + _super.call(this); + this.scheduler = scheduler; + this.observer = observer; + this.isAcquired = false; + this.hasFaulted = false; + this.queue = []; + this.disposable = new SerialDisposable(); + } + + ScheduledObserver.prototype.next = function (value) { + var self = this; + this.queue.push(function () { + self.observer.onNext(value); + }); + }; + + ScheduledObserver.prototype.error = function (exception) { + var self = this; + this.queue.push(function () { + self.observer.onError(exception); + }); + }; + + ScheduledObserver.prototype.completed = function () { + var self = this; + this.queue.push(function () { + self.observer.onCompleted(); + }); + }; + + ScheduledObserver.prototype.ensureActive = function () { + var isOwner = false, parent = this; + if (!this.hasFaulted && this.queue.length > 0) { + isOwner = !this.isAcquired; + this.isAcquired = true; + } + if (isOwner) { + this.disposable.setDisposable(this.scheduler.scheduleRecursive(function (self) { + var work; + if (parent.queue.length > 0) { + work = parent.queue.shift(); + } else { + parent.isAcquired = false; + return; + } + try { + work(); + } catch (ex) { + parent.queue = []; + parent.hasFaulted = true; + throw ex; + } + self(); + })); + } + }; + + ScheduledObserver.prototype.dispose = function () { + _super.prototype.dispose.call(this); + this.disposable.dispose(); + }; + + return ScheduledObserver; + }(AbstractObserver)); + + /** @private */ + var ObserveOnObserver = (function (_super) { + inherits(ObserveOnObserver, _super); + + /** @private */ + function ObserveOnObserver() { + _super.apply(this, arguments); + } + + /** @private */ + ObserveOnObserver.prototype.next = function (value) { + _super.prototype.next.call(this, value); + this.ensureActive(); + }; + + /** @private */ + ObserveOnObserver.prototype.error = function (e) { + _super.prototype.error.call(this, e); + this.ensureActive(); + }; + + /** @private */ + ObserveOnObserver.prototype.completed = function () { + _super.prototype.completed.call(this); + this.ensureActive(); + }; + + return ObserveOnObserver; + })(ScheduledObserver); + + var observableProto; + + /** + * Represents a push-style collection. + */ + var Observable = Rx.Observable = (function () { + + function Observable(subscribe) { + this._subscribe = subscribe; + } + + observableProto = Observable.prototype; + + /** + * Subscribes an observer to the observable sequence. + * + * @example + * 1 - source.subscribe(); + * 2 - source.subscribe(observer); + * 3 - source.subscribe(function (x) { console.log(x); }); + * 4 - source.subscribe(function (x) { console.log(x); }, function (err) { console.log(err); }); + * 5 - source.subscribe(function (x) { console.log(x); }, function (err) { console.log(err); }, function () { console.log('done'); }); + * @param {Mixed} [observerOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence. + * @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence. + * @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence. + * @returns {Diposable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler. + */ + observableProto.subscribe = observableProto.forEach = function (observerOrOnNext, onError, onCompleted) { + var subscriber = typeof observerOrOnNext === 'object' ? + observerOrOnNext : + observerCreate(observerOrOnNext, onError, onCompleted); + + return this._subscribe(subscriber); + }; + + return Observable; + })(); + + /** + * Wraps the source sequence in order to run its observer callbacks on the specified scheduler. + * + * This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects + * that require to be run on a scheduler, use subscribeOn. + * + * @param {Scheduler} scheduler Scheduler to notify observers on. + * @returns {Observable} The source sequence whose observations happen on the specified scheduler. + */ + observableProto.observeOn = function (scheduler) { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(new ObserveOnObserver(scheduler, observer)); + }); + }; + + /** + * Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used; + * see the remarks section for more information on the distinction between subscribeOn and observeOn. + + * This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer + * callbacks on a scheduler, use observeOn. + + * @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on. + * @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler. + */ + observableProto.subscribeOn = function (scheduler) { + var source = this; + return new AnonymousObservable(function (observer) { + var m = new SingleAssignmentDisposable(), d = new SerialDisposable(); + d.setDisposable(m); + m.setDisposable(scheduler.schedule(function () { + d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(observer))); + })); + return d; + }); + }; + + /** + * Converts a Promise to an Observable sequence + * @param {Promise} An ES6 Compliant promise. + * @returns {Observable} An Observable sequence which wraps the existing promise success and failure. + */ + var observableFromPromise = Observable.fromPromise = function (promise) { + return new AnonymousObservable(function (observer) { + promise.then( + function (value) { + observer.onNext(value); + observer.onCompleted(); + }, + function (reason) { + observer.onError(reason); + }); + + return function () { + if (promise && promise.abort) { + promise.abort(); + } + } + }); + }; + /* + * Converts an existing observable sequence to an ES6 Compatible Promise + * @example + * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise); + * + * // With config + * Rx.config.Promise = RSVP.Promise; + * var promise = Rx.Observable.return(42).toPromise(); + * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise. + * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence. + */ + observableProto.toPromise = function (promiseCtor) { + promiseCtor || (promiseCtor = Rx.config.Promise); + if (!promiseCtor) { + throw new Error('Promise type not provided nor in Rx.config.Promise'); + } + var source = this; + return new promiseCtor(function (resolve, reject) { + // No cancellation can be done + var value, hasValue = false; + source.subscribe(function (v) { + value = v; + hasValue = true; + }, function (err) { + reject(err); + }, function () { + if (hasValue) { + resolve(value); + } + }); + }); + }; + /** + * Creates a list from an observable sequence. + * @returns An observable sequence containing a single element with a list containing all the elements of the source sequence. + */ + observableProto.toArray = function () { + var self = this; + return new AnonymousObservable(function(observer) { + var arr = []; + return self.subscribe( + arr.push.bind(arr), + observer.onError.bind(observer), + function () { + observer.onNext(arr); + observer.onCompleted(); + }); + }); + }; + + /** + * Creates an observable sequence from a specified subscribe method implementation. + * + * @example + * var res = Rx.Observable.create(function (observer) { return function () { } ); + * var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } ); + * var res = Rx.Observable.create(function (observer) { } ); + * + * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable. + * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method. + */ + Observable.create = Observable.createWithDisposable = function (subscribe) { + return new AnonymousObservable(subscribe); + }; + + /** + * Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes. + * + * @example + * var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); }); + * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise. + * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function. + */ + var observableDefer = Observable.defer = function (observableFactory) { + return new AnonymousObservable(function (observer) { + var result; + try { + result = observableFactory(); + } catch (e) { + return observableThrow(e).subscribe(observer); + } + isPromise(result) && (result = observableFromPromise(result)); + return result.subscribe(observer); + }); + }; + + /** + * Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message. + * + * @example + * var res = Rx.Observable.empty(); + * var res = Rx.Observable.empty(Rx.Scheduler.timeout); + * @param {Scheduler} [scheduler] Scheduler to send the termination call on. + * @returns {Observable} An observable sequence with no elements. + */ + var observableEmpty = Observable.empty = function (scheduler) { + scheduler || (scheduler = immediateScheduler); + return new AnonymousObservable(function (observer) { + return scheduler.schedule(function () { + observer.onCompleted(); + }); + }); + }; + + /** + * Converts an array to an observable sequence, using an optional scheduler to enumerate the array. + * + * @example + * var res = Rx.Observable.fromArray([1,2,3]); + * var res = Rx.Observable.fromArray([1,2,3], Rx.Scheduler.timeout); + * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on. + * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence. + */ + var observableFromArray = Observable.fromArray = function (array, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + return new AnonymousObservable(function (observer) { + var count = 0, len = array.length; + return scheduler.scheduleRecursive(function (self) { + if (count < len) { + observer.onNext(array[count++]); + self(); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * Converts an iterable into an Observable sequence + * + * @example + * var res = Rx.Observable.fromIterable(new Map()); + * var res = Rx.Observable.fromIterable(new Set(), Rx.Scheduler.timeout); + * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on. + * @returns {Observable} The observable sequence whose elements are pulled from the given generator sequence. + */ + Observable.fromIterable = function (iterable, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + return new AnonymousObservable(function (observer) { + var iterator; + try { + iterator = iterable[$iterator$](); + } catch (e) { + observer.onError(e); + return; + } + + return scheduler.scheduleRecursive(function (self) { + var next; + try { + next = iterator.next(); + } catch (err) { + observer.onError(err); + return; + } + + if (next.done) { + observer.onCompleted(); + } else { + observer.onNext(next.value); + self(); + } + }); + }); + }; + + /** + * Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages. + * + * @example + * var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }); + * var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout); + * @param {Mixed} initialState Initial state. + * @param {Function} condition Condition to terminate generation (upon returning false). + * @param {Function} iterate Iteration step function. + * @param {Function} resultSelector Selector function for results produced in the sequence. + * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread. + * @returns {Observable} The generated sequence. + */ + Observable.generate = function (initialState, condition, iterate, resultSelector, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + return new AnonymousObservable(function (observer) { + var first = true, state = initialState; + return scheduler.scheduleRecursive(function (self) { + var hasResult, result; + try { + if (first) { + first = false; + } else { + state = iterate(state); + } + hasResult = condition(state); + if (hasResult) { + result = resultSelector(state); + } + } catch (exception) { + observer.onError(exception); + return; + } + if (hasResult) { + observer.onNext(result); + self(); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments. + * @example + * var res = Rx.Observable.of(1,2,3); + * @returns {Observable} The observable sequence whose elements are pulled from the given arguments. + */ + Observable.of = function () { + var len = arguments.length, args = new Array(len); + for(var i = 0; i < len; i++) { args[i] = arguments[i]; } + return observableFromArray(args); + }; + + /** + * This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments. + * @example + * var res = Rx.Observable.of(1,2,3); + * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments. + * @returns {Observable} The observable sequence whose elements are pulled from the given arguments. + */ + var observableOf = Observable.ofWithScheduler = function (scheduler) { + var len = arguments.length - 1, args = new Array(len); + for(var i = 0; i < len; i++) { args[i] = arguments[i + 1]; } + return observableFromArray(args, scheduler); + }; + + /** + * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins). + * @returns {Observable} An observable sequence whose observers will never get called. + */ + var observableNever = Observable.never = function () { + return new AnonymousObservable(function () { + return disposableEmpty; + }); + }; + + /** + * Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages. + * + * @example + * var res = Rx.Observable.range(0, 10); + * var res = Rx.Observable.range(0, 10, Rx.Scheduler.timeout); + * @param {Number} start The value of the first integer in the sequence. + * @param {Number} count The number of sequential integers to generate. + * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread. + * @returns {Observable} An observable sequence that contains a range of sequential integral numbers. + */ + Observable.range = function (start, count, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + return new AnonymousObservable(function (observer) { + return scheduler.scheduleRecursiveWithState(0, function (i, self) { + if (i < count) { + observer.onNext(start + i); + self(i + 1); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages. + * + * @example + * var res = Rx.Observable.repeat(42); + * var res = Rx.Observable.repeat(42, 4); + * 3 - res = Rx.Observable.repeat(42, 4, Rx.Scheduler.timeout); + * 4 - res = Rx.Observable.repeat(42, null, Rx.Scheduler.timeout); + * @param {Mixed} value Element to repeat. + * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely. + * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate. + * @returns {Observable} An observable sequence that repeats the given element the specified number of times. + */ + Observable.repeat = function (value, repeatCount, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + if (repeatCount == null) { + repeatCount = -1; + } + return observableReturn(value, scheduler).repeat(repeatCount); + }; + + /** + * Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages. + * There is an alias called 'just', and 'returnValue' for browsers 0) { + s = q.shift(); + subscribe(s); + } else { + activeCount--; + if (isStopped && activeCount === 0) { + observer.onCompleted(); + } + } + })); + }; + group.add(sources.subscribe(function (innerSource) { + if (activeCount < maxConcurrentOrOther) { + activeCount++; + subscribe(innerSource); + } else { + q.push(innerSource); + } + }, observer.onError.bind(observer), function () { + isStopped = true; + if (activeCount === 0) { + observer.onCompleted(); + } + })); + return group; + }); + }; + + /** + * Merges all the observable sequences into a single observable sequence. + * The scheduler is optional and if not specified, the immediate scheduler is used. + * + * @example + * 1 - merged = Rx.Observable.merge(xs, ys, zs); + * 2 - merged = Rx.Observable.merge([xs, ys, zs]); + * 3 - merged = Rx.Observable.merge(scheduler, xs, ys, zs); + * 4 - merged = Rx.Observable.merge(scheduler, [xs, ys, zs]); + * @returns {Observable} The observable sequence that merges the elements of the observable sequences. + */ + var observableMerge = Observable.merge = function () { + var scheduler, sources; + if (!arguments[0]) { + scheduler = immediateScheduler; + sources = slice.call(arguments, 1); + } else if (arguments[0].now) { + scheduler = arguments[0]; + sources = slice.call(arguments, 1); + } else { + scheduler = immediateScheduler; + sources = slice.call(arguments, 0); + } + if (Array.isArray(sources[0])) { + sources = sources[0]; + } + return observableFromArray(sources, scheduler).mergeObservable(); + }; + + /** + * Merges an observable sequence of observable sequences into an observable sequence. + * @returns {Observable} The observable sequence that merges the elements of the inner sequences. + */ + observableProto.mergeObservable = observableProto.mergeAll =function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var group = new CompositeDisposable(), + isStopped = false, + m = new SingleAssignmentDisposable(); + + group.add(m); + m.setDisposable(sources.subscribe(function (innerSource) { + var innerSubscription = new SingleAssignmentDisposable(); + group.add(innerSubscription); + + // Check if Promise or Observable + if (isPromise(innerSource)) { + innerSource = observableFromPromise(innerSource); + } + + innerSubscription.setDisposable(innerSource.subscribe(function (x) { + observer.onNext(x); + }, observer.onError.bind(observer), function () { + group.remove(innerSubscription); + if (isStopped && group.length === 1) { observer.onCompleted(); } + })); + }, observer.onError.bind(observer), function () { + isStopped = true; + if (group.length === 1) { observer.onCompleted(); } + })); + return group; + }); + }; + + /** + * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence. + * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates. + * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally. + */ + observableProto.onErrorResumeNext = function (second) { + if (!second) { + throw new Error('Second observable is required'); + } + return onErrorResumeNext([this, second]); + }; + + /** + * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence. + * + * @example + * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs); + * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]); + * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally. + */ + var onErrorResumeNext = Observable.onErrorResumeNext = function () { + var sources = argsOrArray(arguments, 0); + return new AnonymousObservable(function (observer) { + var pos = 0, subscription = new SerialDisposable(), + cancelable = immediateScheduler.scheduleRecursive(function (self) { + var current, d; + if (pos < sources.length) { + current = sources[pos++]; + isPromise(current) && (current = observableFromPromise(current)); + d = new SingleAssignmentDisposable(); + subscription.setDisposable(d); + d.setDisposable(current.subscribe(observer.onNext.bind(observer), function () { + self(); + }, function () { + self(); + })); + } else { + observer.onCompleted(); + } + }); + return new CompositeDisposable(subscription, cancelable); + }); + }; + + /** + * Returns the values from the source observable sequence only after the other observable sequence produces a value. + * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence. + * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation. + */ + observableProto.skipUntil = function (other) { + var source = this; + return new AnonymousObservable(function (observer) { + var isOpen = false; + var disposables = new CompositeDisposable(source.subscribe(function (left) { + isOpen && observer.onNext(left); + }, observer.onError.bind(observer), function () { + isOpen && observer.onCompleted(); + })); + + isPromise(other) && (other = observableFromPromise(other)); + + var rightSubscription = new SingleAssignmentDisposable(); + disposables.add(rightSubscription); + rightSubscription.setDisposable(other.subscribe(function () { + isOpen = true; + rightSubscription.dispose(); + }, observer.onError.bind(observer), function () { + rightSubscription.dispose(); + })); + + return disposables; + }); + }; + + /** + * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence. + * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received. + */ + observableProto['switch'] = observableProto.switchLatest = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var hasLatest = false, + innerSubscription = new SerialDisposable(), + isStopped = false, + latest = 0, + subscription = sources.subscribe(function (innerSource) { + var d = new SingleAssignmentDisposable(), id = ++latest; + hasLatest = true; + innerSubscription.setDisposable(d); + + // Check if Promise or Observable + if (isPromise(innerSource)) { + innerSource = observableFromPromise(innerSource); + } + + d.setDisposable(innerSource.subscribe(function (x) { + if (latest === id) { + observer.onNext(x); + } + }, function (e) { + if (latest === id) { + observer.onError(e); + } + }, function () { + if (latest === id) { + hasLatest = false; + if (isStopped) { + observer.onCompleted(); + } + } + })); + }, observer.onError.bind(observer), function () { + isStopped = true; + if (!hasLatest) { + observer.onCompleted(); + } + }); + return new CompositeDisposable(subscription, innerSubscription); + }); + }; + + /** + * Returns the values from the source observable sequence until the other observable sequence produces a value. + * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence. + * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation. + */ + observableProto.takeUntil = function (other) { + var source = this; + return new AnonymousObservable(function (observer) { + isPromise(other) && (other = observableFromPromise(other)); + return new CompositeDisposable( + source.subscribe(observer), + other.subscribe(observer.onCompleted.bind(observer), observer.onError.bind(observer), noop) + ); + }); + }; + + function zipArray(second, resultSelector) { + var first = this; + return new AnonymousObservable(function (observer) { + var index = 0, len = second.length; + return first.subscribe(function (left) { + if (index < len) { + var right = second[index++], result; + try { + result = resultSelector(left, right); + } catch (e) { + observer.onError(e); + return; + } + observer.onNext(result); + } else { + observer.onCompleted(); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + } + + /** + * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index. + * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the sources. + * + * @example + * 1 - res = obs1.zip(obs2, fn); + * 1 - res = x1.zip([1,2,3], fn); + * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + observableProto.zip = function () { + if (Array.isArray(arguments[0])) { + return zipArray.apply(this, arguments); + } + var parent = this, sources = slice.call(arguments), resultSelector = sources.pop(); + sources.unshift(parent); + return new AnonymousObservable(function (observer) { + var n = sources.length, + queues = arrayInitialize(n, function () { return []; }), + isDone = arrayInitialize(n, function () { return false; }); + + function next(i) { + var res, queuedValues; + if (queues.every(function (x) { return x.length > 0; })) { + try { + queuedValues = queues.map(function (x) { return x.shift(); }); + res = resultSelector.apply(parent, queuedValues); + } catch (ex) { + observer.onError(ex); + return; + } + observer.onNext(res); + } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) { + observer.onCompleted(); + } + }; + + function done(i) { + isDone[i] = true; + if (isDone.every(function (x) { return x; })) { + observer.onCompleted(); + } + } + + var subscriptions = new Array(n); + for (var idx = 0; idx < n; idx++) { + (function (i) { + var source = sources[i], sad = new SingleAssignmentDisposable(); + isPromise(source) && (source = observableFromPromise(source)); + sad.setDisposable(source.subscribe(function (x) { + queues[i].push(x); + next(i); + }, observer.onError.bind(observer), function () { + done(i); + })); + subscriptions[i] = sad; + })(idx); + } + + return new CompositeDisposable(subscriptions); + }); + }; + /** + * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. + * @param arguments Observable sources. + * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources. + * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + Observable.zip = function () { + var args = slice.call(arguments, 0), + first = args.shift(); + return first.zip.apply(first, args); + }; + + /** + * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes. + * @param arguments Observable sources. + * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes. + */ + Observable.zipArray = function () { + var sources = argsOrArray(arguments, 0); + return new AnonymousObservable(function (observer) { + var n = sources.length, + queues = arrayInitialize(n, function () { return []; }), + isDone = arrayInitialize(n, function () { return false; }); + + function next(i) { + if (queues.every(function (x) { return x.length > 0; })) { + var res = queues.map(function (x) { return x.shift(); }); + observer.onNext(res); + } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) { + observer.onCompleted(); + return; + } + }; + + function done(i) { + isDone[i] = true; + if (isDone.every(identity)) { + observer.onCompleted(); + return; + } + } + + var subscriptions = new Array(n); + for (var idx = 0; idx < n; idx++) { + (function (i) { + subscriptions[i] = new SingleAssignmentDisposable(); + subscriptions[i].setDisposable(sources[i].subscribe(function (x) { + queues[i].push(x); + next(i); + }, observer.onError.bind(observer), function () { + done(i); + })); + })(idx); + } + + var compositeDisposable = new CompositeDisposable(subscriptions); + compositeDisposable.add(disposableCreate(function () { + for (var qIdx = 0, qLen = queues.length; qIdx < qLen; qIdx++) { + queues[qIdx] = []; + } + })); + return compositeDisposable; + }); + }; + + /** + * Hides the identity of an observable sequence. + * @returns {Observable} An observable sequence that hides the identity of the source sequence. + */ + observableProto.asObservable = function () { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(observer); + }); + }; + + /** + * Projects each element of an observable sequence into zero or more buffers which are produced based on element count information. + * + * @example + * var res = xs.bufferWithCount(10); + * var res = xs.bufferWithCount(10, 1); + * @param {Number} count Length of each buffer. + * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count. + * @returns {Observable} An observable sequence of buffers. + */ + observableProto.bufferWithCount = function (count, skip) { + if (typeof skip !== 'number') { + skip = count; + } + return this.windowWithCount(count, skip).selectMany(function (x) { + return x.toArray(); + }).where(function (x) { + return x.length > 0; + }); + }; + + /** + * Dematerializes the explicit notification values of an observable sequence as implicit notifications. + * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values. + */ + observableProto.dematerialize = function () { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(function (x) { + return x.accept(observer); + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer. + * + * var obs = observable.distinctUntilChanged(); + * var obs = observable.distinctUntilChanged(function (x) { return x.id; }); + * var obs = observable.distinctUntilChanged(function (x) { return x.id; }, function (x, y) { return x === y; }); + * + * @param {Function} [keySelector] A function to compute the comparison key for each element. If not provided, it projects the value. + * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function. + * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence. + */ + observableProto.distinctUntilChanged = function (keySelector, comparer) { + var source = this; + keySelector || (keySelector = identity); + comparer || (comparer = defaultComparer); + return new AnonymousObservable(function (observer) { + var hasCurrentKey = false, currentKey; + return source.subscribe(function (value) { + var comparerEquals = false, key; + try { + key = keySelector(value); + } catch (exception) { + observer.onError(exception); + return; + } + if (hasCurrentKey) { + try { + comparerEquals = comparer(currentKey, key); + } catch (exception) { + observer.onError(exception); + return; + } + } + if (!hasCurrentKey || !comparerEquals) { + hasCurrentKey = true; + currentKey = key; + observer.onNext(value); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence. + * This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline. + * + * @example + * var res = observable.doAction(observer); + * var res = observable.doAction(onNext); + * var res = observable.doAction(onNext, onError); + * var res = observable.doAction(onNext, onError, onCompleted); + * @param {Mixed} observerOrOnNext Action to invoke for each element in the observable sequence or an observer. + * @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function. + * @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function. + * @returns {Observable} The source sequence with the side-effecting behavior applied. + */ + observableProto['do'] = observableProto.doAction = function (observerOrOnNext, onError, onCompleted) { + var source = this, onNextFunc; + if (typeof observerOrOnNext === 'function') { + onNextFunc = observerOrOnNext; + } else { + onNextFunc = observerOrOnNext.onNext.bind(observerOrOnNext); + onError = observerOrOnNext.onError.bind(observerOrOnNext); + onCompleted = observerOrOnNext.onCompleted.bind(observerOrOnNext); + } + return new AnonymousObservable(function (observer) { + return source.subscribe(function (x) { + try { + onNextFunc(x); + } catch (e) { + observer.onError(e); + } + observer.onNext(x); + }, function (exception) { + if (!onError) { + observer.onError(exception); + } else { + try { + onError(exception); + } catch (e) { + observer.onError(e); + } + observer.onError(exception); + } + }, function () { + if (!onCompleted) { + observer.onCompleted(); + } else { + try { + onCompleted(); + } catch (e) { + observer.onError(e); + } + observer.onCompleted(); + } + }); + }); + }; + + /** + * Invokes a specified action after the source observable sequence terminates gracefully or exceptionally. + * + * @example + * var res = observable.finallyAction(function () { console.log('sequence ended'; }); + * @param {Function} finallyAction Action to invoke after the source observable sequence terminates. + * @returns {Observable} Source sequence with the action-invoking termination behavior applied. + */ + observableProto['finally'] = observableProto.finallyAction = function (action) { + var source = this; + return new AnonymousObservable(function (observer) { + var subscription; + try { + subscription = source.subscribe(observer); + } catch (e) { + action(); + throw e; + } + return disposableCreate(function () { + try { + subscription.dispose(); + } catch (e) { + throw e; + } finally { + action(); + } + }); + }); + }; + + /** + * Ignores all elements in an observable sequence leaving only the termination messages. + * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence. + */ + observableProto.ignoreElements = function () { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(noop, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Materializes the implicit notifications of an observable sequence as explicit notification values. + * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence. + */ + observableProto.materialize = function () { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(function (value) { + observer.onNext(notificationCreateOnNext(value)); + }, function (e) { + observer.onNext(notificationCreateOnError(e)); + observer.onCompleted(); + }, function () { + observer.onNext(notificationCreateOnCompleted()); + observer.onCompleted(); + }); + }); + }; + + /** + * Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely. + * + * @example + * var res = repeated = source.repeat(); + * var res = repeated = source.repeat(42); + * @param {Number} [repeatCount] Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely. + * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly. + */ + observableProto.repeat = function (repeatCount) { + return enumerableRepeat(this, repeatCount).concat(); + }; + + /** + * Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely. + * + * @example + * var res = retried = retry.repeat(); + * var res = retried = retry.repeat(42); + * @param {Number} [retryCount] Number of times to retry the sequence. If not provided, retry the sequence indefinitely. + * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully. + */ + observableProto.retry = function (retryCount) { + return enumerableRepeat(this, retryCount).catchException(); + }; + + /** + * Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value. + * For aggregation behavior with no intermediate results, see Observable.aggregate. + * @example + * var res = source.scan(function (acc, x) { return acc + x; }); + * var res = source.scan(0, function (acc, x) { return acc + x; }); + * @param {Mixed} [seed] The initial accumulator value. + * @param {Function} accumulator An accumulator function to be invoked on each element. + * @returns {Observable} An observable sequence containing the accumulated values. + */ + observableProto.scan = function () { + var hasSeed = false, seed, accumulator, source = this; + if (arguments.length === 2) { + hasSeed = true; + seed = arguments[0]; + accumulator = arguments[1]; + } else { + accumulator = arguments[0]; + } + return new AnonymousObservable(function (observer) { + var hasAccumulation, accumulation, hasValue; + return source.subscribe ( + function (x) { + try { + if (!hasValue) { + hasValue = true; + } + + if (hasAccumulation) { + accumulation = accumulator(accumulation, x); + } else { + accumulation = hasSeed ? accumulator(seed, x) : x; + hasAccumulation = true; + } + } catch (e) { + observer.onError(e); + return; + } + + observer.onNext(accumulation); + }, + observer.onError.bind(observer), + function () { + if (!hasValue && hasSeed) { + observer.onNext(seed); + } + observer.onCompleted(); + } + ); + }); + }; + + /** + * Bypasses a specified number of elements at the end of an observable sequence. + * @description + * This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are + * received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed. + * @param count Number of elements to bypass at the end of the source sequence. + * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end. + */ + observableProto.skipLast = function (count) { + var source = this; + return new AnonymousObservable(function (observer) { + var q = []; + return source.subscribe(function (x) { + q.push(x); + if (q.length > count) { + observer.onNext(q.shift()); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend. + * + * var res = source.startWith(1, 2, 3); + * var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3); + * + * @memberOf Observable# + * @returns {Observable} The source sequence prepended with the specified values. + */ + observableProto.startWith = function () { + var values, scheduler, start = 0; + if (!!arguments.length && 'now' in Object(arguments[0])) { + scheduler = arguments[0]; + start = 1; + } else { + scheduler = immediateScheduler; + } + values = slice.call(arguments, start); + return enumerableFor([observableFromArray(values, scheduler), this]).concat(); + }; + + /** + * Returns a specified number of contiguous elements from the end of an observable sequence, using an optional scheduler to drain the queue. + * + * @example + * var res = source.takeLast(5); + * var res = source.takeLast(5, Rx.Scheduler.timeout); + * + * @description + * This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of + * the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed. + * @param {Number} count Number of elements to take from the end of the source sequence. + * @param {Scheduler} [scheduler] Scheduler used to drain the queue upon completion of the source sequence. + * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence. + */ + observableProto.takeLast = function (count, scheduler) { + return this.takeLastBuffer(count).selectMany(function (xs) { return observableFromArray(xs, scheduler); }); + }; + + /** + * Returns an array with the specified number of contiguous elements from the end of an observable sequence. + * + * @description + * This operator accumulates a buffer with a length enough to store count elements. Upon completion of the + * source sequence, this buffer is produced on the result sequence. + * @param {Number} count Number of elements to take from the end of the source sequence. + * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence. + */ + observableProto.takeLastBuffer = function (count) { + var source = this; + return new AnonymousObservable(function (observer) { + var q = []; + return source.subscribe(function (x) { + q.push(x); + if (q.length > count) { + q.shift(); + } + }, observer.onError.bind(observer), function () { + observer.onNext(q); + observer.onCompleted(); + }); + }); + }; + + /** + * Projects each element of an observable sequence into zero or more windows which are produced based on element count information. + * + * var res = xs.windowWithCount(10); + * var res = xs.windowWithCount(10, 1); + * @param {Number} count Length of each window. + * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count. + * @returns {Observable} An observable sequence of windows. + */ + observableProto.windowWithCount = function (count, skip) { + var source = this; + if (count <= 0) { + throw new Error(argumentOutOfRange); + } + if (arguments.length === 1) { + skip = count; + } + if (skip <= 0) { + throw new Error(argumentOutOfRange); + } + return new AnonymousObservable(function (observer) { + var m = new SingleAssignmentDisposable(), + refCountDisposable = new RefCountDisposable(m), + n = 0, + q = [], + createWindow = function () { + var s = new Subject(); + q.push(s); + observer.onNext(addRef(s, refCountDisposable)); + }; + createWindow(); + m.setDisposable(source.subscribe(function (x) { + var s; + for (var i = 0, len = q.length; i < len; i++) { + q[i].onNext(x); + } + var c = n - count + 1; + if (c >= 0 && c % skip === 0) { + s = q.shift(); + s.onCompleted(); + } + n++; + if (n % skip === 0) { + createWindow(); + } + }, function (exception) { + while (q.length > 0) { + q.shift().onError(exception); + } + observer.onError(exception); + }, function () { + while (q.length > 0) { + q.shift().onCompleted(); + } + observer.onCompleted(); + })); + return refCountDisposable; + }); + }; + + function concatMap(selector) { + return this.map(function (x, i) { + var result = selector(x, i); + return isPromise(result) ? observableFromPromise(result) : result; + }).concatAll(); + } + + function concatMapObserver(onNext, onError, onCompleted) { + var source = this; + return new AnonymousObservable(function (observer) { + var index = 0; + + return source.subscribe( + function (x) { + observer.onNext(onNext(x, index++)); + }, + function (err) { + observer.onNext(onError(err)); + observer.completed(); + }, + function () { + observer.onNext(onCompleted()); + observer.onCompleted(); + }); + }).concatAll(); + } + + /** + * One of the Following: + * Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence. + * + * @example + * var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }); + * Or: + * Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence. + * + * var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; }); + * Or: + * Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence. + * + * var res = source.selectMany(Rx.Observable.fromArray([1,2,3])); + * @param selector A transform function to apply to each element or an observable sequence to project each element from the + * source sequence onto which could be either an observable or Promise. + * @param {Function} [resultSelector] A transform function to apply to each element of the intermediate sequence. + * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element. + */ + observableProto.selectConcat = observableProto.concatMap = function (selector, resultSelector) { + if (resultSelector) { + return this.concatMap(function (x, i) { + var selectorResult = selector(x, i), + result = isPromise(selectorResult) ? observableFromPromise(selectorResult) : selectorResult; + + return result.map(function (y) { + return resultSelector(x, y, i); + }); + }); + } + if (typeof selector === 'function') { + return concatMap.call(this, selector); + } + return concatMap.call(this, function () { + return selector; + }); + }; + + /** + * Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty. + * + * var res = obs = xs.defaultIfEmpty(); + * 2 - obs = xs.defaultIfEmpty(false); + * + * @memberOf Observable# + * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null. + * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself. + */ + observableProto.defaultIfEmpty = function (defaultValue) { + var source = this; + if (defaultValue === undefined) { + defaultValue = null; + } + return new AnonymousObservable(function (observer) { + var found = false; + return source.subscribe(function (x) { + found = true; + observer.onNext(x); + }, observer.onError.bind(observer), function () { + if (!found) { + observer.onNext(defaultValue); + } + observer.onCompleted(); + }); + }); + }; + + /** + * Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer. + * Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large. + * + * @example + * var res = obs = xs.distinct(); + * 2 - obs = xs.distinct(function (x) { return x.id; }); + * 2 - obs = xs.distinct(function (x) { return x.id; }, function (x) { return x.toString(); }); + * @param {Function} [keySelector] A function to compute the comparison key for each element. + * @param {Function} [keySerializer] Used to serialize the given object into a string for object comparison. + * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence. + */ + observableProto.distinct = function (keySelector, keySerializer) { + var source = this; + keySelector || (keySelector = identity); + keySerializer || (keySerializer = defaultKeySerializer); + return new AnonymousObservable(function (observer) { + var hashSet = {}; + return source.subscribe(function (x) { + var key, serializedKey, otherKey, hasMatch = false; + try { + key = keySelector(x); + serializedKey = keySerializer(key); + } catch (exception) { + observer.onError(exception); + return; + } + for (otherKey in hashSet) { + if (serializedKey === otherKey) { + hasMatch = true; + break; + } + } + if (!hasMatch) { + hashSet[serializedKey] = null; + observer.onNext(x); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function. + * + * @example + * var res = observable.groupBy(function (x) { return x.id; }); + * 2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }); + * 3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); }); + * @param {Function} keySelector A function to extract the key for each element. + * @param {Function} [elementSelector] A function to map each source element to an element in an observable group. + * @param {Function} [keySerializer] Used to serialize the given object into a string for object comparison. + * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value. + */ + observableProto.groupBy = function (keySelector, elementSelector, keySerializer) { + return this.groupByUntil(keySelector, elementSelector, function () { + return observableNever(); + }, keySerializer); + }; + + /** + * Groups the elements of an observable sequence according to a specified key selector function. + * A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same + * key value as a reclaimed group occurs, the group will be reborn with a new lifetime request. + * + * @example + * var res = observable.groupByUntil(function (x) { return x.id; }, null, function () { return Rx.Observable.never(); }); + * 2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function () { return Rx.Observable.never(); }); + * 3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function () { return Rx.Observable.never(); }, function (x) { return x.toString(); }); + * @param {Function} keySelector A function to extract the key for each element. + * @param {Function} durationSelector A function to signal the expiration of a group. + * @param {Function} [keySerializer] Used to serialize the given object into a string for object comparison. + * @returns {Observable} + * A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value. + * If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered. + * + */ + observableProto.groupByUntil = function (keySelector, elementSelector, durationSelector, keySerializer) { + var source = this; + elementSelector || (elementSelector = identity); + keySerializer || (keySerializer = defaultKeySerializer); + return new AnonymousObservable(function (observer) { + var map = {}, + groupDisposable = new CompositeDisposable(), + refCountDisposable = new RefCountDisposable(groupDisposable); + groupDisposable.add(source.subscribe(function (x) { + var duration, durationGroup, element, fireNewMapEntry, group, key, serializedKey, md, writer, w; + try { + key = keySelector(x); + serializedKey = keySerializer(key); + } catch (e) { + for (w in map) { + map[w].onError(e); + } + observer.onError(e); + return; + } + fireNewMapEntry = false; + try { + writer = map[serializedKey]; + if (!writer) { + writer = new Subject(); + map[serializedKey] = writer; + fireNewMapEntry = true; + } + } catch (e) { + for (w in map) { + map[w].onError(e); + } + observer.onError(e); + return; + } + if (fireNewMapEntry) { + group = new GroupedObservable(key, writer, refCountDisposable); + durationGroup = new GroupedObservable(key, writer); + try { + duration = durationSelector(durationGroup); + } catch (e) { + for (w in map) { + map[w].onError(e); + } + observer.onError(e); + return; + } + observer.onNext(group); + md = new SingleAssignmentDisposable(); + groupDisposable.add(md); + var expire = function () { + if (serializedKey in map) { + delete map[serializedKey]; + writer.onCompleted(); + } + groupDisposable.remove(md); + }; + md.setDisposable(duration.take(1).subscribe(noop, function (exn) { + for (w in map) { + map[w].onError(exn); + } + observer.onError(exn); + }, function () { + expire(); + })); + } + try { + element = elementSelector(x); + } catch (e) { + for (w in map) { + map[w].onError(e); + } + observer.onError(e); + return; + } + writer.onNext(element); + }, function (ex) { + for (var w in map) { + map[w].onError(ex); + } + observer.onError(ex); + }, function () { + for (var w in map) { + map[w].onCompleted(); + } + observer.onCompleted(); + })); + return refCountDisposable; + }); + }; + + /** + * Projects each element of an observable sequence into a new form by incorporating the element's index. + * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element. + * @param {Any} [thisArg] Object to use as this when executing callback. + * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source. + */ + observableProto.select = observableProto.map = function (selector, thisArg) { + var parent = this; + return new AnonymousObservable(function (observer) { + var count = 0; + return parent.subscribe(function (value) { + var result; + try { + result = selector.call(thisArg, value, count++, parent); + } catch (exception) { + observer.onError(exception); + return; + } + observer.onNext(result); + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Retrieves the value of a specified property from all elements in the Observable sequence. + * @param {String} property The property to pluck. + * @returns {Observable} Returns a new Observable sequence of property values. + */ + observableProto.pluck = function (property) { + return this.select(function (x) { return x[property]; }); + }; + + function selectMany(selector) { + return this.select(function (x, i) { + var result = selector(x, i); + return isPromise(result) ? observableFromPromise(result) : result; + }).mergeObservable(); + } + + function selectManyObserver(onNext, onError, onCompleted) { + var source = this; + return new AnonymousObservable(function (observer) { + var index = 0; + + return source.subscribe( + function (x) { + observer.onNext(onNext(x, index++)); + }, + function (err) { + observer.onNext(onError(err)); + observer.completed(); + }, + function () { + observer.onNext(onCompleted()); + observer.onCompleted(); + }); + }).mergeAll(); + } + + /** + * One of the Following: + * Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence. + * + * @example + * var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }); + * Or: + * Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence. + * + * var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; }); + * Or: + * Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence. + * + * var res = source.selectMany(Rx.Observable.fromArray([1,2,3])); + * @param selector A transform function to apply to each element or an observable sequence to project each element from the + * source sequence onto which could be either an observable or Promise. + * @param {Function} [resultSelector] A transform function to apply to each element of the intermediate sequence. + * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element. + */ + observableProto.selectMany = observableProto.flatMap = function (selector, resultSelector) { + if (resultSelector) { + return this.selectMany(function (x, i) { + var selectorResult = selector(x, i), + result = isPromise(selectorResult) ? observableFromPromise(selectorResult) : selectorResult; + + return result.select(function (y) { + return resultSelector(x, y, i); + }); + }); + } + if (typeof selector === 'function') { + return selectMany.call(this, selector); + } + return selectMany.call(this, function () { + return selector; + }); + }; + + /** + * Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then + * transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence. + * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element. + * @param {Any} [thisArg] Object to use as this when executing callback. + * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences + * and that at any point in time produces the elements of the most recent inner observable sequence that has been received. + */ + observableProto.selectSwitch = observableProto.flatMapLatest = observableProto.switchMap = function (selector, thisArg) { + return this.select(selector, thisArg).switchLatest(); + }; + + /** + * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements. + * @param {Number} count The number of elements to skip before returning the remaining elements. + * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence. + */ + observableProto.skip = function (count) { + if (count < 0) { + throw new Error(argumentOutOfRange); + } + var observable = this; + return new AnonymousObservable(function (observer) { + var remaining = count; + return observable.subscribe(function (x) { + if (remaining <= 0) { + observer.onNext(x); + } else { + remaining--; + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements. + * The element's index is used in the logic of the predicate function. + * + * var res = source.skipWhile(function (value) { return value < 10; }); + * var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; }); + * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element. + * @param {Any} [thisArg] Object to use as this when executing callback. + * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate. + */ + observableProto.skipWhile = function (predicate, thisArg) { + var source = this; + return new AnonymousObservable(function (observer) { + var i = 0, running = false; + return source.subscribe(function (x) { + if (!running) { + try { + running = !predicate.call(thisArg, x, i++, source); + } catch (e) { + observer.onError(e); + return; + } + } + if (running) { + observer.onNext(x); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0). + * + * var res = source.take(5); + * var res = source.take(0, Rx.Scheduler.timeout); + * @param {Number} count The number of elements to return. + * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case 0; + }, + /** + * Notifies all subscribed observers about the end of the sequence. + */ + onCompleted: function () { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + for (var i = 0, len = os.length; i < len; i++) { + os[i].onCompleted(); + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the exception. + * @param {Mixed} error The exception to send to all observers. + */ + onError: function (error) { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + this.exception = error; + + for (var i = 0, len = os.length; i < len; i++) { + os[i].onError(error); + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the arrival of the specified element in the sequence. + * @param {Mixed} value The value to send to all observers. + */ + onNext: function (value) { + checkDisposed.call(this); + if (!this.isStopped) { + this.value = value; + var os = this.observers.slice(0); + for (var i = 0, len = os.length; i < len; i++) { + os[i].onNext(value); + } + } + }, + /** + * Unsubscribe all observers and release resources. + */ + dispose: function () { + this.isDisposed = true; + this.observers = null; + this.value = null; + this.exception = null; + } + }); + + return BehaviorSubject; + }(Observable)); + + /** + * Represents an object that is both an observable sequence as well as an observer. + * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies. + */ + var ReplaySubject = Rx.ReplaySubject = (function (_super) { + + function RemovableDisposable (subject, observer) { + this.subject = subject; + this.observer = observer; + }; + + RemovableDisposable.prototype.dispose = function () { + this.observer.dispose(); + if (!this.subject.isDisposed) { + var idx = this.subject.observers.indexOf(this.observer); + this.subject.observers.splice(idx, 1); + } + }; + + function subscribe(observer) { + var so = new ScheduledObserver(this.scheduler, observer), + subscription = new RemovableDisposable(this, so); + checkDisposed.call(this); + this._trim(this.scheduler.now()); + this.observers.push(so); + + var n = this.q.length; + + for (var i = 0, len = this.q.length; i < len; i++) { + so.onNext(this.q[i].value); + } + + if (this.hasError) { + n++; + so.onError(this.error); + } else if (this.isStopped) { + n++; + so.onCompleted(); + } + + so.ensureActive(n); + return subscription; + } + + inherits(ReplaySubject, _super); + + /** + * Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler. + * @param {Number} [bufferSize] Maximum element count of the replay buffer. + * @param {Number} [windowSize] Maximum time length of the replay buffer. + * @param {Scheduler} [scheduler] Scheduler the observers are invoked on. + */ + function ReplaySubject(bufferSize, windowSize, scheduler) { + this.bufferSize = bufferSize == null ? Number.MAX_VALUE : bufferSize; + this.windowSize = windowSize == null ? Number.MAX_VALUE : windowSize; + this.scheduler = scheduler || currentThreadScheduler; + this.q = []; + this.observers = []; + this.isStopped = false; + this.isDisposed = false; + this.hasError = false; + this.error = null; + _super.call(this, subscribe); + } + + addProperties(ReplaySubject.prototype, Observer, { + /** + * Indicates whether the subject has observers subscribed to it. + * @returns {Boolean} Indicates whether the subject has observers subscribed to it. + */ + hasObservers: function () { + return this.observers.length > 0; + }, + /* @private */ + _trim: function (now) { + while (this.q.length > this.bufferSize) { + this.q.shift(); + } + while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) { + this.q.shift(); + } + }, + /** + * Notifies all subscribed observers about the arrival of the specified element in the sequence. + * @param {Mixed} value The value to send to all observers. + */ + onNext: function (value) { + var observer; + checkDisposed.call(this); + if (!this.isStopped) { + var now = this.scheduler.now(); + this.q.push({ interval: now, value: value }); + this._trim(now); + + var o = this.observers.slice(0); + for (var i = 0, len = o.length; i < len; i++) { + observer = o[i]; + observer.onNext(value); + observer.ensureActive(); + } + } + }, + /** + * Notifies all subscribed observers about the exception. + * @param {Mixed} error The exception to send to all observers. + */ + onError: function (error) { + var observer; + checkDisposed.call(this); + if (!this.isStopped) { + this.isStopped = true; + this.error = error; + this.hasError = true; + var now = this.scheduler.now(); + this._trim(now); + var o = this.observers.slice(0); + for (var i = 0, len = o.length; i < len; i++) { + observer = o[i]; + observer.onError(error); + observer.ensureActive(); + } + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the end of the sequence. + */ + onCompleted: function () { + var observer; + checkDisposed.call(this); + if (!this.isStopped) { + this.isStopped = true; + var now = this.scheduler.now(); + this._trim(now); + var o = this.observers.slice(0); + for (var i = 0, len = o.length; i < len; i++) { + observer = o[i]; + observer.onCompleted(); + observer.ensureActive(); + } + this.observers = []; + } + }, + /** + * Unsubscribe all observers and release resources. + */ + dispose: function () { + this.isDisposed = true; + this.observers = null; + } + }); + + return ReplaySubject; + }(Observable)); + + /** @private */ + var ConnectableObservable = Rx.ConnectableObservable = (function (_super) { + inherits(ConnectableObservable, _super); + + /** + * @constructor + * @private + */ + function ConnectableObservable(source, subject) { + var state = { + subject: subject, + source: source.asObservable(), + hasSubscription: false, + subscription: null + }; + + this.connect = function () { + if (!state.hasSubscription) { + state.hasSubscription = true; + state.subscription = new CompositeDisposable(state.source.subscribe(state.subject), disposableCreate(function () { + state.hasSubscription = false; + })); + } + return state.subscription; + }; + + function subscribe(observer) { + return state.subject.subscribe(observer); + } + + _super.call(this, subscribe); + } + + /** + * @private + * @memberOf ConnectableObservable + */ + ConnectableObservable.prototype.connect = function () { return this.connect(); }; + + /** + * @private + * @memberOf ConnectableObservable + */ + ConnectableObservable.prototype.refCount = function () { + var connectableSubscription = null, count = 0, source = this; + return new AnonymousObservable(function (observer) { + var shouldConnect, subscription; + count++; + shouldConnect = count === 1; + subscription = source.subscribe(observer); + if (shouldConnect) { + connectableSubscription = source.connect(); + } + return disposableCreate(function () { + subscription.dispose(); + count--; + if (count === 0) { + connectableSubscription.dispose(); + } + }); + }); + }; + + return ConnectableObservable; + }(Observable)); + + // Real Dictionary + var primes = [1, 3, 7, 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191, 16381, 32749, 65521, 131071, 262139, 524287, 1048573, 2097143, 4194301, 8388593, 16777213, 33554393, 67108859, 134217689, 268435399, 536870909, 1073741789, 2147483647]; + var noSuchkey = "no such key"; + var duplicatekey = "duplicate key"; + + function isPrime(candidate) { + if (candidate & 1 === 0) { + return candidate === 2; + } + var num1 = Math.sqrt(candidate), + num2 = 3; + while (num2 <= num1) { + if (candidate % num2 === 0) { + return false; + } + num2 += 2; + } + return true; + } + + function getPrime(min) { + var index, num, candidate; + for (index = 0; index < primes.length; ++index) { + num = primes[index]; + if (num >= min) { + return num; + } + } + candidate = min | 1; + while (candidate < primes[primes.length - 1]) { + if (isPrime(candidate)) { + return candidate; + } + candidate += 2; + } + return min; + } + + function stringHashFn(str) { + var hash = 757602046; + if (!str.length) { + return hash; + } + for (var i = 0, len = str.length; i < len; i++) { + var character = str.charCodeAt(i); + hash = ((hash<<5)-hash)+character; + hash = hash & hash; + } + return hash; + } + + function numberHashFn(key) { + var c2 = 0x27d4eb2d; + key = (key ^ 61) ^ (key >>> 16); + key = key + (key << 3); + key = key ^ (key >>> 4); + key = key * c2; + key = key ^ (key >>> 15); + return key; + } + + var getHashCode = (function () { + var uniqueIdCounter = 0; + + return function (obj) { + if (obj == null) { + throw new Error(noSuchkey); + } + + // Check for built-ins before tacking on our own for any object + if (typeof obj === 'string') { + return stringHashFn(obj); + } + + if (typeof obj === 'number') { + return numberHashFn(obj); + } + + if (typeof obj === 'boolean') { + return obj === true ? 1 : 0; + } + + if (obj instanceof Date) { + return obj.getTime(); + } + + if (obj.getHashCode) { + return obj.getHashCode(); + } + + var id = 17 * uniqueIdCounter++; + obj.getHashCode = function () { return id; }; + return id; + }; + } ()); + + function newEntry() { + return { key: null, value: null, next: 0, hashCode: 0 }; + } + + // Dictionary implementation + + var Dictionary = function (capacity, comparer) { + if (capacity < 0) { + throw new Error('out of range') + } + if (capacity > 0) { + this._initialize(capacity); + } + + this.comparer = comparer || defaultComparer; + this.freeCount = 0; + this.size = 0; + this.freeList = -1; + }; + + Dictionary.prototype._initialize = function (capacity) { + var prime = getPrime(capacity), i; + this.buckets = new Array(prime); + this.entries = new Array(prime); + for (i = 0; i < prime; i++) { + this.buckets[i] = -1; + this.entries[i] = newEntry(); + } + this.freeList = -1; + }; + Dictionary.prototype.count = function () { + return this.size; + }; + Dictionary.prototype.add = function (key, value) { + return this._insert(key, value, true); + }; + Dictionary.prototype._insert = function (key, value, add) { + if (!this.buckets) { + this._initialize(0); + } + var index3; + var num = getHashCode(key) & 2147483647; + var index1 = num % this.buckets.length; + for (var index2 = this.buckets[index1]; index2 >= 0; index2 = this.entries[index2].next) { + if (this.entries[index2].hashCode === num && this.comparer(this.entries[index2].key, key)) { + if (add) { + throw new Error(duplicatekey); + } + this.entries[index2].value = value; + return; + } + } + if (this.freeCount > 0) { + index3 = this.freeList; + this.freeList = this.entries[index3].next; + --this.freeCount; + } else { + if (this.size === this.entries.length) { + this._resize(); + index1 = num % this.buckets.length; + } + index3 = this.size; + ++this.size; + } + this.entries[index3].hashCode = num; + this.entries[index3].next = this.buckets[index1]; + this.entries[index3].key = key; + this.entries[index3].value = value; + this.buckets[index1] = index3; + }; + + Dictionary.prototype._resize = function () { + var prime = getPrime(this.size * 2), + numArray = new Array(prime); + for (index = 0; index < numArray.length; ++index) { + numArray[index] = -1; + } + var entryArray = new Array(prime); + for (index = 0; index < this.size; ++index) { + entryArray[index] = this.entries[index]; + } + for (var index = this.size; index < prime; ++index) { + entryArray[index] = newEntry(); + } + for (var index1 = 0; index1 < this.size; ++index1) { + var index2 = entryArray[index1].hashCode % prime; + entryArray[index1].next = numArray[index2]; + numArray[index2] = index1; + } + this.buckets = numArray; + this.entries = entryArray; + }; + + Dictionary.prototype.remove = function (key) { + if (this.buckets) { + var num = getHashCode(key) & 2147483647; + var index1 = num % this.buckets.length; + var index2 = -1; + for (var index3 = this.buckets[index1]; index3 >= 0; index3 = this.entries[index3].next) { + if (this.entries[index3].hashCode === num && this.comparer(this.entries[index3].key, key)) { + if (index2 < 0) { + this.buckets[index1] = this.entries[index3].next; + } else { + this.entries[index2].next = this.entries[index3].next; + } + this.entries[index3].hashCode = -1; + this.entries[index3].next = this.freeList; + this.entries[index3].key = null; + this.entries[index3].value = null; + this.freeList = index3; + ++this.freeCount; + return true; + } else { + index2 = index3; + } + } + } + return false; + }; + + Dictionary.prototype.clear = function () { + var index, len; + if (this.size <= 0) { + return; + } + for (index = 0, len = this.buckets.length; index < len; ++index) { + this.buckets[index] = -1; + } + for (index = 0; index < this.size; ++index) { + this.entries[index] = newEntry(); + } + this.freeList = -1; + this.size = 0; + }; + + Dictionary.prototype._findEntry = function (key) { + if (this.buckets) { + var num = getHashCode(key) & 2147483647; + for (var index = this.buckets[num % this.buckets.length]; index >= 0; index = this.entries[index].next) { + if (this.entries[index].hashCode === num && this.comparer(this.entries[index].key, key)) { + return index; + } + } + } + return -1; + }; + + Dictionary.prototype.count = function () { + return this.size - this.freeCount; + }; + + Dictionary.prototype.tryGetValue = function (key) { + var entry = this._findEntry(key); + if (entry >= 0) { + return this.entries[entry].value; + } + return undefined; + }; + + Dictionary.prototype.getValues = function () { + var index = 0, results = []; + if (this.entries) { + for (var index1 = 0; index1 < this.size; index1++) { + if (this.entries[index1].hashCode >= 0) { + results[index++] = this.entries[index1].value; + } + } + } + return results; + }; + + Dictionary.prototype.get = function (key) { + var entry = this._findEntry(key); + if (entry >= 0) { + return this.entries[entry].value; + } + throw new Error(noSuchkey); + }; + + Dictionary.prototype.set = function (key, value) { + this._insert(key, value, false); + }; + + Dictionary.prototype.containskey = function (key) { + return this._findEntry(key) >= 0; + }; + + /** + * Correlates the elements of two sequences based on overlapping durations. + * + * @param {Observable} right The right observable sequence to join elements for. + * @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap. + * @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap. + * @param {Function} resultSelector A function invoked to compute a result element for any two overlapping elements of the left and right observable sequences. The parameters passed to the function correspond with the elements from the left and right source sequences for which overlap occurs. + * @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration. + */ + observableProto.join = function (right, leftDurationSelector, rightDurationSelector, resultSelector) { + var left = this; + return new AnonymousObservable(function (observer) { + var group = new CompositeDisposable(), + leftDone = false, + leftId = 0, + leftMap = new Dictionary(), + rightDone = false, + rightId = 0, + rightMap = new Dictionary(); + group.add(left.subscribe(function (value) { + var duration, + expire, + id = leftId++, + md = new SingleAssignmentDisposable(), + result, + values; + leftMap.add(id, value); + group.add(md); + expire = function () { + if (leftMap.remove(id) && leftMap.count() === 0 && leftDone) { + observer.onCompleted(); + } + return group.remove(md); + }; + try { + duration = leftDurationSelector(value); + } catch (e) { + observer.onError(e); + return; + } + md.setDisposable(duration.take(1).subscribe(noop, observer.onError.bind(observer), function () { expire(); })); + values = rightMap.getValues(); + for (var i = 0; i < values.length; i++) { + try { + result = resultSelector(value, values[i]); + } catch (exception) { + observer.onError(exception); + return; + } + observer.onNext(result); + } + }, observer.onError.bind(observer), function () { + leftDone = true; + if (rightDone || leftMap.count() === 0) { + observer.onCompleted(); + } + })); + group.add(right.subscribe(function (value) { + var duration, + expire, + id = rightId++, + md = new SingleAssignmentDisposable(), + result, + values; + rightMap.add(id, value); + group.add(md); + expire = function () { + if (rightMap.remove(id) && rightMap.count() === 0 && rightDone) { + observer.onCompleted(); + } + return group.remove(md); + }; + try { + duration = rightDurationSelector(value); + } catch (exception) { + observer.onError(exception); + return; + } + md.setDisposable(duration.take(1).subscribe(noop, observer.onError.bind(observer), function () { expire(); })); + values = leftMap.getValues(); + for (var i = 0; i < values.length; i++) { + try { + result = resultSelector(values[i], value); + } catch (exception) { + observer.onError(exception); + return; + } + observer.onNext(result); + } + }, observer.onError.bind(observer), function () { + rightDone = true; + if (leftDone || rightMap.count() === 0) { + observer.onCompleted(); + } + })); + return group; + }); + }; + + /** + * Correlates the elements of two sequences based on overlapping durations, and groups the results. + * + * @param {Observable} right The right observable sequence to join elements for. + * @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap. + * @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap. + * @param {Function} resultSelector A function invoked to compute a result element for any element of the left sequence with overlapping elements from the right observable sequence. The first parameter passed to the function is an element of the left sequence. The second parameter passed to the function is an observable sequence with elements from the right sequence that overlap with the left sequence's element. + * @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration. + */ + observableProto.groupJoin = function (right, leftDurationSelector, rightDurationSelector, resultSelector) { + var left = this; + return new AnonymousObservable(function (observer) { + var nothing = function () {}; + var group = new CompositeDisposable(); + var r = new RefCountDisposable(group); + var leftMap = new Dictionary(); + var rightMap = new Dictionary(); + var leftID = 0; + var rightID = 0; + + group.add(left.subscribe( + function (value) { + var s = new Subject(); + var id = leftID++; + leftMap.add(id, s); + var i, len, leftValues, rightValues; + + var result; + try { + result = resultSelector(value, addRef(s, r)); + } catch (e) { + leftValues = leftMap.getValues(); + for (i = 0, len = leftValues.length; i < len; i++) { + leftValues[i].onError(e); + } + observer.onError(e); + return; + } + observer.onNext(result); + + rightValues = rightMap.getValues(); + for (i = 0, len = rightValues.length; i < len; i++) { + s.onNext(rightValues[i]); + } + + var md = new SingleAssignmentDisposable(); + group.add(md); + + var expire = function () { + if (leftMap.remove(id)) { + s.onCompleted(); + } + + group.remove(md); + }; + + var duration; + try { + duration = leftDurationSelector(value); + } catch (e) { + leftValues = leftMap.getValues(); + for (i = 0, len = leftMap.length; i < len; i++) { + leftValues[i].onError(e); + } + observer.onError(e); + return; + } + + md.setDisposable(duration.take(1).subscribe( + nothing, + function (e) { + leftValues = leftMap.getValues(); + for (i = 0, len = leftValues.length; i < len; i++) { + leftValues[i].onError(e); + } + observer.onError(e); + }, + expire) + ); + }, + function (e) { + var leftValues = leftMap.getValues(); + for (var i = 0, len = leftValues.length; i < len; i++) { + leftValues[i].onError(e); + } + observer.onError(e); + }, + observer.onCompleted.bind(observer))); + + group.add(right.subscribe( + function (value) { + var leftValues, i, len; + var id = rightID++; + rightMap.add(id, value); + + var md = new SingleAssignmentDisposable(); + group.add(md); + + var expire = function () { + rightMap.remove(id); + group.remove(md); + }; + + var duration; + try { + duration = rightDurationSelector(value); + } catch (e) { + leftValues = leftMap.getValues(); + for (i = 0, len = leftMap.length; i < len; i++) { + leftValues[i].onError(e); + } + observer.onError(e); + return; + } + md.setDisposable(duration.take(1).subscribe( + nothing, + function (e) { + leftValues = leftMap.getValues(); + for (i = 0, len = leftMap.length; i < len; i++) { + leftValues[i].onError(e); + } + observer.onError(e); + }, + expire) + ); + + leftValues = leftMap.getValues(); + for (i = 0, len = leftValues.length; i < len; i++) { + leftValues[i].onNext(value); + } + }, + function (e) { + var leftValues = leftMap.getValues(); + for (var i = 0, len = leftValues.length; i < len; i++) { + leftValues[i].onError(e); + } + observer.onError(e); + })); + + return r; + }); + }; + + /** + * Projects each element of an observable sequence into zero or more buffers. + * + * @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows). + * @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored. + * @returns {Observable} An observable sequence of windows. + */ + observableProto.buffer = function (bufferOpeningsOrClosingSelector, bufferClosingSelector) { + return this.window.apply(this, arguments).selectMany(function (x) { return x.toArray(); }); + }; + + /** + * Projects each element of an observable sequence into zero or more windows. + * + * @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows). + * @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored. + * @returns {Observable} An observable sequence of windows. + */ + observableProto.window = function (windowOpeningsOrClosingSelector, windowClosingSelector) { + if (arguments.length === 1 && typeof arguments[0] !== 'function') { + return observableWindowWithBounaries.call(this, windowOpeningsOrClosingSelector); + } + return typeof windowOpeningsOrClosingSelector === 'function' ? + observableWindowWithClosingSelector.call(this, windowOpeningsOrClosingSelector) : + observableWindowWithOpenings.call(this, windowOpeningsOrClosingSelector, windowClosingSelector); + }; + + function observableWindowWithOpenings(windowOpenings, windowClosingSelector) { + return windowOpenings.groupJoin(this, windowClosingSelector, function () { + return observableEmpty(); + }, function (_, window) { + return window; + }); + } + + function observableWindowWithBounaries(windowBoundaries) { + var source = this; + return new AnonymousObservable(function (observer) { + var window = new Subject(), + d = new CompositeDisposable(), + r = new RefCountDisposable(d); + + observer.onNext(addRef(window, r)); + + d.add(source.subscribe(function (x) { + window.onNext(x); + }, function (err) { + window.onError(err); + observer.onError(err); + }, function () { + window.onCompleted(); + observer.onCompleted(); + })); + + d.add(windowBoundaries.subscribe(function (w) { + window.onCompleted(); + window = new Subject(); + observer.onNext(addRef(window, r)); + }, function (err) { + window.onError(err); + observer.onError(err); + }, function () { + window.onCompleted(); + observer.onCompleted(); + })); + + return r; + }); + } + + function observableWindowWithClosingSelector(windowClosingSelector) { + var source = this; + return new AnonymousObservable(function (observer) { + var createWindowClose, + m = new SerialDisposable(), + d = new CompositeDisposable(m), + r = new RefCountDisposable(d), + window = new Subject(); + observer.onNext(addRef(window, r)); + d.add(source.subscribe(function (x) { + window.onNext(x); + }, function (ex) { + window.onError(ex); + observer.onError(ex); + }, function () { + window.onCompleted(); + observer.onCompleted(); + })); + createWindowClose = function () { + var m1, windowClose; + try { + windowClose = windowClosingSelector(); + } catch (exception) { + observer.onError(exception); + return; + } + m1 = new SingleAssignmentDisposable(); + m.setDisposable(m1); + m1.setDisposable(windowClose.take(1).subscribe(noop, function (ex) { + window.onError(ex); + observer.onError(ex); + }, function () { + window.onCompleted(); + window = new Subject(); + observer.onNext(addRef(window, r)); + createWindowClose(); + })); + }; + createWindowClose(); + return r; + }); + } + + /** + * Returns a new observable that triggers on the second and subsequent triggerings of the input observable. + * The Nth triggering of the input observable passes the arguments from the N-1th and Nth triggering as a pair. + * The argument passed to the N-1th triggering is held in hidden internal state until the Nth triggering occurs. + * @returns {Observable} An observable that triggers on successive pairs of observations from the input observable as an array. + */ + observableProto.pairwise = function () { + var source = this; + return new AnonymousObservable(function (observer) { + var previous, hasPrevious = false; + return source.subscribe( + function (x) { + if (hasPrevious) { + observer.onNext([previous, x]); + } else { + hasPrevious = true; + } + previous = x; + }, + observer.onError.bind(observer), + observer.onCompleted.bind(observer)); + }); + }; + /** + * Returns two observables which partition the observations of the source by the given function. + * The first will trigger observations for those values for which the predicate returns true. + * The second will trigger observations for those values where the predicate returns false. + * The predicate is executed once for each subscribed observer. + * Both also propagate all error observations arising from the source and each completes + * when the source completes. + * @param {Function} predicate + * The function to determine which output Observable will trigger a particular observation. + * @returns {Array} + * An array of observables. The first triggers when the predicate returns true, + * and the second triggers when the predicate returns false. + */ + observableProto.partition = function(predicate, thisArg) { + var published = this.publish().refCount(); + return [ + published.filter(predicate, thisArg), + published.filter(function (x, i, o) { return !predicate.call(thisArg, x, i, o); }) + ]; + }; + + function enumerableWhile(condition, source) { + return new Enumerable(function () { + return new Enumerator(function () { + return condition() ? + { done: false, value: source } : + { done: true, value: undefined }; + }); + }); + } + + /** + * Returns an observable sequence that is the result of invoking the selector on the source sequence, without sharing subscriptions. + * This operator allows for a fluent style of writing queries that use the same sequence multiple times. + * + * @param {Function} selector Selector function which can use the source sequence as many times as needed, without sharing subscriptions to the source sequence. + * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function. + */ + observableProto.letBind = observableProto['let'] = function (func) { + return func(this); + }; + + /** + * Determines whether an observable collection contains values. There is an alias for this method called 'ifThen' for browsers 0) { + isOwner = !isAcquired; + isAcquired = true; + } + if (isOwner) { + m.setDisposable(scheduler.scheduleRecursive(function (self) { + var work; + if (q.length > 0) { + work = q.shift(); + } else { + isAcquired = false; + return; + } + var m1 = new SingleAssignmentDisposable(); + d.add(m1); + m1.setDisposable(work.subscribe(function (x) { + observer.onNext(x); + var result = null; + try { + result = selector(x); + } catch (e) { + observer.onError(e); + } + q.push(result); + activeCount++; + ensureActive(); + }, observer.onError.bind(observer), function () { + d.remove(m1); + activeCount--; + if (activeCount === 0) { + observer.onCompleted(); + } + })); + self(); + })); + } + }; + + q.push(source); + activeCount++; + ensureActive(); + return d; + }); + }; + + /** + * Runs all observable sequences in parallel and collect their last elements. + * + * @example + * 1 - res = Rx.Observable.forkJoin([obs1, obs2]); + * 1 - res = Rx.Observable.forkJoin(obs1, obs2, ...); + * @returns {Observable} An observable sequence with an array collecting the last elements of all the input sequences. + */ + Observable.forkJoin = function () { + var allSources = argsOrArray(arguments, 0); + return new AnonymousObservable(function (subscriber) { + var count = allSources.length; + if (count === 0) { + subscriber.onCompleted(); + return disposableEmpty; + } + var group = new CompositeDisposable(), + finished = false, + hasResults = new Array(count), + hasCompleted = new Array(count), + results = new Array(count); + + for (var idx = 0; idx < count; idx++) { + (function (i) { + var source = allSources[i]; + isPromise(source) && (source = observableFromPromise(source)); + group.add( + source.subscribe( + function (value) { + if (!finished) { + hasResults[i] = true; + results[i] = value; + } + }, + function (e) { + finished = true; + subscriber.onError(e); + group.dispose(); + }, + function () { + if (!finished) { + if (!hasResults[i]) { + subscriber.onCompleted(); + return; + } + hasCompleted[i] = true; + for (var ix = 0; ix < count; ix++) { + if (!hasCompleted[ix]) { return; } + } + finished = true; + subscriber.onNext(results); + subscriber.onCompleted(); + } + })); + })(idx); + } + + return group; + }); + }; + + /** + * Runs two observable sequences in parallel and combines their last elemenets. + * + * @param {Observable} second Second observable sequence. + * @param {Function} resultSelector Result selector function to invoke with the last elements of both sequences. + * @returns {Observable} An observable sequence with the result of calling the selector function with the last elements of both input sequences. + */ + observableProto.forkJoin = function (second, resultSelector) { + var first = this; + + return new AnonymousObservable(function (observer) { + var leftStopped = false, rightStopped = false, + hasLeft = false, hasRight = false, + lastLeft, lastRight, + leftSubscription = new SingleAssignmentDisposable(), rightSubscription = new SingleAssignmentDisposable(); + + isPromise(second) && (second = observableFromPromise(second)); + + leftSubscription.setDisposable( + first.subscribe(function (left) { + hasLeft = true; + lastLeft = left; + }, function (err) { + rightSubscription.dispose(); + observer.onError(err); + }, function () { + leftStopped = true; + if (rightStopped) { + if (!hasLeft) { + observer.onCompleted(); + } else if (!hasRight) { + observer.onCompleted(); + } else { + var result; + try { + result = resultSelector(lastLeft, lastRight); + } catch (e) { + observer.onError(e); + return; + } + observer.onNext(result); + observer.onCompleted(); + } + } + }) + ); + + rightSubscription.setDisposable( + second.subscribe(function (right) { + hasRight = true; + lastRight = right; + }, function (err) { + leftSubscription.dispose(); + observer.onError(err); + }, function () { + rightStopped = true; + if (leftStopped) { + if (!hasLeft) { + observer.onCompleted(); + } else if (!hasRight) { + observer.onCompleted(); + } else { + var result; + try { + result = resultSelector(lastLeft, lastRight); + } catch (e) { + observer.onError(e); + return; + } + observer.onNext(result); + observer.onCompleted(); + } + } + }) + ); + + return new CompositeDisposable(leftSubscription, rightSubscription); + }); + }; + + /** + * Comonadic bind operator. + * @param {Function} selector A transform function to apply to each element. + * @param {Object} scheduler Scheduler used to execute the operation. If not specified, defaults to the ImmediateScheduler. + * @returns {Observable} An observable sequence which results from the comonadic bind operation. + */ + observableProto.manySelect = function (selector, scheduler) { + scheduler || (scheduler = immediateScheduler); + var source = this; + return observableDefer(function () { + var chain; + + return source + .select( + function (x) { + var curr = new ChainObservable(x); + if (chain) { + chain.onNext(x); + } + chain = curr; + + return curr; + }) + .doAction( + noop, + function (e) { + if (chain) { + chain.onError(e); + } + }, + function () { + if (chain) { + chain.onCompleted(); + } + }) + .observeOn(scheduler) + .select(function (x, i, o) { return selector(x, i, o); }); + }); + }; + + var ChainObservable = (function (_super) { + + function subscribe (observer) { + var self = this, g = new CompositeDisposable(); + g.add(currentThreadScheduler.schedule(function () { + observer.onNext(self.head); + g.add(self.tail.mergeObservable().subscribe(observer)); + })); + + return g; + } + + inherits(ChainObservable, _super); + + function ChainObservable(head) { + _super.call(this, subscribe); + this.head = head; + this.tail = new AsyncSubject(); + } + + addProperties(ChainObservable.prototype, Observer, { + onCompleted: function () { + this.onNext(Observable.empty()); + }, + onError: function (e) { + this.onNext(Observable.throwException(e)); + }, + onNext: function (v) { + this.tail.onNext(v); + this.tail.onCompleted(); + } + }); + + return ChainObservable; + + }(Observable)); + + /** @private */ + var Map = (function () { + + /** + * @constructor + * @private + */ + function Map() { + this.keys = []; + this.values = []; + } + + /** + * @private + * @memberOf Map# + */ + Map.prototype['delete'] = function (key) { + var i = this.keys.indexOf(key); + if (i !== -1) { + this.keys.splice(i, 1); + this.values.splice(i, 1); + } + return i !== -1; + }; + + /** + * @private + * @memberOf Map# + */ + Map.prototype.get = function (key, fallback) { + var i = this.keys.indexOf(key); + return i !== -1 ? this.values[i] : fallback; + }; + + /** + * @private + * @memberOf Map# + */ + Map.prototype.set = function (key, value) { + var i = this.keys.indexOf(key); + if (i !== -1) { + this.values[i] = value; + } + this.values[this.keys.push(key) - 1] = value; + }; + + /** + * @private + * @memberOf Map# + */ + Map.prototype.size = function () { return this.keys.length; }; + + /** + * @private + * @memberOf Map# + */ + Map.prototype.has = function (key) { + return this.keys.indexOf(key) !== -1; + }; + + /** + * @private + * @memberOf Map# + */ + Map.prototype.getKeys = function () { return this.keys.slice(0); }; + + /** + * @private + * @memberOf Map# + */ + Map.prototype.getValues = function () { return this.values.slice(0); }; + + return Map; + }()); + + /** + * @constructor + * Represents a join pattern over observable sequences. + */ + function Pattern(patterns) { + this.patterns = patterns; + } + + /** + * Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value. + * + * @param other Observable sequence to match in addition to the current pattern. + * @return Pattern object that matches when all observable sequences in the pattern have an available value. + */ + Pattern.prototype.and = function (other) { + var patterns = this.patterns.slice(0); + patterns.push(other); + return new Pattern(patterns); + }; + + /** + * Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values. + * + * @param selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern. + * @return Plan that produces the projected values, to be fed (with other plans) to the when operator. + */ + Pattern.prototype.then = function (selector) { + return new Plan(this, selector); + }; + + function Plan(expression, selector) { + this.expression = expression; + this.selector = selector; + } + + Plan.prototype.activate = function (externalSubscriptions, observer, deactivate) { + var self = this; + var joinObservers = []; + for (var i = 0, len = this.expression.patterns.length; i < len; i++) { + joinObservers.push(planCreateObserver(externalSubscriptions, this.expression.patterns[i], observer.onError.bind(observer))); + } + var activePlan = new ActivePlan(joinObservers, function () { + var result; + try { + result = self.selector.apply(self, arguments); + } catch (exception) { + observer.onError(exception); + return; + } + observer.onNext(result); + }, function () { + for (var j = 0, jlen = joinObservers.length; j < jlen; j++) { + joinObservers[j].removeActivePlan(activePlan); + } + deactivate(activePlan); + }); + for (i = 0, len = joinObservers.length; i < len; i++) { + joinObservers[i].addActivePlan(activePlan); + } + return activePlan; + }; + + function planCreateObserver(externalSubscriptions, observable, onError) { + var entry = externalSubscriptions.get(observable); + if (!entry) { + var observer = new JoinObserver(observable, onError); + externalSubscriptions.set(observable, observer); + return observer; + } + return entry; + } + + // Active Plan + function ActivePlan(joinObserverArray, onNext, onCompleted) { + var i, joinObserver; + this.joinObserverArray = joinObserverArray; + this.onNext = onNext; + this.onCompleted = onCompleted; + this.joinObservers = new Map(); + for (i = 0; i < this.joinObserverArray.length; i++) { + joinObserver = this.joinObserverArray[i]; + this.joinObservers.set(joinObserver, joinObserver); + } + } + + ActivePlan.prototype.dequeue = function () { + var values = this.joinObservers.getValues(); + for (var i = 0, len = values.length; i < len; i++) { + values[i].queue.shift(); + } + }; + ActivePlan.prototype.match = function () { + var firstValues, i, len, isCompleted, values, hasValues = true; + for (i = 0, len = this.joinObserverArray.length; i < len; i++) { + if (this.joinObserverArray[i].queue.length === 0) { + hasValues = false; + break; + } + } + if (hasValues) { + firstValues = []; + isCompleted = false; + for (i = 0, len = this.joinObserverArray.length; i < len; i++) { + firstValues.push(this.joinObserverArray[i].queue[0]); + if (this.joinObserverArray[i].queue[0].kind === 'C') { + isCompleted = true; + } + } + if (isCompleted) { + this.onCompleted(); + } else { + this.dequeue(); + values = []; + for (i = 0; i < firstValues.length; i++) { + values.push(firstValues[i].value); + } + this.onNext.apply(this, values); + } + } + }; + + /** @private */ + var JoinObserver = (function (_super) { + + inherits(JoinObserver, _super); + + /** + * @constructor + * @private + */ + function JoinObserver(source, onError) { + _super.call(this); + this.source = source; + this.onError = onError; + this.queue = []; + this.activePlans = []; + this.subscription = new SingleAssignmentDisposable(); + this.isDisposed = false; + } + + var JoinObserverPrototype = JoinObserver.prototype; + + /** + * @memberOf JoinObserver# + * @private + */ + JoinObserverPrototype.next = function (notification) { + if (!this.isDisposed) { + if (notification.kind === 'E') { + this.onError(notification.exception); + return; + } + this.queue.push(notification); + var activePlans = this.activePlans.slice(0); + for (var i = 0, len = activePlans.length; i < len; i++) { + activePlans[i].match(); + } + } + }; + + /** + * @memberOf JoinObserver# + * @private + */ + JoinObserverPrototype.error = noop; + + /** + * @memberOf JoinObserver# + * @private + */ + JoinObserverPrototype.completed = noop; + + /** + * @memberOf JoinObserver# + * @private + */ + JoinObserverPrototype.addActivePlan = function (activePlan) { + this.activePlans.push(activePlan); + }; + + /** + * @memberOf JoinObserver# + * @private + */ + JoinObserverPrototype.subscribe = function () { + this.subscription.setDisposable(this.source.materialize().subscribe(this)); + }; + + /** + * @memberOf JoinObserver# + * @private + */ + JoinObserverPrototype.removeActivePlan = function (activePlan) { + var idx = this.activePlans.indexOf(activePlan); + this.activePlans.splice(idx, 1); + if (this.activePlans.length === 0) { + this.dispose(); + } + }; + + /** + * @memberOf JoinObserver# + * @private + */ + JoinObserverPrototype.dispose = function () { + _super.prototype.dispose.call(this); + if (!this.isDisposed) { + this.isDisposed = true; + this.subscription.dispose(); + } + }; + + return JoinObserver; + } (AbstractObserver)); + + /** + * Creates a pattern that matches when both observable sequences have an available value. + * + * @param right Observable sequence to match with the current sequence. + * @return {Pattern} Pattern object that matches when both observable sequences have an available value. + */ + observableProto.and = function (right) { + return new Pattern([this, right]); + }; + + /** + * Matches when the observable sequence has an available value and projects the value. + * + * @param selector Selector that will be invoked for values in the source sequence. + * @returns {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator. + */ + observableProto.then = function (selector) { + return new Pattern([this]).then(selector); + }; + + /** + * Joins together the results from several patterns. + * + * @param plans A series of plans (specified as an Array of as a series of arguments) created by use of the Then operator on patterns. + * @returns {Observable} Observable sequence with the results form matching several patterns. + */ + Observable.when = function () { + var plans = argsOrArray(arguments, 0); + return new AnonymousObservable(function (observer) { + var activePlans = [], + externalSubscriptions = new Map(), + group, + i, len, + joinObserver, + joinValues, + outObserver; + outObserver = observerCreate(observer.onNext.bind(observer), function (exception) { + var values = externalSubscriptions.getValues(); + for (var j = 0, jlen = values.length; j < jlen; j++) { + values[j].onError(exception); + } + observer.onError(exception); + }, observer.onCompleted.bind(observer)); + try { + for (i = 0, len = plans.length; i < len; i++) { + activePlans.push(plans[i].activate(externalSubscriptions, outObserver, function (activePlan) { + var idx = activePlans.indexOf(activePlan); + activePlans.splice(idx, 1); + if (activePlans.length === 0) { + outObserver.onCompleted(); + } + })); + } + } catch (e) { + observableThrow(e).subscribe(observer); + } + group = new CompositeDisposable(); + joinValues = externalSubscriptions.getValues(); + for (i = 0, len = joinValues.length; i < len; i++) { + joinObserver = joinValues[i]; + joinObserver.subscribe(); + group.add(joinObserver); + } + return group; + }); + }; + + function observableTimerDate(dueTime, scheduler) { + return new AnonymousObservable(function (observer) { + return scheduler.scheduleWithAbsolute(dueTime, function () { + observer.onNext(0); + observer.onCompleted(); + }); + }); + } + + function observableTimerDateAndPeriod(dueTime, period, scheduler) { + var p = normalizeTime(period); + return new AnonymousObservable(function (observer) { + var count = 0, d = dueTime; + return scheduler.scheduleRecursiveWithAbsolute(d, function (self) { + var now; + if (p > 0) { + now = scheduler.now(); + d = d + p; + if (d <= now) { + d = now + p; + } + } + observer.onNext(count++); + self(d); + }); + }); + } + + function observableTimerTimeSpan(dueTime, scheduler) { + var d = normalizeTime(dueTime); + return new AnonymousObservable(function (observer) { + return scheduler.scheduleWithRelative(d, function () { + observer.onNext(0); + observer.onCompleted(); + }); + }); + } + + function observableTimerTimeSpanAndPeriod(dueTime, period, scheduler) { + if (dueTime === period) { + return new AnonymousObservable(function (observer) { + return scheduler.schedulePeriodicWithState(0, period, function (count) { + observer.onNext(count); + return count + 1; + }); + }); + } + return observableDefer(function () { + return observableTimerDateAndPeriod(scheduler.now() + dueTime, period, scheduler); + }); + } + + /** + * Returns an observable sequence that produces a value after each period. + * + * @example + * 1 - res = Rx.Observable.interval(1000); + * 2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout); + * + * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds). + * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used. + * @returns {Observable} An observable sequence that produces a value after each period. + */ + var observableinterval = Observable.interval = function (period, scheduler) { + scheduler || (scheduler = timeoutScheduler); + return observableTimerTimeSpanAndPeriod(period, period, scheduler); + }; + + /** + * Returns an observable sequence that produces a value after dueTime has elapsed and then after each period. + * + * @example + * 1 - res = Rx.Observable.timer(new Date()); + * 2 - res = Rx.Observable.timer(new Date(), 1000); + * 3 - res = Rx.Observable.timer(new Date(), Rx.Scheduler.timeout); + * 4 - res = Rx.Observable.timer(new Date(), 1000, Rx.Scheduler.timeout); + * + * 5 - res = Rx.Observable.timer(5000); + * 6 - res = Rx.Observable.timer(5000, 1000); + * 7 - res = Rx.Observable.timer(5000, Rx.Scheduler.timeout); + * 8 - res = Rx.Observable.timer(5000, 1000, Rx.Scheduler.timeout); + * + * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value. + * @param {Mixed} [periodOrScheduler] Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring. + * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period. + */ + var observableTimer = Observable.timer = function (dueTime, periodOrScheduler, scheduler) { + var period; + scheduler || (scheduler = timeoutScheduler); + if (periodOrScheduler !== undefined && typeof periodOrScheduler === 'number') { + period = periodOrScheduler; + } else if (periodOrScheduler !== undefined && typeof periodOrScheduler === 'object') { + scheduler = periodOrScheduler; + } + if (dueTime instanceof Date && period === undefined) { + return observableTimerDate(dueTime.getTime(), scheduler); + } + if (dueTime instanceof Date && period !== undefined) { + period = periodOrScheduler; + return observableTimerDateAndPeriod(dueTime.getTime(), period, scheduler); + } + if (period === undefined) { + return observableTimerTimeSpan(dueTime, scheduler); + } + return observableTimerTimeSpanAndPeriod(dueTime, period, scheduler); + }; + + function observableDelayTimeSpan(dueTime, scheduler) { + var source = this; + return new AnonymousObservable(function (observer) { + var active = false, + cancelable = new SerialDisposable(), + exception = null, + q = [], + running = false, + subscription; + subscription = source.materialize().timestamp(scheduler).subscribe(function (notification) { + var d, shouldRun; + if (notification.value.kind === 'E') { + q = []; + q.push(notification); + exception = notification.value.exception; + shouldRun = !running; + } else { + q.push({ value: notification.value, timestamp: notification.timestamp + dueTime }); + shouldRun = !active; + active = true; + } + if (shouldRun) { + if (exception !== null) { + observer.onError(exception); + } else { + d = new SingleAssignmentDisposable(); + cancelable.setDisposable(d); + d.setDisposable(scheduler.scheduleRecursiveWithRelative(dueTime, function (self) { + var e, recurseDueTime, result, shouldRecurse; + if (exception !== null) { + return; + } + running = true; + do { + result = null; + if (q.length > 0 && q[0].timestamp - scheduler.now() <= 0) { + result = q.shift().value; + } + if (result !== null) { + result.accept(observer); + } + } while (result !== null); + shouldRecurse = false; + recurseDueTime = 0; + if (q.length > 0) { + shouldRecurse = true; + recurseDueTime = Math.max(0, q[0].timestamp - scheduler.now()); + } else { + active = false; + } + e = exception; + running = false; + if (e !== null) { + observer.onError(e); + } else if (shouldRecurse) { + self(recurseDueTime); + } + })); + } + } + }); + return new CompositeDisposable(subscription, cancelable); + }); + } + + function observableDelayDate(dueTime, scheduler) { + var self = this; + return observableDefer(function () { + var timeSpan = dueTime - scheduler.now(); + return observableDelayTimeSpan.call(self, timeSpan, scheduler); + }); + } + + /** + * Time shifts the observable sequence by dueTime. The relative time intervals between the values are preserved. + * + * @example + * 1 - res = Rx.Observable.delay(new Date()); + * 2 - res = Rx.Observable.delay(new Date(), Rx.Scheduler.timeout); + * + * 3 - res = Rx.Observable.delay(5000); + * 4 - res = Rx.Observable.delay(5000, 1000, Rx.Scheduler.timeout); + * @memberOf Observable# + * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence. + * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} Time-shifted sequence. + */ + observableProto.delay = function (dueTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + return dueTime instanceof Date ? + observableDelayDate.call(this, dueTime.getTime(), scheduler) : + observableDelayTimeSpan.call(this, dueTime, scheduler); + }; + + /** + * Ignores values from an observable sequence which are followed by another value before dueTime. + * + * @example + * 1 - res = source.throttle(5000); // 5 seconds + * 2 - res = source.throttle(5000, scheduler); + * + * @param {Number} dueTime Duration of the throttle period for each value (specified as an integer denoting milliseconds). + * @param {Scheduler} [scheduler] Scheduler to run the throttle timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} The throttled sequence. + */ + observableProto.throttle = function (dueTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + var source = this; + return this.throttleWithSelector(function () { return observableTimer(dueTime, scheduler); }) + }; + + /** + * Projects each element of an observable sequence into zero or more windows which are produced based on timing information. + * + * @example + * 1 - res = xs.windowWithTime(1000, scheduler); // non-overlapping segments of 1 second + * 2 - res = xs.windowWithTime(1000, 500 , scheduler); // segments of 1 second with time shift 0.5 seconds + * + * @param {Number} timeSpan Length of each window (specified as an integer denoting milliseconds). + * @param {Mixed} [timeShiftOrScheduler] Interval between creation of consecutive windows (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent windows. + * @param {Scheduler} [scheduler] Scheduler to run windowing timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence of windows. + */ + observableProto.windowWithTime = function (timeSpan, timeShiftOrScheduler, scheduler) { + var source = this, timeShift; + if (timeShiftOrScheduler === undefined) { + timeShift = timeSpan; + } + if (scheduler === undefined) { + scheduler = timeoutScheduler; + } + if (typeof timeShiftOrScheduler === 'number') { + timeShift = timeShiftOrScheduler; + } else if (typeof timeShiftOrScheduler === 'object') { + timeShift = timeSpan; + scheduler = timeShiftOrScheduler; + } + return new AnonymousObservable(function (observer) { + var groupDisposable, + nextShift = timeShift, + nextSpan = timeSpan, + q = [], + refCountDisposable, + timerD = new SerialDisposable(), + totalTime = 0; + groupDisposable = new CompositeDisposable(timerD), + refCountDisposable = new RefCountDisposable(groupDisposable); + + function createTimer () { + var m = new SingleAssignmentDisposable(), + isSpan = false, + isShift = false; + timerD.setDisposable(m); + if (nextSpan === nextShift) { + isSpan = true; + isShift = true; + } else if (nextSpan < nextShift) { + isSpan = true; + } else { + isShift = true; + } + var newTotalTime = isSpan ? nextSpan : nextShift, + ts = newTotalTime - totalTime; + totalTime = newTotalTime; + if (isSpan) { + nextSpan += timeShift; + } + if (isShift) { + nextShift += timeShift; + } + m.setDisposable(scheduler.scheduleWithRelative(ts, function () { + var s; + if (isShift) { + s = new Subject(); + q.push(s); + observer.onNext(addRef(s, refCountDisposable)); + } + if (isSpan) { + s = q.shift(); + s.onCompleted(); + } + createTimer(); + })); + }; + q.push(new Subject()); + observer.onNext(addRef(q[0], refCountDisposable)); + createTimer(); + groupDisposable.add(source.subscribe(function (x) { + var i, s; + for (i = 0; i < q.length; i++) { + s = q[i]; + s.onNext(x); + } + }, function (e) { + var i, s; + for (i = 0; i < q.length; i++) { + s = q[i]; + s.onError(e); + } + observer.onError(e); + }, function () { + var i, s; + for (i = 0; i < q.length; i++) { + s = q[i]; + s.onCompleted(); + } + observer.onCompleted(); + })); + return refCountDisposable; + }); + }; + + /** + * Projects each element of an observable sequence into a window that is completed when either it's full or a given amount of time has elapsed. + * @example + * 1 - res = source.windowWithTimeOrCount(5000, 50); // 5s or 50 items + * 2 - res = source.windowWithTimeOrCount(5000, 50, scheduler); //5s or 50 items + * + * @memberOf Observable# + * @param {Number} timeSpan Maximum time length of a window. + * @param {Number} count Maximum element count of a window. + * @param {Scheduler} [scheduler] Scheduler to run windowing timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence of windows. + */ + observableProto.windowWithTimeOrCount = function (timeSpan, count, scheduler) { + var source = this; + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var createTimer, + groupDisposable, + n = 0, + refCountDisposable, + s, + timerD = new SerialDisposable(), + windowId = 0; + groupDisposable = new CompositeDisposable(timerD); + refCountDisposable = new RefCountDisposable(groupDisposable); + createTimer = function (id) { + var m = new SingleAssignmentDisposable(); + timerD.setDisposable(m); + m.setDisposable(scheduler.scheduleWithRelative(timeSpan, function () { + var newId; + if (id !== windowId) { + return; + } + n = 0; + newId = ++windowId; + s.onCompleted(); + s = new Subject(); + observer.onNext(addRef(s, refCountDisposable)); + createTimer(newId); + })); + }; + s = new Subject(); + observer.onNext(addRef(s, refCountDisposable)); + createTimer(0); + groupDisposable.add(source.subscribe(function (x) { + var newId = 0, newWindow = false; + s.onNext(x); + n++; + if (n === count) { + newWindow = true; + n = 0; + newId = ++windowId; + s.onCompleted(); + s = new Subject(); + observer.onNext(addRef(s, refCountDisposable)); + } + if (newWindow) { + createTimer(newId); + } + }, function (e) { + s.onError(e); + observer.onError(e); + }, function () { + s.onCompleted(); + observer.onCompleted(); + })); + return refCountDisposable; + }); + }; + + /** + * Projects each element of an observable sequence into zero or more buffers which are produced based on timing information. + * + * @example + * 1 - res = xs.bufferWithTime(1000, scheduler); // non-overlapping segments of 1 second + * 2 - res = xs.bufferWithTime(1000, 500, scheduler; // segments of 1 second with time shift 0.5 seconds + * + * @param {Number} timeSpan Length of each buffer (specified as an integer denoting milliseconds). + * @param {Mixed} [timeShiftOrScheduler] Interval between creation of consecutive buffers (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent buffers. + * @param {Scheduler} [scheduler] Scheduler to run buffer timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence of buffers. + */ + observableProto.bufferWithTime = function (timeSpan, timeShiftOrScheduler, scheduler) { + return this.windowWithTime.apply(this, arguments).selectMany(function (x) { return x.toArray(); }); + }; + + /** + * Projects each element of an observable sequence into a buffer that is completed when either it's full or a given amount of time has elapsed. + * + * @example + * 1 - res = source.bufferWithTimeOrCount(5000, 50); // 5s or 50 items in an array + * 2 - res = source.bufferWithTimeOrCount(5000, 50, scheduler); // 5s or 50 items in an array + * + * @param {Number} timeSpan Maximum time length of a buffer. + * @param {Number} count Maximum element count of a buffer. + * @param {Scheduler} [scheduler] Scheduler to run bufferin timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence of buffers. + */ + observableProto.bufferWithTimeOrCount = function (timeSpan, count, scheduler) { + return this.windowWithTimeOrCount(timeSpan, count, scheduler).selectMany(function (x) { + return x.toArray(); + }); + }; + + /** + * Records the time interval between consecutive values in an observable sequence. + * + * @example + * 1 - res = source.timeInterval(); + * 2 - res = source.timeInterval(Rx.Scheduler.timeout); + * + * @param [scheduler] Scheduler used to compute time intervals. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence with time interval information on values. + */ + observableProto.timeInterval = function (scheduler) { + var source = this; + scheduler || (scheduler = timeoutScheduler); + return observableDefer(function () { + var last = scheduler.now(); + return source.select(function (x) { + var now = scheduler.now(), span = now - last; + last = now; + return { + value: x, + interval: span + }; + }); + }); + }; + + /** + * Records the timestamp for each value in an observable sequence. + * + * @example + * 1 - res = source.timestamp(); // produces { value: x, timestamp: ts } + * 2 - res = source.timestamp(Rx.Scheduler.timeout); + * + * @param {Scheduler} [scheduler] Scheduler used to compute timestamps. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence with timestamp information on values. + */ + observableProto.timestamp = function (scheduler) { + scheduler || (scheduler = timeoutScheduler); + return this.select(function (x) { + return { + value: x, + timestamp: scheduler.now() + }; + }); + }; + + function sampleObservable(source, sampler) { + + return new AnonymousObservable(function (observer) { + var atEnd, value, hasValue; + + function sampleSubscribe() { + if (hasValue) { + hasValue = false; + observer.onNext(value); + } + if (atEnd) { + observer.onCompleted(); + } + } + + return new CompositeDisposable( + source.subscribe(function (newValue) { + hasValue = true; + value = newValue; + }, observer.onError.bind(observer), function () { + atEnd = true; + }), + sampler.subscribe(sampleSubscribe, observer.onError.bind(observer), sampleSubscribe) + ); + }); + } + + /** + * Samples the observable sequence at each interval. + * + * @example + * 1 - res = source.sample(sampleObservable); // Sampler tick sequence + * 2 - res = source.sample(5000); // 5 seconds + * 2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds + * + * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable. + * @param {Scheduler} [scheduler] Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used. + * @returns {Observable} Sampled observable sequence. + */ + observableProto.sample = function (intervalOrSampler, scheduler) { + scheduler || (scheduler = timeoutScheduler); + if (typeof intervalOrSampler === 'number') { + return sampleObservable(this, observableinterval(intervalOrSampler, scheduler)); + } + return sampleObservable(this, intervalOrSampler); + }; + + /** + * Returns the source observable sequence or the other observable sequence if dueTime elapses. + * + * @example + * 1 - res = source.timeout(new Date()); // As a date + * 2 - res = source.timeout(5000); // 5 seconds + * 3 - res = source.timeout(new Date(), Rx.Observable.returnValue(42)); // As a date and timeout observable + * 4 - res = source.timeout(5000, Rx.Observable.returnValue(42)); // 5 seconds and timeout observable + * 5 - res = source.timeout(new Date(), Rx.Observable.returnValue(42), Rx.Scheduler.timeout); // As a date and timeout observable + * 6 - res = source.timeout(5000, Rx.Observable.returnValue(42), Rx.Scheduler.timeout); // 5 seconds and timeout observable + * + * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs. + * @param {Observable} [other] Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used. + * @param {Scheduler} [scheduler] Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} The source sequence switching to the other sequence in case of a timeout. + */ + observableProto.timeout = function (dueTime, other, scheduler) { + other || (other = observableThrow(new Error('Timeout'))); + scheduler || (scheduler = timeoutScheduler); + + var source = this, schedulerMethod = dueTime instanceof Date ? + 'scheduleWithAbsolute' : + 'scheduleWithRelative'; + + return new AnonymousObservable(function (observer) { + var id = 0, + original = new SingleAssignmentDisposable(), + subscription = new SerialDisposable(), + switched = false, + timer = new SerialDisposable(); + + subscription.setDisposable(original); + + var createTimer = function () { + var myId = id; + timer.setDisposable(scheduler[schedulerMethod](dueTime, function () { + if (id === myId) { + isPromise(other) && (other = observableFromPromise(other)); + subscription.setDisposable(other.subscribe(observer)); + } + })); + }; + + createTimer(); + + original.setDisposable(source.subscribe(function (x) { + if (!switched) { + id++; + observer.onNext(x); + createTimer(); + } + }, function (e) { + if (!switched) { + id++; + observer.onError(e); + } + }, function () { + if (!switched) { + id++; + observer.onCompleted(); + } + })); + return new CompositeDisposable(subscription, timer); + }); + }; + + /** + * Generates an observable sequence by iterating a state from an initial state until the condition fails. + * + * @example + * res = source.generateWithAbsoluteTime(0, + * function (x) { return return true; }, + * function (x) { return x + 1; }, + * function (x) { return x; }, + * function (x) { return new Date(); } + * }); + * + * @param {Mixed} initialState Initial state. + * @param {Function} condition Condition to terminate generation (upon returning false). + * @param {Function} iterate Iteration step function. + * @param {Function} resultSelector Selector function for results produced in the sequence. + * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning Date values. + * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used. + * @returns {Observable} The generated sequence. + */ + Observable.generateWithAbsoluteTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) { + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var first = true, + hasResult = false, + result, + state = initialState, + time; + return scheduler.scheduleRecursiveWithAbsolute(scheduler.now(), function (self) { + if (hasResult) { + observer.onNext(result); + } + try { + if (first) { + first = false; + } else { + state = iterate(state); + } + hasResult = condition(state); + if (hasResult) { + result = resultSelector(state); + time = timeSelector(state); + } + } catch (e) { + observer.onError(e); + return; + } + if (hasResult) { + self(time); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * Generates an observable sequence by iterating a state from an initial state until the condition fails. + * + * @example + * res = source.generateWithRelativeTime(0, + * function (x) { return return true; }, + * function (x) { return x + 1; }, + * function (x) { return x; }, + * function (x) { return 500; } + * ); + * + * @param {Mixed} initialState Initial state. + * @param {Function} condition Condition to terminate generation (upon returning false). + * @param {Function} iterate Iteration step function. + * @param {Function} resultSelector Selector function for results produced in the sequence. + * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning integer values denoting milliseconds. + * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used. + * @returns {Observable} The generated sequence. + */ + Observable.generateWithRelativeTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) { + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var first = true, + hasResult = false, + result, + state = initialState, + time; + return scheduler.scheduleRecursiveWithRelative(0, function (self) { + if (hasResult) { + observer.onNext(result); + } + try { + if (first) { + first = false; + } else { + state = iterate(state); + } + hasResult = condition(state); + if (hasResult) { + result = resultSelector(state); + time = timeSelector(state); + } + } catch (e) { + observer.onError(e); + return; + } + if (hasResult) { + self(time); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * Time shifts the observable sequence by delaying the subscription. + * + * @example + * 1 - res = source.delaySubscription(5000); // 5s + * 2 - res = source.delaySubscription(5000, Rx.Scheduler.timeout); // 5 seconds + * + * @param {Number} dueTime Absolute or relative time to perform the subscription at. + * @param {Scheduler} [scheduler] Scheduler to run the subscription delay timer on. If not specified, the timeout scheduler is used. + * @returns {Observable} Time-shifted sequence. + */ + observableProto.delaySubscription = function (dueTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + return this.delayWithSelector(observableTimer(dueTime, scheduler), function () { return observableEmpty(); }); + }; + + /** + * Time shifts the observable sequence based on a subscription delay and a delay selector function for each element. + * + * @example + * 1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(5000); }); // with selector only + * 1 - res = source.delayWithSelector(Rx.Observable.timer(2000), function (x) { return Rx.Observable.timer(x); }); // with delay and selector + * + * @param {Observable} [subscriptionDelay] Sequence indicating the delay for the subscription to the source. + * @param {Function} delayDurationSelector Selector function to retrieve a sequence indicating the delay for each given element. + * @returns {Observable} Time-shifted sequence. + */ + observableProto.delayWithSelector = function (subscriptionDelay, delayDurationSelector) { + var source = this, subDelay, selector; + if (typeof subscriptionDelay === 'function') { + selector = subscriptionDelay; + } else { + subDelay = subscriptionDelay; + selector = delayDurationSelector; + } + return new AnonymousObservable(function (observer) { + var delays = new CompositeDisposable(), atEnd = false, done = function () { + if (atEnd && delays.length === 0) { + observer.onCompleted(); + } + }, subscription = new SerialDisposable(), start = function () { + subscription.setDisposable(source.subscribe(function (x) { + var delay; + try { + delay = selector(x); + } catch (error) { + observer.onError(error); + return; + } + var d = new SingleAssignmentDisposable(); + delays.add(d); + d.setDisposable(delay.subscribe(function () { + observer.onNext(x); + delays.remove(d); + done(); + }, observer.onError.bind(observer), function () { + observer.onNext(x); + delays.remove(d); + done(); + })); + }, observer.onError.bind(observer), function () { + atEnd = true; + subscription.dispose(); + done(); + })); + }; + + if (!subDelay) { + start(); + } else { + subscription.setDisposable(subDelay.subscribe(function () { + start(); + }, observer.onError.bind(observer), function () { start(); })); + } + + return new CompositeDisposable(subscription, delays); + }); + }; + + /** + * Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled. + * + * @example + * 1 - res = source.timeoutWithSelector(Rx.Observable.timer(500)); + * 2 - res = source.timeoutWithSelector(Rx.Observable.timer(500), function (x) { return Rx.Observable.timer(200); }); + * 3 - res = source.timeoutWithSelector(Rx.Observable.timer(500), function (x) { return Rx.Observable.timer(200); }, Rx.Observable.returnValue(42)); + * + * @param {Observable} [firstTimeout] Observable sequence that represents the timeout for the first element. If not provided, this defaults to Observable.never(). + * @param {Function} [timeoutDurationSelector] Selector to retrieve an observable sequence that represents the timeout between the current element and the next element. + * @param {Observable} [other] Sequence to return in case of a timeout. If not provided, this is set to Observable.throwException(). + * @returns {Observable} The source sequence switching to the other sequence in case of a timeout. + */ + observableProto.timeoutWithSelector = function (firstTimeout, timeoutdurationSelector, other) { + if (arguments.length === 1) { + timeoutdurationSelector = firstTimeout; + var firstTimeout = observableNever(); + } + other || (other = observableThrow(new Error('Timeout'))); + var source = this; + return new AnonymousObservable(function (observer) { + var subscription = new SerialDisposable(), timer = new SerialDisposable(), original = new SingleAssignmentDisposable(); + + subscription.setDisposable(original); + + var id = 0, switched = false, setTimer = function (timeout) { + var myId = id, timerWins = function () { + return id === myId; + }; + var d = new SingleAssignmentDisposable(); + timer.setDisposable(d); + d.setDisposable(timeout.subscribe(function () { + if (timerWins()) { + subscription.setDisposable(other.subscribe(observer)); + } + d.dispose(); + }, function (e) { + if (timerWins()) { + observer.onError(e); + } + }, function () { + if (timerWins()) { + subscription.setDisposable(other.subscribe(observer)); + } + })); + }; + + setTimer(firstTimeout); + var observerWins = function () { + var res = !switched; + if (res) { + id++; + } + return res; + }; + + original.setDisposable(source.subscribe(function (x) { + if (observerWins()) { + observer.onNext(x); + var timeout; + try { + timeout = timeoutdurationSelector(x); + } catch (e) { + observer.onError(e); + return; + } + setTimer(timeout); + } + }, function (e) { + if (observerWins()) { + observer.onError(e); + } + }, function () { + if (observerWins()) { + observer.onCompleted(); + } + })); + return new CompositeDisposable(subscription, timer); + }); + }; + + /** + * Ignores values from an observable sequence which are followed by another value within a computed throttle duration. + * + * @example + * 1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(x + x); }); + * + * @param {Function} throttleDurationSelector Selector function to retrieve a sequence indicating the throttle duration for each given element. + * @returns {Observable} The throttled sequence. + */ + observableProto.throttleWithSelector = function (throttleDurationSelector) { + var source = this; + return new AnonymousObservable(function (observer) { + var value, hasValue = false, cancelable = new SerialDisposable(), id = 0, subscription = source.subscribe(function (x) { + var throttle; + try { + throttle = throttleDurationSelector(x); + } catch (e) { + observer.onError(e); + return; + } + hasValue = true; + value = x; + id++; + var currentid = id, d = new SingleAssignmentDisposable(); + cancelable.setDisposable(d); + d.setDisposable(throttle.subscribe(function () { + if (hasValue && id === currentid) { + observer.onNext(value); + } + hasValue = false; + d.dispose(); + }, observer.onError.bind(observer), function () { + if (hasValue && id === currentid) { + observer.onNext(value); + } + hasValue = false; + d.dispose(); + })); + }, function (e) { + cancelable.dispose(); + observer.onError(e); + hasValue = false; + id++; + }, function () { + cancelable.dispose(); + if (hasValue) { + observer.onNext(value); + } + observer.onCompleted(); + hasValue = false; + id++; + }); + return new CompositeDisposable(subscription, cancelable); + }); + }; + + /** + * Skips elements for the specified duration from the end of the observable source sequence, using the specified scheduler to run timers. + * + * 1 - res = source.skipLastWithTime(5000); + * 2 - res = source.skipLastWithTime(5000, scheduler); + * + * @description + * This operator accumulates a queue with a length enough to store elements received during the initial duration window. + * As more elements are received, elements older than the specified duration are taken from the queue and produced on the + * result sequence. This causes elements to be delayed with duration. + * @param {Number} duration Duration for skipping elements from the end of the sequence. + * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout + * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the end of the source sequence. + */ + observableProto.skipLastWithTime = function (duration, scheduler) { + scheduler || (scheduler = timeoutScheduler); + var source = this; + return new AnonymousObservable(function (observer) { + var q = []; + return source.subscribe(function (x) { + var now = scheduler.now(); + q.push({ interval: now, value: x }); + while (q.length > 0 && now - q[0].interval >= duration) { + observer.onNext(q.shift().value); + } + }, observer.onError.bind(observer), function () { + var now = scheduler.now(); + while (q.length > 0 && now - q[0].interval >= duration) { + observer.onNext(q.shift().value); + } + observer.onCompleted(); + }); + }); + }; + + /** + * Returns elements within the specified duration from the end of the observable source sequence, using the specified schedulers to run timers and to drain the collected elements. + * + * @example + * 1 - res = source.takeLastWithTime(5000, [optional timer scheduler], [optional loop scheduler]); + * @description + * This operator accumulates a queue with a length enough to store elements received during the initial duration window. + * As more elements are received, elements older than the specified duration are taken from the queue and produced on the + * result sequence. This causes elements to be delayed with duration. + * @param {Number} duration Duration for taking elements from the end of the sequence. + * @param {Scheduler} [timerScheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @param {Scheduler} [loopScheduler] Scheduler to drain the collected elements. If not specified, defaults to Rx.Scheduler.immediate. + * @returns {Observable} An observable sequence with the elements taken during the specified duration from the end of the source sequence. + */ + observableProto.takeLastWithTime = function (duration, timerScheduler, loopScheduler) { + return this.takeLastBufferWithTime(duration, timerScheduler).selectMany(function (xs) { return observableFromArray(xs, loopScheduler); }); + }; + + /** + * Returns an array with the elements within the specified duration from the end of the observable source sequence, using the specified scheduler to run timers. + * + * @example + * 1 - res = source.takeLastBufferWithTime(5000, [optional scheduler]); + * @description + * This operator accumulates a queue with a length enough to store elements received during the initial duration window. + * As more elements are received, elements older than the specified duration are taken from the queue and produced on the + * result sequence. This causes elements to be delayed with duration. + * @param {Number} duration Duration for taking elements from the end of the sequence. + * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @returns {Observable} An observable sequence containing a single array with the elements taken during the specified duration from the end of the source sequence. + */ + observableProto.takeLastBufferWithTime = function (duration, scheduler) { + var source = this; + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var q = []; + + return source.subscribe(function (x) { + var now = scheduler.now(); + q.push({ interval: now, value: x }); + while (q.length > 0 && now - q[0].interval >= duration) { + q.shift(); + } + }, observer.onError.bind(observer), function () { + var now = scheduler.now(), res = []; + while (q.length > 0) { + var next = q.shift(); + if (now - next.interval <= duration) { + res.push(next.value); + } + } + + observer.onNext(res); + observer.onCompleted(); + }); + }); + }; + + /** + * Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers. + * + * @example + * 1 - res = source.takeWithTime(5000, [optional scheduler]); + * @description + * This operator accumulates a queue with a length enough to store elements received during the initial duration window. + * As more elements are received, elements older than the specified duration are taken from the queue and produced on the + * result sequence. This causes elements to be delayed with duration. + * @param {Number} duration Duration for taking elements from the start of the sequence. + * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @returns {Observable} An observable sequence with the elements taken during the specified duration from the start of the source sequence. + */ + observableProto.takeWithTime = function (duration, scheduler) { + var source = this; + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var t = scheduler.scheduleWithRelative(duration, function () { + observer.onCompleted(); + }); + + return new CompositeDisposable(t, source.subscribe(observer)); + }); + }; + + /** + * Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers. + * + * @example + * 1 - res = source.skipWithTime(5000, [optional scheduler]); + * + * @description + * Specifying a zero value for duration doesn't guarantee no elements will be dropped from the start of the source sequence. + * This is a side-effect of the asynchrony introduced by the scheduler, where the action that causes callbacks from the source sequence to be forwarded + * may not execute immediately, despite the zero due time. + * + * Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the duration. + * @param {Number} duration Duration for skipping elements from the start of the sequence. + * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the start of the source sequence. + */ + observableProto.skipWithTime = function (duration, scheduler) { + var source = this; + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var open = false, + t = scheduler.scheduleWithRelative(duration, function () { open = true; }), + d = source.subscribe(function (x) { + if (open) { + observer.onNext(x); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + + return new CompositeDisposable(t, d); + }); + }; + + /** + * Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers. + * Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time. + * + * @examples + * 1 - res = source.skipUntilWithTime(new Date(), [optional scheduler]); + * 2 - res = source.skipUntilWithTime(5000, [optional scheduler]); + * @param startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped. + * @param scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @returns {Observable} An observable sequence with the elements skipped until the specified start time. + */ + observableProto.skipUntilWithTime = function (startTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + var source = this, schedulerMethod = startTime instanceof Date ? + 'scheduleWithAbsolute' : + 'scheduleWithRelative'; + return new AnonymousObservable(function (observer) { + var open = false; + + return new CompositeDisposable( + scheduler[schedulerMethod](startTime, function () { open = true; }), + source.subscribe( + function (x) { open && observer.onNext(x); }, + observer.onError.bind(observer), + observer.onCompleted.bind(observer))); + }); + }; + + /** + * Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers. + * + * @example + * 1 - res = source.takeUntilWithTime(new Date(), [optional scheduler]); + * 2 - res = source.takeUntilWithTime(5000, [optional scheduler]); + * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately. + * @param {Scheduler} scheduler Scheduler to run the timer on. + * @returns {Observable} An observable sequence with the elements taken until the specified end time. + */ + observableProto.takeUntilWithTime = function (endTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + var source = this, schedulerMethod = endTime instanceof Date ? + 'scheduleWithAbsolute' : + 'scheduleWithRelative'; + return new AnonymousObservable(function (observer) { + return new CompositeDisposable(scheduler[schedulerMethod](endTime, function () { + observer.onCompleted(); + }), source.subscribe(observer)); + }); + }; + + /* + * Performs a exclusive waiting for the first to finish before subscribing to another observable. + * Observables that come in between subscriptions will be dropped on the floor. + * @returns {Observable} A exclusive observable with only the results that happen when subscribed. + */ + observableProto.exclusive = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var hasCurrent = false, + isStopped = false, + m = new SingleAssignmentDisposable(), + g = new CompositeDisposable(); + + g.add(m); + + m.setDisposable(sources.subscribe( + function (innerSource) { + if (!hasCurrent) { + hasCurrent = true; + + isPromise(innerSource) && (innerSource = observableFromPromise(innerSource)); + + var innerSubscription = new SingleAssignmentDisposable(); + g.add(innerSubscription); + + innerSubscription.setDisposable(innerSource.subscribe( + observer.onNext.bind(observer), + observer.onError.bind(observer), + function () { + g.remove(innerSubscription); + hasCurrent = false; + if (isStopped && g.length === 1) { + observer.onCompleted(); + } + })); + } + }, + observer.onError.bind(observer), + function () { + isStopped = true; + if (!hasCurrent && g.length === 1) { + observer.onCompleted(); + } + })); + + return g; + }); + }; + /* + * Performs a exclusive map waiting for the first to finish before subscribing to another observable. + * Observables that come in between subscriptions will be dropped on the floor. + * @param {Function} selector Selector to invoke for every item in the current subscription. + * @param {Any} [thisArg] An optional context to invoke with the selector parameter. + * @returns {Observable} An exclusive observable with only the results that happen when subscribed. + */ + observableProto.exclusiveMap = function (selector, thisArg) { + var sources = this; + return new AnonymousObservable(function (observer) { + var index = 0, + hasCurrent = false, + isStopped = true, + m = new SingleAssignmentDisposable(), + g = new CompositeDisposable(); + + g.add(m); + + m.setDisposable(sources.subscribe( + function (innerSource) { + + if (!hasCurrent) { + hasCurrent = true; + + innerSubscription = new SingleAssignmentDisposable(); + g.add(innerSubscription); + + isPromise(innerSource) && (innerSource = observableFromPromise(innerSource)); + + innerSubscription.setDisposable(innerSource.subscribe( + function (x) { + var result; + try { + result = selector.call(thisArg, x, index++, innerSource); + } catch (e) { + observer.onError(e); + return; + } + + observer.onNext(result); + }, + observer.onError.bind(observer), + function () { + g.remove(innerSubscription); + hasCurrent = false; + + if (isStopped && g.length === 1) { + observer.onCompleted(); + } + })); + } + }, + observer.onError.bind(observer), + function () { + isStopped = true; + if (g.length === 1 && !hasCurrent) { + observer.onCompleted(); + } + })); + return g; + }); + }; + /** Provides a set of extension methods for virtual time scheduling. */ + Rx.VirtualTimeScheduler = (function (_super) { + + function notImplemented() { + throw new Error('Not implemented'); + } + + function localNow() { + return this.toDateTimeOffset(this.clock); + } + + function scheduleNow(state, action) { + return this.scheduleAbsoluteWithState(state, this.clock, action); + } + + function scheduleRelative(state, dueTime, action) { + return this.scheduleRelativeWithState(state, this.toRelative(dueTime), action); + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleRelativeWithState(state, this.toRelative(dueTime - this.now()), action); + } + + function invokeAction(scheduler, action) { + action(); + return disposableEmpty; + } + + inherits(VirtualTimeScheduler, _super); + + /** + * Creates a new virtual time scheduler with the specified initial clock value and absolute time comparer. + * + * @constructor + * @param {Number} initialClock Initial value for the clock. + * @param {Function} comparer Comparer to determine causality of events based on absolute time. + */ + function VirtualTimeScheduler(initialClock, comparer) { + this.clock = initialClock; + this.comparer = comparer; + this.isEnabled = false; + this.queue = new PriorityQueue(1024); + _super.call(this, localNow, scheduleNow, scheduleRelative, scheduleAbsolute); + } + + var VirtualTimeSchedulerPrototype = VirtualTimeScheduler.prototype; + + /** + * Adds a relative time value to an absolute time value. + * @param {Number} absolute Absolute virtual time value. + * @param {Number} relative Relative virtual time value to add. + * @return {Number} Resulting absolute virtual time sum value. + */ + VirtualTimeSchedulerPrototype.add = notImplemented; + + /** + * Converts an absolute time to a number + * @param {Any} The absolute time. + * @returns {Number} The absolute time in ms + */ + VirtualTimeSchedulerPrototype.toDateTimeOffset = notImplemented; + + /** + * Converts the TimeSpan value to a relative virtual time value. + * @param {Number} timeSpan TimeSpan value to convert. + * @return {Number} Corresponding relative virtual time value. + */ + VirtualTimeSchedulerPrototype.toRelative = notImplemented; + + /** + * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be emulated using recursive scheduling. + * @param {Mixed} state Initial state passed to the action upon the first iteration. + * @param {Number} period Period for running the work periodically. + * @param {Function} action Action to be executed, potentially updating the state. + * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort). + */ + VirtualTimeSchedulerPrototype.schedulePeriodicWithState = function (state, period, action) { + var s = new SchedulePeriodicRecursive(this, state, period, action); + return s.start(); + }; + + /** + * Schedules an action to be executed after dueTime. + * @param {Mixed} state State passed to the action to be executed. + * @param {Number} dueTime Relative time after which to execute the action. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + VirtualTimeSchedulerPrototype.scheduleRelativeWithState = function (state, dueTime, action) { + var runAt = this.add(this.clock, dueTime); + return this.scheduleAbsoluteWithState(state, runAt, action); + }; + + /** + * Schedules an action to be executed at dueTime. + * @param {Number} dueTime Relative time after which to execute the action. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + VirtualTimeSchedulerPrototype.scheduleRelative = function (dueTime, action) { + return this.scheduleRelativeWithState(action, dueTime, invokeAction); + }; + + /** + * Starts the virtual time scheduler. + */ + VirtualTimeSchedulerPrototype.start = function () { + var next; + if (!this.isEnabled) { + this.isEnabled = true; + do { + next = this.getNext(); + if (next !== null) { + if (this.comparer(next.dueTime, this.clock) > 0) { + this.clock = next.dueTime; + } + next.invoke(); + } else { + this.isEnabled = false; + } + } while (this.isEnabled); + } + }; + + /** + * Stops the virtual time scheduler. + */ + VirtualTimeSchedulerPrototype.stop = function () { + this.isEnabled = false; + }; + + /** + * Advances the scheduler's clock to the specified time, running all work till that point. + * @param {Number} time Absolute time to advance the scheduler's clock to. + */ + VirtualTimeSchedulerPrototype.advanceTo = function (time) { + var next; + var dueToClock = this.comparer(this.clock, time); + if (this.comparer(this.clock, time) > 0) { + throw new Error(argumentOutOfRange); + } + if (dueToClock === 0) { + return; + } + if (!this.isEnabled) { + this.isEnabled = true; + do { + next = this.getNext(); + if (next !== null && this.comparer(next.dueTime, time) <= 0) { + if (this.comparer(next.dueTime, this.clock) > 0) { + this.clock = next.dueTime; + } + next.invoke(); + } else { + this.isEnabled = false; + } + } while (this.isEnabled); + this.clock = time; + } + }; + + /** + * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan. + * @param {Number} time Relative time to advance the scheduler's clock by. + */ + VirtualTimeSchedulerPrototype.advanceBy = function (time) { + var dt = this.add(this.clock, time); + var dueToClock = this.comparer(this.clock, dt); + if (dueToClock > 0) { + throw new Error(argumentOutOfRange); + } + if (dueToClock === 0) { + return; + } + this.advanceTo(dt); + }; + + /** + * Advances the scheduler's clock by the specified relative time. + * @param {Number} time Relative time to advance the scheduler's clock by. + */ + VirtualTimeSchedulerPrototype.sleep = function (time) { + var dt = this.add(this.clock, time); + + if (this.comparer(this.clock, dt) >= 0) { + throw new Error(argumentOutOfRange); + } + + this.clock = dt; + }; + + /** + * Gets the next scheduled item to be executed. + * @returns {ScheduledItem} The next scheduled item. + */ + VirtualTimeSchedulerPrototype.getNext = function () { + var next; + while (this.queue.length > 0) { + next = this.queue.peek(); + if (next.isCancelled()) { + this.queue.dequeue(); + } else { + return next; + } + } + return null; + }; + + /** + * Schedules an action to be executed at dueTime. + * @param {Scheduler} scheduler Scheduler to execute the action on. + * @param {Number} dueTime Absolute time at which to execute the action. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + VirtualTimeSchedulerPrototype.scheduleAbsolute = function (dueTime, action) { + return this.scheduleAbsoluteWithState(action, dueTime, invokeAction); + }; + + /** + * Schedules an action to be executed at dueTime. + * @param {Mixed} state State passed to the action to be executed. + * @param {Number} dueTime Absolute time at which to execute the action. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + VirtualTimeSchedulerPrototype.scheduleAbsoluteWithState = function (state, dueTime, action) { + var self = this, + run = function (scheduler, state1) { + self.queue.remove(si); + return action(scheduler, state1); + }, + si = new ScheduledItem(self, state, run, dueTime, self.comparer); + self.queue.enqueue(si); + return si.disposable; + }; + + return VirtualTimeScheduler; + }(Scheduler)); + + /** Provides a virtual time scheduler that uses Date for absolute time and number for relative time. */ + Rx.HistoricalScheduler = (function (_super) { + inherits(HistoricalScheduler, _super); + + /** + * Creates a new historical scheduler with the specified initial clock value. + * + * @constructor + * @param {Number} initialClock Initial value for the clock. + * @param {Function} comparer Comparer to determine causality of events based on absolute time. + */ + function HistoricalScheduler(initialClock, comparer) { + var clock = initialClock == null ? 0 : initialClock; + var cmp = comparer || defaultSubComparer; + _super.call(this, clock, cmp); + } + + var HistoricalSchedulerProto = HistoricalScheduler.prototype; + + /** + * Adds a relative time value to an absolute time value. + * @param {Number} absolute Absolute virtual time value. + * @param {Number} relative Relative virtual time value to add. + * @return {Number} Resulting absolute virtual time sum value. + */ + HistoricalSchedulerProto.add = function (absolute, relative) { + return absolute + relative; + }; + + /** + * @private + */ + HistoricalSchedulerProto.toDateTimeOffset = function (absolute) { + return new Date(absolute).getTime(); + }; + + /** + * Converts the TimeSpan value to a relative virtual time value. + * + * @memberOf HistoricalScheduler + * @param {Number} timeSpan TimeSpan value to convert. + * @return {Number} Corresponding relative virtual time value. + */ + HistoricalSchedulerProto.toRelative = function (timeSpan) { + return timeSpan; + }; + + return HistoricalScheduler; + }(Rx.VirtualTimeScheduler)); + var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) { + inherits(AnonymousObservable, __super__); + + // Fix subscriber to check for undefined or function returned to decorate as Disposable + function fixSubscriber(subscriber) { + if (typeof subscriber === 'undefined') { + subscriber = disposableEmpty; + } else if (typeof subscriber === 'function') { + subscriber = disposableCreate(subscriber); + } + + return subscriber; + } + + function AnonymousObservable(subscribe) { + if (!(this instanceof AnonymousObservable)) { + return new AnonymousObservable(subscribe); + } + + function s(observer) { + var setDisposable = function () { + try { + autoDetachObserver.setDisposable(fixSubscriber(subscribe(autoDetachObserver))); + } catch (e) { + if (!autoDetachObserver.fail(e)) { + throw e; + } + } + }; + + var autoDetachObserver = new AutoDetachObserver(observer); + if (currentThreadScheduler.scheduleRequired()) { + currentThreadScheduler.schedule(setDisposable); + } else { + setDisposable(); + } + + return autoDetachObserver; + } + + __super__.call(this, s); + } + + return AnonymousObservable; + + }(Observable)); + + /** @private */ + var AutoDetachObserver = (function (_super) { + inherits(AutoDetachObserver, _super); + + function AutoDetachObserver(observer) { + _super.call(this); + this.observer = observer; + this.m = new SingleAssignmentDisposable(); + } + + var AutoDetachObserverPrototype = AutoDetachObserver.prototype; + + AutoDetachObserverPrototype.next = function (value) { + var noError = false; + try { + this.observer.onNext(value); + noError = true; + } catch (e) { + throw e; + } finally { + if (!noError) { + this.dispose(); + } + } + }; + + AutoDetachObserverPrototype.error = function (exn) { + try { + this.observer.onError(exn); + } catch (e) { + throw e; + } finally { + this.dispose(); + } + }; + + AutoDetachObserverPrototype.completed = function () { + try { + this.observer.onCompleted(); + } catch (e) { + throw e; + } finally { + this.dispose(); + } + }; + + AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); }; + AutoDetachObserverPrototype.getDisposable = function (value) { return this.m.getDisposable(); }; + /* @private */ + AutoDetachObserverPrototype.disposable = function (value) { + return arguments.length ? this.getDisposable() : setDisposable(value); + }; + + AutoDetachObserverPrototype.dispose = function () { + _super.prototype.dispose.call(this); + this.m.dispose(); + }; + + return AutoDetachObserver; + }(AbstractObserver)); + + /** @private */ + var GroupedObservable = (function (_super) { + inherits(GroupedObservable, _super); + + function subscribe(observer) { + return this.underlyingObservable.subscribe(observer); + } + + /** + * @constructor + * @private + */ + function GroupedObservable(key, underlyingObservable, mergedDisposable) { + _super.call(this, subscribe); + this.key = key; + this.underlyingObservable = !mergedDisposable ? + underlyingObservable : + new AnonymousObservable(function (observer) { + return new CompositeDisposable(mergedDisposable.getDisposable(), underlyingObservable.subscribe(observer)); + }); + } + + return GroupedObservable; + }(Observable)); + + /** + * Represents an object that is both an observable sequence as well as an observer. + * Each notification is broadcasted to all subscribed observers. + */ + var Subject = Rx.Subject = (function (_super) { + function subscribe(observer) { + checkDisposed.call(this); + if (!this.isStopped) { + this.observers.push(observer); + return new InnerSubscription(this, observer); + } + if (this.exception) { + observer.onError(this.exception); + return disposableEmpty; + } + observer.onCompleted(); + return disposableEmpty; + } + + inherits(Subject, _super); + + /** + * Creates a subject. + * @constructor + */ + function Subject() { + _super.call(this, subscribe); + this.isDisposed = false, + this.isStopped = false, + this.observers = []; + } + + addProperties(Subject.prototype, Observer, { + /** + * Indicates whether the subject has observers subscribed to it. + * @returns {Boolean} Indicates whether the subject has observers subscribed to it. + */ + hasObservers: function () { + return this.observers.length > 0; + }, + /** + * Notifies all subscribed observers about the end of the sequence. + */ + onCompleted: function () { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + for (var i = 0, len = os.length; i < len; i++) { + os[i].onCompleted(); + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the exception. + * @param {Mixed} error The exception to send to all observers. + */ + onError: function (exception) { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + this.exception = exception; + for (var i = 0, len = os.length; i < len; i++) { + os[i].onError(exception); + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the arrival of the specified element in the sequence. + * @param {Mixed} value The value to send to all observers. + */ + onNext: function (value) { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + for (var i = 0, len = os.length; i < len; i++) { + os[i].onNext(value); + } + } + }, + /** + * Unsubscribe all observers and release resources. + */ + dispose: function () { + this.isDisposed = true; + this.observers = null; + } + }); + + /** + * Creates a subject from the specified observer and observable. + * @param {Observer} observer The observer used to send messages to the subject. + * @param {Observable} observable The observable used to subscribe to messages sent from the subject. + * @returns {Subject} Subject implemented using the given observer and observable. + */ + Subject.create = function (observer, observable) { + return new AnonymousSubject(observer, observable); + }; + + return Subject; + }(Observable)); + + /** + * Represents the result of an asynchronous operation. + * The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers. + */ + var AsyncSubject = Rx.AsyncSubject = (function (_super) { + + function subscribe(observer) { + checkDisposed.call(this); + + if (!this.isStopped) { + this.observers.push(observer); + return new InnerSubscription(this, observer); + } + + var ex = this.exception, + hv = this.hasValue, + v = this.value; + + if (ex) { + observer.onError(ex); + } else if (hv) { + observer.onNext(v); + observer.onCompleted(); + } else { + observer.onCompleted(); + } + + return disposableEmpty; + } + + inherits(AsyncSubject, _super); + + /** + * Creates a subject that can only receive one value and that value is cached for all future observations. + * @constructor + */ + function AsyncSubject() { + _super.call(this, subscribe); + + this.isDisposed = false; + this.isStopped = false; + this.value = null; + this.hasValue = false; + this.observers = []; + this.exception = null; + } + + addProperties(AsyncSubject.prototype, Observer, { + /** + * Indicates whether the subject has observers subscribed to it. + * @returns {Boolean} Indicates whether the subject has observers subscribed to it. + */ + hasObservers: function () { + checkDisposed.call(this); + return this.observers.length > 0; + }, + /** + * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any). + */ + onCompleted: function () { + var o, i, len; + checkDisposed.call(this); + if (!this.isStopped) { + this.isStopped = true; + var os = this.observers.slice(0), + v = this.value, + hv = this.hasValue; + + if (hv) { + for (i = 0, len = os.length; i < len; i++) { + o = os[i]; + o.onNext(v); + o.onCompleted(); + } + } else { + for (i = 0, len = os.length; i < len; i++) { + os[i].onCompleted(); + } + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the exception. + * @param {Mixed} error The exception to send to all observers. + */ + onError: function (exception) { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + this.exception = exception; + + for (var i = 0, len = os.length; i < len; i++) { + os[i].onError(exception); + } + + this.observers = []; + } + }, + /** + * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers. + * @param {Mixed} value The value to store in the subject. + */ + onNext: function (value) { + checkDisposed.call(this); + if (!this.isStopped) { + this.value = value; + this.hasValue = true; + } + }, + /** + * Unsubscribe all observers and release resources. + */ + dispose: function () { + this.isDisposed = true; + this.observers = null; + this.exception = null; + this.value = null; + } + }); + + return AsyncSubject; + }(Observable)); + + /** @private */ + var AnonymousSubject = (function (_super) { + inherits(AnonymousSubject, _super); + + function subscribe(observer) { + return this.observable.subscribe(observer); + } + + /** + * @private + * @constructor + */ + function AnonymousSubject(observer, observable) { + _super.call(this, subscribe); + this.observer = observer; + this.observable = observable; + } + + addProperties(AnonymousSubject.prototype, Observer, { + /** + * @private + * @memberOf AnonymousSubject# + */ + onCompleted: function () { + this.observer.onCompleted(); + }, + /** + * @private + * @memberOf AnonymousSubject# + */ + onError: function (exception) { + this.observer.onError(exception); + }, + /** + * @private + * @memberOf AnonymousSubject# + */ + onNext: function (value) { + this.observer.onNext(value); + } + }); + + return AnonymousSubject; + }(Observable)); + + if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) { + root.Rx = Rx; + + define(function() { + return Rx; + }); + } else if (freeExports && freeModule) { + // in Node.js or RingoJS + if (moduleExports) { + (freeModule.exports = Rx).Rx = Rx; + } else { + freeExports.Rx = Rx; + } + } else { + // in a browser or Rhino + root.Rx = Rx; + } +}.call(this)); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.all.min.js b/ajax/libs/rxjs/2.2.28/rx.all.min.js new file mode 100644 index 000000000..5a6a72059 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.all.min.js @@ -0,0 +1,3 @@ +(function(t){function e(){if(this.isDisposed)throw Error(le)}function n(t){var e=typeof t;return t&&("function"==e||"object"==e)||!1}function r(t){var e=[];if(!n(t))return e;qe.nonEnumArgs&&t.length&&u(t)&&(t=Te.call(t));var r=qe.enumPrototypes&&"function"==typeof t,i=qe.enumErrorProps&&(t===Ne||t instanceof Error);for(var o in t)r&&"prototype"==o||i&&("message"==o||"name"==o)||e.push(o);if(qe.nonEnumShadows&&t!==Oe){var s=t.constructor,c=-1,a=We.length;if(t===(s&&s.prototype))var h=t===stringProto?De:t===Ne?we:Se.call(t),l=ke[h];for(;a>++c;)o=We[c],l&&l[o]||!_e.call(t,o)||e.push(o)}return e}function i(t,e,n){for(var r=-1,i=n(t),o=i.length;o>++r;){var s=i[r];if(e(t[s],s,t)===!1)break}return t}function o(t,e){return i(t,e,r)}function s(t){return"function"!=typeof t.toString&&"string"==typeof(t+"")}function u(t){return t&&"object"==typeof t?Se.call(t)==ve:!1}function c(t){return"function"==typeof t||!1}function a(e,n,r,i){if(e===n)return 0!==e||1/e==1/n;var h=typeof e,l=typeof n;if(e===e&&(null==e||null==n||"function"!=h&&"object"!=h&&"function"!=l&&"object"!=l))return!1;var f=Se.call(e),p=Se.call(n);if(f==ve&&(f=xe),p==ve&&(p=xe),f!=p)return!1;switch(f){case me:case ye:return+e==+n;case Ee:return e!=+e?n!=+n:0==e?1/e==1/n:e==+n;case Ce:case De:return e==n+""}var d=f==be;if(!d){if(f!=xe||!qe.nodeClass&&(s(e)||s(n)))return!1;var v=!qe.argsObject&&u(e)?Object:e.constructor,b=!qe.argsObject&&u(n)?Object:n.constructor;if(!(v==b||_e.call(e,"constructor")&&_e.call(n,"constructor")||c(v)&&v instanceof v&&c(b)&&b instanceof b||!("constructor"in e&&"constructor"in n)))return!1}r||(r=[]),i||(i=[]);for(var m=r.length;m--;)if(r[m]==e)return i[m]==n;var y=0;if(result=!0,r.push(e),i.push(n),d){if(m=e.length,y=n.length,result=y==m)for(;y--;){var w=n[y];if(!(result=a(e[y],w,r,i)))break}}else o(n,function(n,o,s){return _e.call(s,o)?(y++,result=_e.call(e,o)&&a(e[o],n,r,i)):t}),result&&o(e,function(e,n,r){return _e.call(r,n)?result=--y>-1:t});return r.pop(),i.pop(),result}function h(t,e){return 1===t.length&&Array.isArray(t[e])?t[e]:Te.call(t)}function l(t,e){for(var n=Array(t),r=0;t>r;r++)n[r]=e();return n}function f(t,e){this.scheduler=t,this.disposable=e,this.isDisposed=!1}function p(e,n){return new ur(function(r){var i=new Je,o=new Xe;return o.setDisposable(i),i.setDisposable(e.subscribe(r.onNext.bind(r),function(e){var i,s;try{s=n(e)}catch(u){return r.onError(u),t}ce(s)&&(s=_n(s)),i=new Je,o.setDisposable(i),i.setDisposable(s.subscribe(r))},r.onCompleted.bind(r))),o})}function d(e,n){var r=this;return new ur(function(i){var o=0,s=e.length;return r.subscribe(function(r){if(s>o){var u,c=e[o++];try{u=n(r,c)}catch(a){return i.onError(a),t}i.onNext(u)}else i.onCompleted()},i.onError.bind(i),i.onCompleted.bind(i))})}function v(t){return this.map(function(e,n){var r=t(e,n);return ce(r)?_n(r):r}).concatAll()}function b(t){return this.select(function(e,n){var r=t(e,n);return ce(r)?_n(r):r}).mergeObservable()}function m(e,n,r){return new ur(function(i){var o=!1,s=null,u=[];return e.subscribe(function(e){var c,a;try{a=n(e)}catch(h){return i.onError(h),t}if(c=0,o)try{c=r(a,s)}catch(l){return i.onError(l),t}else o=!0,s=a;c>0&&(s=a,u=[]),c>=0&&u.push(e)},i.onError.bind(i),function(){i.onNext(u),i.onCompleted()})})}function y(t){if(0===t.length)throw Error(ae);return t[0]}function w(e,n,r){return new ur(function(i){var o=0,s=n.length;return e.subscribe(function(e){var u=!1;try{s>o&&(u=r(e,n[o++]))}catch(c){return i.onError(c),t}u||(i.onNext(!1),i.onCompleted())},i.onError.bind(i),function(){i.onNext(o===s),i.onCompleted()})})}function g(t,e,n,r){if(0>e)throw Error(he);return new ur(function(i){var o=e;return t.subscribe(function(t){0===o&&(i.onNext(t),i.onCompleted()),o--},i.onError.bind(i),function(){n?(i.onNext(r),i.onCompleted()):i.onError(Error(he))})})}function E(t,e,n){return new ur(function(r){var i=n,o=!1;return t.subscribe(function(t){o?r.onError(Error("Sequence contains more than one element")):(i=t,o=!0)},r.onError.bind(r),function(){o||e?(r.onNext(i),r.onCompleted()):r.onError(Error(ae))})})}function x(t,e,n){return new ur(function(r){return t.subscribe(function(t){r.onNext(t),r.onCompleted()},r.onError.bind(r),function(){e?(r.onNext(n),r.onCompleted()):r.onError(Error(ae))})})}function C(t,e,n){return new ur(function(r){var i=n,o=!1;return t.subscribe(function(t){i=t,o=!0},r.onError.bind(r),function(){o||e?(r.onNext(i),r.onCompleted()):r.onError(Error(ae))})})}function D(e,n,r,i){return new ur(function(o){var s=0;return e.subscribe(function(u){var c;try{c=n.call(r,u,s,e)}catch(a){return o.onError(a),t}c?(o.onNext(i?s:u),o.onCompleted()):s++},o.onError.bind(o),function(){o.onNext(i?-1:t),o.onCompleted()})})}function S(t,e,n){if(t.addListener)return t.addListener(e,n),Qe(function(){t.removeListener(e,n)});if(t.addEventListener)return t.addEventListener(e,n,!1),Qe(function(){t.removeEventListener(e,n,!1)});throw Error("No listener found")}function _(t,e,n){var r=new Be;if("function"==typeof t.item&&"number"==typeof t.length)for(var i=0,o=t.length;o>i;i++)r.add(_(t.item(i),e,n));else t&&r.add(S(t,e,n));return r}function A(e,n,r){return new ur(function(i){function o(e,n){h[n]=e;var o;if(u[n]=!0,c||(c=u.every(ne))){try{o=r.apply(null,h)}catch(s){return i.onError(s),t}i.onNext(o)}else a&&i.onCompleted()}var s=2,u=[!1,!1],c=!1,a=!1,h=Array(s);return new Be(e.subscribe(function(t){o(t,0)},i.onError.bind(i),function(){a=!0,i.onCompleted()}),n.subscribe(function(t){o(t,1)},i.onError.bind(i)))})}function N(t){if(false&t)return 2===t;for(var e=Math.sqrt(t),n=3;e>=n;){if(0===t%n)return!1;n+=2}return!0}function O(t){var e,n,r;for(e=0;Xn.length>e;++e)if(n=Xn[e],n>=t)return n;for(r=1|t;Xn[Xn.length-1]>r;){if(N(r))return r;r+=2}return t}function R(t){var e=757602046;if(!t.length)return e;for(var n=0,r=t.length;r>n;n++){var i=t.charCodeAt(n);e=(e<<5)-e+i,e&=e}return e}function j(t){var e=668265261;return t=61^t^t>>>16,t+=t<<3,t^=t>>>4,t*=e,t^=t>>>15}function W(){return{key:null,value:null,next:0,hashCode:0}}function k(t,e){return t.groupJoin(this,e,function(){return Nn()},function(t,e){return e})}function q(t){var e=this;return new ur(function(n){var r=new hr,i=new Be,o=new Ze(i);return n.onNext(Le(r,o)),i.add(e.subscribe(function(t){r.onNext(t)},function(t){r.onError(t),n.onError(t)},function(){r.onCompleted(),n.onCompleted()})),i.add(t.subscribe(function(){r.onCompleted(),r=new hr,n.onNext(Le(r,o))},function(t){r.onError(t),n.onError(t)},function(){r.onCompleted(),n.onCompleted()})),o})}function P(e){var n=this;return new ur(function(r){var i,o=new Xe,s=new Be(o),u=new Ze(s),c=new hr;return r.onNext(Le(c,u)),s.add(n.subscribe(function(t){c.onNext(t)},function(t){c.onError(t),r.onError(t)},function(){c.onCompleted(),r.onCompleted()})),i=function(){var n,s;try{s=e()}catch(a){return r.onError(a),t}n=new Je,o.setDisposable(n),n.setDisposable(s.take(1).subscribe(ee,function(t){c.onError(t),r.onError(t)},function(){c.onCompleted(),c=new hr,r.onNext(Le(c,u)),i()}))},i(),u})}function T(e,n){return new dn(function(){return new pn(function(){return e()?{done:!1,value:n}:{done:!0,value:t}})})}function V(t){this.patterns=t}function z(t,e){this.expression=t,this.selector=e}function L(t,e,n){var r=t.get(e);if(!r){var i=new ir(e,n);return t.set(e,i),i}return r}function M(t,e,n){var r,i;for(this.joinObserverArray=t,this.onNext=e,this.onCompleted=n,this.joinObservers=new rr,r=0;this.joinObserverArray.length>r;r++)i=this.joinObserverArray[r],this.joinObservers.set(i,i)}function I(t,e){return new ur(function(n){return e.scheduleWithAbsolute(t,function(){n.onNext(0),n.onCompleted()})})}function F(t,e,n){var r=en(e);return new ur(function(e){var i=0,o=t;return n.scheduleRecursiveWithAbsolute(o,function(t){var s;r>0&&(s=n.now(),o+=r,s>=o&&(o=s+r)),e.onNext(i++),t(o)})})}function B(t,e){var n=en(t);return new ur(function(t){return e.scheduleWithRelative(n,function(){t.onNext(0),t.onCompleted()})})}function H(t,e,n){return t===e?new ur(function(t){return n.schedulePeriodicWithState(0,e,function(e){return t.onNext(e),e+1})}):An(function(){return F(n.now()+t,e,n)})}function U(t,e){var n=this;return new ur(function(r){var i,o=!1,s=new Xe,u=null,c=[],a=!1;return i=n.materialize().timestamp(e).subscribe(function(n){var i,h;"E"===n.value.kind?(c=[],c.push(n),u=n.value.exception,h=!a):(c.push({value:n.value,timestamp:n.timestamp+t}),h=!o,o=!0),h&&(null!==u?r.onError(u):(i=new Je,s.setDisposable(i),i.setDisposable(e.scheduleRecursiveWithRelative(t,function(t){var n,i,s,h;if(null===u){a=!0;do s=null,c.length>0&&0>=c[0].timestamp-e.now()&&(s=c.shift().value),null!==s&&s.accept(r);while(null!==s);h=!1,i=0,c.length>0?(h=!0,i=Math.max(0,c[0].timestamp-e.now())):o=!1,n=u,a=!1,null!==n?r.onError(n):h&&t(i)}}))))}),new Be(i,s)})}function Q(t,e){var n=this;return An(function(){var r=t-e.now();return U.call(n,r,e)})}function $(t,e){return new ur(function(n){function r(){s&&(s=!1,n.onNext(o)),i&&n.onCompleted()}var i,o,s;return new Be(t.subscribe(function(t){s=!0,o=t},n.onError.bind(n),function(){i=!0}),e.subscribe(r,n.onError.bind(n),r))})}var K={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},J=K[typeof window]&&window||this,X=K[typeof exports]&&exports&&!exports.nodeType&&exports,Z=K[typeof module]&&module&&!module.nodeType&&module,G=Z&&Z.exports===X&&X,Y=K[typeof global]&&global;!Y||Y.global!==Y&&Y.window!==Y||(J=Y);var te={internals:{},config:{Promise:J.Promise},helpers:{}},ee=te.helpers.noop=function(){},ne=te.helpers.identity=function(t){return t},re=(te.helpers.pluck=function(t){return function(e){return e[t]}},te.helpers.just=function(t){return function(){return t}},te.helpers.defaultNow=Date.now),ie=te.helpers.defaultComparer=function(t,e){return Pe(t,e)},oe=te.helpers.defaultSubComparer=function(t,e){return t>e?1:e>t?-1:0},se=te.helpers.defaultKeySerializer=function(t){return""+t},ue=te.helpers.defaultError=function(t){throw t},ce=te.helpers.isPromise=function(t){return!!t&&"function"==typeof t.then&&t.then!==te.Observable.prototype.then};te.helpers.asArray=function(){return Array.prototype.slice.call(arguments)},te.helpers.not=function(t){return!t};var ae="Sequence contains no elements.",he="Argument out of range",le="Object has been disposed",fe="object"==typeof Symbol&&Symbol.iterator||"_es6shim_iterator_";J.Set&&"function"==typeof(new J.Set)["@@iterator"]&&(fe="@@iterator");var pe,de={done:!0,value:t},ve="[object Arguments]",be="[object Array]",me="[object Boolean]",ye="[object Date]",we="[object Error]",ge="[object Function]",Ee="[object Number]",xe="[object Object]",Ce="[object RegExp]",De="[object String]",Se=Object.prototype.toString,_e=Object.prototype.hasOwnProperty,Ae=Se.call(arguments)==ve,Ne=Error.prototype,Oe=Object.prototype,Re=Oe.propertyIsEnumerable;try{pe=!(Se.call(document)==xe&&!({toString:0}+""))}catch(je){pe=!0}var We=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],ke={};ke[be]=ke[ye]=ke[Ee]={constructor:!0,toLocaleString:!0,toString:!0,valueOf:!0},ke[me]=ke[De]={constructor:!0,toString:!0,valueOf:!0},ke[we]=ke[ge]=ke[Ce]={constructor:!0,toString:!0},ke[xe]={constructor:!0};var qe={};(function(){var t=function(){this.x=1},e=[];t.prototype={valueOf:1,y:1};for(var n in new t)e.push(n);for(n in arguments);qe.enumErrorProps=Re.call(Ne,"message")||Re.call(Ne,"name"),qe.enumPrototypes=Re.call(t,"prototype"),qe.nonEnumArgs=0!=n,qe.nonEnumShadows=!/valueOf/.test(e)})(1),Ae||(u=function(t){return t&&"object"==typeof t?_e.call(t,"callee"):!1}),c(/x/)&&(c=function(t){return"function"==typeof t&&Se.call(t)==ge});var Pe=te.internals.isEqual=function(t,e){return a(t,e,[],[])},Te=Array.prototype.slice;({}).hasOwnProperty;var Ve=this.inherits=te.internals.inherits=function(t,e){function n(){this.constructor=t}n.prototype=e.prototype,t.prototype=new n},ze=te.internals.addProperties=function(t){for(var e=Te.call(arguments,1),n=0,r=e.length;r>n;n++){var i=e[n];for(var o in i)t[o]=i[o]}},Le=te.internals.addRef=function(t,e){return new ur(function(n){return new Be(e.getDisposable(),t.subscribe(n))})},Me=function(t,e){this.id=t,this.value=e};Me.prototype.compareTo=function(t){var e=this.value.compareTo(t.value);return 0===e&&(e=this.id-t.id),e};var Ie=te.internals.PriorityQueue=function(t){this.items=Array(t),this.length=0},Fe=Ie.prototype;Fe.isHigherPriority=function(t,e){return 0>this.items[t].compareTo(this.items[e])},Fe.percolate=function(t){if(!(t>=this.length||0>t)){var e=t-1>>1;if(!(0>e||e===t)&&this.isHigherPriority(t,e)){var n=this.items[t];this.items[t]=this.items[e],this.items[e]=n,this.percolate(e)}}},Fe.heapify=function(e){if(e===t&&(e=0),!(e>=this.length||0>e)){var n=2*e+1,r=2*e+2,i=e;if(this.length>n&&this.isHigherPriority(n,i)&&(i=n),this.length>r&&this.isHigherPriority(r,i)&&(i=r),i!==e){var o=this.items[e];this.items[e]=this.items[i],this.items[i]=o,this.heapify(i)}}},Fe.peek=function(){return this.items[0].value},Fe.removeAt=function(t){this.items[t]=this.items[--this.length],delete this.items[this.length],this.heapify()},Fe.dequeue=function(){var t=this.peek();return this.removeAt(0),t},Fe.enqueue=function(t){var e=this.length++;this.items[e]=new Me(Ie.count++,t),this.percolate(e)},Fe.remove=function(t){for(var e=0;this.length>e;e++)if(this.items[e].value===t)return this.removeAt(e),!0;return!1},Ie.count=0;var Be=te.CompositeDisposable=function(){this.disposables=h(arguments,0),this.isDisposed=!1,this.length=this.disposables.length},He=Be.prototype;He.add=function(t){this.isDisposed?t.dispose():(this.disposables.push(t),this.length++)},He.remove=function(t){var e=!1;if(!this.isDisposed){var n=this.disposables.indexOf(t);-1!==n&&(e=!0,this.disposables.splice(n,1),this.length--,t.dispose())}return e},He.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;var t=this.disposables.slice(0);this.disposables=[],this.length=0;for(var e=0,n=t.length;n>e;e++)t[e].dispose()}},He.clear=function(){var t=this.disposables.slice(0);this.disposables=[],this.length=0;for(var e=0,n=t.length;n>e;e++)t[e].dispose()},He.contains=function(t){return-1!==this.disposables.indexOf(t)},He.toArray=function(){return this.disposables.slice(0)};var Ue=te.Disposable=function(t){this.isDisposed=!1,this.action=t||ee};Ue.prototype.dispose=function(){this.isDisposed||(this.action(),this.isDisposed=!0)};var Qe=Ue.create=function(t){return new Ue(t)},$e=Ue.empty={dispose:ee},Ke=function(){function t(t){this.isSingle=t,this.isDisposed=!1,this.current=null}var e=t.prototype;return e.getDisposable=function(){return this.current},e.setDisposable=function(t){if(this.current&&this.isSingle)throw Error("Disposable has already been assigned");var e,n=this.isDisposed;n||(e=this.current,this.current=t),e&&e.dispose(),n&&t&&t.dispose()},e.dispose=function(){var t;this.isDisposed||(this.isDisposed=!0,t=this.current,this.current=null),t&&t.dispose()},t}(),Je=te.SingleAssignmentDisposable=function(t){function e(){t.call(this,!0)}return Ve(e,t),e}(Ke),Xe=te.SerialDisposable=function(t){function e(){t.call(this,!1)}return Ve(e,t),e}(Ke),Ze=te.RefCountDisposable=function(){function t(t){this.disposable=t,this.disposable.count++,this.isInnerDisposed=!1}function e(t){this.underlyingDisposable=t,this.isDisposed=!1,this.isPrimaryDisposed=!1,this.count=0}return t.prototype.dispose=function(){this.disposable.isDisposed||this.isInnerDisposed||(this.isInnerDisposed=!0,this.disposable.count--,0===this.disposable.count&&this.disposable.isPrimaryDisposed&&(this.disposable.isDisposed=!0,this.disposable.underlyingDisposable.dispose()))},e.prototype.dispose=function(){this.isDisposed||this.isPrimaryDisposed||(this.isPrimaryDisposed=!0,0===this.count&&(this.isDisposed=!0,this.underlyingDisposable.dispose()))},e.prototype.getDisposable=function(){return this.isDisposed?$e:new t(this)},e}();f.prototype.dispose=function(){var t=this;this.scheduler.schedule(function(){t.isDisposed||(t.isDisposed=!0,t.disposable.dispose())})};var Ge=te.internals.ScheduledItem=function(t,e,n,r,i){this.scheduler=t,this.state=e,this.action=n,this.dueTime=r,this.comparer=i||oe,this.disposable=new Je};Ge.prototype.invoke=function(){this.disposable.setDisposable(this.invokeCore())},Ge.prototype.compareTo=function(t){return this.comparer(this.dueTime,t.dueTime)},Ge.prototype.isCancelled=function(){return this.disposable.isDisposed},Ge.prototype.invokeCore=function(){return this.action(this.scheduler,this.state)};var Ye,tn=te.Scheduler=function(){function t(t,e,n,r){this.now=t,this._schedule=e,this._scheduleRelative=n,this._scheduleAbsolute=r}function e(t,e){var n=e.first,r=e.second,i=new Be,o=function(e){r(e,function(e){var n=!1,r=!1,s=t.scheduleWithState(e,function(t,e){return n?i.remove(s):r=!0,o(e),$e});r||(i.add(s),n=!0)})};return o(n),i}function n(t,e,n){var r=e.first,i=e.second,o=new Be,s=function(e){i(e,function(e,r){var i=!1,u=!1,c=t[n].call(t,e,r,function(t,e){return i?o.remove(c):u=!0,s(e),$e});u||(o.add(c),i=!0)})};return s(r),o}function r(t,e){return e(),$e}var i=t.prototype;return i.catchException=i["catch"]=function(t){return new cn(this,t)},i.schedulePeriodic=function(t,e){return this.schedulePeriodicWithState(null,t,function(){e()})},i.schedulePeriodicWithState=function(t,e,n){var r=t,i=setInterval(function(){r=n(r)},e);return Qe(function(){clearInterval(i)})},i.schedule=function(t){return this._schedule(t,r)},i.scheduleWithState=function(t,e){return this._schedule(t,e)},i.scheduleWithRelative=function(t,e){return this._scheduleRelative(e,t,r)},i.scheduleWithRelativeAndState=function(t,e,n){return this._scheduleRelative(t,e,n)},i.scheduleWithAbsolute=function(t,e){return this._scheduleAbsolute(e,t,r)},i.scheduleWithAbsoluteAndState=function(t,e,n){return this._scheduleAbsolute(t,e,n)},i.scheduleRecursive=function(t){return this.scheduleRecursiveWithState(t,function(t,e){t(function(){e(t)})})},i.scheduleRecursiveWithState=function(t,n){return this.scheduleWithState({first:t,second:n},function(t,n){return e(t,n)})},i.scheduleRecursiveWithRelative=function(t,e){return this.scheduleRecursiveWithRelativeAndState(e,t,function(t,e){t(function(n){e(t,n)})})},i.scheduleRecursiveWithRelativeAndState=function(t,e,r){return this._scheduleRelative({first:t,second:r},e,function(t,e){return n(t,e,"scheduleWithRelativeAndState")})},i.scheduleRecursiveWithAbsolute=function(t,e){return this.scheduleRecursiveWithAbsoluteAndState(e,t,function(t,e){t(function(n){e(t,n)})})},i.scheduleRecursiveWithAbsoluteAndState=function(t,e,r){return this._scheduleAbsolute({first:t,second:r},e,function(t,e){return n(t,e,"scheduleWithAbsoluteAndState")})},t.now=re,t.normalize=function(t){return 0>t&&(t=0),t},t}(),en=tn.normalize,nn=te.internals.SchedulePeriodicRecursive=function(){function t(t,e){e(0,this._period);try{this._state=this._action(this._state)}catch(n){throw this._cancel.dispose(),n}}function e(t,e,n,r){this._scheduler=t,this._state=e,this._period=n,this._action=r}return e.prototype.start=function(){var e=new Je;return this._cancel=e,e.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0,this._period,t.bind(this))),e},e}(),rn=tn.immediate=function(){function t(t,e){return e(this,t)}function e(t,e,n){for(var r=en(r);r-this.now()>0;);return n(this,t)}function n(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}return new tn(re,t,e,n)}(),on=tn.currentThread=function(){function t(t){for(var e;t.length>0;)if(e=t.dequeue(),!e.isCancelled()){for(;e.dueTime-tn.now()>0;);e.isCancelled()||e.invoke()}}function e(t,e){return this.scheduleWithRelativeAndState(t,0,e)}function n(e,n,r){var o=this.now()+tn.normalize(n),s=new Ge(this,e,r,o);if(i)i.enqueue(s);else{i=new Ie(4),i.enqueue(s);try{t(i)}catch(u){throw u}finally{i=null}}return s.disposable}function r(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}var i,o=new tn(re,e,n,r);return o.scheduleRequired=function(){return null===i},o.ensureTrampoline=function(t){return null===i?this.schedule(t):t()},o}(),sn=ee;(function(){function t(){if(!J.postMessage||J.importScripts)return!1;var t=!1,e=J.onmessage;return J.onmessage=function(){t=!0},J.postMessage("","*"),J.onmessage=e,t}function e(t){if("string"==typeof t.data&&t.data.substring(0,o.length)===o){var e=t.data.substring(o.length),n=s[e];n(),delete s[e]}}var n=RegExp("^"+(Se+"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),r="function"==typeof(r=Y&&G&&Y.setImmediate)&&!n.test(r)&&r,i="function"==typeof(i=Y&&G&&Y.clearImmediate)&&!n.test(i)&&i;if("undefined"!=typeof process&&"[object process]"==={}.toString.call(process))Ye=process.nextTick;else if("function"==typeof r)Ye=r,sn=i;else if(t()){var o="ms.rx.schedule"+Math.random(),s={},u=0;J.addEventListener?J.addEventListener("message",e,!1):J.attachEvent("onmessage",e,!1),Ye=function(t){var e=u++;s[e]=t,J.postMessage(o+e,"*")}}else if(J.MessageChannel){var c=new J.MessageChannel,a={},h=0;c.port1.onmessage=function(t){var e=t.data,n=a[e];n(),delete a[e]},Ye=function(t){var e=h++;a[e]=t,c.port2.postMessage(e)}}else"document"in J&&"onreadystatechange"in J.document.createElement("script")?Ye=function(t){var e=J.document.createElement("script");e.onreadystatechange=function(){t(),e.onreadystatechange=null,e.parentNode.removeChild(e),e=null},J.document.documentElement.appendChild(e)}:(Ye=function(t){return setTimeout(t,0)},sn=clearTimeout)})();var un=tn.timeout=function(){function t(t,e){var n=this,r=new Je,i=Ye(function(){r.isDisposed||r.setDisposable(e(n,t))});return new Be(r,Qe(function(){sn(i)}))}function e(t,e,n){var r=this,i=tn.normalize(e);if(0===i)return r.scheduleWithState(t,n);var o=new Je,s=setTimeout(function(){o.isDisposed||o.setDisposable(n(r,t))},i);return new Be(o,Qe(function(){clearTimeout(s)}))}function n(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}return new tn(re,t,e,n)}(),cn=function(t){function e(){return this._scheduler.now()}function n(t,e){return this._scheduler.scheduleWithState(t,this._wrap(e))}function r(t,e,n){return this._scheduler.scheduleWithRelativeAndState(t,e,this._wrap(n))}function i(t,e,n){return this._scheduler.scheduleWithAbsoluteAndState(t,e,this._wrap(n))}function o(o,s){this._scheduler=o,this._handler=s,this._recursiveOriginal=null,this._recursiveWrapper=null,t.call(this,e,n,r,i)}return Ve(o,t),o.prototype._clone=function(t){return new o(t,this._handler)},o.prototype._wrap=function(t){var e=this;return function(n,r){try{return t(e._getRecursiveWrapper(n),r)}catch(i){if(!e._handler(i))throw i;return $e}}},o.prototype._getRecursiveWrapper=function(t){if(this._recursiveOriginal!==t){this._recursiveOriginal=t;var e=this._clone(t);e._recursiveOriginal=t,e._recursiveWrapper=e,this._recursiveWrapper=e}return this._recursiveWrapper},o.prototype.schedulePeriodicWithState=function(t,e,n){var r=this,i=!1,o=new Je;return o.setDisposable(this._scheduler.schedulePeriodicWithState(t,e,function(t){if(i)return null;try{return n(t)}catch(e){if(i=!0,!r._handler(e))throw e;return o.dispose(),null}})),o},o}(tn),an=te.Notification=function(){function t(t,e){this.hasValue=null==e?!1:e,this.kind=t}var e=t.prototype;return e.accept=function(t,e,n){return 1===arguments.length&&"object"==typeof t?this._acceptObservable(t):this._accept(t,e,n)},e.toObservable=function(t){var e=this;return t||(t=rn),new ur(function(n){return t.schedule(function(){e._acceptObservable(n),"N"===e.kind&&n.onCompleted()})})},t}(),hn=an.createOnNext=function(){function t(t){return t(this.value)}function e(t){return t.onNext(this.value)}function n(){return"OnNext("+this.value+")"}return function(r){var i=new an("N",!0);return i.value=r,i._accept=t,i._acceptObservable=e,i.toString=n,i}}(),ln=an.createOnError=function(){function t(t,e){return e(this.exception)}function e(t){return t.onError(this.exception)}function n(){return"OnError("+this.exception+")"}return function(r){var i=new an("E");return i.exception=r,i._accept=t,i._acceptObservable=e,i.toString=n,i}}(),fn=an.createOnCompleted=function(){function t(t,e,n){return n()}function e(t){return t.onCompleted()}function n(){return"OnCompleted()"}return function(){var r=new an("C");return r._accept=t,r._acceptObservable=e,r.toString=n,r}}(),pn=te.internals.Enumerator=function(t){this._next=t};pn.prototype.next=function(){return this._next()},pn.prototype[fe]=function(){return this};var dn=te.internals.Enumerable=function(t){this._iterator=t};dn.prototype[fe]=function(){return this._iterator()},dn.prototype.concat=function(){var e=this;return new ur(function(n){var r;try{r=e[fe]()}catch(i){return n.onError(),t}var o,s=new Xe,u=rn.scheduleRecursive(function(e){var i;if(!o){try{i=r.next()}catch(u){return n.onError(u),t}if(i.done)return n.onCompleted(),t;var c=i.value;ce(c)&&(c=_n(c));var a=new Je;s.setDisposable(a),a.setDisposable(c.subscribe(n.onNext.bind(n),n.onError.bind(n),function(){e()}))}});return new Be(s,u,Qe(function(){o=!0}))})},dn.prototype.catchException=function(){var e=this;return new ur(function(n){var r;try{r=e[fe]()}catch(i){return n.onError(),t}var o,s,u=new Xe,c=rn.scheduleRecursive(function(e){if(!o){var i;try{i=r.next()}catch(c){return n.onError(c),t}if(i.done)return s?n.onError(s):n.onCompleted(),t;var a=i.value;ce(a)&&(a=_n(a));var h=new Je;u.setDisposable(h),h.setDisposable(a.subscribe(n.onNext.bind(n),function(t){s=t,e()},n.onCompleted.bind(n)))}});return new Be(u,c,Qe(function(){o=!0}))})};var vn=dn.repeat=function(t,e){return null==e&&(e=-1),new dn(function(){var n=e;return new pn(function(){return 0===n?de:(n>0&&n--,{done:!1,value:t})})})},bn=dn.forEach=function(t,e,n){return e||(e=ne),new dn(function(){var r=-1;return new pn(function(){return++r0&&(e=!this.isAcquired,this.isAcquired=!0),e&&this.disposable.setDisposable(this.scheduler.scheduleRecursive(function(e){var r;if(!(n.queue.length>0))return n.isAcquired=!1,t;r=n.queue.shift();try{r()}catch(i){throw n.queue=[],n.hasFaulted=!0,i}e()}))},n.prototype.dispose=function(){e.prototype.dispose.call(this),this.disposable.dispose()},n}(gn),Dn=function(t){function e(){t.apply(this,arguments)}return Ve(e,t),e.prototype.next=function(e){t.prototype.next.call(this,e),this.ensureActive()},e.prototype.error=function(e){t.prototype.error.call(this,e),this.ensureActive()},e.prototype.completed=function(){t.prototype.completed.call(this),this.ensureActive()},e}(Cn),Sn=te.Observable=function(){function t(t){this._subscribe=t}return wn=t.prototype,wn.subscribe=wn.forEach=function(t,e,n){var r="object"==typeof t?t:yn(t,e,n);return this._subscribe(r)},t}();wn.observeOn=function(t){var e=this;return new ur(function(n){return e.subscribe(new Dn(t,n))})},wn.subscribeOn=function(t){var e=this;return new ur(function(n){var r=new Je,i=new Xe;return i.setDisposable(r),r.setDisposable(t.schedule(function(){i.setDisposable(new f(t,e.subscribe(n)))})),i})};var _n=Sn.fromPromise=function(t){return new ur(function(e){return t.then(function(t){e.onNext(t),e.onCompleted()},function(t){e.onError(t)}),function(){t&&t.abort&&t.abort()}})};wn.toPromise=function(t){if(t||(t=te.config.Promise),!t)throw Error("Promise type not provided nor in Rx.config.Promise");var e=this;return new t(function(t,n){var r,i=!1;e.subscribe(function(t){r=t,i=!0},function(t){n(t)},function(){i&&t(r)})})},wn.toArray=function(){var t=this;return new ur(function(e){var n=[];return t.subscribe(n.push.bind(n),e.onError.bind(e),function(){e.onNext(n),e.onCompleted()})})},Sn.create=Sn.createWithDisposable=function(t){return new ur(t)};var An=Sn.defer=function(t){return new ur(function(e){var n;try{n=t()}catch(r){return Wn(r).subscribe(e)}return ce(n)&&(n=_n(n)),n.subscribe(e)})},Nn=Sn.empty=function(t){return t||(t=rn),new ur(function(e){return t.schedule(function(){e.onCompleted()})})},On=Sn.fromArray=function(t,e){return e||(e=on),new ur(function(n){var r=0,i=t.length;return e.scheduleRecursive(function(e){i>r?(n.onNext(t[r++]),e()):n.onCompleted()})})};Sn.fromIterable=function(e,n){return n||(n=on),new ur(function(r){var i;try{i=e[fe]()}catch(o){return r.onError(o),t}return n.scheduleRecursive(function(e){var n;try{n=i.next()}catch(o){return r.onError(o),t}n.done?r.onCompleted():(r.onNext(n.value),e())})})},Sn.generate=function(e,n,r,i,o){return o||(o=on),new ur(function(s){var u=!0,c=e;return o.scheduleRecursive(function(e){var o,a;try{u?u=!1:c=r(c),o=n(c),o&&(a=i(c))}catch(h){return s.onError(h),t}o?(s.onNext(a),e()):s.onCompleted()})})},Sn.of=function(){for(var t=arguments.length,e=Array(t),n=0;t>n;n++)e[n]=arguments[n];return On(e)},Sn.ofWithScheduler=function(t){for(var e=arguments.length-1,n=Array(e),r=0;e>r;r++)n[r]=arguments[r+1];return On(n,t)};var Rn=Sn.never=function(){return new ur(function(){return $e})};Sn.range=function(t,e,n){return n||(n=on),new ur(function(r){return n.scheduleRecursiveWithState(0,function(n,i){e>n?(r.onNext(t+n),i(n+1)):r.onCompleted()})})},Sn.repeat=function(t,e,n){return n||(n=on),null==e&&(e=-1),jn(t,n).repeat(e)};var jn=Sn["return"]=Sn.returnValue=Sn.just=function(t,e){return e||(e=rn),new ur(function(n){return e.schedule(function(){n.onNext(t),n.onCompleted()})})},Wn=Sn["throw"]=Sn.throwException=function(t,e){return e||(e=rn),new ur(function(n){return e.schedule(function(){n.onError(t)})})};Sn.using=function(t,e){return new ur(function(n){var r,i,o=$e;try{r=t(),r&&(o=r),i=e(r)}catch(s){return new Be(Wn(s).subscribe(n),o)}return new Be(i.subscribe(n),o)})},wn.amb=function(t){var e=this;return new ur(function(n){function r(){o||(o=s,a.dispose())}function i(){o||(o=u,c.dispose())}var o,s="L",u="R",c=new Je,a=new Je; +return ce(t)&&(t=_n(t)),c.setDisposable(e.subscribe(function(t){r(),o===s&&n.onNext(t)},function(t){r(),o===s&&n.onError(t)},function(){r(),o===s&&n.onCompleted()})),a.setDisposable(t.subscribe(function(t){i(),o===u&&n.onNext(t)},function(t){i(),o===u&&n.onError(t)},function(){i(),o===u&&n.onCompleted()})),new Be(c,a)})},Sn.amb=function(){function t(t,e){return t.amb(e)}for(var e=Rn(),n=h(arguments,0),r=0,i=n.length;i>r;r++)e=t(e,n[r]);return e},wn["catch"]=wn.catchException=function(t){return"function"==typeof t?p(this,t):kn([this,t])};var kn=Sn.catchException=Sn["catch"]=function(){var t=h(arguments,0);return bn(t).catchException()};wn.combineLatest=function(){var t=Te.call(arguments);return Array.isArray(t[0])?t[0].unshift(this):t.unshift(this),qn.apply(this,t)};var qn=Sn.combineLatest=function(){var e=Te.call(arguments),n=e.pop();return Array.isArray(e[0])&&(e=e[0]),new ur(function(r){function i(e){var i;if(c[e]=!0,a||(a=c.every(ne))){try{i=n.apply(null,f)}catch(o){return r.onError(o),t}r.onNext(i)}else h.filter(function(t,n){return n!==e}).every(ne)&&r.onCompleted()}function o(t){h[t]=!0,h.every(ne)&&r.onCompleted()}for(var s=function(){return!1},u=e.length,c=l(u,s),a=!1,h=l(u,s),f=Array(u),p=Array(u),d=0;u>d;d++)(function(t){var n=e[t],s=new Je;ce(n)&&(n=_n(n)),s.setDisposable(n.subscribe(function(e){f[t]=e,i(t)},r.onError.bind(r),function(){o(t)})),p[t]=s})(d);return new Be(p)})};wn.concat=function(){var t=Te.call(arguments,0);return t.unshift(this),Pn.apply(this,t)};var Pn=Sn.concat=function(){var t=h(arguments,0);return bn(t).concat()};wn.concatObservable=wn.concatAll=function(){return this.merge(1)},wn.merge=function(t){if("number"!=typeof t)return Tn(this,t);var e=this;return new ur(function(n){var r=0,i=new Be,o=!1,s=[],u=function(t){var e=new Je;i.add(e),ce(t)&&(t=_n(t)),e.setDisposable(t.subscribe(n.onNext.bind(n),n.onError.bind(n),function(){var t;i.remove(e),s.length>0?(t=s.shift(),u(t)):(r--,o&&0===r&&n.onCompleted())}))};return i.add(e.subscribe(function(e){t>r?(r++,u(e)):s.push(e)},n.onError.bind(n),function(){o=!0,0===r&&n.onCompleted()})),i})};var Tn=Sn.merge=function(){var t,e;return arguments[0]?arguments[0].now?(t=arguments[0],e=Te.call(arguments,1)):(t=rn,e=Te.call(arguments,0)):(t=rn,e=Te.call(arguments,1)),Array.isArray(e[0])&&(e=e[0]),On(e,t).mergeObservable()};wn.mergeObservable=wn.mergeAll=function(){var t=this;return new ur(function(e){var n=new Be,r=!1,i=new Je;return n.add(i),i.setDisposable(t.subscribe(function(t){var i=new Je;n.add(i),ce(t)&&(t=_n(t)),i.setDisposable(t.subscribe(function(t){e.onNext(t)},e.onError.bind(e),function(){n.remove(i),r&&1===n.length&&e.onCompleted()}))},e.onError.bind(e),function(){r=!0,1===n.length&&e.onCompleted()})),n})},wn.onErrorResumeNext=function(t){if(!t)throw Error("Second observable is required");return Vn([this,t])};var Vn=Sn.onErrorResumeNext=function(){var t=h(arguments,0);return new ur(function(e){var n=0,r=new Xe,i=rn.scheduleRecursive(function(i){var o,s;t.length>n?(o=t[n++],ce(o)&&(o=_n(o)),s=new Je,r.setDisposable(s),s.setDisposable(o.subscribe(e.onNext.bind(e),function(){i()},function(){i()}))):e.onCompleted()});return new Be(r,i)})};wn.skipUntil=function(t){var e=this;return new ur(function(n){var r=!1,i=new Be(e.subscribe(function(t){r&&n.onNext(t)},n.onError.bind(n),function(){r&&n.onCompleted()}));ce(t)&&(t=_n(t));var o=new Je;return i.add(o),o.setDisposable(t.subscribe(function(){r=!0,o.dispose()},n.onError.bind(n),function(){o.dispose()})),i})},wn["switch"]=wn.switchLatest=function(){var t=this;return new ur(function(e){var n=!1,r=new Xe,i=!1,o=0,s=t.subscribe(function(t){var s=new Je,u=++o;n=!0,r.setDisposable(s),ce(t)&&(t=_n(t)),s.setDisposable(t.subscribe(function(t){o===u&&e.onNext(t)},function(t){o===u&&e.onError(t)},function(){o===u&&(n=!1,i&&e.onCompleted())}))},e.onError.bind(e),function(){i=!0,n||e.onCompleted()});return new Be(s,r)})},wn.takeUntil=function(t){var e=this;return new ur(function(n){return ce(t)&&(t=_n(t)),new Be(e.subscribe(n),t.subscribe(n.onCompleted.bind(n),n.onError.bind(n),ee))})},wn.zip=function(){if(Array.isArray(arguments[0]))return d.apply(this,arguments);var e=this,n=Te.call(arguments),r=n.pop();return n.unshift(e),new ur(function(i){function o(n){var o,s;if(c.every(function(t){return t.length>0})){try{s=c.map(function(t){return t.shift()}),o=r.apply(e,s)}catch(u){return i.onError(u),t}i.onNext(o)}else a.filter(function(t,e){return e!==n}).every(ne)&&i.onCompleted()}function s(t){a[t]=!0,a.every(function(t){return t})&&i.onCompleted()}for(var u=n.length,c=l(u,function(){return[]}),a=l(u,function(){return!1}),h=Array(u),f=0;u>f;f++)(function(t){var e=n[t],r=new Je;ce(e)&&(e=_n(e)),r.setDisposable(e.subscribe(function(e){c[t].push(e),o(t)},i.onError.bind(i),function(){s(t)})),h[t]=r})(f);return new Be(h)})},Sn.zip=function(){var t=Te.call(arguments,0),e=t.shift();return e.zip.apply(e,t)},Sn.zipArray=function(){var e=h(arguments,0);return new ur(function(n){function r(e){if(s.every(function(t){return t.length>0})){var r=s.map(function(t){return t.shift()});n.onNext(r)}else if(u.filter(function(t,n){return n!==e}).every(ne))return n.onCompleted(),t}function i(e){return u[e]=!0,u.every(ne)?(n.onCompleted(),t):t}for(var o=e.length,s=l(o,function(){return[]}),u=l(o,function(){return!1}),c=Array(o),a=0;o>a;a++)(function(t){c[t]=new Je,c[t].setDisposable(e[t].subscribe(function(e){s[t].push(e),r(t)},n.onError.bind(n),function(){i(t)}))})(a);var h=new Be(c);return h.add(Qe(function(){for(var t=0,e=s.length;e>t;t++)s[t]=[]})),h})},wn.asObservable=function(){var t=this;return new ur(function(e){return t.subscribe(e)})},wn.bufferWithCount=function(t,e){return"number"!=typeof e&&(e=t),this.windowWithCount(t,e).selectMany(function(t){return t.toArray()}).where(function(t){return t.length>0})},wn.dematerialize=function(){var t=this;return new ur(function(e){return t.subscribe(function(t){return t.accept(e)},e.onError.bind(e),e.onCompleted.bind(e))})},wn.distinctUntilChanged=function(e,n){var r=this;return e||(e=ne),n||(n=ie),new ur(function(i){var o,s=!1;return r.subscribe(function(r){var u,c=!1;try{u=e(r)}catch(a){return i.onError(a),t}if(s)try{c=n(o,u)}catch(a){return i.onError(a),t}s&&c||(s=!0,o=u,i.onNext(r))},i.onError.bind(i),i.onCompleted.bind(i))})},wn["do"]=wn.doAction=function(t,e,n){var r,i=this;return"function"==typeof t?r=t:(r=t.onNext.bind(t),e=t.onError.bind(t),n=t.onCompleted.bind(t)),new ur(function(t){return i.subscribe(function(e){try{r(e)}catch(n){t.onError(n)}t.onNext(e)},function(n){if(e){try{e(n)}catch(r){t.onError(r)}t.onError(n)}else t.onError(n)},function(){if(n){try{n()}catch(e){t.onError(e)}t.onCompleted()}else t.onCompleted()})})},wn["finally"]=wn.finallyAction=function(t){var e=this;return new ur(function(n){var r;try{r=e.subscribe(n)}catch(i){throw t(),i}return Qe(function(){try{r.dispose()}catch(e){throw e}finally{t()}})})},wn.ignoreElements=function(){var t=this;return new ur(function(e){return t.subscribe(ee,e.onError.bind(e),e.onCompleted.bind(e))})},wn.materialize=function(){var t=this;return new ur(function(e){return t.subscribe(function(t){e.onNext(hn(t))},function(t){e.onNext(ln(t)),e.onCompleted()},function(){e.onNext(fn()),e.onCompleted()})})},wn.repeat=function(t){return vn(this,t).concat()},wn.retry=function(t){return vn(this,t).catchException()},wn.scan=function(){var e,n,r=!1,i=this;return 2===arguments.length?(r=!0,e=arguments[0],n=arguments[1]):n=arguments[0],new ur(function(o){var s,u,c;return i.subscribe(function(i){try{c||(c=!0),s?u=n(u,i):(u=r?n(e,i):i,s=!0)}catch(a){return o.onError(a),t}o.onNext(u)},o.onError.bind(o),function(){!c&&r&&o.onNext(e),o.onCompleted()})})},wn.skipLast=function(t){var e=this;return new ur(function(n){var r=[];return e.subscribe(function(e){r.push(e),r.length>t&&n.onNext(r.shift())},n.onError.bind(n),n.onCompleted.bind(n))})},wn.startWith=function(){var t,e,n=0;return arguments.length&&"now"in Object(arguments[0])?(e=arguments[0],n=1):e=rn,t=Te.call(arguments,n),bn([On(t,e),this]).concat()},wn.takeLast=function(t,e){return this.takeLastBuffer(t).selectMany(function(t){return On(t,e)})},wn.takeLastBuffer=function(t){var e=this;return new ur(function(n){var r=[];return e.subscribe(function(e){r.push(e),r.length>t&&r.shift()},n.onError.bind(n),function(){n.onNext(r),n.onCompleted()})})},wn.windowWithCount=function(t,e){var n=this;if(0>=t)throw Error(he);if(1===arguments.length&&(e=t),0>=e)throw Error(he);return new ur(function(r){var i=new Je,o=new Ze(i),s=0,u=[],c=function(){var t=new hr;u.push(t),r.onNext(Le(t,o))};return c(),i.setDisposable(n.subscribe(function(n){for(var r,i=0,o=u.length;o>i;i++)u[i].onNext(n);var a=s-t+1;a>=0&&0===a%e&&(r=u.shift(),r.onCompleted()),s++,0===s%e&&c()},function(t){for(;u.length>0;)u.shift().onError(t);r.onError(t)},function(){for(;u.length>0;)u.shift().onCompleted();r.onCompleted()})),o})},wn.selectConcat=wn.concatMap=function(t,e){return e?this.concatMap(function(n,r){var i=t(n,r),o=ce(i)?_n(i):i;return o.map(function(t){return e(n,t,r)})}):"function"==typeof t?v.call(this,t):v.call(this,function(){return t})},wn.defaultIfEmpty=function(e){var n=this;return e===t&&(e=null),new ur(function(t){var r=!1;return n.subscribe(function(e){r=!0,t.onNext(e)},t.onError.bind(t),function(){r||t.onNext(e),t.onCompleted()})})},wn.distinct=function(e,n){var r=this;return e||(e=ne),n||(n=se),new ur(function(i){var o={};return r.subscribe(function(r){var s,u,c,a=!1;try{s=e(r),u=n(s)}catch(h){return i.onError(h),t}for(c in o)if(u===c){a=!0;break}a||(o[u]=null,i.onNext(r))},i.onError.bind(i),i.onCompleted.bind(i))})},wn.groupBy=function(t,e,n){return this.groupByUntil(t,e,function(){return Rn()},n)},wn.groupByUntil=function(e,n,r,i){var o=this;return n||(n=ne),i||(i=se),new ur(function(s){var u={},c=new Be,a=new Ze(c);return c.add(o.subscribe(function(o){var h,l,f,p,d,v,b,m,y,w;try{v=e(o),b=i(v)}catch(g){for(w in u)u[w].onError(g);return s.onError(g),t}p=!1;try{y=u[b],y||(y=new hr,u[b]=y,p=!0)}catch(g){for(w in u)u[w].onError(g);return s.onError(g),t}if(p){d=new ar(v,y,a),l=new ar(v,y);try{h=r(l)}catch(g){for(w in u)u[w].onError(g);return s.onError(g),t}s.onNext(d),m=new Je,c.add(m);var E=function(){b in u&&(delete u[b],y.onCompleted()),c.remove(m)};m.setDisposable(h.take(1).subscribe(ee,function(t){for(w in u)u[w].onError(t);s.onError(t)},function(){E()}))}try{f=n(o)}catch(g){for(w in u)u[w].onError(g);return s.onError(g),t}y.onNext(f)},function(t){for(var e in u)u[e].onError(t);s.onError(t)},function(){for(var t in u)u[t].onCompleted();s.onCompleted()})),a})},wn.select=wn.map=function(e,n){var r=this;return new ur(function(i){var o=0;return r.subscribe(function(s){var u;try{u=e.call(n,s,o++,r)}catch(c){return i.onError(c),t}i.onNext(u)},i.onError.bind(i),i.onCompleted.bind(i))})},wn.pluck=function(t){return this.select(function(e){return e[t]})},wn.selectMany=wn.flatMap=function(t,e){return e?this.selectMany(function(n,r){var i=t(n,r),o=ce(i)?_n(i):i;return o.select(function(t){return e(n,t,r)})}):"function"==typeof t?b.call(this,t):b.call(this,function(){return t})},wn.selectSwitch=wn.flatMapLatest=wn.switchMap=function(t,e){return this.select(t,e).switchLatest()},wn.skip=function(t){if(0>t)throw Error(he);var e=this;return new ur(function(n){var r=t;return e.subscribe(function(t){0>=r?n.onNext(t):r--},n.onError.bind(n),n.onCompleted.bind(n))})},wn.skipWhile=function(e,n){var r=this;return new ur(function(i){var o=0,s=!1;return r.subscribe(function(u){if(!s)try{s=!e.call(n,u,o++,r)}catch(c){return i.onError(c),t}s&&i.onNext(u)},i.onError.bind(i),i.onCompleted.bind(i))})},wn.take=function(t,e){if(0>t)throw Error(he);if(0===t)return Nn(e);var n=this;return new ur(function(e){var r=t;return n.subscribe(function(t){r>0&&(r--,e.onNext(t),0===r&&e.onCompleted())},e.onError.bind(e),e.onCompleted.bind(e))})},wn.takeWhile=function(e,n){var r=this;return new ur(function(i){var o=0,s=!0;return r.subscribe(function(u){if(s){try{s=e.call(n,u,o++,r)}catch(c){return i.onError(c),t}s?i.onNext(u):i.onCompleted()}},i.onError.bind(i),i.onCompleted.bind(i))})},wn.where=wn.filter=function(e,n){var r=this;return new ur(function(i){var o=0;return r.subscribe(function(s){var u;try{u=e.call(n,s,o++,r)}catch(c){return i.onError(c),t}u&&i.onNext(s)},i.onError.bind(i),i.onCompleted.bind(i))})},wn.finalValue=function(){var t=this;return new ur(function(e){var n,r=!1;return t.subscribe(function(t){r=!0,n=t},e.onError.bind(e),function(){r?(e.onNext(n),e.onCompleted()):e.onError(Error(ae))})})},wn.aggregate=function(){var t,e,n;return 2===arguments.length?(t=arguments[0],e=!0,n=arguments[1]):n=arguments[0],e?this.scan(t,n).startWith(t).finalValue():this.scan(n).finalValue()},wn.reduce=function(t){var e,n;return 2===arguments.length&&(n=!0,e=arguments[1]),n?this.scan(e,t).startWith(e).finalValue():this.scan(t).finalValue()},wn.some=wn.any=function(t,e){var n=this;return t?n.where(t,e).any():new ur(function(t){return n.subscribe(function(){t.onNext(!0),t.onCompleted()},t.onError.bind(t),function(){t.onNext(!1),t.onCompleted()})})},wn.isEmpty=function(){return this.any().select(function(t){return!t})},wn.every=wn.all=function(t,e){return this.where(function(e){return!t(e)},e).any().select(function(t){return!t})},wn.contains=function(t,e){return e||(e=ie),this.where(function(n){return e(n,t)}).any()},wn.count=function(t,e){return t?this.where(t,e).count():this.aggregate(0,function(t){return t+1})},wn.sum=function(t,e){return t?this.select(t,e).sum():this.aggregate(0,function(t,e){return t+e})},wn.minBy=function(t,e){return e||(e=oe),m(this,t,function(t,n){return-1*e(t,n)})},wn.min=function(t){return this.minBy(ne,t).select(function(t){return y(t)})},wn.maxBy=function(t,e){return e||(e=oe),m(this,t,e)},wn.max=function(t){return this.maxBy(ne,t).select(function(t){return y(t)})},wn.average=function(t,e){return t?this.select(t,e).average():this.scan({sum:0,count:0},function(t,e){return{sum:t.sum+e,count:t.count+1}}).finalValue().select(function(t){if(0===t.count)throw Error("The input sequence was empty");return t.sum/t.count})},wn.sequenceEqual=function(e,n){var r=this;return n||(n=ie),Array.isArray(e)?w(r,e,n):new ur(function(i){var o=!1,s=!1,u=[],c=[],a=r.subscribe(function(e){var r,o;if(c.length>0){o=c.shift();try{r=n(o,e)}catch(a){return i.onError(a),t}r||(i.onNext(!1),i.onCompleted())}else s?(i.onNext(!1),i.onCompleted()):u.push(e)},i.onError.bind(i),function(){o=!0,0===u.length&&(c.length>0?(i.onNext(!1),i.onCompleted()):s&&(i.onNext(!0),i.onCompleted()))});ce(e)&&(e=_n(e));var h=e.subscribe(function(e){var r,s;if(u.length>0){s=u.shift();try{r=n(s,e)}catch(a){return i.onError(a),t}r||(i.onNext(!1),i.onCompleted())}else o?(i.onNext(!1),i.onCompleted()):c.push(e)},i.onError.bind(i),function(){s=!0,0===c.length&&(u.length>0?(i.onNext(!1),i.onCompleted()):o&&(i.onNext(!0),i.onCompleted()))});return new Be(a,h)})},wn.elementAt=function(t){return g(this,t,!1)},wn.elementAtOrDefault=function(t,e){return g(this,t,!0,e)},wn.single=function(t,e){return t?this.where(t,e).single():E(this,!1)},wn.singleOrDefault=function(t,e,n){return t?this.where(t,n).singleOrDefault(null,e):E(this,!0,e)},wn.first=function(t,e){return t?this.where(t,e).first():x(this,!1)},wn.firstOrDefault=function(t,e){return t?this.where(t).firstOrDefault(null,e):x(this,!0,e)},wn.last=function(t,e){return t?this.where(t,e).last():C(this,!1)},wn.lastOrDefault=function(t,e,n){return t?this.where(t,n).lastOrDefault(null,e):C(this,!0,e)},wn.find=function(t,e){return D(this,t,e,!1)},wn.findIndex=function(t,e){return D(this,t,e,!0)},Sn.start=function(t,e,n){return zn(t,e,n)()};var zn=Sn.toAsync=function(e,n,r){return n||(n=un),function(){var i=arguments,o=new lr;return n.schedule(function(){var n;try{n=e.apply(r,i)}catch(s){return o.onError(s),t}o.onNext(n),o.onCompleted()}),o.asObservable()}};Sn.fromCallback=function(e,n,r,i){return n||(n=rn),function(){var o=Te.call(arguments,0);return new ur(function(s){return n.schedule(function(){function n(e){var n=e;if(i)try{n=i(arguments)}catch(r){return s.onError(r),t}else 1===n.length&&(n=n[0]);s.onNext(n),s.onCompleted()}o.push(n),e.apply(r,o)})})}},Sn.fromNodeCallback=function(e,n,r,i){return n||(n=rn),function(){var o=Te.call(arguments,0);return new ur(function(s){return n.schedule(function(){function n(e){if(e)return s.onError(e),t;var n=Te.call(arguments,1);if(i)try{n=i(n)}catch(r){return s.onError(r),t}else 1===n.length&&(n=n[0]);s.onNext(n),s.onCompleted()}o.push(n),e.apply(r,o)})})}};var Ln=J.angular&&angular.element?angular.element:J.jQuery?J.jQuery:J.Zepto?J.Zepto:null,Mn=!!J.Ember&&"function"==typeof J.Ember.addListener;Sn.fromEvent=function(e,n,r){if(Mn)return In(function(t){Ember.addListener(e,n,t)},function(t){Ember.removeListener(e,n,t)},r);if(Ln){var i=Ln(e);return In(function(t){i.on(n,t)},function(t){i.off(n,t)},r)}return new ur(function(i){return _(e,n,function(e){var n=e;if(r)try{n=r(arguments)}catch(o){return i.onError(o),t}i.onNext(n)})}).publish().refCount()};var In=Sn.fromEventPattern=function(e,n,r){return new ur(function(i){function o(e){var n=e;if(r)try{n=r(arguments)}catch(o){return i.onError(o),t}i.onNext(n)}var s=e(o);return Qe(function(){n&&n(o,s)})}).publish().refCount()};Sn.startAsync=function(t){var e;try{e=t()}catch(n){return Wn(n)}return _n(e)};var Fn=function(t){function e(t){var e=this.source.publish(),n=e.subscribe(t),r=$e,i=this.subject.distinctUntilChanged().subscribe(function(t){t?r=e.connect():(r.dispose(),r=$e)});return new Be(n,r,i)}function n(n,r){this.source=n,this.subject=r||new hr,this.isPaused=!0,t.call(this,e)}return Ve(n,t),n.prototype.pause=function(){this.isPaused!==!0&&(this.isPaused=!0,this.subject.onNext(!1))},n.prototype.resume=function(){this.isPaused!==!1&&(this.isPaused=!1,this.subject.onNext(!0))},n}(Sn);wn.pausable=function(t){return new Fn(this,t)};var Bn=function(t){function e(t){var e=[],n=!0,r=A(this.source,this.subject.distinctUntilChanged(),function(t,e){return{data:t,shouldFire:e}}).subscribe(function(r){if(r.shouldFire&&n&&t.onNext(r.data),r.shouldFire&&!n){for(;e.length>0;)t.onNext(e.shift());n=!0}else r.shouldFire||n?!r.shouldFire&&n&&(n=!1):e.push(r.data)},function(n){for(;e.length>0;)t.onNext(e.shift());t.onError(n)},function(){for(;e.length>0;)t.onNext(e.shift());t.onCompleted()});return this.subject.onNext(!1),r}function n(n,r){this.source=n,this.subject=r||new hr,this.isPaused=!0,t.call(this,e)}return Ve(n,t),n.prototype.pause=function(){this.isPaused!==!0&&(this.isPaused=!0,this.subject.onNext(!1))},n.prototype.resume=function(){this.isPaused!==!1&&(this.isPaused=!1,this.subject.onNext(!0))},n}(Sn);wn.pausableBuffered=function(t){return new Bn(this,t)},wn.controlled=function(t){return null==t&&(t=!0),new Hn(this,t)};var Hn=function(t){function e(t){return this.source.subscribe(t)}function n(n,r){t.call(this,e),this.subject=new Un(r),this.source=n.multicast(this.subject).refCount()}return Ve(n,t),n.prototype.request=function(t){return null==t&&(t=-1),this.subject.request(t)},n}(Sn),Un=te.ControlledSubject=function(t){function n(t){return this.subject.subscribe(t)}function r(e){null==e&&(e=!0),t.call(this,n),this.subject=new hr,this.enableQueue=e,this.queue=e?[]:null,this.requestedCount=0,this.requestedDisposable=$e,this.error=null,this.hasFailed=!1,this.hasCompleted=!1,this.controlledDisposable=$e}return Ve(r,t),ze(r.prototype,mn,{onCompleted:function(){e.call(this),this.hasCompleted=!0,this.enableQueue&&0!==this.queue.length||this.subject.onCompleted()},onError:function(t){e.call(this),this.hasFailed=!0,this.error=t,this.enableQueue&&0!==this.queue.length||this.subject.onError(t)},onNext:function(t){e.call(this);var n=!1;0===this.requestedCount?this.enableQueue&&this.queue.push(t):(-1!==this.requestedCount&&0===this.requestedCount--&&this.disposeCurrentRequest(),n=!0),n&&this.subject.onNext(t)},_processRequest:function(t){if(this.enableQueue){for(;this.queue.length>=t&&t>0;)this.subject.onNext(this.queue.shift()),t--;return 0!==this.queue.length?{numberOfItems:t,returnValue:!0}:{numberOfItems:t,returnValue:!1}}return this.hasFailed?(this.subject.onError(this.error),this.controlledDisposable.dispose(),this.controlledDisposable=$e):this.hasCompleted&&(this.subject.onCompleted(),this.controlledDisposable.dispose(),this.controlledDisposable=$e),{numberOfItems:t,returnValue:!1}},request:function(t){e.call(this),this.disposeCurrentRequest();var n=this,r=this._processRequest(t);return t=r.numberOfItems,r.returnValue?$e:(this.requestedCount=t,this.requestedDisposable=Qe(function(){n.requestedCount=0}),this.requestedDisposable)},disposeCurrentRequest:function(){this.requestedDisposable.dispose(),this.requestedDisposable=$e},dispose:function(){this.isDisposed=!0,this.error=null,this.subject.dispose(),this.requestedDisposable.dispose()}}),r}(Sn);wn.multicast=function(t,e){var n=this;return"function"==typeof t?new ur(function(r){var i=n.multicast(t());return new Be(e(i).subscribe(r),i.connect())}):new Jn(n,t)},wn.publish=function(t){return t?this.multicast(function(){return new hr},t):this.multicast(new hr)},wn.share=function(){return this.publish(null).refCount()},wn.publishLast=function(t){return t?this.multicast(function(){return new lr},t):this.multicast(new lr)},wn.publishValue=function(t,e){return 2===arguments.length?this.multicast(function(){return new $n(e)},t):this.multicast(new $n(t))},wn.shareValue=function(t){return this.publishValue(t).refCount()},wn.replay=function(t,e,n,r){return t?this.multicast(function(){return new Kn(e,n,r)},t):this.multicast(new Kn(e,n,r))},wn.shareReplay=function(t,e,n){return this.replay(null,t,e,n).refCount()};var Qn=function(t,e){this.subject=t,this.observer=e};Qn.prototype.dispose=function(){if(!this.subject.isDisposed&&null!==this.observer){var t=this.subject.observers.indexOf(this.observer);this.subject.observers.splice(t,1),this.observer=null}};var $n=te.BehaviorSubject=function(t){function n(t){if(e.call(this),!this.isStopped)return this.observers.push(t),t.onNext(this.value),new Qn(this,t);var n=this.exception;return n?t.onError(n):t.onCompleted(),$e}function r(e){t.call(this,n),this.value=e,this.observers=[],this.isDisposed=!1,this.isStopped=!1,this.exception=null}return Ve(r,t),ze(r.prototype,mn,{hasObservers:function(){return this.observers.length>0},onCompleted:function(){if(e.call(this),!this.isStopped){var t=this.observers.slice(0);this.isStopped=!0;for(var n=0,r=t.length;r>n;n++)t[n].onCompleted();this.observers=[]}},onError:function(t){if(e.call(this),!this.isStopped){var n=this.observers.slice(0);this.isStopped=!0,this.exception=t;for(var r=0,i=n.length;i>r;r++)n[r].onError(t);this.observers=[]}},onNext:function(t){if(e.call(this),!this.isStopped){this.value=t;for(var n=this.observers.slice(0),r=0,i=n.length;i>r;r++)n[r].onNext(t)}},dispose:function(){this.isDisposed=!0,this.observers=null,this.value=null,this.exception=null}}),r}(Sn),Kn=te.ReplaySubject=function(t){function n(t,e){this.subject=t,this.observer=e}function r(t){var r=new Cn(this.scheduler,t),i=new n(this,r);e.call(this),this._trim(this.scheduler.now()),this.observers.push(r);for(var o=this.q.length,s=0,u=this.q.length;u>s;s++)r.onNext(this.q[s].value);return this.hasError?(o++,r.onError(this.error)):this.isStopped&&(o++,r.onCompleted()),r.ensureActive(o),i}function i(e,n,i){this.bufferSize=null==e?Number.MAX_VALUE:e,this.windowSize=null==n?Number.MAX_VALUE:n,this.scheduler=i||on,this.q=[],this.observers=[],this.isStopped=!1,this.isDisposed=!1,this.hasError=!1,this.error=null,t.call(this,r)}return n.prototype.dispose=function(){if(this.observer.dispose(),!this.subject.isDisposed){var t=this.subject.observers.indexOf(this.observer);this.subject.observers.splice(t,1)}},Ve(i,t),ze(i.prototype,mn,{hasObservers:function(){return this.observers.length>0},_trim:function(t){for(;this.q.length>this.bufferSize;)this.q.shift();for(;this.q.length>0&&t-this.q[0].interval>this.windowSize;)this.q.shift()},onNext:function(t){var n;if(e.call(this),!this.isStopped){var r=this.scheduler.now();this.q.push({interval:r,value:t}),this._trim(r);for(var i=this.observers.slice(0),o=0,s=i.length;s>o;o++)n=i[o],n.onNext(t),n.ensureActive()}},onError:function(t){var n;if(e.call(this),!this.isStopped){this.isStopped=!0,this.error=t,this.hasError=!0;var r=this.scheduler.now();this._trim(r);for(var i=this.observers.slice(0),o=0,s=i.length;s>o;o++)n=i[o],n.onError(t),n.ensureActive();this.observers=[]}},onCompleted:function(){var t;if(e.call(this),!this.isStopped){this.isStopped=!0;var n=this.scheduler.now();this._trim(n);for(var r=this.observers.slice(0),i=0,o=r.length;o>i;i++)t=r[i],t.onCompleted(),t.ensureActive();this.observers=[]}},dispose:function(){this.isDisposed=!0,this.observers=null}}),i}(Sn),Jn=te.ConnectableObservable=function(t){function e(e,n){function r(t){return i.subject.subscribe(t)}var i={subject:n,source:e.asObservable(),hasSubscription:!1,subscription:null};this.connect=function(){return i.hasSubscription||(i.hasSubscription=!0,i.subscription=new Be(i.source.subscribe(i.subject),Qe(function(){i.hasSubscription=!1}))),i.subscription},t.call(this,r)}return Ve(e,t),e.prototype.connect=function(){return this.connect()},e.prototype.refCount=function(){var t=null,e=0,n=this;return new ur(function(r){var i,o;return e++,i=1===e,o=n.subscribe(r),i&&(t=n.connect()),Qe(function(){o.dispose(),e--,0===e&&t.dispose()})})},e}(Sn),Xn=[1,3,7,13,31,61,127,251,509,1021,2039,4093,8191,16381,32749,65521,131071,262139,524287,1048573,2097143,4194301,8388593,16777213,33554393,67108859,134217689,268435399,536870909,1073741789,2147483647],Zn="no such key",Gn="duplicate key",Yn=function(){var t=0;return function(e){if(null==e)throw Error(Zn);if("string"==typeof e)return R(e);if("number"==typeof e)return j(e);if("boolean"==typeof e)return e===!0?1:0;if(e instanceof Date)return e.getTime();if(e.getHashCode)return e.getHashCode();var n=17*t++;return e.getHashCode=function(){return n},n}}(),tr=function(t,e){if(0>t)throw Error("out of range");t>0&&this._initialize(t),this.comparer=e||ie,this.freeCount=0,this.size=0,this.freeList=-1};tr.prototype._initialize=function(t){var e,n=O(t);for(this.buckets=Array(n),this.entries=Array(n),e=0;n>e;e++)this.buckets[e]=-1,this.entries[e]=W();this.freeList=-1},tr.prototype.count=function(){return this.size},tr.prototype.add=function(t,e){return this._insert(t,e,!0)},tr.prototype._insert=function(e,n,r){this.buckets||this._initialize(0);for(var i,o=2147483647&Yn(e),s=o%this.buckets.length,u=this.buckets[s];u>=0;u=this.entries[u].next)if(this.entries[u].hashCode===o&&this.comparer(this.entries[u].key,e)){if(r)throw Error(Gn);return this.entries[u].value=n,t}this.freeCount>0?(i=this.freeList,this.freeList=this.entries[i].next,--this.freeCount):(this.size===this.entries.length&&(this._resize(),s=o%this.buckets.length),i=this.size,++this.size),this.entries[i].hashCode=o,this.entries[i].next=this.buckets[s],this.entries[i].key=e,this.entries[i].value=n,this.buckets[s]=i},tr.prototype._resize=function(){var t=O(2*this.size),e=Array(t);for(r=0;e.length>r;++r)e[r]=-1;var n=Array(t);for(r=0;this.size>r;++r)n[r]=this.entries[r];for(var r=this.size;t>r;++r)n[r]=W();for(var i=0;this.size>i;++i){var o=n[i].hashCode%t;n[i].next=e[o],e[o]=i}this.buckets=e,this.entries=n},tr.prototype.remove=function(t){if(this.buckets)for(var e=2147483647&Yn(t),n=e%this.buckets.length,r=-1,i=this.buckets[n];i>=0;i=this.entries[i].next){if(this.entries[i].hashCode===e&&this.comparer(this.entries[i].key,t))return 0>r?this.buckets[n]=this.entries[i].next:this.entries[r].next=this.entries[i].next,this.entries[i].hashCode=-1,this.entries[i].next=this.freeList,this.entries[i].key=null,this.entries[i].value=null,this.freeList=i,++this.freeCount,!0;r=i}return!1},tr.prototype.clear=function(){var t,e;if(!(0>=this.size)){for(t=0,e=this.buckets.length;e>t;++t)this.buckets[t]=-1;for(t=0;this.size>t;++t)this.entries[t]=W();this.freeList=-1,this.size=0}},tr.prototype._findEntry=function(t){if(this.buckets)for(var e=2147483647&Yn(t),n=this.buckets[e%this.buckets.length];n>=0;n=this.entries[n].next)if(this.entries[n].hashCode===e&&this.comparer(this.entries[n].key,t))return n;return-1},tr.prototype.count=function(){return this.size-this.freeCount},tr.prototype.tryGetValue=function(e){var n=this._findEntry(e);return n>=0?this.entries[n].value:t},tr.prototype.getValues=function(){var t=0,e=[];if(this.entries)for(var n=0;this.size>n;n++)this.entries[n].hashCode>=0&&(e[t++]=this.entries[n].value);return e},tr.prototype.get=function(t){var e=this._findEntry(t);if(e>=0)return this.entries[e].value;throw Error(Zn)},tr.prototype.set=function(t,e){this._insert(t,e,!1)},tr.prototype.containskey=function(t){return this._findEntry(t)>=0},wn.join=function(e,n,r,i){var o=this;return new ur(function(s){var u=new Be,c=!1,a=0,h=new tr,l=!1,f=0,p=new tr;return u.add(o.subscribe(function(e){var r,o,l,f,d=a++,v=new Je;h.add(d,e),u.add(v),o=function(){return h.remove(d)&&0===h.count()&&c&&s.onCompleted(),u.remove(v)};try{r=n(e)}catch(b){return s.onError(b),t}v.setDisposable(r.take(1).subscribe(ee,s.onError.bind(s),function(){o()})),f=p.getValues();for(var m=0;f.length>m;m++){try{l=i(e,f[m])}catch(y){return s.onError(y),t}s.onNext(l)}},s.onError.bind(s),function(){c=!0,(l||0===h.count())&&s.onCompleted()})),u.add(e.subscribe(function(e){var n,o,c,a,d=f++,v=new Je;p.add(d,e),u.add(v),o=function(){return p.remove(d)&&0===p.count()&&l&&s.onCompleted(),u.remove(v)};try{n=r(e)}catch(b){return s.onError(b),t}v.setDisposable(n.take(1).subscribe(ee,s.onError.bind(s),function(){o()})),a=h.getValues();for(var m=0;a.length>m;m++){try{c=i(a[m],e)}catch(b){return s.onError(b),t}s.onNext(c)}},s.onError.bind(s),function(){l=!0,(c||0===p.count())&&s.onCompleted()})),u})},wn.groupJoin=function(e,n,r,i){var o=this;return new ur(function(s){var u=function(){},c=new Be,a=new Ze(c),h=new tr,l=new tr,f=0,p=0;return c.add(o.subscribe(function(e){var r=new hr,o=f++;h.add(o,r);var p,d,v,b,m;try{m=i(e,Le(r,a))}catch(y){for(v=h.getValues(),p=0,d=v.length;d>p;p++)v[p].onError(y);return s.onError(y),t}for(s.onNext(m),b=l.getValues(),p=0,d=b.length;d>p;p++)r.onNext(b[p]);var w=new Je;c.add(w);var g,E=function(){h.remove(o)&&r.onCompleted(),c.remove(w)};try{g=n(e)}catch(y){for(v=h.getValues(),p=0,d=h.length;d>p;p++)v[p].onError(y);return s.onError(y),t}w.setDisposable(g.take(1).subscribe(u,function(t){for(v=h.getValues(),p=0,d=v.length;d>p;p++)v[p].onError(t);s.onError(t)},E))},function(t){for(var e=h.getValues(),n=0,r=e.length;r>n;n++)e[n].onError(t);s.onError(t)},s.onCompleted.bind(s))),c.add(e.subscribe(function(e){var n,i,o,a=p++;l.add(a,e);var f=new Je;c.add(f);var d,v=function(){l.remove(a),c.remove(f)};try{d=r(e)}catch(b){for(n=h.getValues(),i=0,o=h.length;o>i;i++)n[i].onError(b);return s.onError(b),t}for(f.setDisposable(d.take(1).subscribe(u,function(t){for(n=h.getValues(),i=0,o=h.length;o>i;i++)n[i].onError(t);s.onError(t)},v)),n=h.getValues(),i=0,o=n.length;o>i;i++)n[i].onNext(e)},function(t){for(var e=h.getValues(),n=0,r=e.length;r>n;n++)e[n].onError(t);s.onError(t)})),a})},wn.buffer=function(){return this.window.apply(this,arguments).selectMany(function(t){return t.toArray()})},wn.window=function(t,e){return 1===arguments.length&&"function"!=typeof arguments[0]?q.call(this,t):"function"==typeof t?P.call(this,t):k.call(this,t,e)},wn.pairwise=function(){var t=this;return new ur(function(e){var n,r=!1;return t.subscribe(function(t){r?e.onNext([n,t]):r=!0,n=t},e.onError.bind(e),e.onCompleted.bind(e))})},wn.partition=function(t,e){var n=this.publish().refCount();return[n.filter(t,e),n.filter(function(n,r,i){return!t.call(e,n,r,i)})]},wn.letBind=wn.let=function(t){return t(this)},Sn["if"]=Sn.ifThen=function(t,e,n){return An(function(){return n||(n=Nn()),ce(e)&&(e=_n(e)),ce(n)&&(n=_n(n)),"function"==typeof n.now&&(n=Nn(n)),t()?e:n})},Sn["for"]=Sn.forIn=function(t,e){return bn(t,e).concat()};var er=Sn["while"]=Sn.whileDo=function(t,e){return ce(e)&&(e=_n(e)),T(t,e).concat()};wn.doWhile=function(t){return Pn([this,er(t,this)])},Sn["case"]=Sn.switchCase=function(t,e,n){return An(function(){n||(n=Nn()),"function"==typeof n.now&&(n=Nn(n)); +var r=e[t()];return ce(r)&&(r=_n(r)),r||n})},wn.expand=function(e,n){n||(n=rn);var r=this;return new ur(function(i){var o=[],s=new Xe,u=new Be(s),c=0,a=!1,h=function(){var r=!1;o.length>0&&(r=!a,a=!0),r&&s.setDisposable(n.scheduleRecursive(function(n){var r;if(!(o.length>0))return a=!1,t;r=o.shift();var s=new Je;u.add(s),s.setDisposable(r.subscribe(function(t){i.onNext(t);var n=null;try{n=e(t)}catch(r){i.onError(r)}o.push(n),c++,h()},i.onError.bind(i),function(){u.remove(s),c--,0===c&&i.onCompleted()})),n()}))};return o.push(r),c++,h(),u})},Sn.forkJoin=function(){var e=h(arguments,0);return new ur(function(n){var r=e.length;if(0===r)return n.onCompleted(),$e;for(var i=new Be,o=!1,s=Array(r),u=Array(r),c=Array(r),a=0;r>a;a++)(function(a){var h=e[a];ce(h)&&(h=_n(h)),i.add(h.subscribe(function(t){o||(s[a]=!0,c[a]=t)},function(t){o=!0,n.onError(t),i.dispose()},function(){if(!o){if(!s[a])return n.onCompleted(),t;u[a]=!0;for(var e=0;r>e;e++)if(!u[e])return;o=!0,n.onNext(c),n.onCompleted()}}))})(a);return i})},wn.forkJoin=function(e,n){var r=this;return new ur(function(i){var o,s,u=!1,c=!1,a=!1,h=!1,l=new Je,f=new Je;return ce(e)&&(e=_n(e)),l.setDisposable(r.subscribe(function(t){a=!0,o=t},function(t){f.dispose(),i.onError(t)},function(){if(u=!0,c)if(a)if(h){var e;try{e=n(o,s)}catch(r){return i.onError(r),t}i.onNext(e),i.onCompleted()}else i.onCompleted();else i.onCompleted()})),f.setDisposable(e.subscribe(function(t){h=!0,s=t},function(t){l.dispose(),i.onError(t)},function(){if(c=!0,u)if(a)if(h){var e;try{e=n(o,s)}catch(r){return i.onError(r),t}i.onNext(e),i.onCompleted()}else i.onCompleted();else i.onCompleted()})),new Be(l,f)})},wn.manySelect=function(t,e){e||(e=rn);var n=this;return An(function(){var r;return n.select(function(t){var e=new nr(t);return r&&r.onNext(t),r=e,e}).doAction(ee,function(t){r&&r.onError(t)},function(){r&&r.onCompleted()}).observeOn(e).select(function(e,n,r){return t(e,n,r)})})};var nr=function(t){function e(t){var e=this,n=new Be;return n.add(on.schedule(function(){t.onNext(e.head),n.add(e.tail.mergeObservable().subscribe(t))})),n}function n(n){t.call(this,e),this.head=n,this.tail=new lr}return Ve(n,t),ze(n.prototype,mn,{onCompleted:function(){this.onNext(Sn.empty())},onError:function(t){this.onNext(Sn.throwException(t))},onNext:function(t){this.tail.onNext(t),this.tail.onCompleted()}}),n}(Sn),rr=function(){function t(){this.keys=[],this.values=[]}return t.prototype["delete"]=function(t){var e=this.keys.indexOf(t);return-1!==e&&(this.keys.splice(e,1),this.values.splice(e,1)),-1!==e},t.prototype.get=function(t,e){var n=this.keys.indexOf(t);return-1!==n?this.values[n]:e},t.prototype.set=function(t,e){var n=this.keys.indexOf(t);-1!==n&&(this.values[n]=e),this.values[this.keys.push(t)-1]=e},t.prototype.size=function(){return this.keys.length},t.prototype.has=function(t){return-1!==this.keys.indexOf(t)},t.prototype.getKeys=function(){return this.keys.slice(0)},t.prototype.getValues=function(){return this.values.slice(0)},t}();V.prototype.and=function(t){var e=this.patterns.slice(0);return e.push(t),new V(e)},V.prototype.then=function(t){return new z(this,t)},z.prototype.activate=function(e,n,r){for(var i=this,o=[],s=0,u=this.expression.patterns.length;u>s;s++)o.push(L(e,this.expression.patterns[s],n.onError.bind(n)));var c=new M(o,function(){var e;try{e=i.selector.apply(i,arguments)}catch(r){return n.onError(r),t}n.onNext(e)},function(){for(var t=0,e=o.length;e>t;t++)o[t].removeActivePlan(c);r(c)});for(s=0,u=o.length;u>s;s++)o[s].addActivePlan(c);return c},M.prototype.dequeue=function(){for(var t=this.joinObservers.getValues(),e=0,n=t.length;n>e;e++)t[e].queue.shift()},M.prototype.match=function(){var t,e,n,r,i,o=!0;for(e=0,n=this.joinObserverArray.length;n>e;e++)if(0===this.joinObserverArray[e].queue.length){o=!1;break}if(o){for(t=[],r=!1,e=0,n=this.joinObserverArray.length;n>e;e++)t.push(this.joinObserverArray[e].queue[0]),"C"===this.joinObserverArray[e].queue[0].kind&&(r=!0);if(r)this.onCompleted();else{for(this.dequeue(),i=[],e=0;t.length>e;e++)i.push(t[e].value);this.onNext.apply(this,i)}}};var ir=function(e){function n(t,n){e.call(this),this.source=t,this.onError=n,this.queue=[],this.activePlans=[],this.subscription=new Je,this.isDisposed=!1}Ve(n,e);var r=n.prototype;return r.next=function(e){if(!this.isDisposed){if("E"===e.kind)return this.onError(e.exception),t;this.queue.push(e);for(var n=this.activePlans.slice(0),r=0,i=n.length;i>r;r++)n[r].match()}},r.error=ee,r.completed=ee,r.addActivePlan=function(t){this.activePlans.push(t)},r.subscribe=function(){this.subscription.setDisposable(this.source.materialize().subscribe(this))},r.removeActivePlan=function(t){var e=this.activePlans.indexOf(t);this.activePlans.splice(e,1),0===this.activePlans.length&&this.dispose()},r.dispose=function(){e.prototype.dispose.call(this),this.isDisposed||(this.isDisposed=!0,this.subscription.dispose())},n}(gn);wn.and=function(t){return new V([this,t])},wn.then=function(t){return new V([this]).then(t)},Sn.when=function(){var t=h(arguments,0);return new ur(function(e){var n,r,i,o,s,u,c=[],a=new rr;u=yn(e.onNext.bind(e),function(t){for(var n=a.getValues(),r=0,i=n.length;i>r;r++)n[r].onError(t);e.onError(t)},e.onCompleted.bind(e));try{for(r=0,i=t.length;i>r;r++)c.push(t[r].activate(a,u,function(t){var e=c.indexOf(t);c.splice(e,1),0===c.length&&u.onCompleted()}))}catch(h){Wn(h).subscribe(e)}for(n=new Be,s=a.getValues(),r=0,i=s.length;i>r;r++)o=s[r],o.subscribe(),n.add(o);return n})};var or=Sn.interval=function(t,e){return e||(e=un),H(t,t,e)},sr=Sn.timer=function(e,n,r){var i;return r||(r=un),n!==t&&"number"==typeof n?i=n:n!==t&&"object"==typeof n&&(r=n),e instanceof Date&&i===t?I(e.getTime(),r):e instanceof Date&&i!==t?(i=n,F(e.getTime(),i,r)):i===t?B(e,r):H(e,i,r)};wn.delay=function(t,e){return e||(e=un),t instanceof Date?Q.call(this,t.getTime(),e):U.call(this,t,e)},wn.throttle=function(t,e){return e||(e=un),this.throttleWithSelector(function(){return sr(t,e)})},wn.windowWithTime=function(e,n,r){var i,o=this;return n===t&&(i=e),r===t&&(r=un),"number"==typeof n?i=n:"object"==typeof n&&(i=e,r=n),new ur(function(t){function n(){var e=new Je,o=!1,s=!1;l.setDisposable(e),a===c?(o=!0,s=!0):c>a?o=!0:s=!0;var p=o?a:c,d=p-f;f=p,o&&(a+=i),s&&(c+=i),e.setDisposable(r.scheduleWithRelative(d,function(){var e;s&&(e=new hr,h.push(e),t.onNext(Le(e,u))),o&&(e=h.shift(),e.onCompleted()),n()}))}var s,u,c=i,a=e,h=[],l=new Xe,f=0;return s=new Be(l),u=new Ze(s),h.push(new hr),t.onNext(Le(h[0],u)),n(),s.add(o.subscribe(function(t){var e,n;for(e=0;h.length>e;e++)n=h[e],n.onNext(t)},function(e){var n,r;for(n=0;h.length>n;n++)r=h[n],r.onError(e);t.onError(e)},function(){var e,n;for(e=0;h.length>e;e++)n=h[e],n.onCompleted();t.onCompleted()})),u})},wn.windowWithTimeOrCount=function(t,e,n){var r=this;return n||(n=un),new ur(function(i){var o,s,u,c,a=0,h=new Xe,l=0;return s=new Be(h),u=new Ze(s),o=function(e){var r=new Je;h.setDisposable(r),r.setDisposable(n.scheduleWithRelative(t,function(){var t;e===l&&(a=0,t=++l,c.onCompleted(),c=new hr,i.onNext(Le(c,u)),o(t))}))},c=new hr,i.onNext(Le(c,u)),o(0),s.add(r.subscribe(function(t){var n=0,r=!1;c.onNext(t),a++,a===e&&(r=!0,a=0,n=++l,c.onCompleted(),c=new hr,i.onNext(Le(c,u))),r&&o(n)},function(t){c.onError(t),i.onError(t)},function(){c.onCompleted(),i.onCompleted()})),u})},wn.bufferWithTime=function(){return this.windowWithTime.apply(this,arguments).selectMany(function(t){return t.toArray()})},wn.bufferWithTimeOrCount=function(t,e,n){return this.windowWithTimeOrCount(t,e,n).selectMany(function(t){return t.toArray()})},wn.timeInterval=function(t){var e=this;return t||(t=un),An(function(){var n=t.now();return e.select(function(e){var r=t.now(),i=r-n;return n=r,{value:e,interval:i}})})},wn.timestamp=function(t){return t||(t=un),this.select(function(e){return{value:e,timestamp:t.now()}})},wn.sample=function(t,e){return e||(e=un),"number"==typeof t?$(this,or(t,e)):$(this,t)},wn.timeout=function(t,e,n){e||(e=Wn(Error("Timeout"))),n||(n=un);var r=this,i=t instanceof Date?"scheduleWithAbsolute":"scheduleWithRelative";return new ur(function(o){var s=0,u=new Je,c=new Xe,a=!1,h=new Xe;c.setDisposable(u);var l=function(){var r=s;h.setDisposable(n[i](t,function(){s===r&&(ce(e)&&(e=_n(e)),c.setDisposable(e.subscribe(o)))}))};return l(),u.setDisposable(r.subscribe(function(t){a||(s++,o.onNext(t),l())},function(t){a||(s++,o.onError(t))},function(){a||(s++,o.onCompleted())})),new Be(c,h)})},Sn.generateWithAbsoluteTime=function(e,n,r,i,o,s){return s||(s=un),new ur(function(u){var c,a,h=!0,l=!1,f=e;return s.scheduleRecursiveWithAbsolute(s.now(),function(e){l&&u.onNext(c);try{h?h=!1:f=r(f),l=n(f),l&&(c=i(f),a=o(f))}catch(s){return u.onError(s),t}l?e(a):u.onCompleted()})})},Sn.generateWithRelativeTime=function(e,n,r,i,o,s){return s||(s=un),new ur(function(u){var c,a,h=!0,l=!1,f=e;return s.scheduleRecursiveWithRelative(0,function(e){l&&u.onNext(c);try{h?h=!1:f=r(f),l=n(f),l&&(c=i(f),a=o(f))}catch(s){return u.onError(s),t}l?e(a):u.onCompleted()})})},wn.delaySubscription=function(t,e){return e||(e=un),this.delayWithSelector(sr(t,e),function(){return Nn()})},wn.delayWithSelector=function(e,n){var r,i,o=this;return"function"==typeof e?i=e:(r=e,i=n),new ur(function(e){var n=new Be,s=!1,u=function(){s&&0===n.length&&e.onCompleted()},c=new Xe,a=function(){c.setDisposable(o.subscribe(function(r){var o;try{o=i(r)}catch(s){return e.onError(s),t}var c=new Je;n.add(c),c.setDisposable(o.subscribe(function(){e.onNext(r),n.remove(c),u()},e.onError.bind(e),function(){e.onNext(r),n.remove(c),u()}))},e.onError.bind(e),function(){s=!0,c.dispose(),u()}))};return r?c.setDisposable(r.subscribe(function(){a()},e.onError.bind(e),function(){a()})):a(),new Be(c,n)})},wn.timeoutWithSelector=function(e,n,r){if(1===arguments.length){n=e;var e=Rn()}r||(r=Wn(Error("Timeout")));var i=this;return new ur(function(o){var s=new Xe,u=new Xe,c=new Je;s.setDisposable(c);var a=0,h=!1,l=function(t){var e=a,n=function(){return a===e},i=new Je;u.setDisposable(i),i.setDisposable(t.subscribe(function(){n()&&s.setDisposable(r.subscribe(o)),i.dispose()},function(t){n()&&o.onError(t)},function(){n()&&s.setDisposable(r.subscribe(o))}))};l(e);var f=function(){var t=!h;return t&&a++,t};return c.setDisposable(i.subscribe(function(e){if(f()){o.onNext(e);var r;try{r=n(e)}catch(i){return o.onError(i),t}l(r)}},function(t){f()&&o.onError(t)},function(){f()&&o.onCompleted()})),new Be(s,u)})},wn.throttleWithSelector=function(e){var n=this;return new ur(function(r){var i,o=!1,s=new Xe,u=0,c=n.subscribe(function(n){var c;try{c=e(n)}catch(a){return r.onError(a),t}o=!0,i=n,u++;var h=u,l=new Je;s.setDisposable(l),l.setDisposable(c.subscribe(function(){o&&u===h&&r.onNext(i),o=!1,l.dispose()},r.onError.bind(r),function(){o&&u===h&&r.onNext(i),o=!1,l.dispose()}))},function(t){s.dispose(),r.onError(t),o=!1,u++},function(){s.dispose(),o&&r.onNext(i),r.onCompleted(),o=!1,u++});return new Be(c,s)})},wn.skipLastWithTime=function(t,e){e||(e=un);var n=this;return new ur(function(r){var i=[];return n.subscribe(function(n){var o=e.now();for(i.push({interval:o,value:n});i.length>0&&o-i[0].interval>=t;)r.onNext(i.shift().value)},r.onError.bind(r),function(){for(var n=e.now();i.length>0&&n-i[0].interval>=t;)r.onNext(i.shift().value);r.onCompleted()})})},wn.takeLastWithTime=function(t,e,n){return this.takeLastBufferWithTime(t,e).selectMany(function(t){return On(t,n)})},wn.takeLastBufferWithTime=function(t,e){var n=this;return e||(e=un),new ur(function(r){var i=[];return n.subscribe(function(n){var r=e.now();for(i.push({interval:r,value:n});i.length>0&&r-i[0].interval>=t;)i.shift()},r.onError.bind(r),function(){for(var n=e.now(),o=[];i.length>0;){var s=i.shift();t>=n-s.interval&&o.push(s.value)}r.onNext(o),r.onCompleted()})})},wn.takeWithTime=function(t,e){var n=this;return e||(e=un),new ur(function(r){var i=e.scheduleWithRelative(t,function(){r.onCompleted()});return new Be(i,n.subscribe(r))})},wn.skipWithTime=function(t,e){var n=this;return e||(e=un),new ur(function(r){var i=!1,o=e.scheduleWithRelative(t,function(){i=!0}),s=n.subscribe(function(t){i&&r.onNext(t)},r.onError.bind(r),r.onCompleted.bind(r));return new Be(o,s)})},wn.skipUntilWithTime=function(t,e){e||(e=un);var n=this,r=t instanceof Date?"scheduleWithAbsolute":"scheduleWithRelative";return new ur(function(i){var o=!1;return new Be(e[r](t,function(){o=!0}),n.subscribe(function(t){o&&i.onNext(t)},i.onError.bind(i),i.onCompleted.bind(i)))})},wn.takeUntilWithTime=function(t,e){e||(e=un);var n=this,r=t instanceof Date?"scheduleWithAbsolute":"scheduleWithRelative";return new ur(function(i){return new Be(e[r](t,function(){i.onCompleted()}),n.subscribe(i))})},wn.exclusive=function(){var t=this;return new ur(function(e){var n=!1,r=!1,i=new Je,o=new Be;return o.add(i),i.setDisposable(t.subscribe(function(t){if(!n){n=!0,ce(t)&&(t=_n(t));var i=new Je;o.add(i),i.setDisposable(t.subscribe(e.onNext.bind(e),e.onError.bind(e),function(){o.remove(i),n=!1,r&&1===o.length&&e.onCompleted()}))}},e.onError.bind(e),function(){r=!0,n||1!==o.length||e.onCompleted()})),o})},wn.exclusiveMap=function(e,n){var r=this;return new ur(function(i){var o=0,s=!1,u=!0,c=new Je,a=new Be;return a.add(c),c.setDisposable(r.subscribe(function(r){s||(s=!0,innerSubscription=new Je,a.add(innerSubscription),ce(r)&&(r=_n(r)),innerSubscription.setDisposable(r.subscribe(function(s){var u;try{u=e.call(n,s,o++,r)}catch(c){return i.onError(c),t}i.onNext(u)},i.onError.bind(i),function(){a.remove(innerSubscription),s=!1,u&&1===a.length&&i.onCompleted()})))},i.onError.bind(i),function(){u=!0,1!==a.length||s||i.onCompleted()})),a})},te.VirtualTimeScheduler=function(t){function e(){throw Error("Not implemented")}function n(){return this.toDateTimeOffset(this.clock)}function r(t,e){return this.scheduleAbsoluteWithState(t,this.clock,e)}function i(t,e,n){return this.scheduleRelativeWithState(t,this.toRelative(e),n)}function o(t,e,n){return this.scheduleRelativeWithState(t,this.toRelative(e-this.now()),n)}function s(t,e){return e(),$e}function u(e,s){this.clock=e,this.comparer=s,this.isEnabled=!1,this.queue=new Ie(1024),t.call(this,n,r,i,o)}Ve(u,t);var c=u.prototype;return c.add=e,c.toDateTimeOffset=e,c.toRelative=e,c.schedulePeriodicWithState=function(t,e,n){var r=new nn(this,t,e,n);return r.start()},c.scheduleRelativeWithState=function(t,e,n){var r=this.add(this.clock,e);return this.scheduleAbsoluteWithState(t,r,n)},c.scheduleRelative=function(t,e){return this.scheduleRelativeWithState(e,t,s)},c.start=function(){var t;if(!this.isEnabled){this.isEnabled=!0;do t=this.getNext(),null!==t?(this.comparer(t.dueTime,this.clock)>0&&(this.clock=t.dueTime),t.invoke()):this.isEnabled=!1;while(this.isEnabled)}},c.stop=function(){this.isEnabled=!1},c.advanceTo=function(t){var e,n=this.comparer(this.clock,t);if(this.comparer(this.clock,t)>0)throw Error(he);if(0!==n&&!this.isEnabled){this.isEnabled=!0;do e=this.getNext(),null!==e&&0>=this.comparer(e.dueTime,t)?(this.comparer(e.dueTime,this.clock)>0&&(this.clock=e.dueTime),e.invoke()):this.isEnabled=!1;while(this.isEnabled);this.clock=t}},c.advanceBy=function(t){var e=this.add(this.clock,t),n=this.comparer(this.clock,e);if(n>0)throw Error(he);0!==n&&this.advanceTo(e)},c.sleep=function(t){var e=this.add(this.clock,t);if(this.comparer(this.clock,e)>=0)throw Error(he);this.clock=e},c.getNext=function(){for(var t;this.queue.length>0;){if(t=this.queue.peek(),!t.isCancelled())return t;this.queue.dequeue()}return null},c.scheduleAbsolute=function(t,e){return this.scheduleAbsoluteWithState(e,t,s)},c.scheduleAbsoluteWithState=function(t,e,n){var r=this,i=function(t,e){return r.queue.remove(o),n(t,e)},o=new Ge(r,t,i,e,r.comparer);return r.queue.enqueue(o),o.disposable},u}(tn),te.HistoricalScheduler=function(t){function e(e,n){var r=null==e?0:e,i=n||oe;t.call(this,r,i)}Ve(e,t);var n=e.prototype;return n.add=function(t,e){return t+e},n.toDateTimeOffset=function(t){return new Date(t).getTime()},n.toRelative=function(t){return t},e}(te.VirtualTimeScheduler);var ur=te.AnonymousObservable=function(e){function n(e){return e===t?e=$e:"function"==typeof e&&(e=Qe(e)),e}function r(i){function o(t){var e=function(){try{r.setDisposable(n(i(r)))}catch(t){if(!r.fail(t))throw t}},r=new cr(t);return on.scheduleRequired()?on.schedule(e):e(),r}return this instanceof r?(e.call(this,o),t):new r(i)}return Ve(r,e),r}(Sn),cr=function(t){function e(e){t.call(this),this.observer=e,this.m=new Je}Ve(e,t);var n=e.prototype;return n.next=function(t){var e=!1;try{this.observer.onNext(t),e=!0}catch(n){throw n}finally{e||this.dispose()}},n.error=function(t){try{this.observer.onError(t)}catch(e){throw e}finally{this.dispose()}},n.completed=function(){try{this.observer.onCompleted()}catch(t){throw t}finally{this.dispose()}},n.setDisposable=function(t){this.m.setDisposable(t)},n.getDisposable=function(){return this.m.getDisposable()},n.disposable=function(t){return arguments.length?this.getDisposable():setDisposable(t)},n.dispose=function(){t.prototype.dispose.call(this),this.m.dispose()},e}(gn),ar=function(t){function e(t){return this.underlyingObservable.subscribe(t)}function n(n,r,i){t.call(this,e),this.key=n,this.underlyingObservable=i?new ur(function(t){return new Be(i.getDisposable(),r.subscribe(t))}):r}return Ve(n,t),n}(Sn),hr=te.Subject=function(t){function n(t){return e.call(this),this.isStopped?this.exception?(t.onError(this.exception),$e):(t.onCompleted(),$e):(this.observers.push(t),new Qn(this,t))}function r(){t.call(this,n),this.isDisposed=!1,this.isStopped=!1,this.observers=[]}return Ve(r,t),ze(r.prototype,mn,{hasObservers:function(){return this.observers.length>0},onCompleted:function(){if(e.call(this),!this.isStopped){var t=this.observers.slice(0);this.isStopped=!0;for(var n=0,r=t.length;r>n;n++)t[n].onCompleted();this.observers=[]}},onError:function(t){if(e.call(this),!this.isStopped){var n=this.observers.slice(0);this.isStopped=!0,this.exception=t;for(var r=0,i=n.length;i>r;r++)n[r].onError(t);this.observers=[]}},onNext:function(t){if(e.call(this),!this.isStopped)for(var n=this.observers.slice(0),r=0,i=n.length;i>r;r++)n[r].onNext(t)},dispose:function(){this.isDisposed=!0,this.observers=null}}),r.create=function(t,e){return new fr(t,e)},r}(Sn),lr=te.AsyncSubject=function(t){function n(t){if(e.call(this),!this.isStopped)return this.observers.push(t),new Qn(this,t);var n=this.exception,r=this.hasValue,i=this.value;return n?t.onError(n):r?(t.onNext(i),t.onCompleted()):t.onCompleted(),$e}function r(){t.call(this,n),this.isDisposed=!1,this.isStopped=!1,this.value=null,this.hasValue=!1,this.observers=[],this.exception=null}return Ve(r,t),ze(r.prototype,mn,{hasObservers:function(){return e.call(this),this.observers.length>0},onCompleted:function(){var t,n,r;if(e.call(this),!this.isStopped){this.isStopped=!0;var i=this.observers.slice(0),o=this.value,s=this.hasValue;if(s)for(n=0,r=i.length;r>n;n++)t=i[n],t.onNext(o),t.onCompleted();else for(n=0,r=i.length;r>n;n++)i[n].onCompleted();this.observers=[]}},onError:function(t){if(e.call(this),!this.isStopped){var n=this.observers.slice(0);this.isStopped=!0,this.exception=t;for(var r=0,i=n.length;i>r;r++)n[r].onError(t);this.observers=[]}},onNext:function(t){e.call(this),this.isStopped||(this.value=t,this.hasValue=!0)},dispose:function(){this.isDisposed=!0,this.observers=null,this.exception=null,this.value=null}}),r}(Sn),fr=function(t){function e(t){return this.observable.subscribe(t)}function n(n,r){t.call(this,e),this.observer=n,this.observable=r}return Ve(n,t),ze(n.prototype,mn,{onCompleted:function(){this.observer.onCompleted()},onError:function(t){this.observer.onError(t)},onNext:function(t){this.observer.onNext(t)}}),n}(Sn);"function"==typeof define&&"object"==typeof define.amd&&define.amd?(J.Rx=te,define(function(){return te})):X&&Z?G?(Z.exports=te).Rx=te:X.Rx=te:J.Rx=te}).call(this); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.async.compat.js b/ajax/libs/rxjs/2.2.28/rx.async.compat.js new file mode 100644 index 000000000..68b1dfee8 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.async.compat.js @@ -0,0 +1,397 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +;(function (factory) { + var objectTypes = { + 'boolean': false, + 'function': true, + 'object': true, + 'number': false, + 'string': false, + 'undefined': false + }; + + var root = (objectTypes[typeof window] && window) || this, + freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports, + freeModule = objectTypes[typeof module] && module && !module.nodeType && module, + moduleExports = freeModule && freeModule.exports === freeExports && freeExports, + freeGlobal = objectTypes[typeof global] && global; + + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) { + root = freeGlobal; + } + + // Because of build optimizers + if (typeof define === 'function' && define.amd) { + define(['rx.binding', 'exports'], function (Rx, exports) { + root.Rx = factory(root, exports, Rx); + return root.Rx; + }); + } else if (typeof module === 'object' && module && module.exports === freeExports) { + module.exports = factory(root, module.exports, require('./rx')); + } else { + root.Rx = factory(root, {}, root.Rx); + } +}.call(this, function (root, exp, Rx, undefined) { + + // Aliases + var Observable = Rx.Observable, + observableProto = Observable.prototype, + observableFromPromise = Observable.fromPromise, + observableThrow = Observable.throwException, + AnonymousObservable = Rx.AnonymousObservable, + AsyncSubject = Rx.AsyncSubject, + disposableCreate = Rx.Disposable.create, + CompositeDisposable= Rx.CompositeDisposable, + immediateScheduler = Rx.Scheduler.immediate, + timeoutScheduler = Rx.Scheduler.timeout, + slice = Array.prototype.slice; + + /** + * Invokes the specified function asynchronously on the specified scheduler, surfacing the result through an observable sequence. + * + * @example + * var res = Rx.Observable.start(function () { console.log('hello'); }); + * var res = Rx.Observable.start(function () { console.log('hello'); }, Rx.Scheduler.timeout); + * var res = Rx.Observable.start(function () { this.log('hello'); }, Rx.Scheduler.timeout, console); + * + * @param {Function} func Function to run asynchronously. + * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout. + * @param [context] The context for the func parameter to be executed. If not specified, defaults to undefined. + * @returns {Observable} An observable sequence exposing the function's result value, or an exception. + * + * Remarks + * * The function is called immediately, not during the subscription of the resulting sequence. + * * Multiple subscriptions to the resulting sequence can observe the function's result. + */ + Observable.start = function (func, scheduler, context) { + return observableToAsync(func, scheduler, context)(); + }; + + /** + * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler. + * + * @example + * var res = Rx.Observable.toAsync(function (x, y) { return x + y; })(4, 3); + * var res = Rx.Observable.toAsync(function (x, y) { return x + y; }, Rx.Scheduler.timeout)(4, 3); + * var res = Rx.Observable.toAsync(function (x) { this.log(x); }, Rx.Scheduler.timeout, console)('hello'); + * + * @param {Function} function Function to convert to an asynchronous function. + * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout. + * @param {Mixed} [context] The context for the func parameter to be executed. If not specified, defaults to undefined. + * @returns {Function} Asynchronous function. + */ + var observableToAsync = Observable.toAsync = function (func, scheduler, context) { + scheduler || (scheduler = timeoutScheduler); + return function () { + var args = arguments, + subject = new AsyncSubject(); + + scheduler.schedule(function () { + var result; + try { + result = func.apply(context, args); + } catch (e) { + subject.onError(e); + return; + } + subject.onNext(result); + subject.onCompleted(); + }); + return subject.asObservable(); + }; + }; + + /** + * Converts a callback function to an observable sequence. + * + * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence. + * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout. + * @param {Mixed} [context] The context for the func parameter to be executed. If not specified, defaults to undefined. + * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next. + * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array. + */ + Observable.fromCallback = function (func, scheduler, context, selector) { + scheduler || (scheduler = immediateScheduler); + return function () { + var args = slice.call(arguments, 0); + + return new AnonymousObservable(function (observer) { + return scheduler.schedule(function () { + function handler(e) { + var results = e; + + if (selector) { + try { + results = selector(arguments); + } catch (err) { + observer.onError(err); + return; + } + } else { + if (results.length === 1) { + results = results[0]; + } + } + + observer.onNext(results); + observer.onCompleted(); + } + + args.push(handler); + func.apply(context, args); + }); + }); + }; + }; + + /** + * Converts a Node.js callback style function to an observable sequence. This must be in function (err, ...) format. + * @param {Function} func The function to call + * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout. + * @param {Mixed} [context] The context for the func parameter to be executed. If not specified, defaults to undefined. + * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next. + * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array. + */ + Observable.fromNodeCallback = function (func, scheduler, context, selector) { + scheduler || (scheduler = immediateScheduler); + return function () { + var args = slice.call(arguments, 0); + + return new AnonymousObservable(function (observer) { + return scheduler.schedule(function () { + + function handler(err) { + if (err) { + observer.onError(err); + return; + } + + var results = slice.call(arguments, 1); + + if (selector) { + try { + results = selector(results); + } catch (e) { + observer.onError(e); + return; + } + } else { + if (results.length === 1) { + results = results[0]; + } + } + + observer.onNext(results); + observer.onCompleted(); + } + + args.push(handler); + func.apply(context, args); + }); + }); + }; + }; + + function fixEvent(event) { + var stopPropagation = function () { + this.cancelBubble = true; + }; + + var preventDefault = function () { + this.bubbledKeyCode = this.keyCode; + if (this.ctrlKey) { + try { + this.keyCode = 0; + } catch (e) { } + } + this.defaultPrevented = true; + this.returnValue = false; + this.modified = true; + }; + + event || (event = root.event); + if (!event.target) { + event.target = event.target || event.srcElement; + + if (event.type == 'mouseover') { + event.relatedTarget = event.fromElement; + } + if (event.type == 'mouseout') { + event.relatedTarget = event.toElement; + } + // Adding stopPropogation and preventDefault to IE + if (!event.stopPropagation){ + event.stopPropagation = stopPropagation; + event.preventDefault = preventDefault; + } + // Normalize key events + switch(event.type){ + case 'keypress': + var c = ('charCode' in event ? event.charCode : event.keyCode); + if (c == 10) { + c = 0; + event.keyCode = 13; + } else if (c == 13 || c == 27) { + c = 0; + } else if (c == 3) { + c = 99; + } + event.charCode = c; + event.keyChar = event.charCode ? String.fromCharCode(event.charCode) : ''; + break; + } + } + + return event; + } + + function createListener (element, name, handler) { + // Node.js specific + if (element.addListener) { + element.addListener(name, handler); + return disposableCreate(function () { + element.removeListener(name, handler); + }); + } + // Standards compliant + if (element.addEventListener) { + element.addEventListener(name, handler, false); + return disposableCreate(function () { + element.removeEventListener(name, handler, false); + }); + } + if (element.attachEvent) { + // IE Specific + var innerHandler = function (event) { + handler(fixEvent(event)); + }; + element.attachEvent('on' + name, innerHandler); + return disposableCreate(function () { + element.detachEvent('on' + name, innerHandler); + }); + } + // Level 1 DOM Events + element['on' + name] = handler; + return disposableCreate(function () { + element['on' + name] = null; + }); + } + + function createEventListener (el, eventName, handler) { + var disposables = new CompositeDisposable(); + + // Asume NodeList + if (typeof el.item === 'function' && typeof el.length === 'number') { + for (var i = 0, len = el.length; i < len; i++) { + disposables.add(createEventListener(el.item(i), eventName, handler)); + } + } else if (el) { + disposables.add(createListener(el, eventName, handler)); + } + + return disposables; + } + + // Check for Angular/jQuery/Zepto support + var jq = + !!root.angular && !!angular.element ? angular.element : + (!!root.jQuery ? root.jQuery : ( + !!root.Zepto ? root.Zepto : null)); + + // Check for ember + var ember = !!root.Ember && typeof root.Ember.addListener === 'function'; + + /** + * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList. + * + * @example + * var source = Rx.Observable.fromEvent(element, 'mouseup'); + * + * @param {Object} element The DOMElement or NodeList to attach a listener. + * @param {String} eventName The event name to attach the observable sequence. + * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next. + * @returns {Observable} An observable sequence of events from the specified element and the specified event. + */ + Observable.fromEvent = function (element, eventName, selector) { + if (ember) { + return fromEventPattern( + function (h) { Ember.addListener(element, eventName, h); }, + function (h) { Ember.removeListener(element, eventName, h); }, + selector); + } + if (jq) { + var $elem = jq(element); + return fromEventPattern( + function (h) { $elem.on(eventName, h); }, + function (h) { $elem.off(eventName, h); }, + selector); + } + return new AnonymousObservable(function (observer) { + return createEventListener( + element, + eventName, + function handler (e) { + var results = e; + + if (selector) { + try { + results = selector(arguments); + } catch (err) { + observer.onError(err); + return + } + } + + observer.onNext(results); + }); + }).publish().refCount(); + }; + + /** + * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair. + * @param {Function} addHandler The function to add a handler to the emitter. + * @param {Function} [removeHandler] The optional function to remove a handler from an emitter. + * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next. + * @returns {Observable} An observable sequence which wraps an event from an event emitter + */ + var fromEventPattern = Observable.fromEventPattern = function (addHandler, removeHandler, selector) { + return new AnonymousObservable(function (observer) { + function innerHandler (e) { + var result = e; + if (selector) { + try { + result = selector(arguments); + } catch (err) { + observer.onError(err); + return; + } + } + observer.onNext(result); + } + + var returnValue = addHandler(innerHandler); + return disposableCreate(function () { + if (removeHandler) { + removeHandler(innerHandler, returnValue); + } + }); + }).publish().refCount(); + }; + + /** + * Invokes the asynchronous function, surfacing the result through an observable sequence. + * @param {Function} functionAsync Asynchronous function which returns a Promise to run. + * @returns {Observable} An observable sequence exposing the function's result value, or an exception. + */ + Observable.startAsync = function (functionAsync) { + var promise; + try { + promise = functionAsync(); + } catch (e) { + return observableThrow(e); + } + return observableFromPromise(promise); + } + + return Rx; +})); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.async.compat.min.js b/ajax/libs/rxjs/2.2.28/rx.async.compat.min.js new file mode 100644 index 000000000..5353d1559 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.async.compat.min.js @@ -0,0 +1 @@ +(function(t){var e={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},n=e[typeof window]&&window||this,r=e[typeof exports]&&exports&&!exports.nodeType&&exports,i=e[typeof module]&&module&&!module.nodeType&&module,o=(i&&i.exports===r&&r,e[typeof global]&&global);!o||o.global!==o&&o.window!==o||(n=o),"function"==typeof define&&define.amd?define(["rx.binding","exports"],function(e,r){return n.Rx=t(n,r,e),n.Rx}):"object"==typeof module&&module&&module.exports===r?module.exports=t(n,module.exports,require("./rx")):n.Rx=t(n,{},n.Rx)}).call(this,function(t,e,n){function r(e){var n=function(){this.cancelBubble=!0},r=function(){if(this.bubbledKeyCode=this.keyCode,this.ctrlKey)try{this.keyCode=0}catch(t){}this.defaultPrevented=!0,this.returnValue=!1,this.modified=!0};if(e||(e=t.event),!e.target)switch(e.target=e.target||e.srcElement,"mouseover"==e.type&&(e.relatedTarget=e.fromElement),"mouseout"==e.type&&(e.relatedTarget=e.toElement),e.stopPropagation||(e.stopPropagation=n,e.preventDefault=r),e.type){case"keypress":var i="charCode"in e?e.charCode:e.keyCode;10==i?(i=0,e.keyCode=13):13==i||27==i?i=0:3==i&&(i=99),e.charCode=i,e.keyChar=e.charCode?String.fromCharCode(e.charCode):""}return e}function i(t,e,n){if(t.addListener)return t.addListener(e,n),l(function(){t.removeListener(e,n)});if(t.addEventListener)return t.addEventListener(e,n,!1),l(function(){t.removeEventListener(e,n,!1)});if(t.attachEvent){var i=function(t){n(r(t))};return t.attachEvent("on"+e,i),l(function(){t.detachEvent("on"+e,i)})}return t["on"+e]=n,l(function(){t["on"+e]=null})}function o(t,e,n){var r=new f;if("function"==typeof t.item&&"number"==typeof t.length)for(var s=0,u=t.length;u>s;s++)r.add(o(t.item(s),e,n));else t&&r.add(i(t,e,n));return r}var s=n.Observable,u=(s.prototype,s.fromPromise),c=s.throwException,a=n.AnonymousObservable,h=n.AsyncSubject,l=n.Disposable.create,f=n.CompositeDisposable,p=n.Scheduler.immediate,d=n.Scheduler.timeout,v=Array.prototype.slice;s.start=function(t,e,n){return b(t,e,n)()};var b=s.toAsync=function(t,e,n){return e||(e=d),function(){var r=arguments,i=new h;return e.schedule(function(){var e;try{e=t.apply(n,r)}catch(o){return i.onError(o),undefined}i.onNext(e),i.onCompleted()}),i.asObservable()}};s.fromCallback=function(t,e,n,r){return e||(e=p),function(){var i=v.call(arguments,0);return new a(function(o){return e.schedule(function(){function e(t){var e=t;if(r)try{e=r(arguments)}catch(n){return o.onError(n),undefined}else 1===e.length&&(e=e[0]);o.onNext(e),o.onCompleted()}i.push(e),t.apply(n,i)})})}},s.fromNodeCallback=function(t,e,n,r){return e||(e=p),function(){var i=v.call(arguments,0);return new a(function(o){return e.schedule(function(){function e(t){if(t)return o.onError(t),undefined;var e=v.call(arguments,1);if(r)try{e=r(e)}catch(n){return o.onError(n),undefined}else 1===e.length&&(e=e[0]);o.onNext(e),o.onCompleted()}i.push(e),t.apply(n,i)})})}};var m=t.angular&&angular.element?angular.element:t.jQuery?t.jQuery:t.Zepto?t.Zepto:null,y=!!t.Ember&&"function"==typeof t.Ember.addListener;s.fromEvent=function(t,e,n){if(y)return w(function(n){Ember.addListener(t,e,n)},function(n){Ember.removeListener(t,e,n)},n);if(m){var r=m(t);return w(function(t){r.on(e,t)},function(t){r.off(e,t)},n)}return new a(function(r){return o(t,e,function(t){var e=t;if(n)try{e=n(arguments)}catch(i){return r.onError(i),undefined}r.onNext(e)})}).publish().refCount()};var w=s.fromEventPattern=function(t,e,n){return new a(function(r){function i(t){var e=t;if(n)try{e=n(arguments)}catch(i){return r.onError(i),undefined}r.onNext(e)}var o=t(i);return l(function(){e&&e(i,o)})}).publish().refCount()};return s.startAsync=function(t){var e;try{e=t()}catch(n){return c(n)}return u(e)},n}); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.async.js b/ajax/libs/rxjs/2.2.28/rx.async.js new file mode 100644 index 000000000..800aeca84 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.async.js @@ -0,0 +1,329 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +;(function (factory) { + var objectTypes = { + 'boolean': false, + 'function': true, + 'object': true, + 'number': false, + 'string': false, + 'undefined': false + }; + + var root = (objectTypes[typeof window] && window) || this, + freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports, + freeModule = objectTypes[typeof module] && module && !module.nodeType && module, + moduleExports = freeModule && freeModule.exports === freeExports && freeExports, + freeGlobal = objectTypes[typeof global] && global; + + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) { + root = freeGlobal; + } + + // Because of build optimizers + if (typeof define === 'function' && define.amd) { + define(['rx.binding', 'exports'], function (Rx, exports) { + root.Rx = factory(root, exports, Rx); + return root.Rx; + }); + } else if (typeof module === 'object' && module && module.exports === freeExports) { + module.exports = factory(root, module.exports, require('./rx')); + } else { + root.Rx = factory(root, {}, root.Rx); + } +}.call(this, function (root, exp, Rx, undefined) { + + // Aliases + var Observable = Rx.Observable, + observableProto = Observable.prototype, + observableFromPromise = Observable.fromPromise, + observableThrow = Observable.throwException, + AnonymousObservable = Rx.AnonymousObservable, + AsyncSubject = Rx.AsyncSubject, + disposableCreate = Rx.Disposable.create, + CompositeDisposable= Rx.CompositeDisposable, + immediateScheduler = Rx.Scheduler.immediate, + timeoutScheduler = Rx.Scheduler.timeout, + slice = Array.prototype.slice; + + /** + * Invokes the specified function asynchronously on the specified scheduler, surfacing the result through an observable sequence. + * + * @example + * var res = Rx.Observable.start(function () { console.log('hello'); }); + * var res = Rx.Observable.start(function () { console.log('hello'); }, Rx.Scheduler.timeout); + * var res = Rx.Observable.start(function () { this.log('hello'); }, Rx.Scheduler.timeout, console); + * + * @param {Function} func Function to run asynchronously. + * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout. + * @param [context] The context for the func parameter to be executed. If not specified, defaults to undefined. + * @returns {Observable} An observable sequence exposing the function's result value, or an exception. + * + * Remarks + * * The function is called immediately, not during the subscription of the resulting sequence. + * * Multiple subscriptions to the resulting sequence can observe the function's result. + */ + Observable.start = function (func, scheduler, context) { + return observableToAsync(func, scheduler, context)(); + }; + + /** + * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler. + * + * @example + * var res = Rx.Observable.toAsync(function (x, y) { return x + y; })(4, 3); + * var res = Rx.Observable.toAsync(function (x, y) { return x + y; }, Rx.Scheduler.timeout)(4, 3); + * var res = Rx.Observable.toAsync(function (x) { this.log(x); }, Rx.Scheduler.timeout, console)('hello'); + * + * @param {Function} function Function to convert to an asynchronous function. + * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout. + * @param {Mixed} [context] The context for the func parameter to be executed. If not specified, defaults to undefined. + * @returns {Function} Asynchronous function. + */ + var observableToAsync = Observable.toAsync = function (func, scheduler, context) { + scheduler || (scheduler = timeoutScheduler); + return function () { + var args = arguments, + subject = new AsyncSubject(); + + scheduler.schedule(function () { + var result; + try { + result = func.apply(context, args); + } catch (e) { + subject.onError(e); + return; + } + subject.onNext(result); + subject.onCompleted(); + }); + return subject.asObservable(); + }; + }; + + /** + * Converts a callback function to an observable sequence. + * + * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence. + * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout. + * @param {Mixed} [context] The context for the func parameter to be executed. If not specified, defaults to undefined. + * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next. + * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array. + */ + Observable.fromCallback = function (func, scheduler, context, selector) { + scheduler || (scheduler = immediateScheduler); + return function () { + var args = slice.call(arguments, 0); + + return new AnonymousObservable(function (observer) { + return scheduler.schedule(function () { + function handler(e) { + var results = e; + + if (selector) { + try { + results = selector(arguments); + } catch (err) { + observer.onError(err); + return; + } + } else { + if (results.length === 1) { + results = results[0]; + } + } + + observer.onNext(results); + observer.onCompleted(); + } + + args.push(handler); + func.apply(context, args); + }); + }); + }; + }; + + /** + * Converts a Node.js callback style function to an observable sequence. This must be in function (err, ...) format. + * @param {Function} func The function to call + * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout. + * @param {Mixed} [context] The context for the func parameter to be executed. If not specified, defaults to undefined. + * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next. + * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array. + */ + Observable.fromNodeCallback = function (func, scheduler, context, selector) { + scheduler || (scheduler = immediateScheduler); + return function () { + var args = slice.call(arguments, 0); + + return new AnonymousObservable(function (observer) { + return scheduler.schedule(function () { + + function handler(err) { + if (err) { + observer.onError(err); + return; + } + + var results = slice.call(arguments, 1); + + if (selector) { + try { + results = selector(results); + } catch (e) { + observer.onError(e); + return; + } + } else { + if (results.length === 1) { + results = results[0]; + } + } + + observer.onNext(results); + observer.onCompleted(); + } + + args.push(handler); + func.apply(context, args); + }); + }); + }; + }; + + function createListener (element, name, handler) { + // Node.js specific + if (element.addListener) { + element.addListener(name, handler); + return disposableCreate(function () { + element.removeListener(name, handler); + }); + } + if (element.addEventListener) { + element.addEventListener(name, handler, false); + return disposableCreate(function () { + element.removeEventListener(name, handler, false); + }); + } + throw new Error('No listener found'); + } + + function createEventListener (el, eventName, handler) { + var disposables = new CompositeDisposable(); + + // Asume NodeList + if (typeof el.item === 'function' && typeof el.length === 'number') { + for (var i = 0, len = el.length; i < len; i++) { + disposables.add(createEventListener(el.item(i), eventName, handler)); + } + } else if (el) { + disposables.add(createListener(el, eventName, handler)); + } + + return disposables; + } + + // Check for Angular/jQuery/Zepto support + var jq = + !!root.angular && !!angular.element ? angular.element : + (!!root.jQuery ? root.jQuery : ( + !!root.Zepto ? root.Zepto : null)); + + // Check for ember + var ember = !!root.Ember && typeof root.Ember.addListener === 'function'; + + /** + * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList. + * + * @example + * var source = Rx.Observable.fromEvent(element, 'mouseup'); + * + * @param {Object} element The DOMElement or NodeList to attach a listener. + * @param {String} eventName The event name to attach the observable sequence. + * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next. + * @returns {Observable} An observable sequence of events from the specified element and the specified event. + */ + Observable.fromEvent = function (element, eventName, selector) { + if (ember) { + return fromEventPattern( + function (h) { Ember.addListener(element, eventName, h); }, + function (h) { Ember.removeListener(element, eventName, h); }, + selector); + } + if (jq) { + var $elem = jq(element); + return fromEventPattern( + function (h) { $elem.on(eventName, h); }, + function (h) { $elem.off(eventName, h); }, + selector); + } + return new AnonymousObservable(function (observer) { + return createEventListener( + element, + eventName, + function handler (e) { + var results = e; + + if (selector) { + try { + results = selector(arguments); + } catch (err) { + observer.onError(err); + return + } + } + + observer.onNext(results); + }); + }).publish().refCount(); + }; + + /** + * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair. + * @param {Function} addHandler The function to add a handler to the emitter. + * @param {Function} [removeHandler] The optional function to remove a handler from an emitter. + * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next. + * @returns {Observable} An observable sequence which wraps an event from an event emitter + */ + var fromEventPattern = Observable.fromEventPattern = function (addHandler, removeHandler, selector) { + return new AnonymousObservable(function (observer) { + function innerHandler (e) { + var result = e; + if (selector) { + try { + result = selector(arguments); + } catch (err) { + observer.onError(err); + return; + } + } + observer.onNext(result); + } + + var returnValue = addHandler(innerHandler); + return disposableCreate(function () { + if (removeHandler) { + removeHandler(innerHandler, returnValue); + } + }); + }).publish().refCount(); + }; + + /** + * Invokes the asynchronous function, surfacing the result through an observable sequence. + * @param {Function} functionAsync Asynchronous function which returns a Promise to run. + * @returns {Observable} An observable sequence exposing the function's result value, or an exception. + */ + Observable.startAsync = function (functionAsync) { + var promise; + try { + promise = functionAsync(); + } catch (e) { + return observableThrow(e); + } + return observableFromPromise(promise); + } + + return Rx; +})); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.async.min.js b/ajax/libs/rxjs/2.2.28/rx.async.min.js new file mode 100644 index 000000000..1349359b0 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.async.min.js @@ -0,0 +1 @@ +(function(t){var e={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},n=e[typeof window]&&window||this,r=e[typeof exports]&&exports&&!exports.nodeType&&exports,i=e[typeof module]&&module&&!module.nodeType&&module,o=(i&&i.exports===r&&r,e[typeof global]&&global);!o||o.global!==o&&o.window!==o||(n=o),"function"==typeof define&&define.amd?define(["rx.binding","exports"],function(e,r){return n.Rx=t(n,r,e),n.Rx}):"object"==typeof module&&module&&module.exports===r?module.exports=t(n,module.exports,require("./rx")):n.Rx=t(n,{},n.Rx)}).call(this,function(t,e,n){function r(t,e,n){if(t.addListener)return t.addListener(e,n),h(function(){t.removeListener(e,n)});if(t.addEventListener)return t.addEventListener(e,n,!1),h(function(){t.removeEventListener(e,n,!1)});throw Error("No listener found")}function i(t,e,n){var o=new l;if("function"==typeof t.item&&"number"==typeof t.length)for(var s=0,u=t.length;u>s;s++)o.add(i(t.item(s),e,n));else t&&o.add(r(t,e,n));return o}var o=n.Observable,s=(o.prototype,o.fromPromise),u=o.throwException,c=n.AnonymousObservable,a=n.AsyncSubject,h=n.Disposable.create,l=n.CompositeDisposable,f=n.Scheduler.immediate,p=n.Scheduler.timeout,d=Array.prototype.slice;o.start=function(t,e,n){return v(t,e,n)()};var v=o.toAsync=function(t,e,n){return e||(e=p),function(){var r=arguments,i=new a;return e.schedule(function(){var e;try{e=t.apply(n,r)}catch(o){return i.onError(o),undefined}i.onNext(e),i.onCompleted()}),i.asObservable()}};o.fromCallback=function(t,e,n,r){return e||(e=f),function(){var i=d.call(arguments,0);return new c(function(o){return e.schedule(function(){function e(t){var e=t;if(r)try{e=r(arguments)}catch(n){return o.onError(n),undefined}else 1===e.length&&(e=e[0]);o.onNext(e),o.onCompleted()}i.push(e),t.apply(n,i)})})}},o.fromNodeCallback=function(t,e,n,r){return e||(e=f),function(){var i=d.call(arguments,0);return new c(function(o){return e.schedule(function(){function e(t){if(t)return o.onError(t),undefined;var e=d.call(arguments,1);if(r)try{e=r(e)}catch(n){return o.onError(n),undefined}else 1===e.length&&(e=e[0]);o.onNext(e),o.onCompleted()}i.push(e),t.apply(n,i)})})}};var b=t.angular&&angular.element?angular.element:t.jQuery?t.jQuery:t.Zepto?t.Zepto:null,m=!!t.Ember&&"function"==typeof t.Ember.addListener;o.fromEvent=function(t,e,n){if(m)return y(function(n){Ember.addListener(t,e,n)},function(n){Ember.removeListener(t,e,n)},n);if(b){var r=b(t);return y(function(t){r.on(e,t)},function(t){r.off(e,t)},n)}return new c(function(r){return i(t,e,function(t){var e=t;if(n)try{e=n(arguments)}catch(i){return r.onError(i),undefined}r.onNext(e)})}).publish().refCount()};var y=o.fromEventPattern=function(t,e,n){return new c(function(r){function i(t){var e=t;if(n)try{e=n(arguments)}catch(i){return r.onError(i),undefined}r.onNext(e)}var o=t(i);return h(function(){e&&e(i,o)})}).publish().refCount()};return o.startAsync=function(t){var e;try{e=t()}catch(n){return u(n)}return s(e)},n}); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.backpressure.js b/ajax/libs/rxjs/2.2.28/rx.backpressure.js new file mode 100644 index 000000000..9aec8e1b1 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.backpressure.js @@ -0,0 +1,410 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +;(function (factory) { + var objectTypes = { + 'boolean': false, + 'function': true, + 'object': true, + 'number': false, + 'string': false, + 'undefined': false + }; + + var root = (objectTypes[typeof window] && window) || this, + freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports, + freeModule = objectTypes[typeof module] && module && !module.nodeType && module, + moduleExports = freeModule && freeModule.exports === freeExports && freeExports, + freeGlobal = objectTypes[typeof global] && global; + + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) { + root = freeGlobal; + } + + // Because of build optimizers + if (typeof define === 'function' && define.amd) { + define(['rx', 'exports'], function (Rx, exports) { + root.Rx = factory(root, exports, Rx); + return root.Rx; + }); + } else if (typeof module === 'object' && module && module.exports === freeExports) { + module.exports = factory(root, module.exports, require('./rx')); + } else { + root.Rx = factory(root, {}, root.Rx); + } +}.call(this, function (root, exp, Rx, undefined) { + + // References + var Observable = Rx.Observable, + observableProto = Observable.prototype, + AnonymousObservable = Rx.AnonymousObservable, + CompositeDisposable = Rx.CompositeDisposable, + Subject = Rx.Subject, + Observer = Rx.Observer, + disposableEmpty = Rx.Disposable.empty, + disposableCreate = Rx.Disposable.create, + inherits = Rx.internals.inherits, + addProperties = Rx.internals.addProperties, + timeoutScheduler = Rx.Scheduler.timeout, + identity = Rx.helpers.identity; + + var objectDisposed = 'Object has been disposed'; + function checkDisposed() { if (this.isDisposed) { throw new Error(objectDisposed); } } + + var PausableObservable = (function (_super) { + + inherits(PausableObservable, _super); + + function subscribe(observer) { + var conn = this.source.publish(), + subscription = conn.subscribe(observer), + connection = disposableEmpty; + + var pausable = this.subject.distinctUntilChanged().subscribe(function (b) { + if (b) { + connection = conn.connect(); + } else { + connection.dispose(); + connection = disposableEmpty; + } + }); + + return new CompositeDisposable(subscription, connection, pausable); + } + + function PausableObservable(source, subject) { + this.source = source; + this.subject = subject || new Subject(); + this.isPaused = true; + _super.call(this, subscribe); + } + + PausableObservable.prototype.pause = function () { + if (this.isPaused === true){ + return; + } + this.isPaused = true; + this.subject.onNext(false); + }; + + PausableObservable.prototype.resume = function () { + if (this.isPaused === false){ + return; + } + this.isPaused = false; + this.subject.onNext(true); + }; + + return PausableObservable; + + }(Observable)); + + /** + * Pauses the underlying observable sequence based upon the observable sequence which yields true/false. + * @example + * var pauser = new Rx.Subject(); + * var source = Rx.Observable.interval(100).pausable(pauser); + * @param {Observable} pauser The observable sequence used to pause the underlying sequence. + * @returns {Observable} The observable sequence which is paused based upon the pauser. + */ + observableProto.pausable = function (pauser) { + return new PausableObservable(this, pauser); + }; + function combineLatestSource(source, subject, resultSelector) { + return new AnonymousObservable(function (observer) { + var n = 2, + hasValue = [false, false], + hasValueAll = false, + isDone = false, + values = new Array(n); + + function next(x, i) { + values[i] = x + var res; + hasValue[i] = true; + if (hasValueAll || (hasValueAll = hasValue.every(identity))) { + try { + res = resultSelector.apply(null, values); + } catch (ex) { + observer.onError(ex); + return; + } + observer.onNext(res); + } else if (isDone) { + observer.onCompleted(); + } + } + + return new CompositeDisposable( + source.subscribe( + function (x) { + next(x, 0); + }, + observer.onError.bind(observer), + function () { + isDone = true; + observer.onCompleted(); + }), + subject.subscribe( + function (x) { + next(x, 1); + }, + observer.onError.bind(observer)) + ); + }); + } + + var PausableBufferedObservable = (function (_super) { + + inherits(PausableBufferedObservable, _super); + + function subscribe(observer) { + var q = [], previous = true; + + var subscription = + combineLatestSource( + this.source, + this.subject.distinctUntilChanged(), + function (data, shouldFire) { + return { data: data, shouldFire: shouldFire }; + }) + .subscribe( + function (results) { + if (results.shouldFire && previous) { + observer.onNext(results.data); + } + if (results.shouldFire && !previous) { + while (q.length > 0) { + observer.onNext(q.shift()); + } + previous = true; + } else if (!results.shouldFire && !previous) { + q.push(results.data); + } else if (!results.shouldFire && previous) { + previous = false; + } + + }, + function (err) { + // Empty buffer before sending error + while (q.length > 0) { + observer.onNext(q.shift()); + } + observer.onError(err); + }, + function () { + // Empty buffer before sending completion + while (q.length > 0) { + observer.onNext(q.shift()); + } + observer.onCompleted(); + } + ); + + this.subject.onNext(false); + + return subscription; + } + + function PausableBufferedObservable(source, subject) { + this.source = source; + this.subject = subject || new Subject(); + this.isPaused = true; + _super.call(this, subscribe); + } + + PausableBufferedObservable.prototype.pause = function () { + if (this.isPaused === true){ + return; + } + this.isPaused = true; + this.subject.onNext(false); + }; + + PausableBufferedObservable.prototype.resume = function () { + if (this.isPaused === false){ + return; + } + this.isPaused = false; + this.subject.onNext(true); + }; + + return PausableBufferedObservable; + + }(Observable)); + + /** + * Pauses the underlying observable sequence based upon the observable sequence which yields true/false, + * and yields the values that were buffered while paused. + * @example + * var pauser = new Rx.Subject(); + * var source = Rx.Observable.interval(100).pausableBuffered(pauser); + * @param {Observable} pauser The observable sequence used to pause the underlying sequence. + * @returns {Observable} The observable sequence which is paused based upon the pauser. + */ + observableProto.pausableBuffered = function (subject) { + return new PausableBufferedObservable(this, subject); + }; + + /** + * Attaches a controller to the observable sequence with the ability to queue. + * @example + * var source = Rx.Observable.interval(100).controlled(); + * source.request(3); // Reads 3 values + * @param {Observable} pauser The observable sequence used to pause the underlying sequence. + * @returns {Observable} The observable sequence which is paused based upon the pauser. + */ + observableProto.controlled = function (enableQueue) { + if (enableQueue == null) { enableQueue = true; } + return new ControlledObservable(this, enableQueue); + }; + var ControlledObservable = (function (_super) { + + inherits(ControlledObservable, _super); + + function subscribe (observer) { + return this.source.subscribe(observer); + } + + function ControlledObservable (source, enableQueue) { + _super.call(this, subscribe); + this.subject = new ControlledSubject(enableQueue); + this.source = source.multicast(this.subject).refCount(); + } + + ControlledObservable.prototype.request = function (numberOfItems) { + if (numberOfItems == null) { numberOfItems = -1; } + return this.subject.request(numberOfItems); + }; + + return ControlledObservable; + + }(Observable)); + + var ControlledSubject = Rx.ControlledSubject = (function (_super) { + + function subscribe (observer) { + return this.subject.subscribe(observer); + } + + inherits(ControlledSubject, _super); + + function ControlledSubject(enableQueue) { + if (enableQueue == null) { + enableQueue = true; + } + + _super.call(this, subscribe); + this.subject = new Subject(); + this.enableQueue = enableQueue; + this.queue = enableQueue ? [] : null; + this.requestedCount = 0; + this.requestedDisposable = disposableEmpty; + this.error = null; + this.hasFailed = false; + this.hasCompleted = false; + this.controlledDisposable = disposableEmpty; + } + + addProperties(ControlledSubject.prototype, Observer, { + onCompleted: function () { + checkDisposed.call(this); + this.hasCompleted = true; + + if (!this.enableQueue || this.queue.length === 0) { + this.subject.onCompleted(); + } + }, + onError: function (error) { + checkDisposed.call(this); + this.hasFailed = true; + this.error = error; + + if (!this.enableQueue || this.queue.length === 0) { + this.subject.onError(error); + } + }, + onNext: function (value) { + checkDisposed.call(this); + var hasRequested = false; + + if (this.requestedCount === 0) { + if (this.enableQueue) { + this.queue.push(value); + } + } else { + if (this.requestedCount !== -1) { + if (this.requestedCount-- === 0) { + this.disposeCurrentRequest(); + } + } + hasRequested = true; + } + + if (hasRequested) { + this.subject.onNext(value); + } + }, + _processRequest: function (numberOfItems) { + if (this.enableQueue) { + //console.log('queue length', this.queue.length); + + while (this.queue.length >= numberOfItems && numberOfItems > 0) { + //console.log('number of items', numberOfItems); + this.subject.onNext(this.queue.shift()); + numberOfItems--; + } + + if (this.queue.length !== 0) { + return { numberOfItems: numberOfItems, returnValue: true }; + } else { + return { numberOfItems: numberOfItems, returnValue: false }; + } + } + + if (this.hasFailed) { + this.subject.onError(this.error); + this.controlledDisposable.dispose(); + this.controlledDisposable = disposableEmpty; + } else if (this.hasCompleted) { + this.subject.onCompleted(); + this.controlledDisposable.dispose(); + this.controlledDisposable = disposableEmpty; + } + + return { numberOfItems: numberOfItems, returnValue: false }; + }, + request: function (number) { + checkDisposed.call(this); + this.disposeCurrentRequest(); + var self = this, + r = this._processRequest(number); + + number = r.numberOfItems; + if (!r.returnValue) { + this.requestedCount = number; + this.requestedDisposable = disposableCreate(function () { + self.requestedCount = 0; + }); + + return this.requestedDisposable + } else { + return disposableEmpty; + } + }, + disposeCurrentRequest: function () { + this.requestedDisposable.dispose(); + this.requestedDisposable = disposableEmpty; + }, + + dispose: function () { + this.isDisposed = true; + this.error = null; + this.subject.dispose(); + this.requestedDisposable.dispose(); + } + }); + + return ControlledSubject; + }(Observable)); + return Rx; +})); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.backpressure.min.js b/ajax/libs/rxjs/2.2.28/rx.backpressure.min.js new file mode 100644 index 000000000..6d908ea0c --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.backpressure.min.js @@ -0,0 +1 @@ +(function(t){var e={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},n=e[typeof window]&&window||this,r=e[typeof exports]&&exports&&!exports.nodeType&&exports,i=e[typeof module]&&module&&!module.nodeType&&module,o=(i&&i.exports===r&&r,e[typeof global]&&global);!o||o.global!==o&&o.window!==o||(n=o),"function"==typeof define&&define.amd?define(["rx","exports"],function(e,r){return n.Rx=t(n,r,e),n.Rx}):"object"==typeof module&&module&&module.exports===r?module.exports=t(n,module.exports,require("./rx")):n.Rx=t(n,{},n.Rx)}).call(this,function(t,e,n){function r(){if(this.isDisposed)throw Error(b)}function i(t,e,n){return new u(function(r){function i(t,e){h[e]=t;var i;if(s[e]=!0,u||(u=s.every(v))){try{i=n.apply(null,h)}catch(o){return r.onError(o),undefined}r.onNext(i)}else a&&r.onCompleted()}var o=2,s=[!1,!1],u=!1,a=!1,h=Array(o);return new c(t.subscribe(function(t){i(t,0)},r.onError.bind(r),function(){a=!0,r.onCompleted()}),e.subscribe(function(t){i(t,1)},r.onError.bind(r)))})}var o=n.Observable,s=o.prototype,u=n.AnonymousObservable,c=n.CompositeDisposable,a=n.Subject,h=n.Observer,l=n.Disposable.empty,f=n.Disposable.create,p=n.internals.inherits,d=n.internals.addProperties,v=(n.Scheduler.timeout,n.helpers.identity),b="Object has been disposed",m=function(t){function e(t){var e=this.source.publish(),n=e.subscribe(t),r=l,i=this.subject.distinctUntilChanged().subscribe(function(t){t?r=e.connect():(r.dispose(),r=l)});return new c(n,r,i)}function n(n,r){this.source=n,this.subject=r||new a,this.isPaused=!0,t.call(this,e)}return p(n,t),n.prototype.pause=function(){this.isPaused!==!0&&(this.isPaused=!0,this.subject.onNext(!1))},n.prototype.resume=function(){this.isPaused!==!1&&(this.isPaused=!1,this.subject.onNext(!0))},n}(o);s.pausable=function(t){return new m(this,t)};var y=function(t){function e(t){var e=[],n=!0,r=i(this.source,this.subject.distinctUntilChanged(),function(t,e){return{data:t,shouldFire:e}}).subscribe(function(r){if(r.shouldFire&&n&&t.onNext(r.data),r.shouldFire&&!n){for(;e.length>0;)t.onNext(e.shift());n=!0}else r.shouldFire||n?!r.shouldFire&&n&&(n=!1):e.push(r.data)},function(n){for(;e.length>0;)t.onNext(e.shift());t.onError(n)},function(){for(;e.length>0;)t.onNext(e.shift());t.onCompleted()});return this.subject.onNext(!1),r}function n(n,r){this.source=n,this.subject=r||new a,this.isPaused=!0,t.call(this,e)}return p(n,t),n.prototype.pause=function(){this.isPaused!==!0&&(this.isPaused=!0,this.subject.onNext(!1))},n.prototype.resume=function(){this.isPaused!==!1&&(this.isPaused=!1,this.subject.onNext(!0))},n}(o);s.pausableBuffered=function(t){return new y(this,t)},s.controlled=function(t){return null==t&&(t=!0),new w(this,t)};var w=function(t){function e(t){return this.source.subscribe(t)}function n(n,r){t.call(this,e),this.subject=new g(r),this.source=n.multicast(this.subject).refCount()}return p(n,t),n.prototype.request=function(t){return null==t&&(t=-1),this.subject.request(t)},n}(o),g=n.ControlledSubject=function(t){function e(t){return this.subject.subscribe(t)}function n(n){null==n&&(n=!0),t.call(this,e),this.subject=new a,this.enableQueue=n,this.queue=n?[]:null,this.requestedCount=0,this.requestedDisposable=l,this.error=null,this.hasFailed=!1,this.hasCompleted=!1,this.controlledDisposable=l}return p(n,t),d(n.prototype,h,{onCompleted:function(){r.call(this),this.hasCompleted=!0,this.enableQueue&&0!==this.queue.length||this.subject.onCompleted()},onError:function(t){r.call(this),this.hasFailed=!0,this.error=t,this.enableQueue&&0!==this.queue.length||this.subject.onError(t)},onNext:function(t){r.call(this);var e=!1;0===this.requestedCount?this.enableQueue&&this.queue.push(t):(-1!==this.requestedCount&&0===this.requestedCount--&&this.disposeCurrentRequest(),e=!0),e&&this.subject.onNext(t)},_processRequest:function(t){if(this.enableQueue){for(;this.queue.length>=t&&t>0;)this.subject.onNext(this.queue.shift()),t--;return 0!==this.queue.length?{numberOfItems:t,returnValue:!0}:{numberOfItems:t,returnValue:!1}}return this.hasFailed?(this.subject.onError(this.error),this.controlledDisposable.dispose(),this.controlledDisposable=l):this.hasCompleted&&(this.subject.onCompleted(),this.controlledDisposable.dispose(),this.controlledDisposable=l),{numberOfItems:t,returnValue:!1}},request:function(t){r.call(this),this.disposeCurrentRequest();var e=this,n=this._processRequest(t);return t=n.numberOfItems,n.returnValue?l:(this.requestedCount=t,this.requestedDisposable=f(function(){e.requestedCount=0}),this.requestedDisposable)},disposeCurrentRequest:function(){this.requestedDisposable.dispose(),this.requestedDisposable=l},dispose:function(){this.isDisposed=!0,this.error=null,this.subject.dispose(),this.requestedDisposable.dispose()}}),n}(o);return n}); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.binding.js b/ajax/libs/rxjs/2.2.28/rx.binding.js new file mode 100644 index 000000000..1d3f1adf6 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.binding.js @@ -0,0 +1,561 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +;(function (factory) { + var objectTypes = { + 'boolean': false, + 'function': true, + 'object': true, + 'number': false, + 'string': false, + 'undefined': false + }; + + var root = (objectTypes[typeof window] && window) || this, + freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports, + freeModule = objectTypes[typeof module] && module && !module.nodeType && module, + moduleExports = freeModule && freeModule.exports === freeExports && freeExports, + freeGlobal = objectTypes[typeof global] && global; + + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) { + root = freeGlobal; + } + + // Because of build optimizers + if (typeof define === 'function' && define.amd) { + define(['rx', 'exports'], function (Rx, exports) { + root.Rx = factory(root, exports, Rx); + return root.Rx; + }); + } else if (typeof module === 'object' && module && module.exports === freeExports) { + module.exports = factory(root, module.exports, require('./rx')); + } else { + root.Rx = factory(root, {}, root.Rx); + } +}.call(this, function (root, exp, Rx, undefined) { + + var Observable = Rx.Observable, + observableProto = Observable.prototype, + AnonymousObservable = Rx.AnonymousObservable, + Subject = Rx.Subject, + AsyncSubject = Rx.AsyncSubject, + Observer = Rx.Observer, + ScheduledObserver = Rx.internals.ScheduledObserver, + disposableCreate = Rx.Disposable.create, + disposableEmpty = Rx.Disposable.empty, + CompositeDisposable = Rx.CompositeDisposable, + currentThreadScheduler = Rx.Scheduler.currentThread, + inherits = Rx.internals.inherits, + addProperties = Rx.internals.addProperties; + + // Utilities + var objectDisposed = 'Object has been disposed'; + function checkDisposed() { + if (this.isDisposed) { + throw new Error(objectDisposed); + } + } + + /** + * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each + * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's + * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay. + * + * @example + * 1 - res = source.multicast(observable); + * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; }); + * + * @param {Function|Subject} subjectOrSubjectSelector + * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function. + * Or: + * Subject to push source elements into. + * + * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if 0; + }, + /** + * Notifies all subscribed observers about the end of the sequence. + */ + onCompleted: function () { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + for (var i = 0, len = os.length; i < len; i++) { + os[i].onCompleted(); + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the exception. + * @param {Mixed} error The exception to send to all observers. + */ + onError: function (error) { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + this.exception = error; + + for (var i = 0, len = os.length; i < len; i++) { + os[i].onError(error); + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the arrival of the specified element in the sequence. + * @param {Mixed} value The value to send to all observers. + */ + onNext: function (value) { + checkDisposed.call(this); + if (!this.isStopped) { + this.value = value; + var os = this.observers.slice(0); + for (var i = 0, len = os.length; i < len; i++) { + os[i].onNext(value); + } + } + }, + /** + * Unsubscribe all observers and release resources. + */ + dispose: function () { + this.isDisposed = true; + this.observers = null; + this.value = null; + this.exception = null; + } + }); + + return BehaviorSubject; + }(Observable)); + + /** + * Represents an object that is both an observable sequence as well as an observer. + * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies. + */ + var ReplaySubject = Rx.ReplaySubject = (function (_super) { + + function RemovableDisposable (subject, observer) { + this.subject = subject; + this.observer = observer; + }; + + RemovableDisposable.prototype.dispose = function () { + this.observer.dispose(); + if (!this.subject.isDisposed) { + var idx = this.subject.observers.indexOf(this.observer); + this.subject.observers.splice(idx, 1); + } + }; + + function subscribe(observer) { + var so = new ScheduledObserver(this.scheduler, observer), + subscription = new RemovableDisposable(this, so); + checkDisposed.call(this); + this._trim(this.scheduler.now()); + this.observers.push(so); + + var n = this.q.length; + + for (var i = 0, len = this.q.length; i < len; i++) { + so.onNext(this.q[i].value); + } + + if (this.hasError) { + n++; + so.onError(this.error); + } else if (this.isStopped) { + n++; + so.onCompleted(); + } + + so.ensureActive(n); + return subscription; + } + + inherits(ReplaySubject, _super); + + /** + * Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler. + * @param {Number} [bufferSize] Maximum element count of the replay buffer. + * @param {Number} [windowSize] Maximum time length of the replay buffer. + * @param {Scheduler} [scheduler] Scheduler the observers are invoked on. + */ + function ReplaySubject(bufferSize, windowSize, scheduler) { + this.bufferSize = bufferSize == null ? Number.MAX_VALUE : bufferSize; + this.windowSize = windowSize == null ? Number.MAX_VALUE : windowSize; + this.scheduler = scheduler || currentThreadScheduler; + this.q = []; + this.observers = []; + this.isStopped = false; + this.isDisposed = false; + this.hasError = false; + this.error = null; + _super.call(this, subscribe); + } + + addProperties(ReplaySubject.prototype, Observer, { + /** + * Indicates whether the subject has observers subscribed to it. + * @returns {Boolean} Indicates whether the subject has observers subscribed to it. + */ + hasObservers: function () { + return this.observers.length > 0; + }, + /* @private */ + _trim: function (now) { + while (this.q.length > this.bufferSize) { + this.q.shift(); + } + while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) { + this.q.shift(); + } + }, + /** + * Notifies all subscribed observers about the arrival of the specified element in the sequence. + * @param {Mixed} value The value to send to all observers. + */ + onNext: function (value) { + var observer; + checkDisposed.call(this); + if (!this.isStopped) { + var now = this.scheduler.now(); + this.q.push({ interval: now, value: value }); + this._trim(now); + + var o = this.observers.slice(0); + for (var i = 0, len = o.length; i < len; i++) { + observer = o[i]; + observer.onNext(value); + observer.ensureActive(); + } + } + }, + /** + * Notifies all subscribed observers about the exception. + * @param {Mixed} error The exception to send to all observers. + */ + onError: function (error) { + var observer; + checkDisposed.call(this); + if (!this.isStopped) { + this.isStopped = true; + this.error = error; + this.hasError = true; + var now = this.scheduler.now(); + this._trim(now); + var o = this.observers.slice(0); + for (var i = 0, len = o.length; i < len; i++) { + observer = o[i]; + observer.onError(error); + observer.ensureActive(); + } + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the end of the sequence. + */ + onCompleted: function () { + var observer; + checkDisposed.call(this); + if (!this.isStopped) { + this.isStopped = true; + var now = this.scheduler.now(); + this._trim(now); + var o = this.observers.slice(0); + for (var i = 0, len = o.length; i < len; i++) { + observer = o[i]; + observer.onCompleted(); + observer.ensureActive(); + } + this.observers = []; + } + }, + /** + * Unsubscribe all observers and release resources. + */ + dispose: function () { + this.isDisposed = true; + this.observers = null; + } + }); + + return ReplaySubject; + }(Observable)); + + /** @private */ + var ConnectableObservable = Rx.ConnectableObservable = (function (_super) { + inherits(ConnectableObservable, _super); + + /** + * @constructor + * @private + */ + function ConnectableObservable(source, subject) { + var state = { + subject: subject, + source: source.asObservable(), + hasSubscription: false, + subscription: null + }; + + this.connect = function () { + if (!state.hasSubscription) { + state.hasSubscription = true; + state.subscription = new CompositeDisposable(state.source.subscribe(state.subject), disposableCreate(function () { + state.hasSubscription = false; + })); + } + return state.subscription; + }; + + function subscribe(observer) { + return state.subject.subscribe(observer); + } + + _super.call(this, subscribe); + } + + /** + * @private + * @memberOf ConnectableObservable + */ + ConnectableObservable.prototype.connect = function () { return this.connect(); }; + + /** + * @private + * @memberOf ConnectableObservable + */ + ConnectableObservable.prototype.refCount = function () { + var connectableSubscription = null, count = 0, source = this; + return new AnonymousObservable(function (observer) { + var shouldConnect, subscription; + count++; + shouldConnect = count === 1; + subscription = source.subscribe(observer); + if (shouldConnect) { + connectableSubscription = source.connect(); + } + return disposableCreate(function () { + subscription.dispose(); + count--; + if (count === 0) { + connectableSubscription.dispose(); + } + }); + }); + }; + + return ConnectableObservable; + }(Observable)); + + return Rx; +})); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.binding.min.js b/ajax/libs/rxjs/2.2.28/rx.binding.min.js new file mode 100644 index 000000000..5e98bb463 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.binding.min.js @@ -0,0 +1 @@ +(function(t){var e={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},n=e[typeof window]&&window||this,r=e[typeof exports]&&exports&&!exports.nodeType&&exports,i=e[typeof module]&&module&&!module.nodeType&&module,o=(i&&i.exports===r&&r,e[typeof global]&&global);!o||o.global!==o&&o.window!==o||(n=o),"function"==typeof define&&define.amd?define(["rx","exports"],function(e,r){return n.Rx=t(n,r,e),n.Rx}):"object"==typeof module&&module&&module.exports===r?module.exports=t(n,module.exports,require("./rx")):n.Rx=t(n,{},n.Rx)}).call(this,function(t,e,n){function r(){if(this.isDisposed)throw Error(m)}var i=n.Observable,o=i.prototype,s=n.AnonymousObservable,u=n.Subject,c=n.AsyncSubject,a=n.Observer,h=n.internals.ScheduledObserver,l=n.Disposable.create,f=n.Disposable.empty,p=n.CompositeDisposable,d=n.Scheduler.currentThread,b=n.internals.inherits,v=n.internals.addProperties,m="Object has been disposed";o.multicast=function(t,e){var n=this;return"function"==typeof t?new s(function(r){var i=n.multicast(t());return new p(e(i).subscribe(r),i.connect())}):new E(n,t)},o.publish=function(t){return t?this.multicast(function(){return new u},t):this.multicast(new u)},o.share=function(){return this.publish(null).refCount()},o.publishLast=function(t){return t?this.multicast(function(){return new c},t):this.multicast(new c)},o.publishValue=function(t,e){return 2===arguments.length?this.multicast(function(){return new w(e)},t):this.multicast(new w(t))},o.shareValue=function(t){return this.publishValue(t).refCount()},o.replay=function(t,e,n,r){return t?this.multicast(function(){return new g(e,n,r)},t):this.multicast(new g(e,n,r))},o.shareReplay=function(t,e,n){return this.replay(null,t,e,n).refCount()};var y=function(t,e){this.subject=t,this.observer=e};y.prototype.dispose=function(){if(!this.subject.isDisposed&&null!==this.observer){var t=this.subject.observers.indexOf(this.observer);this.subject.observers.splice(t,1),this.observer=null}};var w=n.BehaviorSubject=function(t){function e(t){if(r.call(this),!this.isStopped)return this.observers.push(t),t.onNext(this.value),new y(this,t);var e=this.exception;return e?t.onError(e):t.onCompleted(),f}function n(n){t.call(this,e),this.value=n,this.observers=[],this.isDisposed=!1,this.isStopped=!1,this.exception=null}return b(n,t),v(n.prototype,a,{hasObservers:function(){return this.observers.length>0},onCompleted:function(){if(r.call(this),!this.isStopped){var t=this.observers.slice(0);this.isStopped=!0;for(var e=0,n=t.length;n>e;e++)t[e].onCompleted();this.observers=[]}},onError:function(t){if(r.call(this),!this.isStopped){var e=this.observers.slice(0);this.isStopped=!0,this.exception=t;for(var n=0,i=e.length;i>n;n++)e[n].onError(t);this.observers=[]}},onNext:function(t){if(r.call(this),!this.isStopped){this.value=t;for(var e=this.observers.slice(0),n=0,i=e.length;i>n;n++)e[n].onNext(t)}},dispose:function(){this.isDisposed=!0,this.observers=null,this.value=null,this.exception=null}}),n}(i),g=n.ReplaySubject=function(t){function e(t,e){this.subject=t,this.observer=e}function n(t){var n=new h(this.scheduler,t),i=new e(this,n);r.call(this),this._trim(this.scheduler.now()),this.observers.push(n);for(var o=this.q.length,s=0,u=this.q.length;u>s;s++)n.onNext(this.q[s].value);return this.hasError?(o++,n.onError(this.error)):this.isStopped&&(o++,n.onCompleted()),n.ensureActive(o),i}function i(e,r,i){this.bufferSize=null==e?Number.MAX_VALUE:e,this.windowSize=null==r?Number.MAX_VALUE:r,this.scheduler=i||d,this.q=[],this.observers=[],this.isStopped=!1,this.isDisposed=!1,this.hasError=!1,this.error=null,t.call(this,n)}return e.prototype.dispose=function(){if(this.observer.dispose(),!this.subject.isDisposed){var t=this.subject.observers.indexOf(this.observer);this.subject.observers.splice(t,1)}},b(i,t),v(i.prototype,a,{hasObservers:function(){return this.observers.length>0},_trim:function(t){for(;this.q.length>this.bufferSize;)this.q.shift();for(;this.q.length>0&&t-this.q[0].interval>this.windowSize;)this.q.shift()},onNext:function(t){var e;if(r.call(this),!this.isStopped){var n=this.scheduler.now();this.q.push({interval:n,value:t}),this._trim(n);for(var i=this.observers.slice(0),o=0,s=i.length;s>o;o++)e=i[o],e.onNext(t),e.ensureActive()}},onError:function(t){var e;if(r.call(this),!this.isStopped){this.isStopped=!0,this.error=t,this.hasError=!0;var n=this.scheduler.now();this._trim(n);for(var i=this.observers.slice(0),o=0,s=i.length;s>o;o++)e=i[o],e.onError(t),e.ensureActive();this.observers=[]}},onCompleted:function(){var t;if(r.call(this),!this.isStopped){this.isStopped=!0;var e=this.scheduler.now();this._trim(e);for(var n=this.observers.slice(0),i=0,o=n.length;o>i;i++)t=n[i],t.onCompleted(),t.ensureActive();this.observers=[]}},dispose:function(){this.isDisposed=!0,this.observers=null}}),i}(i),E=n.ConnectableObservable=function(t){function e(e,n){function r(t){return i.subject.subscribe(t)}var i={subject:n,source:e.asObservable(),hasSubscription:!1,subscription:null};this.connect=function(){return i.hasSubscription||(i.hasSubscription=!0,i.subscription=new p(i.source.subscribe(i.subject),l(function(){i.hasSubscription=!1}))),i.subscription},t.call(this,r)}return b(e,t),e.prototype.connect=function(){return this.connect()},e.prototype.refCount=function(){var t=null,e=0,n=this;return new s(function(r){var i,o;return e++,i=1===e,o=n.subscribe(r),i&&(t=n.connect()),l(function(){o.dispose(),e--,0===e&&t.dispose()})})},e}(i);return n}); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.coincidence.js b/ajax/libs/rxjs/2.2.28/rx.coincidence.js new file mode 100644 index 000000000..3eee13a02 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.coincidence.js @@ -0,0 +1,733 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +;(function (factory) { + var objectTypes = { + 'boolean': false, + 'function': true, + 'object': true, + 'number': false, + 'string': false, + 'undefined': false + }; + + var root = (objectTypes[typeof window] && window) || this, + freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports, + freeModule = objectTypes[typeof module] && module && !module.nodeType && module, + moduleExports = freeModule && freeModule.exports === freeExports && freeExports, + freeGlobal = objectTypes[typeof global] && global; + + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) { + root = freeGlobal; + } + + // Because of build optimizers + if (typeof define === 'function' && define.amd) { + define(['rx', 'exports'], function (Rx, exports) { + root.Rx = factory(root, exports, Rx); + return root.Rx; + }); + } else if (typeof module === 'object' && module && module.exports === freeExports) { + module.exports = factory(root, module.exports, require('./rx')); + } else { + root.Rx = factory(root, {}, root.Rx); + } +}.call(this, function (root, exp, Rx, undefined) { + + var Observable = Rx.Observable, + CompositeDisposable = Rx.CompositeDisposable, + RefCountDisposable = Rx.RefCountDisposable, + SingleAssignmentDisposable = Rx.SingleAssignmentDisposable, + SerialDisposable = Rx.SerialDisposable, + Subject = Rx.Subject, + observableProto = Observable.prototype, + observableEmpty = Observable.empty, + AnonymousObservable = Rx.AnonymousObservable, + observerCreate = Rx.Observer.create, + addRef = Rx.internals.addRef, + defaultComparer = Rx.internals.isEqual, + noop = Rx.helpers.noop; + + // Real Dictionary + var primes = [1, 3, 7, 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191, 16381, 32749, 65521, 131071, 262139, 524287, 1048573, 2097143, 4194301, 8388593, 16777213, 33554393, 67108859, 134217689, 268435399, 536870909, 1073741789, 2147483647]; + var noSuchkey = "no such key"; + var duplicatekey = "duplicate key"; + + function isPrime(candidate) { + if (candidate & 1 === 0) { + return candidate === 2; + } + var num1 = Math.sqrt(candidate), + num2 = 3; + while (num2 <= num1) { + if (candidate % num2 === 0) { + return false; + } + num2 += 2; + } + return true; + } + + function getPrime(min) { + var index, num, candidate; + for (index = 0; index < primes.length; ++index) { + num = primes[index]; + if (num >= min) { + return num; + } + } + candidate = min | 1; + while (candidate < primes[primes.length - 1]) { + if (isPrime(candidate)) { + return candidate; + } + candidate += 2; + } + return min; + } + + function stringHashFn(str) { + var hash = 757602046; + if (!str.length) { + return hash; + } + for (var i = 0, len = str.length; i < len; i++) { + var character = str.charCodeAt(i); + hash = ((hash<<5)-hash)+character; + hash = hash & hash; + } + return hash; + } + + function numberHashFn(key) { + var c2 = 0x27d4eb2d; + key = (key ^ 61) ^ (key >>> 16); + key = key + (key << 3); + key = key ^ (key >>> 4); + key = key * c2; + key = key ^ (key >>> 15); + return key; + } + + var getHashCode = (function () { + var uniqueIdCounter = 0; + + return function (obj) { + if (obj == null) { + throw new Error(noSuchkey); + } + + // Check for built-ins before tacking on our own for any object + if (typeof obj === 'string') { + return stringHashFn(obj); + } + + if (typeof obj === 'number') { + return numberHashFn(obj); + } + + if (typeof obj === 'boolean') { + return obj === true ? 1 : 0; + } + + if (obj instanceof Date) { + return obj.getTime(); + } + + if (obj.getHashCode) { + return obj.getHashCode(); + } + + var id = 17 * uniqueIdCounter++; + obj.getHashCode = function () { return id; }; + return id; + }; + } ()); + + function newEntry() { + return { key: null, value: null, next: 0, hashCode: 0 }; + } + + // Dictionary implementation + + var Dictionary = function (capacity, comparer) { + if (capacity < 0) { + throw new Error('out of range') + } + if (capacity > 0) { + this._initialize(capacity); + } + + this.comparer = comparer || defaultComparer; + this.freeCount = 0; + this.size = 0; + this.freeList = -1; + }; + + Dictionary.prototype._initialize = function (capacity) { + var prime = getPrime(capacity), i; + this.buckets = new Array(prime); + this.entries = new Array(prime); + for (i = 0; i < prime; i++) { + this.buckets[i] = -1; + this.entries[i] = newEntry(); + } + this.freeList = -1; + }; + Dictionary.prototype.count = function () { + return this.size; + }; + Dictionary.prototype.add = function (key, value) { + return this._insert(key, value, true); + }; + Dictionary.prototype._insert = function (key, value, add) { + if (!this.buckets) { + this._initialize(0); + } + var index3; + var num = getHashCode(key) & 2147483647; + var index1 = num % this.buckets.length; + for (var index2 = this.buckets[index1]; index2 >= 0; index2 = this.entries[index2].next) { + if (this.entries[index2].hashCode === num && this.comparer(this.entries[index2].key, key)) { + if (add) { + throw new Error(duplicatekey); + } + this.entries[index2].value = value; + return; + } + } + if (this.freeCount > 0) { + index3 = this.freeList; + this.freeList = this.entries[index3].next; + --this.freeCount; + } else { + if (this.size === this.entries.length) { + this._resize(); + index1 = num % this.buckets.length; + } + index3 = this.size; + ++this.size; + } + this.entries[index3].hashCode = num; + this.entries[index3].next = this.buckets[index1]; + this.entries[index3].key = key; + this.entries[index3].value = value; + this.buckets[index1] = index3; + }; + + Dictionary.prototype._resize = function () { + var prime = getPrime(this.size * 2), + numArray = new Array(prime); + for (index = 0; index < numArray.length; ++index) { + numArray[index] = -1; + } + var entryArray = new Array(prime); + for (index = 0; index < this.size; ++index) { + entryArray[index] = this.entries[index]; + } + for (var index = this.size; index < prime; ++index) { + entryArray[index] = newEntry(); + } + for (var index1 = 0; index1 < this.size; ++index1) { + var index2 = entryArray[index1].hashCode % prime; + entryArray[index1].next = numArray[index2]; + numArray[index2] = index1; + } + this.buckets = numArray; + this.entries = entryArray; + }; + + Dictionary.prototype.remove = function (key) { + if (this.buckets) { + var num = getHashCode(key) & 2147483647; + var index1 = num % this.buckets.length; + var index2 = -1; + for (var index3 = this.buckets[index1]; index3 >= 0; index3 = this.entries[index3].next) { + if (this.entries[index3].hashCode === num && this.comparer(this.entries[index3].key, key)) { + if (index2 < 0) { + this.buckets[index1] = this.entries[index3].next; + } else { + this.entries[index2].next = this.entries[index3].next; + } + this.entries[index3].hashCode = -1; + this.entries[index3].next = this.freeList; + this.entries[index3].key = null; + this.entries[index3].value = null; + this.freeList = index3; + ++this.freeCount; + return true; + } else { + index2 = index3; + } + } + } + return false; + }; + + Dictionary.prototype.clear = function () { + var index, len; + if (this.size <= 0) { + return; + } + for (index = 0, len = this.buckets.length; index < len; ++index) { + this.buckets[index] = -1; + } + for (index = 0; index < this.size; ++index) { + this.entries[index] = newEntry(); + } + this.freeList = -1; + this.size = 0; + }; + + Dictionary.prototype._findEntry = function (key) { + if (this.buckets) { + var num = getHashCode(key) & 2147483647; + for (var index = this.buckets[num % this.buckets.length]; index >= 0; index = this.entries[index].next) { + if (this.entries[index].hashCode === num && this.comparer(this.entries[index].key, key)) { + return index; + } + } + } + return -1; + }; + + Dictionary.prototype.count = function () { + return this.size - this.freeCount; + }; + + Dictionary.prototype.tryGetValue = function (key) { + var entry = this._findEntry(key); + if (entry >= 0) { + return this.entries[entry].value; + } + return undefined; + }; + + Dictionary.prototype.getValues = function () { + var index = 0, results = []; + if (this.entries) { + for (var index1 = 0; index1 < this.size; index1++) { + if (this.entries[index1].hashCode >= 0) { + results[index++] = this.entries[index1].value; + } + } + } + return results; + }; + + Dictionary.prototype.get = function (key) { + var entry = this._findEntry(key); + if (entry >= 0) { + return this.entries[entry].value; + } + throw new Error(noSuchkey); + }; + + Dictionary.prototype.set = function (key, value) { + this._insert(key, value, false); + }; + + Dictionary.prototype.containskey = function (key) { + return this._findEntry(key) >= 0; + }; + + /** + * Correlates the elements of two sequences based on overlapping durations. + * + * @param {Observable} right The right observable sequence to join elements for. + * @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap. + * @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap. + * @param {Function} resultSelector A function invoked to compute a result element for any two overlapping elements of the left and right observable sequences. The parameters passed to the function correspond with the elements from the left and right source sequences for which overlap occurs. + * @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration. + */ + observableProto.join = function (right, leftDurationSelector, rightDurationSelector, resultSelector) { + var left = this; + return new AnonymousObservable(function (observer) { + var group = new CompositeDisposable(), + leftDone = false, + leftId = 0, + leftMap = new Dictionary(), + rightDone = false, + rightId = 0, + rightMap = new Dictionary(); + group.add(left.subscribe(function (value) { + var duration, + expire, + id = leftId++, + md = new SingleAssignmentDisposable(), + result, + values; + leftMap.add(id, value); + group.add(md); + expire = function () { + if (leftMap.remove(id) && leftMap.count() === 0 && leftDone) { + observer.onCompleted(); + } + return group.remove(md); + }; + try { + duration = leftDurationSelector(value); + } catch (e) { + observer.onError(e); + return; + } + md.setDisposable(duration.take(1).subscribe(noop, observer.onError.bind(observer), function () { expire(); })); + values = rightMap.getValues(); + for (var i = 0; i < values.length; i++) { + try { + result = resultSelector(value, values[i]); + } catch (exception) { + observer.onError(exception); + return; + } + observer.onNext(result); + } + }, observer.onError.bind(observer), function () { + leftDone = true; + if (rightDone || leftMap.count() === 0) { + observer.onCompleted(); + } + })); + group.add(right.subscribe(function (value) { + var duration, + expire, + id = rightId++, + md = new SingleAssignmentDisposable(), + result, + values; + rightMap.add(id, value); + group.add(md); + expire = function () { + if (rightMap.remove(id) && rightMap.count() === 0 && rightDone) { + observer.onCompleted(); + } + return group.remove(md); + }; + try { + duration = rightDurationSelector(value); + } catch (exception) { + observer.onError(exception); + return; + } + md.setDisposable(duration.take(1).subscribe(noop, observer.onError.bind(observer), function () { expire(); })); + values = leftMap.getValues(); + for (var i = 0; i < values.length; i++) { + try { + result = resultSelector(values[i], value); + } catch (exception) { + observer.onError(exception); + return; + } + observer.onNext(result); + } + }, observer.onError.bind(observer), function () { + rightDone = true; + if (leftDone || rightMap.count() === 0) { + observer.onCompleted(); + } + })); + return group; + }); + }; + + /** + * Correlates the elements of two sequences based on overlapping durations, and groups the results. + * + * @param {Observable} right The right observable sequence to join elements for. + * @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap. + * @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap. + * @param {Function} resultSelector A function invoked to compute a result element for any element of the left sequence with overlapping elements from the right observable sequence. The first parameter passed to the function is an element of the left sequence. The second parameter passed to the function is an observable sequence with elements from the right sequence that overlap with the left sequence's element. + * @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration. + */ + observableProto.groupJoin = function (right, leftDurationSelector, rightDurationSelector, resultSelector) { + var left = this; + return new AnonymousObservable(function (observer) { + var nothing = function () {}; + var group = new CompositeDisposable(); + var r = new RefCountDisposable(group); + var leftMap = new Dictionary(); + var rightMap = new Dictionary(); + var leftID = 0; + var rightID = 0; + + group.add(left.subscribe( + function (value) { + var s = new Subject(); + var id = leftID++; + leftMap.add(id, s); + var i, len, leftValues, rightValues; + + var result; + try { + result = resultSelector(value, addRef(s, r)); + } catch (e) { + leftValues = leftMap.getValues(); + for (i = 0, len = leftValues.length; i < len; i++) { + leftValues[i].onError(e); + } + observer.onError(e); + return; + } + observer.onNext(result); + + rightValues = rightMap.getValues(); + for (i = 0, len = rightValues.length; i < len; i++) { + s.onNext(rightValues[i]); + } + + var md = new SingleAssignmentDisposable(); + group.add(md); + + var expire = function () { + if (leftMap.remove(id)) { + s.onCompleted(); + } + + group.remove(md); + }; + + var duration; + try { + duration = leftDurationSelector(value); + } catch (e) { + leftValues = leftMap.getValues(); + for (i = 0, len = leftMap.length; i < len; i++) { + leftValues[i].onError(e); + } + observer.onError(e); + return; + } + + md.setDisposable(duration.take(1).subscribe( + nothing, + function (e) { + leftValues = leftMap.getValues(); + for (i = 0, len = leftValues.length; i < len; i++) { + leftValues[i].onError(e); + } + observer.onError(e); + }, + expire) + ); + }, + function (e) { + var leftValues = leftMap.getValues(); + for (var i = 0, len = leftValues.length; i < len; i++) { + leftValues[i].onError(e); + } + observer.onError(e); + }, + observer.onCompleted.bind(observer))); + + group.add(right.subscribe( + function (value) { + var leftValues, i, len; + var id = rightID++; + rightMap.add(id, value); + + var md = new SingleAssignmentDisposable(); + group.add(md); + + var expire = function () { + rightMap.remove(id); + group.remove(md); + }; + + var duration; + try { + duration = rightDurationSelector(value); + } catch (e) { + leftValues = leftMap.getValues(); + for (i = 0, len = leftMap.length; i < len; i++) { + leftValues[i].onError(e); + } + observer.onError(e); + return; + } + md.setDisposable(duration.take(1).subscribe( + nothing, + function (e) { + leftValues = leftMap.getValues(); + for (i = 0, len = leftMap.length; i < len; i++) { + leftValues[i].onError(e); + } + observer.onError(e); + }, + expire) + ); + + leftValues = leftMap.getValues(); + for (i = 0, len = leftValues.length; i < len; i++) { + leftValues[i].onNext(value); + } + }, + function (e) { + var leftValues = leftMap.getValues(); + for (var i = 0, len = leftValues.length; i < len; i++) { + leftValues[i].onError(e); + } + observer.onError(e); + })); + + return r; + }); + }; + + /** + * Projects each element of an observable sequence into zero or more buffers. + * + * @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows). + * @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored. + * @returns {Observable} An observable sequence of windows. + */ + observableProto.buffer = function (bufferOpeningsOrClosingSelector, bufferClosingSelector) { + return this.window.apply(this, arguments).selectMany(function (x) { return x.toArray(); }); + }; + + /** + * Projects each element of an observable sequence into zero or more windows. + * + * @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows). + * @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored. + * @returns {Observable} An observable sequence of windows. + */ + observableProto.window = function (windowOpeningsOrClosingSelector, windowClosingSelector) { + if (arguments.length === 1 && typeof arguments[0] !== 'function') { + return observableWindowWithBounaries.call(this, windowOpeningsOrClosingSelector); + } + return typeof windowOpeningsOrClosingSelector === 'function' ? + observableWindowWithClosingSelector.call(this, windowOpeningsOrClosingSelector) : + observableWindowWithOpenings.call(this, windowOpeningsOrClosingSelector, windowClosingSelector); + }; + + function observableWindowWithOpenings(windowOpenings, windowClosingSelector) { + return windowOpenings.groupJoin(this, windowClosingSelector, function () { + return observableEmpty(); + }, function (_, window) { + return window; + }); + } + + function observableWindowWithBounaries(windowBoundaries) { + var source = this; + return new AnonymousObservable(function (observer) { + var window = new Subject(), + d = new CompositeDisposable(), + r = new RefCountDisposable(d); + + observer.onNext(addRef(window, r)); + + d.add(source.subscribe(function (x) { + window.onNext(x); + }, function (err) { + window.onError(err); + observer.onError(err); + }, function () { + window.onCompleted(); + observer.onCompleted(); + })); + + d.add(windowBoundaries.subscribe(function (w) { + window.onCompleted(); + window = new Subject(); + observer.onNext(addRef(window, r)); + }, function (err) { + window.onError(err); + observer.onError(err); + }, function () { + window.onCompleted(); + observer.onCompleted(); + })); + + return r; + }); + } + + function observableWindowWithClosingSelector(windowClosingSelector) { + var source = this; + return new AnonymousObservable(function (observer) { + var createWindowClose, + m = new SerialDisposable(), + d = new CompositeDisposable(m), + r = new RefCountDisposable(d), + window = new Subject(); + observer.onNext(addRef(window, r)); + d.add(source.subscribe(function (x) { + window.onNext(x); + }, function (ex) { + window.onError(ex); + observer.onError(ex); + }, function () { + window.onCompleted(); + observer.onCompleted(); + })); + createWindowClose = function () { + var m1, windowClose; + try { + windowClose = windowClosingSelector(); + } catch (exception) { + observer.onError(exception); + return; + } + m1 = new SingleAssignmentDisposable(); + m.setDisposable(m1); + m1.setDisposable(windowClose.take(1).subscribe(noop, function (ex) { + window.onError(ex); + observer.onError(ex); + }, function () { + window.onCompleted(); + window = new Subject(); + observer.onNext(addRef(window, r)); + createWindowClose(); + })); + }; + createWindowClose(); + return r; + }); + } + + /** + * Returns a new observable that triggers on the second and subsequent triggerings of the input observable. + * The Nth triggering of the input observable passes the arguments from the N-1th and Nth triggering as a pair. + * The argument passed to the N-1th triggering is held in hidden internal state until the Nth triggering occurs. + * @returns {Observable} An observable that triggers on successive pairs of observations from the input observable as an array. + */ + observableProto.pairwise = function () { + var source = this; + return new AnonymousObservable(function (observer) { + var previous, hasPrevious = false; + return source.subscribe( + function (x) { + if (hasPrevious) { + observer.onNext([previous, x]); + } else { + hasPrevious = true; + } + previous = x; + }, + observer.onError.bind(observer), + observer.onCompleted.bind(observer)); + }); + }; + /** + * Returns two observables which partition the observations of the source by the given function. + * The first will trigger observations for those values for which the predicate returns true. + * The second will trigger observations for those values where the predicate returns false. + * The predicate is executed once for each subscribed observer. + * Both also propagate all error observations arising from the source and each completes + * when the source completes. + * @param {Function} predicate + * The function to determine which output Observable will trigger a particular observation. + * @returns {Array} + * An array of observables. The first triggers when the predicate returns true, + * and the second triggers when the predicate returns false. + */ + observableProto.partition = function(predicate, thisArg) { + var published = this.publish().refCount(); + return [ + published.filter(predicate, thisArg), + published.filter(function (x, i, o) { return !predicate.call(thisArg, x, i, o); }) + ]; + }; + + return Rx; +})); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.coincidence.min.js b/ajax/libs/rxjs/2.2.28/rx.coincidence.min.js new file mode 100644 index 000000000..326f0a5b5 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.coincidence.min.js @@ -0,0 +1 @@ +(function(t){var e={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},n=e[typeof window]&&window||this,r=e[typeof exports]&&exports&&!exports.nodeType&&exports,i=e[typeof module]&&module&&!module.nodeType&&module,o=(i&&i.exports===r&&r,e[typeof global]&&global);!o||o.global!==o&&o.window!==o||(n=o),"function"==typeof define&&define.amd?define(["rx","exports"],function(e,r){return n.Rx=t(n,r,e),n.Rx}):"object"==typeof module&&module&&module.exports===r?module.exports=t(n,module.exports,require("./rx")):n.Rx=t(n,{},n.Rx)}).call(this,function(t,e,n,r){function i(t){if(false&t)return 2===t;for(var e=Math.sqrt(t),n=3;e>=n;){if(0===t%n)return!1;n+=2}return!0}function o(t){var e,n,r;for(e=0;D.length>e;++e)if(n=D[e],n>=t)return n;for(r=1|t;D[D.length-1]>r;){if(i(r))return r;r+=2}return t}function s(t){var e=757602046;if(!t.length)return e;for(var n=0,r=t.length;r>n;n++){var i=t.charCodeAt(n);e=(e<<5)-e+i,e&=e}return e}function u(t){var e=668265261;return t=61^t^t>>>16,t+=t<<3,t^=t>>>4,t*=e,t^=t>>>15}function c(){return{key:null,value:null,next:0,hashCode:0}}function a(t,e){return t.groupJoin(this,e,function(){return w()},function(t,e){return e})}function h(t){var e=this;return new g(function(n){var r=new m,i=new p,o=new d(i);return n.onNext(E(r,o)),i.add(e.subscribe(function(t){r.onNext(t)},function(t){r.onError(t),n.onError(t)},function(){r.onCompleted(),n.onCompleted()})),i.add(t.subscribe(function(){r.onCompleted(),r=new m,n.onNext(E(r,o))},function(t){r.onError(t),n.onError(t)},function(){r.onCompleted(),n.onCompleted()})),o})}function l(t){var e=this;return new g(function(n){var i,o=new v,s=new p(o),u=new d(s),c=new m;return n.onNext(E(c,u)),s.add(e.subscribe(function(t){c.onNext(t)},function(t){c.onError(t),n.onError(t)},function(){c.onCompleted(),n.onCompleted()})),i=function(){var e,s;try{s=t()}catch(a){return n.onError(a),r}e=new b,o.setDisposable(e),e.setDisposable(s.take(1).subscribe(C,function(t){c.onError(t),n.onError(t)},function(){c.onCompleted(),c=new m,n.onNext(E(c,u)),i()}))},i(),u})}var f=n.Observable,p=n.CompositeDisposable,d=n.RefCountDisposable,b=n.SingleAssignmentDisposable,v=n.SerialDisposable,m=n.Subject,y=f.prototype,w=f.empty,g=n.AnonymousObservable,E=(n.Observer.create,n.internals.addRef),x=n.internals.isEqual,C=n.helpers.noop,D=[1,3,7,13,31,61,127,251,509,1021,2039,4093,8191,16381,32749,65521,131071,262139,524287,1048573,2097143,4194301,8388593,16777213,33554393,67108859,134217689,268435399,536870909,1073741789,2147483647],S="no such key",N="duplicate key",A=function(){var t=0;return function(e){if(null==e)throw Error(S);if("string"==typeof e)return s(e);if("number"==typeof e)return u(e);if("boolean"==typeof e)return e===!0?1:0;if(e instanceof Date)return e.getTime();if(e.getHashCode)return e.getHashCode();var n=17*t++;return e.getHashCode=function(){return n},n}}(),_=function(t,e){if(0>t)throw Error("out of range");t>0&&this._initialize(t),this.comparer=e||x,this.freeCount=0,this.size=0,this.freeList=-1};return _.prototype._initialize=function(t){var e,n=o(t);for(this.buckets=Array(n),this.entries=Array(n),e=0;n>e;e++)this.buckets[e]=-1,this.entries[e]=c();this.freeList=-1},_.prototype.count=function(){return this.size},_.prototype.add=function(t,e){return this._insert(t,e,!0)},_.prototype._insert=function(t,e,n){this.buckets||this._initialize(0);for(var i,o=2147483647&A(t),s=o%this.buckets.length,u=this.buckets[s];u>=0;u=this.entries[u].next)if(this.entries[u].hashCode===o&&this.comparer(this.entries[u].key,t)){if(n)throw Error(N);return this.entries[u].value=e,r}this.freeCount>0?(i=this.freeList,this.freeList=this.entries[i].next,--this.freeCount):(this.size===this.entries.length&&(this._resize(),s=o%this.buckets.length),i=this.size,++this.size),this.entries[i].hashCode=o,this.entries[i].next=this.buckets[s],this.entries[i].key=t,this.entries[i].value=e,this.buckets[s]=i},_.prototype._resize=function(){var t=o(2*this.size),e=Array(t);for(r=0;e.length>r;++r)e[r]=-1;var n=Array(t);for(r=0;this.size>r;++r)n[r]=this.entries[r];for(var r=this.size;t>r;++r)n[r]=c();for(var i=0;this.size>i;++i){var s=n[i].hashCode%t;n[i].next=e[s],e[s]=i}this.buckets=e,this.entries=n},_.prototype.remove=function(t){if(this.buckets)for(var e=2147483647&A(t),n=e%this.buckets.length,r=-1,i=this.buckets[n];i>=0;i=this.entries[i].next){if(this.entries[i].hashCode===e&&this.comparer(this.entries[i].key,t))return 0>r?this.buckets[n]=this.entries[i].next:this.entries[r].next=this.entries[i].next,this.entries[i].hashCode=-1,this.entries[i].next=this.freeList,this.entries[i].key=null,this.entries[i].value=null,this.freeList=i,++this.freeCount,!0;r=i}return!1},_.prototype.clear=function(){var t,e;if(!(0>=this.size)){for(t=0,e=this.buckets.length;e>t;++t)this.buckets[t]=-1;for(t=0;this.size>t;++t)this.entries[t]=c();this.freeList=-1,this.size=0}},_.prototype._findEntry=function(t){if(this.buckets)for(var e=2147483647&A(t),n=this.buckets[e%this.buckets.length];n>=0;n=this.entries[n].next)if(this.entries[n].hashCode===e&&this.comparer(this.entries[n].key,t))return n;return-1},_.prototype.count=function(){return this.size-this.freeCount},_.prototype.tryGetValue=function(t){var e=this._findEntry(t);return e>=0?this.entries[e].value:r},_.prototype.getValues=function(){var t=0,e=[];if(this.entries)for(var n=0;this.size>n;n++)this.entries[n].hashCode>=0&&(e[t++]=this.entries[n].value);return e},_.prototype.get=function(t){var e=this._findEntry(t);if(e>=0)return this.entries[e].value;throw Error(S)},_.prototype.set=function(t,e){this._insert(t,e,!1)},_.prototype.containskey=function(t){return this._findEntry(t)>=0},y.join=function(t,e,n,i){var o=this;return new g(function(s){var u=new p,c=!1,a=0,h=new _,l=!1,f=0,d=new _;return u.add(o.subscribe(function(t){var n,o,l,f,p=a++,v=new b;h.add(p,t),u.add(v),o=function(){return h.remove(p)&&0===h.count()&&c&&s.onCompleted(),u.remove(v)};try{n=e(t)}catch(m){return s.onError(m),r}v.setDisposable(n.take(1).subscribe(C,s.onError.bind(s),function(){o()})),f=d.getValues();for(var y=0;f.length>y;y++){try{l=i(t,f[y])}catch(w){return s.onError(w),r}s.onNext(l)}},s.onError.bind(s),function(){c=!0,(l||0===h.count())&&s.onCompleted()})),u.add(t.subscribe(function(t){var e,o,c,a,p=f++,v=new b;d.add(p,t),u.add(v),o=function(){return d.remove(p)&&0===d.count()&&l&&s.onCompleted(),u.remove(v)};try{e=n(t)}catch(m){return s.onError(m),r}v.setDisposable(e.take(1).subscribe(C,s.onError.bind(s),function(){o()})),a=h.getValues();for(var y=0;a.length>y;y++){try{c=i(a[y],t)}catch(m){return s.onError(m),r}s.onNext(c)}},s.onError.bind(s),function(){l=!0,(c||0===d.count())&&s.onCompleted()})),u})},y.groupJoin=function(t,e,n,i){var o=this;return new g(function(s){var u=function(){},c=new p,a=new d(c),h=new _,l=new _,f=0,v=0;return c.add(o.subscribe(function(t){var n=new m,o=f++;h.add(o,n);var p,d,v,y,w;try{w=i(t,E(n,a))}catch(g){for(v=h.getValues(),p=0,d=v.length;d>p;p++)v[p].onError(g);return s.onError(g),r}for(s.onNext(w),y=l.getValues(),p=0,d=y.length;d>p;p++)n.onNext(y[p]);var x=new b;c.add(x);var C,D=function(){h.remove(o)&&n.onCompleted(),c.remove(x)};try{C=e(t)}catch(g){for(v=h.getValues(),p=0,d=h.length;d>p;p++)v[p].onError(g);return s.onError(g),r}x.setDisposable(C.take(1).subscribe(u,function(t){for(v=h.getValues(),p=0,d=v.length;d>p;p++)v[p].onError(t);s.onError(t)},D))},function(t){for(var e=h.getValues(),n=0,r=e.length;r>n;n++)e[n].onError(t);s.onError(t)},s.onCompleted.bind(s))),c.add(t.subscribe(function(t){var e,i,o,a=v++;l.add(a,t);var f=new b;c.add(f);var p,d=function(){l.remove(a),c.remove(f)};try{p=n(t)}catch(m){for(e=h.getValues(),i=0,o=h.length;o>i;i++)e[i].onError(m);return s.onError(m),r}for(f.setDisposable(p.take(1).subscribe(u,function(t){for(e=h.getValues(),i=0,o=h.length;o>i;i++)e[i].onError(t);s.onError(t)},d)),e=h.getValues(),i=0,o=e.length;o>i;i++)e[i].onNext(t)},function(t){for(var e=h.getValues(),n=0,r=e.length;r>n;n++)e[n].onError(t);s.onError(t)})),a})},y.buffer=function(){return this.window.apply(this,arguments).selectMany(function(t){return t.toArray()})},y.window=function(t,e){return 1===arguments.length&&"function"!=typeof arguments[0]?h.call(this,t):"function"==typeof t?l.call(this,t):a.call(this,t,e)},y.pairwise=function(){var t=this;return new g(function(e){var n,r=!1;return t.subscribe(function(t){r?e.onNext([n,t]):r=!0,n=t},e.onError.bind(e),e.onCompleted.bind(e))})},y.partition=function(t,e){var n=this.publish().refCount();return[n.filter(t,e),n.filter(function(n,r,i){return!t.call(e,n,r,i)})]},n}); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.compat.js b/ajax/libs/rxjs/2.2.28/rx.compat.js new file mode 100644 index 000000000..a84046d8a --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.compat.js @@ -0,0 +1,4758 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +;(function (undefined) { + + var objectTypes = { + 'boolean': false, + 'function': true, + 'object': true, + 'number': false, + 'string': false, + 'undefined': false + }; + + var root = (objectTypes[typeof window] && window) || this, + freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports, + freeModule = objectTypes[typeof module] && module && !module.nodeType && module, + moduleExports = freeModule && freeModule.exports === freeExports && freeExports, + freeGlobal = objectTypes[typeof global] && global; + + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) { + root = freeGlobal; + } + + var Rx = { + internals: {}, + config: { + Promise: root.Promise // Detect if promise exists + }, + helpers: { } + }; + + // Defaults + var noop = Rx.helpers.noop = function () { }, + identity = Rx.helpers.identity = function (x) { return x; }, + pluck = Rx.helpers.pluck = function (property) { return function (x) { return x[property]; }; }, + just = Rx.helpers.just = function (value) { return function () { return value; }; }, + defaultNow = Rx.helpers.defaultNow = (function () { return !!Date.now ? Date.now : function () { return +new Date; }; }()), + defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); }, + defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); }, + defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); }, + defaultError = Rx.helpers.defaultError = function (err) { throw err; }, + isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.then === 'function' && p.then !== Rx.Observable.prototype.then; }, + asArray = Rx.helpers.asArray = function () { return Array.prototype.slice.call(arguments); }, + not = Rx.helpers.not = function (a) { return !a; }; + + // Errors + var sequenceContainsNoElements = 'Sequence contains no elements.'; + var argumentOutOfRange = 'Argument out of range'; + var objectDisposed = 'Object has been disposed'; + function checkDisposed() { if (this.isDisposed) { throw new Error(objectDisposed); } } + + // Shim in iterator support + var $iterator$ = (typeof Symbol === 'object' && Symbol.iterator) || + '_es6shim_iterator_'; + // Firefox ships a partial implementation using the name @@iterator. + // https://bugzilla.mozilla.org/show_bug.cgi?id=907077#c14 + // So use that name if we detect it. + if (root.Set && typeof new root.Set()['@@iterator'] === 'function') { + $iterator$ = '@@iterator'; + } + var doneEnumerator = { done: true, value: undefined }; + + /** `Object#toString` result shortcuts */ + var argsClass = '[object Arguments]', + arrayClass = '[object Array]', + boolClass = '[object Boolean]', + dateClass = '[object Date]', + errorClass = '[object Error]', + funcClass = '[object Function]', + numberClass = '[object Number]', + objectClass = '[object Object]', + regexpClass = '[object RegExp]', + stringClass = '[object String]'; + + var toString = Object.prototype.toString, + hasOwnProperty = Object.prototype.hasOwnProperty, + supportsArgsClass = toString.call(arguments) == argsClass, // For less -1); + } + }); + } + } + stackA.pop(); + stackB.pop(); + + return result; + } + var slice = Array.prototype.slice; + function argsOrArray(args, idx) { + return args.length === 1 && Array.isArray(args[idx]) ? + args[idx] : + slice.call(args); + } + var hasProp = {}.hasOwnProperty; + + /** @private */ + var inherits = this.inherits = Rx.internals.inherits = function (child, parent) { + function __() { this.constructor = child; } + __.prototype = parent.prototype; + child.prototype = new __(); + }; + + /** @private */ + var addProperties = Rx.internals.addProperties = function (obj) { + var sources = slice.call(arguments, 1); + for (var i = 0, len = sources.length; i < len; i++) { + var source = sources[i]; + for (var prop in source) { + obj[prop] = source[prop]; + } + } + }; + + // Rx Utils + var addRef = Rx.internals.addRef = function (xs, r) { + return new AnonymousObservable(function (observer) { + return new CompositeDisposable(r.getDisposable(), xs.subscribe(observer)); + }); + }; + + // Collection polyfills + function arrayInitialize(count, factory) { + var a = new Array(count); + for (var i = 0; i < count; i++) { + a[i] = factory(); + } + return a; + } + + // Utilities + if (!Function.prototype.bind) { + Function.prototype.bind = function (that) { + var target = this, + args = slice.call(arguments, 1); + var bound = function () { + if (this instanceof bound) { + function F() { } + F.prototype = target.prototype; + var self = new F(); + var result = target.apply(self, args.concat(slice.call(arguments))); + if (Object(result) === result) { + return result; + } + return self; + } else { + return target.apply(that, args.concat(slice.call(arguments))); + } + }; + + return bound; + }; + } + + var boxedString = Object("a"), + splitString = boxedString[0] != "a" || !(0 in boxedString); + if (!Array.prototype.every) { + Array.prototype.every = function every(fun /*, thisp */) { + var object = Object(this), + self = splitString && {}.toString.call(this) == stringClass ? + this.split("") : + object, + length = self.length >>> 0, + thisp = arguments[1]; + + if ({}.toString.call(fun) != funcClass) { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self && !fun.call(thisp, self[i], i, object)) { + return false; + } + } + return true; + }; + } + + if (!Array.prototype.map) { + Array.prototype.map = function map(fun /*, thisp*/) { + var object = Object(this), + self = splitString && {}.toString.call(this) == stringClass ? + this.split("") : + object, + length = self.length >>> 0, + result = Array(length), + thisp = arguments[1]; + + if ({}.toString.call(fun) != funcClass) { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self) + result[i] = fun.call(thisp, self[i], i, object); + } + return result; + }; + } + + if (!Array.prototype.filter) { + Array.prototype.filter = function (predicate) { + var results = [], item, t = new Object(this); + for (var i = 0, len = t.length >>> 0; i < len; i++) { + item = t[i]; + if (i in t && predicate.call(arguments[1], item, i, t)) { + results.push(item); + } + } + return results; + }; + } + + if (!Array.isArray) { + Array.isArray = function (arg) { + return Object.prototype.toString.call(arg) == arrayClass; + }; + } + + if (!Array.prototype.indexOf) { + Array.prototype.indexOf = function indexOf(searchElement) { + var t = Object(this); + var len = t.length >>> 0; + if (len === 0) { + return -1; + } + var n = 0; + if (arguments.length > 1) { + n = Number(arguments[1]); + if (n !== n) { + n = 0; + } else if (n !== 0 && n != Infinity && n !== -Infinity) { + n = (n > 0 || -1) * Math.floor(Math.abs(n)); + } + } + if (n >= len) { + return -1; + } + var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); + for (; k < len; k++) { + if (k in t && t[k] === searchElement) { + return k; + } + } + return -1; + }; + } + + // Collections + var IndexedItem = function (id, value) { + this.id = id; + this.value = value; + }; + + IndexedItem.prototype.compareTo = function (other) { + var c = this.value.compareTo(other.value); + if (c === 0) { + c = this.id - other.id; + } + return c; + }; + + // Priority Queue for Scheduling + var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) { + this.items = new Array(capacity); + this.length = 0; + }; + + var priorityProto = PriorityQueue.prototype; + priorityProto.isHigherPriority = function (left, right) { + return this.items[left].compareTo(this.items[right]) < 0; + }; + + priorityProto.percolate = function (index) { + if (index >= this.length || index < 0) { + return; + } + var parent = index - 1 >> 1; + if (parent < 0 || parent === index) { + return; + } + if (this.isHigherPriority(index, parent)) { + var temp = this.items[index]; + this.items[index] = this.items[parent]; + this.items[parent] = temp; + this.percolate(parent); + } + }; + + priorityProto.heapify = function (index) { + if (index === undefined) { + index = 0; + } + if (index >= this.length || index < 0) { + return; + } + var left = 2 * index + 1, + right = 2 * index + 2, + first = index; + if (left < this.length && this.isHigherPriority(left, first)) { + first = left; + } + if (right < this.length && this.isHigherPriority(right, first)) { + first = right; + } + if (first !== index) { + var temp = this.items[index]; + this.items[index] = this.items[first]; + this.items[first] = temp; + this.heapify(first); + } + }; + + priorityProto.peek = function () { return this.items[0].value; }; + + priorityProto.removeAt = function (index) { + this.items[index] = this.items[--this.length]; + delete this.items[this.length]; + this.heapify(); + }; + + priorityProto.dequeue = function () { + var result = this.peek(); + this.removeAt(0); + return result; + }; + + priorityProto.enqueue = function (item) { + var index = this.length++; + this.items[index] = new IndexedItem(PriorityQueue.count++, item); + this.percolate(index); + }; + + priorityProto.remove = function (item) { + for (var i = 0; i < this.length; i++) { + if (this.items[i].value === item) { + this.removeAt(i); + return true; + } + } + return false; + }; + PriorityQueue.count = 0; + /** + * Represents a group of disposable resources that are disposed together. + * @constructor + */ + var CompositeDisposable = Rx.CompositeDisposable = function () { + this.disposables = argsOrArray(arguments, 0); + this.isDisposed = false; + this.length = this.disposables.length; + }; + + var CompositeDisposablePrototype = CompositeDisposable.prototype; + + /** + * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed. + * @param {Mixed} item Disposable to add. + */ + CompositeDisposablePrototype.add = function (item) { + if (this.isDisposed) { + item.dispose(); + } else { + this.disposables.push(item); + this.length++; + } + }; + + /** + * Removes and disposes the first occurrence of a disposable from the CompositeDisposable. + * @param {Mixed} item Disposable to remove. + * @returns {Boolean} true if found; false otherwise. + */ + CompositeDisposablePrototype.remove = function (item) { + var shouldDispose = false; + if (!this.isDisposed) { + var idx = this.disposables.indexOf(item); + if (idx !== -1) { + shouldDispose = true; + this.disposables.splice(idx, 1); + this.length--; + item.dispose(); + } + + } + return shouldDispose; + }; + + /** + * Disposes all disposables in the group and removes them from the group. + */ + CompositeDisposablePrototype.dispose = function () { + if (!this.isDisposed) { + this.isDisposed = true; + var currentDisposables = this.disposables.slice(0); + this.disposables = []; + this.length = 0; + + for (var i = 0, len = currentDisposables.length; i < len; i++) { + currentDisposables[i].dispose(); + } + } + }; + + /** + * Removes and disposes all disposables from the CompositeDisposable, but does not dispose the CompositeDisposable. + */ + CompositeDisposablePrototype.clear = function () { + var currentDisposables = this.disposables.slice(0); + this.disposables = []; + this.length = 0; + for (var i = 0, len = currentDisposables.length; i < len; i++) { + currentDisposables[i].dispose(); + } + }; + + /** + * Determines whether the CompositeDisposable contains a specific disposable. + * @param {Mixed} item Disposable to search for. + * @returns {Boolean} true if the disposable was found; otherwise, false. + */ + CompositeDisposablePrototype.contains = function (item) { + return this.disposables.indexOf(item) !== -1; + }; + + /** + * Converts the existing CompositeDisposable to an array of disposables + * @returns {Array} An array of disposable objects. + */ + CompositeDisposablePrototype.toArray = function () { + return this.disposables.slice(0); + }; + + /** + * Provides a set of static methods for creating Disposables. + * + * @constructor + * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once. + */ + var Disposable = Rx.Disposable = function (action) { + this.isDisposed = false; + this.action = action || noop; + }; + + /** Performs the task of cleaning up resources. */ + Disposable.prototype.dispose = function () { + if (!this.isDisposed) { + this.action(); + this.isDisposed = true; + } + }; + + /** + * Creates a disposable object that invokes the specified action when disposed. + * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once. + * @return {Disposable} The disposable object that runs the given action upon disposal. + */ + var disposableCreate = Disposable.create = function (action) { return new Disposable(action); }; + + /** + * Gets the disposable that does nothing when disposed. + */ + var disposableEmpty = Disposable.empty = { dispose: noop }; + + var BooleanDisposable = (function () { + function BooleanDisposable (isSingle) { + this.isSingle = isSingle; + this.isDisposed = false; + this.current = null; + } + + var booleanDisposablePrototype = BooleanDisposable.prototype; + + /** + * Gets the underlying disposable. + * @return The underlying disposable. + */ + booleanDisposablePrototype.getDisposable = function () { + return this.current; + }; + + /** + * Sets the underlying disposable. + * @param {Disposable} value The new underlying disposable. + */ + booleanDisposablePrototype.setDisposable = function (value) { + if (this.current && this.isSingle) { + throw new Error('Disposable has already been assigned'); + } + + var shouldDispose = this.isDisposed, old; + if (!shouldDispose) { + old = this.current; + this.current = value; + } + if (old) { + old.dispose(); + } + if (shouldDispose && value) { + value.dispose(); + } + }; + + /** + * Disposes the underlying disposable as well as all future replacements. + */ + booleanDisposablePrototype.dispose = function () { + var old; + if (!this.isDisposed) { + this.isDisposed = true; + old = this.current; + this.current = null; + } + if (old) { + old.dispose(); + } + }; + + return BooleanDisposable; + }()); + + /** + * Represents a disposable resource which only allows a single assignment of its underlying disposable resource. + * If an underlying disposable resource has already been set, future attempts to set the underlying disposable resource will throw an Error. + */ + var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = (function (super_) { + inherits(SingleAssignmentDisposable, super_); + + function SingleAssignmentDisposable() { + super_.call(this, true); + } + + return SingleAssignmentDisposable; + }(BooleanDisposable)); + + /** + * Represents a disposable resource whose underlying disposable resource can be replaced by another disposable resource, causing automatic disposal of the previous underlying disposable resource. + */ + var SerialDisposable = Rx.SerialDisposable = (function (super_) { + inherits(SerialDisposable, super_); + + function SerialDisposable() { + super_.call(this, false); + } + + return SerialDisposable; + }(BooleanDisposable)); + + /** + * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed. + */ + var RefCountDisposable = Rx.RefCountDisposable = (function () { + + function InnerDisposable(disposable) { + this.disposable = disposable; + this.disposable.count++; + this.isInnerDisposed = false; + } + + InnerDisposable.prototype.dispose = function () { + if (!this.disposable.isDisposed) { + if (!this.isInnerDisposed) { + this.isInnerDisposed = true; + this.disposable.count--; + if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) { + this.disposable.isDisposed = true; + this.disposable.underlyingDisposable.dispose(); + } + } + } + }; + + /** + * Initializes a new instance of the RefCountDisposable with the specified disposable. + * @constructor + * @param {Disposable} disposable Underlying disposable. + */ + function RefCountDisposable(disposable) { + this.underlyingDisposable = disposable; + this.isDisposed = false; + this.isPrimaryDisposed = false; + this.count = 0; + } + + /** + * Disposes the underlying disposable only when all dependent disposables have been disposed + */ + RefCountDisposable.prototype.dispose = function () { + if (!this.isDisposed) { + if (!this.isPrimaryDisposed) { + this.isPrimaryDisposed = true; + if (this.count === 0) { + this.isDisposed = true; + this.underlyingDisposable.dispose(); + } + } + } + }; + + /** + * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable. + * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime. + */ + RefCountDisposable.prototype.getDisposable = function () { + return this.isDisposed ? disposableEmpty : new InnerDisposable(this); + }; + + return RefCountDisposable; + })(); + + function ScheduledDisposable(scheduler, disposable) { + this.scheduler = scheduler; + this.disposable = disposable; + this.isDisposed = false; + } + + ScheduledDisposable.prototype.dispose = function () { + var parent = this; + this.scheduler.schedule(function () { + if (!parent.isDisposed) { + parent.isDisposed = true; + parent.disposable.dispose(); + } + }); + }; + + var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) { + this.scheduler = scheduler; + this.state = state; + this.action = action; + this.dueTime = dueTime; + this.comparer = comparer || defaultSubComparer; + this.disposable = new SingleAssignmentDisposable(); + } + + ScheduledItem.prototype.invoke = function () { + this.disposable.setDisposable(this.invokeCore()); + }; + + ScheduledItem.prototype.compareTo = function (other) { + return this.comparer(this.dueTime, other.dueTime); + }; + + ScheduledItem.prototype.isCancelled = function () { + return this.disposable.isDisposed; + }; + + ScheduledItem.prototype.invokeCore = function () { + return this.action(this.scheduler, this.state); + }; + + /** Provides a set of static properties to access commonly used schedulers. */ + var Scheduler = Rx.Scheduler = (function () { + + /** + * @constructor + * @private + */ + function Scheduler(now, schedule, scheduleRelative, scheduleAbsolute) { + this.now = now; + this._schedule = schedule; + this._scheduleRelative = scheduleRelative; + this._scheduleAbsolute = scheduleAbsolute; + } + + function invokeRecImmediate(scheduler, pair) { + var state = pair.first, action = pair.second, group = new CompositeDisposable(), + recursiveAction = function (state1) { + action(state1, function (state2) { + var isAdded = false, isDone = false, + d = scheduler.scheduleWithState(state2, function (scheduler1, state3) { + if (isAdded) { + group.remove(d); + } else { + isDone = true; + } + recursiveAction(state3); + return disposableEmpty; + }); + if (!isDone) { + group.add(d); + isAdded = true; + } + }); + }; + recursiveAction(state); + return group; + } + + function invokeRecDate(scheduler, pair, method) { + var state = pair.first, action = pair.second, group = new CompositeDisposable(), + recursiveAction = function (state1) { + action(state1, function (state2, dueTime1) { + var isAdded = false, isDone = false, + d = scheduler[method].call(scheduler, state2, dueTime1, function (scheduler1, state3) { + if (isAdded) { + group.remove(d); + } else { + isDone = true; + } + recursiveAction(state3); + return disposableEmpty; + }); + if (!isDone) { + group.add(d); + isAdded = true; + } + }); + }; + recursiveAction(state); + return group; + } + + function invokeAction(scheduler, action) { + action(); + return disposableEmpty; + } + + var schedulerProto = Scheduler.prototype; + + /** + * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions. + * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false. + * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling. + */ + schedulerProto.catchException = schedulerProto['catch'] = function (handler) { + return new CatchScheduler(this, handler); + }; + + /** + * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation. + * @param {Number} period Period for running the work periodically. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort). + */ + schedulerProto.schedulePeriodic = function (period, action) { + return this.schedulePeriodicWithState(null, period, function () { + action(); + }); + }; + + /** + * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation. + * @param {Mixed} state Initial state passed to the action upon the first iteration. + * @param {Number} period Period for running the work periodically. + * @param {Function} action Action to be executed, potentially updating the state. + * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort). + */ + schedulerProto.schedulePeriodicWithState = function (state, period, action) { + var s = state, id = setInterval(function () { + s = action(s); + }, period); + return disposableCreate(function () { + clearInterval(id); + }); + }; + + /** + * Schedules an action to be executed. + * @param {Function} action Action to execute. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.schedule = function (action) { + return this._schedule(action, invokeAction); + }; + + /** + * Schedules an action to be executed. + * @param state State passed to the action to be executed. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithState = function (state, action) { + return this._schedule(state, action); + }; + + /** + * Schedules an action to be executed after the specified relative due time. + * @param {Function} action Action to execute. + * @param {Number} dueTime Relative time after which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithRelative = function (dueTime, action) { + return this._scheduleRelative(action, dueTime, invokeAction); + }; + + /** + * Schedules an action to be executed after dueTime. + * @param state State passed to the action to be executed. + * @param {Function} action Action to be executed. + * @param {Number} dueTime Relative time after which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithRelativeAndState = function (state, dueTime, action) { + return this._scheduleRelative(state, dueTime, action); + }; + + /** + * Schedules an action to be executed at the specified absolute due time. + * @param {Function} action Action to execute. + * @param {Number} dueTime Absolute time at which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithAbsolute = function (dueTime, action) { + return this._scheduleAbsolute(action, dueTime, invokeAction); + }; + + /** + * Schedules an action to be executed at dueTime. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to be executed. + * @param {Number}dueTime Absolute time at which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithAbsoluteAndState = function (state, dueTime, action) { + return this._scheduleAbsolute(state, dueTime, action); + }; + + /** + * Schedules an action to be executed recursively. + * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursive = function (action) { + return this.scheduleRecursiveWithState(action, function (_action, self) { + _action(function () { + self(_action); + }); + }); + }; + + /** + * Schedules an action to be executed recursively. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithState = function (state, action) { + return this.scheduleWithState({ first: state, second: action }, function (s, p) { + return invokeRecImmediate(s, p); + }); + }; + + /** + * Schedules an action to be executed recursively after a specified relative due time. + * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified relative time. + * @param {Number}dueTime Relative time after which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithRelative = function (dueTime, action) { + return this.scheduleRecursiveWithRelativeAndState(action, dueTime, function (_action, self) { + _action(function (dt) { + self(_action, dt); + }); + }); + }; + + /** + * Schedules an action to be executed recursively after a specified relative due time. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state. + * @param {Number}dueTime Relative time after which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithRelativeAndState = function (state, dueTime, action) { + return this._scheduleRelative({ first: state, second: action }, dueTime, function (s, p) { + return invokeRecDate(s, p, 'scheduleWithRelativeAndState'); + }); + }; + + /** + * Schedules an action to be executed recursively at a specified absolute due time. + * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified absolute time. + * @param {Number}dueTime Absolute time at which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithAbsolute = function (dueTime, action) { + return this.scheduleRecursiveWithAbsoluteAndState(action, dueTime, function (_action, self) { + _action(function (dt) { + self(_action, dt); + }); + }); + }; + + /** + * Schedules an action to be executed recursively at a specified absolute due time. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state. + * @param {Number}dueTime Absolute time at which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithAbsoluteAndState = function (state, dueTime, action) { + return this._scheduleAbsolute({ first: state, second: action }, dueTime, function (s, p) { + return invokeRecDate(s, p, 'scheduleWithAbsoluteAndState'); + }); + }; + + /** Gets the current time according to the local machine's system clock. */ + Scheduler.now = defaultNow; + + /** + * Normalizes the specified TimeSpan value to a positive value. + * @param {Number} timeSpan The time span value to normalize. + * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0 + */ + Scheduler.normalize = function (timeSpan) { + if (timeSpan < 0) { + timeSpan = 0; + } + return timeSpan; + }; + + return Scheduler; + }()); + + var normalizeTime = Scheduler.normalize; + + var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () { + function tick(command, recurse) { + recurse(0, this._period); + try { + this._state = this._action(this._state); + } catch (e) { + this._cancel.dispose(); + throw e; + } + } + + function SchedulePeriodicRecursive(scheduler, state, period, action) { + this._scheduler = scheduler; + this._state = state; + this._period = period; + this._action = action; + } + + SchedulePeriodicRecursive.prototype.start = function () { + var d = new SingleAssignmentDisposable(); + this._cancel = d; + d.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0, this._period, tick.bind(this))); + + return d; + }; + + return SchedulePeriodicRecursive; + }()); + + /** + * Gets a scheduler that schedules work immediately on the current thread. + */ + var immediateScheduler = Scheduler.immediate = (function () { + + function scheduleNow(state, action) { return action(this, state); } + + function scheduleRelative(state, dueTime, action) { + var dt = normalizeTime(dt); + while (dt - this.now() > 0) { } + return action(this, state); + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); + } + + return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); + }()); + + /** + * Gets a scheduler that schedules work as soon as possible on the current thread. + */ + var currentThreadScheduler = Scheduler.currentThread = (function () { + var queue; + + function runTrampoline (q) { + var item; + while (q.length > 0) { + item = q.dequeue(); + if (!item.isCancelled()) { + // Note, do not schedule blocking work! + while (item.dueTime - Scheduler.now() > 0) { + } + if (!item.isCancelled()) { + item.invoke(); + } + } + } + } + + function scheduleNow(state, action) { + return this.scheduleWithRelativeAndState(state, 0, action); + } + + function scheduleRelative(state, dueTime, action) { + var dt = this.now() + Scheduler.normalize(dueTime), + si = new ScheduledItem(this, state, action, dt), + t; + if (!queue) { + queue = new PriorityQueue(4); + queue.enqueue(si); + try { + runTrampoline(queue); + } catch (e) { + throw e; + } finally { + queue = null; + } + } else { + queue.enqueue(si); + } + return si.disposable; + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); + } + + var currentScheduler = new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); + currentScheduler.scheduleRequired = function () { return queue === null; }; + currentScheduler.ensureTrampoline = function (action) { + if (queue === null) { + return this.schedule(action); + } else { + return action(); + } + }; + + return currentScheduler; + }()); + + + var scheduleMethod, clearMethod = noop; + (function () { + + var reNative = RegExp('^' + + String(toString) + .replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + .replace(/toString| for [^\]]+/g, '.*?') + '$' + ); + + var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' && + !reNative.test(setImmediate) && setImmediate, + clearImmediate = typeof (clearImmediate = freeGlobal && moduleExports && freeGlobal.clearImmediate) == 'function' && + !reNative.test(clearImmediate) && clearImmediate; + + function postMessageSupported () { + // Ensure not in a worker + if (!root.postMessage || root.importScripts) { return false; } + var isAsync = false, + oldHandler = root.onmessage; + // Test for async + root.onmessage = function () { isAsync = true; }; + root.postMessage('','*'); + root.onmessage = oldHandler; + + return isAsync; + } + + // Use in order, nextTick, setImmediate, postMessage, MessageChannel, script readystatechanged, setTimeout + if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') { + scheduleMethod = process.nextTick; + } else if (typeof setImmediate === 'function') { + scheduleMethod = setImmediate; + clearMethod = clearImmediate; + } else if (postMessageSupported()) { + var MSG_PREFIX = 'ms.rx.schedule' + Math.random(), + tasks = {}, + taskId = 0; + + function onGlobalPostMessage(event) { + // Only if we're a match to avoid any other global events + if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) { + var handleId = event.data.substring(MSG_PREFIX.length), + action = tasks[handleId]; + action(); + delete tasks[handleId]; + } + } + + if (root.addEventListener) { + root.addEventListener('message', onGlobalPostMessage, false); + } else { + root.attachEvent('onmessage', onGlobalPostMessage, false); + } + + scheduleMethod = function (action) { + var currentId = taskId++; + tasks[currentId] = action; + root.postMessage(MSG_PREFIX + currentId, '*'); + }; + } else if (!!root.MessageChannel) { + var channel = new root.MessageChannel(), + channelTasks = {}, + channelTaskId = 0; + + channel.port1.onmessage = function (event) { + var id = event.data, + action = channelTasks[id]; + action(); + delete channelTasks[id]; + }; + + scheduleMethod = function (action) { + var id = channelTaskId++; + channelTasks[id] = action; + channel.port2.postMessage(id); + }; + } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) { + + scheduleMethod = function (action) { + var scriptElement = root.document.createElement('script'); + scriptElement.onreadystatechange = function () { + action(); + scriptElement.onreadystatechange = null; + scriptElement.parentNode.removeChild(scriptElement); + scriptElement = null; + }; + root.document.documentElement.appendChild(scriptElement); + }; + + } else { + scheduleMethod = function (action) { return setTimeout(action, 0); }; + clearMethod = clearTimeout; + } + }()); + + /** + * Gets a scheduler that schedules work via a timed callback based upon platform. + */ + var timeoutScheduler = Scheduler.timeout = (function () { + + function scheduleNow(state, action) { + var scheduler = this, + disposable = new SingleAssignmentDisposable(); + var id = scheduleMethod(function () { + if (!disposable.isDisposed) { + disposable.setDisposable(action(scheduler, state)); + } + }); + return new CompositeDisposable(disposable, disposableCreate(function () { + clearMethod(id); + })); + } + + function scheduleRelative(state, dueTime, action) { + var scheduler = this, + dt = Scheduler.normalize(dueTime); + if (dt === 0) { + return scheduler.scheduleWithState(state, action); + } + var disposable = new SingleAssignmentDisposable(); + var id = setTimeout(function () { + if (!disposable.isDisposed) { + disposable.setDisposable(action(scheduler, state)); + } + }, dt); + return new CompositeDisposable(disposable, disposableCreate(function () { + clearTimeout(id); + })); + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); + } + + return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); + })(); + + /** @private */ + var CatchScheduler = (function (_super) { + + function localNow() { + return this._scheduler.now(); + } + + function scheduleNow(state, action) { + return this._scheduler.scheduleWithState(state, this._wrap(action)); + } + + function scheduleRelative(state, dueTime, action) { + return this._scheduler.scheduleWithRelativeAndState(state, dueTime, this._wrap(action)); + } + + function scheduleAbsolute(state, dueTime, action) { + return this._scheduler.scheduleWithAbsoluteAndState(state, dueTime, this._wrap(action)); + } + + inherits(CatchScheduler, _super); + + /** @private */ + function CatchScheduler(scheduler, handler) { + this._scheduler = scheduler; + this._handler = handler; + this._recursiveOriginal = null; + this._recursiveWrapper = null; + _super.call(this, localNow, scheduleNow, scheduleRelative, scheduleAbsolute); + } + + /** @private */ + CatchScheduler.prototype._clone = function (scheduler) { + return new CatchScheduler(scheduler, this._handler); + }; + + /** @private */ + CatchScheduler.prototype._wrap = function (action) { + var parent = this; + return function (self, state) { + try { + return action(parent._getRecursiveWrapper(self), state); + } catch (e) { + if (!parent._handler(e)) { throw e; } + return disposableEmpty; + } + }; + }; + + /** @private */ + CatchScheduler.prototype._getRecursiveWrapper = function (scheduler) { + if (this._recursiveOriginal !== scheduler) { + this._recursiveOriginal = scheduler; + var wrapper = this._clone(scheduler); + wrapper._recursiveOriginal = scheduler; + wrapper._recursiveWrapper = wrapper; + this._recursiveWrapper = wrapper; + } + return this._recursiveWrapper; + }; + + /** @private */ + CatchScheduler.prototype.schedulePeriodicWithState = function (state, period, action) { + var self = this, failed = false, d = new SingleAssignmentDisposable(); + + d.setDisposable(this._scheduler.schedulePeriodicWithState(state, period, function (state1) { + if (failed) { return null; } + try { + return action(state1); + } catch (e) { + failed = true; + if (!self._handler(e)) { throw e; } + d.dispose(); + return null; + } + })); + + return d; + }; + + return CatchScheduler; + }(Scheduler)); + + /** + * Represents a notification to an observer. + */ + var Notification = Rx.Notification = (function () { + function Notification(kind, hasValue) { + this.hasValue = hasValue == null ? false : hasValue; + this.kind = kind; + } + + var NotificationPrototype = Notification.prototype; + + /** + * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result. + * + * @memberOf Notification + * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on.. + * @param {Function} onError Delegate to invoke for an OnError notification. + * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification. + * @returns {Any} Result produced by the observation. + */ + NotificationPrototype.accept = function (observerOrOnNext, onError, onCompleted) { + if (arguments.length === 1 && typeof observerOrOnNext === 'object') { + return this._acceptObservable(observerOrOnNext); + } + return this._accept(observerOrOnNext, onError, onCompleted); + }; + + /** + * Returns an observable sequence with a single notification. + * + * @memberOf Notification + * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on. + * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription. + */ + NotificationPrototype.toObservable = function (scheduler) { + var notification = this; + scheduler || (scheduler = immediateScheduler); + return new AnonymousObservable(function (observer) { + return scheduler.schedule(function () { + notification._acceptObservable(observer); + if (notification.kind === 'N') { + observer.onCompleted(); + } + }); + }); + }; + + return Notification; + })(); + + /** + * Creates an object that represents an OnNext notification to an observer. + * @param {Any} value The value contained in the notification. + * @returns {Notification} The OnNext notification containing the value. + */ + var notificationCreateOnNext = Notification.createOnNext = (function () { + + function _accept (onNext) { + return onNext(this.value); + } + + function _acceptObservable(observer) { + return observer.onNext(this.value); + } + + function toString () { + return 'OnNext(' + this.value + ')'; + } + + return function (value) { + var notification = new Notification('N', true); + notification.value = value; + notification._accept = _accept; + notification._acceptObservable = _acceptObservable; + notification.toString = toString; + return notification; + }; + }()); + + /** + * Creates an object that represents an OnError notification to an observer. + * @param {Any} error The exception contained in the notification. + * @returns {Notification} The OnError notification containing the exception. + */ + var notificationCreateOnError = Notification.createOnError = (function () { + + function _accept (onNext, onError) { + return onError(this.exception); + } + + function _acceptObservable(observer) { + return observer.onError(this.exception); + } + + function toString () { + return 'OnError(' + this.exception + ')'; + } + + return function (exception) { + var notification = new Notification('E'); + notification.exception = exception; + notification._accept = _accept; + notification._acceptObservable = _acceptObservable; + notification.toString = toString; + return notification; + }; + }()); + + /** + * Creates an object that represents an OnCompleted notification to an observer. + * @returns {Notification} The OnCompleted notification. + */ + var notificationCreateOnCompleted = Notification.createOnCompleted = (function () { + + function _accept (onNext, onError, onCompleted) { + return onCompleted(); + } + + function _acceptObservable(observer) { + return observer.onCompleted(); + } + + function toString () { + return 'OnCompleted()'; + } + + return function () { + var notification = new Notification('C'); + notification._accept = _accept; + notification._acceptObservable = _acceptObservable; + notification.toString = toString; + return notification; + }; + }()); + + var Enumerator = Rx.internals.Enumerator = function (next) { + this._next = next; + }; + + Enumerator.prototype.next = function () { + return this._next(); + }; + + Enumerator.prototype[$iterator$] = function () { return this; } + + var Enumerable = Rx.internals.Enumerable = function (iterator) { + this._iterator = iterator; + }; + + Enumerable.prototype[$iterator$] = function () { + return this._iterator(); + }; + + Enumerable.prototype.concat = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var e; + try { + e = sources[$iterator$](); + } catch(err) { + observer.onError(); + return; + } + + var isDisposed, + subscription = new SerialDisposable(); + var cancelable = immediateScheduler.scheduleRecursive(function (self) { + var currentItem; + if (isDisposed) { return; } + + try { + currentItem = e.next(); + } catch (ex) { + observer.onError(ex); + return; + } + + if (currentItem.done) { + observer.onCompleted(); + return; + } + + // Check if promise + var currentValue = currentItem.value; + isPromise(currentValue) && (currentValue = observableFromPromise(currentValue)); + + var d = new SingleAssignmentDisposable(); + subscription.setDisposable(d); + d.setDisposable(currentValue.subscribe( + observer.onNext.bind(observer), + observer.onError.bind(observer), + function () { self(); }) + ); + }); + + return new CompositeDisposable(subscription, cancelable, disposableCreate(function () { + isDisposed = true; + })); + }); + }; + + Enumerable.prototype.catchException = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var e; + try { + e = sources[$iterator$](); + } catch(err) { + observer.onError(); + return; + } + + var isDisposed, + lastException, + subscription = new SerialDisposable(); + var cancelable = immediateScheduler.scheduleRecursive(function (self) { + if (isDisposed) { return; } + + var currentItem; + try { + currentItem = e.next(); + } catch (ex) { + observer.onError(ex); + return; + } + + if (currentItem.done) { + if (lastException) { + observer.onError(lastException); + } else { + observer.onCompleted(); + } + return; + } + + // Check if promise + var currentValue = currentItem.value; + isPromise(currentValue) && (currentValue = observableFromPromise(currentValue)); + + var d = new SingleAssignmentDisposable(); + subscription.setDisposable(d); + d.setDisposable(currentValue.subscribe( + observer.onNext.bind(observer), + function (exn) { + lastException = exn; + self(); + }, + observer.onCompleted.bind(observer))); + }); + return new CompositeDisposable(subscription, cancelable, disposableCreate(function () { + isDisposed = true; + })); + }); + }; + + var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) { + if (repeatCount == null) { repeatCount = -1; } + return new Enumerable(function () { + var left = repeatCount; + return new Enumerator(function () { + if (left === 0) { return doneEnumerator; } + if (left > 0) { left--; } + return { done: false, value: value }; + }); + }); + }; + + var enumerableFor = Enumerable.forEach = function (source, selector, thisArg) { + selector || (selector = identity); + return new Enumerable(function () { + var index = -1; + return new Enumerator( + function () { + return ++index < source.length ? + { done: false, value: selector.call(thisArg, source[index], index, source) } : + doneEnumerator; + }); + }); + }; + + /** + * Supports push-style iteration over an observable sequence. + */ + var Observer = Rx.Observer = function () { }; + + /** + * Creates a notification callback from an observer. + * + * @param observer Observer object. + * @returns The action that forwards its input notification to the underlying observer. + */ + Observer.prototype.toNotifier = function () { + var observer = this; + return function (n) { + return n.accept(observer); + }; + }; + + /** + * Hides the identity of an observer. + + * @returns An observer that hides the identity of the specified observer. + */ + Observer.prototype.asObserver = function () { + return new AnonymousObserver(this.onNext.bind(this), this.onError.bind(this), this.onCompleted.bind(this)); + }; + + /** + * Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods. + * If a violation is detected, an Error is thrown from the offending observer method call. + * + * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer. + */ + Observer.prototype.checked = function () { return new CheckedObserver(this); }; + + /** + * Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions. + * + * @static + * @memberOf Observer + * @param {Function} [onNext] Observer's OnNext action implementation. + * @param {Function} [onError] Observer's OnError action implementation. + * @param {Function} [onCompleted] Observer's OnCompleted action implementation. + * @returns {Observer} The observer object implemented using the given actions. + */ + var observerCreate = Observer.create = function (onNext, onError, onCompleted) { + onNext || (onNext = noop); + onError || (onError = defaultError); + onCompleted || (onCompleted = noop); + return new AnonymousObserver(onNext, onError, onCompleted); + }; + + /** + * Creates an observer from a notification callback. + * + * @static + * @memberOf Observer + * @param {Function} handler Action that handles a notification. + * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives. + */ + Observer.fromNotifier = function (handler) { + return new AnonymousObserver(function (x) { + return handler(notificationCreateOnNext(x)); + }, function (exception) { + return handler(notificationCreateOnError(exception)); + }, function () { + return handler(notificationCreateOnCompleted()); + }); + }; + + /** + * Schedules the invocation of observer methods on the given scheduler. + * @param {Scheduler} scheduler Scheduler to schedule observer messages on. + * @returns {Observer} Observer whose messages are scheduled on the given scheduler. + */ + Observer.notifyOn = function (scheduler) { + return new ObserveOnObserver(scheduler, this); + }; + + /** + * Abstract base class for implementations of the Observer class. + * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages. + */ + var AbstractObserver = Rx.internals.AbstractObserver = (function (_super) { + inherits(AbstractObserver, _super); + + /** + * Creates a new observer in a non-stopped state. + * + * @constructor + */ + function AbstractObserver() { + this.isStopped = false; + _super.call(this); + } + + /** + * Notifies the observer of a new element in the sequence. + * + * @memberOf AbstractObserver + * @param {Any} value Next element in the sequence. + */ + AbstractObserver.prototype.onNext = function (value) { + if (!this.isStopped) { + this.next(value); + } + }; + + /** + * Notifies the observer that an exception has occurred. + * + * @memberOf AbstractObserver + * @param {Any} error The error that has occurred. + */ + AbstractObserver.prototype.onError = function (error) { + if (!this.isStopped) { + this.isStopped = true; + this.error(error); + } + }; + + /** + * Notifies the observer of the end of the sequence. + */ + AbstractObserver.prototype.onCompleted = function () { + if (!this.isStopped) { + this.isStopped = true; + this.completed(); + } + }; + + /** + * Disposes the observer, causing it to transition to the stopped state. + */ + AbstractObserver.prototype.dispose = function () { + this.isStopped = true; + }; + + AbstractObserver.prototype.fail = function (e) { + if (!this.isStopped) { + this.isStopped = true; + this.error(e); + return true; + } + + return false; + }; + + return AbstractObserver; + }(Observer)); + + /** + * Class to create an Observer instance from delegate-based implementations of the on* methods. + */ + var AnonymousObserver = Rx.AnonymousObserver = (function (_super) { + inherits(AnonymousObserver, _super); + + /** + * Creates an observer from the specified OnNext, OnError, and OnCompleted actions. + * @param {Any} onNext Observer's OnNext action implementation. + * @param {Any} onError Observer's OnError action implementation. + * @param {Any} onCompleted Observer's OnCompleted action implementation. + */ + function AnonymousObserver(onNext, onError, onCompleted) { + _super.call(this); + this._onNext = onNext; + this._onError = onError; + this._onCompleted = onCompleted; + } + + /** + * Calls the onNext action. + * @param {Any} value Next element in the sequence. + */ + AnonymousObserver.prototype.next = function (value) { + this._onNext(value); + }; + + /** + * Calls the onError action. + * @param {Any} error The error that has occurred. + */ + AnonymousObserver.prototype.error = function (exception) { + this._onError(exception); + }; + + /** + * Calls the onCompleted action. + */ + AnonymousObserver.prototype.completed = function () { + this._onCompleted(); + }; + + return AnonymousObserver; + }(AbstractObserver)); + + var CheckedObserver = (function (_super) { + inherits(CheckedObserver, _super); + + function CheckedObserver(observer) { + _super.call(this); + this._observer = observer; + this._state = 0; // 0 - idle, 1 - busy, 2 - done + } + + var CheckedObserverPrototype = CheckedObserver.prototype; + + CheckedObserverPrototype.onNext = function (value) { + this.checkAccess(); + try { + this._observer.onNext(value); + } catch (e) { + throw e; + } finally { + this._state = 0; + } + }; + + CheckedObserverPrototype.onError = function (err) { + this.checkAccess(); + try { + this._observer.onError(err); + } catch (e) { + throw e; + } finally { + this._state = 2; + } + }; + + CheckedObserverPrototype.onCompleted = function () { + this.checkAccess(); + try { + this._observer.onCompleted(); + } catch (e) { + throw e; + } finally { + this._state = 2; + } + }; + + CheckedObserverPrototype.checkAccess = function () { + if (this._state === 1) { throw new Error('Re-entrancy detected'); } + if (this._state === 2) { throw new Error('Observer completed'); } + if (this._state === 0) { this._state = 1; } + }; + + return CheckedObserver; + }(Observer)); + + var ScheduledObserver = Rx.internals.ScheduledObserver = (function (_super) { + inherits(ScheduledObserver, _super); + + function ScheduledObserver(scheduler, observer) { + _super.call(this); + this.scheduler = scheduler; + this.observer = observer; + this.isAcquired = false; + this.hasFaulted = false; + this.queue = []; + this.disposable = new SerialDisposable(); + } + + ScheduledObserver.prototype.next = function (value) { + var self = this; + this.queue.push(function () { + self.observer.onNext(value); + }); + }; + + ScheduledObserver.prototype.error = function (exception) { + var self = this; + this.queue.push(function () { + self.observer.onError(exception); + }); + }; + + ScheduledObserver.prototype.completed = function () { + var self = this; + this.queue.push(function () { + self.observer.onCompleted(); + }); + }; + + ScheduledObserver.prototype.ensureActive = function () { + var isOwner = false, parent = this; + if (!this.hasFaulted && this.queue.length > 0) { + isOwner = !this.isAcquired; + this.isAcquired = true; + } + if (isOwner) { + this.disposable.setDisposable(this.scheduler.scheduleRecursive(function (self) { + var work; + if (parent.queue.length > 0) { + work = parent.queue.shift(); + } else { + parent.isAcquired = false; + return; + } + try { + work(); + } catch (ex) { + parent.queue = []; + parent.hasFaulted = true; + throw ex; + } + self(); + })); + } + }; + + ScheduledObserver.prototype.dispose = function () { + _super.prototype.dispose.call(this); + this.disposable.dispose(); + }; + + return ScheduledObserver; + }(AbstractObserver)); + + /** @private */ + var ObserveOnObserver = (function (_super) { + inherits(ObserveOnObserver, _super); + + /** @private */ + function ObserveOnObserver() { + _super.apply(this, arguments); + } + + /** @private */ + ObserveOnObserver.prototype.next = function (value) { + _super.prototype.next.call(this, value); + this.ensureActive(); + }; + + /** @private */ + ObserveOnObserver.prototype.error = function (e) { + _super.prototype.error.call(this, e); + this.ensureActive(); + }; + + /** @private */ + ObserveOnObserver.prototype.completed = function () { + _super.prototype.completed.call(this); + this.ensureActive(); + }; + + return ObserveOnObserver; + })(ScheduledObserver); + + var observableProto; + + /** + * Represents a push-style collection. + */ + var Observable = Rx.Observable = (function () { + + function Observable(subscribe) { + this._subscribe = subscribe; + } + + observableProto = Observable.prototype; + + /** + * Subscribes an observer to the observable sequence. + * + * @example + * 1 - source.subscribe(); + * 2 - source.subscribe(observer); + * 3 - source.subscribe(function (x) { console.log(x); }); + * 4 - source.subscribe(function (x) { console.log(x); }, function (err) { console.log(err); }); + * 5 - source.subscribe(function (x) { console.log(x); }, function (err) { console.log(err); }, function () { console.log('done'); }); + * @param {Mixed} [observerOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence. + * @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence. + * @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence. + * @returns {Diposable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler. + */ + observableProto.subscribe = observableProto.forEach = function (observerOrOnNext, onError, onCompleted) { + var subscriber = typeof observerOrOnNext === 'object' ? + observerOrOnNext : + observerCreate(observerOrOnNext, onError, onCompleted); + + return this._subscribe(subscriber); + }; + + return Observable; + })(); + + /** + * Wraps the source sequence in order to run its observer callbacks on the specified scheduler. + * + * This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects + * that require to be run on a scheduler, use subscribeOn. + * + * @param {Scheduler} scheduler Scheduler to notify observers on. + * @returns {Observable} The source sequence whose observations happen on the specified scheduler. + */ + observableProto.observeOn = function (scheduler) { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(new ObserveOnObserver(scheduler, observer)); + }); + }; + + /** + * Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used; + * see the remarks section for more information on the distinction between subscribeOn and observeOn. + + * This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer + * callbacks on a scheduler, use observeOn. + + * @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on. + * @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler. + */ + observableProto.subscribeOn = function (scheduler) { + var source = this; + return new AnonymousObservable(function (observer) { + var m = new SingleAssignmentDisposable(), d = new SerialDisposable(); + d.setDisposable(m); + m.setDisposable(scheduler.schedule(function () { + d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(observer))); + })); + return d; + }); + }; + + /** + * Converts a Promise to an Observable sequence + * @param {Promise} An ES6 Compliant promise. + * @returns {Observable} An Observable sequence which wraps the existing promise success and failure. + */ + var observableFromPromise = Observable.fromPromise = function (promise) { + return new AnonymousObservable(function (observer) { + promise.then( + function (value) { + observer.onNext(value); + observer.onCompleted(); + }, + function (reason) { + observer.onError(reason); + }); + + return function () { + if (promise && promise.abort) { + promise.abort(); + } + } + }); + }; + /* + * Converts an existing observable sequence to an ES6 Compatible Promise + * @example + * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise); + * + * // With config + * Rx.config.Promise = RSVP.Promise; + * var promise = Rx.Observable.return(42).toPromise(); + * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise. + * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence. + */ + observableProto.toPromise = function (promiseCtor) { + promiseCtor || (promiseCtor = Rx.config.Promise); + if (!promiseCtor) { + throw new Error('Promise type not provided nor in Rx.config.Promise'); + } + var source = this; + return new promiseCtor(function (resolve, reject) { + // No cancellation can be done + var value, hasValue = false; + source.subscribe(function (v) { + value = v; + hasValue = true; + }, function (err) { + reject(err); + }, function () { + if (hasValue) { + resolve(value); + } + }); + }); + }; + /** + * Creates a list from an observable sequence. + * @returns An observable sequence containing a single element with a list containing all the elements of the source sequence. + */ + observableProto.toArray = function () { + var self = this; + return new AnonymousObservable(function(observer) { + var arr = []; + return self.subscribe( + arr.push.bind(arr), + observer.onError.bind(observer), + function () { + observer.onNext(arr); + observer.onCompleted(); + }); + }); + }; + + /** + * Creates an observable sequence from a specified subscribe method implementation. + * + * @example + * var res = Rx.Observable.create(function (observer) { return function () { } ); + * var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } ); + * var res = Rx.Observable.create(function (observer) { } ); + * + * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable. + * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method. + */ + Observable.create = Observable.createWithDisposable = function (subscribe) { + return new AnonymousObservable(subscribe); + }; + + /** + * Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes. + * + * @example + * var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); }); + * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise. + * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function. + */ + var observableDefer = Observable.defer = function (observableFactory) { + return new AnonymousObservable(function (observer) { + var result; + try { + result = observableFactory(); + } catch (e) { + return observableThrow(e).subscribe(observer); + } + isPromise(result) && (result = observableFromPromise(result)); + return result.subscribe(observer); + }); + }; + + /** + * Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message. + * + * @example + * var res = Rx.Observable.empty(); + * var res = Rx.Observable.empty(Rx.Scheduler.timeout); + * @param {Scheduler} [scheduler] Scheduler to send the termination call on. + * @returns {Observable} An observable sequence with no elements. + */ + var observableEmpty = Observable.empty = function (scheduler) { + scheduler || (scheduler = immediateScheduler); + return new AnonymousObservable(function (observer) { + return scheduler.schedule(function () { + observer.onCompleted(); + }); + }); + }; + + /** + * Converts an array to an observable sequence, using an optional scheduler to enumerate the array. + * + * @example + * var res = Rx.Observable.fromArray([1,2,3]); + * var res = Rx.Observable.fromArray([1,2,3], Rx.Scheduler.timeout); + * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on. + * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence. + */ + var observableFromArray = Observable.fromArray = function (array, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + return new AnonymousObservable(function (observer) { + var count = 0, len = array.length; + return scheduler.scheduleRecursive(function (self) { + if (count < len) { + observer.onNext(array[count++]); + self(); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * Converts an iterable into an Observable sequence + * + * @example + * var res = Rx.Observable.fromIterable(new Map()); + * var res = Rx.Observable.fromIterable(new Set(), Rx.Scheduler.timeout); + * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on. + * @returns {Observable} The observable sequence whose elements are pulled from the given generator sequence. + */ + Observable.fromIterable = function (iterable, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + return new AnonymousObservable(function (observer) { + var iterator; + try { + iterator = iterable[$iterator$](); + } catch (e) { + observer.onError(e); + return; + } + + return scheduler.scheduleRecursive(function (self) { + var next; + try { + next = iterator.next(); + } catch (err) { + observer.onError(err); + return; + } + + if (next.done) { + observer.onCompleted(); + } else { + observer.onNext(next.value); + self(); + } + }); + }); + }; + + /** + * Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages. + * + * @example + * var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }); + * var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout); + * @param {Mixed} initialState Initial state. + * @param {Function} condition Condition to terminate generation (upon returning false). + * @param {Function} iterate Iteration step function. + * @param {Function} resultSelector Selector function for results produced in the sequence. + * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread. + * @returns {Observable} The generated sequence. + */ + Observable.generate = function (initialState, condition, iterate, resultSelector, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + return new AnonymousObservable(function (observer) { + var first = true, state = initialState; + return scheduler.scheduleRecursive(function (self) { + var hasResult, result; + try { + if (first) { + first = false; + } else { + state = iterate(state); + } + hasResult = condition(state); + if (hasResult) { + result = resultSelector(state); + } + } catch (exception) { + observer.onError(exception); + return; + } + if (hasResult) { + observer.onNext(result); + self(); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins). + * @returns {Observable} An observable sequence whose observers will never get called. + */ + var observableNever = Observable.never = function () { + return new AnonymousObservable(function () { + return disposableEmpty; + }); + }; + + /** + * This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments. + * @example + * var res = Rx.Observable.of(1,2,3); + * @returns {Observable} The observable sequence whose elements are pulled from the given arguments. + */ + Observable.of = function () { + var len = arguments.length, args = new Array(len); + for(var i = 0; i < len; i++) { args[i] = arguments[i]; } + return observableFromArray(args); + }; + + /** + * This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments. + * @example + * var res = Rx.Observable.of(1,2,3); + * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments. + * @returns {Observable} The observable sequence whose elements are pulled from the given arguments. + */ + var observableOf = Observable.ofWithScheduler = function (scheduler) { + var len = arguments.length - 1, args = new Array(len); + for(var i = 0; i < len; i++) { args[i] = arguments[i + 1]; } + return observableFromArray(args, scheduler); + }; + + /** + * Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages. + * + * @example + * var res = Rx.Observable.range(0, 10); + * var res = Rx.Observable.range(0, 10, Rx.Scheduler.timeout); + * @param {Number} start The value of the first integer in the sequence. + * @param {Number} count The number of sequential integers to generate. + * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread. + * @returns {Observable} An observable sequence that contains a range of sequential integral numbers. + */ + Observable.range = function (start, count, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + return new AnonymousObservable(function (observer) { + return scheduler.scheduleRecursiveWithState(0, function (i, self) { + if (i < count) { + observer.onNext(start + i); + self(i + 1); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages. + * + * @example + * var res = Rx.Observable.repeat(42); + * var res = Rx.Observable.repeat(42, 4); + * 3 - res = Rx.Observable.repeat(42, 4, Rx.Scheduler.timeout); + * 4 - res = Rx.Observable.repeat(42, null, Rx.Scheduler.timeout); + * @param {Mixed} value Element to repeat. + * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely. + * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate. + * @returns {Observable} An observable sequence that repeats the given element the specified number of times. + */ + Observable.repeat = function (value, repeatCount, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + if (repeatCount == null) { + repeatCount = -1; + } + return observableReturn(value, scheduler).repeat(repeatCount); + }; + + /** + * Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages. + * There is an alias called 'just', and 'returnValue' for browsers 0) { + s = q.shift(); + subscribe(s); + } else { + activeCount--; + if (isStopped && activeCount === 0) { + observer.onCompleted(); + } + } + })); + }; + group.add(sources.subscribe(function (innerSource) { + if (activeCount < maxConcurrentOrOther) { + activeCount++; + subscribe(innerSource); + } else { + q.push(innerSource); + } + }, observer.onError.bind(observer), function () { + isStopped = true; + if (activeCount === 0) { + observer.onCompleted(); + } + })); + return group; + }); + }; + + /** + * Merges all the observable sequences into a single observable sequence. + * The scheduler is optional and if not specified, the immediate scheduler is used. + * + * @example + * 1 - merged = Rx.Observable.merge(xs, ys, zs); + * 2 - merged = Rx.Observable.merge([xs, ys, zs]); + * 3 - merged = Rx.Observable.merge(scheduler, xs, ys, zs); + * 4 - merged = Rx.Observable.merge(scheduler, [xs, ys, zs]); + * @returns {Observable} The observable sequence that merges the elements of the observable sequences. + */ + var observableMerge = Observable.merge = function () { + var scheduler, sources; + if (!arguments[0]) { + scheduler = immediateScheduler; + sources = slice.call(arguments, 1); + } else if (arguments[0].now) { + scheduler = arguments[0]; + sources = slice.call(arguments, 1); + } else { + scheduler = immediateScheduler; + sources = slice.call(arguments, 0); + } + if (Array.isArray(sources[0])) { + sources = sources[0]; + } + return observableFromArray(sources, scheduler).mergeObservable(); + }; + + /** + * Merges an observable sequence of observable sequences into an observable sequence. + * @returns {Observable} The observable sequence that merges the elements of the inner sequences. + */ + observableProto.mergeObservable = observableProto.mergeAll =function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var group = new CompositeDisposable(), + isStopped = false, + m = new SingleAssignmentDisposable(); + + group.add(m); + m.setDisposable(sources.subscribe(function (innerSource) { + var innerSubscription = new SingleAssignmentDisposable(); + group.add(innerSubscription); + + // Check if Promise or Observable + if (isPromise(innerSource)) { + innerSource = observableFromPromise(innerSource); + } + + innerSubscription.setDisposable(innerSource.subscribe(function (x) { + observer.onNext(x); + }, observer.onError.bind(observer), function () { + group.remove(innerSubscription); + if (isStopped && group.length === 1) { observer.onCompleted(); } + })); + }, observer.onError.bind(observer), function () { + isStopped = true; + if (group.length === 1) { observer.onCompleted(); } + })); + return group; + }); + }; + + /** + * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence. + * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates. + * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally. + */ + observableProto.onErrorResumeNext = function (second) { + if (!second) { + throw new Error('Second observable is required'); + } + return onErrorResumeNext([this, second]); + }; + + /** + * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence. + * + * @example + * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs); + * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]); + * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally. + */ + var onErrorResumeNext = Observable.onErrorResumeNext = function () { + var sources = argsOrArray(arguments, 0); + return new AnonymousObservable(function (observer) { + var pos = 0, subscription = new SerialDisposable(), + cancelable = immediateScheduler.scheduleRecursive(function (self) { + var current, d; + if (pos < sources.length) { + current = sources[pos++]; + isPromise(current) && (current = observableFromPromise(current)); + d = new SingleAssignmentDisposable(); + subscription.setDisposable(d); + d.setDisposable(current.subscribe(observer.onNext.bind(observer), function () { + self(); + }, function () { + self(); + })); + } else { + observer.onCompleted(); + } + }); + return new CompositeDisposable(subscription, cancelable); + }); + }; + + /** + * Returns the values from the source observable sequence only after the other observable sequence produces a value. + * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence. + * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation. + */ + observableProto.skipUntil = function (other) { + var source = this; + return new AnonymousObservable(function (observer) { + var isOpen = false; + var disposables = new CompositeDisposable(source.subscribe(function (left) { + isOpen && observer.onNext(left); + }, observer.onError.bind(observer), function () { + isOpen && observer.onCompleted(); + })); + + isPromise(other) && (other = observableFromPromise(other)); + + var rightSubscription = new SingleAssignmentDisposable(); + disposables.add(rightSubscription); + rightSubscription.setDisposable(other.subscribe(function () { + isOpen = true; + rightSubscription.dispose(); + }, observer.onError.bind(observer), function () { + rightSubscription.dispose(); + })); + + return disposables; + }); + }; + + /** + * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence. + * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received. + */ + observableProto['switch'] = observableProto.switchLatest = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var hasLatest = false, + innerSubscription = new SerialDisposable(), + isStopped = false, + latest = 0, + subscription = sources.subscribe(function (innerSource) { + var d = new SingleAssignmentDisposable(), id = ++latest; + hasLatest = true; + innerSubscription.setDisposable(d); + + // Check if Promise or Observable + if (isPromise(innerSource)) { + innerSource = observableFromPromise(innerSource); + } + + d.setDisposable(innerSource.subscribe(function (x) { + if (latest === id) { + observer.onNext(x); + } + }, function (e) { + if (latest === id) { + observer.onError(e); + } + }, function () { + if (latest === id) { + hasLatest = false; + if (isStopped) { + observer.onCompleted(); + } + } + })); + }, observer.onError.bind(observer), function () { + isStopped = true; + if (!hasLatest) { + observer.onCompleted(); + } + }); + return new CompositeDisposable(subscription, innerSubscription); + }); + }; + + /** + * Returns the values from the source observable sequence until the other observable sequence produces a value. + * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence. + * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation. + */ + observableProto.takeUntil = function (other) { + var source = this; + return new AnonymousObservable(function (observer) { + isPromise(other) && (other = observableFromPromise(other)); + return new CompositeDisposable( + source.subscribe(observer), + other.subscribe(observer.onCompleted.bind(observer), observer.onError.bind(observer), noop) + ); + }); + }; + + function zipArray(second, resultSelector) { + var first = this; + return new AnonymousObservable(function (observer) { + var index = 0, len = second.length; + return first.subscribe(function (left) { + if (index < len) { + var right = second[index++], result; + try { + result = resultSelector(left, right); + } catch (e) { + observer.onError(e); + return; + } + observer.onNext(result); + } else { + observer.onCompleted(); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + } + + /** + * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index. + * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the sources. + * + * @example + * 1 - res = obs1.zip(obs2, fn); + * 1 - res = x1.zip([1,2,3], fn); + * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + observableProto.zip = function () { + if (Array.isArray(arguments[0])) { + return zipArray.apply(this, arguments); + } + var parent = this, sources = slice.call(arguments), resultSelector = sources.pop(); + sources.unshift(parent); + return new AnonymousObservable(function (observer) { + var n = sources.length, + queues = arrayInitialize(n, function () { return []; }), + isDone = arrayInitialize(n, function () { return false; }); + + function next(i) { + var res, queuedValues; + if (queues.every(function (x) { return x.length > 0; })) { + try { + queuedValues = queues.map(function (x) { return x.shift(); }); + res = resultSelector.apply(parent, queuedValues); + } catch (ex) { + observer.onError(ex); + return; + } + observer.onNext(res); + } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) { + observer.onCompleted(); + } + }; + + function done(i) { + isDone[i] = true; + if (isDone.every(function (x) { return x; })) { + observer.onCompleted(); + } + } + + var subscriptions = new Array(n); + for (var idx = 0; idx < n; idx++) { + (function (i) { + var source = sources[i], sad = new SingleAssignmentDisposable(); + isPromise(source) && (source = observableFromPromise(source)); + sad.setDisposable(source.subscribe(function (x) { + queues[i].push(x); + next(i); + }, observer.onError.bind(observer), function () { + done(i); + })); + subscriptions[i] = sad; + })(idx); + } + + return new CompositeDisposable(subscriptions); + }); + }; + /** + * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. + * @param arguments Observable sources. + * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources. + * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + Observable.zip = function () { + var args = slice.call(arguments, 0), + first = args.shift(); + return first.zip.apply(first, args); + }; + + /** + * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes. + * @param arguments Observable sources. + * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes. + */ + Observable.zipArray = function () { + var sources = argsOrArray(arguments, 0); + return new AnonymousObservable(function (observer) { + var n = sources.length, + queues = arrayInitialize(n, function () { return []; }), + isDone = arrayInitialize(n, function () { return false; }); + + function next(i) { + if (queues.every(function (x) { return x.length > 0; })) { + var res = queues.map(function (x) { return x.shift(); }); + observer.onNext(res); + } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) { + observer.onCompleted(); + return; + } + }; + + function done(i) { + isDone[i] = true; + if (isDone.every(identity)) { + observer.onCompleted(); + return; + } + } + + var subscriptions = new Array(n); + for (var idx = 0; idx < n; idx++) { + (function (i) { + subscriptions[i] = new SingleAssignmentDisposable(); + subscriptions[i].setDisposable(sources[i].subscribe(function (x) { + queues[i].push(x); + next(i); + }, observer.onError.bind(observer), function () { + done(i); + })); + })(idx); + } + + var compositeDisposable = new CompositeDisposable(subscriptions); + compositeDisposable.add(disposableCreate(function () { + for (var qIdx = 0, qLen = queues.length; qIdx < qLen; qIdx++) { + queues[qIdx] = []; + } + })); + return compositeDisposable; + }); + }; + + /** + * Hides the identity of an observable sequence. + * @returns {Observable} An observable sequence that hides the identity of the source sequence. + */ + observableProto.asObservable = function () { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(observer); + }); + }; + + /** + * Projects each element of an observable sequence into zero or more buffers which are produced based on element count information. + * + * @example + * var res = xs.bufferWithCount(10); + * var res = xs.bufferWithCount(10, 1); + * @param {Number} count Length of each buffer. + * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count. + * @returns {Observable} An observable sequence of buffers. + */ + observableProto.bufferWithCount = function (count, skip) { + if (typeof skip !== 'number') { + skip = count; + } + return this.windowWithCount(count, skip).selectMany(function (x) { + return x.toArray(); + }).where(function (x) { + return x.length > 0; + }); + }; + + /** + * Dematerializes the explicit notification values of an observable sequence as implicit notifications. + * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values. + */ + observableProto.dematerialize = function () { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(function (x) { + return x.accept(observer); + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer. + * + * var obs = observable.distinctUntilChanged(); + * var obs = observable.distinctUntilChanged(function (x) { return x.id; }); + * var obs = observable.distinctUntilChanged(function (x) { return x.id; }, function (x, y) { return x === y; }); + * + * @param {Function} [keySelector] A function to compute the comparison key for each element. If not provided, it projects the value. + * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function. + * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence. + */ + observableProto.distinctUntilChanged = function (keySelector, comparer) { + var source = this; + keySelector || (keySelector = identity); + comparer || (comparer = defaultComparer); + return new AnonymousObservable(function (observer) { + var hasCurrentKey = false, currentKey; + return source.subscribe(function (value) { + var comparerEquals = false, key; + try { + key = keySelector(value); + } catch (exception) { + observer.onError(exception); + return; + } + if (hasCurrentKey) { + try { + comparerEquals = comparer(currentKey, key); + } catch (exception) { + observer.onError(exception); + return; + } + } + if (!hasCurrentKey || !comparerEquals) { + hasCurrentKey = true; + currentKey = key; + observer.onNext(value); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence. + * This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline. + * + * @example + * var res = observable.doAction(observer); + * var res = observable.doAction(onNext); + * var res = observable.doAction(onNext, onError); + * var res = observable.doAction(onNext, onError, onCompleted); + * @param {Mixed} observerOrOnNext Action to invoke for each element in the observable sequence or an observer. + * @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function. + * @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function. + * @returns {Observable} The source sequence with the side-effecting behavior applied. + */ + observableProto['do'] = observableProto.doAction = function (observerOrOnNext, onError, onCompleted) { + var source = this, onNextFunc; + if (typeof observerOrOnNext === 'function') { + onNextFunc = observerOrOnNext; + } else { + onNextFunc = observerOrOnNext.onNext.bind(observerOrOnNext); + onError = observerOrOnNext.onError.bind(observerOrOnNext); + onCompleted = observerOrOnNext.onCompleted.bind(observerOrOnNext); + } + return new AnonymousObservable(function (observer) { + return source.subscribe(function (x) { + try { + onNextFunc(x); + } catch (e) { + observer.onError(e); + } + observer.onNext(x); + }, function (exception) { + if (!onError) { + observer.onError(exception); + } else { + try { + onError(exception); + } catch (e) { + observer.onError(e); + } + observer.onError(exception); + } + }, function () { + if (!onCompleted) { + observer.onCompleted(); + } else { + try { + onCompleted(); + } catch (e) { + observer.onError(e); + } + observer.onCompleted(); + } + }); + }); + }; + + /** + * Invokes a specified action after the source observable sequence terminates gracefully or exceptionally. + * + * @example + * var res = observable.finallyAction(function () { console.log('sequence ended'; }); + * @param {Function} finallyAction Action to invoke after the source observable sequence terminates. + * @returns {Observable} Source sequence with the action-invoking termination behavior applied. + */ + observableProto['finally'] = observableProto.finallyAction = function (action) { + var source = this; + return new AnonymousObservable(function (observer) { + var subscription; + try { + subscription = source.subscribe(observer); + } catch (e) { + action(); + throw e; + } + return disposableCreate(function () { + try { + subscription.dispose(); + } catch (e) { + throw e; + } finally { + action(); + } + }); + }); + }; + + /** + * Ignores all elements in an observable sequence leaving only the termination messages. + * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence. + */ + observableProto.ignoreElements = function () { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(noop, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Materializes the implicit notifications of an observable sequence as explicit notification values. + * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence. + */ + observableProto.materialize = function () { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(function (value) { + observer.onNext(notificationCreateOnNext(value)); + }, function (e) { + observer.onNext(notificationCreateOnError(e)); + observer.onCompleted(); + }, function () { + observer.onNext(notificationCreateOnCompleted()); + observer.onCompleted(); + }); + }); + }; + + /** + * Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely. + * + * @example + * var res = repeated = source.repeat(); + * var res = repeated = source.repeat(42); + * @param {Number} [repeatCount] Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely. + * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly. + */ + observableProto.repeat = function (repeatCount) { + return enumerableRepeat(this, repeatCount).concat(); + }; + + /** + * Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely. + * + * @example + * var res = retried = retry.repeat(); + * var res = retried = retry.repeat(42); + * @param {Number} [retryCount] Number of times to retry the sequence. If not provided, retry the sequence indefinitely. + * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully. + */ + observableProto.retry = function (retryCount) { + return enumerableRepeat(this, retryCount).catchException(); + }; + + /** + * Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value. + * For aggregation behavior with no intermediate results, see Observable.aggregate. + * @example + * var res = source.scan(function (acc, x) { return acc + x; }); + * var res = source.scan(0, function (acc, x) { return acc + x; }); + * @param {Mixed} [seed] The initial accumulator value. + * @param {Function} accumulator An accumulator function to be invoked on each element. + * @returns {Observable} An observable sequence containing the accumulated values. + */ + observableProto.scan = function () { + var hasSeed = false, seed, accumulator, source = this; + if (arguments.length === 2) { + hasSeed = true; + seed = arguments[0]; + accumulator = arguments[1]; + } else { + accumulator = arguments[0]; + } + return new AnonymousObservable(function (observer) { + var hasAccumulation, accumulation, hasValue; + return source.subscribe ( + function (x) { + try { + if (!hasValue) { + hasValue = true; + } + + if (hasAccumulation) { + accumulation = accumulator(accumulation, x); + } else { + accumulation = hasSeed ? accumulator(seed, x) : x; + hasAccumulation = true; + } + } catch (e) { + observer.onError(e); + return; + } + + observer.onNext(accumulation); + }, + observer.onError.bind(observer), + function () { + if (!hasValue && hasSeed) { + observer.onNext(seed); + } + observer.onCompleted(); + } + ); + }); + }; + + /** + * Bypasses a specified number of elements at the end of an observable sequence. + * @description + * This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are + * received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed. + * @param count Number of elements to bypass at the end of the source sequence. + * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end. + */ + observableProto.skipLast = function (count) { + var source = this; + return new AnonymousObservable(function (observer) { + var q = []; + return source.subscribe(function (x) { + q.push(x); + if (q.length > count) { + observer.onNext(q.shift()); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend. + * + * var res = source.startWith(1, 2, 3); + * var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3); + * + * @memberOf Observable# + * @returns {Observable} The source sequence prepended with the specified values. + */ + observableProto.startWith = function () { + var values, scheduler, start = 0; + if (!!arguments.length && 'now' in Object(arguments[0])) { + scheduler = arguments[0]; + start = 1; + } else { + scheduler = immediateScheduler; + } + values = slice.call(arguments, start); + return enumerableFor([observableFromArray(values, scheduler), this]).concat(); + }; + + /** + * Returns a specified number of contiguous elements from the end of an observable sequence, using an optional scheduler to drain the queue. + * + * @example + * var res = source.takeLast(5); + * var res = source.takeLast(5, Rx.Scheduler.timeout); + * + * @description + * This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of + * the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed. + * @param {Number} count Number of elements to take from the end of the source sequence. + * @param {Scheduler} [scheduler] Scheduler used to drain the queue upon completion of the source sequence. + * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence. + */ + observableProto.takeLast = function (count, scheduler) { + return this.takeLastBuffer(count).selectMany(function (xs) { return observableFromArray(xs, scheduler); }); + }; + + /** + * Returns an array with the specified number of contiguous elements from the end of an observable sequence. + * + * @description + * This operator accumulates a buffer with a length enough to store count elements. Upon completion of the + * source sequence, this buffer is produced on the result sequence. + * @param {Number} count Number of elements to take from the end of the source sequence. + * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence. + */ + observableProto.takeLastBuffer = function (count) { + var source = this; + return new AnonymousObservable(function (observer) { + var q = []; + return source.subscribe(function (x) { + q.push(x); + if (q.length > count) { + q.shift(); + } + }, observer.onError.bind(observer), function () { + observer.onNext(q); + observer.onCompleted(); + }); + }); + }; + + /** + * Projects each element of an observable sequence into zero or more windows which are produced based on element count information. + * + * var res = xs.windowWithCount(10); + * var res = xs.windowWithCount(10, 1); + * @param {Number} count Length of each window. + * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count. + * @returns {Observable} An observable sequence of windows. + */ + observableProto.windowWithCount = function (count, skip) { + var source = this; + if (count <= 0) { + throw new Error(argumentOutOfRange); + } + if (arguments.length === 1) { + skip = count; + } + if (skip <= 0) { + throw new Error(argumentOutOfRange); + } + return new AnonymousObservable(function (observer) { + var m = new SingleAssignmentDisposable(), + refCountDisposable = new RefCountDisposable(m), + n = 0, + q = [], + createWindow = function () { + var s = new Subject(); + q.push(s); + observer.onNext(addRef(s, refCountDisposable)); + }; + createWindow(); + m.setDisposable(source.subscribe(function (x) { + var s; + for (var i = 0, len = q.length; i < len; i++) { + q[i].onNext(x); + } + var c = n - count + 1; + if (c >= 0 && c % skip === 0) { + s = q.shift(); + s.onCompleted(); + } + n++; + if (n % skip === 0) { + createWindow(); + } + }, function (exception) { + while (q.length > 0) { + q.shift().onError(exception); + } + observer.onError(exception); + }, function () { + while (q.length > 0) { + q.shift().onCompleted(); + } + observer.onCompleted(); + })); + return refCountDisposable; + }); + }; + + function concatMap(selector) { + return this.map(function (x, i) { + var result = selector(x, i); + return isPromise(result) ? observableFromPromise(result) : result; + }).concatAll(); + } + + function concatMapObserver(onNext, onError, onCompleted) { + var source = this; + return new AnonymousObservable(function (observer) { + var index = 0; + + return source.subscribe( + function (x) { + observer.onNext(onNext(x, index++)); + }, + function (err) { + observer.onNext(onError(err)); + observer.completed(); + }, + function () { + observer.onNext(onCompleted()); + observer.onCompleted(); + }); + }).concatAll(); + } + + /** + * One of the Following: + * Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence. + * + * @example + * var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }); + * Or: + * Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence. + * + * var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; }); + * Or: + * Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence. + * + * var res = source.selectMany(Rx.Observable.fromArray([1,2,3])); + * @param selector A transform function to apply to each element or an observable sequence to project each element from the + * source sequence onto which could be either an observable or Promise. + * @param {Function} [resultSelector] A transform function to apply to each element of the intermediate sequence. + * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element. + */ + observableProto.selectConcat = observableProto.concatMap = function (selector, resultSelector) { + if (resultSelector) { + return this.concatMap(function (x, i) { + var selectorResult = selector(x, i), + result = isPromise(selectorResult) ? observableFromPromise(selectorResult) : selectorResult; + + return result.map(function (y) { + return resultSelector(x, y, i); + }); + }); + } + if (typeof selector === 'function') { + return concatMap.call(this, selector); + } + return concatMap.call(this, function () { + return selector; + }); + }; + + /** + * Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty. + * + * var res = obs = xs.defaultIfEmpty(); + * 2 - obs = xs.defaultIfEmpty(false); + * + * @memberOf Observable# + * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null. + * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself. + */ + observableProto.defaultIfEmpty = function (defaultValue) { + var source = this; + if (defaultValue === undefined) { + defaultValue = null; + } + return new AnonymousObservable(function (observer) { + var found = false; + return source.subscribe(function (x) { + found = true; + observer.onNext(x); + }, observer.onError.bind(observer), function () { + if (!found) { + observer.onNext(defaultValue); + } + observer.onCompleted(); + }); + }); + }; + + /** + * Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer. + * Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large. + * + * @example + * var res = obs = xs.distinct(); + * 2 - obs = xs.distinct(function (x) { return x.id; }); + * 2 - obs = xs.distinct(function (x) { return x.id; }, function (x) { return x.toString(); }); + * @param {Function} [keySelector] A function to compute the comparison key for each element. + * @param {Function} [keySerializer] Used to serialize the given object into a string for object comparison. + * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence. + */ + observableProto.distinct = function (keySelector, keySerializer) { + var source = this; + keySelector || (keySelector = identity); + keySerializer || (keySerializer = defaultKeySerializer); + return new AnonymousObservable(function (observer) { + var hashSet = {}; + return source.subscribe(function (x) { + var key, serializedKey, otherKey, hasMatch = false; + try { + key = keySelector(x); + serializedKey = keySerializer(key); + } catch (exception) { + observer.onError(exception); + return; + } + for (otherKey in hashSet) { + if (serializedKey === otherKey) { + hasMatch = true; + break; + } + } + if (!hasMatch) { + hashSet[serializedKey] = null; + observer.onNext(x); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function. + * + * @example + * var res = observable.groupBy(function (x) { return x.id; }); + * 2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }); + * 3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); }); + * @param {Function} keySelector A function to extract the key for each element. + * @param {Function} [elementSelector] A function to map each source element to an element in an observable group. + * @param {Function} [keySerializer] Used to serialize the given object into a string for object comparison. + * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value. + */ + observableProto.groupBy = function (keySelector, elementSelector, keySerializer) { + return this.groupByUntil(keySelector, elementSelector, function () { + return observableNever(); + }, keySerializer); + }; + + /** + * Groups the elements of an observable sequence according to a specified key selector function. + * A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same + * key value as a reclaimed group occurs, the group will be reborn with a new lifetime request. + * + * @example + * var res = observable.groupByUntil(function (x) { return x.id; }, null, function () { return Rx.Observable.never(); }); + * 2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function () { return Rx.Observable.never(); }); + * 3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function () { return Rx.Observable.never(); }, function (x) { return x.toString(); }); + * @param {Function} keySelector A function to extract the key for each element. + * @param {Function} durationSelector A function to signal the expiration of a group. + * @param {Function} [keySerializer] Used to serialize the given object into a string for object comparison. + * @returns {Observable} + * A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value. + * If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered. + * + */ + observableProto.groupByUntil = function (keySelector, elementSelector, durationSelector, keySerializer) { + var source = this; + elementSelector || (elementSelector = identity); + keySerializer || (keySerializer = defaultKeySerializer); + return new AnonymousObservable(function (observer) { + var map = {}, + groupDisposable = new CompositeDisposable(), + refCountDisposable = new RefCountDisposable(groupDisposable); + groupDisposable.add(source.subscribe(function (x) { + var duration, durationGroup, element, fireNewMapEntry, group, key, serializedKey, md, writer, w; + try { + key = keySelector(x); + serializedKey = keySerializer(key); + } catch (e) { + for (w in map) { + map[w].onError(e); + } + observer.onError(e); + return; + } + fireNewMapEntry = false; + try { + writer = map[serializedKey]; + if (!writer) { + writer = new Subject(); + map[serializedKey] = writer; + fireNewMapEntry = true; + } + } catch (e) { + for (w in map) { + map[w].onError(e); + } + observer.onError(e); + return; + } + if (fireNewMapEntry) { + group = new GroupedObservable(key, writer, refCountDisposable); + durationGroup = new GroupedObservable(key, writer); + try { + duration = durationSelector(durationGroup); + } catch (e) { + for (w in map) { + map[w].onError(e); + } + observer.onError(e); + return; + } + observer.onNext(group); + md = new SingleAssignmentDisposable(); + groupDisposable.add(md); + var expire = function () { + if (serializedKey in map) { + delete map[serializedKey]; + writer.onCompleted(); + } + groupDisposable.remove(md); + }; + md.setDisposable(duration.take(1).subscribe(noop, function (exn) { + for (w in map) { + map[w].onError(exn); + } + observer.onError(exn); + }, function () { + expire(); + })); + } + try { + element = elementSelector(x); + } catch (e) { + for (w in map) { + map[w].onError(e); + } + observer.onError(e); + return; + } + writer.onNext(element); + }, function (ex) { + for (var w in map) { + map[w].onError(ex); + } + observer.onError(ex); + }, function () { + for (var w in map) { + map[w].onCompleted(); + } + observer.onCompleted(); + })); + return refCountDisposable; + }); + }; + + /** + * Projects each element of an observable sequence into a new form by incorporating the element's index. + * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element. + * @param {Any} [thisArg] Object to use as this when executing callback. + * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source. + */ + observableProto.select = observableProto.map = function (selector, thisArg) { + var parent = this; + return new AnonymousObservable(function (observer) { + var count = 0; + return parent.subscribe(function (value) { + var result; + try { + result = selector.call(thisArg, value, count++, parent); + } catch (exception) { + observer.onError(exception); + return; + } + observer.onNext(result); + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Retrieves the value of a specified property from all elements in the Observable sequence. + * @param {String} property The property to pluck. + * @returns {Observable} Returns a new Observable sequence of property values. + */ + observableProto.pluck = function (property) { + return this.select(function (x) { return x[property]; }); + }; + + function selectMany(selector) { + return this.select(function (x, i) { + var result = selector(x, i); + return isPromise(result) ? observableFromPromise(result) : result; + }).mergeObservable(); + } + + function selectManyObserver(onNext, onError, onCompleted) { + var source = this; + return new AnonymousObservable(function (observer) { + var index = 0; + + return source.subscribe( + function (x) { + observer.onNext(onNext(x, index++)); + }, + function (err) { + observer.onNext(onError(err)); + observer.completed(); + }, + function () { + observer.onNext(onCompleted()); + observer.onCompleted(); + }); + }).mergeAll(); + } + + /** + * One of the Following: + * Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence. + * + * @example + * var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }); + * Or: + * Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence. + * + * var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; }); + * Or: + * Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence. + * + * var res = source.selectMany(Rx.Observable.fromArray([1,2,3])); + * @param selector A transform function to apply to each element or an observable sequence to project each element from the + * source sequence onto which could be either an observable or Promise. + * @param {Function} [resultSelector] A transform function to apply to each element of the intermediate sequence. + * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element. + */ + observableProto.selectMany = observableProto.flatMap = function (selector, resultSelector) { + if (resultSelector) { + return this.selectMany(function (x, i) { + var selectorResult = selector(x, i), + result = isPromise(selectorResult) ? observableFromPromise(selectorResult) : selectorResult; + + return result.select(function (y) { + return resultSelector(x, y, i); + }); + }); + } + if (typeof selector === 'function') { + return selectMany.call(this, selector); + } + return selectMany.call(this, function () { + return selector; + }); + }; + + /** + * Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then + * transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence. + * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element. + * @param {Any} [thisArg] Object to use as this when executing callback. + * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences + * and that at any point in time produces the elements of the most recent inner observable sequence that has been received. + */ + observableProto.selectSwitch = observableProto.flatMapLatest = observableProto.switchMap = function (selector, thisArg) { + return this.select(selector, thisArg).switchLatest(); + }; + + /** + * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements. + * @param {Number} count The number of elements to skip before returning the remaining elements. + * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence. + */ + observableProto.skip = function (count) { + if (count < 0) { + throw new Error(argumentOutOfRange); + } + var observable = this; + return new AnonymousObservable(function (observer) { + var remaining = count; + return observable.subscribe(function (x) { + if (remaining <= 0) { + observer.onNext(x); + } else { + remaining--; + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements. + * The element's index is used in the logic of the predicate function. + * + * var res = source.skipWhile(function (value) { return value < 10; }); + * var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; }); + * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element. + * @param {Any} [thisArg] Object to use as this when executing callback. + * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate. + */ + observableProto.skipWhile = function (predicate, thisArg) { + var source = this; + return new AnonymousObservable(function (observer) { + var i = 0, running = false; + return source.subscribe(function (x) { + if (!running) { + try { + running = !predicate.call(thisArg, x, i++, source); + } catch (e) { + observer.onError(e); + return; + } + } + if (running) { + observer.onNext(x); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0). + * + * var res = source.take(5); + * var res = source.take(0, Rx.Scheduler.timeout); + * @param {Number} count The number of elements to return. + * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case ++c;)o=te[c],l&&l[o]||!K.call(t,o)||e.push(o)}return e}function i(t,e,n){for(var r=-1,i=n(t),o=i.length;o>++r;){var s=i[r];if(e(t[s],s,t)===!1)break}return t}function o(t,e){return i(t,e,r)}function s(t){return"function"!=typeof t.toString&&"string"==typeof(t+"")}function u(t){return t&&"object"==typeof t?$.call(t)==V:!1}function c(t){return"function"==typeof t||!1}function a(e,n,r,i){if(e===n)return 0!==e||1/e==1/n;var h=typeof e,l=typeof n;if(e===e&&(null==e||null==n||"function"!=h&&"object"!=h&&"function"!=l&&"object"!=l))return!1;var f=$.call(e),p=$.call(n);if(f==V&&(f=H),p==V&&(p=H),f!=p)return!1;switch(f){case z:case M:return+e==+n;case B:return e!=+e?n!=+n:0==e?1/e==1/n:e==+n;case U:case Q:return e==n+""}var d=f==L;if(!d){if(f!=H||!ne.nodeClass&&(s(e)||s(n)))return!1;var v=!ne.argsObject&&u(e)?Object:e.constructor,b=!ne.argsObject&&u(n)?Object:n.constructor;if(!(v==b||K.call(e,"constructor")&&K.call(n,"constructor")||c(v)&&v instanceof v&&c(b)&&b instanceof b||!("constructor"in e&&"constructor"in n)))return!1}r||(r=[]),i||(i=[]);for(var m=r.length;m--;)if(r[m]==e)return i[m]==n;var y=0;if(result=!0,r.push(e),i.push(n),d){if(m=e.length,y=n.length,result=y==m)for(;y--;){var w=n[y];if(!(result=a(e[y],w,r,i)))break}}else o(n,function(n,o,s){return K.call(s,o)?(y++,result=K.call(e,o)&&a(e[o],n,r,i)):t}),result&&o(e,function(e,n,r){return K.call(r,n)?result=--y>-1:t});return r.pop(),i.pop(),result}function h(t,e){return 1===t.length&&Array.isArray(t[e])?t[e]:ie.call(t)}function l(t,e){for(var n=Array(t),r=0;t>r;r++)n[r]=e();return n}function f(t,e){this.scheduler=t,this.disposable=e,this.isDisposed=!1}function p(e,n){return new on(function(r){var i=new we,o=new ge;return o.setDisposable(i),i.setDisposable(e.subscribe(r.onNext.bind(r),function(e){var i,s;try{s=n(e)}catch(u){return r.onError(u),t}j(s)&&(s=$e(s)),i=new we,o.setDisposable(i),i.setDisposable(s.subscribe(r))},r.onCompleted.bind(r))),o})}function d(e,n){var r=this;return new on(function(i){var o=0,s=e.length;return r.subscribe(function(r){if(s>o){var u,c=e[o++];try{u=n(r,c)}catch(a){return i.onError(a),t}i.onNext(u)}else i.onCompleted()},i.onError.bind(i),i.onCompleted.bind(i))})}function v(t){return this.map(function(e,n){var r=t(e,n);return j(r)?$e(r):r}).concatAll()}function b(t){return this.select(function(e,n){var r=t(e,n);return j(r)?$e(r):r}).mergeObservable()}var m={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},y=m[typeof window]&&window||this,w=m[typeof exports]&&exports&&!exports.nodeType&&exports,g=m[typeof module]&&module&&!module.nodeType&&module,E=g&&g.exports===w&&w,x=m[typeof global]&&global;!x||x.global!==x&&x.window!==x||(y=x);var C={internals:{},config:{Promise:y.Promise},helpers:{}},D=C.helpers.noop=function(){},S=C.helpers.identity=function(t){return t},A=(C.helpers.pluck=function(t){return function(e){return e[t]}},C.helpers.just=function(t){return function(){return t}},C.helpers.defaultNow=function(){return Date.now?Date.now:function(){return+new Date}}()),N=C.helpers.defaultComparer=function(t,e){return re(t,e)},_=C.helpers.defaultSubComparer=function(t,e){return t>e?1:e>t?-1:0},O=C.helpers.defaultKeySerializer=function(t){return""+t},W=C.helpers.defaultError=function(t){throw t},j=C.helpers.isPromise=function(t){return!!t&&"function"==typeof t.then&&t.then!==C.Observable.prototype.then};C.helpers.asArray=function(){return Array.prototype.slice.call(arguments)},C.helpers.not=function(t){return!t};var R="Argument out of range",k="Object has been disposed",q="object"==typeof Symbol&&Symbol.iterator||"_es6shim_iterator_";y.Set&&"function"==typeof(new y.Set)["@@iterator"]&&(q="@@iterator");var P,T={done:!0,value:t},V="[object Arguments]",L="[object Array]",z="[object Boolean]",M="[object Date]",I="[object Error]",F="[object Function]",B="[object Number]",H="[object Object]",U="[object RegExp]",Q="[object String]",$=Object.prototype.toString,K=Object.prototype.hasOwnProperty,J=$.call(arguments)==V,X=Error.prototype,Z=Object.prototype,G=Z.propertyIsEnumerable;try{P=!($.call(document)==H&&!({toString:0}+""))}catch(Y){P=!0}var te=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],ee={};ee[L]=ee[M]=ee[B]={constructor:!0,toLocaleString:!0,toString:!0,valueOf:!0},ee[z]=ee[Q]={constructor:!0,toString:!0,valueOf:!0},ee[I]=ee[F]=ee[U]={constructor:!0,toString:!0},ee[H]={constructor:!0};var ne={};(function(){var t=function(){this.x=1},e=[];t.prototype={valueOf:1,y:1};for(var n in new t)e.push(n);for(n in arguments);ne.enumErrorProps=G.call(X,"message")||G.call(X,"name"),ne.enumPrototypes=G.call(t,"prototype"),ne.nonEnumArgs=0!=n,ne.nonEnumShadows=!/valueOf/.test(e)})(1),J||(u=function(t){return t&&"object"==typeof t?K.call(t,"callee"):!1}),c(/x/)&&(c=function(t){return"function"==typeof t&&$.call(t)==F});var re=C.internals.isEqual=function(t,e){return a(t,e,[],[])},ie=Array.prototype.slice;({}).hasOwnProperty;var oe=this.inherits=C.internals.inherits=function(t,e){function n(){this.constructor=t}n.prototype=e.prototype,t.prototype=new n},se=C.internals.addProperties=function(t){for(var e=ie.call(arguments,1),n=0,r=e.length;r>n;n++){var i=e[n];for(var o in i)t[o]=i[o]}},ue=C.internals.addRef=function(t,e){return new on(function(n){return new pe(e.getDisposable(),t.subscribe(n))})};Function.prototype.bind||(Function.prototype.bind=function(t){var e=this,n=ie.call(arguments,1),r=function(){function i(){}if(this instanceof r){i.prototype=e.prototype;var o=new i,s=e.apply(o,n.concat(ie.call(arguments)));return Object(s)===s?s:o}return e.apply(t,n.concat(ie.call(arguments)))};return r});var ce=Object("a"),ae="a"!=ce[0]||!(0 in ce);Array.prototype.every||(Array.prototype.every=function(t){var e=Object(this),n=ae&&{}.toString.call(this)==Q?this.split(""):e,r=n.length>>>0,i=arguments[1];if({}.toString.call(t)!=F)throw new TypeError(t+" is not a function");for(var o=0;r>o;o++)if(o in n&&!t.call(i,n[o],o,e))return!1;return!0}),Array.prototype.map||(Array.prototype.map=function(t){var e=Object(this),n=ae&&{}.toString.call(this)==Q?this.split(""):e,r=n.length>>>0,i=Array(r),o=arguments[1];if({}.toString.call(t)!=F)throw new TypeError(t+" is not a function");for(var s=0;r>s;s++)s in n&&(i[s]=t.call(o,n[s],s,e));return i}),Array.prototype.filter||(Array.prototype.filter=function(t){for(var e,n=[],r=Object(this),i=0,o=r.length>>>0;o>i;i++)e=r[i],i in r&&t.call(arguments[1],e,i,r)&&n.push(e);return n}),Array.isArray||(Array.isArray=function(t){return Object.prototype.toString.call(t)==L}),Array.prototype.indexOf||(Array.prototype.indexOf=function(t){var e=Object(this),n=e.length>>>0;if(0===n)return-1;var r=0;if(arguments.length>1&&(r=Number(arguments[1]),r!==r?r=0:0!==r&&1/0!=r&&r!==-1/0&&(r=(r>0||-1)*Math.floor(Math.abs(r)))),r>=n)return-1;for(var i=r>=0?r:Math.max(n-Math.abs(r),0);n>i;i++)if(i in e&&e[i]===t)return i;return-1});var he=function(t,e){this.id=t,this.value=e};he.prototype.compareTo=function(t){var e=this.value.compareTo(t.value);return 0===e&&(e=this.id-t.id),e};var le=C.internals.PriorityQueue=function(t){this.items=Array(t),this.length=0},fe=le.prototype;fe.isHigherPriority=function(t,e){return 0>this.items[t].compareTo(this.items[e])},fe.percolate=function(t){if(!(t>=this.length||0>t)){var e=t-1>>1;if(!(0>e||e===t)&&this.isHigherPriority(t,e)){var n=this.items[t];this.items[t]=this.items[e],this.items[e]=n,this.percolate(e)}}},fe.heapify=function(e){if(e===t&&(e=0),!(e>=this.length||0>e)){var n=2*e+1,r=2*e+2,i=e;if(this.length>n&&this.isHigherPriority(n,i)&&(i=n),this.length>r&&this.isHigherPriority(r,i)&&(i=r),i!==e){var o=this.items[e];this.items[e]=this.items[i],this.items[i]=o,this.heapify(i)}}},fe.peek=function(){return this.items[0].value},fe.removeAt=function(t){this.items[t]=this.items[--this.length],delete this.items[this.length],this.heapify()},fe.dequeue=function(){var t=this.peek();return this.removeAt(0),t},fe.enqueue=function(t){var e=this.length++;this.items[e]=new he(le.count++,t),this.percolate(e)},fe.remove=function(t){for(var e=0;this.length>e;e++)if(this.items[e].value===t)return this.removeAt(e),!0;return!1},le.count=0;var pe=C.CompositeDisposable=function(){this.disposables=h(arguments,0),this.isDisposed=!1,this.length=this.disposables.length},de=pe.prototype;de.add=function(t){this.isDisposed?t.dispose():(this.disposables.push(t),this.length++)},de.remove=function(t){var e=!1;if(!this.isDisposed){var n=this.disposables.indexOf(t);-1!==n&&(e=!0,this.disposables.splice(n,1),this.length--,t.dispose())}return e},de.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;var t=this.disposables.slice(0);this.disposables=[],this.length=0;for(var e=0,n=t.length;n>e;e++)t[e].dispose()}},de.clear=function(){var t=this.disposables.slice(0);this.disposables=[],this.length=0;for(var e=0,n=t.length;n>e;e++)t[e].dispose()},de.contains=function(t){return-1!==this.disposables.indexOf(t)},de.toArray=function(){return this.disposables.slice(0)};var ve=C.Disposable=function(t){this.isDisposed=!1,this.action=t||D};ve.prototype.dispose=function(){this.isDisposed||(this.action(),this.isDisposed=!0)};var be=ve.create=function(t){return new ve(t)},me=ve.empty={dispose:D},ye=function(){function t(t){this.isSingle=t,this.isDisposed=!1,this.current=null}var e=t.prototype;return e.getDisposable=function(){return this.current},e.setDisposable=function(t){if(this.current&&this.isSingle)throw Error("Disposable has already been assigned");var e,n=this.isDisposed;n||(e=this.current,this.current=t),e&&e.dispose(),n&&t&&t.dispose()},e.dispose=function(){var t;this.isDisposed||(this.isDisposed=!0,t=this.current,this.current=null),t&&t.dispose()},t}(),we=C.SingleAssignmentDisposable=function(t){function e(){t.call(this,!0)}return oe(e,t),e}(ye),ge=C.SerialDisposable=function(t){function e(){t.call(this,!1)}return oe(e,t),e}(ye),Ee=C.RefCountDisposable=function(){function t(t){this.disposable=t,this.disposable.count++,this.isInnerDisposed=!1}function e(t){this.underlyingDisposable=t,this.isDisposed=!1,this.isPrimaryDisposed=!1,this.count=0}return t.prototype.dispose=function(){this.disposable.isDisposed||this.isInnerDisposed||(this.isInnerDisposed=!0,this.disposable.count--,0===this.disposable.count&&this.disposable.isPrimaryDisposed&&(this.disposable.isDisposed=!0,this.disposable.underlyingDisposable.dispose()))},e.prototype.dispose=function(){this.isDisposed||this.isPrimaryDisposed||(this.isPrimaryDisposed=!0,0===this.count&&(this.isDisposed=!0,this.underlyingDisposable.dispose()))},e.prototype.getDisposable=function(){return this.isDisposed?me:new t(this)},e}();f.prototype.dispose=function(){var t=this;this.scheduler.schedule(function(){t.isDisposed||(t.isDisposed=!0,t.disposable.dispose())})};var xe=C.internals.ScheduledItem=function(t,e,n,r,i){this.scheduler=t,this.state=e,this.action=n,this.dueTime=r,this.comparer=i||_,this.disposable=new we};xe.prototype.invoke=function(){this.disposable.setDisposable(this.invokeCore())},xe.prototype.compareTo=function(t){return this.comparer(this.dueTime,t.dueTime)},xe.prototype.isCancelled=function(){return this.disposable.isDisposed},xe.prototype.invokeCore=function(){return this.action(this.scheduler,this.state)};var Ce=C.Scheduler=function(){function t(t,e,n,r){this.now=t,this._schedule=e,this._scheduleRelative=n,this._scheduleAbsolute=r}function e(t,e){var n=e.first,r=e.second,i=new pe,o=function(e){r(e,function(e){var n=!1,r=!1,s=t.scheduleWithState(e,function(t,e){return n?i.remove(s):r=!0,o(e),me});r||(i.add(s),n=!0)})};return o(n),i}function n(t,e,n){var r=e.first,i=e.second,o=new pe,s=function(e){i(e,function(e,r){var i=!1,u=!1,c=t[n].call(t,e,r,function(t,e){return i?o.remove(c):u=!0,s(e),me});u||(o.add(c),i=!0)})};return s(r),o}function r(t,e){return e(),me}var i=t.prototype;return i.catchException=i["catch"]=function(t){return new Oe(this,t)},i.schedulePeriodic=function(t,e){return this.schedulePeriodicWithState(null,t,function(){e()})},i.schedulePeriodicWithState=function(t,e,n){var r=t,i=setInterval(function(){r=n(r)},e);return be(function(){clearInterval(i)})},i.schedule=function(t){return this._schedule(t,r)},i.scheduleWithState=function(t,e){return this._schedule(t,e)},i.scheduleWithRelative=function(t,e){return this._scheduleRelative(e,t,r)},i.scheduleWithRelativeAndState=function(t,e,n){return this._scheduleRelative(t,e,n)},i.scheduleWithAbsolute=function(t,e){return this._scheduleAbsolute(e,t,r)},i.scheduleWithAbsoluteAndState=function(t,e,n){return this._scheduleAbsolute(t,e,n)},i.scheduleRecursive=function(t){return this.scheduleRecursiveWithState(t,function(t,e){t(function(){e(t)})})},i.scheduleRecursiveWithState=function(t,n){return this.scheduleWithState({first:t,second:n},function(t,n){return e(t,n)})},i.scheduleRecursiveWithRelative=function(t,e){return this.scheduleRecursiveWithRelativeAndState(e,t,function(t,e){t(function(n){e(t,n)})})},i.scheduleRecursiveWithRelativeAndState=function(t,e,r){return this._scheduleRelative({first:t,second:r},e,function(t,e){return n(t,e,"scheduleWithRelativeAndState")})},i.scheduleRecursiveWithAbsolute=function(t,e){return this.scheduleRecursiveWithAbsoluteAndState(e,t,function(t,e){t(function(n){e(t,n)})})},i.scheduleRecursiveWithAbsoluteAndState=function(t,e,r){return this._scheduleAbsolute({first:t,second:r},e,function(t,e){return n(t,e,"scheduleWithAbsoluteAndState")})},t.now=A,t.normalize=function(t){return 0>t&&(t=0),t},t}(),De=Ce.normalize;C.internals.SchedulePeriodicRecursive=function(){function t(t,e){e(0,this._period);try{this._state=this._action(this._state)}catch(n){throw this._cancel.dispose(),n}}function e(t,e,n,r){this._scheduler=t,this._state=e,this._period=n,this._action=r}return e.prototype.start=function(){var e=new we;return this._cancel=e,e.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0,this._period,t.bind(this))),e},e}();var Se,Ae=Ce.immediate=function(){function t(t,e){return e(this,t)}function e(t,e,n){for(var r=De(r);r-this.now()>0;);return n(this,t)}function n(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}return new Ce(A,t,e,n)}(),Ne=Ce.currentThread=function(){function t(t){for(var e;t.length>0;)if(e=t.dequeue(),!e.isCancelled()){for(;e.dueTime-Ce.now()>0;);e.isCancelled()||e.invoke()}}function e(t,e){return this.scheduleWithRelativeAndState(t,0,e)}function n(e,n,r){var o=this.now()+Ce.normalize(n),s=new xe(this,e,r,o);if(i)i.enqueue(s);else{i=new le(4),i.enqueue(s);try{t(i)}catch(u){throw u}finally{i=null}}return s.disposable}function r(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}var i,o=new Ce(A,e,n,r);return o.scheduleRequired=function(){return null===i},o.ensureTrampoline=function(t){return null===i?this.schedule(t):t()},o}(),_e=D;(function(){function t(){if(!y.postMessage||y.importScripts)return!1;var t=!1,e=y.onmessage;return y.onmessage=function(){t=!0},y.postMessage("","*"),y.onmessage=e,t}function e(t){if("string"==typeof t.data&&t.data.substring(0,o.length)===o){var e=t.data.substring(o.length),n=s[e];n(),delete s[e]}}var n=RegExp("^"+($+"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),r="function"==typeof(r=x&&E&&x.setImmediate)&&!n.test(r)&&r,i="function"==typeof(i=x&&E&&x.clearImmediate)&&!n.test(i)&&i;if("undefined"!=typeof process&&"[object process]"==={}.toString.call(process))Se=process.nextTick;else if("function"==typeof r)Se=r,_e=i;else if(t()){var o="ms.rx.schedule"+Math.random(),s={},u=0;y.addEventListener?y.addEventListener("message",e,!1):y.attachEvent("onmessage",e,!1),Se=function(t){var e=u++;s[e]=t,y.postMessage(o+e,"*")}}else if(y.MessageChannel){var c=new y.MessageChannel,a={},h=0;c.port1.onmessage=function(t){var e=t.data,n=a[e];n(),delete a[e]},Se=function(t){var e=h++;a[e]=t,c.port2.postMessage(e)}}else"document"in y&&"onreadystatechange"in y.document.createElement("script")?Se=function(t){var e=y.document.createElement("script");e.onreadystatechange=function(){t(),e.onreadystatechange=null,e.parentNode.removeChild(e),e=null},y.document.documentElement.appendChild(e)}:(Se=function(t){return setTimeout(t,0)},_e=clearTimeout)})(),Ce.timeout=function(){function t(t,e){var n=this,r=new we,i=Se(function(){r.isDisposed||r.setDisposable(e(n,t))});return new pe(r,be(function(){_e(i)}))}function e(t,e,n){var r=this,i=Ce.normalize(e);if(0===i)return r.scheduleWithState(t,n);var o=new we,s=setTimeout(function(){o.isDisposed||o.setDisposable(n(r,t))},i);return new pe(o,be(function(){clearTimeout(s)}))}function n(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}return new Ce(A,t,e,n)}();var Oe=function(t){function e(){return this._scheduler.now()}function n(t,e){return this._scheduler.scheduleWithState(t,this._wrap(e))}function r(t,e,n){return this._scheduler.scheduleWithRelativeAndState(t,e,this._wrap(n))}function i(t,e,n){return this._scheduler.scheduleWithAbsoluteAndState(t,e,this._wrap(n))}function o(o,s){this._scheduler=o,this._handler=s,this._recursiveOriginal=null,this._recursiveWrapper=null,t.call(this,e,n,r,i)}return oe(o,t),o.prototype._clone=function(t){return new o(t,this._handler)},o.prototype._wrap=function(t){var e=this;return function(n,r){try{return t(e._getRecursiveWrapper(n),r)}catch(i){if(!e._handler(i))throw i;return me}}},o.prototype._getRecursiveWrapper=function(t){if(this._recursiveOriginal!==t){this._recursiveOriginal=t;var e=this._clone(t);e._recursiveOriginal=t,e._recursiveWrapper=e,this._recursiveWrapper=e}return this._recursiveWrapper},o.prototype.schedulePeriodicWithState=function(t,e,n){var r=this,i=!1,o=new we;return o.setDisposable(this._scheduler.schedulePeriodicWithState(t,e,function(t){if(i)return null;try{return n(t)}catch(e){if(i=!0,!r._handler(e))throw e;return o.dispose(),null}})),o},o}(Ce),We=C.Notification=function(){function t(t,e){this.hasValue=null==e?!1:e,this.kind=t}var e=t.prototype;return e.accept=function(t,e,n){return 1===arguments.length&&"object"==typeof t?this._acceptObservable(t):this._accept(t,e,n)},e.toObservable=function(t){var e=this;return t||(t=Ae),new on(function(n){return t.schedule(function(){e._acceptObservable(n),"N"===e.kind&&n.onCompleted()})})},t}(),je=We.createOnNext=function(){function t(t){return t(this.value)}function e(t){return t.onNext(this.value)}function n(){return"OnNext("+this.value+")"}return function(r){var i=new We("N",!0);return i.value=r,i._accept=t,i._acceptObservable=e,i.toString=n,i}}(),Re=We.createOnError=function(){function t(t,e){return e(this.exception)}function e(t){return t.onError(this.exception)}function n(){return"OnError("+this.exception+")"}return function(r){var i=new We("E");return i.exception=r,i._accept=t,i._acceptObservable=e,i.toString=n,i}}(),ke=We.createOnCompleted=function(){function t(t,e,n){return n()}function e(t){return t.onCompleted()}function n(){return"OnCompleted()"}return function(){var r=new We("C");return r._accept=t,r._acceptObservable=e,r.toString=n,r}}(),qe=C.internals.Enumerator=function(t){this._next=t};qe.prototype.next=function(){return this._next()},qe.prototype[q]=function(){return this};var Pe=C.internals.Enumerable=function(t){this._iterator=t};Pe.prototype[q]=function(){return this._iterator()},Pe.prototype.concat=function(){var e=this;return new on(function(n){var r;try{r=e[q]()}catch(i){return n.onError(),t}var o,s=new ge,u=Ae.scheduleRecursive(function(e){var i;if(!o){try{i=r.next()}catch(u){return n.onError(u),t}if(i.done)return n.onCompleted(),t;var c=i.value;j(c)&&(c=$e(c));var a=new we;s.setDisposable(a),a.setDisposable(c.subscribe(n.onNext.bind(n),n.onError.bind(n),function(){e()}))}});return new pe(s,u,be(function(){o=!0}))})},Pe.prototype.catchException=function(){var e=this;return new on(function(n){var r;try{r=e[q]()}catch(i){return n.onError(),t}var o,s,u=new ge,c=Ae.scheduleRecursive(function(e){if(!o){var i;try{i=r.next()}catch(c){return n.onError(c),t}if(i.done)return s?n.onError(s):n.onCompleted(),t;var a=i.value;j(a)&&(a=$e(a));var h=new we;u.setDisposable(h),h.setDisposable(a.subscribe(n.onNext.bind(n),function(t){s=t,e()},n.onCompleted.bind(n)))}});return new pe(u,c,be(function(){o=!0}))})};var Te=Pe.repeat=function(t,e){return null==e&&(e=-1),new Pe(function(){var n=e;return new qe(function(){return 0===n?T:(n>0&&n--,{done:!1,value:t})})})},Ve=Pe.forEach=function(t,e,n){return e||(e=S),new Pe(function(){var r=-1;return new qe(function(){return++r0&&(e=!this.isAcquired,this.isAcquired=!0),e&&this.disposable.setDisposable(this.scheduler.scheduleRecursive(function(e){var r;if(!(n.queue.length>0))return n.isAcquired=!1,t;r=n.queue.shift();try{r()}catch(i){throw n.queue=[],n.hasFaulted=!0,i}e()}))},n.prototype.dispose=function(){e.prototype.dispose.call(this),this.disposable.dispose()},n}(Ie),Ue=function(t){function e(){t.apply(this,arguments)}return oe(e,t),e.prototype.next=function(e){t.prototype.next.call(this,e),this.ensureActive()},e.prototype.error=function(e){t.prototype.error.call(this,e),this.ensureActive()},e.prototype.completed=function(){t.prototype.completed.call(this),this.ensureActive()},e}(He),Qe=C.Observable=function(){function t(t){this._subscribe=t}return Me=t.prototype,Me.subscribe=Me.forEach=function(t,e,n){var r="object"==typeof t?t:ze(t,e,n);return this._subscribe(r)},t}();Me.observeOn=function(t){var e=this;return new on(function(n){return e.subscribe(new Ue(t,n))})},Me.subscribeOn=function(t){var e=this;return new on(function(n){var r=new we,i=new ge;return i.setDisposable(r),r.setDisposable(t.schedule(function(){i.setDisposable(new f(t,e.subscribe(n)))})),i})};var $e=Qe.fromPromise=function(t){return new on(function(e){return t.then(function(t){e.onNext(t),e.onCompleted()},function(t){e.onError(t)}),function(){t&&t.abort&&t.abort()}})};Me.toPromise=function(t){if(t||(t=C.config.Promise),!t)throw Error("Promise type not provided nor in Rx.config.Promise");var e=this;return new t(function(t,n){var r,i=!1;e.subscribe(function(t){r=t,i=!0},function(t){n(t)},function(){i&&t(r)})})},Me.toArray=function(){var t=this;return new on(function(e){var n=[];return t.subscribe(n.push.bind(n),e.onError.bind(e),function(){e.onNext(n),e.onCompleted()})})},Qe.create=Qe.createWithDisposable=function(t){return new on(t)},Qe.defer=function(t){return new on(function(e){var n;try{n=t()}catch(r){return Ge(r).subscribe(e)}return j(n)&&(n=$e(n)),n.subscribe(e)})};var Ke=Qe.empty=function(t){return t||(t=Ae),new on(function(e){return t.schedule(function(){e.onCompleted()})})},Je=Qe.fromArray=function(t,e){return e||(e=Ne),new on(function(n){var r=0,i=t.length;return e.scheduleRecursive(function(e){i>r?(n.onNext(t[r++]),e()):n.onCompleted()})})};Qe.fromIterable=function(e,n){return n||(n=Ne),new on(function(r){var i;try{i=e[q]()}catch(o){return r.onError(o),t}return n.scheduleRecursive(function(e){var n;try{n=i.next()}catch(o){return r.onError(o),t}n.done?r.onCompleted():(r.onNext(n.value),e())})})},Qe.generate=function(e,n,r,i,o){return o||(o=Ne),new on(function(s){var u=!0,c=e;return o.scheduleRecursive(function(e){var o,a;try{u?u=!1:c=r(c),o=n(c),o&&(a=i(c))}catch(h){return s.onError(h),t}o?(s.onNext(a),e()):s.onCompleted()})})};var Xe=Qe.never=function(){return new on(function(){return me})};Qe.of=function(){for(var t=arguments.length,e=Array(t),n=0;t>n;n++)e[n]=arguments[n];return Je(e)},Qe.ofWithScheduler=function(t){for(var e=arguments.length-1,n=Array(e),r=0;e>r;r++)n[r]=arguments[r+1];return Je(n,t)},Qe.range=function(t,e,n){return n||(n=Ne),new on(function(r){return n.scheduleRecursiveWithState(0,function(n,i){e>n?(r.onNext(t+n),i(n+1)):r.onCompleted()})})},Qe.repeat=function(t,e,n){return n||(n=Ne),null==e&&(e=-1),Ze(t,n).repeat(e)};var Ze=Qe["return"]=Qe.returnValue=Qe.just=function(t,e){return e||(e=Ae),new on(function(n){return e.schedule(function(){n.onNext(t),n.onCompleted()})})},Ge=Qe["throw"]=Qe.throwException=function(t,e){return e||(e=Ae),new on(function(n){return e.schedule(function(){n.onError(t)})})};Qe.using=function(t,e){return new on(function(n){var r,i,o=me;try{r=t(),r&&(o=r),i=e(r)}catch(s){return new pe(Ge(s).subscribe(n),o)}return new pe(i.subscribe(n),o)})},Me.amb=function(t){var e=this;return new on(function(n){function r(){o||(o=s,a.dispose())}function i(){o||(o=u,c.dispose())}var o,s="L",u="R",c=new we,a=new we;return j(t)&&(t=$e(t)),c.setDisposable(e.subscribe(function(t){r(),o===s&&n.onNext(t)},function(t){r(),o===s&&n.onError(t)},function(){r(),o===s&&n.onCompleted()})),a.setDisposable(t.subscribe(function(t){i(),o===u&&n.onNext(t)},function(t){i(),o===u&&n.onError(t)},function(){i(),o===u&&n.onCompleted()})),new pe(c,a)})},Qe.amb=function(){function t(t,e){return t.amb(e)}for(var e=Xe(),n=h(arguments,0),r=0,i=n.length;i>r;r++)e=t(e,n[r]);return e},Me["catch"]=Me.catchException=function(t){return"function"==typeof t?p(this,t):Ye([this,t])};var Ye=Qe.catchException=Qe["catch"]=function(){var t=h(arguments,0);return Ve(t).catchException()};Me.combineLatest=function(){var t=ie.call(arguments);return Array.isArray(t[0])?t[0].unshift(this):t.unshift(this),tn.apply(this,t)};var tn=Qe.combineLatest=function(){var e=ie.call(arguments),n=e.pop();return Array.isArray(e[0])&&(e=e[0]),new on(function(r){function i(e){var i;if(c[e]=!0,a||(a=c.every(S))){try{i=n.apply(null,f)}catch(o){return r.onError(o),t}r.onNext(i)}else h.filter(function(t,n){return n!==e}).every(S)&&r.onCompleted()}function o(t){h[t]=!0,h.every(S)&&r.onCompleted()}for(var s=function(){return!1},u=e.length,c=l(u,s),a=!1,h=l(u,s),f=Array(u),p=Array(u),d=0;u>d;d++)(function(t){var n=e[t],s=new we;j(n)&&(n=$e(n)),s.setDisposable(n.subscribe(function(e){f[t]=e,i(t)},r.onError.bind(r),function(){o(t)})),p[t]=s})(d);return new pe(p)})};Me.concat=function(){var t=ie.call(arguments,0);return t.unshift(this),en.apply(this,t)};var en=Qe.concat=function(){var t=h(arguments,0);return Ve(t).concat()};Me.concatObservable=Me.concatAll=function(){return this.merge(1)},Me.merge=function(t){if("number"!=typeof t)return nn(this,t);var e=this;return new on(function(n){var r=0,i=new pe,o=!1,s=[],u=function(t){var e=new we;i.add(e),j(t)&&(t=$e(t)),e.setDisposable(t.subscribe(n.onNext.bind(n),n.onError.bind(n),function(){var t;i.remove(e),s.length>0?(t=s.shift(),u(t)):(r--,o&&0===r&&n.onCompleted())}))};return i.add(e.subscribe(function(e){t>r?(r++,u(e)):s.push(e)},n.onError.bind(n),function(){o=!0,0===r&&n.onCompleted()})),i})};var nn=Qe.merge=function(){var t,e;return arguments[0]?arguments[0].now?(t=arguments[0],e=ie.call(arguments,1)):(t=Ae,e=ie.call(arguments,0)):(t=Ae,e=ie.call(arguments,1)),Array.isArray(e[0])&&(e=e[0]),Je(e,t).mergeObservable()};Me.mergeObservable=Me.mergeAll=function(){var t=this;return new on(function(e){var n=new pe,r=!1,i=new we;return n.add(i),i.setDisposable(t.subscribe(function(t){var i=new we;n.add(i),j(t)&&(t=$e(t)),i.setDisposable(t.subscribe(function(t){e.onNext(t)},e.onError.bind(e),function(){n.remove(i),r&&1===n.length&&e.onCompleted()}))},e.onError.bind(e),function(){r=!0,1===n.length&&e.onCompleted()})),n})},Me.onErrorResumeNext=function(t){if(!t)throw Error("Second observable is required");return rn([this,t])};var rn=Qe.onErrorResumeNext=function(){var t=h(arguments,0);return new on(function(e){var n=0,r=new ge,i=Ae.scheduleRecursive(function(i){var o,s;t.length>n?(o=t[n++],j(o)&&(o=$e(o)),s=new we,r.setDisposable(s),s.setDisposable(o.subscribe(e.onNext.bind(e),function(){i()},function(){i()}))):e.onCompleted()});return new pe(r,i)})};Me.skipUntil=function(t){var e=this;return new on(function(n){var r=!1,i=new pe(e.subscribe(function(t){r&&n.onNext(t)},n.onError.bind(n),function(){r&&n.onCompleted()}));j(t)&&(t=$e(t));var o=new we;return i.add(o),o.setDisposable(t.subscribe(function(){r=!0,o.dispose()},n.onError.bind(n),function(){o.dispose()})),i})},Me["switch"]=Me.switchLatest=function(){var t=this;return new on(function(e){var n=!1,r=new ge,i=!1,o=0,s=t.subscribe(function(t){var s=new we,u=++o;n=!0,r.setDisposable(s),j(t)&&(t=$e(t)),s.setDisposable(t.subscribe(function(t){o===u&&e.onNext(t)},function(t){o===u&&e.onError(t)},function(){o===u&&(n=!1,i&&e.onCompleted())}))},e.onError.bind(e),function(){i=!0,n||e.onCompleted()});return new pe(s,r)})},Me.takeUntil=function(t){var e=this;return new on(function(n){return j(t)&&(t=$e(t)),new pe(e.subscribe(n),t.subscribe(n.onCompleted.bind(n),n.onError.bind(n),D))})},Me.zip=function(){if(Array.isArray(arguments[0]))return d.apply(this,arguments);var e=this,n=ie.call(arguments),r=n.pop();return n.unshift(e),new on(function(i){function o(n){var o,s;if(c.every(function(t){return t.length>0})){try{s=c.map(function(t){return t.shift()}),o=r.apply(e,s)}catch(u){return i.onError(u),t}i.onNext(o)}else a.filter(function(t,e){return e!==n}).every(S)&&i.onCompleted()}function s(t){a[t]=!0,a.every(function(t){return t})&&i.onCompleted()}for(var u=n.length,c=l(u,function(){return[]}),a=l(u,function(){return!1}),h=Array(u),f=0;u>f;f++)(function(t){var e=n[t],r=new we; +j(e)&&(e=$e(e)),r.setDisposable(e.subscribe(function(e){c[t].push(e),o(t)},i.onError.bind(i),function(){s(t)})),h[t]=r})(f);return new pe(h)})},Qe.zip=function(){var t=ie.call(arguments,0),e=t.shift();return e.zip.apply(e,t)},Qe.zipArray=function(){var e=h(arguments,0);return new on(function(n){function r(e){if(s.every(function(t){return t.length>0})){var r=s.map(function(t){return t.shift()});n.onNext(r)}else if(u.filter(function(t,n){return n!==e}).every(S))return n.onCompleted(),t}function i(e){return u[e]=!0,u.every(S)?(n.onCompleted(),t):t}for(var o=e.length,s=l(o,function(){return[]}),u=l(o,function(){return!1}),c=Array(o),a=0;o>a;a++)(function(t){c[t]=new we,c[t].setDisposable(e[t].subscribe(function(e){s[t].push(e),r(t)},n.onError.bind(n),function(){i(t)}))})(a);var h=new pe(c);return h.add(be(function(){for(var t=0,e=s.length;e>t;t++)s[t]=[]})),h})},Me.asObservable=function(){var t=this;return new on(function(e){return t.subscribe(e)})},Me.bufferWithCount=function(t,e){return"number"!=typeof e&&(e=t),this.windowWithCount(t,e).selectMany(function(t){return t.toArray()}).where(function(t){return t.length>0})},Me.dematerialize=function(){var t=this;return new on(function(e){return t.subscribe(function(t){return t.accept(e)},e.onError.bind(e),e.onCompleted.bind(e))})},Me.distinctUntilChanged=function(e,n){var r=this;return e||(e=S),n||(n=N),new on(function(i){var o,s=!1;return r.subscribe(function(r){var u,c=!1;try{u=e(r)}catch(a){return i.onError(a),t}if(s)try{c=n(o,u)}catch(a){return i.onError(a),t}s&&c||(s=!0,o=u,i.onNext(r))},i.onError.bind(i),i.onCompleted.bind(i))})},Me["do"]=Me.doAction=function(t,e,n){var r,i=this;return"function"==typeof t?r=t:(r=t.onNext.bind(t),e=t.onError.bind(t),n=t.onCompleted.bind(t)),new on(function(t){return i.subscribe(function(e){try{r(e)}catch(n){t.onError(n)}t.onNext(e)},function(n){if(e){try{e(n)}catch(r){t.onError(r)}t.onError(n)}else t.onError(n)},function(){if(n){try{n()}catch(e){t.onError(e)}t.onCompleted()}else t.onCompleted()})})},Me["finally"]=Me.finallyAction=function(t){var e=this;return new on(function(n){var r;try{r=e.subscribe(n)}catch(i){throw t(),i}return be(function(){try{r.dispose()}catch(e){throw e}finally{t()}})})},Me.ignoreElements=function(){var t=this;return new on(function(e){return t.subscribe(D,e.onError.bind(e),e.onCompleted.bind(e))})},Me.materialize=function(){var t=this;return new on(function(e){return t.subscribe(function(t){e.onNext(je(t))},function(t){e.onNext(Re(t)),e.onCompleted()},function(){e.onNext(ke()),e.onCompleted()})})},Me.repeat=function(t){return Te(this,t).concat()},Me.retry=function(t){return Te(this,t).catchException()},Me.scan=function(){var e,n,r=!1,i=this;return 2===arguments.length?(r=!0,e=arguments[0],n=arguments[1]):n=arguments[0],new on(function(o){var s,u,c;return i.subscribe(function(i){try{c||(c=!0),s?u=n(u,i):(u=r?n(e,i):i,s=!0)}catch(a){return o.onError(a),t}o.onNext(u)},o.onError.bind(o),function(){!c&&r&&o.onNext(e),o.onCompleted()})})},Me.skipLast=function(t){var e=this;return new on(function(n){var r=[];return e.subscribe(function(e){r.push(e),r.length>t&&n.onNext(r.shift())},n.onError.bind(n),n.onCompleted.bind(n))})},Me.startWith=function(){var t,e,n=0;return arguments.length&&"now"in Object(arguments[0])?(e=arguments[0],n=1):e=Ae,t=ie.call(arguments,n),Ve([Je(t,e),this]).concat()},Me.takeLast=function(t,e){return this.takeLastBuffer(t).selectMany(function(t){return Je(t,e)})},Me.takeLastBuffer=function(t){var e=this;return new on(function(n){var r=[];return e.subscribe(function(e){r.push(e),r.length>t&&r.shift()},n.onError.bind(n),function(){n.onNext(r),n.onCompleted()})})},Me.windowWithCount=function(t,e){var n=this;if(0>=t)throw Error(R);if(1===arguments.length&&(e=t),0>=e)throw Error(R);return new on(function(r){var i=new we,o=new Ee(i),s=0,u=[],c=function(){var t=new an;u.push(t),r.onNext(ue(t,o))};return c(),i.setDisposable(n.subscribe(function(n){for(var r,i=0,o=u.length;o>i;i++)u[i].onNext(n);var a=s-t+1;a>=0&&0===a%e&&(r=u.shift(),r.onCompleted()),s++,0===s%e&&c()},function(t){for(;u.length>0;)u.shift().onError(t);r.onError(t)},function(){for(;u.length>0;)u.shift().onCompleted();r.onCompleted()})),o})},Me.selectConcat=Me.concatMap=function(t,e){return e?this.concatMap(function(n,r){var i=t(n,r),o=j(i)?$e(i):i;return o.map(function(t){return e(n,t,r)})}):"function"==typeof t?v.call(this,t):v.call(this,function(){return t})},Me.defaultIfEmpty=function(e){var n=this;return e===t&&(e=null),new on(function(t){var r=!1;return n.subscribe(function(e){r=!0,t.onNext(e)},t.onError.bind(t),function(){r||t.onNext(e),t.onCompleted()})})},Me.distinct=function(e,n){var r=this;return e||(e=S),n||(n=O),new on(function(i){var o={};return r.subscribe(function(r){var s,u,c,a=!1;try{s=e(r),u=n(s)}catch(h){return i.onError(h),t}for(c in o)if(u===c){a=!0;break}a||(o[u]=null,i.onNext(r))},i.onError.bind(i),i.onCompleted.bind(i))})},Me.groupBy=function(t,e,n){return this.groupByUntil(t,e,function(){return Xe()},n)},Me.groupByUntil=function(e,n,r,i){var o=this;return n||(n=S),i||(i=O),new on(function(s){var u={},c=new pe,a=new Ee(c);return c.add(o.subscribe(function(o){var h,l,f,p,d,v,b,m,y,w;try{v=e(o),b=i(v)}catch(g){for(w in u)u[w].onError(g);return s.onError(g),t}p=!1;try{y=u[b],y||(y=new an,u[b]=y,p=!0)}catch(g){for(w in u)u[w].onError(g);return s.onError(g),t}if(p){d=new un(v,y,a),l=new un(v,y);try{h=r(l)}catch(g){for(w in u)u[w].onError(g);return s.onError(g),t}s.onNext(d),m=new we,c.add(m);var E=function(){b in u&&(delete u[b],y.onCompleted()),c.remove(m)};m.setDisposable(h.take(1).subscribe(D,function(t){for(w in u)u[w].onError(t);s.onError(t)},function(){E()}))}try{f=n(o)}catch(g){for(w in u)u[w].onError(g);return s.onError(g),t}y.onNext(f)},function(t){for(var e in u)u[e].onError(t);s.onError(t)},function(){for(var t in u)u[t].onCompleted();s.onCompleted()})),a})},Me.select=Me.map=function(e,n){var r=this;return new on(function(i){var o=0;return r.subscribe(function(s){var u;try{u=e.call(n,s,o++,r)}catch(c){return i.onError(c),t}i.onNext(u)},i.onError.bind(i),i.onCompleted.bind(i))})},Me.pluck=function(t){return this.select(function(e){return e[t]})},Me.selectMany=Me.flatMap=function(t,e){return e?this.selectMany(function(n,r){var i=t(n,r),o=j(i)?$e(i):i;return o.select(function(t){return e(n,t,r)})}):"function"==typeof t?b.call(this,t):b.call(this,function(){return t})},Me.selectSwitch=Me.flatMapLatest=Me.switchMap=function(t,e){return this.select(t,e).switchLatest()},Me.skip=function(t){if(0>t)throw Error(R);var e=this;return new on(function(n){var r=t;return e.subscribe(function(t){0>=r?n.onNext(t):r--},n.onError.bind(n),n.onCompleted.bind(n))})},Me.skipWhile=function(e,n){var r=this;return new on(function(i){var o=0,s=!1;return r.subscribe(function(u){if(!s)try{s=!e.call(n,u,o++,r)}catch(c){return i.onError(c),t}s&&i.onNext(u)},i.onError.bind(i),i.onCompleted.bind(i))})},Me.take=function(t,e){if(0>t)throw Error(R);if(0===t)return Ke(e);var n=this;return new on(function(e){var r=t;return n.subscribe(function(t){r>0&&(r--,e.onNext(t),0===r&&e.onCompleted())},e.onError.bind(e),e.onCompleted.bind(e))})},Me.takeWhile=function(e,n){var r=this;return new on(function(i){var o=0,s=!0;return r.subscribe(function(u){if(s){try{s=e.call(n,u,o++,r)}catch(c){return i.onError(c),t}s?i.onNext(u):i.onCompleted()}},i.onError.bind(i),i.onCompleted.bind(i))})},Me.where=Me.filter=function(e,n){var r=this;return new on(function(i){var o=0;return r.subscribe(function(s){var u;try{u=e.call(n,s,o++,r)}catch(c){return i.onError(c),t}u&&i.onNext(s)},i.onError.bind(i),i.onCompleted.bind(i))})},Me.exclusive=function(){var t=this;return new on(function(e){var n=!1,r=!1,i=new we,o=new pe;return o.add(i),i.setDisposable(t.subscribe(function(t){if(!n){n=!0,j(t)&&(t=$e(t));var i=new we;o.add(i),i.setDisposable(t.subscribe(e.onNext.bind(e),e.onError.bind(e),function(){o.remove(i),n=!1,r&&1===o.length&&e.onCompleted()}))}},e.onError.bind(e),function(){r=!0,n||1!==o.length||e.onCompleted()})),o})},Me.exclusiveMap=function(e,n){var r=this;return new on(function(i){var o=0,s=!1,u=!0,c=new we,a=new pe;return a.add(c),c.setDisposable(r.subscribe(function(r){s||(s=!0,innerSubscription=new we,a.add(innerSubscription),j(r)&&(r=$e(r)),innerSubscription.setDisposable(r.subscribe(function(s){var u;try{u=e.call(n,s,o++,r)}catch(c){return i.onError(c),t}i.onNext(u)},i.onError.bind(i),function(){a.remove(innerSubscription),s=!1,u&&1===a.length&&i.onCompleted()})))},i.onError.bind(i),function(){u=!0,1!==a.length||s||i.onCompleted()})),a})};var on=C.AnonymousObservable=function(e){function n(e){return e===t?e=me:"function"==typeof e&&(e=be(e)),e}function r(i){function o(t){var e=function(){try{r.setDisposable(n(i(r)))}catch(t){if(!r.fail(t))throw t}},r=new sn(t);return Ne.scheduleRequired()?Ne.schedule(e):e(),r}return this instanceof r?(e.call(this,o),t):new r(i)}return oe(r,e),r}(Qe),sn=function(t){function e(e){t.call(this),this.observer=e,this.m=new we}oe(e,t);var n=e.prototype;return n.next=function(t){var e=!1;try{this.observer.onNext(t),e=!0}catch(n){throw n}finally{e||this.dispose()}},n.error=function(t){try{this.observer.onError(t)}catch(e){throw e}finally{this.dispose()}},n.completed=function(){try{this.observer.onCompleted()}catch(t){throw t}finally{this.dispose()}},n.setDisposable=function(t){this.m.setDisposable(t)},n.getDisposable=function(){return this.m.getDisposable()},n.disposable=function(t){return arguments.length?this.getDisposable():setDisposable(t)},n.dispose=function(){t.prototype.dispose.call(this),this.m.dispose()},e}(Ie),un=function(t){function e(t){return this.underlyingObservable.subscribe(t)}function n(n,r,i){t.call(this,e),this.key=n,this.underlyingObservable=i?new on(function(t){return new pe(i.getDisposable(),r.subscribe(t))}):r}return oe(n,t),n}(Qe),cn=function(t,e){this.subject=t,this.observer=e};cn.prototype.dispose=function(){if(!this.subject.isDisposed&&null!==this.observer){var t=this.subject.observers.indexOf(this.observer);this.subject.observers.splice(t,1),this.observer=null}};var an=C.Subject=function(t){function n(t){return e.call(this),this.isStopped?this.exception?(t.onError(this.exception),me):(t.onCompleted(),me):(this.observers.push(t),new cn(this,t))}function r(){t.call(this,n),this.isDisposed=!1,this.isStopped=!1,this.observers=[]}return oe(r,t),se(r.prototype,Le,{hasObservers:function(){return this.observers.length>0},onCompleted:function(){if(e.call(this),!this.isStopped){var t=this.observers.slice(0);this.isStopped=!0;for(var n=0,r=t.length;r>n;n++)t[n].onCompleted();this.observers=[]}},onError:function(t){if(e.call(this),!this.isStopped){var n=this.observers.slice(0);this.isStopped=!0,this.exception=t;for(var r=0,i=n.length;i>r;r++)n[r].onError(t);this.observers=[]}},onNext:function(t){if(e.call(this),!this.isStopped)for(var n=this.observers.slice(0),r=0,i=n.length;i>r;r++)n[r].onNext(t)},dispose:function(){this.isDisposed=!0,this.observers=null}}),r.create=function(t,e){return new hn(t,e)},r}(Qe);C.AsyncSubject=function(t){function n(t){if(e.call(this),!this.isStopped)return this.observers.push(t),new cn(this,t);var n=this.exception,r=this.hasValue,i=this.value;return n?t.onError(n):r?(t.onNext(i),t.onCompleted()):t.onCompleted(),me}function r(){t.call(this,n),this.isDisposed=!1,this.isStopped=!1,this.value=null,this.hasValue=!1,this.observers=[],this.exception=null}return oe(r,t),se(r.prototype,Le,{hasObservers:function(){return e.call(this),this.observers.length>0},onCompleted:function(){var t,n,r;if(e.call(this),!this.isStopped){this.isStopped=!0;var i=this.observers.slice(0),o=this.value,s=this.hasValue;if(s)for(n=0,r=i.length;r>n;n++)t=i[n],t.onNext(o),t.onCompleted();else for(n=0,r=i.length;r>n;n++)i[n].onCompleted();this.observers=[]}},onError:function(t){if(e.call(this),!this.isStopped){var n=this.observers.slice(0);this.isStopped=!0,this.exception=t;for(var r=0,i=n.length;i>r;r++)n[r].onError(t);this.observers=[]}},onNext:function(t){e.call(this),this.isStopped||(this.value=t,this.hasValue=!0)},dispose:function(){this.isDisposed=!0,this.observers=null,this.exception=null,this.value=null}}),r}(Qe);var hn=function(t){function e(t){return this.observable.subscribe(t)}function n(n,r){t.call(this,e),this.observer=n,this.observable=r}return oe(n,t),se(n.prototype,Le,{onCompleted:function(){this.observer.onCompleted()},onError:function(t){this.observer.onError(t)},onNext:function(t){this.observer.onNext(t)}}),n}(Qe);"function"==typeof define&&"object"==typeof define.amd&&define.amd?(y.Rx=C,define(function(){return C})):w&&g?E?(g.exports=C).Rx=C:w.Rx=C:y.Rx=C}).call(this); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.core.compat.js b/ajax/libs/rxjs/2.2.28/rx.core.compat.js new file mode 100644 index 000000000..3c9b38f5d --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.core.compat.js @@ -0,0 +1,2627 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +;(function (undefined) { + + var objectTypes = { + 'boolean': false, + 'function': true, + 'object': true, + 'number': false, + 'string': false, + 'undefined': false + }; + + var root = (objectTypes[typeof window] && window) || this, + freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports, + freeModule = objectTypes[typeof module] && module && !module.nodeType && module, + moduleExports = freeModule && freeModule.exports === freeExports && freeExports, + freeGlobal = objectTypes[typeof global] && global; + + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) { + root = freeGlobal; + } + + var Rx = { + internals: {}, + config: { + Promise: root.Promise // Detect if promise exists + }, + helpers: { } + }; + + // Defaults + var noop = Rx.helpers.noop = function () { }, + identity = Rx.helpers.identity = function (x) { return x; }, + pluck = Rx.helpers.pluck = function (property) { return function (x) { return x[property]; }; }, + just = Rx.helpers.just = function (value) { return function () { return value; }; }, + defaultNow = Rx.helpers.defaultNow = (function () { return !!Date.now ? Date.now : function () { return +new Date; }; }()), + defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); }, + defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); }, + defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); }, + defaultError = Rx.helpers.defaultError = function (err) { throw err; }, + isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.then === 'function' && p.then !== Rx.Observable.prototype.then; }, + asArray = Rx.helpers.asArray = function () { return Array.prototype.slice.call(arguments); }, + not = Rx.helpers.not = function (a) { return !a; }; + + // Errors + var sequenceContainsNoElements = 'Sequence contains no elements.'; + var argumentOutOfRange = 'Argument out of range'; + var objectDisposed = 'Object has been disposed'; + function checkDisposed() { if (this.isDisposed) { throw new Error(objectDisposed); } } + + // Shim in iterator support + var $iterator$ = (typeof Symbol === 'object' && Symbol.iterator) || + '_es6shim_iterator_'; + // Firefox ships a partial implementation using the name @@iterator. + // https://bugzilla.mozilla.org/show_bug.cgi?id=907077#c14 + // So use that name if we detect it. + if (root.Set && typeof new root.Set()['@@iterator'] === 'function') { + $iterator$ = '@@iterator'; + } + var doneEnumerator = { done: true, value: undefined }; + + /** `Object#toString` result shortcuts */ + var argsClass = '[object Arguments]', + arrayClass = '[object Array]', + boolClass = '[object Boolean]', + dateClass = '[object Date]', + errorClass = '[object Error]', + funcClass = '[object Function]', + numberClass = '[object Number]', + objectClass = '[object Object]', + regexpClass = '[object RegExp]', + stringClass = '[object String]'; + + var toString = Object.prototype.toString, + hasOwnProperty = Object.prototype.hasOwnProperty, + supportsArgsClass = toString.call(arguments) == argsClass, // For less -1); + } + }); + } + } + stackA.pop(); + stackB.pop(); + + return result; + } + var slice = Array.prototype.slice; + function argsOrArray(args, idx) { + return args.length === 1 && Array.isArray(args[idx]) ? + args[idx] : + slice.call(args); + } + var hasProp = {}.hasOwnProperty; + + /** @private */ + var inherits = this.inherits = Rx.internals.inherits = function (child, parent) { + function __() { this.constructor = child; } + __.prototype = parent.prototype; + child.prototype = new __(); + }; + + /** @private */ + var addProperties = Rx.internals.addProperties = function (obj) { + var sources = slice.call(arguments, 1); + for (var i = 0, len = sources.length; i < len; i++) { + var source = sources[i]; + for (var prop in source) { + obj[prop] = source[prop]; + } + } + }; + + // Rx Utils + var addRef = Rx.internals.addRef = function (xs, r) { + return new AnonymousObservable(function (observer) { + return new CompositeDisposable(r.getDisposable(), xs.subscribe(observer)); + }); + }; + + // Collection polyfills + function arrayInitialize(count, factory) { + var a = new Array(count); + for (var i = 0; i < count; i++) { + a[i] = factory(); + } + return a; + } + + // Utilities + if (!Function.prototype.bind) { + Function.prototype.bind = function (that) { + var target = this, + args = slice.call(arguments, 1); + var bound = function () { + if (this instanceof bound) { + function F() { } + F.prototype = target.prototype; + var self = new F(); + var result = target.apply(self, args.concat(slice.call(arguments))); + if (Object(result) === result) { + return result; + } + return self; + } else { + return target.apply(that, args.concat(slice.call(arguments))); + } + }; + + return bound; + }; + } + + var boxedString = Object("a"), + splitString = boxedString[0] != "a" || !(0 in boxedString); + if (!Array.prototype.every) { + Array.prototype.every = function every(fun /*, thisp */) { + var object = Object(this), + self = splitString && {}.toString.call(this) == stringClass ? + this.split("") : + object, + length = self.length >>> 0, + thisp = arguments[1]; + + if ({}.toString.call(fun) != funcClass) { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self && !fun.call(thisp, self[i], i, object)) { + return false; + } + } + return true; + }; + } + + if (!Array.prototype.map) { + Array.prototype.map = function map(fun /*, thisp*/) { + var object = Object(this), + self = splitString && {}.toString.call(this) == stringClass ? + this.split("") : + object, + length = self.length >>> 0, + result = Array(length), + thisp = arguments[1]; + + if ({}.toString.call(fun) != funcClass) { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self) + result[i] = fun.call(thisp, self[i], i, object); + } + return result; + }; + } + + if (!Array.prototype.filter) { + Array.prototype.filter = function (predicate) { + var results = [], item, t = new Object(this); + for (var i = 0, len = t.length >>> 0; i < len; i++) { + item = t[i]; + if (i in t && predicate.call(arguments[1], item, i, t)) { + results.push(item); + } + } + return results; + }; + } + + if (!Array.isArray) { + Array.isArray = function (arg) { + return Object.prototype.toString.call(arg) == arrayClass; + }; + } + + if (!Array.prototype.indexOf) { + Array.prototype.indexOf = function indexOf(searchElement) { + var t = Object(this); + var len = t.length >>> 0; + if (len === 0) { + return -1; + } + var n = 0; + if (arguments.length > 1) { + n = Number(arguments[1]); + if (n !== n) { + n = 0; + } else if (n !== 0 && n != Infinity && n !== -Infinity) { + n = (n > 0 || -1) * Math.floor(Math.abs(n)); + } + } + if (n >= len) { + return -1; + } + var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); + for (; k < len; k++) { + if (k in t && t[k] === searchElement) { + return k; + } + } + return -1; + }; + } + + // Collections + var IndexedItem = function (id, value) { + this.id = id; + this.value = value; + }; + + IndexedItem.prototype.compareTo = function (other) { + var c = this.value.compareTo(other.value); + if (c === 0) { + c = this.id - other.id; + } + return c; + }; + + // Priority Queue for Scheduling + var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) { + this.items = new Array(capacity); + this.length = 0; + }; + + var priorityProto = PriorityQueue.prototype; + priorityProto.isHigherPriority = function (left, right) { + return this.items[left].compareTo(this.items[right]) < 0; + }; + + priorityProto.percolate = function (index) { + if (index >= this.length || index < 0) { + return; + } + var parent = index - 1 >> 1; + if (parent < 0 || parent === index) { + return; + } + if (this.isHigherPriority(index, parent)) { + var temp = this.items[index]; + this.items[index] = this.items[parent]; + this.items[parent] = temp; + this.percolate(parent); + } + }; + + priorityProto.heapify = function (index) { + if (index === undefined) { + index = 0; + } + if (index >= this.length || index < 0) { + return; + } + var left = 2 * index + 1, + right = 2 * index + 2, + first = index; + if (left < this.length && this.isHigherPriority(left, first)) { + first = left; + } + if (right < this.length && this.isHigherPriority(right, first)) { + first = right; + } + if (first !== index) { + var temp = this.items[index]; + this.items[index] = this.items[first]; + this.items[first] = temp; + this.heapify(first); + } + }; + + priorityProto.peek = function () { return this.items[0].value; }; + + priorityProto.removeAt = function (index) { + this.items[index] = this.items[--this.length]; + delete this.items[this.length]; + this.heapify(); + }; + + priorityProto.dequeue = function () { + var result = this.peek(); + this.removeAt(0); + return result; + }; + + priorityProto.enqueue = function (item) { + var index = this.length++; + this.items[index] = new IndexedItem(PriorityQueue.count++, item); + this.percolate(index); + }; + + priorityProto.remove = function (item) { + for (var i = 0; i < this.length; i++) { + if (this.items[i].value === item) { + this.removeAt(i); + return true; + } + } + return false; + }; + PriorityQueue.count = 0; + /** + * Represents a group of disposable resources that are disposed together. + * @constructor + */ + var CompositeDisposable = Rx.CompositeDisposable = function () { + this.disposables = argsOrArray(arguments, 0); + this.isDisposed = false; + this.length = this.disposables.length; + }; + + var CompositeDisposablePrototype = CompositeDisposable.prototype; + + /** + * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed. + * @param {Mixed} item Disposable to add. + */ + CompositeDisposablePrototype.add = function (item) { + if (this.isDisposed) { + item.dispose(); + } else { + this.disposables.push(item); + this.length++; + } + }; + + /** + * Removes and disposes the first occurrence of a disposable from the CompositeDisposable. + * @param {Mixed} item Disposable to remove. + * @returns {Boolean} true if found; false otherwise. + */ + CompositeDisposablePrototype.remove = function (item) { + var shouldDispose = false; + if (!this.isDisposed) { + var idx = this.disposables.indexOf(item); + if (idx !== -1) { + shouldDispose = true; + this.disposables.splice(idx, 1); + this.length--; + item.dispose(); + } + + } + return shouldDispose; + }; + + /** + * Disposes all disposables in the group and removes them from the group. + */ + CompositeDisposablePrototype.dispose = function () { + if (!this.isDisposed) { + this.isDisposed = true; + var currentDisposables = this.disposables.slice(0); + this.disposables = []; + this.length = 0; + + for (var i = 0, len = currentDisposables.length; i < len; i++) { + currentDisposables[i].dispose(); + } + } + }; + + /** + * Removes and disposes all disposables from the CompositeDisposable, but does not dispose the CompositeDisposable. + */ + CompositeDisposablePrototype.clear = function () { + var currentDisposables = this.disposables.slice(0); + this.disposables = []; + this.length = 0; + for (var i = 0, len = currentDisposables.length; i < len; i++) { + currentDisposables[i].dispose(); + } + }; + + /** + * Determines whether the CompositeDisposable contains a specific disposable. + * @param {Mixed} item Disposable to search for. + * @returns {Boolean} true if the disposable was found; otherwise, false. + */ + CompositeDisposablePrototype.contains = function (item) { + return this.disposables.indexOf(item) !== -1; + }; + + /** + * Converts the existing CompositeDisposable to an array of disposables + * @returns {Array} An array of disposable objects. + */ + CompositeDisposablePrototype.toArray = function () { + return this.disposables.slice(0); + }; + + /** + * Provides a set of static methods for creating Disposables. + * + * @constructor + * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once. + */ + var Disposable = Rx.Disposable = function (action) { + this.isDisposed = false; + this.action = action || noop; + }; + + /** Performs the task of cleaning up resources. */ + Disposable.prototype.dispose = function () { + if (!this.isDisposed) { + this.action(); + this.isDisposed = true; + } + }; + + /** + * Creates a disposable object that invokes the specified action when disposed. + * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once. + * @return {Disposable} The disposable object that runs the given action upon disposal. + */ + var disposableCreate = Disposable.create = function (action) { return new Disposable(action); }; + + /** + * Gets the disposable that does nothing when disposed. + */ + var disposableEmpty = Disposable.empty = { dispose: noop }; + + var BooleanDisposable = (function () { + function BooleanDisposable (isSingle) { + this.isSingle = isSingle; + this.isDisposed = false; + this.current = null; + } + + var booleanDisposablePrototype = BooleanDisposable.prototype; + + /** + * Gets the underlying disposable. + * @return The underlying disposable. + */ + booleanDisposablePrototype.getDisposable = function () { + return this.current; + }; + + /** + * Sets the underlying disposable. + * @param {Disposable} value The new underlying disposable. + */ + booleanDisposablePrototype.setDisposable = function (value) { + if (this.current && this.isSingle) { + throw new Error('Disposable has already been assigned'); + } + + var shouldDispose = this.isDisposed, old; + if (!shouldDispose) { + old = this.current; + this.current = value; + } + if (old) { + old.dispose(); + } + if (shouldDispose && value) { + value.dispose(); + } + }; + + /** + * Disposes the underlying disposable as well as all future replacements. + */ + booleanDisposablePrototype.dispose = function () { + var old; + if (!this.isDisposed) { + this.isDisposed = true; + old = this.current; + this.current = null; + } + if (old) { + old.dispose(); + } + }; + + return BooleanDisposable; + }()); + + /** + * Represents a disposable resource which only allows a single assignment of its underlying disposable resource. + * If an underlying disposable resource has already been set, future attempts to set the underlying disposable resource will throw an Error. + */ + var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = (function (super_) { + inherits(SingleAssignmentDisposable, super_); + + function SingleAssignmentDisposable() { + super_.call(this, true); + } + + return SingleAssignmentDisposable; + }(BooleanDisposable)); + + /** + * Represents a disposable resource whose underlying disposable resource can be replaced by another disposable resource, causing automatic disposal of the previous underlying disposable resource. + */ + var SerialDisposable = Rx.SerialDisposable = (function (super_) { + inherits(SerialDisposable, super_); + + function SerialDisposable() { + super_.call(this, false); + } + + return SerialDisposable; + }(BooleanDisposable)); + + /** + * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed. + */ + var RefCountDisposable = Rx.RefCountDisposable = (function () { + + function InnerDisposable(disposable) { + this.disposable = disposable; + this.disposable.count++; + this.isInnerDisposed = false; + } + + InnerDisposable.prototype.dispose = function () { + if (!this.disposable.isDisposed) { + if (!this.isInnerDisposed) { + this.isInnerDisposed = true; + this.disposable.count--; + if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) { + this.disposable.isDisposed = true; + this.disposable.underlyingDisposable.dispose(); + } + } + } + }; + + /** + * Initializes a new instance of the RefCountDisposable with the specified disposable. + * @constructor + * @param {Disposable} disposable Underlying disposable. + */ + function RefCountDisposable(disposable) { + this.underlyingDisposable = disposable; + this.isDisposed = false; + this.isPrimaryDisposed = false; + this.count = 0; + } + + /** + * Disposes the underlying disposable only when all dependent disposables have been disposed + */ + RefCountDisposable.prototype.dispose = function () { + if (!this.isDisposed) { + if (!this.isPrimaryDisposed) { + this.isPrimaryDisposed = true; + if (this.count === 0) { + this.isDisposed = true; + this.underlyingDisposable.dispose(); + } + } + } + }; + + /** + * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable. + * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime. + */ + RefCountDisposable.prototype.getDisposable = function () { + return this.isDisposed ? disposableEmpty : new InnerDisposable(this); + }; + + return RefCountDisposable; + })(); + + function ScheduledDisposable(scheduler, disposable) { + this.scheduler = scheduler; + this.disposable = disposable; + this.isDisposed = false; + } + + ScheduledDisposable.prototype.dispose = function () { + var parent = this; + this.scheduler.schedule(function () { + if (!parent.isDisposed) { + parent.isDisposed = true; + parent.disposable.dispose(); + } + }); + }; + + var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) { + this.scheduler = scheduler; + this.state = state; + this.action = action; + this.dueTime = dueTime; + this.comparer = comparer || defaultSubComparer; + this.disposable = new SingleAssignmentDisposable(); + } + + ScheduledItem.prototype.invoke = function () { + this.disposable.setDisposable(this.invokeCore()); + }; + + ScheduledItem.prototype.compareTo = function (other) { + return this.comparer(this.dueTime, other.dueTime); + }; + + ScheduledItem.prototype.isCancelled = function () { + return this.disposable.isDisposed; + }; + + ScheduledItem.prototype.invokeCore = function () { + return this.action(this.scheduler, this.state); + }; + + /** Provides a set of static properties to access commonly used schedulers. */ + var Scheduler = Rx.Scheduler = (function () { + + /** + * @constructor + * @private + */ + function Scheduler(now, schedule, scheduleRelative, scheduleAbsolute) { + this.now = now; + this._schedule = schedule; + this._scheduleRelative = scheduleRelative; + this._scheduleAbsolute = scheduleAbsolute; + } + + function invokeRecImmediate(scheduler, pair) { + var state = pair.first, action = pair.second, group = new CompositeDisposable(), + recursiveAction = function (state1) { + action(state1, function (state2) { + var isAdded = false, isDone = false, + d = scheduler.scheduleWithState(state2, function (scheduler1, state3) { + if (isAdded) { + group.remove(d); + } else { + isDone = true; + } + recursiveAction(state3); + return disposableEmpty; + }); + if (!isDone) { + group.add(d); + isAdded = true; + } + }); + }; + recursiveAction(state); + return group; + } + + function invokeRecDate(scheduler, pair, method) { + var state = pair.first, action = pair.second, group = new CompositeDisposable(), + recursiveAction = function (state1) { + action(state1, function (state2, dueTime1) { + var isAdded = false, isDone = false, + d = scheduler[method].call(scheduler, state2, dueTime1, function (scheduler1, state3) { + if (isAdded) { + group.remove(d); + } else { + isDone = true; + } + recursiveAction(state3); + return disposableEmpty; + }); + if (!isDone) { + group.add(d); + isAdded = true; + } + }); + }; + recursiveAction(state); + return group; + } + + function invokeAction(scheduler, action) { + action(); + return disposableEmpty; + } + + var schedulerProto = Scheduler.prototype; + + /** + * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions. + * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false. + * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling. + */ + schedulerProto.catchException = schedulerProto['catch'] = function (handler) { + return new CatchScheduler(this, handler); + }; + + /** + * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation. + * @param {Number} period Period for running the work periodically. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort). + */ + schedulerProto.schedulePeriodic = function (period, action) { + return this.schedulePeriodicWithState(null, period, function () { + action(); + }); + }; + + /** + * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation. + * @param {Mixed} state Initial state passed to the action upon the first iteration. + * @param {Number} period Period for running the work periodically. + * @param {Function} action Action to be executed, potentially updating the state. + * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort). + */ + schedulerProto.schedulePeriodicWithState = function (state, period, action) { + var s = state, id = setInterval(function () { + s = action(s); + }, period); + return disposableCreate(function () { + clearInterval(id); + }); + }; + + /** + * Schedules an action to be executed. + * @param {Function} action Action to execute. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.schedule = function (action) { + return this._schedule(action, invokeAction); + }; + + /** + * Schedules an action to be executed. + * @param state State passed to the action to be executed. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithState = function (state, action) { + return this._schedule(state, action); + }; + + /** + * Schedules an action to be executed after the specified relative due time. + * @param {Function} action Action to execute. + * @param {Number} dueTime Relative time after which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithRelative = function (dueTime, action) { + return this._scheduleRelative(action, dueTime, invokeAction); + }; + + /** + * Schedules an action to be executed after dueTime. + * @param state State passed to the action to be executed. + * @param {Function} action Action to be executed. + * @param {Number} dueTime Relative time after which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithRelativeAndState = function (state, dueTime, action) { + return this._scheduleRelative(state, dueTime, action); + }; + + /** + * Schedules an action to be executed at the specified absolute due time. + * @param {Function} action Action to execute. + * @param {Number} dueTime Absolute time at which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithAbsolute = function (dueTime, action) { + return this._scheduleAbsolute(action, dueTime, invokeAction); + }; + + /** + * Schedules an action to be executed at dueTime. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to be executed. + * @param {Number}dueTime Absolute time at which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithAbsoluteAndState = function (state, dueTime, action) { + return this._scheduleAbsolute(state, dueTime, action); + }; + + /** + * Schedules an action to be executed recursively. + * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursive = function (action) { + return this.scheduleRecursiveWithState(action, function (_action, self) { + _action(function () { + self(_action); + }); + }); + }; + + /** + * Schedules an action to be executed recursively. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithState = function (state, action) { + return this.scheduleWithState({ first: state, second: action }, function (s, p) { + return invokeRecImmediate(s, p); + }); + }; + + /** + * Schedules an action to be executed recursively after a specified relative due time. + * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified relative time. + * @param {Number}dueTime Relative time after which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithRelative = function (dueTime, action) { + return this.scheduleRecursiveWithRelativeAndState(action, dueTime, function (_action, self) { + _action(function (dt) { + self(_action, dt); + }); + }); + }; + + /** + * Schedules an action to be executed recursively after a specified relative due time. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state. + * @param {Number}dueTime Relative time after which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithRelativeAndState = function (state, dueTime, action) { + return this._scheduleRelative({ first: state, second: action }, dueTime, function (s, p) { + return invokeRecDate(s, p, 'scheduleWithRelativeAndState'); + }); + }; + + /** + * Schedules an action to be executed recursively at a specified absolute due time. + * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified absolute time. + * @param {Number}dueTime Absolute time at which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithAbsolute = function (dueTime, action) { + return this.scheduleRecursiveWithAbsoluteAndState(action, dueTime, function (_action, self) { + _action(function (dt) { + self(_action, dt); + }); + }); + }; + + /** + * Schedules an action to be executed recursively at a specified absolute due time. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state. + * @param {Number}dueTime Absolute time at which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithAbsoluteAndState = function (state, dueTime, action) { + return this._scheduleAbsolute({ first: state, second: action }, dueTime, function (s, p) { + return invokeRecDate(s, p, 'scheduleWithAbsoluteAndState'); + }); + }; + + /** Gets the current time according to the local machine's system clock. */ + Scheduler.now = defaultNow; + + /** + * Normalizes the specified TimeSpan value to a positive value. + * @param {Number} timeSpan The time span value to normalize. + * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0 + */ + Scheduler.normalize = function (timeSpan) { + if (timeSpan < 0) { + timeSpan = 0; + } + return timeSpan; + }; + + return Scheduler; + }()); + + var normalizeTime = Scheduler.normalize; + + var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () { + function tick(command, recurse) { + recurse(0, this._period); + try { + this._state = this._action(this._state); + } catch (e) { + this._cancel.dispose(); + throw e; + } + } + + function SchedulePeriodicRecursive(scheduler, state, period, action) { + this._scheduler = scheduler; + this._state = state; + this._period = period; + this._action = action; + } + + SchedulePeriodicRecursive.prototype.start = function () { + var d = new SingleAssignmentDisposable(); + this._cancel = d; + d.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0, this._period, tick.bind(this))); + + return d; + }; + + return SchedulePeriodicRecursive; + }()); + + /** + * Gets a scheduler that schedules work immediately on the current thread. + */ + var immediateScheduler = Scheduler.immediate = (function () { + + function scheduleNow(state, action) { return action(this, state); } + + function scheduleRelative(state, dueTime, action) { + var dt = normalizeTime(dt); + while (dt - this.now() > 0) { } + return action(this, state); + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); + } + + return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); + }()); + + /** + * Gets a scheduler that schedules work as soon as possible on the current thread. + */ + var currentThreadScheduler = Scheduler.currentThread = (function () { + var queue; + + function runTrampoline (q) { + var item; + while (q.length > 0) { + item = q.dequeue(); + if (!item.isCancelled()) { + // Note, do not schedule blocking work! + while (item.dueTime - Scheduler.now() > 0) { + } + if (!item.isCancelled()) { + item.invoke(); + } + } + } + } + + function scheduleNow(state, action) { + return this.scheduleWithRelativeAndState(state, 0, action); + } + + function scheduleRelative(state, dueTime, action) { + var dt = this.now() + Scheduler.normalize(dueTime), + si = new ScheduledItem(this, state, action, dt), + t; + if (!queue) { + queue = new PriorityQueue(4); + queue.enqueue(si); + try { + runTrampoline(queue); + } catch (e) { + throw e; + } finally { + queue = null; + } + } else { + queue.enqueue(si); + } + return si.disposable; + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); + } + + var currentScheduler = new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); + currentScheduler.scheduleRequired = function () { return queue === null; }; + currentScheduler.ensureTrampoline = function (action) { + if (queue === null) { + return this.schedule(action); + } else { + return action(); + } + }; + + return currentScheduler; + }()); + + + var scheduleMethod, clearMethod = noop; + (function () { + + var reNative = RegExp('^' + + String(toString) + .replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + .replace(/toString| for [^\]]+/g, '.*?') + '$' + ); + + var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' && + !reNative.test(setImmediate) && setImmediate, + clearImmediate = typeof (clearImmediate = freeGlobal && moduleExports && freeGlobal.clearImmediate) == 'function' && + !reNative.test(clearImmediate) && clearImmediate; + + function postMessageSupported () { + // Ensure not in a worker + if (!root.postMessage || root.importScripts) { return false; } + var isAsync = false, + oldHandler = root.onmessage; + // Test for async + root.onmessage = function () { isAsync = true; }; + root.postMessage('','*'); + root.onmessage = oldHandler; + + return isAsync; + } + + // Use in order, nextTick, setImmediate, postMessage, MessageChannel, script readystatechanged, setTimeout + if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') { + scheduleMethod = process.nextTick; + } else if (typeof setImmediate === 'function') { + scheduleMethod = setImmediate; + clearMethod = clearImmediate; + } else if (postMessageSupported()) { + var MSG_PREFIX = 'ms.rx.schedule' + Math.random(), + tasks = {}, + taskId = 0; + + function onGlobalPostMessage(event) { + // Only if we're a match to avoid any other global events + if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) { + var handleId = event.data.substring(MSG_PREFIX.length), + action = tasks[handleId]; + action(); + delete tasks[handleId]; + } + } + + if (root.addEventListener) { + root.addEventListener('message', onGlobalPostMessage, false); + } else { + root.attachEvent('onmessage', onGlobalPostMessage, false); + } + + scheduleMethod = function (action) { + var currentId = taskId++; + tasks[currentId] = action; + root.postMessage(MSG_PREFIX + currentId, '*'); + }; + } else if (!!root.MessageChannel) { + var channel = new root.MessageChannel(), + channelTasks = {}, + channelTaskId = 0; + + channel.port1.onmessage = function (event) { + var id = event.data, + action = channelTasks[id]; + action(); + delete channelTasks[id]; + }; + + scheduleMethod = function (action) { + var id = channelTaskId++; + channelTasks[id] = action; + channel.port2.postMessage(id); + }; + } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) { + + scheduleMethod = function (action) { + var scriptElement = root.document.createElement('script'); + scriptElement.onreadystatechange = function () { + action(); + scriptElement.onreadystatechange = null; + scriptElement.parentNode.removeChild(scriptElement); + scriptElement = null; + }; + root.document.documentElement.appendChild(scriptElement); + }; + + } else { + scheduleMethod = function (action) { return setTimeout(action, 0); }; + clearMethod = clearTimeout; + } + }()); + + /** + * Gets a scheduler that schedules work via a timed callback based upon platform. + */ + var timeoutScheduler = Scheduler.timeout = (function () { + + function scheduleNow(state, action) { + var scheduler = this, + disposable = new SingleAssignmentDisposable(); + var id = scheduleMethod(function () { + if (!disposable.isDisposed) { + disposable.setDisposable(action(scheduler, state)); + } + }); + return new CompositeDisposable(disposable, disposableCreate(function () { + clearMethod(id); + })); + } + + function scheduleRelative(state, dueTime, action) { + var scheduler = this, + dt = Scheduler.normalize(dueTime); + if (dt === 0) { + return scheduler.scheduleWithState(state, action); + } + var disposable = new SingleAssignmentDisposable(); + var id = setTimeout(function () { + if (!disposable.isDisposed) { + disposable.setDisposable(action(scheduler, state)); + } + }, dt); + return new CompositeDisposable(disposable, disposableCreate(function () { + clearTimeout(id); + })); + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); + } + + return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); + })(); + + /** @private */ + var CatchScheduler = (function (_super) { + + function localNow() { + return this._scheduler.now(); + } + + function scheduleNow(state, action) { + return this._scheduler.scheduleWithState(state, this._wrap(action)); + } + + function scheduleRelative(state, dueTime, action) { + return this._scheduler.scheduleWithRelativeAndState(state, dueTime, this._wrap(action)); + } + + function scheduleAbsolute(state, dueTime, action) { + return this._scheduler.scheduleWithAbsoluteAndState(state, dueTime, this._wrap(action)); + } + + inherits(CatchScheduler, _super); + + /** @private */ + function CatchScheduler(scheduler, handler) { + this._scheduler = scheduler; + this._handler = handler; + this._recursiveOriginal = null; + this._recursiveWrapper = null; + _super.call(this, localNow, scheduleNow, scheduleRelative, scheduleAbsolute); + } + + /** @private */ + CatchScheduler.prototype._clone = function (scheduler) { + return new CatchScheduler(scheduler, this._handler); + }; + + /** @private */ + CatchScheduler.prototype._wrap = function (action) { + var parent = this; + return function (self, state) { + try { + return action(parent._getRecursiveWrapper(self), state); + } catch (e) { + if (!parent._handler(e)) { throw e; } + return disposableEmpty; + } + }; + }; + + /** @private */ + CatchScheduler.prototype._getRecursiveWrapper = function (scheduler) { + if (this._recursiveOriginal !== scheduler) { + this._recursiveOriginal = scheduler; + var wrapper = this._clone(scheduler); + wrapper._recursiveOriginal = scheduler; + wrapper._recursiveWrapper = wrapper; + this._recursiveWrapper = wrapper; + } + return this._recursiveWrapper; + }; + + /** @private */ + CatchScheduler.prototype.schedulePeriodicWithState = function (state, period, action) { + var self = this, failed = false, d = new SingleAssignmentDisposable(); + + d.setDisposable(this._scheduler.schedulePeriodicWithState(state, period, function (state1) { + if (failed) { return null; } + try { + return action(state1); + } catch (e) { + failed = true; + if (!self._handler(e)) { throw e; } + d.dispose(); + return null; + } + })); + + return d; + }; + + return CatchScheduler; + }(Scheduler)); + + /** + * Represents a notification to an observer. + */ + var Notification = Rx.Notification = (function () { + function Notification(kind, hasValue) { + this.hasValue = hasValue == null ? false : hasValue; + this.kind = kind; + } + + var NotificationPrototype = Notification.prototype; + + /** + * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result. + * + * @memberOf Notification + * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on.. + * @param {Function} onError Delegate to invoke for an OnError notification. + * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification. + * @returns {Any} Result produced by the observation. + */ + NotificationPrototype.accept = function (observerOrOnNext, onError, onCompleted) { + if (arguments.length === 1 && typeof observerOrOnNext === 'object') { + return this._acceptObservable(observerOrOnNext); + } + return this._accept(observerOrOnNext, onError, onCompleted); + }; + + /** + * Returns an observable sequence with a single notification. + * + * @memberOf Notification + * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on. + * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription. + */ + NotificationPrototype.toObservable = function (scheduler) { + var notification = this; + scheduler || (scheduler = immediateScheduler); + return new AnonymousObservable(function (observer) { + return scheduler.schedule(function () { + notification._acceptObservable(observer); + if (notification.kind === 'N') { + observer.onCompleted(); + } + }); + }); + }; + + return Notification; + })(); + + /** + * Creates an object that represents an OnNext notification to an observer. + * @param {Any} value The value contained in the notification. + * @returns {Notification} The OnNext notification containing the value. + */ + var notificationCreateOnNext = Notification.createOnNext = (function () { + + function _accept (onNext) { + return onNext(this.value); + } + + function _acceptObservable(observer) { + return observer.onNext(this.value); + } + + function toString () { + return 'OnNext(' + this.value + ')'; + } + + return function (value) { + var notification = new Notification('N', true); + notification.value = value; + notification._accept = _accept; + notification._acceptObservable = _acceptObservable; + notification.toString = toString; + return notification; + }; + }()); + + /** + * Creates an object that represents an OnError notification to an observer. + * @param {Any} error The exception contained in the notification. + * @returns {Notification} The OnError notification containing the exception. + */ + var notificationCreateOnError = Notification.createOnError = (function () { + + function _accept (onNext, onError) { + return onError(this.exception); + } + + function _acceptObservable(observer) { + return observer.onError(this.exception); + } + + function toString () { + return 'OnError(' + this.exception + ')'; + } + + return function (exception) { + var notification = new Notification('E'); + notification.exception = exception; + notification._accept = _accept; + notification._acceptObservable = _acceptObservable; + notification.toString = toString; + return notification; + }; + }()); + + /** + * Creates an object that represents an OnCompleted notification to an observer. + * @returns {Notification} The OnCompleted notification. + */ + var notificationCreateOnCompleted = Notification.createOnCompleted = (function () { + + function _accept (onNext, onError, onCompleted) { + return onCompleted(); + } + + function _acceptObservable(observer) { + return observer.onCompleted(); + } + + function toString () { + return 'OnCompleted()'; + } + + return function () { + var notification = new Notification('C'); + notification._accept = _accept; + notification._acceptObservable = _acceptObservable; + notification.toString = toString; + return notification; + }; + }()); + + var Enumerator = Rx.internals.Enumerator = function (next) { + this._next = next; + }; + + Enumerator.prototype.next = function () { + return this._next(); + }; + + Enumerator.prototype[$iterator$] = function () { return this; } + + var Enumerable = Rx.internals.Enumerable = function (iterator) { + this._iterator = iterator; + }; + + Enumerable.prototype[$iterator$] = function () { + return this._iterator(); + }; + + Enumerable.prototype.concat = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var e; + try { + e = sources[$iterator$](); + } catch(err) { + observer.onError(); + return; + } + + var isDisposed, + subscription = new SerialDisposable(); + var cancelable = immediateScheduler.scheduleRecursive(function (self) { + var currentItem; + if (isDisposed) { return; } + + try { + currentItem = e.next(); + } catch (ex) { + observer.onError(ex); + return; + } + + if (currentItem.done) { + observer.onCompleted(); + return; + } + + // Check if promise + var currentValue = currentItem.value; + isPromise(currentValue) && (currentValue = observableFromPromise(currentValue)); + + var d = new SingleAssignmentDisposable(); + subscription.setDisposable(d); + d.setDisposable(currentValue.subscribe( + observer.onNext.bind(observer), + observer.onError.bind(observer), + function () { self(); }) + ); + }); + + return new CompositeDisposable(subscription, cancelable, disposableCreate(function () { + isDisposed = true; + })); + }); + }; + + Enumerable.prototype.catchException = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var e; + try { + e = sources[$iterator$](); + } catch(err) { + observer.onError(); + return; + } + + var isDisposed, + lastException, + subscription = new SerialDisposable(); + var cancelable = immediateScheduler.scheduleRecursive(function (self) { + if (isDisposed) { return; } + + var currentItem; + try { + currentItem = e.next(); + } catch (ex) { + observer.onError(ex); + return; + } + + if (currentItem.done) { + if (lastException) { + observer.onError(lastException); + } else { + observer.onCompleted(); + } + return; + } + + // Check if promise + var currentValue = currentItem.value; + isPromise(currentValue) && (currentValue = observableFromPromise(currentValue)); + + var d = new SingleAssignmentDisposable(); + subscription.setDisposable(d); + d.setDisposable(currentValue.subscribe( + observer.onNext.bind(observer), + function (exn) { + lastException = exn; + self(); + }, + observer.onCompleted.bind(observer))); + }); + return new CompositeDisposable(subscription, cancelable, disposableCreate(function () { + isDisposed = true; + })); + }); + }; + + var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) { + if (repeatCount == null) { repeatCount = -1; } + return new Enumerable(function () { + var left = repeatCount; + return new Enumerator(function () { + if (left === 0) { return doneEnumerator; } + if (left > 0) { left--; } + return { done: false, value: value }; + }); + }); + }; + + var enumerableFor = Enumerable.forEach = function (source, selector, thisArg) { + selector || (selector = identity); + return new Enumerable(function () { + var index = -1; + return new Enumerator( + function () { + return ++index < source.length ? + { done: false, value: selector.call(thisArg, source[index], index, source) } : + doneEnumerator; + }); + }); + }; + + /** + * Supports push-style iteration over an observable sequence. + */ + var Observer = Rx.Observer = function () { }; + + /** + * Creates a notification callback from an observer. + * + * @param observer Observer object. + * @returns The action that forwards its input notification to the underlying observer. + */ + Observer.prototype.toNotifier = function () { + var observer = this; + return function (n) { + return n.accept(observer); + }; + }; + + /** + * Hides the identity of an observer. + + * @returns An observer that hides the identity of the specified observer. + */ + Observer.prototype.asObserver = function () { + return new AnonymousObserver(this.onNext.bind(this), this.onError.bind(this), this.onCompleted.bind(this)); + }; + + /** + * Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods. + * If a violation is detected, an Error is thrown from the offending observer method call. + * + * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer. + */ + Observer.prototype.checked = function () { return new CheckedObserver(this); }; + + /** + * Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions. + * + * @static + * @memberOf Observer + * @param {Function} [onNext] Observer's OnNext action implementation. + * @param {Function} [onError] Observer's OnError action implementation. + * @param {Function} [onCompleted] Observer's OnCompleted action implementation. + * @returns {Observer} The observer object implemented using the given actions. + */ + var observerCreate = Observer.create = function (onNext, onError, onCompleted) { + onNext || (onNext = noop); + onError || (onError = defaultError); + onCompleted || (onCompleted = noop); + return new AnonymousObserver(onNext, onError, onCompleted); + }; + + /** + * Creates an observer from a notification callback. + * + * @static + * @memberOf Observer + * @param {Function} handler Action that handles a notification. + * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives. + */ + Observer.fromNotifier = function (handler) { + return new AnonymousObserver(function (x) { + return handler(notificationCreateOnNext(x)); + }, function (exception) { + return handler(notificationCreateOnError(exception)); + }, function () { + return handler(notificationCreateOnCompleted()); + }); + }; + + /** + * Schedules the invocation of observer methods on the given scheduler. + * @param {Scheduler} scheduler Scheduler to schedule observer messages on. + * @returns {Observer} Observer whose messages are scheduled on the given scheduler. + */ + Observer.notifyOn = function (scheduler) { + return new ObserveOnObserver(scheduler, this); + }; + + /** + * Abstract base class for implementations of the Observer class. + * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages. + */ + var AbstractObserver = Rx.internals.AbstractObserver = (function (_super) { + inherits(AbstractObserver, _super); + + /** + * Creates a new observer in a non-stopped state. + * + * @constructor + */ + function AbstractObserver() { + this.isStopped = false; + _super.call(this); + } + + /** + * Notifies the observer of a new element in the sequence. + * + * @memberOf AbstractObserver + * @param {Any} value Next element in the sequence. + */ + AbstractObserver.prototype.onNext = function (value) { + if (!this.isStopped) { + this.next(value); + } + }; + + /** + * Notifies the observer that an exception has occurred. + * + * @memberOf AbstractObserver + * @param {Any} error The error that has occurred. + */ + AbstractObserver.prototype.onError = function (error) { + if (!this.isStopped) { + this.isStopped = true; + this.error(error); + } + }; + + /** + * Notifies the observer of the end of the sequence. + */ + AbstractObserver.prototype.onCompleted = function () { + if (!this.isStopped) { + this.isStopped = true; + this.completed(); + } + }; + + /** + * Disposes the observer, causing it to transition to the stopped state. + */ + AbstractObserver.prototype.dispose = function () { + this.isStopped = true; + }; + + AbstractObserver.prototype.fail = function (e) { + if (!this.isStopped) { + this.isStopped = true; + this.error(e); + return true; + } + + return false; + }; + + return AbstractObserver; + }(Observer)); + + /** + * Class to create an Observer instance from delegate-based implementations of the on* methods. + */ + var AnonymousObserver = Rx.AnonymousObserver = (function (_super) { + inherits(AnonymousObserver, _super); + + /** + * Creates an observer from the specified OnNext, OnError, and OnCompleted actions. + * @param {Any} onNext Observer's OnNext action implementation. + * @param {Any} onError Observer's OnError action implementation. + * @param {Any} onCompleted Observer's OnCompleted action implementation. + */ + function AnonymousObserver(onNext, onError, onCompleted) { + _super.call(this); + this._onNext = onNext; + this._onError = onError; + this._onCompleted = onCompleted; + } + + /** + * Calls the onNext action. + * @param {Any} value Next element in the sequence. + */ + AnonymousObserver.prototype.next = function (value) { + this._onNext(value); + }; + + /** + * Calls the onError action. + * @param {Any} error The error that has occurred. + */ + AnonymousObserver.prototype.error = function (exception) { + this._onError(exception); + }; + + /** + * Calls the onCompleted action. + */ + AnonymousObserver.prototype.completed = function () { + this._onCompleted(); + }; + + return AnonymousObserver; + }(AbstractObserver)); + + var CheckedObserver = (function (_super) { + inherits(CheckedObserver, _super); + + function CheckedObserver(observer) { + _super.call(this); + this._observer = observer; + this._state = 0; // 0 - idle, 1 - busy, 2 - done + } + + var CheckedObserverPrototype = CheckedObserver.prototype; + + CheckedObserverPrototype.onNext = function (value) { + this.checkAccess(); + try { + this._observer.onNext(value); + } catch (e) { + throw e; + } finally { + this._state = 0; + } + }; + + CheckedObserverPrototype.onError = function (err) { + this.checkAccess(); + try { + this._observer.onError(err); + } catch (e) { + throw e; + } finally { + this._state = 2; + } + }; + + CheckedObserverPrototype.onCompleted = function () { + this.checkAccess(); + try { + this._observer.onCompleted(); + } catch (e) { + throw e; + } finally { + this._state = 2; + } + }; + + CheckedObserverPrototype.checkAccess = function () { + if (this._state === 1) { throw new Error('Re-entrancy detected'); } + if (this._state === 2) { throw new Error('Observer completed'); } + if (this._state === 0) { this._state = 1; } + }; + + return CheckedObserver; + }(Observer)); + + var ScheduledObserver = Rx.internals.ScheduledObserver = (function (_super) { + inherits(ScheduledObserver, _super); + + function ScheduledObserver(scheduler, observer) { + _super.call(this); + this.scheduler = scheduler; + this.observer = observer; + this.isAcquired = false; + this.hasFaulted = false; + this.queue = []; + this.disposable = new SerialDisposable(); + } + + ScheduledObserver.prototype.next = function (value) { + var self = this; + this.queue.push(function () { + self.observer.onNext(value); + }); + }; + + ScheduledObserver.prototype.error = function (exception) { + var self = this; + this.queue.push(function () { + self.observer.onError(exception); + }); + }; + + ScheduledObserver.prototype.completed = function () { + var self = this; + this.queue.push(function () { + self.observer.onCompleted(); + }); + }; + + ScheduledObserver.prototype.ensureActive = function () { + var isOwner = false, parent = this; + if (!this.hasFaulted && this.queue.length > 0) { + isOwner = !this.isAcquired; + this.isAcquired = true; + } + if (isOwner) { + this.disposable.setDisposable(this.scheduler.scheduleRecursive(function (self) { + var work; + if (parent.queue.length > 0) { + work = parent.queue.shift(); + } else { + parent.isAcquired = false; + return; + } + try { + work(); + } catch (ex) { + parent.queue = []; + parent.hasFaulted = true; + throw ex; + } + self(); + })); + } + }; + + ScheduledObserver.prototype.dispose = function () { + _super.prototype.dispose.call(this); + this.disposable.dispose(); + }; + + return ScheduledObserver; + }(AbstractObserver)); + + /** @private */ + var ObserveOnObserver = (function (_super) { + inherits(ObserveOnObserver, _super); + + /** @private */ + function ObserveOnObserver() { + _super.apply(this, arguments); + } + + /** @private */ + ObserveOnObserver.prototype.next = function (value) { + _super.prototype.next.call(this, value); + this.ensureActive(); + }; + + /** @private */ + ObserveOnObserver.prototype.error = function (e) { + _super.prototype.error.call(this, e); + this.ensureActive(); + }; + + /** @private */ + ObserveOnObserver.prototype.completed = function () { + _super.prototype.completed.call(this); + this.ensureActive(); + }; + + return ObserveOnObserver; + })(ScheduledObserver); + + var observableProto; + + /** + * Represents a push-style collection. + */ + var Observable = Rx.Observable = (function () { + + function Observable(subscribe) { + this._subscribe = subscribe; + } + + observableProto = Observable.prototype; + + /** + * Subscribes an observer to the observable sequence. + * + * @example + * 1 - source.subscribe(); + * 2 - source.subscribe(observer); + * 3 - source.subscribe(function (x) { console.log(x); }); + * 4 - source.subscribe(function (x) { console.log(x); }, function (err) { console.log(err); }); + * 5 - source.subscribe(function (x) { console.log(x); }, function (err) { console.log(err); }, function () { console.log('done'); }); + * @param {Mixed} [observerOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence. + * @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence. + * @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence. + * @returns {Diposable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler. + */ + observableProto.subscribe = observableProto.forEach = function (observerOrOnNext, onError, onCompleted) { + var subscriber = typeof observerOrOnNext === 'object' ? + observerOrOnNext : + observerCreate(observerOrOnNext, onError, onCompleted); + + return this._subscribe(subscriber); + }; + + return Observable; + })(); + + var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) { + inherits(AnonymousObservable, __super__); + + // Fix subscriber to check for undefined or function returned to decorate as Disposable + function fixSubscriber(subscriber) { + if (typeof subscriber === 'undefined') { + subscriber = disposableEmpty; + } else if (typeof subscriber === 'function') { + subscriber = disposableCreate(subscriber); + } + + return subscriber; + } + + function AnonymousObservable(subscribe) { + if (!(this instanceof AnonymousObservable)) { + return new AnonymousObservable(subscribe); + } + + function s(observer) { + var setDisposable = function () { + try { + autoDetachObserver.setDisposable(fixSubscriber(subscribe(autoDetachObserver))); + } catch (e) { + if (!autoDetachObserver.fail(e)) { + throw e; + } + } + }; + + var autoDetachObserver = new AutoDetachObserver(observer); + if (currentThreadScheduler.scheduleRequired()) { + currentThreadScheduler.schedule(setDisposable); + } else { + setDisposable(); + } + + return autoDetachObserver; + } + + __super__.call(this, s); + } + + return AnonymousObservable; + + }(Observable)); + + /** @private */ + var AutoDetachObserver = (function (_super) { + inherits(AutoDetachObserver, _super); + + function AutoDetachObserver(observer) { + _super.call(this); + this.observer = observer; + this.m = new SingleAssignmentDisposable(); + } + + var AutoDetachObserverPrototype = AutoDetachObserver.prototype; + + AutoDetachObserverPrototype.next = function (value) { + var noError = false; + try { + this.observer.onNext(value); + noError = true; + } catch (e) { + throw e; + } finally { + if (!noError) { + this.dispose(); + } + } + }; + + AutoDetachObserverPrototype.error = function (exn) { + try { + this.observer.onError(exn); + } catch (e) { + throw e; + } finally { + this.dispose(); + } + }; + + AutoDetachObserverPrototype.completed = function () { + try { + this.observer.onCompleted(); + } catch (e) { + throw e; + } finally { + this.dispose(); + } + }; + + AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); }; + AutoDetachObserverPrototype.getDisposable = function (value) { return this.m.getDisposable(); }; + /* @private */ + AutoDetachObserverPrototype.disposable = function (value) { + return arguments.length ? this.getDisposable() : setDisposable(value); + }; + + AutoDetachObserverPrototype.dispose = function () { + _super.prototype.dispose.call(this); + this.m.dispose(); + }; + + return AutoDetachObserver; + }(AbstractObserver)); + + /** @private */ + var GroupedObservable = (function (_super) { + inherits(GroupedObservable, _super); + + function subscribe(observer) { + return this.underlyingObservable.subscribe(observer); + } + + /** + * @constructor + * @private + */ + function GroupedObservable(key, underlyingObservable, mergedDisposable) { + _super.call(this, subscribe); + this.key = key; + this.underlyingObservable = !mergedDisposable ? + underlyingObservable : + new AnonymousObservable(function (observer) { + return new CompositeDisposable(mergedDisposable.getDisposable(), underlyingObservable.subscribe(observer)); + }); + } + + return GroupedObservable; + }(Observable)); + + /** @private */ + var InnerSubscription = function (subject, observer) { + this.subject = subject; + this.observer = observer; + }; + + /** + * @private + * @memberOf InnerSubscription + */ + InnerSubscription.prototype.dispose = function () { + if (!this.subject.isDisposed && this.observer !== null) { + var idx = this.subject.observers.indexOf(this.observer); + this.subject.observers.splice(idx, 1); + this.observer = null; + } + }; + + /** + * Represents an object that is both an observable sequence as well as an observer. + * Each notification is broadcasted to all subscribed observers. + */ + var Subject = Rx.Subject = (function (_super) { + function subscribe(observer) { + checkDisposed.call(this); + if (!this.isStopped) { + this.observers.push(observer); + return new InnerSubscription(this, observer); + } + if (this.exception) { + observer.onError(this.exception); + return disposableEmpty; + } + observer.onCompleted(); + return disposableEmpty; + } + + inherits(Subject, _super); + + /** + * Creates a subject. + * @constructor + */ + function Subject() { + _super.call(this, subscribe); + this.isDisposed = false, + this.isStopped = false, + this.observers = []; + } + + addProperties(Subject.prototype, Observer, { + /** + * Indicates whether the subject has observers subscribed to it. + * @returns {Boolean} Indicates whether the subject has observers subscribed to it. + */ + hasObservers: function () { + return this.observers.length > 0; + }, + /** + * Notifies all subscribed observers about the end of the sequence. + */ + onCompleted: function () { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + for (var i = 0, len = os.length; i < len; i++) { + os[i].onCompleted(); + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the exception. + * @param {Mixed} error The exception to send to all observers. + */ + onError: function (exception) { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + this.exception = exception; + for (var i = 0, len = os.length; i < len; i++) { + os[i].onError(exception); + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the arrival of the specified element in the sequence. + * @param {Mixed} value The value to send to all observers. + */ + onNext: function (value) { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + for (var i = 0, len = os.length; i < len; i++) { + os[i].onNext(value); + } + } + }, + /** + * Unsubscribe all observers and release resources. + */ + dispose: function () { + this.isDisposed = true; + this.observers = null; + } + }); + + /** + * Creates a subject from the specified observer and observable. + * @param {Observer} observer The observer used to send messages to the subject. + * @param {Observable} observable The observable used to subscribe to messages sent from the subject. + * @returns {Subject} Subject implemented using the given observer and observable. + */ + Subject.create = function (observer, observable) { + return new AnonymousSubject(observer, observable); + }; + + return Subject; + }(Observable)); + + /** + * Represents the result of an asynchronous operation. + * The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers. + */ + var AsyncSubject = Rx.AsyncSubject = (function (_super) { + + function subscribe(observer) { + checkDisposed.call(this); + + if (!this.isStopped) { + this.observers.push(observer); + return new InnerSubscription(this, observer); + } + + var ex = this.exception, + hv = this.hasValue, + v = this.value; + + if (ex) { + observer.onError(ex); + } else if (hv) { + observer.onNext(v); + observer.onCompleted(); + } else { + observer.onCompleted(); + } + + return disposableEmpty; + } + + inherits(AsyncSubject, _super); + + /** + * Creates a subject that can only receive one value and that value is cached for all future observations. + * @constructor + */ + function AsyncSubject() { + _super.call(this, subscribe); + + this.isDisposed = false; + this.isStopped = false; + this.value = null; + this.hasValue = false; + this.observers = []; + this.exception = null; + } + + addProperties(AsyncSubject.prototype, Observer, { + /** + * Indicates whether the subject has observers subscribed to it. + * @returns {Boolean} Indicates whether the subject has observers subscribed to it. + */ + hasObservers: function () { + checkDisposed.call(this); + return this.observers.length > 0; + }, + /** + * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any). + */ + onCompleted: function () { + var o, i, len; + checkDisposed.call(this); + if (!this.isStopped) { + this.isStopped = true; + var os = this.observers.slice(0), + v = this.value, + hv = this.hasValue; + + if (hv) { + for (i = 0, len = os.length; i < len; i++) { + o = os[i]; + o.onNext(v); + o.onCompleted(); + } + } else { + for (i = 0, len = os.length; i < len; i++) { + os[i].onCompleted(); + } + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the exception. + * @param {Mixed} error The exception to send to all observers. + */ + onError: function (exception) { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + this.exception = exception; + + for (var i = 0, len = os.length; i < len; i++) { + os[i].onError(exception); + } + + this.observers = []; + } + }, + /** + * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers. + * @param {Mixed} value The value to store in the subject. + */ + onNext: function (value) { + checkDisposed.call(this); + if (!this.isStopped) { + this.value = value; + this.hasValue = true; + } + }, + /** + * Unsubscribe all observers and release resources. + */ + dispose: function () { + this.isDisposed = true; + this.observers = null; + this.exception = null; + this.value = null; + } + }); + + return AsyncSubject; + }(Observable)); + + /** @private */ + var AnonymousSubject = (function (_super) { + inherits(AnonymousSubject, _super); + + function subscribe(observer) { + return this.observable.subscribe(observer); + } + + /** + * @private + * @constructor + */ + function AnonymousSubject(observer, observable) { + _super.call(this, subscribe); + this.observer = observer; + this.observable = observable; + } + + addProperties(AnonymousSubject.prototype, Observer, { + /** + * @private + * @memberOf AnonymousSubject# + */ + onCompleted: function () { + this.observer.onCompleted(); + }, + /** + * @private + * @memberOf AnonymousSubject# + */ + onError: function (exception) { + this.observer.onError(exception); + }, + /** + * @private + * @memberOf AnonymousSubject# + */ + onNext: function (value) { + this.observer.onNext(value); + } + }); + + return AnonymousSubject; + }(Observable)); + + if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) { + root.Rx = Rx; + + define(function() { + return Rx; + }); + } else if (freeExports && freeModule) { + // in Node.js or RingoJS + if (moduleExports) { + (freeModule.exports = Rx).Rx = Rx; + } else { + freeExports.Rx = Rx; + } + } else { + // in a browser or Rhino + root.Rx = Rx; + } +}.call(this)); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.core.compat.min.js b/ajax/libs/rxjs/2.2.28/rx.core.compat.min.js new file mode 100644 index 000000000..94715e728 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.core.compat.min.js @@ -0,0 +1 @@ +(function(t){function e(){if(this.isDisposed)throw Error(A)}function n(t){var e=typeof t;return t&&("function"==e||"object"==e)||!1}function i(t){var e=[];if(!n(t))return e;G.nonEnumArgs&&t.length&&u(t)&&(t=U.call(t));var i=G.enumPrototypes&&"function"==typeof t,r=G.enumErrorProps&&(t===H||t instanceof Error);for(var s in t)i&&"prototype"==s||r&&("message"==s||"name"==s)||e.push(s);if(G.nonEnumShadows&&t!==L){var o=t.constructor,c=-1,h=K.length;if(t===(o&&o.prototype))var a=t===stringProto?M:t===H?N:F.call(t),l=Q[a];for(;h>++c;)s=K[c],l&&l[s]||!z.call(t,s)||e.push(s)}return e}function r(t,e,n){for(var i=-1,r=n(t),s=r.length;s>++i;){var o=r[i];if(e(t[o],o,t)===!1)break}return t}function s(t,e){return r(t,e,i)}function o(t){return"function"!=typeof t.toString&&"string"==typeof(t+"")}function u(t){return t&&"object"==typeof t?F.call(t)==j:!1}function c(t){return"function"==typeof t||!1}function h(e,n,i,r){if(e===n)return 0!==e||1/e==1/n;var a=typeof e,l=typeof n;if(e===e&&(null==e||null==n||"function"!=a&&"object"!=a&&"function"!=l&&"object"!=l))return!1;var p=F.call(e),f=F.call(n);if(p==j&&(p=T),f==j&&(f=T),p!=f)return!1;switch(p){case W:case P:return+e==+n;case k:return e!=+e?n!=+n:0==e?1/e==1/n:e==+n;case I:case M:return e==n+""}var d=p==C;if(!d){if(p!=T||!G.nodeClass&&(o(e)||o(n)))return!1;var v=!G.argsObject&&u(e)?Object:e.constructor,b=!G.argsObject&&u(n)?Object:n.constructor;if(!(v==b||z.call(e,"constructor")&&z.call(n,"constructor")||c(v)&&v instanceof v&&c(b)&&b instanceof b||!("constructor"in e&&"constructor"in n)))return!1}i||(i=[]),r||(r=[]);for(var y=i.length;y--;)if(i[y]==e)return r[y]==n;var m=0;if(result=!0,i.push(e),r.push(n),d){if(y=e.length,m=n.length,result=m==y)for(;m--;){var g=n[m];if(!(result=h(e[m],g,i,r)))break}}else s(n,function(n,s,o){return z.call(o,s)?(m++,result=z.call(e,s)&&h(e[s],n,i,r)):t}),result&&s(e,function(e,n,i){return z.call(i,n)?result=--m>-1:t});return i.pop(),r.pop(),result}function a(t,e){return 1===t.length&&Array.isArray(t[e])?t[e]:U.call(t)}function l(t,e){this.scheduler=t,this.disposable=e,this.isDisposed=!1}var p={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},f=p[typeof window]&&window||this,d=p[typeof exports]&&exports&&!exports.nodeType&&exports,v=p[typeof module]&&module&&!module.nodeType&&module,b=v&&v.exports===d&&d,y=p[typeof global]&&global;!y||y.global!==y&&y.window!==y||(f=y);var m={internals:{},config:{Promise:f.Promise},helpers:{}},g=m.helpers.noop=function(){},w=m.helpers.identity=function(t){return t},S=(m.helpers.pluck=function(t){return function(e){return e[t]}},m.helpers.just=function(t){return function(){return t}},m.helpers.defaultNow=function(){return Date.now?Date.now:function(){return+new Date}}()),_=(m.helpers.defaultComparer=function(t,e){return J(t,e)},m.helpers.defaultSubComparer=function(t,e){return t>e?1:e>t?-1:0}),D=(m.helpers.defaultKeySerializer=function(t){return""+t},m.helpers.defaultError=function(t){throw t}),x=m.helpers.isPromise=function(t){return!!t&&"function"==typeof t.then&&t.then!==m.Observable.prototype.then};m.helpers.asArray=function(){return Array.prototype.slice.call(arguments)},m.helpers.not=function(t){return!t};var A="Object has been disposed",E="object"==typeof Symbol&&Symbol.iterator||"_es6shim_iterator_";f.Set&&"function"==typeof(new f.Set)["@@iterator"]&&(E="@@iterator");var O,R={done:!0,value:t},j="[object Arguments]",C="[object Array]",W="[object Boolean]",P="[object Date]",N="[object Error]",q="[object Function]",k="[object Number]",T="[object Object]",I="[object RegExp]",M="[object String]",F=Object.prototype.toString,z=Object.prototype.hasOwnProperty,V=F.call(arguments)==j,H=Error.prototype,L=Object.prototype,$=L.propertyIsEnumerable;try{O=!(F.call(document)==T&&!({toString:0}+""))}catch(B){O=!0}var K=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],Q={};Q[C]=Q[P]=Q[k]={constructor:!0,toLocaleString:!0,toString:!0,valueOf:!0},Q[W]=Q[M]={constructor:!0,toString:!0,valueOf:!0},Q[N]=Q[q]=Q[I]={constructor:!0,toString:!0},Q[T]={constructor:!0};var G={};(function(){var t=function(){this.x=1},e=[];t.prototype={valueOf:1,y:1};for(var n in new t)e.push(n);for(n in arguments);G.enumErrorProps=$.call(H,"message")||$.call(H,"name"),G.enumPrototypes=$.call(t,"prototype"),G.nonEnumArgs=0!=n,G.nonEnumShadows=!/valueOf/.test(e)})(1),V||(u=function(t){return t&&"object"==typeof t?z.call(t,"callee"):!1}),c(/x/)&&(c=function(t){return"function"==typeof t&&F.call(t)==q});var J=m.internals.isEqual=function(t,e){return h(t,e,[],[])},U=Array.prototype.slice;({}).hasOwnProperty;var X=this.inherits=m.internals.inherits=function(t,e){function n(){this.constructor=t}n.prototype=e.prototype,t.prototype=new n},Y=m.internals.addProperties=function(t){for(var e=U.call(arguments,1),n=0,i=e.length;i>n;n++){var r=e[n];for(var s in r)t[s]=r[s]}};m.internals.addRef=function(t,e){return new ke(function(n){return new re(e.getDisposable(),t.subscribe(n))})},Function.prototype.bind||(Function.prototype.bind=function(t){var e=this,n=U.call(arguments,1),i=function(){function r(){}if(this instanceof i){r.prototype=e.prototype;var s=new r,o=e.apply(s,n.concat(U.call(arguments)));return Object(o)===o?o:s}return e.apply(t,n.concat(U.call(arguments)))};return i});var Z=Object("a"),te="a"!=Z[0]||!(0 in Z);Array.prototype.every||(Array.prototype.every=function(t){var e=Object(this),n=te&&{}.toString.call(this)==M?this.split(""):e,i=n.length>>>0,r=arguments[1];if({}.toString.call(t)!=q)throw new TypeError(t+" is not a function");for(var s=0;i>s;s++)if(s in n&&!t.call(r,n[s],s,e))return!1;return!0}),Array.prototype.map||(Array.prototype.map=function(t){var e=Object(this),n=te&&{}.toString.call(this)==M?this.split(""):e,i=n.length>>>0,r=Array(i),s=arguments[1];if({}.toString.call(t)!=q)throw new TypeError(t+" is not a function");for(var o=0;i>o;o++)o in n&&(r[o]=t.call(s,n[o],o,e));return r}),Array.prototype.filter||(Array.prototype.filter=function(t){for(var e,n=[],i=Object(this),r=0,s=i.length>>>0;s>r;r++)e=i[r],r in i&&t.call(arguments[1],e,r,i)&&n.push(e);return n}),Array.isArray||(Array.isArray=function(t){return Object.prototype.toString.call(t)==C}),Array.prototype.indexOf||(Array.prototype.indexOf=function(t){var e=Object(this),n=e.length>>>0;if(0===n)return-1;var i=0;if(arguments.length>1&&(i=Number(arguments[1]),i!==i?i=0:0!==i&&1/0!=i&&i!==-1/0&&(i=(i>0||-1)*Math.floor(Math.abs(i)))),i>=n)return-1;for(var r=i>=0?i:Math.max(n-Math.abs(i),0);n>r;r++)if(r in e&&e[r]===t)return r;return-1});var ee=function(t,e){this.id=t,this.value=e};ee.prototype.compareTo=function(t){var e=this.value.compareTo(t.value);return 0===e&&(e=this.id-t.id),e};var ne=m.internals.PriorityQueue=function(t){this.items=Array(t),this.length=0},ie=ne.prototype;ie.isHigherPriority=function(t,e){return 0>this.items[t].compareTo(this.items[e])},ie.percolate=function(t){if(!(t>=this.length||0>t)){var e=t-1>>1;if(!(0>e||e===t)&&this.isHigherPriority(t,e)){var n=this.items[t];this.items[t]=this.items[e],this.items[e]=n,this.percolate(e)}}},ie.heapify=function(e){if(e===t&&(e=0),!(e>=this.length||0>e)){var n=2*e+1,i=2*e+2,r=e;if(this.length>n&&this.isHigherPriority(n,r)&&(r=n),this.length>i&&this.isHigherPriority(i,r)&&(r=i),r!==e){var s=this.items[e];this.items[e]=this.items[r],this.items[r]=s,this.heapify(r)}}},ie.peek=function(){return this.items[0].value},ie.removeAt=function(t){this.items[t]=this.items[--this.length],delete this.items[this.length],this.heapify()},ie.dequeue=function(){var t=this.peek();return this.removeAt(0),t},ie.enqueue=function(t){var e=this.length++;this.items[e]=new ee(ne.count++,t),this.percolate(e)},ie.remove=function(t){for(var e=0;this.length>e;e++)if(this.items[e].value===t)return this.removeAt(e),!0;return!1},ne.count=0;var re=m.CompositeDisposable=function(){this.disposables=a(arguments,0),this.isDisposed=!1,this.length=this.disposables.length},se=re.prototype;se.add=function(t){this.isDisposed?t.dispose():(this.disposables.push(t),this.length++)},se.remove=function(t){var e=!1;if(!this.isDisposed){var n=this.disposables.indexOf(t);-1!==n&&(e=!0,this.disposables.splice(n,1),this.length--,t.dispose())}return e},se.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;var t=this.disposables.slice(0);this.disposables=[],this.length=0;for(var e=0,n=t.length;n>e;e++)t[e].dispose()}},se.clear=function(){var t=this.disposables.slice(0);this.disposables=[],this.length=0;for(var e=0,n=t.length;n>e;e++)t[e].dispose()},se.contains=function(t){return-1!==this.disposables.indexOf(t)},se.toArray=function(){return this.disposables.slice(0)};var oe=m.Disposable=function(t){this.isDisposed=!1,this.action=t||g};oe.prototype.dispose=function(){this.isDisposed||(this.action(),this.isDisposed=!0)};var ue=oe.create=function(t){return new oe(t)},ce=oe.empty={dispose:g},he=function(){function t(t){this.isSingle=t,this.isDisposed=!1,this.current=null}var e=t.prototype;return e.getDisposable=function(){return this.current},e.setDisposable=function(t){if(this.current&&this.isSingle)throw Error("Disposable has already been assigned");var e,n=this.isDisposed;n||(e=this.current,this.current=t),e&&e.dispose(),n&&t&&t.dispose()},e.dispose=function(){var t;this.isDisposed||(this.isDisposed=!0,t=this.current,this.current=null),t&&t.dispose()},t}(),ae=m.SingleAssignmentDisposable=function(t){function e(){t.call(this,!0)}return X(e,t),e}(he),le=m.SerialDisposable=function(t){function e(){t.call(this,!1)}return X(e,t),e}(he);m.RefCountDisposable=function(){function t(t){this.disposable=t,this.disposable.count++,this.isInnerDisposed=!1}function e(t){this.underlyingDisposable=t,this.isDisposed=!1,this.isPrimaryDisposed=!1,this.count=0}return t.prototype.dispose=function(){this.disposable.isDisposed||this.isInnerDisposed||(this.isInnerDisposed=!0,this.disposable.count--,0===this.disposable.count&&this.disposable.isPrimaryDisposed&&(this.disposable.isDisposed=!0,this.disposable.underlyingDisposable.dispose()))},e.prototype.dispose=function(){this.isDisposed||this.isPrimaryDisposed||(this.isPrimaryDisposed=!0,0===this.count&&(this.isDisposed=!0,this.underlyingDisposable.dispose()))},e.prototype.getDisposable=function(){return this.isDisposed?ce:new t(this)},e}(),l.prototype.dispose=function(){var t=this;this.scheduler.schedule(function(){t.isDisposed||(t.isDisposed=!0,t.disposable.dispose())})};var pe=m.internals.ScheduledItem=function(t,e,n,i,r){this.scheduler=t,this.state=e,this.action=n,this.dueTime=i,this.comparer=r||_,this.disposable=new ae};pe.prototype.invoke=function(){this.disposable.setDisposable(this.invokeCore())},pe.prototype.compareTo=function(t){return this.comparer(this.dueTime,t.dueTime)},pe.prototype.isCancelled=function(){return this.disposable.isDisposed},pe.prototype.invokeCore=function(){return this.action(this.scheduler,this.state)};var fe=m.Scheduler=function(){function t(t,e,n,i){this.now=t,this._schedule=e,this._scheduleRelative=n,this._scheduleAbsolute=i}function e(t,e){var n=e.first,i=e.second,r=new re,s=function(e){i(e,function(e){var n=!1,i=!1,o=t.scheduleWithState(e,function(t,e){return n?r.remove(o):i=!0,s(e),ce});i||(r.add(o),n=!0)})};return s(n),r}function n(t,e,n){var i=e.first,r=e.second,s=new re,o=function(e){r(e,function(e,i){var r=!1,u=!1,c=t[n].call(t,e,i,function(t,e){return r?s.remove(c):u=!0,o(e),ce});u||(s.add(c),r=!0)})};return o(i),s}function i(t,e){return e(),ce}var r=t.prototype;return r.catchException=r["catch"]=function(t){return new ge(this,t)},r.schedulePeriodic=function(t,e){return this.schedulePeriodicWithState(null,t,function(){e()})},r.schedulePeriodicWithState=function(t,e,n){var i=t,r=setInterval(function(){i=n(i)},e);return ue(function(){clearInterval(r)})},r.schedule=function(t){return this._schedule(t,i)},r.scheduleWithState=function(t,e){return this._schedule(t,e)},r.scheduleWithRelative=function(t,e){return this._scheduleRelative(e,t,i)},r.scheduleWithRelativeAndState=function(t,e,n){return this._scheduleRelative(t,e,n)},r.scheduleWithAbsolute=function(t,e){return this._scheduleAbsolute(e,t,i)},r.scheduleWithAbsoluteAndState=function(t,e,n){return this._scheduleAbsolute(t,e,n)},r.scheduleRecursive=function(t){return this.scheduleRecursiveWithState(t,function(t,e){t(function(){e(t)})})},r.scheduleRecursiveWithState=function(t,n){return this.scheduleWithState({first:t,second:n},function(t,n){return e(t,n)})},r.scheduleRecursiveWithRelative=function(t,e){return this.scheduleRecursiveWithRelativeAndState(e,t,function(t,e){t(function(n){e(t,n)})})},r.scheduleRecursiveWithRelativeAndState=function(t,e,i){return this._scheduleRelative({first:t,second:i},e,function(t,e){return n(t,e,"scheduleWithRelativeAndState")})},r.scheduleRecursiveWithAbsolute=function(t,e){return this.scheduleRecursiveWithAbsoluteAndState(e,t,function(t,e){t(function(n){e(t,n)})})},r.scheduleRecursiveWithAbsoluteAndState=function(t,e,i){return this._scheduleAbsolute({first:t,second:i},e,function(t,e){return n(t,e,"scheduleWithAbsoluteAndState")})},t.now=S,t.normalize=function(t){return 0>t&&(t=0),t},t}(),de=fe.normalize;m.internals.SchedulePeriodicRecursive=function(){function t(t,e){e(0,this._period);try{this._state=this._action(this._state)}catch(n){throw this._cancel.dispose(),n}}function e(t,e,n,i){this._scheduler=t,this._state=e,this._period=n,this._action=i}return e.prototype.start=function(){var e=new ae;return this._cancel=e,e.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0,this._period,t.bind(this))),e},e}();var ve,be=fe.immediate=function(){function t(t,e){return e(this,t)}function e(t,e,n){for(var i=de(i);i-this.now()>0;);return n(this,t)}function n(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}return new fe(S,t,e,n)}(),ye=fe.currentThread=function(){function t(t){for(var e;t.length>0;)if(e=t.dequeue(),!e.isCancelled()){for(;e.dueTime-fe.now()>0;);e.isCancelled()||e.invoke()}}function e(t,e){return this.scheduleWithRelativeAndState(t,0,e)}function n(e,n,i){var s=this.now()+fe.normalize(n),o=new pe(this,e,i,s);if(r)r.enqueue(o);else{r=new ne(4),r.enqueue(o);try{t(r)}catch(u){throw u}finally{r=null}}return o.disposable}function i(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}var r,s=new fe(S,e,n,i);return s.scheduleRequired=function(){return null===r},s.ensureTrampoline=function(t){return null===r?this.schedule(t):t()},s}(),me=g;(function(){function t(){if(!f.postMessage||f.importScripts)return!1;var t=!1,e=f.onmessage;return f.onmessage=function(){t=!0},f.postMessage("","*"),f.onmessage=e,t}function e(t){if("string"==typeof t.data&&t.data.substring(0,s.length)===s){var e=t.data.substring(s.length),n=o[e];n(),delete o[e]}}var n=RegExp("^"+(F+"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),i="function"==typeof(i=y&&b&&y.setImmediate)&&!n.test(i)&&i,r="function"==typeof(r=y&&b&&y.clearImmediate)&&!n.test(r)&&r;if("undefined"!=typeof process&&"[object process]"==={}.toString.call(process))ve=process.nextTick;else if("function"==typeof i)ve=i,me=r;else if(t()){var s="ms.rx.schedule"+Math.random(),o={},u=0;f.addEventListener?f.addEventListener("message",e,!1):f.attachEvent("onmessage",e,!1),ve=function(t){var e=u++;o[e]=t,f.postMessage(s+e,"*")}}else if(f.MessageChannel){var c=new f.MessageChannel,h={},a=0;c.port1.onmessage=function(t){var e=t.data,n=h[e];n(),delete h[e]},ve=function(t){var e=a++;h[e]=t,c.port2.postMessage(e)}}else"document"in f&&"onreadystatechange"in f.document.createElement("script")?ve=function(t){var e=f.document.createElement("script");e.onreadystatechange=function(){t(),e.onreadystatechange=null,e.parentNode.removeChild(e),e=null},f.document.documentElement.appendChild(e)}:(ve=function(t){return setTimeout(t,0)},me=clearTimeout)})(),fe.timeout=function(){function t(t,e){var n=this,i=new ae,r=ve(function(){i.isDisposed||i.setDisposable(e(n,t))});return new re(i,ue(function(){me(r)}))}function e(t,e,n){var i=this,r=fe.normalize(e);if(0===r)return i.scheduleWithState(t,n);var s=new ae,o=setTimeout(function(){s.isDisposed||s.setDisposable(n(i,t))},r);return new re(s,ue(function(){clearTimeout(o)}))}function n(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}return new fe(S,t,e,n)}();var ge=function(t){function e(){return this._scheduler.now()}function n(t,e){return this._scheduler.scheduleWithState(t,this._wrap(e))}function i(t,e,n){return this._scheduler.scheduleWithRelativeAndState(t,e,this._wrap(n))}function r(t,e,n){return this._scheduler.scheduleWithAbsoluteAndState(t,e,this._wrap(n))}function s(s,o){this._scheduler=s,this._handler=o,this._recursiveOriginal=null,this._recursiveWrapper=null,t.call(this,e,n,i,r)}return X(s,t),s.prototype._clone=function(t){return new s(t,this._handler)},s.prototype._wrap=function(t){var e=this;return function(n,i){try{return t(e._getRecursiveWrapper(n),i)}catch(r){if(!e._handler(r))throw r;return ce}}},s.prototype._getRecursiveWrapper=function(t){if(this._recursiveOriginal!==t){this._recursiveOriginal=t;var e=this._clone(t);e._recursiveOriginal=t,e._recursiveWrapper=e,this._recursiveWrapper=e}return this._recursiveWrapper},s.prototype.schedulePeriodicWithState=function(t,e,n){var i=this,r=!1,s=new ae;return s.setDisposable(this._scheduler.schedulePeriodicWithState(t,e,function(t){if(r)return null;try{return n(t)}catch(e){if(r=!0,!i._handler(e))throw e;return s.dispose(),null}})),s},s}(fe),we=m.Notification=function(){function t(t,e){this.hasValue=null==e?!1:e,this.kind=t}var e=t.prototype;return e.accept=function(t,e,n){return 1===arguments.length&&"object"==typeof t?this._acceptObservable(t):this._accept(t,e,n)},e.toObservable=function(t){var e=this;return t||(t=be),new ke(function(n){return t.schedule(function(){e._acceptObservable(n),"N"===e.kind&&n.onCompleted()})})},t}(),Se=we.createOnNext=function(){function t(t){return t(this.value)}function e(t){return t.onNext(this.value)}function n(){return"OnNext("+this.value+")"}return function(i){var r=new we("N",!0);return r.value=i,r._accept=t,r._acceptObservable=e,r.toString=n,r}}(),_e=we.createOnError=function(){function t(t,e){return e(this.exception)}function e(t){return t.onError(this.exception)}function n(){return"OnError("+this.exception+")"}return function(i){var r=new we("E");return r.exception=i,r._accept=t,r._acceptObservable=e,r.toString=n,r}}(),De=we.createOnCompleted=function(){function t(t,e,n){return n()}function e(t){return t.onCompleted()}function n(){return"OnCompleted()"}return function(){var i=new we("C");return i._accept=t,i._acceptObservable=e,i.toString=n,i}}(),xe=m.internals.Enumerator=function(t){this._next=t};xe.prototype.next=function(){return this._next()},xe.prototype[E]=function(){return this};var Ae=m.internals.Enumerable=function(t){this._iterator=t};Ae.prototype[E]=function(){return this._iterator()},Ae.prototype.concat=function(){var e=this;return new ke(function(n){var i;try{i=e[E]()}catch(r){return n.onError(),t}var s,o=new le,u=be.scheduleRecursive(function(e){var r;if(!s){try{r=i.next()}catch(u){return n.onError(u),t}if(r.done)return n.onCompleted(),t;var c=r.value;x(c)&&(c=observableFromPromise(c));var h=new ae;o.setDisposable(h),h.setDisposable(c.subscribe(n.onNext.bind(n),n.onError.bind(n),function(){e()}))}});return new re(o,u,ue(function(){s=!0}))})},Ae.prototype.catchException=function(){var e=this;return new ke(function(n){var i;try{i=e[E]()}catch(r){return n.onError(),t}var s,o,u=new le,c=be.scheduleRecursive(function(e){if(!s){var r;try{r=i.next()}catch(c){return n.onError(c),t}if(r.done)return o?n.onError(o):n.onCompleted(),t;var h=r.value;x(h)&&(h=observableFromPromise(h));var a=new ae;u.setDisposable(a),a.setDisposable(h.subscribe(n.onNext.bind(n),function(t){o=t,e()},n.onCompleted.bind(n)))}});return new re(u,c,ue(function(){s=!0}))})},Ae.repeat=function(t,e){return null==e&&(e=-1),new Ae(function(){var n=e;return new xe(function(){return 0===n?R:(n>0&&n--,{done:!1,value:t})})})},Ae.forEach=function(t,e,n){return e||(e=w),new Ae(function(){var i=-1;return new xe(function(){return++i0&&(e=!this.isAcquired,this.isAcquired=!0),e&&this.disposable.setDisposable(this.scheduler.scheduleRecursive(function(e){var i;if(!(n.queue.length>0))return n.isAcquired=!1,t;i=n.queue.shift();try{i()}catch(r){throw n.queue=[],n.hasFaulted=!0,r}e()}))},n.prototype.dispose=function(){e.prototype.dispose.call(this),this.disposable.dispose()},n}(je),Ne=function(t){function e(){t.apply(this,arguments)}return X(e,t),e.prototype.next=function(e){t.prototype.next.call(this,e),this.ensureActive()},e.prototype.error=function(e){t.prototype.error.call(this,e),this.ensureActive()},e.prototype.completed=function(){t.prototype.completed.call(this),this.ensureActive()},e}(Pe),qe=m.Observable=function(){function t(t){this._subscribe=t}return Re=t.prototype,Re.subscribe=Re.forEach=function(t,e,n){var i="object"==typeof t?t:Oe(t,e,n);return this._subscribe(i)},t}(),ke=m.AnonymousObservable=function(e){function n(e){return e===t?e=ce:"function"==typeof e&&(e=ue(e)),e}function i(r){function s(t){var e=function(){try{i.setDisposable(n(r(i)))}catch(t){if(!i.fail(t))throw t}},i=new Te(t);return ye.scheduleRequired()?ye.schedule(e):e(),i}return this instanceof i?(e.call(this,s),t):new i(r)}return X(i,e),i}(qe),Te=function(t){function e(e){t.call(this),this.observer=e,this.m=new ae}X(e,t);var n=e.prototype;return n.next=function(t){var e=!1;try{this.observer.onNext(t),e=!0}catch(n){throw n}finally{e||this.dispose()}},n.error=function(t){try{this.observer.onError(t)}catch(e){throw e}finally{this.dispose()}},n.completed=function(){try{this.observer.onCompleted()}catch(t){throw t}finally{this.dispose()}},n.setDisposable=function(t){this.m.setDisposable(t)},n.getDisposable=function(){return this.m.getDisposable()},n.disposable=function(t){return arguments.length?this.getDisposable():setDisposable(t)},n.dispose=function(){t.prototype.dispose.call(this),this.m.dispose()},e}(je);(function(t){function e(t){return this.underlyingObservable.subscribe(t)}function n(n,i,r){t.call(this,e),this.key=n,this.underlyingObservable=r?new ke(function(t){return new re(r.getDisposable(),i.subscribe(t))}):i}return X(n,t),n})(qe);var Ie=function(t,e){this.subject=t,this.observer=e};Ie.prototype.dispose=function(){if(!this.subject.isDisposed&&null!==this.observer){var t=this.subject.observers.indexOf(this.observer);this.subject.observers.splice(t,1),this.observer=null}},m.Subject=function(t){function n(t){return e.call(this),this.isStopped?this.exception?(t.onError(this.exception),ce):(t.onCompleted(),ce):(this.observers.push(t),new Ie(this,t))}function i(){t.call(this,n),this.isDisposed=!1,this.isStopped=!1,this.observers=[]}return X(i,t),Y(i.prototype,Ee,{hasObservers:function(){return this.observers.length>0},onCompleted:function(){if(e.call(this),!this.isStopped){var t=this.observers.slice(0);this.isStopped=!0;for(var n=0,i=t.length;i>n;n++)t[n].onCompleted();this.observers=[]}},onError:function(t){if(e.call(this),!this.isStopped){var n=this.observers.slice(0);this.isStopped=!0,this.exception=t;for(var i=0,r=n.length;r>i;i++)n[i].onError(t);this.observers=[]}},onNext:function(t){if(e.call(this),!this.isStopped)for(var n=this.observers.slice(0),i=0,r=n.length;r>i;i++)n[i].onNext(t)},dispose:function(){this.isDisposed=!0,this.observers=null}}),i.create=function(t,e){return new Me(t,e)},i}(qe),m.AsyncSubject=function(t){function n(t){if(e.call(this),!this.isStopped)return this.observers.push(t),new Ie(this,t);var n=this.exception,i=this.hasValue,r=this.value;return n?t.onError(n):i?(t.onNext(r),t.onCompleted()):t.onCompleted(),ce}function i(){t.call(this,n),this.isDisposed=!1,this.isStopped=!1,this.value=null,this.hasValue=!1,this.observers=[],this.exception=null}return X(i,t),Y(i.prototype,Ee,{hasObservers:function(){return e.call(this),this.observers.length>0},onCompleted:function(){var t,n,i;if(e.call(this),!this.isStopped){this.isStopped=!0;var r=this.observers.slice(0),s=this.value,o=this.hasValue;if(o)for(n=0,i=r.length;i>n;n++)t=r[n],t.onNext(s),t.onCompleted();else for(n=0,i=r.length;i>n;n++)r[n].onCompleted();this.observers=[]}},onError:function(t){if(e.call(this),!this.isStopped){var n=this.observers.slice(0);this.isStopped=!0,this.exception=t;for(var i=0,r=n.length;r>i;i++)n[i].onError(t);this.observers=[]}},onNext:function(t){e.call(this),this.isStopped||(this.value=t,this.hasValue=!0)},dispose:function(){this.isDisposed=!0,this.observers=null,this.exception=null,this.value=null}}),i}(qe);var Me=function(t){function e(t){return this.observable.subscribe(t)}function n(n,i){t.call(this,e),this.observer=n,this.observable=i}return X(n,t),Y(n.prototype,Ee,{onCompleted:function(){this.observer.onCompleted()},onError:function(t){this.observer.onError(t)},onNext:function(t){this.observer.onNext(t)}}),n}(qe);"function"==typeof define&&"object"==typeof define.amd&&define.amd?(f.Rx=m,define(function(){return m})):d&&v?b?(v.exports=m).Rx=m:d.Rx=m:f.Rx=m}).call(this); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.core.js b/ajax/libs/rxjs/2.2.28/rx.core.js new file mode 100644 index 000000000..df16664d2 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.core.js @@ -0,0 +1,2509 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +;(function (undefined) { + + var objectTypes = { + 'boolean': false, + 'function': true, + 'object': true, + 'number': false, + 'string': false, + 'undefined': false + }; + + var root = (objectTypes[typeof window] && window) || this, + freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports, + freeModule = objectTypes[typeof module] && module && !module.nodeType && module, + moduleExports = freeModule && freeModule.exports === freeExports && freeExports, + freeGlobal = objectTypes[typeof global] && global; + + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) { + root = freeGlobal; + } + + var Rx = { + internals: {}, + config: { + Promise: root.Promise // Detect if promise exists + }, + helpers: { } + }; + + // Defaults + var noop = Rx.helpers.noop = function () { }, + identity = Rx.helpers.identity = function (x) { return x; }, + pluck = Rx.helpers.pluck = function (property) { return function (x) { return x[property]; }; }, + just = Rx.helpers.just = function (value) { return function () { return value; }; }, + defaultNow = Rx.helpers.defaultNow = Date.now, + defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); }, + defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); }, + defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); }, + defaultError = Rx.helpers.defaultError = function (err) { throw err; }, + isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.then === 'function' && p.then !== Rx.Observable.prototype.then; }, + asArray = Rx.helpers.asArray = function () { return Array.prototype.slice.call(arguments); }, + not = Rx.helpers.not = function (a) { return !a; }; + + // Errors + var sequenceContainsNoElements = 'Sequence contains no elements.'; + var argumentOutOfRange = 'Argument out of range'; + var objectDisposed = 'Object has been disposed'; + function checkDisposed() { if (this.isDisposed) { throw new Error(objectDisposed); } } + + // Shim in iterator support + var $iterator$ = (typeof Symbol === 'object' && Symbol.iterator) || + '_es6shim_iterator_'; + // Firefox ships a partial implementation using the name @@iterator. + // https://bugzilla.mozilla.org/show_bug.cgi?id=907077#c14 + // So use that name if we detect it. + if (root.Set && typeof new root.Set()['@@iterator'] === 'function') { + $iterator$ = '@@iterator'; + } + var doneEnumerator = { done: true, value: undefined }; + + /** `Object#toString` result shortcuts */ + var argsClass = '[object Arguments]', + arrayClass = '[object Array]', + boolClass = '[object Boolean]', + dateClass = '[object Date]', + errorClass = '[object Error]', + funcClass = '[object Function]', + numberClass = '[object Number]', + objectClass = '[object Object]', + regexpClass = '[object RegExp]', + stringClass = '[object String]'; + + var toString = Object.prototype.toString, + hasOwnProperty = Object.prototype.hasOwnProperty, + supportsArgsClass = toString.call(arguments) == argsClass, // For less -1); + } + }); + } + } + stackA.pop(); + stackB.pop(); + + return result; + } + var slice = Array.prototype.slice; + function argsOrArray(args, idx) { + return args.length === 1 && Array.isArray(args[idx]) ? + args[idx] : + slice.call(args); + } + var hasProp = {}.hasOwnProperty; + + /** @private */ + var inherits = this.inherits = Rx.internals.inherits = function (child, parent) { + function __() { this.constructor = child; } + __.prototype = parent.prototype; + child.prototype = new __(); + }; + + /** @private */ + var addProperties = Rx.internals.addProperties = function (obj) { + var sources = slice.call(arguments, 1); + for (var i = 0, len = sources.length; i < len; i++) { + var source = sources[i]; + for (var prop in source) { + obj[prop] = source[prop]; + } + } + }; + + // Rx Utils + var addRef = Rx.internals.addRef = function (xs, r) { + return new AnonymousObservable(function (observer) { + return new CompositeDisposable(r.getDisposable(), xs.subscribe(observer)); + }); + }; + + // Collection polyfills + function arrayInitialize(count, factory) { + var a = new Array(count); + for (var i = 0; i < count; i++) { + a[i] = factory(); + } + return a; + } + + // Collections + var IndexedItem = function (id, value) { + this.id = id; + this.value = value; + }; + + IndexedItem.prototype.compareTo = function (other) { + var c = this.value.compareTo(other.value); + if (c === 0) { + c = this.id - other.id; + } + return c; + }; + + // Priority Queue for Scheduling + var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) { + this.items = new Array(capacity); + this.length = 0; + }; + + var priorityProto = PriorityQueue.prototype; + priorityProto.isHigherPriority = function (left, right) { + return this.items[left].compareTo(this.items[right]) < 0; + }; + + priorityProto.percolate = function (index) { + if (index >= this.length || index < 0) { + return; + } + var parent = index - 1 >> 1; + if (parent < 0 || parent === index) { + return; + } + if (this.isHigherPriority(index, parent)) { + var temp = this.items[index]; + this.items[index] = this.items[parent]; + this.items[parent] = temp; + this.percolate(parent); + } + }; + + priorityProto.heapify = function (index) { + if (index === undefined) { + index = 0; + } + if (index >= this.length || index < 0) { + return; + } + var left = 2 * index + 1, + right = 2 * index + 2, + first = index; + if (left < this.length && this.isHigherPriority(left, first)) { + first = left; + } + if (right < this.length && this.isHigherPriority(right, first)) { + first = right; + } + if (first !== index) { + var temp = this.items[index]; + this.items[index] = this.items[first]; + this.items[first] = temp; + this.heapify(first); + } + }; + + priorityProto.peek = function () { return this.items[0].value; }; + + priorityProto.removeAt = function (index) { + this.items[index] = this.items[--this.length]; + delete this.items[this.length]; + this.heapify(); + }; + + priorityProto.dequeue = function () { + var result = this.peek(); + this.removeAt(0); + return result; + }; + + priorityProto.enqueue = function (item) { + var index = this.length++; + this.items[index] = new IndexedItem(PriorityQueue.count++, item); + this.percolate(index); + }; + + priorityProto.remove = function (item) { + for (var i = 0; i < this.length; i++) { + if (this.items[i].value === item) { + this.removeAt(i); + return true; + } + } + return false; + }; + PriorityQueue.count = 0; + /** + * Represents a group of disposable resources that are disposed together. + * @constructor + */ + var CompositeDisposable = Rx.CompositeDisposable = function () { + this.disposables = argsOrArray(arguments, 0); + this.isDisposed = false; + this.length = this.disposables.length; + }; + + var CompositeDisposablePrototype = CompositeDisposable.prototype; + + /** + * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed. + * @param {Mixed} item Disposable to add. + */ + CompositeDisposablePrototype.add = function (item) { + if (this.isDisposed) { + item.dispose(); + } else { + this.disposables.push(item); + this.length++; + } + }; + + /** + * Removes and disposes the first occurrence of a disposable from the CompositeDisposable. + * @param {Mixed} item Disposable to remove. + * @returns {Boolean} true if found; false otherwise. + */ + CompositeDisposablePrototype.remove = function (item) { + var shouldDispose = false; + if (!this.isDisposed) { + var idx = this.disposables.indexOf(item); + if (idx !== -1) { + shouldDispose = true; + this.disposables.splice(idx, 1); + this.length--; + item.dispose(); + } + + } + return shouldDispose; + }; + + /** + * Disposes all disposables in the group and removes them from the group. + */ + CompositeDisposablePrototype.dispose = function () { + if (!this.isDisposed) { + this.isDisposed = true; + var currentDisposables = this.disposables.slice(0); + this.disposables = []; + this.length = 0; + + for (var i = 0, len = currentDisposables.length; i < len; i++) { + currentDisposables[i].dispose(); + } + } + }; + + /** + * Removes and disposes all disposables from the CompositeDisposable, but does not dispose the CompositeDisposable. + */ + CompositeDisposablePrototype.clear = function () { + var currentDisposables = this.disposables.slice(0); + this.disposables = []; + this.length = 0; + for (var i = 0, len = currentDisposables.length; i < len; i++) { + currentDisposables[i].dispose(); + } + }; + + /** + * Determines whether the CompositeDisposable contains a specific disposable. + * @param {Mixed} item Disposable to search for. + * @returns {Boolean} true if the disposable was found; otherwise, false. + */ + CompositeDisposablePrototype.contains = function (item) { + return this.disposables.indexOf(item) !== -1; + }; + + /** + * Converts the existing CompositeDisposable to an array of disposables + * @returns {Array} An array of disposable objects. + */ + CompositeDisposablePrototype.toArray = function () { + return this.disposables.slice(0); + }; + + /** + * Provides a set of static methods for creating Disposables. + * + * @constructor + * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once. + */ + var Disposable = Rx.Disposable = function (action) { + this.isDisposed = false; + this.action = action || noop; + }; + + /** Performs the task of cleaning up resources. */ + Disposable.prototype.dispose = function () { + if (!this.isDisposed) { + this.action(); + this.isDisposed = true; + } + }; + + /** + * Creates a disposable object that invokes the specified action when disposed. + * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once. + * @return {Disposable} The disposable object that runs the given action upon disposal. + */ + var disposableCreate = Disposable.create = function (action) { return new Disposable(action); }; + + /** + * Gets the disposable that does nothing when disposed. + */ + var disposableEmpty = Disposable.empty = { dispose: noop }; + + var BooleanDisposable = (function () { + function BooleanDisposable (isSingle) { + this.isSingle = isSingle; + this.isDisposed = false; + this.current = null; + } + + var booleanDisposablePrototype = BooleanDisposable.prototype; + + /** + * Gets the underlying disposable. + * @return The underlying disposable. + */ + booleanDisposablePrototype.getDisposable = function () { + return this.current; + }; + + /** + * Sets the underlying disposable. + * @param {Disposable} value The new underlying disposable. + */ + booleanDisposablePrototype.setDisposable = function (value) { + if (this.current && this.isSingle) { + throw new Error('Disposable has already been assigned'); + } + + var shouldDispose = this.isDisposed, old; + if (!shouldDispose) { + old = this.current; + this.current = value; + } + if (old) { + old.dispose(); + } + if (shouldDispose && value) { + value.dispose(); + } + }; + + /** + * Disposes the underlying disposable as well as all future replacements. + */ + booleanDisposablePrototype.dispose = function () { + var old; + if (!this.isDisposed) { + this.isDisposed = true; + old = this.current; + this.current = null; + } + if (old) { + old.dispose(); + } + }; + + return BooleanDisposable; + }()); + + /** + * Represents a disposable resource which only allows a single assignment of its underlying disposable resource. + * If an underlying disposable resource has already been set, future attempts to set the underlying disposable resource will throw an Error. + */ + var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = (function (super_) { + inherits(SingleAssignmentDisposable, super_); + + function SingleAssignmentDisposable() { + super_.call(this, true); + } + + return SingleAssignmentDisposable; + }(BooleanDisposable)); + + /** + * Represents a disposable resource whose underlying disposable resource can be replaced by another disposable resource, causing automatic disposal of the previous underlying disposable resource. + */ + var SerialDisposable = Rx.SerialDisposable = (function (super_) { + inherits(SerialDisposable, super_); + + function SerialDisposable() { + super_.call(this, false); + } + + return SerialDisposable; + }(BooleanDisposable)); + + /** + * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed. + */ + var RefCountDisposable = Rx.RefCountDisposable = (function () { + + function InnerDisposable(disposable) { + this.disposable = disposable; + this.disposable.count++; + this.isInnerDisposed = false; + } + + InnerDisposable.prototype.dispose = function () { + if (!this.disposable.isDisposed) { + if (!this.isInnerDisposed) { + this.isInnerDisposed = true; + this.disposable.count--; + if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) { + this.disposable.isDisposed = true; + this.disposable.underlyingDisposable.dispose(); + } + } + } + }; + + /** + * Initializes a new instance of the RefCountDisposable with the specified disposable. + * @constructor + * @param {Disposable} disposable Underlying disposable. + */ + function RefCountDisposable(disposable) { + this.underlyingDisposable = disposable; + this.isDisposed = false; + this.isPrimaryDisposed = false; + this.count = 0; + } + + /** + * Disposes the underlying disposable only when all dependent disposables have been disposed + */ + RefCountDisposable.prototype.dispose = function () { + if (!this.isDisposed) { + if (!this.isPrimaryDisposed) { + this.isPrimaryDisposed = true; + if (this.count === 0) { + this.isDisposed = true; + this.underlyingDisposable.dispose(); + } + } + } + }; + + /** + * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable. + * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime. + */ + RefCountDisposable.prototype.getDisposable = function () { + return this.isDisposed ? disposableEmpty : new InnerDisposable(this); + }; + + return RefCountDisposable; + })(); + + function ScheduledDisposable(scheduler, disposable) { + this.scheduler = scheduler; + this.disposable = disposable; + this.isDisposed = false; + } + + ScheduledDisposable.prototype.dispose = function () { + var parent = this; + this.scheduler.schedule(function () { + if (!parent.isDisposed) { + parent.isDisposed = true; + parent.disposable.dispose(); + } + }); + }; + + var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) { + this.scheduler = scheduler; + this.state = state; + this.action = action; + this.dueTime = dueTime; + this.comparer = comparer || defaultSubComparer; + this.disposable = new SingleAssignmentDisposable(); + } + + ScheduledItem.prototype.invoke = function () { + this.disposable.setDisposable(this.invokeCore()); + }; + + ScheduledItem.prototype.compareTo = function (other) { + return this.comparer(this.dueTime, other.dueTime); + }; + + ScheduledItem.prototype.isCancelled = function () { + return this.disposable.isDisposed; + }; + + ScheduledItem.prototype.invokeCore = function () { + return this.action(this.scheduler, this.state); + }; + + /** Provides a set of static properties to access commonly used schedulers. */ + var Scheduler = Rx.Scheduler = (function () { + + /** + * @constructor + * @private + */ + function Scheduler(now, schedule, scheduleRelative, scheduleAbsolute) { + this.now = now; + this._schedule = schedule; + this._scheduleRelative = scheduleRelative; + this._scheduleAbsolute = scheduleAbsolute; + } + + function invokeRecImmediate(scheduler, pair) { + var state = pair.first, action = pair.second, group = new CompositeDisposable(), + recursiveAction = function (state1) { + action(state1, function (state2) { + var isAdded = false, isDone = false, + d = scheduler.scheduleWithState(state2, function (scheduler1, state3) { + if (isAdded) { + group.remove(d); + } else { + isDone = true; + } + recursiveAction(state3); + return disposableEmpty; + }); + if (!isDone) { + group.add(d); + isAdded = true; + } + }); + }; + recursiveAction(state); + return group; + } + + function invokeRecDate(scheduler, pair, method) { + var state = pair.first, action = pair.second, group = new CompositeDisposable(), + recursiveAction = function (state1) { + action(state1, function (state2, dueTime1) { + var isAdded = false, isDone = false, + d = scheduler[method].call(scheduler, state2, dueTime1, function (scheduler1, state3) { + if (isAdded) { + group.remove(d); + } else { + isDone = true; + } + recursiveAction(state3); + return disposableEmpty; + }); + if (!isDone) { + group.add(d); + isAdded = true; + } + }); + }; + recursiveAction(state); + return group; + } + + function invokeAction(scheduler, action) { + action(); + return disposableEmpty; + } + + var schedulerProto = Scheduler.prototype; + + /** + * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions. + * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false. + * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling. + */ + schedulerProto.catchException = schedulerProto['catch'] = function (handler) { + return new CatchScheduler(this, handler); + }; + + /** + * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation. + * @param {Number} period Period for running the work periodically. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort). + */ + schedulerProto.schedulePeriodic = function (period, action) { + return this.schedulePeriodicWithState(null, period, function () { + action(); + }); + }; + + /** + * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation. + * @param {Mixed} state Initial state passed to the action upon the first iteration. + * @param {Number} period Period for running the work periodically. + * @param {Function} action Action to be executed, potentially updating the state. + * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort). + */ + schedulerProto.schedulePeriodicWithState = function (state, period, action) { + var s = state, id = setInterval(function () { + s = action(s); + }, period); + return disposableCreate(function () { + clearInterval(id); + }); + }; + + /** + * Schedules an action to be executed. + * @param {Function} action Action to execute. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.schedule = function (action) { + return this._schedule(action, invokeAction); + }; + + /** + * Schedules an action to be executed. + * @param state State passed to the action to be executed. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithState = function (state, action) { + return this._schedule(state, action); + }; + + /** + * Schedules an action to be executed after the specified relative due time. + * @param {Function} action Action to execute. + * @param {Number} dueTime Relative time after which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithRelative = function (dueTime, action) { + return this._scheduleRelative(action, dueTime, invokeAction); + }; + + /** + * Schedules an action to be executed after dueTime. + * @param state State passed to the action to be executed. + * @param {Function} action Action to be executed. + * @param {Number} dueTime Relative time after which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithRelativeAndState = function (state, dueTime, action) { + return this._scheduleRelative(state, dueTime, action); + }; + + /** + * Schedules an action to be executed at the specified absolute due time. + * @param {Function} action Action to execute. + * @param {Number} dueTime Absolute time at which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithAbsolute = function (dueTime, action) { + return this._scheduleAbsolute(action, dueTime, invokeAction); + }; + + /** + * Schedules an action to be executed at dueTime. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to be executed. + * @param {Number}dueTime Absolute time at which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithAbsoluteAndState = function (state, dueTime, action) { + return this._scheduleAbsolute(state, dueTime, action); + }; + + /** + * Schedules an action to be executed recursively. + * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursive = function (action) { + return this.scheduleRecursiveWithState(action, function (_action, self) { + _action(function () { + self(_action); + }); + }); + }; + + /** + * Schedules an action to be executed recursively. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithState = function (state, action) { + return this.scheduleWithState({ first: state, second: action }, function (s, p) { + return invokeRecImmediate(s, p); + }); + }; + + /** + * Schedules an action to be executed recursively after a specified relative due time. + * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified relative time. + * @param {Number}dueTime Relative time after which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithRelative = function (dueTime, action) { + return this.scheduleRecursiveWithRelativeAndState(action, dueTime, function (_action, self) { + _action(function (dt) { + self(_action, dt); + }); + }); + }; + + /** + * Schedules an action to be executed recursively after a specified relative due time. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state. + * @param {Number}dueTime Relative time after which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithRelativeAndState = function (state, dueTime, action) { + return this._scheduleRelative({ first: state, second: action }, dueTime, function (s, p) { + return invokeRecDate(s, p, 'scheduleWithRelativeAndState'); + }); + }; + + /** + * Schedules an action to be executed recursively at a specified absolute due time. + * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified absolute time. + * @param {Number}dueTime Absolute time at which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithAbsolute = function (dueTime, action) { + return this.scheduleRecursiveWithAbsoluteAndState(action, dueTime, function (_action, self) { + _action(function (dt) { + self(_action, dt); + }); + }); + }; + + /** + * Schedules an action to be executed recursively at a specified absolute due time. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state. + * @param {Number}dueTime Absolute time at which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithAbsoluteAndState = function (state, dueTime, action) { + return this._scheduleAbsolute({ first: state, second: action }, dueTime, function (s, p) { + return invokeRecDate(s, p, 'scheduleWithAbsoluteAndState'); + }); + }; + + /** Gets the current time according to the local machine's system clock. */ + Scheduler.now = defaultNow; + + /** + * Normalizes the specified TimeSpan value to a positive value. + * @param {Number} timeSpan The time span value to normalize. + * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0 + */ + Scheduler.normalize = function (timeSpan) { + if (timeSpan < 0) { + timeSpan = 0; + } + return timeSpan; + }; + + return Scheduler; + }()); + + var normalizeTime = Scheduler.normalize; + + var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () { + function tick(command, recurse) { + recurse(0, this._period); + try { + this._state = this._action(this._state); + } catch (e) { + this._cancel.dispose(); + throw e; + } + } + + function SchedulePeriodicRecursive(scheduler, state, period, action) { + this._scheduler = scheduler; + this._state = state; + this._period = period; + this._action = action; + } + + SchedulePeriodicRecursive.prototype.start = function () { + var d = new SingleAssignmentDisposable(); + this._cancel = d; + d.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0, this._period, tick.bind(this))); + + return d; + }; + + return SchedulePeriodicRecursive; + }()); + + /** + * Gets a scheduler that schedules work immediately on the current thread. + */ + var immediateScheduler = Scheduler.immediate = (function () { + + function scheduleNow(state, action) { return action(this, state); } + + function scheduleRelative(state, dueTime, action) { + var dt = normalizeTime(dt); + while (dt - this.now() > 0) { } + return action(this, state); + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); + } + + return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); + }()); + + /** + * Gets a scheduler that schedules work as soon as possible on the current thread. + */ + var currentThreadScheduler = Scheduler.currentThread = (function () { + var queue; + + function runTrampoline (q) { + var item; + while (q.length > 0) { + item = q.dequeue(); + if (!item.isCancelled()) { + // Note, do not schedule blocking work! + while (item.dueTime - Scheduler.now() > 0) { + } + if (!item.isCancelled()) { + item.invoke(); + } + } + } + } + + function scheduleNow(state, action) { + return this.scheduleWithRelativeAndState(state, 0, action); + } + + function scheduleRelative(state, dueTime, action) { + var dt = this.now() + Scheduler.normalize(dueTime), + si = new ScheduledItem(this, state, action, dt), + t; + if (!queue) { + queue = new PriorityQueue(4); + queue.enqueue(si); + try { + runTrampoline(queue); + } catch (e) { + throw e; + } finally { + queue = null; + } + } else { + queue.enqueue(si); + } + return si.disposable; + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); + } + + var currentScheduler = new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); + currentScheduler.scheduleRequired = function () { return queue === null; }; + currentScheduler.ensureTrampoline = function (action) { + if (queue === null) { + return this.schedule(action); + } else { + return action(); + } + }; + + return currentScheduler; + }()); + + + var scheduleMethod, clearMethod = noop; + (function () { + + var reNative = RegExp('^' + + String(toString) + .replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + .replace(/toString| for [^\]]+/g, '.*?') + '$' + ); + + var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' && + !reNative.test(setImmediate) && setImmediate, + clearImmediate = typeof (clearImmediate = freeGlobal && moduleExports && freeGlobal.clearImmediate) == 'function' && + !reNative.test(clearImmediate) && clearImmediate; + + function postMessageSupported () { + // Ensure not in a worker + if (!root.postMessage || root.importScripts) { return false; } + var isAsync = false, + oldHandler = root.onmessage; + // Test for async + root.onmessage = function () { isAsync = true; }; + root.postMessage('','*'); + root.onmessage = oldHandler; + + return isAsync; + } + + // Use in order, nextTick, setImmediate, postMessage, MessageChannel, script readystatechanged, setTimeout + if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') { + scheduleMethod = process.nextTick; + } else if (typeof setImmediate === 'function') { + scheduleMethod = setImmediate; + clearMethod = clearImmediate; + } else if (postMessageSupported()) { + var MSG_PREFIX = 'ms.rx.schedule' + Math.random(), + tasks = {}, + taskId = 0; + + function onGlobalPostMessage(event) { + // Only if we're a match to avoid any other global events + if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) { + var handleId = event.data.substring(MSG_PREFIX.length), + action = tasks[handleId]; + action(); + delete tasks[handleId]; + } + } + + if (root.addEventListener) { + root.addEventListener('message', onGlobalPostMessage, false); + } else { + root.attachEvent('onmessage', onGlobalPostMessage, false); + } + + scheduleMethod = function (action) { + var currentId = taskId++; + tasks[currentId] = action; + root.postMessage(MSG_PREFIX + currentId, '*'); + }; + } else if (!!root.MessageChannel) { + var channel = new root.MessageChannel(), + channelTasks = {}, + channelTaskId = 0; + + channel.port1.onmessage = function (event) { + var id = event.data, + action = channelTasks[id]; + action(); + delete channelTasks[id]; + }; + + scheduleMethod = function (action) { + var id = channelTaskId++; + channelTasks[id] = action; + channel.port2.postMessage(id); + }; + } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) { + + scheduleMethod = function (action) { + var scriptElement = root.document.createElement('script'); + scriptElement.onreadystatechange = function () { + action(); + scriptElement.onreadystatechange = null; + scriptElement.parentNode.removeChild(scriptElement); + scriptElement = null; + }; + root.document.documentElement.appendChild(scriptElement); + }; + + } else { + scheduleMethod = function (action) { return setTimeout(action, 0); }; + clearMethod = clearTimeout; + } + }()); + + /** + * Gets a scheduler that schedules work via a timed callback based upon platform. + */ + var timeoutScheduler = Scheduler.timeout = (function () { + + function scheduleNow(state, action) { + var scheduler = this, + disposable = new SingleAssignmentDisposable(); + var id = scheduleMethod(function () { + if (!disposable.isDisposed) { + disposable.setDisposable(action(scheduler, state)); + } + }); + return new CompositeDisposable(disposable, disposableCreate(function () { + clearMethod(id); + })); + } + + function scheduleRelative(state, dueTime, action) { + var scheduler = this, + dt = Scheduler.normalize(dueTime); + if (dt === 0) { + return scheduler.scheduleWithState(state, action); + } + var disposable = new SingleAssignmentDisposable(); + var id = setTimeout(function () { + if (!disposable.isDisposed) { + disposable.setDisposable(action(scheduler, state)); + } + }, dt); + return new CompositeDisposable(disposable, disposableCreate(function () { + clearTimeout(id); + })); + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); + } + + return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); + })(); + + /** @private */ + var CatchScheduler = (function (_super) { + + function localNow() { + return this._scheduler.now(); + } + + function scheduleNow(state, action) { + return this._scheduler.scheduleWithState(state, this._wrap(action)); + } + + function scheduleRelative(state, dueTime, action) { + return this._scheduler.scheduleWithRelativeAndState(state, dueTime, this._wrap(action)); + } + + function scheduleAbsolute(state, dueTime, action) { + return this._scheduler.scheduleWithAbsoluteAndState(state, dueTime, this._wrap(action)); + } + + inherits(CatchScheduler, _super); + + /** @private */ + function CatchScheduler(scheduler, handler) { + this._scheduler = scheduler; + this._handler = handler; + this._recursiveOriginal = null; + this._recursiveWrapper = null; + _super.call(this, localNow, scheduleNow, scheduleRelative, scheduleAbsolute); + } + + /** @private */ + CatchScheduler.prototype._clone = function (scheduler) { + return new CatchScheduler(scheduler, this._handler); + }; + + /** @private */ + CatchScheduler.prototype._wrap = function (action) { + var parent = this; + return function (self, state) { + try { + return action(parent._getRecursiveWrapper(self), state); + } catch (e) { + if (!parent._handler(e)) { throw e; } + return disposableEmpty; + } + }; + }; + + /** @private */ + CatchScheduler.prototype._getRecursiveWrapper = function (scheduler) { + if (this._recursiveOriginal !== scheduler) { + this._recursiveOriginal = scheduler; + var wrapper = this._clone(scheduler); + wrapper._recursiveOriginal = scheduler; + wrapper._recursiveWrapper = wrapper; + this._recursiveWrapper = wrapper; + } + return this._recursiveWrapper; + }; + + /** @private */ + CatchScheduler.prototype.schedulePeriodicWithState = function (state, period, action) { + var self = this, failed = false, d = new SingleAssignmentDisposable(); + + d.setDisposable(this._scheduler.schedulePeriodicWithState(state, period, function (state1) { + if (failed) { return null; } + try { + return action(state1); + } catch (e) { + failed = true; + if (!self._handler(e)) { throw e; } + d.dispose(); + return null; + } + })); + + return d; + }; + + return CatchScheduler; + }(Scheduler)); + + /** + * Represents a notification to an observer. + */ + var Notification = Rx.Notification = (function () { + function Notification(kind, hasValue) { + this.hasValue = hasValue == null ? false : hasValue; + this.kind = kind; + } + + var NotificationPrototype = Notification.prototype; + + /** + * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result. + * + * @memberOf Notification + * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on.. + * @param {Function} onError Delegate to invoke for an OnError notification. + * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification. + * @returns {Any} Result produced by the observation. + */ + NotificationPrototype.accept = function (observerOrOnNext, onError, onCompleted) { + if (arguments.length === 1 && typeof observerOrOnNext === 'object') { + return this._acceptObservable(observerOrOnNext); + } + return this._accept(observerOrOnNext, onError, onCompleted); + }; + + /** + * Returns an observable sequence with a single notification. + * + * @memberOf Notification + * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on. + * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription. + */ + NotificationPrototype.toObservable = function (scheduler) { + var notification = this; + scheduler || (scheduler = immediateScheduler); + return new AnonymousObservable(function (observer) { + return scheduler.schedule(function () { + notification._acceptObservable(observer); + if (notification.kind === 'N') { + observer.onCompleted(); + } + }); + }); + }; + + return Notification; + })(); + + /** + * Creates an object that represents an OnNext notification to an observer. + * @param {Any} value The value contained in the notification. + * @returns {Notification} The OnNext notification containing the value. + */ + var notificationCreateOnNext = Notification.createOnNext = (function () { + + function _accept (onNext) { + return onNext(this.value); + } + + function _acceptObservable(observer) { + return observer.onNext(this.value); + } + + function toString () { + return 'OnNext(' + this.value + ')'; + } + + return function (value) { + var notification = new Notification('N', true); + notification.value = value; + notification._accept = _accept; + notification._acceptObservable = _acceptObservable; + notification.toString = toString; + return notification; + }; + }()); + + /** + * Creates an object that represents an OnError notification to an observer. + * @param {Any} error The exception contained in the notification. + * @returns {Notification} The OnError notification containing the exception. + */ + var notificationCreateOnError = Notification.createOnError = (function () { + + function _accept (onNext, onError) { + return onError(this.exception); + } + + function _acceptObservable(observer) { + return observer.onError(this.exception); + } + + function toString () { + return 'OnError(' + this.exception + ')'; + } + + return function (exception) { + var notification = new Notification('E'); + notification.exception = exception; + notification._accept = _accept; + notification._acceptObservable = _acceptObservable; + notification.toString = toString; + return notification; + }; + }()); + + /** + * Creates an object that represents an OnCompleted notification to an observer. + * @returns {Notification} The OnCompleted notification. + */ + var notificationCreateOnCompleted = Notification.createOnCompleted = (function () { + + function _accept (onNext, onError, onCompleted) { + return onCompleted(); + } + + function _acceptObservable(observer) { + return observer.onCompleted(); + } + + function toString () { + return 'OnCompleted()'; + } + + return function () { + var notification = new Notification('C'); + notification._accept = _accept; + notification._acceptObservable = _acceptObservable; + notification.toString = toString; + return notification; + }; + }()); + + var Enumerator = Rx.internals.Enumerator = function (next) { + this._next = next; + }; + + Enumerator.prototype.next = function () { + return this._next(); + }; + + Enumerator.prototype[$iterator$] = function () { return this; } + + var Enumerable = Rx.internals.Enumerable = function (iterator) { + this._iterator = iterator; + }; + + Enumerable.prototype[$iterator$] = function () { + return this._iterator(); + }; + + Enumerable.prototype.concat = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var e; + try { + e = sources[$iterator$](); + } catch(err) { + observer.onError(); + return; + } + + var isDisposed, + subscription = new SerialDisposable(); + var cancelable = immediateScheduler.scheduleRecursive(function (self) { + var currentItem; + if (isDisposed) { return; } + + try { + currentItem = e.next(); + } catch (ex) { + observer.onError(ex); + return; + } + + if (currentItem.done) { + observer.onCompleted(); + return; + } + + // Check if promise + var currentValue = currentItem.value; + isPromise(currentValue) && (currentValue = observableFromPromise(currentValue)); + + var d = new SingleAssignmentDisposable(); + subscription.setDisposable(d); + d.setDisposable(currentValue.subscribe( + observer.onNext.bind(observer), + observer.onError.bind(observer), + function () { self(); }) + ); + }); + + return new CompositeDisposable(subscription, cancelable, disposableCreate(function () { + isDisposed = true; + })); + }); + }; + + Enumerable.prototype.catchException = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var e; + try { + e = sources[$iterator$](); + } catch(err) { + observer.onError(); + return; + } + + var isDisposed, + lastException, + subscription = new SerialDisposable(); + var cancelable = immediateScheduler.scheduleRecursive(function (self) { + if (isDisposed) { return; } + + var currentItem; + try { + currentItem = e.next(); + } catch (ex) { + observer.onError(ex); + return; + } + + if (currentItem.done) { + if (lastException) { + observer.onError(lastException); + } else { + observer.onCompleted(); + } + return; + } + + // Check if promise + var currentValue = currentItem.value; + isPromise(currentValue) && (currentValue = observableFromPromise(currentValue)); + + var d = new SingleAssignmentDisposable(); + subscription.setDisposable(d); + d.setDisposable(currentValue.subscribe( + observer.onNext.bind(observer), + function (exn) { + lastException = exn; + self(); + }, + observer.onCompleted.bind(observer))); + }); + return new CompositeDisposable(subscription, cancelable, disposableCreate(function () { + isDisposed = true; + })); + }); + }; + + var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) { + if (repeatCount == null) { repeatCount = -1; } + return new Enumerable(function () { + var left = repeatCount; + return new Enumerator(function () { + if (left === 0) { return doneEnumerator; } + if (left > 0) { left--; } + return { done: false, value: value }; + }); + }); + }; + + var enumerableFor = Enumerable.forEach = function (source, selector, thisArg) { + selector || (selector = identity); + return new Enumerable(function () { + var index = -1; + return new Enumerator( + function () { + return ++index < source.length ? + { done: false, value: selector.call(thisArg, source[index], index, source) } : + doneEnumerator; + }); + }); + }; + + /** + * Supports push-style iteration over an observable sequence. + */ + var Observer = Rx.Observer = function () { }; + + /** + * Creates a notification callback from an observer. + * + * @param observer Observer object. + * @returns The action that forwards its input notification to the underlying observer. + */ + Observer.prototype.toNotifier = function () { + var observer = this; + return function (n) { + return n.accept(observer); + }; + }; + + /** + * Hides the identity of an observer. + + * @returns An observer that hides the identity of the specified observer. + */ + Observer.prototype.asObserver = function () { + return new AnonymousObserver(this.onNext.bind(this), this.onError.bind(this), this.onCompleted.bind(this)); + }; + + /** + * Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods. + * If a violation is detected, an Error is thrown from the offending observer method call. + * + * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer. + */ + Observer.prototype.checked = function () { return new CheckedObserver(this); }; + + /** + * Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions. + * + * @static + * @memberOf Observer + * @param {Function} [onNext] Observer's OnNext action implementation. + * @param {Function} [onError] Observer's OnError action implementation. + * @param {Function} [onCompleted] Observer's OnCompleted action implementation. + * @returns {Observer} The observer object implemented using the given actions. + */ + var observerCreate = Observer.create = function (onNext, onError, onCompleted) { + onNext || (onNext = noop); + onError || (onError = defaultError); + onCompleted || (onCompleted = noop); + return new AnonymousObserver(onNext, onError, onCompleted); + }; + + /** + * Creates an observer from a notification callback. + * + * @static + * @memberOf Observer + * @param {Function} handler Action that handles a notification. + * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives. + */ + Observer.fromNotifier = function (handler) { + return new AnonymousObserver(function (x) { + return handler(notificationCreateOnNext(x)); + }, function (exception) { + return handler(notificationCreateOnError(exception)); + }, function () { + return handler(notificationCreateOnCompleted()); + }); + }; + + /** + * Schedules the invocation of observer methods on the given scheduler. + * @param {Scheduler} scheduler Scheduler to schedule observer messages on. + * @returns {Observer} Observer whose messages are scheduled on the given scheduler. + */ + Observer.notifyOn = function (scheduler) { + return new ObserveOnObserver(scheduler, this); + }; + + /** + * Abstract base class for implementations of the Observer class. + * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages. + */ + var AbstractObserver = Rx.internals.AbstractObserver = (function (_super) { + inherits(AbstractObserver, _super); + + /** + * Creates a new observer in a non-stopped state. + * + * @constructor + */ + function AbstractObserver() { + this.isStopped = false; + _super.call(this); + } + + /** + * Notifies the observer of a new element in the sequence. + * + * @memberOf AbstractObserver + * @param {Any} value Next element in the sequence. + */ + AbstractObserver.prototype.onNext = function (value) { + if (!this.isStopped) { + this.next(value); + } + }; + + /** + * Notifies the observer that an exception has occurred. + * + * @memberOf AbstractObserver + * @param {Any} error The error that has occurred. + */ + AbstractObserver.prototype.onError = function (error) { + if (!this.isStopped) { + this.isStopped = true; + this.error(error); + } + }; + + /** + * Notifies the observer of the end of the sequence. + */ + AbstractObserver.prototype.onCompleted = function () { + if (!this.isStopped) { + this.isStopped = true; + this.completed(); + } + }; + + /** + * Disposes the observer, causing it to transition to the stopped state. + */ + AbstractObserver.prototype.dispose = function () { + this.isStopped = true; + }; + + AbstractObserver.prototype.fail = function (e) { + if (!this.isStopped) { + this.isStopped = true; + this.error(e); + return true; + } + + return false; + }; + + return AbstractObserver; + }(Observer)); + + /** + * Class to create an Observer instance from delegate-based implementations of the on* methods. + */ + var AnonymousObserver = Rx.AnonymousObserver = (function (_super) { + inherits(AnonymousObserver, _super); + + /** + * Creates an observer from the specified OnNext, OnError, and OnCompleted actions. + * @param {Any} onNext Observer's OnNext action implementation. + * @param {Any} onError Observer's OnError action implementation. + * @param {Any} onCompleted Observer's OnCompleted action implementation. + */ + function AnonymousObserver(onNext, onError, onCompleted) { + _super.call(this); + this._onNext = onNext; + this._onError = onError; + this._onCompleted = onCompleted; + } + + /** + * Calls the onNext action. + * @param {Any} value Next element in the sequence. + */ + AnonymousObserver.prototype.next = function (value) { + this._onNext(value); + }; + + /** + * Calls the onError action. + * @param {Any} error The error that has occurred. + */ + AnonymousObserver.prototype.error = function (exception) { + this._onError(exception); + }; + + /** + * Calls the onCompleted action. + */ + AnonymousObserver.prototype.completed = function () { + this._onCompleted(); + }; + + return AnonymousObserver; + }(AbstractObserver)); + + var CheckedObserver = (function (_super) { + inherits(CheckedObserver, _super); + + function CheckedObserver(observer) { + _super.call(this); + this._observer = observer; + this._state = 0; // 0 - idle, 1 - busy, 2 - done + } + + var CheckedObserverPrototype = CheckedObserver.prototype; + + CheckedObserverPrototype.onNext = function (value) { + this.checkAccess(); + try { + this._observer.onNext(value); + } catch (e) { + throw e; + } finally { + this._state = 0; + } + }; + + CheckedObserverPrototype.onError = function (err) { + this.checkAccess(); + try { + this._observer.onError(err); + } catch (e) { + throw e; + } finally { + this._state = 2; + } + }; + + CheckedObserverPrototype.onCompleted = function () { + this.checkAccess(); + try { + this._observer.onCompleted(); + } catch (e) { + throw e; + } finally { + this._state = 2; + } + }; + + CheckedObserverPrototype.checkAccess = function () { + if (this._state === 1) { throw new Error('Re-entrancy detected'); } + if (this._state === 2) { throw new Error('Observer completed'); } + if (this._state === 0) { this._state = 1; } + }; + + return CheckedObserver; + }(Observer)); + + var ScheduledObserver = Rx.internals.ScheduledObserver = (function (_super) { + inherits(ScheduledObserver, _super); + + function ScheduledObserver(scheduler, observer) { + _super.call(this); + this.scheduler = scheduler; + this.observer = observer; + this.isAcquired = false; + this.hasFaulted = false; + this.queue = []; + this.disposable = new SerialDisposable(); + } + + ScheduledObserver.prototype.next = function (value) { + var self = this; + this.queue.push(function () { + self.observer.onNext(value); + }); + }; + + ScheduledObserver.prototype.error = function (exception) { + var self = this; + this.queue.push(function () { + self.observer.onError(exception); + }); + }; + + ScheduledObserver.prototype.completed = function () { + var self = this; + this.queue.push(function () { + self.observer.onCompleted(); + }); + }; + + ScheduledObserver.prototype.ensureActive = function () { + var isOwner = false, parent = this; + if (!this.hasFaulted && this.queue.length > 0) { + isOwner = !this.isAcquired; + this.isAcquired = true; + } + if (isOwner) { + this.disposable.setDisposable(this.scheduler.scheduleRecursive(function (self) { + var work; + if (parent.queue.length > 0) { + work = parent.queue.shift(); + } else { + parent.isAcquired = false; + return; + } + try { + work(); + } catch (ex) { + parent.queue = []; + parent.hasFaulted = true; + throw ex; + } + self(); + })); + } + }; + + ScheduledObserver.prototype.dispose = function () { + _super.prototype.dispose.call(this); + this.disposable.dispose(); + }; + + return ScheduledObserver; + }(AbstractObserver)); + + /** @private */ + var ObserveOnObserver = (function (_super) { + inherits(ObserveOnObserver, _super); + + /** @private */ + function ObserveOnObserver() { + _super.apply(this, arguments); + } + + /** @private */ + ObserveOnObserver.prototype.next = function (value) { + _super.prototype.next.call(this, value); + this.ensureActive(); + }; + + /** @private */ + ObserveOnObserver.prototype.error = function (e) { + _super.prototype.error.call(this, e); + this.ensureActive(); + }; + + /** @private */ + ObserveOnObserver.prototype.completed = function () { + _super.prototype.completed.call(this); + this.ensureActive(); + }; + + return ObserveOnObserver; + })(ScheduledObserver); + + var observableProto; + + /** + * Represents a push-style collection. + */ + var Observable = Rx.Observable = (function () { + + function Observable(subscribe) { + this._subscribe = subscribe; + } + + observableProto = Observable.prototype; + + /** + * Subscribes an observer to the observable sequence. + * + * @example + * 1 - source.subscribe(); + * 2 - source.subscribe(observer); + * 3 - source.subscribe(function (x) { console.log(x); }); + * 4 - source.subscribe(function (x) { console.log(x); }, function (err) { console.log(err); }); + * 5 - source.subscribe(function (x) { console.log(x); }, function (err) { console.log(err); }, function () { console.log('done'); }); + * @param {Mixed} [observerOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence. + * @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence. + * @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence. + * @returns {Diposable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler. + */ + observableProto.subscribe = observableProto.forEach = function (observerOrOnNext, onError, onCompleted) { + var subscriber = typeof observerOrOnNext === 'object' ? + observerOrOnNext : + observerCreate(observerOrOnNext, onError, onCompleted); + + return this._subscribe(subscriber); + }; + + return Observable; + })(); + + var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) { + inherits(AnonymousObservable, __super__); + + // Fix subscriber to check for undefined or function returned to decorate as Disposable + function fixSubscriber(subscriber) { + if (typeof subscriber === 'undefined') { + subscriber = disposableEmpty; + } else if (typeof subscriber === 'function') { + subscriber = disposableCreate(subscriber); + } + + return subscriber; + } + + function AnonymousObservable(subscribe) { + if (!(this instanceof AnonymousObservable)) { + return new AnonymousObservable(subscribe); + } + + function s(observer) { + var setDisposable = function () { + try { + autoDetachObserver.setDisposable(fixSubscriber(subscribe(autoDetachObserver))); + } catch (e) { + if (!autoDetachObserver.fail(e)) { + throw e; + } + } + }; + + var autoDetachObserver = new AutoDetachObserver(observer); + if (currentThreadScheduler.scheduleRequired()) { + currentThreadScheduler.schedule(setDisposable); + } else { + setDisposable(); + } + + return autoDetachObserver; + } + + __super__.call(this, s); + } + + return AnonymousObservable; + + }(Observable)); + + /** @private */ + var AutoDetachObserver = (function (_super) { + inherits(AutoDetachObserver, _super); + + function AutoDetachObserver(observer) { + _super.call(this); + this.observer = observer; + this.m = new SingleAssignmentDisposable(); + } + + var AutoDetachObserverPrototype = AutoDetachObserver.prototype; + + AutoDetachObserverPrototype.next = function (value) { + var noError = false; + try { + this.observer.onNext(value); + noError = true; + } catch (e) { + throw e; + } finally { + if (!noError) { + this.dispose(); + } + } + }; + + AutoDetachObserverPrototype.error = function (exn) { + try { + this.observer.onError(exn); + } catch (e) { + throw e; + } finally { + this.dispose(); + } + }; + + AutoDetachObserverPrototype.completed = function () { + try { + this.observer.onCompleted(); + } catch (e) { + throw e; + } finally { + this.dispose(); + } + }; + + AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); }; + AutoDetachObserverPrototype.getDisposable = function (value) { return this.m.getDisposable(); }; + /* @private */ + AutoDetachObserverPrototype.disposable = function (value) { + return arguments.length ? this.getDisposable() : setDisposable(value); + }; + + AutoDetachObserverPrototype.dispose = function () { + _super.prototype.dispose.call(this); + this.m.dispose(); + }; + + return AutoDetachObserver; + }(AbstractObserver)); + + /** @private */ + var GroupedObservable = (function (_super) { + inherits(GroupedObservable, _super); + + function subscribe(observer) { + return this.underlyingObservable.subscribe(observer); + } + + /** + * @constructor + * @private + */ + function GroupedObservable(key, underlyingObservable, mergedDisposable) { + _super.call(this, subscribe); + this.key = key; + this.underlyingObservable = !mergedDisposable ? + underlyingObservable : + new AnonymousObservable(function (observer) { + return new CompositeDisposable(mergedDisposable.getDisposable(), underlyingObservable.subscribe(observer)); + }); + } + + return GroupedObservable; + }(Observable)); + + /** @private */ + var InnerSubscription = function (subject, observer) { + this.subject = subject; + this.observer = observer; + }; + + /** + * @private + * @memberOf InnerSubscription + */ + InnerSubscription.prototype.dispose = function () { + if (!this.subject.isDisposed && this.observer !== null) { + var idx = this.subject.observers.indexOf(this.observer); + this.subject.observers.splice(idx, 1); + this.observer = null; + } + }; + + /** + * Represents an object that is both an observable sequence as well as an observer. + * Each notification is broadcasted to all subscribed observers. + */ + var Subject = Rx.Subject = (function (_super) { + function subscribe(observer) { + checkDisposed.call(this); + if (!this.isStopped) { + this.observers.push(observer); + return new InnerSubscription(this, observer); + } + if (this.exception) { + observer.onError(this.exception); + return disposableEmpty; + } + observer.onCompleted(); + return disposableEmpty; + } + + inherits(Subject, _super); + + /** + * Creates a subject. + * @constructor + */ + function Subject() { + _super.call(this, subscribe); + this.isDisposed = false, + this.isStopped = false, + this.observers = []; + } + + addProperties(Subject.prototype, Observer, { + /** + * Indicates whether the subject has observers subscribed to it. + * @returns {Boolean} Indicates whether the subject has observers subscribed to it. + */ + hasObservers: function () { + return this.observers.length > 0; + }, + /** + * Notifies all subscribed observers about the end of the sequence. + */ + onCompleted: function () { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + for (var i = 0, len = os.length; i < len; i++) { + os[i].onCompleted(); + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the exception. + * @param {Mixed} error The exception to send to all observers. + */ + onError: function (exception) { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + this.exception = exception; + for (var i = 0, len = os.length; i < len; i++) { + os[i].onError(exception); + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the arrival of the specified element in the sequence. + * @param {Mixed} value The value to send to all observers. + */ + onNext: function (value) { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + for (var i = 0, len = os.length; i < len; i++) { + os[i].onNext(value); + } + } + }, + /** + * Unsubscribe all observers and release resources. + */ + dispose: function () { + this.isDisposed = true; + this.observers = null; + } + }); + + /** + * Creates a subject from the specified observer and observable. + * @param {Observer} observer The observer used to send messages to the subject. + * @param {Observable} observable The observable used to subscribe to messages sent from the subject. + * @returns {Subject} Subject implemented using the given observer and observable. + */ + Subject.create = function (observer, observable) { + return new AnonymousSubject(observer, observable); + }; + + return Subject; + }(Observable)); + + /** + * Represents the result of an asynchronous operation. + * The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers. + */ + var AsyncSubject = Rx.AsyncSubject = (function (_super) { + + function subscribe(observer) { + checkDisposed.call(this); + + if (!this.isStopped) { + this.observers.push(observer); + return new InnerSubscription(this, observer); + } + + var ex = this.exception, + hv = this.hasValue, + v = this.value; + + if (ex) { + observer.onError(ex); + } else if (hv) { + observer.onNext(v); + observer.onCompleted(); + } else { + observer.onCompleted(); + } + + return disposableEmpty; + } + + inherits(AsyncSubject, _super); + + /** + * Creates a subject that can only receive one value and that value is cached for all future observations. + * @constructor + */ + function AsyncSubject() { + _super.call(this, subscribe); + + this.isDisposed = false; + this.isStopped = false; + this.value = null; + this.hasValue = false; + this.observers = []; + this.exception = null; + } + + addProperties(AsyncSubject.prototype, Observer, { + /** + * Indicates whether the subject has observers subscribed to it. + * @returns {Boolean} Indicates whether the subject has observers subscribed to it. + */ + hasObservers: function () { + checkDisposed.call(this); + return this.observers.length > 0; + }, + /** + * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any). + */ + onCompleted: function () { + var o, i, len; + checkDisposed.call(this); + if (!this.isStopped) { + this.isStopped = true; + var os = this.observers.slice(0), + v = this.value, + hv = this.hasValue; + + if (hv) { + for (i = 0, len = os.length; i < len; i++) { + o = os[i]; + o.onNext(v); + o.onCompleted(); + } + } else { + for (i = 0, len = os.length; i < len; i++) { + os[i].onCompleted(); + } + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the exception. + * @param {Mixed} error The exception to send to all observers. + */ + onError: function (exception) { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + this.exception = exception; + + for (var i = 0, len = os.length; i < len; i++) { + os[i].onError(exception); + } + + this.observers = []; + } + }, + /** + * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers. + * @param {Mixed} value The value to store in the subject. + */ + onNext: function (value) { + checkDisposed.call(this); + if (!this.isStopped) { + this.value = value; + this.hasValue = true; + } + }, + /** + * Unsubscribe all observers and release resources. + */ + dispose: function () { + this.isDisposed = true; + this.observers = null; + this.exception = null; + this.value = null; + } + }); + + return AsyncSubject; + }(Observable)); + + /** @private */ + var AnonymousSubject = (function (_super) { + inherits(AnonymousSubject, _super); + + function subscribe(observer) { + return this.observable.subscribe(observer); + } + + /** + * @private + * @constructor + */ + function AnonymousSubject(observer, observable) { + _super.call(this, subscribe); + this.observer = observer; + this.observable = observable; + } + + addProperties(AnonymousSubject.prototype, Observer, { + /** + * @private + * @memberOf AnonymousSubject# + */ + onCompleted: function () { + this.observer.onCompleted(); + }, + /** + * @private + * @memberOf AnonymousSubject# + */ + onError: function (exception) { + this.observer.onError(exception); + }, + /** + * @private + * @memberOf AnonymousSubject# + */ + onNext: function (value) { + this.observer.onNext(value); + } + }); + + return AnonymousSubject; + }(Observable)); + + if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) { + root.Rx = Rx; + + define(function() { + return Rx; + }); + } else if (freeExports && freeModule) { + // in Node.js or RingoJS + if (moduleExports) { + (freeModule.exports = Rx).Rx = Rx; + } else { + freeExports.Rx = Rx; + } + } else { + // in a browser or Rhino + root.Rx = Rx; + } +}.call(this)); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.core.min.js b/ajax/libs/rxjs/2.2.28/rx.core.min.js new file mode 100644 index 000000000..114f0b28f --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.core.min.js @@ -0,0 +1 @@ +(function(t){function e(){if(this.isDisposed)throw Error(A)}function n(t){var e=typeof t;return t&&("function"==e||"object"==e)||!1}function i(t){var e=[];if(!n(t))return e;G.nonEnumArgs&&t.length&&u(t)&&(t=U.call(t));var i=G.enumPrototypes&&"function"==typeof t,r=G.enumErrorProps&&(t===H||t instanceof Error);for(var s in t)i&&"prototype"==s||r&&("message"==s||"name"==s)||e.push(s);if(G.nonEnumShadows&&t!==L){var o=t.constructor,c=-1,h=K.length;if(t===(o&&o.prototype))var a=t===stringProto?M:t===H?N:F.call(t),l=Q[a];for(;h>++c;)s=K[c],l&&l[s]||!z.call(t,s)||e.push(s)}return e}function r(t,e,n){for(var i=-1,r=n(t),s=r.length;s>++i;){var o=r[i];if(e(t[o],o,t)===!1)break}return t}function s(t,e){return r(t,e,i)}function o(t){return"function"!=typeof t.toString&&"string"==typeof(t+"")}function u(t){return t&&"object"==typeof t?F.call(t)==C:!1}function c(t){return"function"==typeof t||!1}function h(e,n,i,r){if(e===n)return 0!==e||1/e==1/n;var a=typeof e,l=typeof n;if(e===e&&(null==e||null==n||"function"!=a&&"object"!=a&&"function"!=l&&"object"!=l))return!1;var p=F.call(e),f=F.call(n);if(p==C&&(p=T),f==C&&(f=T),p!=f)return!1;switch(p){case W:case P:return+e==+n;case k:return e!=+e?n!=+n:0==e?1/e==1/n:e==+n;case I:case M:return e==n+""}var d=p==j;if(!d){if(p!=T||!G.nodeClass&&(o(e)||o(n)))return!1;var v=!G.argsObject&&u(e)?Object:e.constructor,b=!G.argsObject&&u(n)?Object:n.constructor;if(!(v==b||z.call(e,"constructor")&&z.call(n,"constructor")||c(v)&&v instanceof v&&c(b)&&b instanceof b||!("constructor"in e&&"constructor"in n)))return!1}i||(i=[]),r||(r=[]);for(var y=i.length;y--;)if(i[y]==e)return r[y]==n;var m=0;if(result=!0,i.push(e),r.push(n),d){if(y=e.length,m=n.length,result=m==y)for(;m--;){var g=n[m];if(!(result=h(e[m],g,i,r)))break}}else s(n,function(n,s,o){return z.call(o,s)?(m++,result=z.call(e,s)&&h(e[s],n,i,r)):t}),result&&s(e,function(e,n,i){return z.call(i,n)?result=--m>-1:t});return i.pop(),r.pop(),result}function a(t,e){return 1===t.length&&Array.isArray(t[e])?t[e]:U.call(t)}function l(t,e){this.scheduler=t,this.disposable=e,this.isDisposed=!1}var p={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},f=p[typeof window]&&window||this,d=p[typeof exports]&&exports&&!exports.nodeType&&exports,v=p[typeof module]&&module&&!module.nodeType&&module,b=v&&v.exports===d&&d,y=p[typeof global]&&global;!y||y.global!==y&&y.window!==y||(f=y);var m={internals:{},config:{Promise:f.Promise},helpers:{}},g=m.helpers.noop=function(){},w=m.helpers.identity=function(t){return t},_=(m.helpers.pluck=function(t){return function(e){return e[t]}},m.helpers.just=function(t){return function(){return t}},m.helpers.defaultNow=Date.now),S=(m.helpers.defaultComparer=function(t,e){return J(t,e)},m.helpers.defaultSubComparer=function(t,e){return t>e?1:e>t?-1:0}),D=(m.helpers.defaultKeySerializer=function(t){return""+t},m.helpers.defaultError=function(t){throw t}),x=m.helpers.isPromise=function(t){return!!t&&"function"==typeof t.then&&t.then!==m.Observable.prototype.then};m.helpers.asArray=function(){return Array.prototype.slice.call(arguments)},m.helpers.not=function(t){return!t};var A="Object has been disposed",E="object"==typeof Symbol&&Symbol.iterator||"_es6shim_iterator_";f.Set&&"function"==typeof(new f.Set)["@@iterator"]&&(E="@@iterator");var O,R={done:!0,value:t},C="[object Arguments]",j="[object Array]",W="[object Boolean]",P="[object Date]",N="[object Error]",q="[object Function]",k="[object Number]",T="[object Object]",I="[object RegExp]",M="[object String]",F=Object.prototype.toString,z=Object.prototype.hasOwnProperty,V=F.call(arguments)==C,H=Error.prototype,L=Object.prototype,$=L.propertyIsEnumerable;try{O=!(F.call(document)==T&&!({toString:0}+""))}catch(B){O=!0}var K=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],Q={};Q[j]=Q[P]=Q[k]={constructor:!0,toLocaleString:!0,toString:!0,valueOf:!0},Q[W]=Q[M]={constructor:!0,toString:!0,valueOf:!0},Q[N]=Q[q]=Q[I]={constructor:!0,toString:!0},Q[T]={constructor:!0};var G={};(function(){var t=function(){this.x=1},e=[];t.prototype={valueOf:1,y:1};for(var n in new t)e.push(n);for(n in arguments);G.enumErrorProps=$.call(H,"message")||$.call(H,"name"),G.enumPrototypes=$.call(t,"prototype"),G.nonEnumArgs=0!=n,G.nonEnumShadows=!/valueOf/.test(e)})(1),V||(u=function(t){return t&&"object"==typeof t?z.call(t,"callee"):!1}),c(/x/)&&(c=function(t){return"function"==typeof t&&F.call(t)==q});var J=m.internals.isEqual=function(t,e){return h(t,e,[],[])},U=Array.prototype.slice;({}).hasOwnProperty;var X=this.inherits=m.internals.inherits=function(t,e){function n(){this.constructor=t}n.prototype=e.prototype,t.prototype=new n},Y=m.internals.addProperties=function(t){for(var e=U.call(arguments,1),n=0,i=e.length;i>n;n++){var r=e[n];for(var s in r)t[s]=r[s]}};m.internals.addRef=function(t,e){return new Ne(function(n){return new ne(e.getDisposable(),t.subscribe(n))})};var Z=function(t,e){this.id=t,this.value=e};Z.prototype.compareTo=function(t){var e=this.value.compareTo(t.value);return 0===e&&(e=this.id-t.id),e};var te=m.internals.PriorityQueue=function(t){this.items=Array(t),this.length=0},ee=te.prototype;ee.isHigherPriority=function(t,e){return 0>this.items[t].compareTo(this.items[e])},ee.percolate=function(t){if(!(t>=this.length||0>t)){var e=t-1>>1;if(!(0>e||e===t)&&this.isHigherPriority(t,e)){var n=this.items[t];this.items[t]=this.items[e],this.items[e]=n,this.percolate(e)}}},ee.heapify=function(e){if(e===t&&(e=0),!(e>=this.length||0>e)){var n=2*e+1,i=2*e+2,r=e;if(this.length>n&&this.isHigherPriority(n,r)&&(r=n),this.length>i&&this.isHigherPriority(i,r)&&(r=i),r!==e){var s=this.items[e];this.items[e]=this.items[r],this.items[r]=s,this.heapify(r)}}},ee.peek=function(){return this.items[0].value},ee.removeAt=function(t){this.items[t]=this.items[--this.length],delete this.items[this.length],this.heapify()},ee.dequeue=function(){var t=this.peek();return this.removeAt(0),t},ee.enqueue=function(t){var e=this.length++;this.items[e]=new Z(te.count++,t),this.percolate(e)},ee.remove=function(t){for(var e=0;this.length>e;e++)if(this.items[e].value===t)return this.removeAt(e),!0;return!1},te.count=0;var ne=m.CompositeDisposable=function(){this.disposables=a(arguments,0),this.isDisposed=!1,this.length=this.disposables.length},ie=ne.prototype;ie.add=function(t){this.isDisposed?t.dispose():(this.disposables.push(t),this.length++)},ie.remove=function(t){var e=!1;if(!this.isDisposed){var n=this.disposables.indexOf(t);-1!==n&&(e=!0,this.disposables.splice(n,1),this.length--,t.dispose())}return e},ie.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;var t=this.disposables.slice(0);this.disposables=[],this.length=0;for(var e=0,n=t.length;n>e;e++)t[e].dispose()}},ie.clear=function(){var t=this.disposables.slice(0);this.disposables=[],this.length=0;for(var e=0,n=t.length;n>e;e++)t[e].dispose()},ie.contains=function(t){return-1!==this.disposables.indexOf(t)},ie.toArray=function(){return this.disposables.slice(0)};var re=m.Disposable=function(t){this.isDisposed=!1,this.action=t||g};re.prototype.dispose=function(){this.isDisposed||(this.action(),this.isDisposed=!0)};var se=re.create=function(t){return new re(t)},oe=re.empty={dispose:g},ue=function(){function t(t){this.isSingle=t,this.isDisposed=!1,this.current=null}var e=t.prototype;return e.getDisposable=function(){return this.current},e.setDisposable=function(t){if(this.current&&this.isSingle)throw Error("Disposable has already been assigned");var e,n=this.isDisposed;n||(e=this.current,this.current=t),e&&e.dispose(),n&&t&&t.dispose()},e.dispose=function(){var t;this.isDisposed||(this.isDisposed=!0,t=this.current,this.current=null),t&&t.dispose()},t}(),ce=m.SingleAssignmentDisposable=function(t){function e(){t.call(this,!0)}return X(e,t),e}(ue),he=m.SerialDisposable=function(t){function e(){t.call(this,!1)}return X(e,t),e}(ue);m.RefCountDisposable=function(){function t(t){this.disposable=t,this.disposable.count++,this.isInnerDisposed=!1}function e(t){this.underlyingDisposable=t,this.isDisposed=!1,this.isPrimaryDisposed=!1,this.count=0}return t.prototype.dispose=function(){this.disposable.isDisposed||this.isInnerDisposed||(this.isInnerDisposed=!0,this.disposable.count--,0===this.disposable.count&&this.disposable.isPrimaryDisposed&&(this.disposable.isDisposed=!0,this.disposable.underlyingDisposable.dispose()))},e.prototype.dispose=function(){this.isDisposed||this.isPrimaryDisposed||(this.isPrimaryDisposed=!0,0===this.count&&(this.isDisposed=!0,this.underlyingDisposable.dispose()))},e.prototype.getDisposable=function(){return this.isDisposed?oe:new t(this)},e}(),l.prototype.dispose=function(){var t=this;this.scheduler.schedule(function(){t.isDisposed||(t.isDisposed=!0,t.disposable.dispose())})};var ae=m.internals.ScheduledItem=function(t,e,n,i,r){this.scheduler=t,this.state=e,this.action=n,this.dueTime=i,this.comparer=r||S,this.disposable=new ce};ae.prototype.invoke=function(){this.disposable.setDisposable(this.invokeCore())},ae.prototype.compareTo=function(t){return this.comparer(this.dueTime,t.dueTime)},ae.prototype.isCancelled=function(){return this.disposable.isDisposed},ae.prototype.invokeCore=function(){return this.action(this.scheduler,this.state)};var le=m.Scheduler=function(){function t(t,e,n,i){this.now=t,this._schedule=e,this._scheduleRelative=n,this._scheduleAbsolute=i}function e(t,e){var n=e.first,i=e.second,r=new ne,s=function(e){i(e,function(e){var n=!1,i=!1,o=t.scheduleWithState(e,function(t,e){return n?r.remove(o):i=!0,s(e),oe});i||(r.add(o),n=!0)})};return s(n),r}function n(t,e,n){var i=e.first,r=e.second,s=new ne,o=function(e){r(e,function(e,i){var r=!1,u=!1,c=t[n].call(t,e,i,function(t,e){return r?s.remove(c):u=!0,o(e),oe});u||(s.add(c),r=!0)})};return o(i),s}function i(t,e){return e(),oe}var r=t.prototype;return r.catchException=r["catch"]=function(t){return new ye(this,t)},r.schedulePeriodic=function(t,e){return this.schedulePeriodicWithState(null,t,function(){e()})},r.schedulePeriodicWithState=function(t,e,n){var i=t,r=setInterval(function(){i=n(i)},e);return se(function(){clearInterval(r)})},r.schedule=function(t){return this._schedule(t,i)},r.scheduleWithState=function(t,e){return this._schedule(t,e)},r.scheduleWithRelative=function(t,e){return this._scheduleRelative(e,t,i)},r.scheduleWithRelativeAndState=function(t,e,n){return this._scheduleRelative(t,e,n)},r.scheduleWithAbsolute=function(t,e){return this._scheduleAbsolute(e,t,i)},r.scheduleWithAbsoluteAndState=function(t,e,n){return this._scheduleAbsolute(t,e,n)},r.scheduleRecursive=function(t){return this.scheduleRecursiveWithState(t,function(t,e){t(function(){e(t)})})},r.scheduleRecursiveWithState=function(t,n){return this.scheduleWithState({first:t,second:n},function(t,n){return e(t,n)})},r.scheduleRecursiveWithRelative=function(t,e){return this.scheduleRecursiveWithRelativeAndState(e,t,function(t,e){t(function(n){e(t,n)})})},r.scheduleRecursiveWithRelativeAndState=function(t,e,i){return this._scheduleRelative({first:t,second:i},e,function(t,e){return n(t,e,"scheduleWithRelativeAndState")})},r.scheduleRecursiveWithAbsolute=function(t,e){return this.scheduleRecursiveWithAbsoluteAndState(e,t,function(t,e){t(function(n){e(t,n)})})},r.scheduleRecursiveWithAbsoluteAndState=function(t,e,i){return this._scheduleAbsolute({first:t,second:i},e,function(t,e){return n(t,e,"scheduleWithAbsoluteAndState")})},t.now=_,t.normalize=function(t){return 0>t&&(t=0),t},t}(),pe=le.normalize;m.internals.SchedulePeriodicRecursive=function(){function t(t,e){e(0,this._period);try{this._state=this._action(this._state)}catch(n){throw this._cancel.dispose(),n}}function e(t,e,n,i){this._scheduler=t,this._state=e,this._period=n,this._action=i}return e.prototype.start=function(){var e=new ce;return this._cancel=e,e.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0,this._period,t.bind(this))),e},e}();var fe,de=le.immediate=function(){function t(t,e){return e(this,t)}function e(t,e,n){for(var i=pe(i);i-this.now()>0;);return n(this,t)}function n(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}return new le(_,t,e,n)}(),ve=le.currentThread=function(){function t(t){for(var e;t.length>0;)if(e=t.dequeue(),!e.isCancelled()){for(;e.dueTime-le.now()>0;);e.isCancelled()||e.invoke()}}function e(t,e){return this.scheduleWithRelativeAndState(t,0,e)}function n(e,n,i){var s=this.now()+le.normalize(n),o=new ae(this,e,i,s);if(r)r.enqueue(o);else{r=new te(4),r.enqueue(o);try{t(r)}catch(u){throw u}finally{r=null}}return o.disposable}function i(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}var r,s=new le(_,e,n,i);return s.scheduleRequired=function(){return null===r},s.ensureTrampoline=function(t){return null===r?this.schedule(t):t()},s}(),be=g;(function(){function t(){if(!f.postMessage||f.importScripts)return!1;var t=!1,e=f.onmessage;return f.onmessage=function(){t=!0},f.postMessage("","*"),f.onmessage=e,t}function e(t){if("string"==typeof t.data&&t.data.substring(0,s.length)===s){var e=t.data.substring(s.length),n=o[e];n(),delete o[e]}}var n=RegExp("^"+(F+"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),i="function"==typeof(i=y&&b&&y.setImmediate)&&!n.test(i)&&i,r="function"==typeof(r=y&&b&&y.clearImmediate)&&!n.test(r)&&r;if("undefined"!=typeof process&&"[object process]"==={}.toString.call(process))fe=process.nextTick;else if("function"==typeof i)fe=i,be=r;else if(t()){var s="ms.rx.schedule"+Math.random(),o={},u=0;f.addEventListener?f.addEventListener("message",e,!1):f.attachEvent("onmessage",e,!1),fe=function(t){var e=u++;o[e]=t,f.postMessage(s+e,"*")}}else if(f.MessageChannel){var c=new f.MessageChannel,h={},a=0;c.port1.onmessage=function(t){var e=t.data,n=h[e];n(),delete h[e]},fe=function(t){var e=a++;h[e]=t,c.port2.postMessage(e)}}else"document"in f&&"onreadystatechange"in f.document.createElement("script")?fe=function(t){var e=f.document.createElement("script");e.onreadystatechange=function(){t(),e.onreadystatechange=null,e.parentNode.removeChild(e),e=null},f.document.documentElement.appendChild(e)}:(fe=function(t){return setTimeout(t,0)},be=clearTimeout)})(),le.timeout=function(){function t(t,e){var n=this,i=new ce,r=fe(function(){i.isDisposed||i.setDisposable(e(n,t))});return new ne(i,se(function(){be(r)}))}function e(t,e,n){var i=this,r=le.normalize(e);if(0===r)return i.scheduleWithState(t,n);var s=new ce,o=setTimeout(function(){s.isDisposed||s.setDisposable(n(i,t))},r);return new ne(s,se(function(){clearTimeout(o)}))}function n(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}return new le(_,t,e,n)}();var ye=function(t){function e(){return this._scheduler.now()}function n(t,e){return this._scheduler.scheduleWithState(t,this._wrap(e))}function i(t,e,n){return this._scheduler.scheduleWithRelativeAndState(t,e,this._wrap(n))}function r(t,e,n){return this._scheduler.scheduleWithAbsoluteAndState(t,e,this._wrap(n))}function s(s,o){this._scheduler=s,this._handler=o,this._recursiveOriginal=null,this._recursiveWrapper=null,t.call(this,e,n,i,r)}return X(s,t),s.prototype._clone=function(t){return new s(t,this._handler)},s.prototype._wrap=function(t){var e=this;return function(n,i){try{return t(e._getRecursiveWrapper(n),i)}catch(r){if(!e._handler(r))throw r;return oe}}},s.prototype._getRecursiveWrapper=function(t){if(this._recursiveOriginal!==t){this._recursiveOriginal=t;var e=this._clone(t);e._recursiveOriginal=t,e._recursiveWrapper=e,this._recursiveWrapper=e}return this._recursiveWrapper},s.prototype.schedulePeriodicWithState=function(t,e,n){var i=this,r=!1,s=new ce;return s.setDisposable(this._scheduler.schedulePeriodicWithState(t,e,function(t){if(r)return null;try{return n(t)}catch(e){if(r=!0,!i._handler(e))throw e;return s.dispose(),null}})),s},s}(le),me=m.Notification=function(){function t(t,e){this.hasValue=null==e?!1:e,this.kind=t}var e=t.prototype;return e.accept=function(t,e,n){return 1===arguments.length&&"object"==typeof t?this._acceptObservable(t):this._accept(t,e,n)},e.toObservable=function(t){var e=this;return t||(t=de),new Ne(function(n){return t.schedule(function(){e._acceptObservable(n),"N"===e.kind&&n.onCompleted()})})},t}(),ge=me.createOnNext=function(){function t(t){return t(this.value)}function e(t){return t.onNext(this.value)}function n(){return"OnNext("+this.value+")"}return function(i){var r=new me("N",!0);return r.value=i,r._accept=t,r._acceptObservable=e,r.toString=n,r}}(),we=me.createOnError=function(){function t(t,e){return e(this.exception)}function e(t){return t.onError(this.exception)}function n(){return"OnError("+this.exception+")"}return function(i){var r=new me("E");return r.exception=i,r._accept=t,r._acceptObservable=e,r.toString=n,r}}(),_e=me.createOnCompleted=function(){function t(t,e,n){return n()}function e(t){return t.onCompleted()}function n(){return"OnCompleted()"}return function(){var i=new me("C");return i._accept=t,i._acceptObservable=e,i.toString=n,i}}(),Se=m.internals.Enumerator=function(t){this._next=t};Se.prototype.next=function(){return this._next()},Se.prototype[E]=function(){return this};var De=m.internals.Enumerable=function(t){this._iterator=t};De.prototype[E]=function(){return this._iterator()},De.prototype.concat=function(){var e=this;return new Ne(function(n){var i;try{i=e[E]()}catch(r){return n.onError(),t}var s,o=new he,u=de.scheduleRecursive(function(e){var r;if(!s){try{r=i.next()}catch(u){return n.onError(u),t}if(r.done)return n.onCompleted(),t;var c=r.value;x(c)&&(c=observableFromPromise(c));var h=new ce;o.setDisposable(h),h.setDisposable(c.subscribe(n.onNext.bind(n),n.onError.bind(n),function(){e()}))}});return new ne(o,u,se(function(){s=!0}))})},De.prototype.catchException=function(){var e=this;return new Ne(function(n){var i;try{i=e[E]()}catch(r){return n.onError(),t}var s,o,u=new he,c=de.scheduleRecursive(function(e){if(!s){var r;try{r=i.next()}catch(c){return n.onError(c),t}if(r.done)return o?n.onError(o):n.onCompleted(),t;var h=r.value;x(h)&&(h=observableFromPromise(h));var a=new ce;u.setDisposable(a),a.setDisposable(h.subscribe(n.onNext.bind(n),function(t){o=t,e()},n.onCompleted.bind(n)))}});return new ne(u,c,se(function(){s=!0}))})},De.repeat=function(t,e){return null==e&&(e=-1),new De(function(){var n=e;return new Se(function(){return 0===n?R:(n>0&&n--,{done:!1,value:t})})})},De.forEach=function(t,e,n){return e||(e=w),new De(function(){var i=-1;return new Se(function(){return++i0&&(e=!this.isAcquired,this.isAcquired=!0),e&&this.disposable.setDisposable(this.scheduler.scheduleRecursive(function(e){var i;if(!(n.queue.length>0))return n.isAcquired=!1,t;i=n.queue.shift();try{i()}catch(r){throw n.queue=[],n.hasFaulted=!0,r}e()}))},n.prototype.dispose=function(){e.prototype.dispose.call(this),this.disposable.dispose()},n}(Oe),We=function(t){function e(){t.apply(this,arguments)}return X(e,t),e.prototype.next=function(e){t.prototype.next.call(this,e),this.ensureActive()},e.prototype.error=function(e){t.prototype.error.call(this,e),this.ensureActive()},e.prototype.completed=function(){t.prototype.completed.call(this),this.ensureActive()},e}(je),Pe=m.Observable=function(){function t(t){this._subscribe=t}return Ee=t.prototype,Ee.subscribe=Ee.forEach=function(t,e,n){var i="object"==typeof t?t:Ae(t,e,n);return this._subscribe(i)},t}(),Ne=m.AnonymousObservable=function(e){function n(e){return e===t?e=oe:"function"==typeof e&&(e=se(e)),e}function i(r){function s(t){var e=function(){try{i.setDisposable(n(r(i)))}catch(t){if(!i.fail(t))throw t}},i=new qe(t);return ve.scheduleRequired()?ve.schedule(e):e(),i}return this instanceof i?(e.call(this,s),t):new i(r)}return X(i,e),i}(Pe),qe=function(t){function e(e){t.call(this),this.observer=e,this.m=new ce}X(e,t);var n=e.prototype;return n.next=function(t){var e=!1;try{this.observer.onNext(t),e=!0}catch(n){throw n}finally{e||this.dispose()}},n.error=function(t){try{this.observer.onError(t)}catch(e){throw e}finally{this.dispose()}},n.completed=function(){try{this.observer.onCompleted()}catch(t){throw t}finally{this.dispose()}},n.setDisposable=function(t){this.m.setDisposable(t)},n.getDisposable=function(){return this.m.getDisposable()},n.disposable=function(t){return arguments.length?this.getDisposable():setDisposable(t)},n.dispose=function(){t.prototype.dispose.call(this),this.m.dispose()},e}(Oe);(function(t){function e(t){return this.underlyingObservable.subscribe(t)}function n(n,i,r){t.call(this,e),this.key=n,this.underlyingObservable=r?new Ne(function(t){return new ne(r.getDisposable(),i.subscribe(t))}):i}return X(n,t),n})(Pe);var ke=function(t,e){this.subject=t,this.observer=e};ke.prototype.dispose=function(){if(!this.subject.isDisposed&&null!==this.observer){var t=this.subject.observers.indexOf(this.observer);this.subject.observers.splice(t,1),this.observer=null}},m.Subject=function(t){function n(t){return e.call(this),this.isStopped?this.exception?(t.onError(this.exception),oe):(t.onCompleted(),oe):(this.observers.push(t),new ke(this,t))}function i(){t.call(this,n),this.isDisposed=!1,this.isStopped=!1,this.observers=[]}return X(i,t),Y(i.prototype,xe,{hasObservers:function(){return this.observers.length>0},onCompleted:function(){if(e.call(this),!this.isStopped){var t=this.observers.slice(0);this.isStopped=!0;for(var n=0,i=t.length;i>n;n++)t[n].onCompleted();this.observers=[]}},onError:function(t){if(e.call(this),!this.isStopped){var n=this.observers.slice(0);this.isStopped=!0,this.exception=t;for(var i=0,r=n.length;r>i;i++)n[i].onError(t);this.observers=[]}},onNext:function(t){if(e.call(this),!this.isStopped)for(var n=this.observers.slice(0),i=0,r=n.length;r>i;i++)n[i].onNext(t)},dispose:function(){this.isDisposed=!0,this.observers=null}}),i.create=function(t,e){return new Te(t,e)},i}(Pe),m.AsyncSubject=function(t){function n(t){if(e.call(this),!this.isStopped)return this.observers.push(t),new ke(this,t);var n=this.exception,i=this.hasValue,r=this.value;return n?t.onError(n):i?(t.onNext(r),t.onCompleted()):t.onCompleted(),oe}function i(){t.call(this,n),this.isDisposed=!1,this.isStopped=!1,this.value=null,this.hasValue=!1,this.observers=[],this.exception=null}return X(i,t),Y(i.prototype,xe,{hasObservers:function(){return e.call(this),this.observers.length>0},onCompleted:function(){var t,n,i;if(e.call(this),!this.isStopped){this.isStopped=!0;var r=this.observers.slice(0),s=this.value,o=this.hasValue;if(o)for(n=0,i=r.length;i>n;n++)t=r[n],t.onNext(s),t.onCompleted();else for(n=0,i=r.length;i>n;n++)r[n].onCompleted();this.observers=[]}},onError:function(t){if(e.call(this),!this.isStopped){var n=this.observers.slice(0);this.isStopped=!0,this.exception=t;for(var i=0,r=n.length;r>i;i++)n[i].onError(t);this.observers=[]}},onNext:function(t){e.call(this),this.isStopped||(this.value=t,this.hasValue=!0)},dispose:function(){this.isDisposed=!0,this.observers=null,this.exception=null,this.value=null}}),i}(Pe);var Te=function(t){function e(t){return this.observable.subscribe(t)}function n(n,i){t.call(this,e),this.observer=n,this.observable=i}return X(n,t),Y(n.prototype,xe,{onCompleted:function(){this.observer.onCompleted()},onError:function(t){this.observer.onError(t)},onNext:function(t){this.observer.onNext(t)}}),n}(Pe);"function"==typeof define&&"object"==typeof define.amd&&define.amd?(f.Rx=m,define(function(){return m})):d&&v?b?(v.exports=m).Rx=m:d.Rx=m:f.Rx=m}).call(this); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.experimental.js b/ajax/libs/rxjs/2.2.28/rx.experimental.js new file mode 100644 index 000000000..364954881 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.experimental.js @@ -0,0 +1,471 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +;(function (factory) { + var objectTypes = { + 'boolean': false, + 'function': true, + 'object': true, + 'number': false, + 'string': false, + 'undefined': false + }; + + var root = (objectTypes[typeof window] && window) || this, + freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports, + freeModule = objectTypes[typeof module] && module && !module.nodeType && module, + moduleExports = freeModule && freeModule.exports === freeExports && freeExports, + freeGlobal = objectTypes[typeof global] && global; + + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) { + root = freeGlobal; + } + + // Because of build optimizers + if (typeof define === 'function' && define.amd) { + define(['rx', 'exports'], function (Rx, exports) { + root.Rx = factory(root, exports, Rx); + return root.Rx; + }); + } else if (typeof module === 'object' && module && module.exports === freeExports) { + module.exports = factory(root, module.exports, require('./rx')); + } else { + root.Rx = factory(root, {}, root.Rx); + } +}.call(this, function (root, exp, Rx, undefined) { + + // Aliases + var Observable = Rx.Observable, + observableProto = Observable.prototype, + AnonymousObservable = Rx.AnonymousObservable, + observableConcat = Observable.concat, + observableDefer = Observable.defer, + observableEmpty = Observable.empty, + disposableEmpty = Rx.Disposable.empty, + CompositeDisposable = Rx.CompositeDisposable, + SerialDisposable = Rx.SerialDisposable, + SingleAssignmentDisposable = Rx.SingleAssignmentDisposable, + Enumerator = Rx.internals.Enumerator, + Enumerable = Rx.internals.Enumerable, + enumerableFor = Enumerable.forEach, + immediateScheduler = Rx.Scheduler.immediate, + currentThreadScheduler = Rx.Scheduler.currentThread, + slice = Array.prototype.slice, + AsyncSubject = Rx.AsyncSubject, + Observer = Rx.Observer, + inherits = Rx.internals.inherits, + addProperties = Rx.internals.addProperties, + noop = Rx.helpers.noop, + isPromise = Rx.helpers.isPromise, + observableFromPromise = Observable.fromPromise; + + // Utilities + function argsOrArray(args, idx) { + return args.length === 1 && Array.isArray(args[idx]) ? + args[idx] : + slice.call(args); + } + + // Shim in iterator support + var $iterator$ = (typeof Symbol === 'object' && Symbol.iterator) || + '_es6shim_iterator_'; + // Firefox ships a partial implementation using the name @@iterator. + // https://bugzilla.mozilla.org/show_bug.cgi?id=907077#c14 + // So use that name if we detect it. + if (root.Set && typeof new root.Set()['@@iterator'] === 'function') { + $iterator$ = '@@iterator'; + } + var doneEnumerator = { done: true, value: undefined }; + + function enumerableWhile(condition, source) { + return new Enumerable(function () { + return new Enumerator(function () { + return condition() ? + { done: false, value: source } : + { done: true, value: undefined }; + }); + }); + } + + /** + * Returns an observable sequence that is the result of invoking the selector on the source sequence, without sharing subscriptions. + * This operator allows for a fluent style of writing queries that use the same sequence multiple times. + * + * @param {Function} selector Selector function which can use the source sequence as many times as needed, without sharing subscriptions to the source sequence. + * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function. + */ + observableProto.letBind = observableProto['let'] = function (func) { + return func(this); + }; + + /** + * Determines whether an observable collection contains values. There is an alias for this method called 'ifThen' for browsers 0) { + isOwner = !isAcquired; + isAcquired = true; + } + if (isOwner) { + m.setDisposable(scheduler.scheduleRecursive(function (self) { + var work; + if (q.length > 0) { + work = q.shift(); + } else { + isAcquired = false; + return; + } + var m1 = new SingleAssignmentDisposable(); + d.add(m1); + m1.setDisposable(work.subscribe(function (x) { + observer.onNext(x); + var result = null; + try { + result = selector(x); + } catch (e) { + observer.onError(e); + } + q.push(result); + activeCount++; + ensureActive(); + }, observer.onError.bind(observer), function () { + d.remove(m1); + activeCount--; + if (activeCount === 0) { + observer.onCompleted(); + } + })); + self(); + })); + } + }; + + q.push(source); + activeCount++; + ensureActive(); + return d; + }); + }; + + /** + * Runs all observable sequences in parallel and collect their last elements. + * + * @example + * 1 - res = Rx.Observable.forkJoin([obs1, obs2]); + * 1 - res = Rx.Observable.forkJoin(obs1, obs2, ...); + * @returns {Observable} An observable sequence with an array collecting the last elements of all the input sequences. + */ + Observable.forkJoin = function () { + var allSources = argsOrArray(arguments, 0); + return new AnonymousObservable(function (subscriber) { + var count = allSources.length; + if (count === 0) { + subscriber.onCompleted(); + return disposableEmpty; + } + var group = new CompositeDisposable(), + finished = false, + hasResults = new Array(count), + hasCompleted = new Array(count), + results = new Array(count); + + for (var idx = 0; idx < count; idx++) { + (function (i) { + var source = allSources[i]; + isPromise(source) && (source = observableFromPromise(source)); + group.add( + source.subscribe( + function (value) { + if (!finished) { + hasResults[i] = true; + results[i] = value; + } + }, + function (e) { + finished = true; + subscriber.onError(e); + group.dispose(); + }, + function () { + if (!finished) { + if (!hasResults[i]) { + subscriber.onCompleted(); + return; + } + hasCompleted[i] = true; + for (var ix = 0; ix < count; ix++) { + if (!hasCompleted[ix]) { return; } + } + finished = true; + subscriber.onNext(results); + subscriber.onCompleted(); + } + })); + })(idx); + } + + return group; + }); + }; + + /** + * Runs two observable sequences in parallel and combines their last elemenets. + * + * @param {Observable} second Second observable sequence. + * @param {Function} resultSelector Result selector function to invoke with the last elements of both sequences. + * @returns {Observable} An observable sequence with the result of calling the selector function with the last elements of both input sequences. + */ + observableProto.forkJoin = function (second, resultSelector) { + var first = this; + + return new AnonymousObservable(function (observer) { + var leftStopped = false, rightStopped = false, + hasLeft = false, hasRight = false, + lastLeft, lastRight, + leftSubscription = new SingleAssignmentDisposable(), rightSubscription = new SingleAssignmentDisposable(); + + isPromise(second) && (second = observableFromPromise(second)); + + leftSubscription.setDisposable( + first.subscribe(function (left) { + hasLeft = true; + lastLeft = left; + }, function (err) { + rightSubscription.dispose(); + observer.onError(err); + }, function () { + leftStopped = true; + if (rightStopped) { + if (!hasLeft) { + observer.onCompleted(); + } else if (!hasRight) { + observer.onCompleted(); + } else { + var result; + try { + result = resultSelector(lastLeft, lastRight); + } catch (e) { + observer.onError(e); + return; + } + observer.onNext(result); + observer.onCompleted(); + } + } + }) + ); + + rightSubscription.setDisposable( + second.subscribe(function (right) { + hasRight = true; + lastRight = right; + }, function (err) { + leftSubscription.dispose(); + observer.onError(err); + }, function () { + rightStopped = true; + if (leftStopped) { + if (!hasLeft) { + observer.onCompleted(); + } else if (!hasRight) { + observer.onCompleted(); + } else { + var result; + try { + result = resultSelector(lastLeft, lastRight); + } catch (e) { + observer.onError(e); + return; + } + observer.onNext(result); + observer.onCompleted(); + } + } + }) + ); + + return new CompositeDisposable(leftSubscription, rightSubscription); + }); + }; + + /** + * Comonadic bind operator. + * @param {Function} selector A transform function to apply to each element. + * @param {Object} scheduler Scheduler used to execute the operation. If not specified, defaults to the ImmediateScheduler. + * @returns {Observable} An observable sequence which results from the comonadic bind operation. + */ + observableProto.manySelect = function (selector, scheduler) { + scheduler || (scheduler = immediateScheduler); + var source = this; + return observableDefer(function () { + var chain; + + return source + .select( + function (x) { + var curr = new ChainObservable(x); + if (chain) { + chain.onNext(x); + } + chain = curr; + + return curr; + }) + .doAction( + noop, + function (e) { + if (chain) { + chain.onError(e); + } + }, + function () { + if (chain) { + chain.onCompleted(); + } + }) + .observeOn(scheduler) + .select(function (x, i, o) { return selector(x, i, o); }); + }); + }; + + var ChainObservable = (function (_super) { + + function subscribe (observer) { + var self = this, g = new CompositeDisposable(); + g.add(currentThreadScheduler.schedule(function () { + observer.onNext(self.head); + g.add(self.tail.mergeObservable().subscribe(observer)); + })); + + return g; + } + + inherits(ChainObservable, _super); + + function ChainObservable(head) { + _super.call(this, subscribe); + this.head = head; + this.tail = new AsyncSubject(); + } + + addProperties(ChainObservable.prototype, Observer, { + onCompleted: function () { + this.onNext(Observable.empty()); + }, + onError: function (e) { + this.onNext(Observable.throwException(e)); + }, + onNext: function (v) { + this.tail.onNext(v); + this.tail.onCompleted(); + } + }); + + return ChainObservable; + + }(Observable)); + + return Rx; +})); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.experimental.min.js b/ajax/libs/rxjs/2.2.28/rx.experimental.min.js new file mode 100644 index 000000000..f764595ce --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.experimental.min.js @@ -0,0 +1 @@ +(function(t){var e={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},n=e[typeof window]&&window||this,r=e[typeof exports]&&exports&&!exports.nodeType&&exports,i=e[typeof module]&&module&&!module.nodeType&&module,o=(i&&i.exports===r&&r,e[typeof global]&&global);!o||o.global!==o&&o.window!==o||(n=o),"function"==typeof define&&define.amd?define(["rx","exports"],function(e,r){return n.Rx=t(n,r,e),n.Rx}):"object"==typeof module&&module&&module.exports===r?module.exports=t(n,module.exports,require("./rx")):n.Rx=t(n,{},n.Rx)}).call(this,function(t,e,n,r){function i(t,e){return 1===t.length&&Array.isArray(t[e])?t[e]:E.call(t)}function o(t,e){return new m(function(){return new v(function(){return t()?{done:!1,value:e}:{done:!0,value:r}})})}var s=n.Observable,u=s.prototype,c=n.AnonymousObservable,a=s.concat,h=s.defer,l=s.empty,f=n.Disposable.empty,p=n.CompositeDisposable,d=n.SerialDisposable,b=n.SingleAssignmentDisposable,v=n.internals.Enumerator,m=n.internals.Enumerable,y=m.forEach,w=n.Scheduler.immediate,g=n.Scheduler.currentThread,E=Array.prototype.slice,x=n.AsyncSubject,C=n.Observer,D=n.internals.inherits,S=n.internals.addProperties,N=n.helpers.noop,A=n.helpers.isPromise,_=s.fromPromise,O="object"==typeof Symbol&&Symbol.iterator||"_es6shim_iterator_";t.Set&&"function"==typeof(new t.Set)["@@iterator"]&&(O="@@iterator"),u.letBind=u.let=function(t){return t(this)},s["if"]=s.ifThen=function(t,e,n){return h(function(){return n||(n=l()),A(e)&&(e=_(e)),A(n)&&(n=_(n)),"function"==typeof n.now&&(n=l(n)),t()?e:n})},s["for"]=s.forIn=function(t,e){return y(t,e).concat()};var j=s["while"]=s.whileDo=function(t,e){return A(e)&&(e=_(e)),o(t,e).concat()};u.doWhile=function(t){return a([this,j(t,this)])},s["case"]=s.switchCase=function(t,e,n){return h(function(){n||(n=l()),"function"==typeof n.now&&(n=l(n));var r=e[t()];return A(r)&&(r=_(r)),r||n})},u.expand=function(t,e){e||(e=w);var n=this;return new c(function(i){var o=[],s=new d,u=new p(s),c=0,a=!1,h=function(){var n=!1;o.length>0&&(n=!a,a=!0),n&&s.setDisposable(e.scheduleRecursive(function(e){var n;if(!(o.length>0))return a=!1,r;n=o.shift();var s=new b;u.add(s),s.setDisposable(n.subscribe(function(e){i.onNext(e);var n=null;try{n=t(e)}catch(r){i.onError(r)}o.push(n),c++,h()},i.onError.bind(i),function(){u.remove(s),c--,0===c&&i.onCompleted()})),e()}))};return o.push(n),c++,h(),u})},s.forkJoin=function(){var t=i(arguments,0);return new c(function(e){var n=t.length;if(0===n)return e.onCompleted(),f;for(var i=new p,o=!1,s=Array(n),u=Array(n),c=Array(n),a=0;n>a;a++)(function(a){var h=t[a];A(h)&&(h=_(h)),i.add(h.subscribe(function(t){o||(s[a]=!0,c[a]=t)},function(t){o=!0,e.onError(t),i.dispose()},function(){if(!o){if(!s[a])return e.onCompleted(),r;u[a]=!0;for(var t=0;n>t;t++)if(!u[t])return;o=!0,e.onNext(c),e.onCompleted()}}))})(a);return i})},u.forkJoin=function(t,e){var n=this;return new c(function(i){var o,s,u=!1,c=!1,a=!1,h=!1,l=new b,f=new b;return A(t)&&(t=_(t)),l.setDisposable(n.subscribe(function(t){a=!0,o=t},function(t){f.dispose(),i.onError(t)},function(){if(u=!0,c)if(a)if(h){var t;try{t=e(o,s)}catch(n){return i.onError(n),r}i.onNext(t),i.onCompleted()}else i.onCompleted();else i.onCompleted()})),f.setDisposable(t.subscribe(function(t){h=!0,s=t},function(t){l.dispose(),i.onError(t)},function(){if(c=!0,u)if(a)if(h){var t;try{t=e(o,s)}catch(n){return i.onError(n),r}i.onNext(t),i.onCompleted()}else i.onCompleted();else i.onCompleted()})),new p(l,f)})},u.manySelect=function(t,e){e||(e=w);var n=this;return h(function(){var r;return n.select(function(t){var e=new R(t);return r&&r.onNext(t),r=e,e}).doAction(N,function(t){r&&r.onError(t)},function(){r&&r.onCompleted()}).observeOn(e).select(function(e,n,r){return t(e,n,r)})})};var R=function(t){function e(t){var e=this,n=new p;return n.add(g.schedule(function(){t.onNext(e.head),n.add(e.tail.mergeObservable().subscribe(t))})),n}function n(n){t.call(this,e),this.head=n,this.tail=new x}return D(n,t),S(n.prototype,C,{onCompleted:function(){this.onNext(s.empty())},onError:function(t){this.onNext(s.throwException(t))},onNext:function(t){this.tail.onNext(t),this.tail.onCompleted()}}),n}(s);return n}); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.joinpatterns.js b/ajax/libs/rxjs/2.2.28/rx.joinpatterns.js new file mode 100644 index 000000000..481f694c3 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.joinpatterns.js @@ -0,0 +1,415 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +;(function (factory) { + var objectTypes = { + 'boolean': false, + 'function': true, + 'object': true, + 'number': false, + 'string': false, + 'undefined': false + }; + + var root = (objectTypes[typeof window] && window) || this, + freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports, + freeModule = objectTypes[typeof module] && module && !module.nodeType && module, + moduleExports = freeModule && freeModule.exports === freeExports && freeExports, + freeGlobal = objectTypes[typeof global] && global; + + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) { + root = freeGlobal; + } + + // Because of build optimizers + if (typeof define === 'function' && define.amd) { + define(['rx', 'exports'], function (Rx, exports) { + root.Rx = factory(root, exports, Rx); + return root.Rx; + }); + } else if (typeof module === 'object' && module && module.exports === freeExports) { + module.exports = factory(root, module.exports, require('./rx')); + } else { + root.Rx = factory(root, {}, root.Rx); + } +}.call(this, function (root, exp, Rx, undefined) { + + // Aliases + var Observable = Rx.Observable, + observableProto = Observable.prototype, + AnonymousObservable = Rx.AnonymousObservable, + observableThrow = Observable.throwException, + observerCreate = Rx.Observer.create, + SingleAssignmentDisposable = Rx.SingleAssignmentDisposable, + CompositeDisposable = Rx.CompositeDisposable, + AbstractObserver = Rx.internals.AbstractObserver, + noop = Rx.helpers.noop, + defaultComparer = Rx.internals.isEqual, + inherits = Rx.internals.inherits, + slice = Array.prototype.slice; + + // Utilities + function argsOrArray(args, idx) { + return args.length === 1 && Array.isArray(args[idx]) ? + args[idx] : + slice.call(args); + } + + /** @private */ + var Map = (function () { + + /** + * @constructor + * @private + */ + function Map() { + this.keys = []; + this.values = []; + } + + /** + * @private + * @memberOf Map# + */ + Map.prototype['delete'] = function (key) { + var i = this.keys.indexOf(key); + if (i !== -1) { + this.keys.splice(i, 1); + this.values.splice(i, 1); + } + return i !== -1; + }; + + /** + * @private + * @memberOf Map# + */ + Map.prototype.get = function (key, fallback) { + var i = this.keys.indexOf(key); + return i !== -1 ? this.values[i] : fallback; + }; + + /** + * @private + * @memberOf Map# + */ + Map.prototype.set = function (key, value) { + var i = this.keys.indexOf(key); + if (i !== -1) { + this.values[i] = value; + } + this.values[this.keys.push(key) - 1] = value; + }; + + /** + * @private + * @memberOf Map# + */ + Map.prototype.size = function () { return this.keys.length; }; + + /** + * @private + * @memberOf Map# + */ + Map.prototype.has = function (key) { + return this.keys.indexOf(key) !== -1; + }; + + /** + * @private + * @memberOf Map# + */ + Map.prototype.getKeys = function () { return this.keys.slice(0); }; + + /** + * @private + * @memberOf Map# + */ + Map.prototype.getValues = function () { return this.values.slice(0); }; + + return Map; + }()); + + /** + * @constructor + * Represents a join pattern over observable sequences. + */ + function Pattern(patterns) { + this.patterns = patterns; + } + + /** + * Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value. + * + * @param other Observable sequence to match in addition to the current pattern. + * @return Pattern object that matches when all observable sequences in the pattern have an available value. + */ + Pattern.prototype.and = function (other) { + var patterns = this.patterns.slice(0); + patterns.push(other); + return new Pattern(patterns); + }; + + /** + * Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values. + * + * @param selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern. + * @return Plan that produces the projected values, to be fed (with other plans) to the when operator. + */ + Pattern.prototype.then = function (selector) { + return new Plan(this, selector); + }; + + function Plan(expression, selector) { + this.expression = expression; + this.selector = selector; + } + + Plan.prototype.activate = function (externalSubscriptions, observer, deactivate) { + var self = this; + var joinObservers = []; + for (var i = 0, len = this.expression.patterns.length; i < len; i++) { + joinObservers.push(planCreateObserver(externalSubscriptions, this.expression.patterns[i], observer.onError.bind(observer))); + } + var activePlan = new ActivePlan(joinObservers, function () { + var result; + try { + result = self.selector.apply(self, arguments); + } catch (exception) { + observer.onError(exception); + return; + } + observer.onNext(result); + }, function () { + for (var j = 0, jlen = joinObservers.length; j < jlen; j++) { + joinObservers[j].removeActivePlan(activePlan); + } + deactivate(activePlan); + }); + for (i = 0, len = joinObservers.length; i < len; i++) { + joinObservers[i].addActivePlan(activePlan); + } + return activePlan; + }; + + function planCreateObserver(externalSubscriptions, observable, onError) { + var entry = externalSubscriptions.get(observable); + if (!entry) { + var observer = new JoinObserver(observable, onError); + externalSubscriptions.set(observable, observer); + return observer; + } + return entry; + } + + // Active Plan + function ActivePlan(joinObserverArray, onNext, onCompleted) { + var i, joinObserver; + this.joinObserverArray = joinObserverArray; + this.onNext = onNext; + this.onCompleted = onCompleted; + this.joinObservers = new Map(); + for (i = 0; i < this.joinObserverArray.length; i++) { + joinObserver = this.joinObserverArray[i]; + this.joinObservers.set(joinObserver, joinObserver); + } + } + + ActivePlan.prototype.dequeue = function () { + var values = this.joinObservers.getValues(); + for (var i = 0, len = values.length; i < len; i++) { + values[i].queue.shift(); + } + }; + ActivePlan.prototype.match = function () { + var firstValues, i, len, isCompleted, values, hasValues = true; + for (i = 0, len = this.joinObserverArray.length; i < len; i++) { + if (this.joinObserverArray[i].queue.length === 0) { + hasValues = false; + break; + } + } + if (hasValues) { + firstValues = []; + isCompleted = false; + for (i = 0, len = this.joinObserverArray.length; i < len; i++) { + firstValues.push(this.joinObserverArray[i].queue[0]); + if (this.joinObserverArray[i].queue[0].kind === 'C') { + isCompleted = true; + } + } + if (isCompleted) { + this.onCompleted(); + } else { + this.dequeue(); + values = []; + for (i = 0; i < firstValues.length; i++) { + values.push(firstValues[i].value); + } + this.onNext.apply(this, values); + } + } + }; + + /** @private */ + var JoinObserver = (function (_super) { + + inherits(JoinObserver, _super); + + /** + * @constructor + * @private + */ + function JoinObserver(source, onError) { + _super.call(this); + this.source = source; + this.onError = onError; + this.queue = []; + this.activePlans = []; + this.subscription = new SingleAssignmentDisposable(); + this.isDisposed = false; + } + + var JoinObserverPrototype = JoinObserver.prototype; + + /** + * @memberOf JoinObserver# + * @private + */ + JoinObserverPrototype.next = function (notification) { + if (!this.isDisposed) { + if (notification.kind === 'E') { + this.onError(notification.exception); + return; + } + this.queue.push(notification); + var activePlans = this.activePlans.slice(0); + for (var i = 0, len = activePlans.length; i < len; i++) { + activePlans[i].match(); + } + } + }; + + /** + * @memberOf JoinObserver# + * @private + */ + JoinObserverPrototype.error = noop; + + /** + * @memberOf JoinObserver# + * @private + */ + JoinObserverPrototype.completed = noop; + + /** + * @memberOf JoinObserver# + * @private + */ + JoinObserverPrototype.addActivePlan = function (activePlan) { + this.activePlans.push(activePlan); + }; + + /** + * @memberOf JoinObserver# + * @private + */ + JoinObserverPrototype.subscribe = function () { + this.subscription.setDisposable(this.source.materialize().subscribe(this)); + }; + + /** + * @memberOf JoinObserver# + * @private + */ + JoinObserverPrototype.removeActivePlan = function (activePlan) { + var idx = this.activePlans.indexOf(activePlan); + this.activePlans.splice(idx, 1); + if (this.activePlans.length === 0) { + this.dispose(); + } + }; + + /** + * @memberOf JoinObserver# + * @private + */ + JoinObserverPrototype.dispose = function () { + _super.prototype.dispose.call(this); + if (!this.isDisposed) { + this.isDisposed = true; + this.subscription.dispose(); + } + }; + + return JoinObserver; + } (AbstractObserver)); + + /** + * Creates a pattern that matches when both observable sequences have an available value. + * + * @param right Observable sequence to match with the current sequence. + * @return {Pattern} Pattern object that matches when both observable sequences have an available value. + */ + observableProto.and = function (right) { + return new Pattern([this, right]); + }; + + /** + * Matches when the observable sequence has an available value and projects the value. + * + * @param selector Selector that will be invoked for values in the source sequence. + * @returns {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator. + */ + observableProto.then = function (selector) { + return new Pattern([this]).then(selector); + }; + + /** + * Joins together the results from several patterns. + * + * @param plans A series of plans (specified as an Array of as a series of arguments) created by use of the Then operator on patterns. + * @returns {Observable} Observable sequence with the results form matching several patterns. + */ + Observable.when = function () { + var plans = argsOrArray(arguments, 0); + return new AnonymousObservable(function (observer) { + var activePlans = [], + externalSubscriptions = new Map(), + group, + i, len, + joinObserver, + joinValues, + outObserver; + outObserver = observerCreate(observer.onNext.bind(observer), function (exception) { + var values = externalSubscriptions.getValues(); + for (var j = 0, jlen = values.length; j < jlen; j++) { + values[j].onError(exception); + } + observer.onError(exception); + }, observer.onCompleted.bind(observer)); + try { + for (i = 0, len = plans.length; i < len; i++) { + activePlans.push(plans[i].activate(externalSubscriptions, outObserver, function (activePlan) { + var idx = activePlans.indexOf(activePlan); + activePlans.splice(idx, 1); + if (activePlans.length === 0) { + outObserver.onCompleted(); + } + })); + } + } catch (e) { + observableThrow(e).subscribe(observer); + } + group = new CompositeDisposable(); + joinValues = externalSubscriptions.getValues(); + for (i = 0, len = joinValues.length; i < len; i++) { + joinObserver = joinValues[i]; + joinObserver.subscribe(); + group.add(joinObserver); + } + return group; + }); + }; + + return Rx; +})); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.joinpatterns.min.js b/ajax/libs/rxjs/2.2.28/rx.joinpatterns.min.js new file mode 100644 index 000000000..924fbb33f --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.joinpatterns.min.js @@ -0,0 +1 @@ +(function(t){var e={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},n=e[typeof window]&&window||this,r=e[typeof exports]&&exports&&!exports.nodeType&&exports,i=e[typeof module]&&module&&!module.nodeType&&module,o=(i&&i.exports===r&&r,e[typeof global]&&global);!o||o.global!==o&&o.window!==o||(n=o),"function"==typeof define&&define.amd?define(["rx","exports"],function(e,r){return n.Rx=t(n,r,e),n.Rx}):"object"==typeof module&&module&&module.exports===r?module.exports=t(n,module.exports,require("./rx")):n.Rx=t(n,{},n.Rx)}).call(this,function(t,e,n){function r(t,e){return 1===t.length&&Array.isArray(t[e])?t[e]:y.call(t)}function i(t){this.patterns=t}function o(t,e){this.expression=t,this.selector=e}function s(t,e,n){var r=t.get(e);if(!r){var i=new g(e,n);return t.set(e,i),i}return r}function u(t,e,n){var r,i;for(this.joinObserverArray=t,this.onNext=e,this.onCompleted=n,this.joinObservers=new w,r=0;this.joinObserverArray.length>r;r++)i=this.joinObserverArray[r],this.joinObservers.set(i,i)}var c=n.Observable,a=c.prototype,h=n.AnonymousObservable,l=c.throwException,f=n.Observer.create,p=n.SingleAssignmentDisposable,d=n.CompositeDisposable,b=n.internals.AbstractObserver,v=n.helpers.noop,m=(n.internals.isEqual,n.internals.inherits),y=Array.prototype.slice,w=function(){function t(){this.keys=[],this.values=[]}return t.prototype["delete"]=function(t){var e=this.keys.indexOf(t);return-1!==e&&(this.keys.splice(e,1),this.values.splice(e,1)),-1!==e},t.prototype.get=function(t,e){var n=this.keys.indexOf(t);return-1!==n?this.values[n]:e},t.prototype.set=function(t,e){var n=this.keys.indexOf(t);-1!==n&&(this.values[n]=e),this.values[this.keys.push(t)-1]=e},t.prototype.size=function(){return this.keys.length},t.prototype.has=function(t){return-1!==this.keys.indexOf(t)},t.prototype.getKeys=function(){return this.keys.slice(0)},t.prototype.getValues=function(){return this.values.slice(0)},t}();i.prototype.and=function(t){var e=this.patterns.slice(0);return e.push(t),new i(e)},i.prototype.then=function(t){return new o(this,t)},o.prototype.activate=function(t,e,n){for(var r=this,i=[],o=0,c=this.expression.patterns.length;c>o;o++)i.push(s(t,this.expression.patterns[o],e.onError.bind(e)));var a=new u(i,function(){var t;try{t=r.selector.apply(r,arguments)}catch(n){return e.onError(n),undefined}e.onNext(t)},function(){for(var t=0,e=i.length;e>t;t++)i[t].removeActivePlan(a);n(a)});for(o=0,c=i.length;c>o;o++)i[o].addActivePlan(a);return a},u.prototype.dequeue=function(){for(var t=this.joinObservers.getValues(),e=0,n=t.length;n>e;e++)t[e].queue.shift()},u.prototype.match=function(){var t,e,n,r,i,o=!0;for(e=0,n=this.joinObserverArray.length;n>e;e++)if(0===this.joinObserverArray[e].queue.length){o=!1;break}if(o){for(t=[],r=!1,e=0,n=this.joinObserverArray.length;n>e;e++)t.push(this.joinObserverArray[e].queue[0]),"C"===this.joinObserverArray[e].queue[0].kind&&(r=!0);if(r)this.onCompleted();else{for(this.dequeue(),i=[],e=0;t.length>e;e++)i.push(t[e].value);this.onNext.apply(this,i)}}};var g=function(t){function e(e,n){t.call(this),this.source=e,this.onError=n,this.queue=[],this.activePlans=[],this.subscription=new p,this.isDisposed=!1}m(e,t);var n=e.prototype;return n.next=function(t){if(!this.isDisposed){if("E"===t.kind)return this.onError(t.exception),undefined;this.queue.push(t);for(var e=this.activePlans.slice(0),n=0,r=e.length;r>n;n++)e[n].match()}},n.error=v,n.completed=v,n.addActivePlan=function(t){this.activePlans.push(t)},n.subscribe=function(){this.subscription.setDisposable(this.source.materialize().subscribe(this))},n.removeActivePlan=function(t){var e=this.activePlans.indexOf(t);this.activePlans.splice(e,1),0===this.activePlans.length&&this.dispose()},n.dispose=function(){t.prototype.dispose.call(this),this.isDisposed||(this.isDisposed=!0,this.subscription.dispose())},e}(b);return a.and=function(t){return new i([this,t])},a.then=function(t){return new i([this]).then(t)},c.when=function(){var t=r(arguments,0);return new h(function(e){var n,r,i,o,s,u,c=[],a=new w;u=f(e.onNext.bind(e),function(t){for(var n=a.getValues(),r=0,i=n.length;i>r;r++)n[r].onError(t);e.onError(t)},e.onCompleted.bind(e));try{for(r=0,i=t.length;i>r;r++)c.push(t[r].activate(a,u,function(t){var e=c.indexOf(t);c.splice(e,1),0===c.length&&u.onCompleted()}))}catch(h){l(h).subscribe(e)}for(n=new d,s=a.getValues(),r=0,i=s.length;i>r;r++)o=s[r],o.subscribe(),n.add(o);return n})},n}); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.js b/ajax/libs/rxjs/2.2.28/rx.js new file mode 100644 index 000000000..0a8a76a7b --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.js @@ -0,0 +1,4640 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +;(function (undefined) { + + var objectTypes = { + 'boolean': false, + 'function': true, + 'object': true, + 'number': false, + 'string': false, + 'undefined': false + }; + + var root = (objectTypes[typeof window] && window) || this, + freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports, + freeModule = objectTypes[typeof module] && module && !module.nodeType && module, + moduleExports = freeModule && freeModule.exports === freeExports && freeExports, + freeGlobal = objectTypes[typeof global] && global; + + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) { + root = freeGlobal; + } + + var Rx = { + internals: {}, + config: { + Promise: root.Promise // Detect if promise exists + }, + helpers: { } + }; + + // Defaults + var noop = Rx.helpers.noop = function () { }, + identity = Rx.helpers.identity = function (x) { return x; }, + pluck = Rx.helpers.pluck = function (property) { return function (x) { return x[property]; }; }, + just = Rx.helpers.just = function (value) { return function () { return value; }; }, + defaultNow = Rx.helpers.defaultNow = Date.now, + defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); }, + defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); }, + defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); }, + defaultError = Rx.helpers.defaultError = function (err) { throw err; }, + isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.then === 'function' && p.then !== Rx.Observable.prototype.then; }, + asArray = Rx.helpers.asArray = function () { return Array.prototype.slice.call(arguments); }, + not = Rx.helpers.not = function (a) { return !a; }; + + // Errors + var sequenceContainsNoElements = 'Sequence contains no elements.'; + var argumentOutOfRange = 'Argument out of range'; + var objectDisposed = 'Object has been disposed'; + function checkDisposed() { if (this.isDisposed) { throw new Error(objectDisposed); } } + + // Shim in iterator support + var $iterator$ = (typeof Symbol === 'object' && Symbol.iterator) || + '_es6shim_iterator_'; + // Firefox ships a partial implementation using the name @@iterator. + // https://bugzilla.mozilla.org/show_bug.cgi?id=907077#c14 + // So use that name if we detect it. + if (root.Set && typeof new root.Set()['@@iterator'] === 'function') { + $iterator$ = '@@iterator'; + } + var doneEnumerator = { done: true, value: undefined }; + + /** `Object#toString` result shortcuts */ + var argsClass = '[object Arguments]', + arrayClass = '[object Array]', + boolClass = '[object Boolean]', + dateClass = '[object Date]', + errorClass = '[object Error]', + funcClass = '[object Function]', + numberClass = '[object Number]', + objectClass = '[object Object]', + regexpClass = '[object RegExp]', + stringClass = '[object String]'; + + var toString = Object.prototype.toString, + hasOwnProperty = Object.prototype.hasOwnProperty, + supportsArgsClass = toString.call(arguments) == argsClass, // For less -1); + } + }); + } + } + stackA.pop(); + stackB.pop(); + + return result; + } + var slice = Array.prototype.slice; + function argsOrArray(args, idx) { + return args.length === 1 && Array.isArray(args[idx]) ? + args[idx] : + slice.call(args); + } + var hasProp = {}.hasOwnProperty; + + /** @private */ + var inherits = this.inherits = Rx.internals.inherits = function (child, parent) { + function __() { this.constructor = child; } + __.prototype = parent.prototype; + child.prototype = new __(); + }; + + /** @private */ + var addProperties = Rx.internals.addProperties = function (obj) { + var sources = slice.call(arguments, 1); + for (var i = 0, len = sources.length; i < len; i++) { + var source = sources[i]; + for (var prop in source) { + obj[prop] = source[prop]; + } + } + }; + + // Rx Utils + var addRef = Rx.internals.addRef = function (xs, r) { + return new AnonymousObservable(function (observer) { + return new CompositeDisposable(r.getDisposable(), xs.subscribe(observer)); + }); + }; + + // Collection polyfills + function arrayInitialize(count, factory) { + var a = new Array(count); + for (var i = 0; i < count; i++) { + a[i] = factory(); + } + return a; + } + + // Collections + var IndexedItem = function (id, value) { + this.id = id; + this.value = value; + }; + + IndexedItem.prototype.compareTo = function (other) { + var c = this.value.compareTo(other.value); + if (c === 0) { + c = this.id - other.id; + } + return c; + }; + + // Priority Queue for Scheduling + var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) { + this.items = new Array(capacity); + this.length = 0; + }; + + var priorityProto = PriorityQueue.prototype; + priorityProto.isHigherPriority = function (left, right) { + return this.items[left].compareTo(this.items[right]) < 0; + }; + + priorityProto.percolate = function (index) { + if (index >= this.length || index < 0) { + return; + } + var parent = index - 1 >> 1; + if (parent < 0 || parent === index) { + return; + } + if (this.isHigherPriority(index, parent)) { + var temp = this.items[index]; + this.items[index] = this.items[parent]; + this.items[parent] = temp; + this.percolate(parent); + } + }; + + priorityProto.heapify = function (index) { + if (index === undefined) { + index = 0; + } + if (index >= this.length || index < 0) { + return; + } + var left = 2 * index + 1, + right = 2 * index + 2, + first = index; + if (left < this.length && this.isHigherPriority(left, first)) { + first = left; + } + if (right < this.length && this.isHigherPriority(right, first)) { + first = right; + } + if (first !== index) { + var temp = this.items[index]; + this.items[index] = this.items[first]; + this.items[first] = temp; + this.heapify(first); + } + }; + + priorityProto.peek = function () { return this.items[0].value; }; + + priorityProto.removeAt = function (index) { + this.items[index] = this.items[--this.length]; + delete this.items[this.length]; + this.heapify(); + }; + + priorityProto.dequeue = function () { + var result = this.peek(); + this.removeAt(0); + return result; + }; + + priorityProto.enqueue = function (item) { + var index = this.length++; + this.items[index] = new IndexedItem(PriorityQueue.count++, item); + this.percolate(index); + }; + + priorityProto.remove = function (item) { + for (var i = 0; i < this.length; i++) { + if (this.items[i].value === item) { + this.removeAt(i); + return true; + } + } + return false; + }; + PriorityQueue.count = 0; + /** + * Represents a group of disposable resources that are disposed together. + * @constructor + */ + var CompositeDisposable = Rx.CompositeDisposable = function () { + this.disposables = argsOrArray(arguments, 0); + this.isDisposed = false; + this.length = this.disposables.length; + }; + + var CompositeDisposablePrototype = CompositeDisposable.prototype; + + /** + * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed. + * @param {Mixed} item Disposable to add. + */ + CompositeDisposablePrototype.add = function (item) { + if (this.isDisposed) { + item.dispose(); + } else { + this.disposables.push(item); + this.length++; + } + }; + + /** + * Removes and disposes the first occurrence of a disposable from the CompositeDisposable. + * @param {Mixed} item Disposable to remove. + * @returns {Boolean} true if found; false otherwise. + */ + CompositeDisposablePrototype.remove = function (item) { + var shouldDispose = false; + if (!this.isDisposed) { + var idx = this.disposables.indexOf(item); + if (idx !== -1) { + shouldDispose = true; + this.disposables.splice(idx, 1); + this.length--; + item.dispose(); + } + + } + return shouldDispose; + }; + + /** + * Disposes all disposables in the group and removes them from the group. + */ + CompositeDisposablePrototype.dispose = function () { + if (!this.isDisposed) { + this.isDisposed = true; + var currentDisposables = this.disposables.slice(0); + this.disposables = []; + this.length = 0; + + for (var i = 0, len = currentDisposables.length; i < len; i++) { + currentDisposables[i].dispose(); + } + } + }; + + /** + * Removes and disposes all disposables from the CompositeDisposable, but does not dispose the CompositeDisposable. + */ + CompositeDisposablePrototype.clear = function () { + var currentDisposables = this.disposables.slice(0); + this.disposables = []; + this.length = 0; + for (var i = 0, len = currentDisposables.length; i < len; i++) { + currentDisposables[i].dispose(); + } + }; + + /** + * Determines whether the CompositeDisposable contains a specific disposable. + * @param {Mixed} item Disposable to search for. + * @returns {Boolean} true if the disposable was found; otherwise, false. + */ + CompositeDisposablePrototype.contains = function (item) { + return this.disposables.indexOf(item) !== -1; + }; + + /** + * Converts the existing CompositeDisposable to an array of disposables + * @returns {Array} An array of disposable objects. + */ + CompositeDisposablePrototype.toArray = function () { + return this.disposables.slice(0); + }; + + /** + * Provides a set of static methods for creating Disposables. + * + * @constructor + * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once. + */ + var Disposable = Rx.Disposable = function (action) { + this.isDisposed = false; + this.action = action || noop; + }; + + /** Performs the task of cleaning up resources. */ + Disposable.prototype.dispose = function () { + if (!this.isDisposed) { + this.action(); + this.isDisposed = true; + } + }; + + /** + * Creates a disposable object that invokes the specified action when disposed. + * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once. + * @return {Disposable} The disposable object that runs the given action upon disposal. + */ + var disposableCreate = Disposable.create = function (action) { return new Disposable(action); }; + + /** + * Gets the disposable that does nothing when disposed. + */ + var disposableEmpty = Disposable.empty = { dispose: noop }; + + var BooleanDisposable = (function () { + function BooleanDisposable (isSingle) { + this.isSingle = isSingle; + this.isDisposed = false; + this.current = null; + } + + var booleanDisposablePrototype = BooleanDisposable.prototype; + + /** + * Gets the underlying disposable. + * @return The underlying disposable. + */ + booleanDisposablePrototype.getDisposable = function () { + return this.current; + }; + + /** + * Sets the underlying disposable. + * @param {Disposable} value The new underlying disposable. + */ + booleanDisposablePrototype.setDisposable = function (value) { + if (this.current && this.isSingle) { + throw new Error('Disposable has already been assigned'); + } + + var shouldDispose = this.isDisposed, old; + if (!shouldDispose) { + old = this.current; + this.current = value; + } + if (old) { + old.dispose(); + } + if (shouldDispose && value) { + value.dispose(); + } + }; + + /** + * Disposes the underlying disposable as well as all future replacements. + */ + booleanDisposablePrototype.dispose = function () { + var old; + if (!this.isDisposed) { + this.isDisposed = true; + old = this.current; + this.current = null; + } + if (old) { + old.dispose(); + } + }; + + return BooleanDisposable; + }()); + + /** + * Represents a disposable resource which only allows a single assignment of its underlying disposable resource. + * If an underlying disposable resource has already been set, future attempts to set the underlying disposable resource will throw an Error. + */ + var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = (function (super_) { + inherits(SingleAssignmentDisposable, super_); + + function SingleAssignmentDisposable() { + super_.call(this, true); + } + + return SingleAssignmentDisposable; + }(BooleanDisposable)); + + /** + * Represents a disposable resource whose underlying disposable resource can be replaced by another disposable resource, causing automatic disposal of the previous underlying disposable resource. + */ + var SerialDisposable = Rx.SerialDisposable = (function (super_) { + inherits(SerialDisposable, super_); + + function SerialDisposable() { + super_.call(this, false); + } + + return SerialDisposable; + }(BooleanDisposable)); + + /** + * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed. + */ + var RefCountDisposable = Rx.RefCountDisposable = (function () { + + function InnerDisposable(disposable) { + this.disposable = disposable; + this.disposable.count++; + this.isInnerDisposed = false; + } + + InnerDisposable.prototype.dispose = function () { + if (!this.disposable.isDisposed) { + if (!this.isInnerDisposed) { + this.isInnerDisposed = true; + this.disposable.count--; + if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) { + this.disposable.isDisposed = true; + this.disposable.underlyingDisposable.dispose(); + } + } + } + }; + + /** + * Initializes a new instance of the RefCountDisposable with the specified disposable. + * @constructor + * @param {Disposable} disposable Underlying disposable. + */ + function RefCountDisposable(disposable) { + this.underlyingDisposable = disposable; + this.isDisposed = false; + this.isPrimaryDisposed = false; + this.count = 0; + } + + /** + * Disposes the underlying disposable only when all dependent disposables have been disposed + */ + RefCountDisposable.prototype.dispose = function () { + if (!this.isDisposed) { + if (!this.isPrimaryDisposed) { + this.isPrimaryDisposed = true; + if (this.count === 0) { + this.isDisposed = true; + this.underlyingDisposable.dispose(); + } + } + } + }; + + /** + * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable. + * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime. + */ + RefCountDisposable.prototype.getDisposable = function () { + return this.isDisposed ? disposableEmpty : new InnerDisposable(this); + }; + + return RefCountDisposable; + })(); + + function ScheduledDisposable(scheduler, disposable) { + this.scheduler = scheduler; + this.disposable = disposable; + this.isDisposed = false; + } + + ScheduledDisposable.prototype.dispose = function () { + var parent = this; + this.scheduler.schedule(function () { + if (!parent.isDisposed) { + parent.isDisposed = true; + parent.disposable.dispose(); + } + }); + }; + + var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) { + this.scheduler = scheduler; + this.state = state; + this.action = action; + this.dueTime = dueTime; + this.comparer = comparer || defaultSubComparer; + this.disposable = new SingleAssignmentDisposable(); + } + + ScheduledItem.prototype.invoke = function () { + this.disposable.setDisposable(this.invokeCore()); + }; + + ScheduledItem.prototype.compareTo = function (other) { + return this.comparer(this.dueTime, other.dueTime); + }; + + ScheduledItem.prototype.isCancelled = function () { + return this.disposable.isDisposed; + }; + + ScheduledItem.prototype.invokeCore = function () { + return this.action(this.scheduler, this.state); + }; + + /** Provides a set of static properties to access commonly used schedulers. */ + var Scheduler = Rx.Scheduler = (function () { + + /** + * @constructor + * @private + */ + function Scheduler(now, schedule, scheduleRelative, scheduleAbsolute) { + this.now = now; + this._schedule = schedule; + this._scheduleRelative = scheduleRelative; + this._scheduleAbsolute = scheduleAbsolute; + } + + function invokeRecImmediate(scheduler, pair) { + var state = pair.first, action = pair.second, group = new CompositeDisposable(), + recursiveAction = function (state1) { + action(state1, function (state2) { + var isAdded = false, isDone = false, + d = scheduler.scheduleWithState(state2, function (scheduler1, state3) { + if (isAdded) { + group.remove(d); + } else { + isDone = true; + } + recursiveAction(state3); + return disposableEmpty; + }); + if (!isDone) { + group.add(d); + isAdded = true; + } + }); + }; + recursiveAction(state); + return group; + } + + function invokeRecDate(scheduler, pair, method) { + var state = pair.first, action = pair.second, group = new CompositeDisposable(), + recursiveAction = function (state1) { + action(state1, function (state2, dueTime1) { + var isAdded = false, isDone = false, + d = scheduler[method].call(scheduler, state2, dueTime1, function (scheduler1, state3) { + if (isAdded) { + group.remove(d); + } else { + isDone = true; + } + recursiveAction(state3); + return disposableEmpty; + }); + if (!isDone) { + group.add(d); + isAdded = true; + } + }); + }; + recursiveAction(state); + return group; + } + + function invokeAction(scheduler, action) { + action(); + return disposableEmpty; + } + + var schedulerProto = Scheduler.prototype; + + /** + * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions. + * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false. + * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling. + */ + schedulerProto.catchException = schedulerProto['catch'] = function (handler) { + return new CatchScheduler(this, handler); + }; + + /** + * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation. + * @param {Number} period Period for running the work periodically. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort). + */ + schedulerProto.schedulePeriodic = function (period, action) { + return this.schedulePeriodicWithState(null, period, function () { + action(); + }); + }; + + /** + * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation. + * @param {Mixed} state Initial state passed to the action upon the first iteration. + * @param {Number} period Period for running the work periodically. + * @param {Function} action Action to be executed, potentially updating the state. + * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort). + */ + schedulerProto.schedulePeriodicWithState = function (state, period, action) { + var s = state, id = setInterval(function () { + s = action(s); + }, period); + return disposableCreate(function () { + clearInterval(id); + }); + }; + + /** + * Schedules an action to be executed. + * @param {Function} action Action to execute. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.schedule = function (action) { + return this._schedule(action, invokeAction); + }; + + /** + * Schedules an action to be executed. + * @param state State passed to the action to be executed. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithState = function (state, action) { + return this._schedule(state, action); + }; + + /** + * Schedules an action to be executed after the specified relative due time. + * @param {Function} action Action to execute. + * @param {Number} dueTime Relative time after which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithRelative = function (dueTime, action) { + return this._scheduleRelative(action, dueTime, invokeAction); + }; + + /** + * Schedules an action to be executed after dueTime. + * @param state State passed to the action to be executed. + * @param {Function} action Action to be executed. + * @param {Number} dueTime Relative time after which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithRelativeAndState = function (state, dueTime, action) { + return this._scheduleRelative(state, dueTime, action); + }; + + /** + * Schedules an action to be executed at the specified absolute due time. + * @param {Function} action Action to execute. + * @param {Number} dueTime Absolute time at which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithAbsolute = function (dueTime, action) { + return this._scheduleAbsolute(action, dueTime, invokeAction); + }; + + /** + * Schedules an action to be executed at dueTime. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to be executed. + * @param {Number}dueTime Absolute time at which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithAbsoluteAndState = function (state, dueTime, action) { + return this._scheduleAbsolute(state, dueTime, action); + }; + + /** + * Schedules an action to be executed recursively. + * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursive = function (action) { + return this.scheduleRecursiveWithState(action, function (_action, self) { + _action(function () { + self(_action); + }); + }); + }; + + /** + * Schedules an action to be executed recursively. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithState = function (state, action) { + return this.scheduleWithState({ first: state, second: action }, function (s, p) { + return invokeRecImmediate(s, p); + }); + }; + + /** + * Schedules an action to be executed recursively after a specified relative due time. + * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified relative time. + * @param {Number}dueTime Relative time after which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithRelative = function (dueTime, action) { + return this.scheduleRecursiveWithRelativeAndState(action, dueTime, function (_action, self) { + _action(function (dt) { + self(_action, dt); + }); + }); + }; + + /** + * Schedules an action to be executed recursively after a specified relative due time. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state. + * @param {Number}dueTime Relative time after which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithRelativeAndState = function (state, dueTime, action) { + return this._scheduleRelative({ first: state, second: action }, dueTime, function (s, p) { + return invokeRecDate(s, p, 'scheduleWithRelativeAndState'); + }); + }; + + /** + * Schedules an action to be executed recursively at a specified absolute due time. + * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified absolute time. + * @param {Number}dueTime Absolute time at which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithAbsolute = function (dueTime, action) { + return this.scheduleRecursiveWithAbsoluteAndState(action, dueTime, function (_action, self) { + _action(function (dt) { + self(_action, dt); + }); + }); + }; + + /** + * Schedules an action to be executed recursively at a specified absolute due time. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state. + * @param {Number}dueTime Absolute time at which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithAbsoluteAndState = function (state, dueTime, action) { + return this._scheduleAbsolute({ first: state, second: action }, dueTime, function (s, p) { + return invokeRecDate(s, p, 'scheduleWithAbsoluteAndState'); + }); + }; + + /** Gets the current time according to the local machine's system clock. */ + Scheduler.now = defaultNow; + + /** + * Normalizes the specified TimeSpan value to a positive value. + * @param {Number} timeSpan The time span value to normalize. + * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0 + */ + Scheduler.normalize = function (timeSpan) { + if (timeSpan < 0) { + timeSpan = 0; + } + return timeSpan; + }; + + return Scheduler; + }()); + + var normalizeTime = Scheduler.normalize; + + var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () { + function tick(command, recurse) { + recurse(0, this._period); + try { + this._state = this._action(this._state); + } catch (e) { + this._cancel.dispose(); + throw e; + } + } + + function SchedulePeriodicRecursive(scheduler, state, period, action) { + this._scheduler = scheduler; + this._state = state; + this._period = period; + this._action = action; + } + + SchedulePeriodicRecursive.prototype.start = function () { + var d = new SingleAssignmentDisposable(); + this._cancel = d; + d.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0, this._period, tick.bind(this))); + + return d; + }; + + return SchedulePeriodicRecursive; + }()); + + /** + * Gets a scheduler that schedules work immediately on the current thread. + */ + var immediateScheduler = Scheduler.immediate = (function () { + + function scheduleNow(state, action) { return action(this, state); } + + function scheduleRelative(state, dueTime, action) { + var dt = normalizeTime(dt); + while (dt - this.now() > 0) { } + return action(this, state); + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); + } + + return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); + }()); + + /** + * Gets a scheduler that schedules work as soon as possible on the current thread. + */ + var currentThreadScheduler = Scheduler.currentThread = (function () { + var queue; + + function runTrampoline (q) { + var item; + while (q.length > 0) { + item = q.dequeue(); + if (!item.isCancelled()) { + // Note, do not schedule blocking work! + while (item.dueTime - Scheduler.now() > 0) { + } + if (!item.isCancelled()) { + item.invoke(); + } + } + } + } + + function scheduleNow(state, action) { + return this.scheduleWithRelativeAndState(state, 0, action); + } + + function scheduleRelative(state, dueTime, action) { + var dt = this.now() + Scheduler.normalize(dueTime), + si = new ScheduledItem(this, state, action, dt), + t; + if (!queue) { + queue = new PriorityQueue(4); + queue.enqueue(si); + try { + runTrampoline(queue); + } catch (e) { + throw e; + } finally { + queue = null; + } + } else { + queue.enqueue(si); + } + return si.disposable; + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); + } + + var currentScheduler = new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); + currentScheduler.scheduleRequired = function () { return queue === null; }; + currentScheduler.ensureTrampoline = function (action) { + if (queue === null) { + return this.schedule(action); + } else { + return action(); + } + }; + + return currentScheduler; + }()); + + + var scheduleMethod, clearMethod = noop; + (function () { + + var reNative = RegExp('^' + + String(toString) + .replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + .replace(/toString| for [^\]]+/g, '.*?') + '$' + ); + + var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' && + !reNative.test(setImmediate) && setImmediate, + clearImmediate = typeof (clearImmediate = freeGlobal && moduleExports && freeGlobal.clearImmediate) == 'function' && + !reNative.test(clearImmediate) && clearImmediate; + + function postMessageSupported () { + // Ensure not in a worker + if (!root.postMessage || root.importScripts) { return false; } + var isAsync = false, + oldHandler = root.onmessage; + // Test for async + root.onmessage = function () { isAsync = true; }; + root.postMessage('','*'); + root.onmessage = oldHandler; + + return isAsync; + } + + // Use in order, nextTick, setImmediate, postMessage, MessageChannel, script readystatechanged, setTimeout + if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') { + scheduleMethod = process.nextTick; + } else if (typeof setImmediate === 'function') { + scheduleMethod = setImmediate; + clearMethod = clearImmediate; + } else if (postMessageSupported()) { + var MSG_PREFIX = 'ms.rx.schedule' + Math.random(), + tasks = {}, + taskId = 0; + + function onGlobalPostMessage(event) { + // Only if we're a match to avoid any other global events + if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) { + var handleId = event.data.substring(MSG_PREFIX.length), + action = tasks[handleId]; + action(); + delete tasks[handleId]; + } + } + + if (root.addEventListener) { + root.addEventListener('message', onGlobalPostMessage, false); + } else { + root.attachEvent('onmessage', onGlobalPostMessage, false); + } + + scheduleMethod = function (action) { + var currentId = taskId++; + tasks[currentId] = action; + root.postMessage(MSG_PREFIX + currentId, '*'); + }; + } else if (!!root.MessageChannel) { + var channel = new root.MessageChannel(), + channelTasks = {}, + channelTaskId = 0; + + channel.port1.onmessage = function (event) { + var id = event.data, + action = channelTasks[id]; + action(); + delete channelTasks[id]; + }; + + scheduleMethod = function (action) { + var id = channelTaskId++; + channelTasks[id] = action; + channel.port2.postMessage(id); + }; + } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) { + + scheduleMethod = function (action) { + var scriptElement = root.document.createElement('script'); + scriptElement.onreadystatechange = function () { + action(); + scriptElement.onreadystatechange = null; + scriptElement.parentNode.removeChild(scriptElement); + scriptElement = null; + }; + root.document.documentElement.appendChild(scriptElement); + }; + + } else { + scheduleMethod = function (action) { return setTimeout(action, 0); }; + clearMethod = clearTimeout; + } + }()); + + /** + * Gets a scheduler that schedules work via a timed callback based upon platform. + */ + var timeoutScheduler = Scheduler.timeout = (function () { + + function scheduleNow(state, action) { + var scheduler = this, + disposable = new SingleAssignmentDisposable(); + var id = scheduleMethod(function () { + if (!disposable.isDisposed) { + disposable.setDisposable(action(scheduler, state)); + } + }); + return new CompositeDisposable(disposable, disposableCreate(function () { + clearMethod(id); + })); + } + + function scheduleRelative(state, dueTime, action) { + var scheduler = this, + dt = Scheduler.normalize(dueTime); + if (dt === 0) { + return scheduler.scheduleWithState(state, action); + } + var disposable = new SingleAssignmentDisposable(); + var id = setTimeout(function () { + if (!disposable.isDisposed) { + disposable.setDisposable(action(scheduler, state)); + } + }, dt); + return new CompositeDisposable(disposable, disposableCreate(function () { + clearTimeout(id); + })); + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); + } + + return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); + })(); + + /** @private */ + var CatchScheduler = (function (_super) { + + function localNow() { + return this._scheduler.now(); + } + + function scheduleNow(state, action) { + return this._scheduler.scheduleWithState(state, this._wrap(action)); + } + + function scheduleRelative(state, dueTime, action) { + return this._scheduler.scheduleWithRelativeAndState(state, dueTime, this._wrap(action)); + } + + function scheduleAbsolute(state, dueTime, action) { + return this._scheduler.scheduleWithAbsoluteAndState(state, dueTime, this._wrap(action)); + } + + inherits(CatchScheduler, _super); + + /** @private */ + function CatchScheduler(scheduler, handler) { + this._scheduler = scheduler; + this._handler = handler; + this._recursiveOriginal = null; + this._recursiveWrapper = null; + _super.call(this, localNow, scheduleNow, scheduleRelative, scheduleAbsolute); + } + + /** @private */ + CatchScheduler.prototype._clone = function (scheduler) { + return new CatchScheduler(scheduler, this._handler); + }; + + /** @private */ + CatchScheduler.prototype._wrap = function (action) { + var parent = this; + return function (self, state) { + try { + return action(parent._getRecursiveWrapper(self), state); + } catch (e) { + if (!parent._handler(e)) { throw e; } + return disposableEmpty; + } + }; + }; + + /** @private */ + CatchScheduler.prototype._getRecursiveWrapper = function (scheduler) { + if (this._recursiveOriginal !== scheduler) { + this._recursiveOriginal = scheduler; + var wrapper = this._clone(scheduler); + wrapper._recursiveOriginal = scheduler; + wrapper._recursiveWrapper = wrapper; + this._recursiveWrapper = wrapper; + } + return this._recursiveWrapper; + }; + + /** @private */ + CatchScheduler.prototype.schedulePeriodicWithState = function (state, period, action) { + var self = this, failed = false, d = new SingleAssignmentDisposable(); + + d.setDisposable(this._scheduler.schedulePeriodicWithState(state, period, function (state1) { + if (failed) { return null; } + try { + return action(state1); + } catch (e) { + failed = true; + if (!self._handler(e)) { throw e; } + d.dispose(); + return null; + } + })); + + return d; + }; + + return CatchScheduler; + }(Scheduler)); + + /** + * Represents a notification to an observer. + */ + var Notification = Rx.Notification = (function () { + function Notification(kind, hasValue) { + this.hasValue = hasValue == null ? false : hasValue; + this.kind = kind; + } + + var NotificationPrototype = Notification.prototype; + + /** + * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result. + * + * @memberOf Notification + * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on.. + * @param {Function} onError Delegate to invoke for an OnError notification. + * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification. + * @returns {Any} Result produced by the observation. + */ + NotificationPrototype.accept = function (observerOrOnNext, onError, onCompleted) { + if (arguments.length === 1 && typeof observerOrOnNext === 'object') { + return this._acceptObservable(observerOrOnNext); + } + return this._accept(observerOrOnNext, onError, onCompleted); + }; + + /** + * Returns an observable sequence with a single notification. + * + * @memberOf Notification + * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on. + * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription. + */ + NotificationPrototype.toObservable = function (scheduler) { + var notification = this; + scheduler || (scheduler = immediateScheduler); + return new AnonymousObservable(function (observer) { + return scheduler.schedule(function () { + notification._acceptObservable(observer); + if (notification.kind === 'N') { + observer.onCompleted(); + } + }); + }); + }; + + return Notification; + })(); + + /** + * Creates an object that represents an OnNext notification to an observer. + * @param {Any} value The value contained in the notification. + * @returns {Notification} The OnNext notification containing the value. + */ + var notificationCreateOnNext = Notification.createOnNext = (function () { + + function _accept (onNext) { + return onNext(this.value); + } + + function _acceptObservable(observer) { + return observer.onNext(this.value); + } + + function toString () { + return 'OnNext(' + this.value + ')'; + } + + return function (value) { + var notification = new Notification('N', true); + notification.value = value; + notification._accept = _accept; + notification._acceptObservable = _acceptObservable; + notification.toString = toString; + return notification; + }; + }()); + + /** + * Creates an object that represents an OnError notification to an observer. + * @param {Any} error The exception contained in the notification. + * @returns {Notification} The OnError notification containing the exception. + */ + var notificationCreateOnError = Notification.createOnError = (function () { + + function _accept (onNext, onError) { + return onError(this.exception); + } + + function _acceptObservable(observer) { + return observer.onError(this.exception); + } + + function toString () { + return 'OnError(' + this.exception + ')'; + } + + return function (exception) { + var notification = new Notification('E'); + notification.exception = exception; + notification._accept = _accept; + notification._acceptObservable = _acceptObservable; + notification.toString = toString; + return notification; + }; + }()); + + /** + * Creates an object that represents an OnCompleted notification to an observer. + * @returns {Notification} The OnCompleted notification. + */ + var notificationCreateOnCompleted = Notification.createOnCompleted = (function () { + + function _accept (onNext, onError, onCompleted) { + return onCompleted(); + } + + function _acceptObservable(observer) { + return observer.onCompleted(); + } + + function toString () { + return 'OnCompleted()'; + } + + return function () { + var notification = new Notification('C'); + notification._accept = _accept; + notification._acceptObservable = _acceptObservable; + notification.toString = toString; + return notification; + }; + }()); + + var Enumerator = Rx.internals.Enumerator = function (next) { + this._next = next; + }; + + Enumerator.prototype.next = function () { + return this._next(); + }; + + Enumerator.prototype[$iterator$] = function () { return this; } + + var Enumerable = Rx.internals.Enumerable = function (iterator) { + this._iterator = iterator; + }; + + Enumerable.prototype[$iterator$] = function () { + return this._iterator(); + }; + + Enumerable.prototype.concat = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var e; + try { + e = sources[$iterator$](); + } catch(err) { + observer.onError(); + return; + } + + var isDisposed, + subscription = new SerialDisposable(); + var cancelable = immediateScheduler.scheduleRecursive(function (self) { + var currentItem; + if (isDisposed) { return; } + + try { + currentItem = e.next(); + } catch (ex) { + observer.onError(ex); + return; + } + + if (currentItem.done) { + observer.onCompleted(); + return; + } + + // Check if promise + var currentValue = currentItem.value; + isPromise(currentValue) && (currentValue = observableFromPromise(currentValue)); + + var d = new SingleAssignmentDisposable(); + subscription.setDisposable(d); + d.setDisposable(currentValue.subscribe( + observer.onNext.bind(observer), + observer.onError.bind(observer), + function () { self(); }) + ); + }); + + return new CompositeDisposable(subscription, cancelable, disposableCreate(function () { + isDisposed = true; + })); + }); + }; + + Enumerable.prototype.catchException = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var e; + try { + e = sources[$iterator$](); + } catch(err) { + observer.onError(); + return; + } + + var isDisposed, + lastException, + subscription = new SerialDisposable(); + var cancelable = immediateScheduler.scheduleRecursive(function (self) { + if (isDisposed) { return; } + + var currentItem; + try { + currentItem = e.next(); + } catch (ex) { + observer.onError(ex); + return; + } + + if (currentItem.done) { + if (lastException) { + observer.onError(lastException); + } else { + observer.onCompleted(); + } + return; + } + + // Check if promise + var currentValue = currentItem.value; + isPromise(currentValue) && (currentValue = observableFromPromise(currentValue)); + + var d = new SingleAssignmentDisposable(); + subscription.setDisposable(d); + d.setDisposable(currentValue.subscribe( + observer.onNext.bind(observer), + function (exn) { + lastException = exn; + self(); + }, + observer.onCompleted.bind(observer))); + }); + return new CompositeDisposable(subscription, cancelable, disposableCreate(function () { + isDisposed = true; + })); + }); + }; + + var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) { + if (repeatCount == null) { repeatCount = -1; } + return new Enumerable(function () { + var left = repeatCount; + return new Enumerator(function () { + if (left === 0) { return doneEnumerator; } + if (left > 0) { left--; } + return { done: false, value: value }; + }); + }); + }; + + var enumerableFor = Enumerable.forEach = function (source, selector, thisArg) { + selector || (selector = identity); + return new Enumerable(function () { + var index = -1; + return new Enumerator( + function () { + return ++index < source.length ? + { done: false, value: selector.call(thisArg, source[index], index, source) } : + doneEnumerator; + }); + }); + }; + + /** + * Supports push-style iteration over an observable sequence. + */ + var Observer = Rx.Observer = function () { }; + + /** + * Creates a notification callback from an observer. + * + * @param observer Observer object. + * @returns The action that forwards its input notification to the underlying observer. + */ + Observer.prototype.toNotifier = function () { + var observer = this; + return function (n) { + return n.accept(observer); + }; + }; + + /** + * Hides the identity of an observer. + + * @returns An observer that hides the identity of the specified observer. + */ + Observer.prototype.asObserver = function () { + return new AnonymousObserver(this.onNext.bind(this), this.onError.bind(this), this.onCompleted.bind(this)); + }; + + /** + * Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods. + * If a violation is detected, an Error is thrown from the offending observer method call. + * + * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer. + */ + Observer.prototype.checked = function () { return new CheckedObserver(this); }; + + /** + * Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions. + * + * @static + * @memberOf Observer + * @param {Function} [onNext] Observer's OnNext action implementation. + * @param {Function} [onError] Observer's OnError action implementation. + * @param {Function} [onCompleted] Observer's OnCompleted action implementation. + * @returns {Observer} The observer object implemented using the given actions. + */ + var observerCreate = Observer.create = function (onNext, onError, onCompleted) { + onNext || (onNext = noop); + onError || (onError = defaultError); + onCompleted || (onCompleted = noop); + return new AnonymousObserver(onNext, onError, onCompleted); + }; + + /** + * Creates an observer from a notification callback. + * + * @static + * @memberOf Observer + * @param {Function} handler Action that handles a notification. + * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives. + */ + Observer.fromNotifier = function (handler) { + return new AnonymousObserver(function (x) { + return handler(notificationCreateOnNext(x)); + }, function (exception) { + return handler(notificationCreateOnError(exception)); + }, function () { + return handler(notificationCreateOnCompleted()); + }); + }; + + /** + * Schedules the invocation of observer methods on the given scheduler. + * @param {Scheduler} scheduler Scheduler to schedule observer messages on. + * @returns {Observer} Observer whose messages are scheduled on the given scheduler. + */ + Observer.notifyOn = function (scheduler) { + return new ObserveOnObserver(scheduler, this); + }; + + /** + * Abstract base class for implementations of the Observer class. + * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages. + */ + var AbstractObserver = Rx.internals.AbstractObserver = (function (_super) { + inherits(AbstractObserver, _super); + + /** + * Creates a new observer in a non-stopped state. + * + * @constructor + */ + function AbstractObserver() { + this.isStopped = false; + _super.call(this); + } + + /** + * Notifies the observer of a new element in the sequence. + * + * @memberOf AbstractObserver + * @param {Any} value Next element in the sequence. + */ + AbstractObserver.prototype.onNext = function (value) { + if (!this.isStopped) { + this.next(value); + } + }; + + /** + * Notifies the observer that an exception has occurred. + * + * @memberOf AbstractObserver + * @param {Any} error The error that has occurred. + */ + AbstractObserver.prototype.onError = function (error) { + if (!this.isStopped) { + this.isStopped = true; + this.error(error); + } + }; + + /** + * Notifies the observer of the end of the sequence. + */ + AbstractObserver.prototype.onCompleted = function () { + if (!this.isStopped) { + this.isStopped = true; + this.completed(); + } + }; + + /** + * Disposes the observer, causing it to transition to the stopped state. + */ + AbstractObserver.prototype.dispose = function () { + this.isStopped = true; + }; + + AbstractObserver.prototype.fail = function (e) { + if (!this.isStopped) { + this.isStopped = true; + this.error(e); + return true; + } + + return false; + }; + + return AbstractObserver; + }(Observer)); + + /** + * Class to create an Observer instance from delegate-based implementations of the on* methods. + */ + var AnonymousObserver = Rx.AnonymousObserver = (function (_super) { + inherits(AnonymousObserver, _super); + + /** + * Creates an observer from the specified OnNext, OnError, and OnCompleted actions. + * @param {Any} onNext Observer's OnNext action implementation. + * @param {Any} onError Observer's OnError action implementation. + * @param {Any} onCompleted Observer's OnCompleted action implementation. + */ + function AnonymousObserver(onNext, onError, onCompleted) { + _super.call(this); + this._onNext = onNext; + this._onError = onError; + this._onCompleted = onCompleted; + } + + /** + * Calls the onNext action. + * @param {Any} value Next element in the sequence. + */ + AnonymousObserver.prototype.next = function (value) { + this._onNext(value); + }; + + /** + * Calls the onError action. + * @param {Any} error The error that has occurred. + */ + AnonymousObserver.prototype.error = function (exception) { + this._onError(exception); + }; + + /** + * Calls the onCompleted action. + */ + AnonymousObserver.prototype.completed = function () { + this._onCompleted(); + }; + + return AnonymousObserver; + }(AbstractObserver)); + + var CheckedObserver = (function (_super) { + inherits(CheckedObserver, _super); + + function CheckedObserver(observer) { + _super.call(this); + this._observer = observer; + this._state = 0; // 0 - idle, 1 - busy, 2 - done + } + + var CheckedObserverPrototype = CheckedObserver.prototype; + + CheckedObserverPrototype.onNext = function (value) { + this.checkAccess(); + try { + this._observer.onNext(value); + } catch (e) { + throw e; + } finally { + this._state = 0; + } + }; + + CheckedObserverPrototype.onError = function (err) { + this.checkAccess(); + try { + this._observer.onError(err); + } catch (e) { + throw e; + } finally { + this._state = 2; + } + }; + + CheckedObserverPrototype.onCompleted = function () { + this.checkAccess(); + try { + this._observer.onCompleted(); + } catch (e) { + throw e; + } finally { + this._state = 2; + } + }; + + CheckedObserverPrototype.checkAccess = function () { + if (this._state === 1) { throw new Error('Re-entrancy detected'); } + if (this._state === 2) { throw new Error('Observer completed'); } + if (this._state === 0) { this._state = 1; } + }; + + return CheckedObserver; + }(Observer)); + + var ScheduledObserver = Rx.internals.ScheduledObserver = (function (_super) { + inherits(ScheduledObserver, _super); + + function ScheduledObserver(scheduler, observer) { + _super.call(this); + this.scheduler = scheduler; + this.observer = observer; + this.isAcquired = false; + this.hasFaulted = false; + this.queue = []; + this.disposable = new SerialDisposable(); + } + + ScheduledObserver.prototype.next = function (value) { + var self = this; + this.queue.push(function () { + self.observer.onNext(value); + }); + }; + + ScheduledObserver.prototype.error = function (exception) { + var self = this; + this.queue.push(function () { + self.observer.onError(exception); + }); + }; + + ScheduledObserver.prototype.completed = function () { + var self = this; + this.queue.push(function () { + self.observer.onCompleted(); + }); + }; + + ScheduledObserver.prototype.ensureActive = function () { + var isOwner = false, parent = this; + if (!this.hasFaulted && this.queue.length > 0) { + isOwner = !this.isAcquired; + this.isAcquired = true; + } + if (isOwner) { + this.disposable.setDisposable(this.scheduler.scheduleRecursive(function (self) { + var work; + if (parent.queue.length > 0) { + work = parent.queue.shift(); + } else { + parent.isAcquired = false; + return; + } + try { + work(); + } catch (ex) { + parent.queue = []; + parent.hasFaulted = true; + throw ex; + } + self(); + })); + } + }; + + ScheduledObserver.prototype.dispose = function () { + _super.prototype.dispose.call(this); + this.disposable.dispose(); + }; + + return ScheduledObserver; + }(AbstractObserver)); + + /** @private */ + var ObserveOnObserver = (function (_super) { + inherits(ObserveOnObserver, _super); + + /** @private */ + function ObserveOnObserver() { + _super.apply(this, arguments); + } + + /** @private */ + ObserveOnObserver.prototype.next = function (value) { + _super.prototype.next.call(this, value); + this.ensureActive(); + }; + + /** @private */ + ObserveOnObserver.prototype.error = function (e) { + _super.prototype.error.call(this, e); + this.ensureActive(); + }; + + /** @private */ + ObserveOnObserver.prototype.completed = function () { + _super.prototype.completed.call(this); + this.ensureActive(); + }; + + return ObserveOnObserver; + })(ScheduledObserver); + + var observableProto; + + /** + * Represents a push-style collection. + */ + var Observable = Rx.Observable = (function () { + + function Observable(subscribe) { + this._subscribe = subscribe; + } + + observableProto = Observable.prototype; + + /** + * Subscribes an observer to the observable sequence. + * + * @example + * 1 - source.subscribe(); + * 2 - source.subscribe(observer); + * 3 - source.subscribe(function (x) { console.log(x); }); + * 4 - source.subscribe(function (x) { console.log(x); }, function (err) { console.log(err); }); + * 5 - source.subscribe(function (x) { console.log(x); }, function (err) { console.log(err); }, function () { console.log('done'); }); + * @param {Mixed} [observerOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence. + * @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence. + * @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence. + * @returns {Diposable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler. + */ + observableProto.subscribe = observableProto.forEach = function (observerOrOnNext, onError, onCompleted) { + var subscriber = typeof observerOrOnNext === 'object' ? + observerOrOnNext : + observerCreate(observerOrOnNext, onError, onCompleted); + + return this._subscribe(subscriber); + }; + + return Observable; + })(); + + /** + * Wraps the source sequence in order to run its observer callbacks on the specified scheduler. + * + * This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects + * that require to be run on a scheduler, use subscribeOn. + * + * @param {Scheduler} scheduler Scheduler to notify observers on. + * @returns {Observable} The source sequence whose observations happen on the specified scheduler. + */ + observableProto.observeOn = function (scheduler) { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(new ObserveOnObserver(scheduler, observer)); + }); + }; + + /** + * Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used; + * see the remarks section for more information on the distinction between subscribeOn and observeOn. + + * This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer + * callbacks on a scheduler, use observeOn. + + * @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on. + * @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler. + */ + observableProto.subscribeOn = function (scheduler) { + var source = this; + return new AnonymousObservable(function (observer) { + var m = new SingleAssignmentDisposable(), d = new SerialDisposable(); + d.setDisposable(m); + m.setDisposable(scheduler.schedule(function () { + d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(observer))); + })); + return d; + }); + }; + + /** + * Converts a Promise to an Observable sequence + * @param {Promise} An ES6 Compliant promise. + * @returns {Observable} An Observable sequence which wraps the existing promise success and failure. + */ + var observableFromPromise = Observable.fromPromise = function (promise) { + return new AnonymousObservable(function (observer) { + promise.then( + function (value) { + observer.onNext(value); + observer.onCompleted(); + }, + function (reason) { + observer.onError(reason); + }); + + return function () { + if (promise && promise.abort) { + promise.abort(); + } + } + }); + }; + /* + * Converts an existing observable sequence to an ES6 Compatible Promise + * @example + * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise); + * + * // With config + * Rx.config.Promise = RSVP.Promise; + * var promise = Rx.Observable.return(42).toPromise(); + * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise. + * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence. + */ + observableProto.toPromise = function (promiseCtor) { + promiseCtor || (promiseCtor = Rx.config.Promise); + if (!promiseCtor) { + throw new Error('Promise type not provided nor in Rx.config.Promise'); + } + var source = this; + return new promiseCtor(function (resolve, reject) { + // No cancellation can be done + var value, hasValue = false; + source.subscribe(function (v) { + value = v; + hasValue = true; + }, function (err) { + reject(err); + }, function () { + if (hasValue) { + resolve(value); + } + }); + }); + }; + /** + * Creates a list from an observable sequence. + * @returns An observable sequence containing a single element with a list containing all the elements of the source sequence. + */ + observableProto.toArray = function () { + var self = this; + return new AnonymousObservable(function(observer) { + var arr = []; + return self.subscribe( + arr.push.bind(arr), + observer.onError.bind(observer), + function () { + observer.onNext(arr); + observer.onCompleted(); + }); + }); + }; + + /** + * Creates an observable sequence from a specified subscribe method implementation. + * + * @example + * var res = Rx.Observable.create(function (observer) { return function () { } ); + * var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } ); + * var res = Rx.Observable.create(function (observer) { } ); + * + * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable. + * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method. + */ + Observable.create = Observable.createWithDisposable = function (subscribe) { + return new AnonymousObservable(subscribe); + }; + + /** + * Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes. + * + * @example + * var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); }); + * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise. + * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function. + */ + var observableDefer = Observable.defer = function (observableFactory) { + return new AnonymousObservable(function (observer) { + var result; + try { + result = observableFactory(); + } catch (e) { + return observableThrow(e).subscribe(observer); + } + isPromise(result) && (result = observableFromPromise(result)); + return result.subscribe(observer); + }); + }; + + /** + * Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message. + * + * @example + * var res = Rx.Observable.empty(); + * var res = Rx.Observable.empty(Rx.Scheduler.timeout); + * @param {Scheduler} [scheduler] Scheduler to send the termination call on. + * @returns {Observable} An observable sequence with no elements. + */ + var observableEmpty = Observable.empty = function (scheduler) { + scheduler || (scheduler = immediateScheduler); + return new AnonymousObservable(function (observer) { + return scheduler.schedule(function () { + observer.onCompleted(); + }); + }); + }; + + /** + * Converts an array to an observable sequence, using an optional scheduler to enumerate the array. + * + * @example + * var res = Rx.Observable.fromArray([1,2,3]); + * var res = Rx.Observable.fromArray([1,2,3], Rx.Scheduler.timeout); + * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on. + * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence. + */ + var observableFromArray = Observable.fromArray = function (array, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + return new AnonymousObservable(function (observer) { + var count = 0, len = array.length; + return scheduler.scheduleRecursive(function (self) { + if (count < len) { + observer.onNext(array[count++]); + self(); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * Converts an iterable into an Observable sequence + * + * @example + * var res = Rx.Observable.fromIterable(new Map()); + * var res = Rx.Observable.fromIterable(new Set(), Rx.Scheduler.timeout); + * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on. + * @returns {Observable} The observable sequence whose elements are pulled from the given generator sequence. + */ + Observable.fromIterable = function (iterable, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + return new AnonymousObservable(function (observer) { + var iterator; + try { + iterator = iterable[$iterator$](); + } catch (e) { + observer.onError(e); + return; + } + + return scheduler.scheduleRecursive(function (self) { + var next; + try { + next = iterator.next(); + } catch (err) { + observer.onError(err); + return; + } + + if (next.done) { + observer.onCompleted(); + } else { + observer.onNext(next.value); + self(); + } + }); + }); + }; + + /** + * Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages. + * + * @example + * var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }); + * var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout); + * @param {Mixed} initialState Initial state. + * @param {Function} condition Condition to terminate generation (upon returning false). + * @param {Function} iterate Iteration step function. + * @param {Function} resultSelector Selector function for results produced in the sequence. + * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread. + * @returns {Observable} The generated sequence. + */ + Observable.generate = function (initialState, condition, iterate, resultSelector, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + return new AnonymousObservable(function (observer) { + var first = true, state = initialState; + return scheduler.scheduleRecursive(function (self) { + var hasResult, result; + try { + if (first) { + first = false; + } else { + state = iterate(state); + } + hasResult = condition(state); + if (hasResult) { + result = resultSelector(state); + } + } catch (exception) { + observer.onError(exception); + return; + } + if (hasResult) { + observer.onNext(result); + self(); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins). + * @returns {Observable} An observable sequence whose observers will never get called. + */ + var observableNever = Observable.never = function () { + return new AnonymousObservable(function () { + return disposableEmpty; + }); + }; + + /** + * This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments. + * @example + * var res = Rx.Observable.of(1,2,3); + * @returns {Observable} The observable sequence whose elements are pulled from the given arguments. + */ + Observable.of = function () { + var len = arguments.length, args = new Array(len); + for(var i = 0; i < len; i++) { args[i] = arguments[i]; } + return observableFromArray(args); + }; + + /** + * This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments. + * @example + * var res = Rx.Observable.of(1,2,3); + * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments. + * @returns {Observable} The observable sequence whose elements are pulled from the given arguments. + */ + var observableOf = Observable.ofWithScheduler = function (scheduler) { + var len = arguments.length - 1, args = new Array(len); + for(var i = 0; i < len; i++) { args[i] = arguments[i + 1]; } + return observableFromArray(args, scheduler); + }; + + /** + * Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages. + * + * @example + * var res = Rx.Observable.range(0, 10); + * var res = Rx.Observable.range(0, 10, Rx.Scheduler.timeout); + * @param {Number} start The value of the first integer in the sequence. + * @param {Number} count The number of sequential integers to generate. + * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread. + * @returns {Observable} An observable sequence that contains a range of sequential integral numbers. + */ + Observable.range = function (start, count, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + return new AnonymousObservable(function (observer) { + return scheduler.scheduleRecursiveWithState(0, function (i, self) { + if (i < count) { + observer.onNext(start + i); + self(i + 1); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages. + * + * @example + * var res = Rx.Observable.repeat(42); + * var res = Rx.Observable.repeat(42, 4); + * 3 - res = Rx.Observable.repeat(42, 4, Rx.Scheduler.timeout); + * 4 - res = Rx.Observable.repeat(42, null, Rx.Scheduler.timeout); + * @param {Mixed} value Element to repeat. + * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely. + * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate. + * @returns {Observable} An observable sequence that repeats the given element the specified number of times. + */ + Observable.repeat = function (value, repeatCount, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + if (repeatCount == null) { + repeatCount = -1; + } + return observableReturn(value, scheduler).repeat(repeatCount); + }; + + /** + * Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages. + * There is an alias called 'just', and 'returnValue' for browsers 0) { + s = q.shift(); + subscribe(s); + } else { + activeCount--; + if (isStopped && activeCount === 0) { + observer.onCompleted(); + } + } + })); + }; + group.add(sources.subscribe(function (innerSource) { + if (activeCount < maxConcurrentOrOther) { + activeCount++; + subscribe(innerSource); + } else { + q.push(innerSource); + } + }, observer.onError.bind(observer), function () { + isStopped = true; + if (activeCount === 0) { + observer.onCompleted(); + } + })); + return group; + }); + }; + + /** + * Merges all the observable sequences into a single observable sequence. + * The scheduler is optional and if not specified, the immediate scheduler is used. + * + * @example + * 1 - merged = Rx.Observable.merge(xs, ys, zs); + * 2 - merged = Rx.Observable.merge([xs, ys, zs]); + * 3 - merged = Rx.Observable.merge(scheduler, xs, ys, zs); + * 4 - merged = Rx.Observable.merge(scheduler, [xs, ys, zs]); + * @returns {Observable} The observable sequence that merges the elements of the observable sequences. + */ + var observableMerge = Observable.merge = function () { + var scheduler, sources; + if (!arguments[0]) { + scheduler = immediateScheduler; + sources = slice.call(arguments, 1); + } else if (arguments[0].now) { + scheduler = arguments[0]; + sources = slice.call(arguments, 1); + } else { + scheduler = immediateScheduler; + sources = slice.call(arguments, 0); + } + if (Array.isArray(sources[0])) { + sources = sources[0]; + } + return observableFromArray(sources, scheduler).mergeObservable(); + }; + + /** + * Merges an observable sequence of observable sequences into an observable sequence. + * @returns {Observable} The observable sequence that merges the elements of the inner sequences. + */ + observableProto.mergeObservable = observableProto.mergeAll =function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var group = new CompositeDisposable(), + isStopped = false, + m = new SingleAssignmentDisposable(); + + group.add(m); + m.setDisposable(sources.subscribe(function (innerSource) { + var innerSubscription = new SingleAssignmentDisposable(); + group.add(innerSubscription); + + // Check if Promise or Observable + if (isPromise(innerSource)) { + innerSource = observableFromPromise(innerSource); + } + + innerSubscription.setDisposable(innerSource.subscribe(function (x) { + observer.onNext(x); + }, observer.onError.bind(observer), function () { + group.remove(innerSubscription); + if (isStopped && group.length === 1) { observer.onCompleted(); } + })); + }, observer.onError.bind(observer), function () { + isStopped = true; + if (group.length === 1) { observer.onCompleted(); } + })); + return group; + }); + }; + + /** + * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence. + * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates. + * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally. + */ + observableProto.onErrorResumeNext = function (second) { + if (!second) { + throw new Error('Second observable is required'); + } + return onErrorResumeNext([this, second]); + }; + + /** + * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence. + * + * @example + * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs); + * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]); + * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally. + */ + var onErrorResumeNext = Observable.onErrorResumeNext = function () { + var sources = argsOrArray(arguments, 0); + return new AnonymousObservable(function (observer) { + var pos = 0, subscription = new SerialDisposable(), + cancelable = immediateScheduler.scheduleRecursive(function (self) { + var current, d; + if (pos < sources.length) { + current = sources[pos++]; + isPromise(current) && (current = observableFromPromise(current)); + d = new SingleAssignmentDisposable(); + subscription.setDisposable(d); + d.setDisposable(current.subscribe(observer.onNext.bind(observer), function () { + self(); + }, function () { + self(); + })); + } else { + observer.onCompleted(); + } + }); + return new CompositeDisposable(subscription, cancelable); + }); + }; + + /** + * Returns the values from the source observable sequence only after the other observable sequence produces a value. + * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence. + * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation. + */ + observableProto.skipUntil = function (other) { + var source = this; + return new AnonymousObservable(function (observer) { + var isOpen = false; + var disposables = new CompositeDisposable(source.subscribe(function (left) { + isOpen && observer.onNext(left); + }, observer.onError.bind(observer), function () { + isOpen && observer.onCompleted(); + })); + + isPromise(other) && (other = observableFromPromise(other)); + + var rightSubscription = new SingleAssignmentDisposable(); + disposables.add(rightSubscription); + rightSubscription.setDisposable(other.subscribe(function () { + isOpen = true; + rightSubscription.dispose(); + }, observer.onError.bind(observer), function () { + rightSubscription.dispose(); + })); + + return disposables; + }); + }; + + /** + * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence. + * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received. + */ + observableProto['switch'] = observableProto.switchLatest = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var hasLatest = false, + innerSubscription = new SerialDisposable(), + isStopped = false, + latest = 0, + subscription = sources.subscribe(function (innerSource) { + var d = new SingleAssignmentDisposable(), id = ++latest; + hasLatest = true; + innerSubscription.setDisposable(d); + + // Check if Promise or Observable + if (isPromise(innerSource)) { + innerSource = observableFromPromise(innerSource); + } + + d.setDisposable(innerSource.subscribe(function (x) { + if (latest === id) { + observer.onNext(x); + } + }, function (e) { + if (latest === id) { + observer.onError(e); + } + }, function () { + if (latest === id) { + hasLatest = false; + if (isStopped) { + observer.onCompleted(); + } + } + })); + }, observer.onError.bind(observer), function () { + isStopped = true; + if (!hasLatest) { + observer.onCompleted(); + } + }); + return new CompositeDisposable(subscription, innerSubscription); + }); + }; + + /** + * Returns the values from the source observable sequence until the other observable sequence produces a value. + * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence. + * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation. + */ + observableProto.takeUntil = function (other) { + var source = this; + return new AnonymousObservable(function (observer) { + isPromise(other) && (other = observableFromPromise(other)); + return new CompositeDisposable( + source.subscribe(observer), + other.subscribe(observer.onCompleted.bind(observer), observer.onError.bind(observer), noop) + ); + }); + }; + + function zipArray(second, resultSelector) { + var first = this; + return new AnonymousObservable(function (observer) { + var index = 0, len = second.length; + return first.subscribe(function (left) { + if (index < len) { + var right = second[index++], result; + try { + result = resultSelector(left, right); + } catch (e) { + observer.onError(e); + return; + } + observer.onNext(result); + } else { + observer.onCompleted(); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + } + + /** + * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index. + * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the sources. + * + * @example + * 1 - res = obs1.zip(obs2, fn); + * 1 - res = x1.zip([1,2,3], fn); + * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + observableProto.zip = function () { + if (Array.isArray(arguments[0])) { + return zipArray.apply(this, arguments); + } + var parent = this, sources = slice.call(arguments), resultSelector = sources.pop(); + sources.unshift(parent); + return new AnonymousObservable(function (observer) { + var n = sources.length, + queues = arrayInitialize(n, function () { return []; }), + isDone = arrayInitialize(n, function () { return false; }); + + function next(i) { + var res, queuedValues; + if (queues.every(function (x) { return x.length > 0; })) { + try { + queuedValues = queues.map(function (x) { return x.shift(); }); + res = resultSelector.apply(parent, queuedValues); + } catch (ex) { + observer.onError(ex); + return; + } + observer.onNext(res); + } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) { + observer.onCompleted(); + } + }; + + function done(i) { + isDone[i] = true; + if (isDone.every(function (x) { return x; })) { + observer.onCompleted(); + } + } + + var subscriptions = new Array(n); + for (var idx = 0; idx < n; idx++) { + (function (i) { + var source = sources[i], sad = new SingleAssignmentDisposable(); + isPromise(source) && (source = observableFromPromise(source)); + sad.setDisposable(source.subscribe(function (x) { + queues[i].push(x); + next(i); + }, observer.onError.bind(observer), function () { + done(i); + })); + subscriptions[i] = sad; + })(idx); + } + + return new CompositeDisposable(subscriptions); + }); + }; + /** + * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. + * @param arguments Observable sources. + * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources. + * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + Observable.zip = function () { + var args = slice.call(arguments, 0), + first = args.shift(); + return first.zip.apply(first, args); + }; + + /** + * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes. + * @param arguments Observable sources. + * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes. + */ + Observable.zipArray = function () { + var sources = argsOrArray(arguments, 0); + return new AnonymousObservable(function (observer) { + var n = sources.length, + queues = arrayInitialize(n, function () { return []; }), + isDone = arrayInitialize(n, function () { return false; }); + + function next(i) { + if (queues.every(function (x) { return x.length > 0; })) { + var res = queues.map(function (x) { return x.shift(); }); + observer.onNext(res); + } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) { + observer.onCompleted(); + return; + } + }; + + function done(i) { + isDone[i] = true; + if (isDone.every(identity)) { + observer.onCompleted(); + return; + } + } + + var subscriptions = new Array(n); + for (var idx = 0; idx < n; idx++) { + (function (i) { + subscriptions[i] = new SingleAssignmentDisposable(); + subscriptions[i].setDisposable(sources[i].subscribe(function (x) { + queues[i].push(x); + next(i); + }, observer.onError.bind(observer), function () { + done(i); + })); + })(idx); + } + + var compositeDisposable = new CompositeDisposable(subscriptions); + compositeDisposable.add(disposableCreate(function () { + for (var qIdx = 0, qLen = queues.length; qIdx < qLen; qIdx++) { + queues[qIdx] = []; + } + })); + return compositeDisposable; + }); + }; + + /** + * Hides the identity of an observable sequence. + * @returns {Observable} An observable sequence that hides the identity of the source sequence. + */ + observableProto.asObservable = function () { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(observer); + }); + }; + + /** + * Projects each element of an observable sequence into zero or more buffers which are produced based on element count information. + * + * @example + * var res = xs.bufferWithCount(10); + * var res = xs.bufferWithCount(10, 1); + * @param {Number} count Length of each buffer. + * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count. + * @returns {Observable} An observable sequence of buffers. + */ + observableProto.bufferWithCount = function (count, skip) { + if (typeof skip !== 'number') { + skip = count; + } + return this.windowWithCount(count, skip).selectMany(function (x) { + return x.toArray(); + }).where(function (x) { + return x.length > 0; + }); + }; + + /** + * Dematerializes the explicit notification values of an observable sequence as implicit notifications. + * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values. + */ + observableProto.dematerialize = function () { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(function (x) { + return x.accept(observer); + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer. + * + * var obs = observable.distinctUntilChanged(); + * var obs = observable.distinctUntilChanged(function (x) { return x.id; }); + * var obs = observable.distinctUntilChanged(function (x) { return x.id; }, function (x, y) { return x === y; }); + * + * @param {Function} [keySelector] A function to compute the comparison key for each element. If not provided, it projects the value. + * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function. + * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence. + */ + observableProto.distinctUntilChanged = function (keySelector, comparer) { + var source = this; + keySelector || (keySelector = identity); + comparer || (comparer = defaultComparer); + return new AnonymousObservable(function (observer) { + var hasCurrentKey = false, currentKey; + return source.subscribe(function (value) { + var comparerEquals = false, key; + try { + key = keySelector(value); + } catch (exception) { + observer.onError(exception); + return; + } + if (hasCurrentKey) { + try { + comparerEquals = comparer(currentKey, key); + } catch (exception) { + observer.onError(exception); + return; + } + } + if (!hasCurrentKey || !comparerEquals) { + hasCurrentKey = true; + currentKey = key; + observer.onNext(value); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence. + * This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline. + * + * @example + * var res = observable.doAction(observer); + * var res = observable.doAction(onNext); + * var res = observable.doAction(onNext, onError); + * var res = observable.doAction(onNext, onError, onCompleted); + * @param {Mixed} observerOrOnNext Action to invoke for each element in the observable sequence or an observer. + * @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function. + * @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function. + * @returns {Observable} The source sequence with the side-effecting behavior applied. + */ + observableProto['do'] = observableProto.doAction = function (observerOrOnNext, onError, onCompleted) { + var source = this, onNextFunc; + if (typeof observerOrOnNext === 'function') { + onNextFunc = observerOrOnNext; + } else { + onNextFunc = observerOrOnNext.onNext.bind(observerOrOnNext); + onError = observerOrOnNext.onError.bind(observerOrOnNext); + onCompleted = observerOrOnNext.onCompleted.bind(observerOrOnNext); + } + return new AnonymousObservable(function (observer) { + return source.subscribe(function (x) { + try { + onNextFunc(x); + } catch (e) { + observer.onError(e); + } + observer.onNext(x); + }, function (exception) { + if (!onError) { + observer.onError(exception); + } else { + try { + onError(exception); + } catch (e) { + observer.onError(e); + } + observer.onError(exception); + } + }, function () { + if (!onCompleted) { + observer.onCompleted(); + } else { + try { + onCompleted(); + } catch (e) { + observer.onError(e); + } + observer.onCompleted(); + } + }); + }); + }; + + /** + * Invokes a specified action after the source observable sequence terminates gracefully or exceptionally. + * + * @example + * var res = observable.finallyAction(function () { console.log('sequence ended'; }); + * @param {Function} finallyAction Action to invoke after the source observable sequence terminates. + * @returns {Observable} Source sequence with the action-invoking termination behavior applied. + */ + observableProto['finally'] = observableProto.finallyAction = function (action) { + var source = this; + return new AnonymousObservable(function (observer) { + var subscription; + try { + subscription = source.subscribe(observer); + } catch (e) { + action(); + throw e; + } + return disposableCreate(function () { + try { + subscription.dispose(); + } catch (e) { + throw e; + } finally { + action(); + } + }); + }); + }; + + /** + * Ignores all elements in an observable sequence leaving only the termination messages. + * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence. + */ + observableProto.ignoreElements = function () { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(noop, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Materializes the implicit notifications of an observable sequence as explicit notification values. + * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence. + */ + observableProto.materialize = function () { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(function (value) { + observer.onNext(notificationCreateOnNext(value)); + }, function (e) { + observer.onNext(notificationCreateOnError(e)); + observer.onCompleted(); + }, function () { + observer.onNext(notificationCreateOnCompleted()); + observer.onCompleted(); + }); + }); + }; + + /** + * Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely. + * + * @example + * var res = repeated = source.repeat(); + * var res = repeated = source.repeat(42); + * @param {Number} [repeatCount] Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely. + * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly. + */ + observableProto.repeat = function (repeatCount) { + return enumerableRepeat(this, repeatCount).concat(); + }; + + /** + * Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely. + * + * @example + * var res = retried = retry.repeat(); + * var res = retried = retry.repeat(42); + * @param {Number} [retryCount] Number of times to retry the sequence. If not provided, retry the sequence indefinitely. + * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully. + */ + observableProto.retry = function (retryCount) { + return enumerableRepeat(this, retryCount).catchException(); + }; + + /** + * Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value. + * For aggregation behavior with no intermediate results, see Observable.aggregate. + * @example + * var res = source.scan(function (acc, x) { return acc + x; }); + * var res = source.scan(0, function (acc, x) { return acc + x; }); + * @param {Mixed} [seed] The initial accumulator value. + * @param {Function} accumulator An accumulator function to be invoked on each element. + * @returns {Observable} An observable sequence containing the accumulated values. + */ + observableProto.scan = function () { + var hasSeed = false, seed, accumulator, source = this; + if (arguments.length === 2) { + hasSeed = true; + seed = arguments[0]; + accumulator = arguments[1]; + } else { + accumulator = arguments[0]; + } + return new AnonymousObservable(function (observer) { + var hasAccumulation, accumulation, hasValue; + return source.subscribe ( + function (x) { + try { + if (!hasValue) { + hasValue = true; + } + + if (hasAccumulation) { + accumulation = accumulator(accumulation, x); + } else { + accumulation = hasSeed ? accumulator(seed, x) : x; + hasAccumulation = true; + } + } catch (e) { + observer.onError(e); + return; + } + + observer.onNext(accumulation); + }, + observer.onError.bind(observer), + function () { + if (!hasValue && hasSeed) { + observer.onNext(seed); + } + observer.onCompleted(); + } + ); + }); + }; + + /** + * Bypasses a specified number of elements at the end of an observable sequence. + * @description + * This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are + * received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed. + * @param count Number of elements to bypass at the end of the source sequence. + * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end. + */ + observableProto.skipLast = function (count) { + var source = this; + return new AnonymousObservable(function (observer) { + var q = []; + return source.subscribe(function (x) { + q.push(x); + if (q.length > count) { + observer.onNext(q.shift()); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend. + * + * var res = source.startWith(1, 2, 3); + * var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3); + * + * @memberOf Observable# + * @returns {Observable} The source sequence prepended with the specified values. + */ + observableProto.startWith = function () { + var values, scheduler, start = 0; + if (!!arguments.length && 'now' in Object(arguments[0])) { + scheduler = arguments[0]; + start = 1; + } else { + scheduler = immediateScheduler; + } + values = slice.call(arguments, start); + return enumerableFor([observableFromArray(values, scheduler), this]).concat(); + }; + + /** + * Returns a specified number of contiguous elements from the end of an observable sequence, using an optional scheduler to drain the queue. + * + * @example + * var res = source.takeLast(5); + * var res = source.takeLast(5, Rx.Scheduler.timeout); + * + * @description + * This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of + * the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed. + * @param {Number} count Number of elements to take from the end of the source sequence. + * @param {Scheduler} [scheduler] Scheduler used to drain the queue upon completion of the source sequence. + * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence. + */ + observableProto.takeLast = function (count, scheduler) { + return this.takeLastBuffer(count).selectMany(function (xs) { return observableFromArray(xs, scheduler); }); + }; + + /** + * Returns an array with the specified number of contiguous elements from the end of an observable sequence. + * + * @description + * This operator accumulates a buffer with a length enough to store count elements. Upon completion of the + * source sequence, this buffer is produced on the result sequence. + * @param {Number} count Number of elements to take from the end of the source sequence. + * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence. + */ + observableProto.takeLastBuffer = function (count) { + var source = this; + return new AnonymousObservable(function (observer) { + var q = []; + return source.subscribe(function (x) { + q.push(x); + if (q.length > count) { + q.shift(); + } + }, observer.onError.bind(observer), function () { + observer.onNext(q); + observer.onCompleted(); + }); + }); + }; + + /** + * Projects each element of an observable sequence into zero or more windows which are produced based on element count information. + * + * var res = xs.windowWithCount(10); + * var res = xs.windowWithCount(10, 1); + * @param {Number} count Length of each window. + * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count. + * @returns {Observable} An observable sequence of windows. + */ + observableProto.windowWithCount = function (count, skip) { + var source = this; + if (count <= 0) { + throw new Error(argumentOutOfRange); + } + if (arguments.length === 1) { + skip = count; + } + if (skip <= 0) { + throw new Error(argumentOutOfRange); + } + return new AnonymousObservable(function (observer) { + var m = new SingleAssignmentDisposable(), + refCountDisposable = new RefCountDisposable(m), + n = 0, + q = [], + createWindow = function () { + var s = new Subject(); + q.push(s); + observer.onNext(addRef(s, refCountDisposable)); + }; + createWindow(); + m.setDisposable(source.subscribe(function (x) { + var s; + for (var i = 0, len = q.length; i < len; i++) { + q[i].onNext(x); + } + var c = n - count + 1; + if (c >= 0 && c % skip === 0) { + s = q.shift(); + s.onCompleted(); + } + n++; + if (n % skip === 0) { + createWindow(); + } + }, function (exception) { + while (q.length > 0) { + q.shift().onError(exception); + } + observer.onError(exception); + }, function () { + while (q.length > 0) { + q.shift().onCompleted(); + } + observer.onCompleted(); + })); + return refCountDisposable; + }); + }; + + function concatMap(selector) { + return this.map(function (x, i) { + var result = selector(x, i); + return isPromise(result) ? observableFromPromise(result) : result; + }).concatAll(); + } + + function concatMapObserver(onNext, onError, onCompleted) { + var source = this; + return new AnonymousObservable(function (observer) { + var index = 0; + + return source.subscribe( + function (x) { + observer.onNext(onNext(x, index++)); + }, + function (err) { + observer.onNext(onError(err)); + observer.completed(); + }, + function () { + observer.onNext(onCompleted()); + observer.onCompleted(); + }); + }).concatAll(); + } + + /** + * One of the Following: + * Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence. + * + * @example + * var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }); + * Or: + * Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence. + * + * var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; }); + * Or: + * Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence. + * + * var res = source.selectMany(Rx.Observable.fromArray([1,2,3])); + * @param selector A transform function to apply to each element or an observable sequence to project each element from the + * source sequence onto which could be either an observable or Promise. + * @param {Function} [resultSelector] A transform function to apply to each element of the intermediate sequence. + * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element. + */ + observableProto.selectConcat = observableProto.concatMap = function (selector, resultSelector) { + if (resultSelector) { + return this.concatMap(function (x, i) { + var selectorResult = selector(x, i), + result = isPromise(selectorResult) ? observableFromPromise(selectorResult) : selectorResult; + + return result.map(function (y) { + return resultSelector(x, y, i); + }); + }); + } + if (typeof selector === 'function') { + return concatMap.call(this, selector); + } + return concatMap.call(this, function () { + return selector; + }); + }; + + /** + * Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty. + * + * var res = obs = xs.defaultIfEmpty(); + * 2 - obs = xs.defaultIfEmpty(false); + * + * @memberOf Observable# + * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null. + * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself. + */ + observableProto.defaultIfEmpty = function (defaultValue) { + var source = this; + if (defaultValue === undefined) { + defaultValue = null; + } + return new AnonymousObservable(function (observer) { + var found = false; + return source.subscribe(function (x) { + found = true; + observer.onNext(x); + }, observer.onError.bind(observer), function () { + if (!found) { + observer.onNext(defaultValue); + } + observer.onCompleted(); + }); + }); + }; + + /** + * Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer. + * Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large. + * + * @example + * var res = obs = xs.distinct(); + * 2 - obs = xs.distinct(function (x) { return x.id; }); + * 2 - obs = xs.distinct(function (x) { return x.id; }, function (x) { return x.toString(); }); + * @param {Function} [keySelector] A function to compute the comparison key for each element. + * @param {Function} [keySerializer] Used to serialize the given object into a string for object comparison. + * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence. + */ + observableProto.distinct = function (keySelector, keySerializer) { + var source = this; + keySelector || (keySelector = identity); + keySerializer || (keySerializer = defaultKeySerializer); + return new AnonymousObservable(function (observer) { + var hashSet = {}; + return source.subscribe(function (x) { + var key, serializedKey, otherKey, hasMatch = false; + try { + key = keySelector(x); + serializedKey = keySerializer(key); + } catch (exception) { + observer.onError(exception); + return; + } + for (otherKey in hashSet) { + if (serializedKey === otherKey) { + hasMatch = true; + break; + } + } + if (!hasMatch) { + hashSet[serializedKey] = null; + observer.onNext(x); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function. + * + * @example + * var res = observable.groupBy(function (x) { return x.id; }); + * 2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }); + * 3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); }); + * @param {Function} keySelector A function to extract the key for each element. + * @param {Function} [elementSelector] A function to map each source element to an element in an observable group. + * @param {Function} [keySerializer] Used to serialize the given object into a string for object comparison. + * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value. + */ + observableProto.groupBy = function (keySelector, elementSelector, keySerializer) { + return this.groupByUntil(keySelector, elementSelector, function () { + return observableNever(); + }, keySerializer); + }; + + /** + * Groups the elements of an observable sequence according to a specified key selector function. + * A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same + * key value as a reclaimed group occurs, the group will be reborn with a new lifetime request. + * + * @example + * var res = observable.groupByUntil(function (x) { return x.id; }, null, function () { return Rx.Observable.never(); }); + * 2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function () { return Rx.Observable.never(); }); + * 3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function () { return Rx.Observable.never(); }, function (x) { return x.toString(); }); + * @param {Function} keySelector A function to extract the key for each element. + * @param {Function} durationSelector A function to signal the expiration of a group. + * @param {Function} [keySerializer] Used to serialize the given object into a string for object comparison. + * @returns {Observable} + * A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value. + * If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered. + * + */ + observableProto.groupByUntil = function (keySelector, elementSelector, durationSelector, keySerializer) { + var source = this; + elementSelector || (elementSelector = identity); + keySerializer || (keySerializer = defaultKeySerializer); + return new AnonymousObservable(function (observer) { + var map = {}, + groupDisposable = new CompositeDisposable(), + refCountDisposable = new RefCountDisposable(groupDisposable); + groupDisposable.add(source.subscribe(function (x) { + var duration, durationGroup, element, fireNewMapEntry, group, key, serializedKey, md, writer, w; + try { + key = keySelector(x); + serializedKey = keySerializer(key); + } catch (e) { + for (w in map) { + map[w].onError(e); + } + observer.onError(e); + return; + } + fireNewMapEntry = false; + try { + writer = map[serializedKey]; + if (!writer) { + writer = new Subject(); + map[serializedKey] = writer; + fireNewMapEntry = true; + } + } catch (e) { + for (w in map) { + map[w].onError(e); + } + observer.onError(e); + return; + } + if (fireNewMapEntry) { + group = new GroupedObservable(key, writer, refCountDisposable); + durationGroup = new GroupedObservable(key, writer); + try { + duration = durationSelector(durationGroup); + } catch (e) { + for (w in map) { + map[w].onError(e); + } + observer.onError(e); + return; + } + observer.onNext(group); + md = new SingleAssignmentDisposable(); + groupDisposable.add(md); + var expire = function () { + if (serializedKey in map) { + delete map[serializedKey]; + writer.onCompleted(); + } + groupDisposable.remove(md); + }; + md.setDisposable(duration.take(1).subscribe(noop, function (exn) { + for (w in map) { + map[w].onError(exn); + } + observer.onError(exn); + }, function () { + expire(); + })); + } + try { + element = elementSelector(x); + } catch (e) { + for (w in map) { + map[w].onError(e); + } + observer.onError(e); + return; + } + writer.onNext(element); + }, function (ex) { + for (var w in map) { + map[w].onError(ex); + } + observer.onError(ex); + }, function () { + for (var w in map) { + map[w].onCompleted(); + } + observer.onCompleted(); + })); + return refCountDisposable; + }); + }; + + /** + * Projects each element of an observable sequence into a new form by incorporating the element's index. + * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element. + * @param {Any} [thisArg] Object to use as this when executing callback. + * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source. + */ + observableProto.select = observableProto.map = function (selector, thisArg) { + var parent = this; + return new AnonymousObservable(function (observer) { + var count = 0; + return parent.subscribe(function (value) { + var result; + try { + result = selector.call(thisArg, value, count++, parent); + } catch (exception) { + observer.onError(exception); + return; + } + observer.onNext(result); + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Retrieves the value of a specified property from all elements in the Observable sequence. + * @param {String} property The property to pluck. + * @returns {Observable} Returns a new Observable sequence of property values. + */ + observableProto.pluck = function (property) { + return this.select(function (x) { return x[property]; }); + }; + + function selectMany(selector) { + return this.select(function (x, i) { + var result = selector(x, i); + return isPromise(result) ? observableFromPromise(result) : result; + }).mergeObservable(); + } + + function selectManyObserver(onNext, onError, onCompleted) { + var source = this; + return new AnonymousObservable(function (observer) { + var index = 0; + + return source.subscribe( + function (x) { + observer.onNext(onNext(x, index++)); + }, + function (err) { + observer.onNext(onError(err)); + observer.completed(); + }, + function () { + observer.onNext(onCompleted()); + observer.onCompleted(); + }); + }).mergeAll(); + } + + /** + * One of the Following: + * Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence. + * + * @example + * var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }); + * Or: + * Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence. + * + * var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; }); + * Or: + * Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence. + * + * var res = source.selectMany(Rx.Observable.fromArray([1,2,3])); + * @param selector A transform function to apply to each element or an observable sequence to project each element from the + * source sequence onto which could be either an observable or Promise. + * @param {Function} [resultSelector] A transform function to apply to each element of the intermediate sequence. + * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element. + */ + observableProto.selectMany = observableProto.flatMap = function (selector, resultSelector) { + if (resultSelector) { + return this.selectMany(function (x, i) { + var selectorResult = selector(x, i), + result = isPromise(selectorResult) ? observableFromPromise(selectorResult) : selectorResult; + + return result.select(function (y) { + return resultSelector(x, y, i); + }); + }); + } + if (typeof selector === 'function') { + return selectMany.call(this, selector); + } + return selectMany.call(this, function () { + return selector; + }); + }; + + /** + * Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then + * transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence. + * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element. + * @param {Any} [thisArg] Object to use as this when executing callback. + * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences + * and that at any point in time produces the elements of the most recent inner observable sequence that has been received. + */ + observableProto.selectSwitch = observableProto.flatMapLatest = observableProto.switchMap = function (selector, thisArg) { + return this.select(selector, thisArg).switchLatest(); + }; + + /** + * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements. + * @param {Number} count The number of elements to skip before returning the remaining elements. + * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence. + */ + observableProto.skip = function (count) { + if (count < 0) { + throw new Error(argumentOutOfRange); + } + var observable = this; + return new AnonymousObservable(function (observer) { + var remaining = count; + return observable.subscribe(function (x) { + if (remaining <= 0) { + observer.onNext(x); + } else { + remaining--; + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements. + * The element's index is used in the logic of the predicate function. + * + * var res = source.skipWhile(function (value) { return value < 10; }); + * var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; }); + * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element. + * @param {Any} [thisArg] Object to use as this when executing callback. + * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate. + */ + observableProto.skipWhile = function (predicate, thisArg) { + var source = this; + return new AnonymousObservable(function (observer) { + var i = 0, running = false; + return source.subscribe(function (x) { + if (!running) { + try { + running = !predicate.call(thisArg, x, i++, source); + } catch (e) { + observer.onError(e); + return; + } + } + if (running) { + observer.onNext(x); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0). + * + * var res = source.take(5); + * var res = source.take(0, Rx.Scheduler.timeout); + * @param {Number} count The number of elements to return. + * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case -1); + } + }); + } + } + stackA.pop(); + stackB.pop(); + + return result; + } + var slice = Array.prototype.slice; + function argsOrArray(args, idx) { + return args.length === 1 && Array.isArray(args[idx]) ? + args[idx] : + slice.call(args); + } + var hasProp = {}.hasOwnProperty; + + /** @private */ + var inherits = this.inherits = Rx.internals.inherits = function (child, parent) { + function __() { this.constructor = child; } + __.prototype = parent.prototype; + child.prototype = new __(); + }; + + /** @private */ + var addProperties = Rx.internals.addProperties = function (obj) { + var sources = slice.call(arguments, 1); + for (var i = 0, len = sources.length; i < len; i++) { + var source = sources[i]; + for (var prop in source) { + obj[prop] = source[prop]; + } + } + }; + + // Rx Utils + var addRef = Rx.internals.addRef = function (xs, r) { + return new AnonymousObservable(function (observer) { + return new CompositeDisposable(r.getDisposable(), xs.subscribe(observer)); + }); + }; + + // Collection polyfills + function arrayInitialize(count, factory) { + var a = new Array(count); + for (var i = 0; i < count; i++) { + a[i] = factory(); + } + return a; + } + + // Utilities + if (!Function.prototype.bind) { + Function.prototype.bind = function (that) { + var target = this, + args = slice.call(arguments, 1); + var bound = function () { + if (this instanceof bound) { + function F() { } + F.prototype = target.prototype; + var self = new F(); + var result = target.apply(self, args.concat(slice.call(arguments))); + if (Object(result) === result) { + return result; + } + return self; + } else { + return target.apply(that, args.concat(slice.call(arguments))); + } + }; + + return bound; + }; + } + + var boxedString = Object("a"), + splitString = boxedString[0] != "a" || !(0 in boxedString); + if (!Array.prototype.every) { + Array.prototype.every = function every(fun /*, thisp */) { + var object = Object(this), + self = splitString && {}.toString.call(this) == stringClass ? + this.split("") : + object, + length = self.length >>> 0, + thisp = arguments[1]; + + if ({}.toString.call(fun) != funcClass) { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self && !fun.call(thisp, self[i], i, object)) { + return false; + } + } + return true; + }; + } + + if (!Array.prototype.map) { + Array.prototype.map = function map(fun /*, thisp*/) { + var object = Object(this), + self = splitString && {}.toString.call(this) == stringClass ? + this.split("") : + object, + length = self.length >>> 0, + result = Array(length), + thisp = arguments[1]; + + if ({}.toString.call(fun) != funcClass) { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self) + result[i] = fun.call(thisp, self[i], i, object); + } + return result; + }; + } + + if (!Array.prototype.filter) { + Array.prototype.filter = function (predicate) { + var results = [], item, t = new Object(this); + for (var i = 0, len = t.length >>> 0; i < len; i++) { + item = t[i]; + if (i in t && predicate.call(arguments[1], item, i, t)) { + results.push(item); + } + } + return results; + }; + } + + if (!Array.isArray) { + Array.isArray = function (arg) { + return Object.prototype.toString.call(arg) == arrayClass; + }; + } + + if (!Array.prototype.indexOf) { + Array.prototype.indexOf = function indexOf(searchElement) { + var t = Object(this); + var len = t.length >>> 0; + if (len === 0) { + return -1; + } + var n = 0; + if (arguments.length > 1) { + n = Number(arguments[1]); + if (n !== n) { + n = 0; + } else if (n !== 0 && n != Infinity && n !== -Infinity) { + n = (n > 0 || -1) * Math.floor(Math.abs(n)); + } + } + if (n >= len) { + return -1; + } + var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); + for (; k < len; k++) { + if (k in t && t[k] === searchElement) { + return k; + } + } + return -1; + }; + } + + // Collections + var IndexedItem = function (id, value) { + this.id = id; + this.value = value; + }; + + IndexedItem.prototype.compareTo = function (other) { + var c = this.value.compareTo(other.value); + if (c === 0) { + c = this.id - other.id; + } + return c; + }; + + // Priority Queue for Scheduling + var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) { + this.items = new Array(capacity); + this.length = 0; + }; + + var priorityProto = PriorityQueue.prototype; + priorityProto.isHigherPriority = function (left, right) { + return this.items[left].compareTo(this.items[right]) < 0; + }; + + priorityProto.percolate = function (index) { + if (index >= this.length || index < 0) { + return; + } + var parent = index - 1 >> 1; + if (parent < 0 || parent === index) { + return; + } + if (this.isHigherPriority(index, parent)) { + var temp = this.items[index]; + this.items[index] = this.items[parent]; + this.items[parent] = temp; + this.percolate(parent); + } + }; + + priorityProto.heapify = function (index) { + if (index === undefined) { + index = 0; + } + if (index >= this.length || index < 0) { + return; + } + var left = 2 * index + 1, + right = 2 * index + 2, + first = index; + if (left < this.length && this.isHigherPriority(left, first)) { + first = left; + } + if (right < this.length && this.isHigherPriority(right, first)) { + first = right; + } + if (first !== index) { + var temp = this.items[index]; + this.items[index] = this.items[first]; + this.items[first] = temp; + this.heapify(first); + } + }; + + priorityProto.peek = function () { return this.items[0].value; }; + + priorityProto.removeAt = function (index) { + this.items[index] = this.items[--this.length]; + delete this.items[this.length]; + this.heapify(); + }; + + priorityProto.dequeue = function () { + var result = this.peek(); + this.removeAt(0); + return result; + }; + + priorityProto.enqueue = function (item) { + var index = this.length++; + this.items[index] = new IndexedItem(PriorityQueue.count++, item); + this.percolate(index); + }; + + priorityProto.remove = function (item) { + for (var i = 0; i < this.length; i++) { + if (this.items[i].value === item) { + this.removeAt(i); + return true; + } + } + return false; + }; + PriorityQueue.count = 0; + /** + * Represents a group of disposable resources that are disposed together. + * @constructor + */ + var CompositeDisposable = Rx.CompositeDisposable = function () { + this.disposables = argsOrArray(arguments, 0); + this.isDisposed = false; + this.length = this.disposables.length; + }; + + var CompositeDisposablePrototype = CompositeDisposable.prototype; + + /** + * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed. + * @param {Mixed} item Disposable to add. + */ + CompositeDisposablePrototype.add = function (item) { + if (this.isDisposed) { + item.dispose(); + } else { + this.disposables.push(item); + this.length++; + } + }; + + /** + * Removes and disposes the first occurrence of a disposable from the CompositeDisposable. + * @param {Mixed} item Disposable to remove. + * @returns {Boolean} true if found; false otherwise. + */ + CompositeDisposablePrototype.remove = function (item) { + var shouldDispose = false; + if (!this.isDisposed) { + var idx = this.disposables.indexOf(item); + if (idx !== -1) { + shouldDispose = true; + this.disposables.splice(idx, 1); + this.length--; + item.dispose(); + } + + } + return shouldDispose; + }; + + /** + * Disposes all disposables in the group and removes them from the group. + */ + CompositeDisposablePrototype.dispose = function () { + if (!this.isDisposed) { + this.isDisposed = true; + var currentDisposables = this.disposables.slice(0); + this.disposables = []; + this.length = 0; + + for (var i = 0, len = currentDisposables.length; i < len; i++) { + currentDisposables[i].dispose(); + } + } + }; + + /** + * Removes and disposes all disposables from the CompositeDisposable, but does not dispose the CompositeDisposable. + */ + CompositeDisposablePrototype.clear = function () { + var currentDisposables = this.disposables.slice(0); + this.disposables = []; + this.length = 0; + for (var i = 0, len = currentDisposables.length; i < len; i++) { + currentDisposables[i].dispose(); + } + }; + + /** + * Determines whether the CompositeDisposable contains a specific disposable. + * @param {Mixed} item Disposable to search for. + * @returns {Boolean} true if the disposable was found; otherwise, false. + */ + CompositeDisposablePrototype.contains = function (item) { + return this.disposables.indexOf(item) !== -1; + }; + + /** + * Converts the existing CompositeDisposable to an array of disposables + * @returns {Array} An array of disposable objects. + */ + CompositeDisposablePrototype.toArray = function () { + return this.disposables.slice(0); + }; + + /** + * Provides a set of static methods for creating Disposables. + * + * @constructor + * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once. + */ + var Disposable = Rx.Disposable = function (action) { + this.isDisposed = false; + this.action = action || noop; + }; + + /** Performs the task of cleaning up resources. */ + Disposable.prototype.dispose = function () { + if (!this.isDisposed) { + this.action(); + this.isDisposed = true; + } + }; + + /** + * Creates a disposable object that invokes the specified action when disposed. + * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once. + * @return {Disposable} The disposable object that runs the given action upon disposal. + */ + var disposableCreate = Disposable.create = function (action) { return new Disposable(action); }; + + /** + * Gets the disposable that does nothing when disposed. + */ + var disposableEmpty = Disposable.empty = { dispose: noop }; + + var BooleanDisposable = (function () { + function BooleanDisposable (isSingle) { + this.isSingle = isSingle; + this.isDisposed = false; + this.current = null; + } + + var booleanDisposablePrototype = BooleanDisposable.prototype; + + /** + * Gets the underlying disposable. + * @return The underlying disposable. + */ + booleanDisposablePrototype.getDisposable = function () { + return this.current; + }; + + /** + * Sets the underlying disposable. + * @param {Disposable} value The new underlying disposable. + */ + booleanDisposablePrototype.setDisposable = function (value) { + if (this.current && this.isSingle) { + throw new Error('Disposable has already been assigned'); + } + + var shouldDispose = this.isDisposed, old; + if (!shouldDispose) { + old = this.current; + this.current = value; + } + if (old) { + old.dispose(); + } + if (shouldDispose && value) { + value.dispose(); + } + }; + + /** + * Disposes the underlying disposable as well as all future replacements. + */ + booleanDisposablePrototype.dispose = function () { + var old; + if (!this.isDisposed) { + this.isDisposed = true; + old = this.current; + this.current = null; + } + if (old) { + old.dispose(); + } + }; + + return BooleanDisposable; + }()); + + /** + * Represents a disposable resource which only allows a single assignment of its underlying disposable resource. + * If an underlying disposable resource has already been set, future attempts to set the underlying disposable resource will throw an Error. + */ + var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = (function (super_) { + inherits(SingleAssignmentDisposable, super_); + + function SingleAssignmentDisposable() { + super_.call(this, true); + } + + return SingleAssignmentDisposable; + }(BooleanDisposable)); + + /** + * Represents a disposable resource whose underlying disposable resource can be replaced by another disposable resource, causing automatic disposal of the previous underlying disposable resource. + */ + var SerialDisposable = Rx.SerialDisposable = (function (super_) { + inherits(SerialDisposable, super_); + + function SerialDisposable() { + super_.call(this, false); + } + + return SerialDisposable; + }(BooleanDisposable)); + + /** + * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed. + */ + var RefCountDisposable = Rx.RefCountDisposable = (function () { + + function InnerDisposable(disposable) { + this.disposable = disposable; + this.disposable.count++; + this.isInnerDisposed = false; + } + + InnerDisposable.prototype.dispose = function () { + if (!this.disposable.isDisposed) { + if (!this.isInnerDisposed) { + this.isInnerDisposed = true; + this.disposable.count--; + if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) { + this.disposable.isDisposed = true; + this.disposable.underlyingDisposable.dispose(); + } + } + } + }; + + /** + * Initializes a new instance of the RefCountDisposable with the specified disposable. + * @constructor + * @param {Disposable} disposable Underlying disposable. + */ + function RefCountDisposable(disposable) { + this.underlyingDisposable = disposable; + this.isDisposed = false; + this.isPrimaryDisposed = false; + this.count = 0; + } + + /** + * Disposes the underlying disposable only when all dependent disposables have been disposed + */ + RefCountDisposable.prototype.dispose = function () { + if (!this.isDisposed) { + if (!this.isPrimaryDisposed) { + this.isPrimaryDisposed = true; + if (this.count === 0) { + this.isDisposed = true; + this.underlyingDisposable.dispose(); + } + } + } + }; + + /** + * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable. + * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime. + */ + RefCountDisposable.prototype.getDisposable = function () { + return this.isDisposed ? disposableEmpty : new InnerDisposable(this); + }; + + return RefCountDisposable; + })(); + + var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) { + this.scheduler = scheduler; + this.state = state; + this.action = action; + this.dueTime = dueTime; + this.comparer = comparer || defaultSubComparer; + this.disposable = new SingleAssignmentDisposable(); + } + + ScheduledItem.prototype.invoke = function () { + this.disposable.setDisposable(this.invokeCore()); + }; + + ScheduledItem.prototype.compareTo = function (other) { + return this.comparer(this.dueTime, other.dueTime); + }; + + ScheduledItem.prototype.isCancelled = function () { + return this.disposable.isDisposed; + }; + + ScheduledItem.prototype.invokeCore = function () { + return this.action(this.scheduler, this.state); + }; + + /** Provides a set of static properties to access commonly used schedulers. */ + var Scheduler = Rx.Scheduler = (function () { + + function Scheduler(now, schedule, scheduleRelative, scheduleAbsolute) { + this.now = now; + this._schedule = schedule; + this._scheduleRelative = scheduleRelative; + this._scheduleAbsolute = scheduleAbsolute; + } + + function invokeRecImmediate(scheduler, pair) { + var state = pair.first, action = pair.second, group = new CompositeDisposable(), + recursiveAction = function (state1) { + action(state1, function (state2) { + var isAdded = false, isDone = false, + d = scheduler.scheduleWithState(state2, function (scheduler1, state3) { + if (isAdded) { + group.remove(d); + } else { + isDone = true; + } + recursiveAction(state3); + return disposableEmpty; + }); + if (!isDone) { + group.add(d); + isAdded = true; + } + }); + }; + recursiveAction(state); + return group; + } + + function invokeRecDate(scheduler, pair, method) { + var state = pair.first, action = pair.second, group = new CompositeDisposable(), + recursiveAction = function (state1) { + action(state1, function (state2, dueTime1) { + var isAdded = false, isDone = false, + d = scheduler[method].call(scheduler, state2, dueTime1, function (scheduler1, state3) { + if (isAdded) { + group.remove(d); + } else { + isDone = true; + } + recursiveAction(state3); + return disposableEmpty; + }); + if (!isDone) { + group.add(d); + isAdded = true; + } + }); + }; + recursiveAction(state); + return group; + } + + function invokeAction(scheduler, action) { + action(); + return disposableEmpty; + } + + var schedulerProto = Scheduler.prototype; + + /** + * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation. + * @param {Number} period Period for running the work periodically. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort). + */ + schedulerProto.schedulePeriodic = function (period, action) { + return this.schedulePeriodicWithState(null, period, function () { + action(); + }); + }; + + /** + * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation. + * @param {Mixed} state Initial state passed to the action upon the first iteration. + * @param {Number} period Period for running the work periodically. + * @param {Function} action Action to be executed, potentially updating the state. + * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort). + */ + schedulerProto.schedulePeriodicWithState = function (state, period, action) { + var s = state, id = setInterval(function () { + s = action(s); + }, period); + return disposableCreate(function () { + clearInterval(id); + }); + }; + + /** + * Schedules an action to be executed. + * @param {Function} action Action to execute. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.schedule = function (action) { + return this._schedule(action, invokeAction); + }; + + /** + * Schedules an action to be executed. + * @param state State passed to the action to be executed. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithState = function (state, action) { + return this._schedule(state, action); + }; + + /** + * Schedules an action to be executed after the specified relative due time. + * @param {Function} action Action to execute. + * @param {Number} dueTime Relative time after which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithRelative = function (dueTime, action) { + return this._scheduleRelative(action, dueTime, invokeAction); + }; + + /** + * Schedules an action to be executed after dueTime. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to be executed. + * @param {Number} dueTime Relative time after which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithRelativeAndState = function (state, dueTime, action) { + return this._scheduleRelative(state, dueTime, action); + }; + + /** + * Schedules an action to be executed at the specified absolute due time. + * @param {Function} action Action to execute. + * @param {Number} dueTime Absolute time at which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithAbsolute = function (dueTime, action) { + return this._scheduleAbsolute(action, dueTime, invokeAction); + }; + + /** + * Schedules an action to be executed at dueTime. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to be executed. + * @param {Number}dueTime Absolute time at which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithAbsoluteAndState = function (state, dueTime, action) { + return this._scheduleAbsolute(state, dueTime, action); + }; + + /** + * Schedules an action to be executed recursively. + * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursive = function (action) { + return this.scheduleRecursiveWithState(action, function (_action, self) { + _action(function () { + self(_action); + }); + }); + }; + + /** + * Schedules an action to be executed recursively. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithState = function (state, action) { + return this.scheduleWithState({ first: state, second: action }, function (s, p) { + return invokeRecImmediate(s, p); + }); + }; + + /** + * Schedules an action to be executed recursively after a specified relative due time. + * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified relative time. + * @param {Number}dueTime Relative time after which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithRelative = function (dueTime, action) { + return this.scheduleRecursiveWithRelativeAndState(action, dueTime, function (_action, self) { + _action(function (dt) { + self(_action, dt); + }); + }); + }; + + /** + * Schedules an action to be executed recursively after a specified relative due time. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state. + * @param {Number}dueTime Relative time after which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithRelativeAndState = function (state, dueTime, action) { + return this._scheduleRelative({ first: state, second: action }, dueTime, function (s, p) { + return invokeRecDate(s, p, 'scheduleWithRelativeAndState'); + }); + }; + + /** + * Schedules an action to be executed recursively at a specified absolute due time. + * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified absolute time. + * @param {Number}dueTime Absolute time at which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithAbsolute = function (dueTime, action) { + return this.scheduleRecursiveWithAbsoluteAndState(action, dueTime, function (_action, self) { + _action(function (dt) { + self(_action, dt); + }); + }); + }; + + /** + * Schedules an action to be executed recursively at a specified absolute due time. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state. + * @param {Number}dueTime Absolute time at which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithAbsoluteAndState = function (state, dueTime, action) { + return this._scheduleAbsolute({ first: state, second: action }, dueTime, function (s, p) { + return invokeRecDate(s, p, 'scheduleWithAbsoluteAndState'); + }); + }; + + /** Gets the current time according to the local machine's system clock. */ + Scheduler.now = defaultNow; + + /** + * Normalizes the specified TimeSpan value to a positive value. + * @param {Number} timeSpan The time span value to normalize. + * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0 + */ + Scheduler.normalize = function (timeSpan) { + if (timeSpan < 0) { + timeSpan = 0; + } + return timeSpan; + }; + + return Scheduler; + }()); + + var normalizeTime = Scheduler.normalize; + + /** + * Gets a scheduler that schedules work immediately on the current thread. + */ + var immediateScheduler = Scheduler.immediate = (function () { + + function scheduleNow(state, action) { return action(this, state); } + + function scheduleRelative(state, dueTime, action) { + var dt = normalizeTime(dt); + while (dt - this.now() > 0) { } + return action(this, state); + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); + } + + return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); + }()); + + /** + * Gets a scheduler that schedules work as soon as possible on the current thread. + */ + var currentThreadScheduler = Scheduler.currentThread = (function () { + var queue; + + function runTrampoline (q) { + var item; + while (q.length > 0) { + item = q.dequeue(); + if (!item.isCancelled()) { + // Note, do not schedule blocking work! + while (item.dueTime - Scheduler.now() > 0) { + } + if (!item.isCancelled()) { + item.invoke(); + } + } + } + } + + function scheduleNow(state, action) { + return this.scheduleWithRelativeAndState(state, 0, action); + } + + function scheduleRelative(state, dueTime, action) { + var dt = this.now() + Scheduler.normalize(dueTime), + si = new ScheduledItem(this, state, action, dt), + t; + if (!queue) { + queue = new PriorityQueue(4); + queue.enqueue(si); + try { + runTrampoline(queue); + } catch (e) { + throw e; + } finally { + queue = null; + } + } else { + queue.enqueue(si); + } + return si.disposable; + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); + } + + var currentScheduler = new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); + currentScheduler.scheduleRequired = function () { return queue === null; }; + currentScheduler.ensureTrampoline = function (action) { + if (queue === null) { + return this.schedule(action); + } else { + return action(); + } + }; + + return currentScheduler; + }()); + + var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () { + function tick(command, recurse) { + recurse(0, this._period); + try { + this._state = this._action(this._state); + } catch (e) { + this._cancel.dispose(); + throw e; + } + } + + function SchedulePeriodicRecursive(scheduler, state, period, action) { + this._scheduler = scheduler; + this._state = state; + this._period = period; + this._action = action; + } + + SchedulePeriodicRecursive.prototype.start = function () { + var d = new SingleAssignmentDisposable(); + this._cancel = d; + d.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0, this._period, tick.bind(this))); + + return d; + }; + + return SchedulePeriodicRecursive; + }()); + + + var scheduleMethod, clearMethod = noop; + (function () { + + var reNative = RegExp('^' + + String(toString) + .replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + .replace(/toString| for [^\]]+/g, '.*?') + '$' + ); + + var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' && + !reNative.test(setImmediate) && setImmediate, + clearImmediate = typeof (clearImmediate = freeGlobal && moduleExports && freeGlobal.clearImmediate) == 'function' && + !reNative.test(clearImmediate) && clearImmediate; + + function postMessageSupported () { + // Ensure not in a worker + if (!root.postMessage || root.importScripts) { return false; } + var isAsync = false, + oldHandler = root.onmessage; + // Test for async + root.onmessage = function () { isAsync = true; }; + root.postMessage('','*'); + root.onmessage = oldHandler; + + return isAsync; + } + + // Use in order, nextTick, setImmediate, postMessage, MessageChannel, script readystatechanged, setTimeout + if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') { + scheduleMethod = process.nextTick; + } else if (typeof setImmediate === 'function') { + scheduleMethod = setImmediate; + clearMethod = clearImmediate; + } else if (postMessageSupported()) { + var MSG_PREFIX = 'ms.rx.schedule' + Math.random(), + tasks = {}, + taskId = 0; + + function onGlobalPostMessage(event) { + // Only if we're a match to avoid any other global events + if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) { + var handleId = event.data.substring(MSG_PREFIX.length), + action = tasks[handleId]; + action(); + delete tasks[handleId]; + } + } + + if (root.addEventListener) { + root.addEventListener('message', onGlobalPostMessage, false); + } else { + root.attachEvent('onmessage', onGlobalPostMessage, false); + } + + scheduleMethod = function (action) { + var currentId = taskId++; + tasks[currentId] = action; + root.postMessage(MSG_PREFIX + currentId, '*'); + }; + } else if (!!root.MessageChannel) { + var channel = new root.MessageChannel(), + channelTasks = {}, + channelTaskId = 0; + + channel.port1.onmessage = function (event) { + var id = event.data, + action = channelTasks[id]; + action(); + delete channelTasks[id]; + }; + + scheduleMethod = function (action) { + var id = channelTaskId++; + channelTasks[id] = action; + channel.port2.postMessage(id); + }; + } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) { + + scheduleMethod = function (action) { + var scriptElement = root.document.createElement('script'); + scriptElement.onreadystatechange = function () { + action(); + scriptElement.onreadystatechange = null; + scriptElement.parentNode.removeChild(scriptElement); + scriptElement = null; + }; + root.document.documentElement.appendChild(scriptElement); + }; + + } else { + scheduleMethod = function (action) { return setTimeout(action, 0); }; + clearMethod = clearTimeout; + } + }()); + + /** + * Gets a scheduler that schedules work via a timed callback based upon platform. + */ + var timeoutScheduler = Scheduler.timeout = (function () { + + function scheduleNow(state, action) { + var scheduler = this, + disposable = new SingleAssignmentDisposable(); + var id = scheduleMethod(function () { + if (!disposable.isDisposed) { + disposable.setDisposable(action(scheduler, state)); + } + }); + return new CompositeDisposable(disposable, disposableCreate(function () { + clearMethod(id); + })); + } + + function scheduleRelative(state, dueTime, action) { + var scheduler = this, + dt = Scheduler.normalize(dueTime); + if (dt === 0) { + return scheduler.scheduleWithState(state, action); + } + var disposable = new SingleAssignmentDisposable(); + var id = setTimeout(function () { + if (!disposable.isDisposed) { + disposable.setDisposable(action(scheduler, state)); + } + }, dt); + return new CompositeDisposable(disposable, disposableCreate(function () { + clearTimeout(id); + })); + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); + } + + return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); + })(); + + /** + * Represents a notification to an observer. + */ + var Notification = Rx.Notification = (function () { + function Notification(kind, hasValue) { + this.hasValue = hasValue == null ? false : hasValue; + this.kind = kind; + } + + var NotificationPrototype = Notification.prototype; + + /** + * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result. + * + * @memberOf Notification + * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on.. + * @param {Function} onError Delegate to invoke for an OnError notification. + * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification. + * @returns {Any} Result produced by the observation. + */ + NotificationPrototype.accept = function (observerOrOnNext, onError, onCompleted) { + if (arguments.length === 1 && typeof observerOrOnNext === 'object') { + return this._acceptObservable(observerOrOnNext); + } + return this._accept(observerOrOnNext, onError, onCompleted); + }; + + /** + * Returns an observable sequence with a single notification. + * + * @memberOf Notification + * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on. + * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription. + */ + NotificationPrototype.toObservable = function (scheduler) { + var notification = this; + scheduler || (scheduler = immediateScheduler); + return new AnonymousObservable(function (observer) { + return scheduler.schedule(function () { + notification._acceptObservable(observer); + if (notification.kind === 'N') { + observer.onCompleted(); + } + }); + }); + }; + + return Notification; + })(); + + /** + * Creates an object that represents an OnNext notification to an observer. + * @param {Any} value The value contained in the notification. + * @returns {Notification} The OnNext notification containing the value. + */ + var notificationCreateOnNext = Notification.createOnNext = (function () { + + function _accept (onNext) { + return onNext(this.value); + } + + function _acceptObservable(observer) { + return observer.onNext(this.value); + } + + function toString () { + return 'OnNext(' + this.value + ')'; + } + + return function (value) { + var notification = new Notification('N', true); + notification.value = value; + notification._accept = _accept; + notification._acceptObservable = _acceptObservable; + notification.toString = toString; + return notification; + }; + }()); + + /** + * Creates an object that represents an OnError notification to an observer. + * @param {Any} error The exception contained in the notification. + * @returns {Notification} The OnError notification containing the exception. + */ + var notificationCreateOnError = Notification.createOnError = (function () { + + function _accept (onNext, onError) { + return onError(this.exception); + } + + function _acceptObservable(observer) { + return observer.onError(this.exception); + } + + function toString () { + return 'OnError(' + this.exception + ')'; + } + + return function (exception) { + var notification = new Notification('E'); + notification.exception = exception; + notification._accept = _accept; + notification._acceptObservable = _acceptObservable; + notification.toString = toString; + return notification; + }; + }()); + + /** + * Creates an object that represents an OnCompleted notification to an observer. + * @returns {Notification} The OnCompleted notification. + */ + var notificationCreateOnCompleted = Notification.createOnCompleted = (function () { + + function _accept (onNext, onError, onCompleted) { + return onCompleted(); + } + + function _acceptObservable(observer) { + return observer.onCompleted(); + } + + function toString () { + return 'OnCompleted()'; + } + + return function () { + var notification = new Notification('C'); + notification._accept = _accept; + notification._acceptObservable = _acceptObservable; + notification.toString = toString; + return notification; + }; + }()); + + var Enumerator = Rx.internals.Enumerator = function (next) { + this._next = next; + }; + + Enumerator.prototype.next = function () { + return this._next(); + }; + + Enumerator.prototype[$iterator$] = function () { return this; } + + var Enumerable = Rx.internals.Enumerable = function (iterator) { + this._iterator = iterator; + }; + + Enumerable.prototype[$iterator$] = function () { + return this._iterator(); + }; + + Enumerable.prototype.concat = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var e; + try { + e = sources[$iterator$](); + } catch(err) { + observer.onError(); + return; + } + + var isDisposed, + subscription = new SerialDisposable(); + var cancelable = immediateScheduler.scheduleRecursive(function (self) { + var currentItem; + if (isDisposed) { return; } + + try { + currentItem = e.next(); + } catch (ex) { + observer.onError(ex); + return; + } + + if (currentItem.done) { + observer.onCompleted(); + return; + } + + // Check if promise + var currentValue = currentItem.value; + isPromise(currentValue) && (currentValue = observableFromPromise(currentValue)); + + var d = new SingleAssignmentDisposable(); + subscription.setDisposable(d); + d.setDisposable(currentValue.subscribe( + observer.onNext.bind(observer), + observer.onError.bind(observer), + function () { self(); }) + ); + }); + + return new CompositeDisposable(subscription, cancelable, disposableCreate(function () { + isDisposed = true; + })); + }); + }; + + Enumerable.prototype.catchException = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var e; + try { + e = sources[$iterator$](); + } catch(err) { + observer.onError(); + return; + } + + var isDisposed, + lastException, + subscription = new SerialDisposable(); + var cancelable = immediateScheduler.scheduleRecursive(function (self) { + if (isDisposed) { return; } + + var currentItem; + try { + currentItem = e.next(); + } catch (ex) { + observer.onError(ex); + return; + } + + if (currentItem.done) { + if (lastException) { + observer.onError(lastException); + } else { + observer.onCompleted(); + } + return; + } + + // Check if promise + var currentValue = currentItem.value; + isPromise(currentValue) && (currentValue = observableFromPromise(currentValue)); + + var d = new SingleAssignmentDisposable(); + subscription.setDisposable(d); + d.setDisposable(currentValue.subscribe( + observer.onNext.bind(observer), + function (exn) { + lastException = exn; + self(); + }, + observer.onCompleted.bind(observer))); + }); + return new CompositeDisposable(subscription, cancelable, disposableCreate(function () { + isDisposed = true; + })); + }); + }; + + var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) { + if (repeatCount == null) { repeatCount = -1; } + return new Enumerable(function () { + var left = repeatCount; + return new Enumerator(function () { + if (left === 0) { return doneEnumerator; } + if (left > 0) { left--; } + return { done: false, value: value }; + }); + }); + }; + + var enumerableFor = Enumerable.forEach = function (source, selector, thisArg) { + selector || (selector = identity); + return new Enumerable(function () { + var index = -1; + return new Enumerator( + function () { + return ++index < source.length ? + { done: false, value: selector.call(thisArg, source[index], index, source) } : + doneEnumerator; + }); + }); + }; + + /** + * Supports push-style iteration over an observable sequence. + */ + var Observer = Rx.Observer = function () { }; + + /** + * Creates a notification callback from an observer. + * + * @param observer Observer object. + * @returns The action that forwards its input notification to the underlying observer. + */ + Observer.prototype.toNotifier = function () { + var observer = this; + return function (n) { + return n.accept(observer); + }; + }; + + /** + * Hides the identity of an observer. + + * @returns An observer that hides the identity of the specified observer. + */ + Observer.prototype.asObserver = function () { + return new AnonymousObserver(this.onNext.bind(this), this.onError.bind(this), this.onCompleted.bind(this)); + }; + + /** + * Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions. + * + * @static + * @memberOf Observer + * @param {Function} [onNext] Observer's OnNext action implementation. + * @param {Function} [onError] Observer's OnError action implementation. + * @param {Function} [onCompleted] Observer's OnCompleted action implementation. + * @returns {Observer} The observer object implemented using the given actions. + */ + var observerCreate = Observer.create = function (onNext, onError, onCompleted) { + onNext || (onNext = noop); + onError || (onError = defaultError); + onCompleted || (onCompleted = noop); + return new AnonymousObserver(onNext, onError, onCompleted); + }; + + /** + * Creates an observer from a notification callback. + * + * @static + * @memberOf Observer + * @param {Function} handler Action that handles a notification. + * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives. + */ + Observer.fromNotifier = function (handler) { + return new AnonymousObserver(function (x) { + return handler(notificationCreateOnNext(x)); + }, function (exception) { + return handler(notificationCreateOnError(exception)); + }, function () { + return handler(notificationCreateOnCompleted()); + }); + }; + + /** + * Abstract base class for implementations of the Observer class. + * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages. + */ + var AbstractObserver = Rx.internals.AbstractObserver = (function (_super) { + inherits(AbstractObserver, _super); + + /** + * Creates a new observer in a non-stopped state. + * + * @constructor + */ + function AbstractObserver() { + this.isStopped = false; + _super.call(this); + } + + /** + * Notifies the observer of a new element in the sequence. + * + * @memberOf AbstractObserver + * @param {Any} value Next element in the sequence. + */ + AbstractObserver.prototype.onNext = function (value) { + if (!this.isStopped) { + this.next(value); + } + }; + + /** + * Notifies the observer that an exception has occurred. + * + * @memberOf AbstractObserver + * @param {Any} error The error that has occurred. + */ + AbstractObserver.prototype.onError = function (error) { + if (!this.isStopped) { + this.isStopped = true; + this.error(error); + } + }; + + /** + * Notifies the observer of the end of the sequence. + */ + AbstractObserver.prototype.onCompleted = function () { + if (!this.isStopped) { + this.isStopped = true; + this.completed(); + } + }; + + /** + * Disposes the observer, causing it to transition to the stopped state. + */ + AbstractObserver.prototype.dispose = function () { + this.isStopped = true; + }; + + AbstractObserver.prototype.fail = function (e) { + if (!this.isStopped) { + this.isStopped = true; + this.error(e); + return true; + } + + return false; + }; + + return AbstractObserver; + }(Observer)); + + /** + * Class to create an Observer instance from delegate-based implementations of the on* methods. + */ + var AnonymousObserver = Rx.AnonymousObserver = (function (_super) { + inherits(AnonymousObserver, _super); + + /** + * Creates an observer from the specified OnNext, OnError, and OnCompleted actions. + * @param {Any} onNext Observer's OnNext action implementation. + * @param {Any} onError Observer's OnError action implementation. + * @param {Any} onCompleted Observer's OnCompleted action implementation. + */ + function AnonymousObserver(onNext, onError, onCompleted) { + _super.call(this); + this._onNext = onNext; + this._onError = onError; + this._onCompleted = onCompleted; + } + + /** + * Calls the onNext action. + * @param {Any} value Next element in the sequence. + */ + AnonymousObserver.prototype.next = function (value) { + this._onNext(value); + }; + + /** + * Calls the onError action. + * @param {Any} error The error that has occurred. + */ + AnonymousObserver.prototype.error = function (exception) { + this._onError(exception); + }; + + /** + * Calls the onCompleted action. + */ + AnonymousObserver.prototype.completed = function () { + this._onCompleted(); + }; + + return AnonymousObserver; + }(AbstractObserver)); + + var observableProto; + + /** + * Represents a push-style collection. + */ + var Observable = Rx.Observable = (function () { + + function Observable(subscribe) { + this._subscribe = subscribe; + } + + observableProto = Observable.prototype; + + /** + * Subscribes an observer to the observable sequence. + * + * @example + * 1 - source.subscribe(); + * 2 - source.subscribe(observer); + * 3 - source.subscribe(function (x) { console.log(x); }); + * 4 - source.subscribe(function (x) { console.log(x); }, function (err) { console.log(err); }); + * 5 - source.subscribe(function (x) { console.log(x); }, function (err) { console.log(err); }, function () { console.log('done'); }); + * @param {Mixed} [observerOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence. + * @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence. + * @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence. + * @returns {Diposable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler. + */ + observableProto.subscribe = observableProto.forEach = function (observerOrOnNext, onError, onCompleted) { + var subscriber = typeof observerOrOnNext === 'object' ? + observerOrOnNext : + observerCreate(observerOrOnNext, onError, onCompleted); + + return this._subscribe(subscriber); + }; + + return Observable; + })(); + + var ScheduledObserver = Rx.internals.ScheduledObserver = (function (_super) { + inherits(ScheduledObserver, _super); + + function ScheduledObserver(scheduler, observer) { + _super.call(this); + this.scheduler = scheduler; + this.observer = observer; + this.isAcquired = false; + this.hasFaulted = false; + this.queue = []; + this.disposable = new SerialDisposable(); + } + + ScheduledObserver.prototype.next = function (value) { + var self = this; + this.queue.push(function () { + self.observer.onNext(value); + }); + }; + + ScheduledObserver.prototype.error = function (exception) { + var self = this; + this.queue.push(function () { + self.observer.onError(exception); + }); + }; + + ScheduledObserver.prototype.completed = function () { + var self = this; + this.queue.push(function () { + self.observer.onCompleted(); + }); + }; + + ScheduledObserver.prototype.ensureActive = function () { + var isOwner = false, parent = this; + if (!this.hasFaulted && this.queue.length > 0) { + isOwner = !this.isAcquired; + this.isAcquired = true; + } + if (isOwner) { + this.disposable.setDisposable(this.scheduler.scheduleRecursive(function (self) { + var work; + if (parent.queue.length > 0) { + work = parent.queue.shift(); + } else { + parent.isAcquired = false; + return; + } + try { + work(); + } catch (ex) { + parent.queue = []; + parent.hasFaulted = true; + throw ex; + } + self(); + })); + } + }; + + ScheduledObserver.prototype.dispose = function () { + _super.prototype.dispose.call(this); + this.disposable.dispose(); + }; + + return ScheduledObserver; + }(AbstractObserver)); + + /** + * Creates a list from an observable sequence. + * @returns An observable sequence containing a single element with a list containing all the elements of the source sequence. + */ + observableProto.toArray = function () { + var self = this; + return new AnonymousObservable(function(observer) { + var arr = []; + return self.subscribe( + arr.push.bind(arr), + observer.onError.bind(observer), + function () { + observer.onNext(arr); + observer.onCompleted(); + }); + }); + }; + + /** + * Creates an observable sequence from a specified subscribe method implementation. + * + * @example + * var res = Rx.Observable.create(function (observer) { return function () { } ); + * var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } ); + * var res = Rx.Observable.create(function (observer) { } ); + * + * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable. + * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method. + */ + Observable.create = Observable.createWithDisposable = function (subscribe) { + return new AnonymousObservable(subscribe); + }; + + /** + * Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes. + * + * @example + * var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); }); + * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise. + * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function. + */ + var observableDefer = Observable.defer = function (observableFactory) { + return new AnonymousObservable(function (observer) { + var result; + try { + result = observableFactory(); + } catch (e) { + return observableThrow(e).subscribe(observer); + } + isPromise(result) && (result = observableFromPromise(result)); + return result.subscribe(observer); + }); + }; + + /** + * Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message. + * + * @example + * var res = Rx.Observable.empty(); + * var res = Rx.Observable.empty(Rx.Scheduler.timeout); + * @param {Scheduler} [scheduler] Scheduler to send the termination call on. + * @returns {Observable} An observable sequence with no elements. + */ + var observableEmpty = Observable.empty = function (scheduler) { + scheduler || (scheduler = immediateScheduler); + return new AnonymousObservable(function (observer) { + return scheduler.schedule(function () { + observer.onCompleted(); + }); + }); + }; + + /** + * Converts an array to an observable sequence, using an optional scheduler to enumerate the array. + * + * @example + * var res = Rx.Observable.fromArray([1,2,3]); + * var res = Rx.Observable.fromArray([1,2,3], Rx.Scheduler.timeout); + * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on. + * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence. + */ + var observableFromArray = Observable.fromArray = function (array, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + return new AnonymousObservable(function (observer) { + var count = 0, len = array.length; + return scheduler.scheduleRecursive(function (self) { + if (count < len) { + observer.onNext(array[count++]); + self(); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * Converts an iterable into an Observable sequence + * + * @example + * var res = Rx.Observable.fromIterable(new Map()); + * var res = Rx.Observable.fromIterable(new Set(), Rx.Scheduler.timeout); + * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on. + * @returns {Observable} The observable sequence whose elements are pulled from the given generator sequence. + */ + Observable.fromIterable = function (iterable, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + return new AnonymousObservable(function (observer) { + var iterator; + try { + iterator = iterable[$iterator$](); + } catch (e) { + observer.onError(e); + return; + } + + return scheduler.scheduleRecursive(function (self) { + var next; + try { + next = iterator.next(); + } catch (err) { + observer.onError(err); + return; + } + + if (next.done) { + observer.onCompleted(); + } else { + observer.onNext(next.value); + self(); + } + }); + }); + }; + + /** + * Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages. + * + * @example + * var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }); + * var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout); + * @param {Mixed} initialState Initial state. + * @param {Function} condition Condition to terminate generation (upon returning false). + * @param {Function} iterate Iteration step function. + * @param {Function} resultSelector Selector function for results produced in the sequence. + * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread. + * @returns {Observable} The generated sequence. + */ + Observable.generate = function (initialState, condition, iterate, resultSelector, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + return new AnonymousObservable(function (observer) { + var first = true, state = initialState; + return scheduler.scheduleRecursive(function (self) { + var hasResult, result; + try { + if (first) { + first = false; + } else { + state = iterate(state); + } + hasResult = condition(state); + if (hasResult) { + result = resultSelector(state); + } + } catch (exception) { + observer.onError(exception); + return; + } + if (hasResult) { + observer.onNext(result); + self(); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins). + * @returns {Observable} An observable sequence whose observers will never get called. + */ + var observableNever = Observable.never = function () { + return new AnonymousObservable(function () { + return disposableEmpty; + }); + }; + + /** + * This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments. + * @example + * var res = Rx.Observable.of(1,2,3); + * @returns {Observable} The observable sequence whose elements are pulled from the given arguments. + */ + Observable.of = function () { + var len = arguments.length, args = new Array(len); + for(var i = 0; i < len; i++) { args[i] = arguments[i]; } + return observableFromArray(args); + }; + + /** + * This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments. + * @example + * var res = Rx.Observable.of(1,2,3); + * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments. + * @returns {Observable} The observable sequence whose elements are pulled from the given arguments. + */ + var observableOf = Observable.ofWithScheduler = function (scheduler) { + var len = arguments.length - 1, args = new Array(len); + for(var i = 0; i < len; i++) { args[i] = arguments[i + 1]; } + return observableFromArray(args, scheduler); + }; + + /** + * Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages. + * + * @example + * var res = Rx.Observable.range(0, 10); + * var res = Rx.Observable.range(0, 10, Rx.Scheduler.timeout); + * @param {Number} start The value of the first integer in the sequence. + * @param {Number} count The number of sequential integers to generate. + * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread. + * @returns {Observable} An observable sequence that contains a range of sequential integral numbers. + */ + Observable.range = function (start, count, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + return new AnonymousObservable(function (observer) { + return scheduler.scheduleRecursiveWithState(0, function (i, self) { + if (i < count) { + observer.onNext(start + i); + self(i + 1); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages. + * + * @example + * var res = Rx.Observable.repeat(42); + * var res = Rx.Observable.repeat(42, 4); + * 3 - res = Rx.Observable.repeat(42, 4, Rx.Scheduler.timeout); + * 4 - res = Rx.Observable.repeat(42, null, Rx.Scheduler.timeout); + * @param {Mixed} value Element to repeat. + * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely. + * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate. + * @returns {Observable} An observable sequence that repeats the given element the specified number of times. + */ + Observable.repeat = function (value, repeatCount, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + if (repeatCount == null) { + repeatCount = -1; + } + return observableReturn(value, scheduler).repeat(repeatCount); + }; + + /** + * Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages. + * There is an alias called 'just', and 'returnValue' for browsers 0) { + s = q.shift(); + subscribe(s); + } else { + activeCount--; + if (isStopped && activeCount === 0) { + observer.onCompleted(); + } + } + })); + }; + group.add(sources.subscribe(function (innerSource) { + if (activeCount < maxConcurrentOrOther) { + activeCount++; + subscribe(innerSource); + } else { + q.push(innerSource); + } + }, observer.onError.bind(observer), function () { + isStopped = true; + if (activeCount === 0) { + observer.onCompleted(); + } + })); + return group; + }); + }; + + /** + * Merges all the observable sequences into a single observable sequence. + * The scheduler is optional and if not specified, the immediate scheduler is used. + * + * @example + * 1 - merged = Rx.Observable.merge(xs, ys, zs); + * 2 - merged = Rx.Observable.merge([xs, ys, zs]); + * 3 - merged = Rx.Observable.merge(scheduler, xs, ys, zs); + * 4 - merged = Rx.Observable.merge(scheduler, [xs, ys, zs]); + * @returns {Observable} The observable sequence that merges the elements of the observable sequences. + */ + var observableMerge = Observable.merge = function () { + var scheduler, sources; + if (!arguments[0]) { + scheduler = immediateScheduler; + sources = slice.call(arguments, 1); + } else if (arguments[0].now) { + scheduler = arguments[0]; + sources = slice.call(arguments, 1); + } else { + scheduler = immediateScheduler; + sources = slice.call(arguments, 0); + } + if (Array.isArray(sources[0])) { + sources = sources[0]; + } + return observableFromArray(sources, scheduler).mergeObservable(); + }; + + /** + * Merges an observable sequence of observable sequences into an observable sequence. + * @returns {Observable} The observable sequence that merges the elements of the inner sequences. + */ + observableProto.mergeObservable = observableProto.mergeAll =function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var group = new CompositeDisposable(), + isStopped = false, + m = new SingleAssignmentDisposable(); + + group.add(m); + m.setDisposable(sources.subscribe(function (innerSource) { + var innerSubscription = new SingleAssignmentDisposable(); + group.add(innerSubscription); + + // Check if Promise or Observable + if (isPromise(innerSource)) { + innerSource = observableFromPromise(innerSource); + } + + innerSubscription.setDisposable(innerSource.subscribe(function (x) { + observer.onNext(x); + }, observer.onError.bind(observer), function () { + group.remove(innerSubscription); + if (isStopped && group.length === 1) { observer.onCompleted(); } + })); + }, observer.onError.bind(observer), function () { + isStopped = true; + if (group.length === 1) { observer.onCompleted(); } + })); + return group; + }); + }; + + /** + * Returns the values from the source observable sequence only after the other observable sequence produces a value. + * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence. + * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation. + */ + observableProto.skipUntil = function (other) { + var source = this; + return new AnonymousObservable(function (observer) { + var isOpen = false; + var disposables = new CompositeDisposable(source.subscribe(function (left) { + isOpen && observer.onNext(left); + }, observer.onError.bind(observer), function () { + isOpen && observer.onCompleted(); + })); + + isPromise(other) && (other = observableFromPromise(other)); + + var rightSubscription = new SingleAssignmentDisposable(); + disposables.add(rightSubscription); + rightSubscription.setDisposable(other.subscribe(function () { + isOpen = true; + rightSubscription.dispose(); + }, observer.onError.bind(observer), function () { + rightSubscription.dispose(); + })); + + return disposables; + }); + }; + + /** + * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence. + * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received. + */ + observableProto['switch'] = observableProto.switchLatest = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var hasLatest = false, + innerSubscription = new SerialDisposable(), + isStopped = false, + latest = 0, + subscription = sources.subscribe(function (innerSource) { + var d = new SingleAssignmentDisposable(), id = ++latest; + hasLatest = true; + innerSubscription.setDisposable(d); + + // Check if Promise or Observable + if (isPromise(innerSource)) { + innerSource = observableFromPromise(innerSource); + } + + d.setDisposable(innerSource.subscribe(function (x) { + if (latest === id) { + observer.onNext(x); + } + }, function (e) { + if (latest === id) { + observer.onError(e); + } + }, function () { + if (latest === id) { + hasLatest = false; + if (isStopped) { + observer.onCompleted(); + } + } + })); + }, observer.onError.bind(observer), function () { + isStopped = true; + if (!hasLatest) { + observer.onCompleted(); + } + }); + return new CompositeDisposable(subscription, innerSubscription); + }); + }; + + /** + * Returns the values from the source observable sequence until the other observable sequence produces a value. + * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence. + * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation. + */ + observableProto.takeUntil = function (other) { + var source = this; + return new AnonymousObservable(function (observer) { + isPromise(other) && (other = observableFromPromise(other)); + return new CompositeDisposable( + source.subscribe(observer), + other.subscribe(observer.onCompleted.bind(observer), observer.onError.bind(observer), noop) + ); + }); + }; + + function zipArray(second, resultSelector) { + var first = this; + return new AnonymousObservable(function (observer) { + var index = 0, len = second.length; + return first.subscribe(function (left) { + if (index < len) { + var right = second[index++], result; + try { + result = resultSelector(left, right); + } catch (e) { + observer.onError(e); + return; + } + observer.onNext(result); + } else { + observer.onCompleted(); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + } + + /** + * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index. + * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the sources. + * + * @example + * 1 - res = obs1.zip(obs2, fn); + * 1 - res = x1.zip([1,2,3], fn); + * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + observableProto.zip = function () { + if (Array.isArray(arguments[0])) { + return zipArray.apply(this, arguments); + } + var parent = this, sources = slice.call(arguments), resultSelector = sources.pop(); + sources.unshift(parent); + return new AnonymousObservable(function (observer) { + var n = sources.length, + queues = arrayInitialize(n, function () { return []; }), + isDone = arrayInitialize(n, function () { return false; }); + + function next(i) { + var res, queuedValues; + if (queues.every(function (x) { return x.length > 0; })) { + try { + queuedValues = queues.map(function (x) { return x.shift(); }); + res = resultSelector.apply(parent, queuedValues); + } catch (ex) { + observer.onError(ex); + return; + } + observer.onNext(res); + } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) { + observer.onCompleted(); + } + }; + + function done(i) { + isDone[i] = true; + if (isDone.every(function (x) { return x; })) { + observer.onCompleted(); + } + } + + var subscriptions = new Array(n); + for (var idx = 0; idx < n; idx++) { + (function (i) { + var source = sources[i], sad = new SingleAssignmentDisposable(); + isPromise(source) && (source = observableFromPromise(source)); + sad.setDisposable(source.subscribe(function (x) { + queues[i].push(x); + next(i); + }, observer.onError.bind(observer), function () { + done(i); + })); + subscriptions[i] = sad; + })(idx); + } + + return new CompositeDisposable(subscriptions); + }); + }; + /** + * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. + * @param arguments Observable sources. + * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources. + * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + Observable.zip = function () { + var args = slice.call(arguments, 0), + first = args.shift(); + return first.zip.apply(first, args); + }; + + /** + * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes. + * @param arguments Observable sources. + * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes. + */ + Observable.zipArray = function () { + var sources = argsOrArray(arguments, 0); + return new AnonymousObservable(function (observer) { + var n = sources.length, + queues = arrayInitialize(n, function () { return []; }), + isDone = arrayInitialize(n, function () { return false; }); + + function next(i) { + if (queues.every(function (x) { return x.length > 0; })) { + var res = queues.map(function (x) { return x.shift(); }); + observer.onNext(res); + } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) { + observer.onCompleted(); + return; + } + }; + + function done(i) { + isDone[i] = true; + if (isDone.every(identity)) { + observer.onCompleted(); + return; + } + } + + var subscriptions = new Array(n); + for (var idx = 0; idx < n; idx++) { + (function (i) { + subscriptions[i] = new SingleAssignmentDisposable(); + subscriptions[i].setDisposable(sources[i].subscribe(function (x) { + queues[i].push(x); + next(i); + }, observer.onError.bind(observer), function () { + done(i); + })); + })(idx); + } + + var compositeDisposable = new CompositeDisposable(subscriptions); + compositeDisposable.add(disposableCreate(function () { + for (var qIdx = 0, qLen = queues.length; qIdx < qLen; qIdx++) { + queues[qIdx] = []; + } + })); + return compositeDisposable; + }); + }; + + /** + * Hides the identity of an observable sequence. + * @returns {Observable} An observable sequence that hides the identity of the source sequence. + */ + observableProto.asObservable = function () { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(observer); + }); + }; + + /** + * Dematerializes the explicit notification values of an observable sequence as implicit notifications. + * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values. + */ + observableProto.dematerialize = function () { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(function (x) { + return x.accept(observer); + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer. + * + * var obs = observable.distinctUntilChanged(); + * var obs = observable.distinctUntilChanged(function (x) { return x.id; }); + * var obs = observable.distinctUntilChanged(function (x) { return x.id; }, function (x, y) { return x === y; }); + * + * @param {Function} [keySelector] A function to compute the comparison key for each element. If not provided, it projects the value. + * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function. + * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence. + */ + observableProto.distinctUntilChanged = function (keySelector, comparer) { + var source = this; + keySelector || (keySelector = identity); + comparer || (comparer = defaultComparer); + return new AnonymousObservable(function (observer) { + var hasCurrentKey = false, currentKey; + return source.subscribe(function (value) { + var comparerEquals = false, key; + try { + key = keySelector(value); + } catch (exception) { + observer.onError(exception); + return; + } + if (hasCurrentKey) { + try { + comparerEquals = comparer(currentKey, key); + } catch (exception) { + observer.onError(exception); + return; + } + } + if (!hasCurrentKey || !comparerEquals) { + hasCurrentKey = true; + currentKey = key; + observer.onNext(value); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence. + * This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline. + * + * @example + * var res = observable.doAction(observer); + * var res = observable.doAction(onNext); + * var res = observable.doAction(onNext, onError); + * var res = observable.doAction(onNext, onError, onCompleted); + * @param {Mixed} observerOrOnNext Action to invoke for each element in the observable sequence or an observer. + * @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function. + * @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function. + * @returns {Observable} The source sequence with the side-effecting behavior applied. + */ + observableProto['do'] = observableProto.doAction = function (observerOrOnNext, onError, onCompleted) { + var source = this, onNextFunc; + if (typeof observerOrOnNext === 'function') { + onNextFunc = observerOrOnNext; + } else { + onNextFunc = observerOrOnNext.onNext.bind(observerOrOnNext); + onError = observerOrOnNext.onError.bind(observerOrOnNext); + onCompleted = observerOrOnNext.onCompleted.bind(observerOrOnNext); + } + return new AnonymousObservable(function (observer) { + return source.subscribe(function (x) { + try { + onNextFunc(x); + } catch (e) { + observer.onError(e); + } + observer.onNext(x); + }, function (exception) { + if (!onError) { + observer.onError(exception); + } else { + try { + onError(exception); + } catch (e) { + observer.onError(e); + } + observer.onError(exception); + } + }, function () { + if (!onCompleted) { + observer.onCompleted(); + } else { + try { + onCompleted(); + } catch (e) { + observer.onError(e); + } + observer.onCompleted(); + } + }); + }); + }; + + /** + * Invokes a specified action after the source observable sequence terminates gracefully or exceptionally. + * + * @example + * var res = observable.finallyAction(function () { console.log('sequence ended'; }); + * @param {Function} finallyAction Action to invoke after the source observable sequence terminates. + * @returns {Observable} Source sequence with the action-invoking termination behavior applied. + */ + observableProto['finally'] = observableProto.finallyAction = function (action) { + var source = this; + return new AnonymousObservable(function (observer) { + var subscription; + try { + subscription = source.subscribe(observer); + } catch (e) { + action(); + throw e; + } + return disposableCreate(function () { + try { + subscription.dispose(); + } catch (e) { + throw e; + } finally { + action(); + } + }); + }); + }; + + /** + * Ignores all elements in an observable sequence leaving only the termination messages. + * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence. + */ + observableProto.ignoreElements = function () { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(noop, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Materializes the implicit notifications of an observable sequence as explicit notification values. + * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence. + */ + observableProto.materialize = function () { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(function (value) { + observer.onNext(notificationCreateOnNext(value)); + }, function (e) { + observer.onNext(notificationCreateOnError(e)); + observer.onCompleted(); + }, function () { + observer.onNext(notificationCreateOnCompleted()); + observer.onCompleted(); + }); + }); + }; + + /** + * Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely. + * + * @example + * var res = repeated = source.repeat(); + * var res = repeated = source.repeat(42); + * @param {Number} [repeatCount] Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely. + * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly. + */ + observableProto.repeat = function (repeatCount) { + return enumerableRepeat(this, repeatCount).concat(); + }; + + /** + * Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely. + * + * @example + * var res = retried = retry.repeat(); + * var res = retried = retry.repeat(42); + * @param {Number} [retryCount] Number of times to retry the sequence. If not provided, retry the sequence indefinitely. + * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully. + */ + observableProto.retry = function (retryCount) { + return enumerableRepeat(this, retryCount).catchException(); + }; + + /** + * Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value. + * For aggregation behavior with no intermediate results, see Observable.aggregate. + * @example + * var res = source.scan(function (acc, x) { return acc + x; }); + * var res = source.scan(0, function (acc, x) { return acc + x; }); + * @param {Mixed} [seed] The initial accumulator value. + * @param {Function} accumulator An accumulator function to be invoked on each element. + * @returns {Observable} An observable sequence containing the accumulated values. + */ + observableProto.scan = function () { + var hasSeed = false, seed, accumulator, source = this; + if (arguments.length === 2) { + hasSeed = true; + seed = arguments[0]; + accumulator = arguments[1]; + } else { + accumulator = arguments[0]; + } + return new AnonymousObservable(function (observer) { + var hasAccumulation, accumulation, hasValue; + return source.subscribe ( + function (x) { + try { + if (!hasValue) { + hasValue = true; + } + + if (hasAccumulation) { + accumulation = accumulator(accumulation, x); + } else { + accumulation = hasSeed ? accumulator(seed, x) : x; + hasAccumulation = true; + } + } catch (e) { + observer.onError(e); + return; + } + + observer.onNext(accumulation); + }, + observer.onError.bind(observer), + function () { + if (!hasValue && hasSeed) { + observer.onNext(seed); + } + observer.onCompleted(); + } + ); + }); + }; + + /** + * Bypasses a specified number of elements at the end of an observable sequence. + * @description + * This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are + * received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed. + * @param count Number of elements to bypass at the end of the source sequence. + * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end. + */ + observableProto.skipLast = function (count) { + var source = this; + return new AnonymousObservable(function (observer) { + var q = []; + return source.subscribe(function (x) { + q.push(x); + if (q.length > count) { + observer.onNext(q.shift()); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend. + * + * var res = source.startWith(1, 2, 3); + * var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3); + * + * @memberOf Observable# + * @returns {Observable} The source sequence prepended with the specified values. + */ + observableProto.startWith = function () { + var values, scheduler, start = 0; + if (!!arguments.length && 'now' in Object(arguments[0])) { + scheduler = arguments[0]; + start = 1; + } else { + scheduler = immediateScheduler; + } + values = slice.call(arguments, start); + return enumerableFor([observableFromArray(values, scheduler), this]).concat(); + }; + + /** + * Returns a specified number of contiguous elements from the end of an observable sequence, using an optional scheduler to drain the queue. + * + * @example + * var res = source.takeLast(5); + * var res = source.takeLast(5, Rx.Scheduler.timeout); + * + * @description + * This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of + * the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed. + * @param {Number} count Number of elements to take from the end of the source sequence. + * @param {Scheduler} [scheduler] Scheduler used to drain the queue upon completion of the source sequence. + * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence. + */ + observableProto.takeLast = function (count, scheduler) { + return this.takeLastBuffer(count).selectMany(function (xs) { return observableFromArray(xs, scheduler); }); + }; + + /** + * Returns an array with the specified number of contiguous elements from the end of an observable sequence. + * + * @description + * This operator accumulates a buffer with a length enough to store count elements. Upon completion of the + * source sequence, this buffer is produced on the result sequence. + * @param {Number} count Number of elements to take from the end of the source sequence. + * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence. + */ + observableProto.takeLastBuffer = function (count) { + var source = this; + return new AnonymousObservable(function (observer) { + var q = []; + return source.subscribe(function (x) { + q.push(x); + if (q.length > count) { + q.shift(); + } + }, observer.onError.bind(observer), function () { + observer.onNext(q); + observer.onCompleted(); + }); + }); + }; + + function concatMap(selector) { + return this.map(function (x, i) { + var result = selector(x, i); + return isPromise(result) ? observableFromPromise(result) : result; + }).concatAll(); + } + + function concatMapObserver(onNext, onError, onCompleted) { + var source = this; + return new AnonymousObservable(function (observer) { + var index = 0; + + return source.subscribe( + function (x) { + observer.onNext(onNext(x, index++)); + }, + function (err) { + observer.onNext(onError(err)); + observer.completed(); + }, + function () { + observer.onNext(onCompleted()); + observer.onCompleted(); + }); + }).concatAll(); + } + + /** + * One of the Following: + * Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence. + * + * @example + * var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }); + * Or: + * Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence. + * + * var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; }); + * Or: + * Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence. + * + * var res = source.selectMany(Rx.Observable.fromArray([1,2,3])); + * @param selector A transform function to apply to each element or an observable sequence to project each element from the + * source sequence onto which could be either an observable or Promise. + * @param {Function} [resultSelector] A transform function to apply to each element of the intermediate sequence. + * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element. + */ + observableProto.selectConcat = observableProto.concatMap = function (selector, resultSelector) { + if (resultSelector) { + return this.concatMap(function (x, i) { + var selectorResult = selector(x, i), + result = isPromise(selectorResult) ? observableFromPromise(selectorResult) : selectorResult; + + return result.map(function (y) { + return resultSelector(x, y, i); + }); + }); + } + if (typeof selector === 'function') { + return concatMap.call(this, selector); + } + return concatMap.call(this, function () { + return selector; + }); + }; + + /** + * Projects each element of an observable sequence into a new form by incorporating the element's index. + * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element. + * @param {Any} [thisArg] Object to use as this when executing callback. + * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source. + */ + observableProto.select = observableProto.map = function (selector, thisArg) { + var parent = this; + return new AnonymousObservable(function (observer) { + var count = 0; + return parent.subscribe(function (value) { + var result; + try { + result = selector.call(thisArg, value, count++, parent); + } catch (exception) { + observer.onError(exception); + return; + } + observer.onNext(result); + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Retrieves the value of a specified property from all elements in the Observable sequence. + * @param {String} property The property to pluck. + * @returns {Observable} Returns a new Observable sequence of property values. + */ + observableProto.pluck = function (property) { + return this.select(function (x) { return x[property]; }); + }; + + function selectMany(selector) { + return this.select(function (x, i) { + var result = selector(x, i); + return isPromise(result) ? observableFromPromise(result) : result; + }).mergeObservable(); + } + + function selectManyObserver(onNext, onError, onCompleted) { + var source = this; + return new AnonymousObservable(function (observer) { + var index = 0; + + return source.subscribe( + function (x) { + observer.onNext(onNext(x, index++)); + }, + function (err) { + observer.onNext(onError(err)); + observer.completed(); + }, + function () { + observer.onNext(onCompleted()); + observer.onCompleted(); + }); + }).mergeAll(); + } + + /** + * One of the Following: + * Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence. + * + * @example + * var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }); + * Or: + * Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence. + * + * var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; }); + * Or: + * Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence. + * + * var res = source.selectMany(Rx.Observable.fromArray([1,2,3])); + * @param selector A transform function to apply to each element or an observable sequence to project each element from the + * source sequence onto which could be either an observable or Promise. + * @param {Function} [resultSelector] A transform function to apply to each element of the intermediate sequence. + * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element. + */ + observableProto.selectMany = observableProto.flatMap = function (selector, resultSelector) { + if (resultSelector) { + return this.selectMany(function (x, i) { + var selectorResult = selector(x, i), + result = isPromise(selectorResult) ? observableFromPromise(selectorResult) : selectorResult; + + return result.select(function (y) { + return resultSelector(x, y, i); + }); + }); + } + if (typeof selector === 'function') { + return selectMany.call(this, selector); + } + return selectMany.call(this, function () { + return selector; + }); + }; + + /** + * Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then + * transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence. + * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element. + * @param {Any} [thisArg] Object to use as this when executing callback. + * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences + * and that at any point in time produces the elements of the most recent inner observable sequence that has been received. + */ + observableProto.selectSwitch = observableProto.flatMapLatest = observableProto.switchMap = function (selector, thisArg) { + return this.select(selector, thisArg).switchLatest(); + }; + + /** + * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements. + * @param {Number} count The number of elements to skip before returning the remaining elements. + * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence. + */ + observableProto.skip = function (count) { + if (count < 0) { + throw new Error(argumentOutOfRange); + } + var observable = this; + return new AnonymousObservable(function (observer) { + var remaining = count; + return observable.subscribe(function (x) { + if (remaining <= 0) { + observer.onNext(x); + } else { + remaining--; + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements. + * The element's index is used in the logic of the predicate function. + * + * var res = source.skipWhile(function (value) { return value < 10; }); + * var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; }); + * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element. + * @param {Any} [thisArg] Object to use as this when executing callback. + * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate. + */ + observableProto.skipWhile = function (predicate, thisArg) { + var source = this; + return new AnonymousObservable(function (observer) { + var i = 0, running = false; + return source.subscribe(function (x) { + if (!running) { + try { + running = !predicate.call(thisArg, x, i++, source); + } catch (e) { + observer.onError(e); + return; + } + } + if (running) { + observer.onNext(x); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0). + * + * var res = source.take(5); + * var res = source.take(0, Rx.Scheduler.timeout); + * @param {Number} count The number of elements to return. + * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case 0) { + now = scheduler.now(); + d = d + p; + if (d <= now) { + d = now + p; + } + } + observer.onNext(count++); + self(d); + }); + }); + } + + /** + * Returns an observable sequence that produces a value after each period. + * + * @example + * 1 - res = Rx.Observable.interval(1000); + * 2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout); + * + * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds). + * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used. + * @returns {Observable} An observable sequence that produces a value after each period. + */ + var observableinterval = Observable.interval = function (period, scheduler) { + scheduler || (scheduler = timeoutScheduler); + return observableTimerTimeSpanAndPeriod(period, period, scheduler); + }; + + /** + * Returns an observable sequence that produces a value after dueTime has elapsed and then after each period. + * + * @example + * var res = Rx.Observable.timer(5000); + * var res = Rx.Observable.timer(5000, 1000); + * var res = Rx.Observable.timer(5000, Rx.Scheduler.timeout); + * var res = Rx.Observable.timer(5000, 1000, Rx.Scheduler.timeout); + * + * @param {Number} dueTime Relative time (specified as an integer denoting milliseconds) at which to produce the first value. + * @param {Mixed} [periodOrScheduler] Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring. + * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period. + */ + var observableTimer = Observable.timer = function (dueTime, periodOrScheduler, scheduler) { + var period; + scheduler || (scheduler = timeoutScheduler); + if (typeof periodOrScheduler === 'number') { + period = periodOrScheduler; + } else if (typeof periodOrScheduler === 'object' && 'now' in periodOrScheduler) { + scheduler = periodOrScheduler; + } + return period === undefined ? + observableTimerTimeSpan(dueTime, scheduler) : + observableTimerTimeSpanAndPeriod(dueTime, period, scheduler); + }; + + /** + * Time shifts the observable sequence by dueTime. The relative time intervals between the values are preserved. + * + * @example + * var res = Rx.Observable.delay(5000); + * var res = Rx.Observable.delay(5000, 1000, Rx.Scheduler.timeout); + * @memberOf Observable# + * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence. + * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} Time-shifted sequence. + */ + observableProto.delay = function (dueTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + var source = this; + return new AnonymousObservable(function (observer) { + var active = false, + cancelable = new SerialDisposable(), + exception = null, + q = [], + running = false, + subscription; + subscription = source.materialize().timestamp(scheduler).subscribe(function (notification) { + var d, shouldRun; + if (notification.value.kind === 'E') { + q = []; + q.push(notification); + exception = notification.value.exception; + shouldRun = !running; + } else { + q.push({ value: notification.value, timestamp: notification.timestamp + dueTime }); + shouldRun = !active; + active = true; + } + if (shouldRun) { + if (exception !== null) { + observer.onError(exception); + } else { + d = new SingleAssignmentDisposable(); + cancelable.setDisposable(d); + d.setDisposable(scheduler.scheduleRecursiveWithRelative(dueTime, function (self) { + var e, recurseDueTime, result, shouldRecurse; + if (exception !== null) { + return; + } + running = true; + do { + result = null; + if (q.length > 0 && q[0].timestamp - scheduler.now() <= 0) { + result = q.shift().value; + } + if (result !== null) { + result.accept(observer); + } + } while (result !== null); + shouldRecurse = false; + recurseDueTime = 0; + if (q.length > 0) { + shouldRecurse = true; + recurseDueTime = Math.max(0, q[0].timestamp - scheduler.now()); + } else { + active = false; + } + e = exception; + running = false; + if (e !== null) { + observer.onError(e); + } else if (shouldRecurse) { + self(recurseDueTime); + } + })); + } + } + }); + return new CompositeDisposable(subscription, cancelable); + }); + }; + + /** + * Ignores values from an observable sequence which are followed by another value before dueTime. + * + * @example + * 1 - res = source.throttle(5000); // 5 seconds + * 2 - res = source.throttle(5000, scheduler); + * + * @param {Number} dueTime Duration of the throttle period for each value (specified as an integer denoting milliseconds). + * @param {Scheduler} [scheduler] Scheduler to run the throttle timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} The throttled sequence. + */ + observableProto.throttle = function (dueTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + var source = this; + return this.throttleWithSelector(function () { return observableTimer(dueTime, scheduler); }) + }; + + /** + * Records the time interval between consecutive values in an observable sequence. + * + * @example + * 1 - res = source.timeInterval(); + * 2 - res = source.timeInterval(Rx.Scheduler.timeout); + * + * @param [scheduler] Scheduler used to compute time intervals. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence with time interval information on values. + */ + observableProto.timeInterval = function (scheduler) { + var source = this; + scheduler || (scheduler = timeoutScheduler); + return observableDefer(function () { + var last = scheduler.now(); + return source.select(function (x) { + var now = scheduler.now(), span = now - last; + last = now; + return { + value: x, + interval: span + }; + }); + }); + }; + + /** + * Records the timestamp for each value in an observable sequence. + * + * @example + * 1 - res = source.timestamp(); // produces { value: x, timestamp: ts } + * 2 - res = source.timestamp(Rx.Scheduler.timeout); + * + * @param {Scheduler} [scheduler] Scheduler used to compute timestamps. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence with timestamp information on values. + */ + observableProto.timestamp = function (scheduler) { + scheduler || (scheduler = timeoutScheduler); + return this.select(function (x) { + return { + value: x, + timestamp: scheduler.now() + }; + }); + }; + + function sampleObservable(source, sampler) { + + return new AnonymousObservable(function (observer) { + var atEnd, value, hasValue; + + function sampleSubscribe() { + if (hasValue) { + hasValue = false; + observer.onNext(value); + } + if (atEnd) { + observer.onCompleted(); + } + } + + return new CompositeDisposable( + source.subscribe(function (newValue) { + hasValue = true; + value = newValue; + }, observer.onError.bind(observer), function () { + atEnd = true; + }), + sampler.subscribe(sampleSubscribe, observer.onError.bind(observer), sampleSubscribe) + ); + }); + } + + /** + * Samples the observable sequence at each interval. + * + * @example + * 1 - res = source.sample(sampleObservable); // Sampler tick sequence + * 2 - res = source.sample(5000); // 5 seconds + * 2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds + * + * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable. + * @param {Scheduler} [scheduler] Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used. + * @returns {Observable} Sampled observable sequence. + */ + observableProto.sample = function (intervalOrSampler, scheduler) { + scheduler || (scheduler = timeoutScheduler); + if (typeof intervalOrSampler === 'number') { + return sampleObservable(this, observableinterval(intervalOrSampler, scheduler)); + } + return sampleObservable(this, intervalOrSampler); + }; + + /** + * Returns the source observable sequence or the other observable sequence if dueTime elapses. + * + * @example + * 1 - res = source.timeout(new Date()); // As a date + * 2 - res = source.timeout(5000); // 5 seconds + * 3 - res = source.timeout(new Date(), Rx.Observable.returnValue(42)); // As a date and timeout observable + * 4 - res = source.timeout(5000, Rx.Observable.returnValue(42)); // 5 seconds and timeout observable + * 5 - res = source.timeout(new Date(), Rx.Observable.returnValue(42), Rx.Scheduler.timeout); // As a date and timeout observable + * 6 - res = source.timeout(5000, Rx.Observable.returnValue(42), Rx.Scheduler.timeout); // 5 seconds and timeout observable + * + * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs. + * @param {Observable} [other] Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used. + * @param {Scheduler} [scheduler] Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} The source sequence switching to the other sequence in case of a timeout. + */ + observableProto.timeout = function (dueTime, other, scheduler) { + other || (other = observableThrow(new Error('Timeout'))); + scheduler || (scheduler = timeoutScheduler); + + var source = this, schedulerMethod = dueTime instanceof Date ? + 'scheduleWithAbsolute' : + 'scheduleWithRelative'; + + return new AnonymousObservable(function (observer) { + var id = 0, + original = new SingleAssignmentDisposable(), + subscription = new SerialDisposable(), + switched = false, + timer = new SerialDisposable(); + + subscription.setDisposable(original); + + var createTimer = function () { + var myId = id; + timer.setDisposable(scheduler[schedulerMethod](dueTime, function () { + if (id === myId) { + isPromise(other) && (other = observableFromPromise(other)); + subscription.setDisposable(other.subscribe(observer)); + } + })); + }; + + createTimer(); + + original.setDisposable(source.subscribe(function (x) { + if (!switched) { + id++; + observer.onNext(x); + createTimer(); + } + }, function (e) { + if (!switched) { + id++; + observer.onError(e); + } + }, function () { + if (!switched) { + id++; + observer.onCompleted(); + } + })); + return new CompositeDisposable(subscription, timer); + }); + }; + + /** + * Generates an observable sequence by iterating a state from an initial state until the condition fails. + * + * @example + * res = source.generateWithRelativeTime(0, + * function (x) { return return true; }, + * function (x) { return x + 1; }, + * function (x) { return x; }, + * function (x) { return 500; } + * ); + * + * @param {Mixed} initialState Initial state. + * @param {Function} condition Condition to terminate generation (upon returning false). + * @param {Function} iterate Iteration step function. + * @param {Function} resultSelector Selector function for results produced in the sequence. + * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning integer values denoting milliseconds. + * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used. + * @returns {Observable} The generated sequence. + */ + Observable.generateWithRelativeTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) { + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var first = true, + hasResult = false, + result, + state = initialState, + time; + return scheduler.scheduleRecursiveWithRelative(0, function (self) { + if (hasResult) { + observer.onNext(result); + } + try { + if (first) { + first = false; + } else { + state = iterate(state); + } + hasResult = condition(state); + if (hasResult) { + result = resultSelector(state); + time = timeSelector(state); + } + } catch (e) { + observer.onError(e); + return; + } + if (hasResult) { + self(time); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * Time shifts the observable sequence by delaying the subscription. + * + * @example + * 1 - res = source.delaySubscription(5000); // 5s + * 2 - res = source.delaySubscription(5000, Rx.Scheduler.timeout); // 5 seconds + * + * @param {Number} dueTime Absolute or relative time to perform the subscription at. + * @param {Scheduler} [scheduler] Scheduler to run the subscription delay timer on. If not specified, the timeout scheduler is used. + * @returns {Observable} Time-shifted sequence. + */ + observableProto.delaySubscription = function (dueTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + return this.delayWithSelector(observableTimer(dueTime, scheduler), function () { return observableEmpty(); }); + }; + + /** + * Time shifts the observable sequence based on a subscription delay and a delay selector function for each element. + * + * @example + * 1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(5000); }); // with selector only + * 1 - res = source.delayWithSelector(Rx.Observable.timer(2000), function (x) { return Rx.Observable.timer(x); }); // with delay and selector + * + * @param {Observable} [subscriptionDelay] Sequence indicating the delay for the subscription to the source. + * @param {Function} delayDurationSelector Selector function to retrieve a sequence indicating the delay for each given element. + * @returns {Observable} Time-shifted sequence. + */ + observableProto.delayWithSelector = function (subscriptionDelay, delayDurationSelector) { + var source = this, subDelay, selector; + if (typeof subscriptionDelay === 'function') { + selector = subscriptionDelay; + } else { + subDelay = subscriptionDelay; + selector = delayDurationSelector; + } + return new AnonymousObservable(function (observer) { + var delays = new CompositeDisposable(), atEnd = false, done = function () { + if (atEnd && delays.length === 0) { + observer.onCompleted(); + } + }, subscription = new SerialDisposable(), start = function () { + subscription.setDisposable(source.subscribe(function (x) { + var delay; + try { + delay = selector(x); + } catch (error) { + observer.onError(error); + return; + } + var d = new SingleAssignmentDisposable(); + delays.add(d); + d.setDisposable(delay.subscribe(function () { + observer.onNext(x); + delays.remove(d); + done(); + }, observer.onError.bind(observer), function () { + observer.onNext(x); + delays.remove(d); + done(); + })); + }, observer.onError.bind(observer), function () { + atEnd = true; + subscription.dispose(); + done(); + })); + }; + + if (!subDelay) { + start(); + } else { + subscription.setDisposable(subDelay.subscribe(function () { + start(); + }, observer.onError.bind(observer), function () { start(); })); + } + + return new CompositeDisposable(subscription, delays); + }); + }; + + /** + * Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled. + * + * @example + * 1 - res = source.timeoutWithSelector(Rx.Observable.timer(500)); + * 2 - res = source.timeoutWithSelector(Rx.Observable.timer(500), function (x) { return Rx.Observable.timer(200); }); + * 3 - res = source.timeoutWithSelector(Rx.Observable.timer(500), function (x) { return Rx.Observable.timer(200); }, Rx.Observable.returnValue(42)); + * + * @param {Observable} [firstTimeout] Observable sequence that represents the timeout for the first element. If not provided, this defaults to Observable.never(). + * @param {Function} [timeoutDurationSelector] Selector to retrieve an observable sequence that represents the timeout between the current element and the next element. + * @param {Observable} [other] Sequence to return in case of a timeout. If not provided, this is set to Observable.throwException(). + * @returns {Observable} The source sequence switching to the other sequence in case of a timeout. + */ + observableProto.timeoutWithSelector = function (firstTimeout, timeoutdurationSelector, other) { + if (arguments.length === 1) { + timeoutdurationSelector = firstTimeout; + var firstTimeout = observableNever(); + } + other || (other = observableThrow(new Error('Timeout'))); + var source = this; + return new AnonymousObservable(function (observer) { + var subscription = new SerialDisposable(), timer = new SerialDisposable(), original = new SingleAssignmentDisposable(); + + subscription.setDisposable(original); + + var id = 0, switched = false, setTimer = function (timeout) { + var myId = id, timerWins = function () { + return id === myId; + }; + var d = new SingleAssignmentDisposable(); + timer.setDisposable(d); + d.setDisposable(timeout.subscribe(function () { + if (timerWins()) { + subscription.setDisposable(other.subscribe(observer)); + } + d.dispose(); + }, function (e) { + if (timerWins()) { + observer.onError(e); + } + }, function () { + if (timerWins()) { + subscription.setDisposable(other.subscribe(observer)); + } + })); + }; + + setTimer(firstTimeout); + var observerWins = function () { + var res = !switched; + if (res) { + id++; + } + return res; + }; + + original.setDisposable(source.subscribe(function (x) { + if (observerWins()) { + observer.onNext(x); + var timeout; + try { + timeout = timeoutdurationSelector(x); + } catch (e) { + observer.onError(e); + return; + } + setTimer(timeout); + } + }, function (e) { + if (observerWins()) { + observer.onError(e); + } + }, function () { + if (observerWins()) { + observer.onCompleted(); + } + })); + return new CompositeDisposable(subscription, timer); + }); + }; + + /** + * Ignores values from an observable sequence which are followed by another value within a computed throttle duration. + * + * @example + * 1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(x + x); }); + * + * @param {Function} throttleDurationSelector Selector function to retrieve a sequence indicating the throttle duration for each given element. + * @returns {Observable} The throttled sequence. + */ + observableProto.throttleWithSelector = function (throttleDurationSelector) { + var source = this; + return new AnonymousObservable(function (observer) { + var value, hasValue = false, cancelable = new SerialDisposable(), id = 0, subscription = source.subscribe(function (x) { + var throttle; + try { + throttle = throttleDurationSelector(x); + } catch (e) { + observer.onError(e); + return; + } + hasValue = true; + value = x; + id++; + var currentid = id, d = new SingleAssignmentDisposable(); + cancelable.setDisposable(d); + d.setDisposable(throttle.subscribe(function () { + if (hasValue && id === currentid) { + observer.onNext(value); + } + hasValue = false; + d.dispose(); + }, observer.onError.bind(observer), function () { + if (hasValue && id === currentid) { + observer.onNext(value); + } + hasValue = false; + d.dispose(); + })); + }, function (e) { + cancelable.dispose(); + observer.onError(e); + hasValue = false; + id++; + }, function () { + cancelable.dispose(); + if (hasValue) { + observer.onNext(value); + } + observer.onCompleted(); + hasValue = false; + id++; + }); + return new CompositeDisposable(subscription, cancelable); + }); + }; + + /** + * Skips elements for the specified duration from the end of the observable source sequence, using the specified scheduler to run timers. + * + * 1 - res = source.skipLastWithTime(5000); + * 2 - res = source.skipLastWithTime(5000, scheduler); + * + * @description + * This operator accumulates a queue with a length enough to store elements received during the initial duration window. + * As more elements are received, elements older than the specified duration are taken from the queue and produced on the + * result sequence. This causes elements to be delayed with duration. + * @param {Number} duration Duration for skipping elements from the end of the sequence. + * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout + * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the end of the source sequence. + */ + observableProto.skipLastWithTime = function (duration, scheduler) { + scheduler || (scheduler = timeoutScheduler); + var source = this; + return new AnonymousObservable(function (observer) { + var q = []; + return source.subscribe(function (x) { + var now = scheduler.now(); + q.push({ interval: now, value: x }); + while (q.length > 0 && now - q[0].interval >= duration) { + observer.onNext(q.shift().value); + } + }, observer.onError.bind(observer), function () { + var now = scheduler.now(); + while (q.length > 0 && now - q[0].interval >= duration) { + observer.onNext(q.shift().value); + } + observer.onCompleted(); + }); + }); + }; + + /** + * Returns elements within the specified duration from the end of the observable source sequence, using the specified schedulers to run timers and to drain the collected elements. + * + * @example + * 1 - res = source.takeLastWithTime(5000, [optional timer scheduler], [optional loop scheduler]); + * @description + * This operator accumulates a queue with a length enough to store elements received during the initial duration window. + * As more elements are received, elements older than the specified duration are taken from the queue and produced on the + * result sequence. This causes elements to be delayed with duration. + * @param {Number} duration Duration for taking elements from the end of the sequence. + * @param {Scheduler} [timerScheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @param {Scheduler} [loopScheduler] Scheduler to drain the collected elements. If not specified, defaults to Rx.Scheduler.immediate. + * @returns {Observable} An observable sequence with the elements taken during the specified duration from the end of the source sequence. + */ + observableProto.takeLastWithTime = function (duration, timerScheduler, loopScheduler) { + return this.takeLastBufferWithTime(duration, timerScheduler).selectMany(function (xs) { return observableFromArray(xs, loopScheduler); }); + }; + + /** + * Returns an array with the elements within the specified duration from the end of the observable source sequence, using the specified scheduler to run timers. + * + * @example + * 1 - res = source.takeLastBufferWithTime(5000, [optional scheduler]); + * @description + * This operator accumulates a queue with a length enough to store elements received during the initial duration window. + * As more elements are received, elements older than the specified duration are taken from the queue and produced on the + * result sequence. This causes elements to be delayed with duration. + * @param {Number} duration Duration for taking elements from the end of the sequence. + * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @returns {Observable} An observable sequence containing a single array with the elements taken during the specified duration from the end of the source sequence. + */ + observableProto.takeLastBufferWithTime = function (duration, scheduler) { + var source = this; + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var q = []; + + return source.subscribe(function (x) { + var now = scheduler.now(); + q.push({ interval: now, value: x }); + while (q.length > 0 && now - q[0].interval >= duration) { + q.shift(); + } + }, observer.onError.bind(observer), function () { + var now = scheduler.now(), res = []; + while (q.length > 0) { + var next = q.shift(); + if (now - next.interval <= duration) { + res.push(next.value); + } + } + + observer.onNext(res); + observer.onCompleted(); + }); + }); + }; + + /** + * Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers. + * + * @example + * 1 - res = source.takeWithTime(5000, [optional scheduler]); + * @description + * This operator accumulates a queue with a length enough to store elements received during the initial duration window. + * As more elements are received, elements older than the specified duration are taken from the queue and produced on the + * result sequence. This causes elements to be delayed with duration. + * @param {Number} duration Duration for taking elements from the start of the sequence. + * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @returns {Observable} An observable sequence with the elements taken during the specified duration from the start of the source sequence. + */ + observableProto.takeWithTime = function (duration, scheduler) { + var source = this; + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var t = scheduler.scheduleWithRelative(duration, function () { + observer.onCompleted(); + }); + + return new CompositeDisposable(t, source.subscribe(observer)); + }); + }; + + /** + * Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers. + * + * @example + * 1 - res = source.skipWithTime(5000, [optional scheduler]); + * + * @description + * Specifying a zero value for duration doesn't guarantee no elements will be dropped from the start of the source sequence. + * This is a side-effect of the asynchrony introduced by the scheduler, where the action that causes callbacks from the source sequence to be forwarded + * may not execute immediately, despite the zero due time. + * + * Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the duration. + * @param {Number} duration Duration for skipping elements from the start of the sequence. + * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the start of the source sequence. + */ + observableProto.skipWithTime = function (duration, scheduler) { + var source = this; + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var open = false, + t = scheduler.scheduleWithRelative(duration, function () { open = true; }), + d = source.subscribe(function (x) { + if (open) { + observer.onNext(x); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + + return new CompositeDisposable(t, d); + }); + }; + + /** + * Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers. + * Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time. + * + * @examples + * 1 - res = source.skipUntilWithTime(new Date(), [optional scheduler]); + * 2 - res = source.skipUntilWithTime(5000, [optional scheduler]); + * @param startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped. + * @param scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @returns {Observable} An observable sequence with the elements skipped until the specified start time. + */ + observableProto.skipUntilWithTime = function (startTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + var source = this, schedulerMethod = startTime instanceof Date ? + 'scheduleWithAbsolute' : + 'scheduleWithRelative'; + return new AnonymousObservable(function (observer) { + var open = false; + + return new CompositeDisposable( + scheduler[schedulerMethod](startTime, function () { open = true; }), + source.subscribe( + function (x) { open && observer.onNext(x); }, + observer.onError.bind(observer), + observer.onCompleted.bind(observer))); + }); + }; + + /** + * Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers. + * + * @example + * 1 - res = source.takeUntilWithTime(new Date(), [optional scheduler]); + * 2 - res = source.takeUntilWithTime(5000, [optional scheduler]); + * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately. + * @param {Scheduler} scheduler Scheduler to run the timer on. + * @returns {Observable} An observable sequence with the elements taken until the specified end time. + */ + observableProto.takeUntilWithTime = function (endTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + var source = this, schedulerMethod = endTime instanceof Date ? + 'scheduleWithAbsolute' : + 'scheduleWithRelative'; + return new AnonymousObservable(function (observer) { + return new CompositeDisposable(scheduler[schedulerMethod](endTime, function () { + observer.onCompleted(); + }), source.subscribe(observer)); + }); + }; + + var PausableObservable = (function (_super) { + + inherits(PausableObservable, _super); + + function subscribe(observer) { + var conn = this.source.publish(), + subscription = conn.subscribe(observer), + connection = disposableEmpty; + + var pausable = this.subject.distinctUntilChanged().subscribe(function (b) { + if (b) { + connection = conn.connect(); + } else { + connection.dispose(); + connection = disposableEmpty; + } + }); + + return new CompositeDisposable(subscription, connection, pausable); + } + + function PausableObservable(source, subject) { + this.source = source; + this.subject = subject || new Subject(); + this.isPaused = true; + _super.call(this, subscribe); + } + + PausableObservable.prototype.pause = function () { + if (this.isPaused === true){ + return; + } + this.isPaused = true; + this.subject.onNext(false); + }; + + PausableObservable.prototype.resume = function () { + if (this.isPaused === false){ + return; + } + this.isPaused = false; + this.subject.onNext(true); + }; + + return PausableObservable; + + }(Observable)); + + /** + * Pauses the underlying observable sequence based upon the observable sequence which yields true/false. + * @example + * var pauser = new Rx.Subject(); + * var source = Rx.Observable.interval(100).pausable(pauser); + * @param {Observable} pauser The observable sequence used to pause the underlying sequence. + * @returns {Observable} The observable sequence which is paused based upon the pauser. + */ + observableProto.pausable = function (pauser) { + return new PausableObservable(this, pauser); + }; + function combineLatestSource(source, subject, resultSelector) { + return new AnonymousObservable(function (observer) { + var n = 2, + hasValue = [false, false], + hasValueAll = false, + isDone = false, + values = new Array(n); + + function next(x, i) { + values[i] = x + var res; + hasValue[i] = true; + if (hasValueAll || (hasValueAll = hasValue.every(identity))) { + try { + res = resultSelector.apply(null, values); + } catch (ex) { + observer.onError(ex); + return; + } + observer.onNext(res); + } else if (isDone) { + observer.onCompleted(); + } + } + + return new CompositeDisposable( + source.subscribe( + function (x) { + next(x, 0); + }, + observer.onError.bind(observer), + function () { + isDone = true; + observer.onCompleted(); + }), + subject.subscribe( + function (x) { + next(x, 1); + }, + observer.onError.bind(observer)) + ); + }); + } + + var PausableBufferedObservable = (function (_super) { + + inherits(PausableBufferedObservable, _super); + + function subscribe(observer) { + var q = [], previous = true; + + var subscription = + combineLatestSource( + this.source, + this.subject.distinctUntilChanged(), + function (data, shouldFire) { + return { data: data, shouldFire: shouldFire }; + }) + .subscribe( + function (results) { + if (results.shouldFire && previous) { + observer.onNext(results.data); + } + if (results.shouldFire && !previous) { + while (q.length > 0) { + observer.onNext(q.shift()); + } + previous = true; + } else if (!results.shouldFire && !previous) { + q.push(results.data); + } else if (!results.shouldFire && previous) { + previous = false; + } + + }, + function (err) { + // Empty buffer before sending error + while (q.length > 0) { + observer.onNext(q.shift()); + } + observer.onError(err); + }, + function () { + // Empty buffer before sending completion + while (q.length > 0) { + observer.onNext(q.shift()); + } + observer.onCompleted(); + } + ); + + this.subject.onNext(false); + + return subscription; + } + + function PausableBufferedObservable(source, subject) { + this.source = source; + this.subject = subject || new Subject(); + this.isPaused = true; + _super.call(this, subscribe); + } + + PausableBufferedObservable.prototype.pause = function () { + if (this.isPaused === true){ + return; + } + this.isPaused = true; + this.subject.onNext(false); + }; + + PausableBufferedObservable.prototype.resume = function () { + if (this.isPaused === false){ + return; + } + this.isPaused = false; + this.subject.onNext(true); + }; + + return PausableBufferedObservable; + + }(Observable)); + + /** + * Pauses the underlying observable sequence based upon the observable sequence which yields true/false, + * and yields the values that were buffered while paused. + * @example + * var pauser = new Rx.Subject(); + * var source = Rx.Observable.interval(100).pausableBuffered(pauser); + * @param {Observable} pauser The observable sequence used to pause the underlying sequence. + * @returns {Observable} The observable sequence which is paused based upon the pauser. + */ + observableProto.pausableBuffered = function (subject) { + return new PausableBufferedObservable(this, subject); + }; + + /** + * Attaches a controller to the observable sequence with the ability to queue. + * @example + * var source = Rx.Observable.interval(100).controlled(); + * source.request(3); // Reads 3 values + * @param {Observable} pauser The observable sequence used to pause the underlying sequence. + * @returns {Observable} The observable sequence which is paused based upon the pauser. + */ + observableProto.controlled = function (enableQueue) { + if (enableQueue == null) { enableQueue = true; } + return new ControlledObservable(this, enableQueue); + }; + var ControlledObservable = (function (_super) { + + inherits(ControlledObservable, _super); + + function subscribe (observer) { + return this.source.subscribe(observer); + } + + function ControlledObservable (source, enableQueue) { + _super.call(this, subscribe); + this.subject = new ControlledSubject(enableQueue); + this.source = source.multicast(this.subject).refCount(); + } + + ControlledObservable.prototype.request = function (numberOfItems) { + if (numberOfItems == null) { numberOfItems = -1; } + return this.subject.request(numberOfItems); + }; + + return ControlledObservable; + + }(Observable)); + + var ControlledSubject = Rx.ControlledSubject = (function (_super) { + + function subscribe (observer) { + return this.subject.subscribe(observer); + } + + inherits(ControlledSubject, _super); + + function ControlledSubject(enableQueue) { + if (enableQueue == null) { + enableQueue = true; + } + + _super.call(this, subscribe); + this.subject = new Subject(); + this.enableQueue = enableQueue; + this.queue = enableQueue ? [] : null; + this.requestedCount = 0; + this.requestedDisposable = disposableEmpty; + this.error = null; + this.hasFailed = false; + this.hasCompleted = false; + this.controlledDisposable = disposableEmpty; + } + + addProperties(ControlledSubject.prototype, Observer, { + onCompleted: function () { + checkDisposed.call(this); + this.hasCompleted = true; + + if (!this.enableQueue || this.queue.length === 0) { + this.subject.onCompleted(); + } + }, + onError: function (error) { + checkDisposed.call(this); + this.hasFailed = true; + this.error = error; + + if (!this.enableQueue || this.queue.length === 0) { + this.subject.onError(error); + } + }, + onNext: function (value) { + checkDisposed.call(this); + var hasRequested = false; + + if (this.requestedCount === 0) { + if (this.enableQueue) { + this.queue.push(value); + } + } else { + if (this.requestedCount !== -1) { + if (this.requestedCount-- === 0) { + this.disposeCurrentRequest(); + } + } + hasRequested = true; + } + + if (hasRequested) { + this.subject.onNext(value); + } + }, + _processRequest: function (numberOfItems) { + if (this.enableQueue) { + //console.log('queue length', this.queue.length); + + while (this.queue.length >= numberOfItems && numberOfItems > 0) { + //console.log('number of items', numberOfItems); + this.subject.onNext(this.queue.shift()); + numberOfItems--; + } + + if (this.queue.length !== 0) { + return { numberOfItems: numberOfItems, returnValue: true }; + } else { + return { numberOfItems: numberOfItems, returnValue: false }; + } + } + + if (this.hasFailed) { + this.subject.onError(this.error); + this.controlledDisposable.dispose(); + this.controlledDisposable = disposableEmpty; + } else if (this.hasCompleted) { + this.subject.onCompleted(); + this.controlledDisposable.dispose(); + this.controlledDisposable = disposableEmpty; + } + + return { numberOfItems: numberOfItems, returnValue: false }; + }, + request: function (number) { + checkDisposed.call(this); + this.disposeCurrentRequest(); + var self = this, + r = this._processRequest(number); + + number = r.numberOfItems; + if (!r.returnValue) { + this.requestedCount = number; + this.requestedDisposable = disposableCreate(function () { + self.requestedCount = 0; + }); + + return this.requestedDisposable + } else { + return disposableEmpty; + } + }, + disposeCurrentRequest: function () { + this.requestedDisposable.dispose(); + this.requestedDisposable = disposableEmpty; + }, + + dispose: function () { + this.isDisposed = true; + this.error = null; + this.subject.dispose(); + this.requestedDisposable.dispose(); + } + }); + + return ControlledSubject; + }(Observable)); + /** + * Returns a new observable that triggers on the second and subsequent triggerings of the input observable. + * The Nth triggering of the input observable passes the arguments from the N-1th and Nth triggering as a pair. + * The argument passed to the N-1th triggering is held in hidden internal state until the Nth triggering occurs. + * @returns {Observable} An observable that triggers on successive pairs of observations from the input observable as an array. + */ + observableProto.pairwise = function () { + var source = this; + return new AnonymousObservable(function (observer) { + var previous, hasPrevious = false; + return source.subscribe( + function (x) { + if (hasPrevious) { + observer.onNext([previous, x]); + } else { + hasPrevious = true; + } + previous = x; + }, + observer.onError.bind(observer), + observer.onCompleted.bind(observer)); + }); + }; + /** + * Returns two observables which partition the observations of the source by the given function. + * The first will trigger observations for those values for which the predicate returns true. + * The second will trigger observations for those values where the predicate returns false. + * The predicate is executed once for each subscribed observer. + * Both also propagate all error observations arising from the source and each completes + * when the source completes. + * @param {Function} predicate + * The function to determine which output Observable will trigger a particular observation. + * @returns {Array} + * An array of observables. The first triggers when the predicate returns true, + * and the second triggers when the predicate returns false. + */ + observableProto.partition = function(predicate, thisArg) { + var published = this.publish().refCount(); + return [ + published.filter(predicate, thisArg), + published.filter(function (x, i, o) { return !predicate.call(thisArg, x, i, o); }) + ]; + }; + + /* + * Performs a exclusive waiting for the first to finish before subscribing to another observable. + * Observables that come in between subscriptions will be dropped on the floor. + * @returns {Observable} A exclusive observable with only the results that happen when subscribed. + */ + observableProto.exclusive = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var hasCurrent = false, + isStopped = false, + m = new SingleAssignmentDisposable(), + g = new CompositeDisposable(); + + g.add(m); + + m.setDisposable(sources.subscribe( + function (innerSource) { + if (!hasCurrent) { + hasCurrent = true; + + isPromise(innerSource) && (innerSource = observableFromPromise(innerSource)); + + var innerSubscription = new SingleAssignmentDisposable(); + g.add(innerSubscription); + + innerSubscription.setDisposable(innerSource.subscribe( + observer.onNext.bind(observer), + observer.onError.bind(observer), + function () { + g.remove(innerSubscription); + hasCurrent = false; + if (isStopped && g.length === 1) { + observer.onCompleted(); + } + })); + } + }, + observer.onError.bind(observer), + function () { + isStopped = true; + if (!hasCurrent && g.length === 1) { + observer.onCompleted(); + } + })); + + return g; + }); + }; + /* + * Performs a exclusive map waiting for the first to finish before subscribing to another observable. + * Observables that come in between subscriptions will be dropped on the floor. + * @param {Function} selector Selector to invoke for every item in the current subscription. + * @param {Any} [thisArg] An optional context to invoke with the selector parameter. + * @returns {Observable} An exclusive observable with only the results that happen when subscribed. + */ + observableProto.exclusiveMap = function (selector, thisArg) { + var sources = this; + return new AnonymousObservable(function (observer) { + var index = 0, + hasCurrent = false, + isStopped = true, + m = new SingleAssignmentDisposable(), + g = new CompositeDisposable(); + + g.add(m); + + m.setDisposable(sources.subscribe( + function (innerSource) { + + if (!hasCurrent) { + hasCurrent = true; + + innerSubscription = new SingleAssignmentDisposable(); + g.add(innerSubscription); + + isPromise(innerSource) && (innerSource = observableFromPromise(innerSource)); + + innerSubscription.setDisposable(innerSource.subscribe( + function (x) { + var result; + try { + result = selector.call(thisArg, x, index++, innerSource); + } catch (e) { + observer.onError(e); + return; + } + + observer.onNext(result); + }, + observer.onError.bind(observer), + function () { + g.remove(innerSubscription); + hasCurrent = false; + + if (isStopped && g.length === 1) { + observer.onCompleted(); + } + })); + } + }, + observer.onError.bind(observer), + function () { + isStopped = true; + if (g.length === 1 && !hasCurrent) { + observer.onCompleted(); + } + })); + return g; + }); + }; + var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) { + inherits(AnonymousObservable, __super__); + + // Fix subscriber to check for undefined or function returned to decorate as Disposable + function fixSubscriber(subscriber) { + if (typeof subscriber === 'undefined') { + subscriber = disposableEmpty; + } else if (typeof subscriber === 'function') { + subscriber = disposableCreate(subscriber); + } + + return subscriber; + } + + function AnonymousObservable(subscribe) { + if (!(this instanceof AnonymousObservable)) { + return new AnonymousObservable(subscribe); + } + + function s(observer) { + var setDisposable = function () { + try { + autoDetachObserver.setDisposable(fixSubscriber(subscribe(autoDetachObserver))); + } catch (e) { + if (!autoDetachObserver.fail(e)) { + throw e; + } + } + }; + + var autoDetachObserver = new AutoDetachObserver(observer); + if (currentThreadScheduler.scheduleRequired()) { + currentThreadScheduler.schedule(setDisposable); + } else { + setDisposable(); + } + + return autoDetachObserver; + } + + __super__.call(this, s); + } + + return AnonymousObservable; + + }(Observable)); + + /** @private */ + var AutoDetachObserver = (function (_super) { + inherits(AutoDetachObserver, _super); + + function AutoDetachObserver(observer) { + _super.call(this); + this.observer = observer; + this.m = new SingleAssignmentDisposable(); + } + + var AutoDetachObserverPrototype = AutoDetachObserver.prototype; + + AutoDetachObserverPrototype.next = function (value) { + var noError = false; + try { + this.observer.onNext(value); + noError = true; + } catch (e) { + throw e; + } finally { + if (!noError) { + this.dispose(); + } + } + }; + + AutoDetachObserverPrototype.error = function (exn) { + try { + this.observer.onError(exn); + } catch (e) { + throw e; + } finally { + this.dispose(); + } + }; + + AutoDetachObserverPrototype.completed = function () { + try { + this.observer.onCompleted(); + } catch (e) { + throw e; + } finally { + this.dispose(); + } + }; + + AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); }; + AutoDetachObserverPrototype.getDisposable = function (value) { return this.m.getDisposable(); }; + /* @private */ + AutoDetachObserverPrototype.disposable = function (value) { + return arguments.length ? this.getDisposable() : setDisposable(value); + }; + + AutoDetachObserverPrototype.dispose = function () { + _super.prototype.dispose.call(this); + this.m.dispose(); + }; + + return AutoDetachObserver; + }(AbstractObserver)); + + /** @private */ + var InnerSubscription = function (subject, observer) { + this.subject = subject; + this.observer = observer; + }; + + /** + * @private + * @memberOf InnerSubscription + */ + InnerSubscription.prototype.dispose = function () { + if (!this.subject.isDisposed && this.observer !== null) { + var idx = this.subject.observers.indexOf(this.observer); + this.subject.observers.splice(idx, 1); + this.observer = null; + } + }; + + /** + * Represents an object that is both an observable sequence as well as an observer. + * Each notification is broadcasted to all subscribed observers. + */ + var Subject = Rx.Subject = (function (_super) { + function subscribe(observer) { + checkDisposed.call(this); + if (!this.isStopped) { + this.observers.push(observer); + return new InnerSubscription(this, observer); + } + if (this.exception) { + observer.onError(this.exception); + return disposableEmpty; + } + observer.onCompleted(); + return disposableEmpty; + } + + inherits(Subject, _super); + + /** + * Creates a subject. + * @constructor + */ + function Subject() { + _super.call(this, subscribe); + this.isDisposed = false, + this.isStopped = false, + this.observers = []; + } + + addProperties(Subject.prototype, Observer, { + /** + * Indicates whether the subject has observers subscribed to it. + * @returns {Boolean} Indicates whether the subject has observers subscribed to it. + */ + hasObservers: function () { + return this.observers.length > 0; + }, + /** + * Notifies all subscribed observers about the end of the sequence. + */ + onCompleted: function () { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + for (var i = 0, len = os.length; i < len; i++) { + os[i].onCompleted(); + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the exception. + * @param {Mixed} error The exception to send to all observers. + */ + onError: function (exception) { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + this.exception = exception; + for (var i = 0, len = os.length; i < len; i++) { + os[i].onError(exception); + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the arrival of the specified element in the sequence. + * @param {Mixed} value The value to send to all observers. + */ + onNext: function (value) { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + for (var i = 0, len = os.length; i < len; i++) { + os[i].onNext(value); + } + } + }, + /** + * Unsubscribe all observers and release resources. + */ + dispose: function () { + this.isDisposed = true; + this.observers = null; + } + }); + + /** + * Creates a subject from the specified observer and observable. + * @param {Observer} observer The observer used to send messages to the subject. + * @param {Observable} observable The observable used to subscribe to messages sent from the subject. + * @returns {Subject} Subject implemented using the given observer and observable. + */ + Subject.create = function (observer, observable) { + return new AnonymousSubject(observer, observable); + }; + + return Subject; + }(Observable)); + + /** + * Represents the result of an asynchronous operation. + * The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers. + */ + var AsyncSubject = Rx.AsyncSubject = (function (_super) { + + function subscribe(observer) { + checkDisposed.call(this); + + if (!this.isStopped) { + this.observers.push(observer); + return new InnerSubscription(this, observer); + } + + var ex = this.exception, + hv = this.hasValue, + v = this.value; + + if (ex) { + observer.onError(ex); + } else if (hv) { + observer.onNext(v); + observer.onCompleted(); + } else { + observer.onCompleted(); + } + + return disposableEmpty; + } + + inherits(AsyncSubject, _super); + + /** + * Creates a subject that can only receive one value and that value is cached for all future observations. + * @constructor + */ + function AsyncSubject() { + _super.call(this, subscribe); + + this.isDisposed = false; + this.isStopped = false; + this.value = null; + this.hasValue = false; + this.observers = []; + this.exception = null; + } + + addProperties(AsyncSubject.prototype, Observer, { + /** + * Indicates whether the subject has observers subscribed to it. + * @returns {Boolean} Indicates whether the subject has observers subscribed to it. + */ + hasObservers: function () { + checkDisposed.call(this); + return this.observers.length > 0; + }, + /** + * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any). + */ + onCompleted: function () { + var o, i, len; + checkDisposed.call(this); + if (!this.isStopped) { + this.isStopped = true; + var os = this.observers.slice(0), + v = this.value, + hv = this.hasValue; + + if (hv) { + for (i = 0, len = os.length; i < len; i++) { + o = os[i]; + o.onNext(v); + o.onCompleted(); + } + } else { + for (i = 0, len = os.length; i < len; i++) { + os[i].onCompleted(); + } + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the exception. + * @param {Mixed} error The exception to send to all observers. + */ + onError: function (exception) { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + this.exception = exception; + + for (var i = 0, len = os.length; i < len; i++) { + os[i].onError(exception); + } + + this.observers = []; + } + }, + /** + * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers. + * @param {Mixed} value The value to store in the subject. + */ + onNext: function (value) { + checkDisposed.call(this); + if (!this.isStopped) { + this.value = value; + this.hasValue = true; + } + }, + /** + * Unsubscribe all observers and release resources. + */ + dispose: function () { + this.isDisposed = true; + this.observers = null; + this.exception = null; + this.value = null; + } + }); + + return AsyncSubject; + }(Observable)); + + /** @private */ + var AnonymousSubject = (function (_super) { + inherits(AnonymousSubject, _super); + + function subscribe(observer) { + return this.observable.subscribe(observer); + } + + /** + * @private + * @constructor + */ + function AnonymousSubject(observer, observable) { + _super.call(this, subscribe); + this.observer = observer; + this.observable = observable; + } + + addProperties(AnonymousSubject.prototype, Observer, { + /** + * @private + * @memberOf AnonymousSubject# + */ + onCompleted: function () { + this.observer.onCompleted(); + }, + /** + * @private + * @memberOf AnonymousSubject# + */ + onError: function (exception) { + this.observer.onError(exception); + }, + /** + * @private + * @memberOf AnonymousSubject# + */ + onNext: function (value) { + this.observer.onNext(value); + } + }); + + return AnonymousSubject; + }(Observable)); + + /** + * Represents a value that changes over time. + * Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications. + */ + var BehaviorSubject = Rx.BehaviorSubject = (function (_super) { + function subscribe(observer) { + checkDisposed.call(this); + if (!this.isStopped) { + this.observers.push(observer); + observer.onNext(this.value); + return new InnerSubscription(this, observer); + } + var ex = this.exception; + if (ex) { + observer.onError(ex); + } else { + observer.onCompleted(); + } + return disposableEmpty; + } + + inherits(BehaviorSubject, _super); + + /** + * @constructor + * Initializes a new instance of the BehaviorSubject class which creates a subject that caches its last value and starts with the specified value. + * @param {Mixed} value Initial value sent to observers when no other value has been received by the subject yet. + */ + function BehaviorSubject(value) { + _super.call(this, subscribe); + + this.value = value, + this.observers = [], + this.isDisposed = false, + this.isStopped = false, + this.exception = null; + } + + addProperties(BehaviorSubject.prototype, Observer, { + /** + * Indicates whether the subject has observers subscribed to it. + * @returns {Boolean} Indicates whether the subject has observers subscribed to it. + */ + hasObservers: function () { + return this.observers.length > 0; + }, + /** + * Notifies all subscribed observers about the end of the sequence. + */ + onCompleted: function () { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + for (var i = 0, len = os.length; i < len; i++) { + os[i].onCompleted(); + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the exception. + * @param {Mixed} error The exception to send to all observers. + */ + onError: function (error) { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + this.exception = error; + + for (var i = 0, len = os.length; i < len; i++) { + os[i].onError(error); + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the arrival of the specified element in the sequence. + * @param {Mixed} value The value to send to all observers. + */ + onNext: function (value) { + checkDisposed.call(this); + if (!this.isStopped) { + this.value = value; + var os = this.observers.slice(0); + for (var i = 0, len = os.length; i < len; i++) { + os[i].onNext(value); + } + } + }, + /** + * Unsubscribe all observers and release resources. + */ + dispose: function () { + this.isDisposed = true; + this.observers = null; + this.value = null; + this.exception = null; + } + }); + + return BehaviorSubject; + }(Observable)); + + /** + * Represents an object that is both an observable sequence as well as an observer. + * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies. + */ + var ReplaySubject = Rx.ReplaySubject = (function (_super) { + + function RemovableDisposable (subject, observer) { + this.subject = subject; + this.observer = observer; + }; + + RemovableDisposable.prototype.dispose = function () { + this.observer.dispose(); + if (!this.subject.isDisposed) { + var idx = this.subject.observers.indexOf(this.observer); + this.subject.observers.splice(idx, 1); + } + }; + + function subscribe(observer) { + var so = new ScheduledObserver(this.scheduler, observer), + subscription = new RemovableDisposable(this, so); + checkDisposed.call(this); + this._trim(this.scheduler.now()); + this.observers.push(so); + + var n = this.q.length; + + for (var i = 0, len = this.q.length; i < len; i++) { + so.onNext(this.q[i].value); + } + + if (this.hasError) { + n++; + so.onError(this.error); + } else if (this.isStopped) { + n++; + so.onCompleted(); + } + + so.ensureActive(n); + return subscription; + } + + inherits(ReplaySubject, _super); + + /** + * Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler. + * @param {Number} [bufferSize] Maximum element count of the replay buffer. + * @param {Number} [windowSize] Maximum time length of the replay buffer. + * @param {Scheduler} [scheduler] Scheduler the observers are invoked on. + */ + function ReplaySubject(bufferSize, windowSize, scheduler) { + this.bufferSize = bufferSize == null ? Number.MAX_VALUE : bufferSize; + this.windowSize = windowSize == null ? Number.MAX_VALUE : windowSize; + this.scheduler = scheduler || currentThreadScheduler; + this.q = []; + this.observers = []; + this.isStopped = false; + this.isDisposed = false; + this.hasError = false; + this.error = null; + _super.call(this, subscribe); + } + + addProperties(ReplaySubject.prototype, Observer, { + /** + * Indicates whether the subject has observers subscribed to it. + * @returns {Boolean} Indicates whether the subject has observers subscribed to it. + */ + hasObservers: function () { + return this.observers.length > 0; + }, + /* @private */ + _trim: function (now) { + while (this.q.length > this.bufferSize) { + this.q.shift(); + } + while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) { + this.q.shift(); + } + }, + /** + * Notifies all subscribed observers about the arrival of the specified element in the sequence. + * @param {Mixed} value The value to send to all observers. + */ + onNext: function (value) { + var observer; + checkDisposed.call(this); + if (!this.isStopped) { + var now = this.scheduler.now(); + this.q.push({ interval: now, value: value }); + this._trim(now); + + var o = this.observers.slice(0); + for (var i = 0, len = o.length; i < len; i++) { + observer = o[i]; + observer.onNext(value); + observer.ensureActive(); + } + } + }, + /** + * Notifies all subscribed observers about the exception. + * @param {Mixed} error The exception to send to all observers. + */ + onError: function (error) { + var observer; + checkDisposed.call(this); + if (!this.isStopped) { + this.isStopped = true; + this.error = error; + this.hasError = true; + var now = this.scheduler.now(); + this._trim(now); + var o = this.observers.slice(0); + for (var i = 0, len = o.length; i < len; i++) { + observer = o[i]; + observer.onError(error); + observer.ensureActive(); + } + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the end of the sequence. + */ + onCompleted: function () { + var observer; + checkDisposed.call(this); + if (!this.isStopped) { + this.isStopped = true; + var now = this.scheduler.now(); + this._trim(now); + var o = this.observers.slice(0); + for (var i = 0, len = o.length; i < len; i++) { + observer = o[i]; + observer.onCompleted(); + observer.ensureActive(); + } + this.observers = []; + } + }, + /** + * Unsubscribe all observers and release resources. + */ + dispose: function () { + this.isDisposed = true; + this.observers = null; + } + }); + + return ReplaySubject; + }(Observable)); + + if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) { + root.Rx = Rx; + + define(function() { + return Rx; + }); + } else if (freeExports && freeModule) { + // in Node.js or RingoJS + if (moduleExports) { + (freeModule.exports = Rx).Rx = Rx; + } else { + freeExports.Rx = Rx; + } + } else { + // in a browser or Rhino + root.Rx = Rx; + } +}.call(this)); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.lite.compat.min.js b/ajax/libs/rxjs/2.2.28/rx.lite.compat.min.js new file mode 100644 index 000000000..7b1cf88da --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.lite.compat.min.js @@ -0,0 +1,2 @@ +(function(t){function e(){if(this.isDisposed)throw Error(z)}function n(t){var e=typeof t;return t&&("function"==e||"object"==e)||!1}function r(t){var e=[];if(!n(t))return e;ce.nonEnumArgs&&t.length&&u(t)&&(t=he.call(t));var r=ce.enumPrototypes&&"function"==typeof t,i=ce.enumErrorProps&&(t===ne||t instanceof Error);for(var o in t)r&&"prototype"==o||i&&("message"==o||"name"==o)||e.push(o);if(ce.nonEnumShadows&&t!==re){var s=t.constructor,c=-1,a=se.length;if(t===(s&&s.prototype))var h=t===stringProto?G:t===ne?$:Y.call(t),l=ue[h];for(;a>++c;)o=se[c],l&&l[o]||!te.call(t,o)||e.push(o)}return e}function i(t,e,n){for(var r=-1,i=n(t),o=i.length;o>++r;){var s=i[r];if(e(t[s],s,t)===!1)break}return t}function o(t,e){return i(t,e,r)}function s(t){return"function"!=typeof t.toString&&"string"==typeof(t+"")}function u(t){return t&&"object"==typeof t?Y.call(t)==B:!1}function c(t){return"function"==typeof t||!1}function a(e,n,r,i){if(e===n)return 0!==e||1/e==1/n;var h=typeof e,l=typeof n;if(e===e&&(null==e||null==n||"function"!=h&&"object"!=h&&"function"!=l&&"object"!=l))return!1;var f=Y.call(e),p=Y.call(n);if(f==B&&(f=Z),p==B&&(p=Z),f!=p)return!1;switch(f){case Q:case H:return+e==+n;case J:return e!=+e?n!=+n:0==e?1/e==1/n:e==+n;case X:case G:return e==n+""}var d=f==U;if(!d){if(f!=Z||!ce.nodeClass&&(s(e)||s(n)))return!1;var b=!ce.argsObject&&u(e)?Object:e.constructor,v=!ce.argsObject&&u(n)?Object:n.constructor;if(!(b==v||te.call(e,"constructor")&&te.call(n,"constructor")||c(b)&&b instanceof b&&c(v)&&v instanceof v||!("constructor"in e&&"constructor"in n)))return!1}r||(r=[]),i||(i=[]);for(var m=r.length;m--;)if(r[m]==e)return i[m]==n;var y=0;if(result=!0,r.push(e),i.push(n),d){if(m=e.length,y=n.length,result=y==m)for(;y--;){var w=n[y];if(!(result=a(e[y],w,r,i)))break}}else o(n,function(n,o,s){return te.call(s,o)?(y++,result=te.call(e,o)&&a(e[o],n,r,i)):t}),result&&o(e,function(e,n,r){return te.call(r,n)?result=--y>-1:t});return r.pop(),i.pop(),result}function h(t,e){return 1===t.length&&Array.isArray(t[e])?t[e]:he.call(t)}function l(t,e){for(var n=Array(t),r=0;t>r;r++)n[r]=e();return n}function f(e,n){return new mn(function(r){var i=new De,o=new Se;return o.setDisposable(i),i.setDisposable(e.subscribe(r.onNext.bind(r),function(e){var i,s;try{s=n(e)}catch(u){return r.onError(u),t}L(s)&&(s=an(s)),i=new De,o.setDisposable(i),i.setDisposable(s.subscribe(r))},r.onCompleted.bind(r))),o})}function p(e,n){var r=this;return new mn(function(i){var o=0,s=e.length;return r.subscribe(function(r){if(s>o){var u,c=e[o++];try{u=n(r,c)}catch(a){return i.onError(a),t}i.onNext(u)}else i.onCompleted()},i.onError.bind(i),i.onCompleted.bind(i))})}function d(t){return this.map(function(e,n){var r=t(e,n);return L(r)?an(r):r}).concatAll()}function b(t){return this.select(function(e,n){var r=t(e,n);return L(r)?an(r):r}).mergeObservable()}function v(t){var e=function(){this.cancelBubble=!0},n=function(){if(this.bubbledKeyCode=this.keyCode,this.ctrlKey)try{this.keyCode=0}catch(t){}this.defaultPrevented=!0,this.returnValue=!1,this.modified=!0};if(t||(t=S.event),!t.target)switch(t.target=t.target||t.srcElement,"mouseover"==t.type&&(t.relatedTarget=t.fromElement),"mouseout"==t.type&&(t.relatedTarget=t.toElement),t.stopPropagation||(t.stopPropagation=e,t.preventDefault=n),t.type){case"keypress":var r="charCode"in t?t.charCode:t.keyCode;10==r?(r=0,t.keyCode=13):13==r||27==r?r=0:3==r&&(r=99),t.charCode=r,t.keyChar=t.charCode?String.fromCharCode(t.charCode):""}return t}function m(t,e,n){if(t.addListener)return t.addListener(e,n),Ee(function(){t.removeListener(e,n)});if(t.addEventListener)return t.addEventListener(e,n,!1),Ee(function(){t.removeEventListener(e,n,!1)});if(t.attachEvent){var r=function(t){n(v(t))};return t.attachEvent("on"+e,r),Ee(function(){t.detachEvent("on"+e,r)})}return t["on"+e]=n,Ee(function(){t["on"+e]=null})}function y(t,e,n){var r=new ye;if("function"==typeof t.item&&"number"==typeof t.length)for(var i=0,o=t.length;o>i;i++)r.add(y(t.item(i),e,n));else t&&r.add(m(t,e,n));return r}function w(t,e){var n=_e(t);return new mn(function(t){return e.scheduleWithRelative(n,function(){t.onNext(0),t.onCompleted()})})}function g(t,e,n){return t===e?new mn(function(t){return n.schedulePeriodicWithState(0,e,function(e){return t.onNext(e),e+1})}):Je(function(){return E(n.now()+t,e,n)})}function E(t,e,n){var r=_e(e);return new mn(function(e){var i=0,o=t;return n.scheduleRecursiveWithAbsolute(o,function(t){var s;r>0&&(s=n.now(),o+=r,s>=o&&(o=s+r)),e.onNext(i++),t(o)})})}function x(t,e){return new mn(function(n){function r(){s&&(s=!1,n.onNext(o)),i&&n.onCompleted()}var i,o,s;return new ye(t.subscribe(function(t){s=!0,o=t},n.onError.bind(n),function(){i=!0}),e.subscribe(r,n.onError.bind(n),r))})}function C(e,n,r){return new mn(function(i){function o(e,n){h[n]=e;var o;if(u[n]=!0,c||(c=u.every(W))){try{o=r.apply(null,h)}catch(s){return i.onError(s),t}i.onNext(o)}else a&&i.onCompleted()}var s=2,u=[!1,!1],c=!1,a=!1,h=Array(s);return new ye(e.subscribe(function(t){o(t,0)},i.onError.bind(i),function(){a=!0,i.onCompleted()}),n.subscribe(function(t){o(t,1)},i.onError.bind(i)))})}var D={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},S=D[typeof window]&&window||this,N=D[typeof exports]&&exports&&!exports.nodeType&&exports,A=D[typeof module]&&module&&!module.nodeType&&module,_=A&&A.exports===N&&N,O=D[typeof global]&&global;!O||O.global!==O&&O.window!==O||(S=O);var j={internals:{},config:{Promise:S.Promise},helpers:{}},R=j.helpers.noop=function(){},W=j.helpers.identity=function(t){return t},k=(j.helpers.pluck=function(t){return function(e){return e[t]}},j.helpers.just=function(t){return function(){return t}},j.helpers.defaultNow=function(){return Date.now?Date.now:function(){return+new Date}}()),q=j.helpers.defaultComparer=function(t,e){return ae(t,e)},P=j.helpers.defaultSubComparer=function(t,e){return t>e?1:e>t?-1:0},T=(j.helpers.defaultKeySerializer=function(t){return""+t},j.helpers.defaultError=function(t){throw t}),L=j.helpers.isPromise=function(t){return!!t&&"function"==typeof t.then&&t.then!==j.Observable.prototype.then};j.helpers.asArray=function(){return Array.prototype.slice.call(arguments)},j.helpers.not=function(t){return!t};var V="Argument out of range",z="Object has been disposed",M="object"==typeof Symbol&&Symbol.iterator||"_es6shim_iterator_";S.Set&&"function"==typeof(new S.Set)["@@iterator"]&&(M="@@iterator");var I,F={done:!0,value:t},B="[object Arguments]",U="[object Array]",Q="[object Boolean]",H="[object Date]",$="[object Error]",K="[object Function]",J="[object Number]",Z="[object Object]",X="[object RegExp]",G="[object String]",Y=Object.prototype.toString,te=Object.prototype.hasOwnProperty,ee=Y.call(arguments)==B,ne=Error.prototype,re=Object.prototype,ie=re.propertyIsEnumerable;try{I=!(Y.call(document)==Z&&!({toString:0}+""))}catch(oe){I=!0}var se=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],ue={};ue[U]=ue[H]=ue[J]={constructor:!0,toLocaleString:!0,toString:!0,valueOf:!0},ue[Q]=ue[G]={constructor:!0,toString:!0,valueOf:!0},ue[$]=ue[K]=ue[X]={constructor:!0,toString:!0},ue[Z]={constructor:!0};var ce={};(function(){var t=function(){this.x=1},e=[];t.prototype={valueOf:1,y:1};for(var n in new t)e.push(n);for(n in arguments);ce.enumErrorProps=ie.call(ne,"message")||ie.call(ne,"name"),ce.enumPrototypes=ie.call(t,"prototype"),ce.nonEnumArgs=0!=n,ce.nonEnumShadows=!/valueOf/.test(e)})(1),ee||(u=function(t){return t&&"object"==typeof t?te.call(t,"callee"):!1}),c(/x/)&&(c=function(t){return"function"==typeof t&&Y.call(t)==K});var ae=j.internals.isEqual=function(t,e){return a(t,e,[],[])},he=Array.prototype.slice;({}).hasOwnProperty;var le=this.inherits=j.internals.inherits=function(t,e){function n(){this.constructor=t}n.prototype=e.prototype,t.prototype=new n},fe=j.internals.addProperties=function(t){for(var e=he.call(arguments,1),n=0,r=e.length;r>n;n++){var i=e[n];for(var o in i)t[o]=i[o]}};j.internals.addRef=function(t,e){return new mn(function(n){return new ye(e.getDisposable(),t.subscribe(n))})},Function.prototype.bind||(Function.prototype.bind=function(t){var e=this,n=he.call(arguments,1),r=function(){function i(){}if(this instanceof r){i.prototype=e.prototype;var o=new i,s=e.apply(o,n.concat(he.call(arguments)));return Object(s)===s?s:o}return e.apply(t,n.concat(he.call(arguments)))};return r});var pe=Object("a"),de="a"!=pe[0]||!(0 in pe);Array.prototype.every||(Array.prototype.every=function(t){var e=Object(this),n=de&&{}.toString.call(this)==G?this.split(""):e,r=n.length>>>0,i=arguments[1];if({}.toString.call(t)!=K)throw new TypeError(t+" is not a function");for(var o=0;r>o;o++)if(o in n&&!t.call(i,n[o],o,e))return!1;return!0}),Array.prototype.map||(Array.prototype.map=function(t){var e=Object(this),n=de&&{}.toString.call(this)==G?this.split(""):e,r=n.length>>>0,i=Array(r),o=arguments[1];if({}.toString.call(t)!=K)throw new TypeError(t+" is not a function");for(var s=0;r>s;s++)s in n&&(i[s]=t.call(o,n[s],s,e));return i}),Array.prototype.filter||(Array.prototype.filter=function(t){for(var e,n=[],r=Object(this),i=0,o=r.length>>>0;o>i;i++)e=r[i],i in r&&t.call(arguments[1],e,i,r)&&n.push(e);return n}),Array.isArray||(Array.isArray=function(t){return Object.prototype.toString.call(t)==U}),Array.prototype.indexOf||(Array.prototype.indexOf=function(t){var e=Object(this),n=e.length>>>0;if(0===n)return-1;var r=0;if(arguments.length>1&&(r=Number(arguments[1]),r!==r?r=0:0!==r&&1/0!=r&&r!==-1/0&&(r=(r>0||-1)*Math.floor(Math.abs(r)))),r>=n)return-1;for(var i=r>=0?r:Math.max(n-Math.abs(r),0);n>i;i++)if(i in e&&e[i]===t)return i;return-1});var be=function(t,e){this.id=t,this.value=e};be.prototype.compareTo=function(t){var e=this.value.compareTo(t.value);return 0===e&&(e=this.id-t.id),e};var ve=j.internals.PriorityQueue=function(t){this.items=Array(t),this.length=0},me=ve.prototype;me.isHigherPriority=function(t,e){return 0>this.items[t].compareTo(this.items[e])},me.percolate=function(t){if(!(t>=this.length||0>t)){var e=t-1>>1;if(!(0>e||e===t)&&this.isHigherPriority(t,e)){var n=this.items[t];this.items[t]=this.items[e],this.items[e]=n,this.percolate(e)}}},me.heapify=function(e){if(e===t&&(e=0),!(e>=this.length||0>e)){var n=2*e+1,r=2*e+2,i=e;if(this.length>n&&this.isHigherPriority(n,i)&&(i=n),this.length>r&&this.isHigherPriority(r,i)&&(i=r),i!==e){var o=this.items[e];this.items[e]=this.items[i],this.items[i]=o,this.heapify(i)}}},me.peek=function(){return this.items[0].value},me.removeAt=function(t){this.items[t]=this.items[--this.length],delete this.items[this.length],this.heapify()},me.dequeue=function(){var t=this.peek();return this.removeAt(0),t},me.enqueue=function(t){var e=this.length++;this.items[e]=new be(ve.count++,t),this.percolate(e)},me.remove=function(t){for(var e=0;this.length>e;e++)if(this.items[e].value===t)return this.removeAt(e),!0;return!1},ve.count=0;var ye=j.CompositeDisposable=function(){this.disposables=h(arguments,0),this.isDisposed=!1,this.length=this.disposables.length},we=ye.prototype;we.add=function(t){this.isDisposed?t.dispose():(this.disposables.push(t),this.length++)},we.remove=function(t){var e=!1;if(!this.isDisposed){var n=this.disposables.indexOf(t);-1!==n&&(e=!0,this.disposables.splice(n,1),this.length--,t.dispose())}return e},we.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;var t=this.disposables.slice(0);this.disposables=[],this.length=0;for(var e=0,n=t.length;n>e;e++)t[e].dispose()}},we.clear=function(){var t=this.disposables.slice(0);this.disposables=[],this.length=0;for(var e=0,n=t.length;n>e;e++)t[e].dispose()},we.contains=function(t){return-1!==this.disposables.indexOf(t)},we.toArray=function(){return this.disposables.slice(0)};var ge=j.Disposable=function(t){this.isDisposed=!1,this.action=t||R};ge.prototype.dispose=function(){this.isDisposed||(this.action(),this.isDisposed=!0)};var Ee=ge.create=function(t){return new ge(t)},xe=ge.empty={dispose:R},Ce=function(){function t(t){this.isSingle=t,this.isDisposed=!1,this.current=null}var e=t.prototype;return e.getDisposable=function(){return this.current},e.setDisposable=function(t){if(this.current&&this.isSingle)throw Error("Disposable has already been assigned");var e,n=this.isDisposed;n||(e=this.current,this.current=t),e&&e.dispose(),n&&t&&t.dispose()},e.dispose=function(){var t;this.isDisposed||(this.isDisposed=!0,t=this.current,this.current=null),t&&t.dispose()},t}(),De=j.SingleAssignmentDisposable=function(t){function e(){t.call(this,!0)}return le(e,t),e}(Ce),Se=j.SerialDisposable=function(t){function e(){t.call(this,!1)}return le(e,t),e}(Ce);j.RefCountDisposable=function(){function t(t){this.disposable=t,this.disposable.count++,this.isInnerDisposed=!1}function e(t){this.underlyingDisposable=t,this.isDisposed=!1,this.isPrimaryDisposed=!1,this.count=0}return t.prototype.dispose=function(){this.disposable.isDisposed||this.isInnerDisposed||(this.isInnerDisposed=!0,this.disposable.count--,0===this.disposable.count&&this.disposable.isPrimaryDisposed&&(this.disposable.isDisposed=!0,this.disposable.underlyingDisposable.dispose()))},e.prototype.dispose=function(){this.isDisposed||this.isPrimaryDisposed||(this.isPrimaryDisposed=!0,0===this.count&&(this.isDisposed=!0,this.underlyingDisposable.dispose()))},e.prototype.getDisposable=function(){return this.isDisposed?xe:new t(this)},e}();var Ne=j.internals.ScheduledItem=function(t,e,n,r,i){this.scheduler=t,this.state=e,this.action=n,this.dueTime=r,this.comparer=i||P,this.disposable=new De};Ne.prototype.invoke=function(){this.disposable.setDisposable(this.invokeCore())},Ne.prototype.compareTo=function(t){return this.comparer(this.dueTime,t.dueTime)},Ne.prototype.isCancelled=function(){return this.disposable.isDisposed},Ne.prototype.invokeCore=function(){return this.action(this.scheduler,this.state)};var Ae=j.Scheduler=function(){function t(t,e,n,r){this.now=t,this._schedule=e,this._scheduleRelative=n,this._scheduleAbsolute=r}function e(t,e){var n=e.first,r=e.second,i=new ye,o=function(e){r(e,function(e){var n=!1,r=!1,s=t.scheduleWithState(e,function(t,e){return n?i.remove(s):r=!0,o(e),xe});r||(i.add(s),n=!0)})};return o(n),i}function n(t,e,n){var r=e.first,i=e.second,o=new ye,s=function(e){i(e,function(e,r){var i=!1,u=!1,c=t[n].call(t,e,r,function(t,e){return i?o.remove(c):u=!0,s(e),xe});u||(o.add(c),i=!0)})};return s(r),o}function r(t,e){return e(),xe}var i=t.prototype;return i.schedulePeriodic=function(t,e){return this.schedulePeriodicWithState(null,t,function(){e()})},i.schedulePeriodicWithState=function(t,e,n){var r=t,i=setInterval(function(){r=n(r)},e);return Ee(function(){clearInterval(i)})},i.schedule=function(t){return this._schedule(t,r)},i.scheduleWithState=function(t,e){return this._schedule(t,e)},i.scheduleWithRelative=function(t,e){return this._scheduleRelative(e,t,r)},i.scheduleWithRelativeAndState=function(t,e,n){return this._scheduleRelative(t,e,n)},i.scheduleWithAbsolute=function(t,e){return this._scheduleAbsolute(e,t,r)},i.scheduleWithAbsoluteAndState=function(t,e,n){return this._scheduleAbsolute(t,e,n)},i.scheduleRecursive=function(t){return this.scheduleRecursiveWithState(t,function(t,e){t(function(){e(t)})})},i.scheduleRecursiveWithState=function(t,n){return this.scheduleWithState({first:t,second:n},function(t,n){return e(t,n)})},i.scheduleRecursiveWithRelative=function(t,e){return this.scheduleRecursiveWithRelativeAndState(e,t,function(t,e){t(function(n){e(t,n)})})},i.scheduleRecursiveWithRelativeAndState=function(t,e,r){return this._scheduleRelative({first:t,second:r},e,function(t,e){return n(t,e,"scheduleWithRelativeAndState")})},i.scheduleRecursiveWithAbsolute=function(t,e){return this.scheduleRecursiveWithAbsoluteAndState(e,t,function(t,e){t(function(n){e(t,n)})})},i.scheduleRecursiveWithAbsoluteAndState=function(t,e,r){return this._scheduleAbsolute({first:t,second:r},e,function(t,e){return n(t,e,"scheduleWithAbsoluteAndState")})},t.now=k,t.normalize=function(t){return 0>t&&(t=0),t},t}(),_e=Ae.normalize,Oe=Ae.immediate=function(){function t(t,e){return e(this,t)}function e(t,e,n){for(var r=_e(r);r-this.now()>0;);return n(this,t)}function n(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}return new Ae(k,t,e,n)}(),je=Ae.currentThread=function(){function t(t){for(var e;t.length>0;)if(e=t.dequeue(),!e.isCancelled()){for(;e.dueTime-Ae.now()>0;);e.isCancelled()||e.invoke()}}function e(t,e){return this.scheduleWithRelativeAndState(t,0,e)}function n(e,n,r){var o=this.now()+Ae.normalize(n),s=new Ne(this,e,r,o);if(i)i.enqueue(s);else{i=new ve(4),i.enqueue(s);try{t(i)}catch(u){throw u}finally{i=null}}return s.disposable}function r(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}var i,o=new Ae(k,e,n,r);return o.scheduleRequired=function(){return null===i},o.ensureTrampoline=function(t){return null===i?this.schedule(t):t()},o}();j.internals.SchedulePeriodicRecursive=function(){function t(t,e){e(0,this._period);try{this._state=this._action(this._state)}catch(n){throw this._cancel.dispose(),n}}function e(t,e,n,r){this._scheduler=t,this._state=e,this._period=n,this._action=r}return e.prototype.start=function(){var e=new De;return this._cancel=e,e.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0,this._period,t.bind(this))),e},e}();var Re,We=R;(function(){function t(){if(!S.postMessage||S.importScripts)return!1;var t=!1,e=S.onmessage;return S.onmessage=function(){t=!0},S.postMessage("","*"),S.onmessage=e,t}function e(t){if("string"==typeof t.data&&t.data.substring(0,o.length)===o){var e=t.data.substring(o.length),n=s[e];n(),delete s[e]}}var n=RegExp("^"+(Y+"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),r="function"==typeof(r=O&&_&&O.setImmediate)&&!n.test(r)&&r,i="function"==typeof(i=O&&_&&O.clearImmediate)&&!n.test(i)&&i;if("undefined"!=typeof process&&"[object process]"==={}.toString.call(process))Re=process.nextTick;else if("function"==typeof r)Re=r,We=i;else if(t()){var o="ms.rx.schedule"+Math.random(),s={},u=0;S.addEventListener?S.addEventListener("message",e,!1):S.attachEvent("onmessage",e,!1),Re=function(t){var e=u++;s[e]=t,S.postMessage(o+e,"*")}}else if(S.MessageChannel){var c=new S.MessageChannel,a={},h=0;c.port1.onmessage=function(t){var e=t.data,n=a[e];n(),delete a[e]},Re=function(t){var e=h++;a[e]=t,c.port2.postMessage(e)}}else"document"in S&&"onreadystatechange"in S.document.createElement("script")?Re=function(t){var e=S.document.createElement("script");e.onreadystatechange=function(){t(),e.onreadystatechange=null,e.parentNode.removeChild(e),e=null},S.document.documentElement.appendChild(e)}:(Re=function(t){return setTimeout(t,0)},We=clearTimeout)})();var ke=Ae.timeout=function(){function t(t,e){var n=this,r=new De,i=Re(function(){r.isDisposed||r.setDisposable(e(n,t))});return new ye(r,Ee(function(){We(i)}))}function e(t,e,n){var r=this,i=Ae.normalize(e);if(0===i)return r.scheduleWithState(t,n);var o=new De,s=setTimeout(function(){o.isDisposed||o.setDisposable(n(r,t))},i);return new ye(o,Ee(function(){clearTimeout(s)}))}function n(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}return new Ae(k,t,e,n)}(),qe=j.Notification=function(){function t(t,e){this.hasValue=null==e?!1:e,this.kind=t}var e=t.prototype;return e.accept=function(t,e,n){return 1===arguments.length&&"object"==typeof t?this._acceptObservable(t):this._accept(t,e,n)},e.toObservable=function(t){var e=this;return t||(t=Oe),new mn(function(n){return t.schedule(function(){e._acceptObservable(n),"N"===e.kind&&n.onCompleted()})})},t}(),Pe=qe.createOnNext=function(){function t(t){return t(this.value)}function e(t){return t.onNext(this.value)}function n(){return"OnNext("+this.value+")"}return function(r){var i=new qe("N",!0);return i.value=r,i._accept=t,i._acceptObservable=e,i.toString=n,i}}(),Te=qe.createOnError=function(){function t(t,e){return e(this.exception)}function e(t){return t.onError(this.exception)}function n(){return"OnError("+this.exception+")"}return function(r){var i=new qe("E");return i.exception=r,i._accept=t,i._acceptObservable=e,i.toString=n,i}}(),Le=qe.createOnCompleted=function(){function t(t,e,n){return n()}function e(t){return t.onCompleted()}function n(){return"OnCompleted()"}return function(){var r=new qe("C");return r._accept=t,r._acceptObservable=e,r.toString=n,r}}(),Ve=j.internals.Enumerator=function(t){this._next=t};Ve.prototype.next=function(){return this._next()},Ve.prototype[M]=function(){return this};var ze=j.internals.Enumerable=function(t){this._iterator=t};ze.prototype[M]=function(){return this._iterator()},ze.prototype.concat=function(){var e=this;return new mn(function(n){var r;try{r=e[M]()}catch(i){return n.onError(),t}var o,s=new Se,u=Oe.scheduleRecursive(function(e){var i;if(!o){try{i=r.next()}catch(u){return n.onError(u),t}if(i.done)return n.onCompleted(),t;var c=i.value;L(c)&&(c=an(c));var a=new De;s.setDisposable(a),a.setDisposable(c.subscribe(n.onNext.bind(n),n.onError.bind(n),function(){e()}))}});return new ye(s,u,Ee(function(){o=!0}))})},ze.prototype.catchException=function(){var e=this;return new mn(function(n){var r;try{r=e[M]()}catch(i){return n.onError(),t}var o,s,u=new Se,c=Oe.scheduleRecursive(function(e){if(!o){var i;try{i=r.next()}catch(c){return n.onError(c),t}if(i.done)return s?n.onError(s):n.onCompleted(),t;var a=i.value;L(a)&&(a=an(a));var h=new De;u.setDisposable(h),h.setDisposable(a.subscribe(n.onNext.bind(n),function(t){s=t,e()},n.onCompleted.bind(n)))}});return new ye(u,c,Ee(function(){o=!0}))})};var Me=ze.repeat=function(t,e){return null==e&&(e=-1),new ze(function(){var n=e;return new Ve(function(){return 0===n?F:(n>0&&n--,{done:!1,value:t})})})},Ie=ze.forEach=function(t,e,n){return e||(e=W),new ze(function(){var r=-1;return new Ve(function(){return++r0&&(e=!this.isAcquired,this.isAcquired=!0),e&&this.disposable.setDisposable(this.scheduler.scheduleRecursive(function(e){var r;if(!(n.queue.length>0))return n.isAcquired=!1,t;r=n.queue.shift();try{r()}catch(i){throw n.queue=[],n.hasFaulted=!0,i}e()}))},n.prototype.dispose=function(){e.prototype.dispose.call(this),this.disposable.dispose()},n}(Qe);Ue.toArray=function(){var t=this;return new mn(function(e){var n=[];return t.subscribe(n.push.bind(n),e.onError.bind(e),function(){e.onNext(n),e.onCompleted()})})},$e.create=$e.createWithDisposable=function(t){return new mn(t)};var Je=$e.defer=function(t){return new mn(function(e){var n;try{n=t()}catch(r){return tn(r).subscribe(e)}return L(n)&&(n=an(n)),n.subscribe(e)})},Ze=$e.empty=function(t){return t||(t=Oe),new mn(function(e){return t.schedule(function(){e.onCompleted()})})},Xe=$e.fromArray=function(t,e){return e||(e=je),new mn(function(n){var r=0,i=t.length;return e.scheduleRecursive(function(e){i>r?(n.onNext(t[r++]),e()):n.onCompleted()})})};$e.fromIterable=function(e,n){return n||(n=je),new mn(function(r){var i;try{i=e[M]()}catch(o){return r.onError(o),t}return n.scheduleRecursive(function(e){var n;try{n=i.next()}catch(o){return r.onError(o),t}n.done?r.onCompleted():(r.onNext(n.value),e())})})},$e.generate=function(e,n,r,i,o){return o||(o=je),new mn(function(s){var u=!0,c=e;return o.scheduleRecursive(function(e){var o,a;try{u?u=!1:c=r(c),o=n(c),o&&(a=i(c))}catch(h){return s.onError(h),t}o?(s.onNext(a),e()):s.onCompleted()})})};var Ge=$e.never=function(){return new mn(function(){return xe})};$e.of=function(){for(var t=arguments.length,e=Array(t),n=0;t>n;n++)e[n]=arguments[n];return Xe(e)},$e.ofWithScheduler=function(t){for(var e=arguments.length-1,n=Array(e),r=0;e>r;r++)n[r]=arguments[r+1];return Xe(n,t)},$e.range=function(t,e,n){return n||(n=je),new mn(function(r){return n.scheduleRecursiveWithState(0,function(n,i){e>n?(r.onNext(t+n),i(n+1)):r.onCompleted()})})},$e.repeat=function(t,e,n){return n||(n=je),null==e&&(e=-1),Ye(t,n).repeat(e)};var Ye=$e["return"]=$e.returnValue=$e.just=function(t,e){return e||(e=Oe),new mn(function(n){return e.schedule(function(){n.onNext(t),n.onCompleted()})})},tn=$e["throw"]=$e.throwException=function(t,e){return e||(e=Oe),new mn(function(n){return e.schedule(function(){n.onError(t)})})};Ue["catch"]=Ue.catchException=function(t){return"function"==typeof t?f(this,t):en([this,t])};var en=$e.catchException=$e["catch"]=function(){var t=h(arguments,0);return Ie(t).catchException()};Ue.combineLatest=function(){var t=he.call(arguments);return Array.isArray(t[0])?t[0].unshift(this):t.unshift(this),nn.apply(this,t)};var nn=$e.combineLatest=function(){var e=he.call(arguments),n=e.pop();return Array.isArray(e[0])&&(e=e[0]),new mn(function(r){function i(e){var i;if(c[e]=!0,a||(a=c.every(W))){try{i=n.apply(null,f)}catch(o){return r.onError(o),t}r.onNext(i)}else h.filter(function(t,n){return n!==e}).every(W)&&r.onCompleted()}function o(t){h[t]=!0,h.every(W)&&r.onCompleted()}for(var s=function(){return!1},u=e.length,c=l(u,s),a=!1,h=l(u,s),f=Array(u),p=Array(u),d=0;u>d;d++)(function(t){var n=e[t],s=new De;L(n)&&(n=an(n)),s.setDisposable(n.subscribe(function(e){f[t]=e,i(t)},r.onError.bind(r),function(){o(t)})),p[t]=s})(d);return new ye(p)})};Ue.concat=function(){var t=he.call(arguments,0);return t.unshift(this),rn.apply(this,t)};var rn=$e.concat=function(){var t=h(arguments,0);return Ie(t).concat()};Ue.concatObservable=Ue.concatAll=function(){return this.merge(1)},Ue.merge=function(t){if("number"!=typeof t)return on(this,t);var e=this;return new mn(function(n){var r=0,i=new ye,o=!1,s=[],u=function(t){var e=new De;i.add(e),L(t)&&(t=an(t)),e.setDisposable(t.subscribe(n.onNext.bind(n),n.onError.bind(n),function(){var t;i.remove(e),s.length>0?(t=s.shift(),u(t)):(r--,o&&0===r&&n.onCompleted())}))};return i.add(e.subscribe(function(e){t>r?(r++,u(e)):s.push(e)},n.onError.bind(n),function(){o=!0,0===r&&n.onCompleted()})),i})};var on=$e.merge=function(){var t,e;return arguments[0]?arguments[0].now?(t=arguments[0],e=he.call(arguments,1)):(t=Oe,e=he.call(arguments,0)):(t=Oe,e=he.call(arguments,1)),Array.isArray(e[0])&&(e=e[0]),Xe(e,t).mergeObservable()};Ue.mergeObservable=Ue.mergeAll=function(){var t=this;return new mn(function(e){var n=new ye,r=!1,i=new De;return n.add(i),i.setDisposable(t.subscribe(function(t){var i=new De;n.add(i),L(t)&&(t=an(t)),i.setDisposable(t.subscribe(function(t){e.onNext(t)},e.onError.bind(e),function(){n.remove(i),r&&1===n.length&&e.onCompleted()}))},e.onError.bind(e),function(){r=!0,1===n.length&&e.onCompleted()})),n})},Ue.skipUntil=function(t){var e=this;return new mn(function(n){var r=!1,i=new ye(e.subscribe(function(t){r&&n.onNext(t)},n.onError.bind(n),function(){r&&n.onCompleted()}));L(t)&&(t=an(t));var o=new De;return i.add(o),o.setDisposable(t.subscribe(function(){r=!0,o.dispose()},n.onError.bind(n),function(){o.dispose()})),i})},Ue["switch"]=Ue.switchLatest=function(){var t=this;return new mn(function(e){var n=!1,r=new Se,i=!1,o=0,s=t.subscribe(function(t){var s=new De,u=++o;n=!0,r.setDisposable(s),L(t)&&(t=an(t)),s.setDisposable(t.subscribe(function(t){o===u&&e.onNext(t)},function(t){o===u&&e.onError(t)},function(){o===u&&(n=!1,i&&e.onCompleted())}))},e.onError.bind(e),function(){i=!0,n||e.onCompleted()});return new ye(s,r)})},Ue.takeUntil=function(t){var e=this;return new mn(function(n){return L(t)&&(t=an(t)),new ye(e.subscribe(n),t.subscribe(n.onCompleted.bind(n),n.onError.bind(n),R))})},Ue.zip=function(){if(Array.isArray(arguments[0]))return p.apply(this,arguments);var e=this,n=he.call(arguments),r=n.pop();return n.unshift(e),new mn(function(i){function o(n){var o,s;if(c.every(function(t){return t.length>0})){try{s=c.map(function(t){return t.shift()}),o=r.apply(e,s)}catch(u){return i.onError(u),t}i.onNext(o)}else a.filter(function(t,e){return e!==n}).every(W)&&i.onCompleted()}function s(t){a[t]=!0,a.every(function(t){return t})&&i.onCompleted()}for(var u=n.length,c=l(u,function(){return[]}),a=l(u,function(){return!1}),h=Array(u),f=0;u>f;f++)(function(t){var e=n[t],r=new De;L(e)&&(e=an(e)),r.setDisposable(e.subscribe(function(e){c[t].push(e),o(t)},i.onError.bind(i),function(){s(t)})),h[t]=r})(f);return new ye(h)})},$e.zip=function(){var t=he.call(arguments,0),e=t.shift();return e.zip.apply(e,t)},$e.zipArray=function(){var e=h(arguments,0);return new mn(function(n){function r(e){if(s.every(function(t){return t.length>0})){var r=s.map(function(t){return t.shift()});n.onNext(r)}else if(u.filter(function(t,n){return n!==e}).every(W))return n.onCompleted(),t}function i(e){return u[e]=!0,u.every(W)?(n.onCompleted(),t):t}for(var o=e.length,s=l(o,function(){return[]}),u=l(o,function(){return!1}),c=Array(o),a=0;o>a;a++)(function(t){c[t]=new De,c[t].setDisposable(e[t].subscribe(function(e){s[t].push(e),r(t)},n.onError.bind(n),function(){i(t)}))})(a);var h=new ye(c);return h.add(Ee(function(){for(var t=0,e=s.length;e>t;t++)s[t]=[]})),h})},Ue.asObservable=function(){var t=this;return new mn(function(e){return t.subscribe(e)})},Ue.dematerialize=function(){var t=this;return new mn(function(e){return t.subscribe(function(t){return t.accept(e)},e.onError.bind(e),e.onCompleted.bind(e))})},Ue.distinctUntilChanged=function(e,n){var r=this;return e||(e=W),n||(n=q),new mn(function(i){var o,s=!1;return r.subscribe(function(r){var u,c=!1;try{u=e(r)}catch(a){return i.onError(a),t}if(s)try{c=n(o,u)}catch(a){return i.onError(a),t}s&&c||(s=!0,o=u,i.onNext(r))},i.onError.bind(i),i.onCompleted.bind(i))})},Ue["do"]=Ue.doAction=function(t,e,n){var r,i=this;return"function"==typeof t?r=t:(r=t.onNext.bind(t),e=t.onError.bind(t),n=t.onCompleted.bind(t)),new mn(function(t){return i.subscribe(function(e){try{r(e)}catch(n){t.onError(n)}t.onNext(e)},function(n){if(e){try{e(n)}catch(r){t.onError(r)}t.onError(n)}else t.onError(n)},function(){if(n){try{n()}catch(e){t.onError(e)}t.onCompleted()}else t.onCompleted()})})},Ue["finally"]=Ue.finallyAction=function(t){var e=this;return new mn(function(n){var r;try{r=e.subscribe(n)}catch(i){throw t(),i}return Ee(function(){try{r.dispose()}catch(e){throw e}finally{t()}})})},Ue.ignoreElements=function(){var t=this;return new mn(function(e){return t.subscribe(R,e.onError.bind(e),e.onCompleted.bind(e)) +})},Ue.materialize=function(){var t=this;return new mn(function(e){return t.subscribe(function(t){e.onNext(Pe(t))},function(t){e.onNext(Te(t)),e.onCompleted()},function(){e.onNext(Le()),e.onCompleted()})})},Ue.repeat=function(t){return Me(this,t).concat()},Ue.retry=function(t){return Me(this,t).catchException()},Ue.scan=function(){var e,n,r=!1,i=this;return 2===arguments.length?(r=!0,e=arguments[0],n=arguments[1]):n=arguments[0],new mn(function(o){var s,u,c;return i.subscribe(function(i){try{c||(c=!0),s?u=n(u,i):(u=r?n(e,i):i,s=!0)}catch(a){return o.onError(a),t}o.onNext(u)},o.onError.bind(o),function(){!c&&r&&o.onNext(e),o.onCompleted()})})},Ue.skipLast=function(t){var e=this;return new mn(function(n){var r=[];return e.subscribe(function(e){r.push(e),r.length>t&&n.onNext(r.shift())},n.onError.bind(n),n.onCompleted.bind(n))})},Ue.startWith=function(){var t,e,n=0;return arguments.length&&"now"in Object(arguments[0])?(e=arguments[0],n=1):e=Oe,t=he.call(arguments,n),Ie([Xe(t,e),this]).concat()},Ue.takeLast=function(t,e){return this.takeLastBuffer(t).selectMany(function(t){return Xe(t,e)})},Ue.takeLastBuffer=function(t){var e=this;return new mn(function(n){var r=[];return e.subscribe(function(e){r.push(e),r.length>t&&r.shift()},n.onError.bind(n),function(){n.onNext(r),n.onCompleted()})})},Ue.selectConcat=Ue.concatMap=function(t,e){return e?this.concatMap(function(n,r){var i=t(n,r),o=L(i)?an(i):i;return o.map(function(t){return e(n,t,r)})}):"function"==typeof t?d.call(this,t):d.call(this,function(){return t})},Ue.select=Ue.map=function(e,n){var r=this;return new mn(function(i){var o=0;return r.subscribe(function(s){var u;try{u=e.call(n,s,o++,r)}catch(c){return i.onError(c),t}i.onNext(u)},i.onError.bind(i),i.onCompleted.bind(i))})},Ue.pluck=function(t){return this.select(function(e){return e[t]})},Ue.selectMany=Ue.flatMap=function(t,e){return e?this.selectMany(function(n,r){var i=t(n,r),o=L(i)?an(i):i;return o.select(function(t){return e(n,t,r)})}):"function"==typeof t?b.call(this,t):b.call(this,function(){return t})},Ue.selectSwitch=Ue.flatMapLatest=Ue.switchMap=function(t,e){return this.select(t,e).switchLatest()},Ue.skip=function(t){if(0>t)throw Error(V);var e=this;return new mn(function(n){var r=t;return e.subscribe(function(t){0>=r?n.onNext(t):r--},n.onError.bind(n),n.onCompleted.bind(n))})},Ue.skipWhile=function(e,n){var r=this;return new mn(function(i){var o=0,s=!1;return r.subscribe(function(u){if(!s)try{s=!e.call(n,u,o++,r)}catch(c){return i.onError(c),t}s&&i.onNext(u)},i.onError.bind(i),i.onCompleted.bind(i))})},Ue.take=function(t,e){if(0>t)throw Error(V);if(0===t)return Ze(e);var n=this;return new mn(function(e){var r=t;return n.subscribe(function(t){r>0&&(r--,e.onNext(t),0===r&&e.onCompleted())},e.onError.bind(e),e.onCompleted.bind(e))})},Ue.takeWhile=function(e,n){var r=this;return new mn(function(i){var o=0,s=!0;return r.subscribe(function(u){if(s){try{s=e.call(n,u,o++,r)}catch(c){return i.onError(c),t}s?i.onNext(u):i.onCompleted()}},i.onError.bind(i),i.onCompleted.bind(i))})},Ue.where=Ue.filter=function(e,n){var r=this;return new mn(function(i){var o=0;return r.subscribe(function(s){var u;try{u=e.call(n,s,o++,r)}catch(c){return i.onError(c),t}u&&i.onNext(s)},i.onError.bind(i),i.onCompleted.bind(i))})},$e.fromCallback=function(e,n,r,i){return n||(n=Oe),function(){var o=he.call(arguments,0);return new mn(function(s){return n.schedule(function(){function n(e){var n=e;if(i)try{n=i(arguments)}catch(r){return s.onError(r),t}else 1===n.length&&(n=n[0]);s.onNext(n),s.onCompleted()}o.push(n),e.apply(r,o)})})}},$e.fromNodeCallback=function(e,n,r,i){return n||(n=Oe),function(){var o=he.call(arguments,0);return new mn(function(s){return n.schedule(function(){function n(e){if(e)return s.onError(e),t;var n=he.call(arguments,1);if(i)try{n=i(n)}catch(r){return s.onError(r),t}else 1===n.length&&(n=n[0]);s.onNext(n),s.onCompleted()}o.push(n),e.apply(r,o)})})}};var sn=S.angular&&angular.element?angular.element:S.jQuery?S.jQuery:S.Zepto?S.Zepto:null,un=!!S.Ember&&"function"==typeof S.Ember.addListener;$e.fromEvent=function(e,n,r){if(un)return cn(function(t){Ember.addListener(e,n,t)},function(t){Ember.removeListener(e,n,t)},r);if(sn){var i=sn(e);return cn(function(t){i.on(n,t)},function(t){i.off(n,t)},r)}return new mn(function(i){return y(e,n,function(e){var n=e;if(r)try{n=r(arguments)}catch(o){return i.onError(o),t}i.onNext(n)})}).publish().refCount()};var cn=$e.fromEventPattern=function(e,n,r){return new mn(function(i){function o(e){var n=e;if(r)try{n=r(arguments)}catch(o){return i.onError(o),t}i.onNext(n)}var s=e(o);return Ee(function(){n&&n(o,s)})}).publish().refCount()},an=$e.fromPromise=function(t){return new mn(function(e){return t.then(function(t){e.onNext(t),e.onCompleted()},function(t){e.onError(t)}),function(){t&&t.abort&&t.abort()}})};Ue.toPromise=function(t){if(t||(t=j.config.Promise),!t)throw Error("Promise type not provided nor in Rx.config.Promise");var e=this;return new t(function(t,n){var r,i=!1;e.subscribe(function(t){r=t,i=!0},function(t){n(t)},function(){i&&t(r)})})},$e.startAsync=function(t){var e;try{e=t()}catch(n){return tn(n)}return an(e)},Ue.multicast=function(t,e){var n=this;return"function"==typeof t?new mn(function(r){var i=n.multicast(t());return new ye(e(i).subscribe(r),i.connect())}):new hn(n,t)},Ue.publish=function(t){return t?this.multicast(function(){return new gn},t):this.multicast(new gn)},Ue.share=function(){return this.publish(null).refCount()},Ue.publishLast=function(t){return t?this.multicast(function(){return new En},t):this.multicast(new En)},Ue.publishValue=function(t,e){return 2===arguments.length?this.multicast(function(){return new Cn(e)},t):this.multicast(new Cn(t))},Ue.shareValue=function(t){return this.publishValue(t).refCount()},Ue.replay=function(t,e,n,r){return t?this.multicast(function(){return new Dn(e,n,r)},t):this.multicast(new Dn(e,n,r))},Ue.shareReplay=function(t,e,n){return this.replay(null,t,e,n).refCount()};var hn=j.ConnectableObservable=function(t){function e(e,n){function r(t){return i.subject.subscribe(t)}var i={subject:n,source:e.asObservable(),hasSubscription:!1,subscription:null};this.connect=function(){return i.hasSubscription||(i.hasSubscription=!0,i.subscription=new ye(i.source.subscribe(i.subject),Ee(function(){i.hasSubscription=!1}))),i.subscription},t.call(this,r)}return le(e,t),e.prototype.connect=function(){return this.connect()},e.prototype.refCount=function(){var t=null,e=0,n=this;return new mn(function(r){var i,o;return e++,i=1===e,o=n.subscribe(r),i&&(t=n.connect()),Ee(function(){o.dispose(),e--,0===e&&t.dispose()})})},e}($e),ln=$e.interval=function(t,e){return e||(e=ke),g(t,t,e)},fn=$e.timer=function(e,n,r){var i;return r||(r=ke),"number"==typeof n?i=n:"object"==typeof n&&"now"in n&&(r=n),i===t?w(e,r):g(e,i,r)};Ue.delay=function(t,e){e||(e=ke);var n=this;return new mn(function(r){var i,o=!1,s=new Se,u=null,c=[],a=!1;return i=n.materialize().timestamp(e).subscribe(function(n){var i,h;"E"===n.value.kind?(c=[],c.push(n),u=n.value.exception,h=!a):(c.push({value:n.value,timestamp:n.timestamp+t}),h=!o,o=!0),h&&(null!==u?r.onError(u):(i=new De,s.setDisposable(i),i.setDisposable(e.scheduleRecursiveWithRelative(t,function(t){var n,i,s,h;if(null===u){a=!0;do s=null,c.length>0&&0>=c[0].timestamp-e.now()&&(s=c.shift().value),null!==s&&s.accept(r);while(null!==s);h=!1,i=0,c.length>0?(h=!0,i=Math.max(0,c[0].timestamp-e.now())):o=!1,n=u,a=!1,null!==n?r.onError(n):h&&t(i)}}))))}),new ye(i,s)})},Ue.throttle=function(t,e){return e||(e=ke),this.throttleWithSelector(function(){return fn(t,e)})},Ue.timeInterval=function(t){var e=this;return t||(t=ke),Je(function(){var n=t.now();return e.select(function(e){var r=t.now(),i=r-n;return n=r,{value:e,interval:i}})})},Ue.timestamp=function(t){return t||(t=ke),this.select(function(e){return{value:e,timestamp:t.now()}})},Ue.sample=function(t,e){return e||(e=ke),"number"==typeof t?x(this,ln(t,e)):x(this,t)},Ue.timeout=function(t,e,n){e||(e=tn(Error("Timeout"))),n||(n=ke);var r=this,i=t instanceof Date?"scheduleWithAbsolute":"scheduleWithRelative";return new mn(function(o){var s=0,u=new De,c=new Se,a=!1,h=new Se;c.setDisposable(u);var l=function(){var r=s;h.setDisposable(n[i](t,function(){s===r&&(L(e)&&(e=an(e)),c.setDisposable(e.subscribe(o)))}))};return l(),u.setDisposable(r.subscribe(function(t){a||(s++,o.onNext(t),l())},function(t){a||(s++,o.onError(t))},function(){a||(s++,o.onCompleted())})),new ye(c,h)})},$e.generateWithRelativeTime=function(e,n,r,i,o,s){return s||(s=ke),new mn(function(u){var c,a,h=!0,l=!1,f=e;return s.scheduleRecursiveWithRelative(0,function(e){l&&u.onNext(c);try{h?h=!1:f=r(f),l=n(f),l&&(c=i(f),a=o(f))}catch(s){return u.onError(s),t}l?e(a):u.onCompleted()})})},Ue.delaySubscription=function(t,e){return e||(e=ke),this.delayWithSelector(fn(t,e),function(){return Ze()})},Ue.delayWithSelector=function(e,n){var r,i,o=this;return"function"==typeof e?i=e:(r=e,i=n),new mn(function(e){var n=new ye,s=!1,u=function(){s&&0===n.length&&e.onCompleted()},c=new Se,a=function(){c.setDisposable(o.subscribe(function(r){var o;try{o=i(r)}catch(s){return e.onError(s),t}var c=new De;n.add(c),c.setDisposable(o.subscribe(function(){e.onNext(r),n.remove(c),u()},e.onError.bind(e),function(){e.onNext(r),n.remove(c),u()}))},e.onError.bind(e),function(){s=!0,c.dispose(),u()}))};return r?c.setDisposable(r.subscribe(function(){a()},e.onError.bind(e),function(){a()})):a(),new ye(c,n)})},Ue.timeoutWithSelector=function(e,n,r){if(1===arguments.length){n=e;var e=Ge()}r||(r=tn(Error("Timeout")));var i=this;return new mn(function(o){var s=new Se,u=new Se,c=new De;s.setDisposable(c);var a=0,h=!1,l=function(t){var e=a,n=function(){return a===e},i=new De;u.setDisposable(i),i.setDisposable(t.subscribe(function(){n()&&s.setDisposable(r.subscribe(o)),i.dispose()},function(t){n()&&o.onError(t)},function(){n()&&s.setDisposable(r.subscribe(o))}))};l(e);var f=function(){var t=!h;return t&&a++,t};return c.setDisposable(i.subscribe(function(e){if(f()){o.onNext(e);var r;try{r=n(e)}catch(i){return o.onError(i),t}l(r)}},function(t){f()&&o.onError(t)},function(){f()&&o.onCompleted()})),new ye(s,u)})},Ue.throttleWithSelector=function(e){var n=this;return new mn(function(r){var i,o=!1,s=new Se,u=0,c=n.subscribe(function(n){var c;try{c=e(n)}catch(a){return r.onError(a),t}o=!0,i=n,u++;var h=u,l=new De;s.setDisposable(l),l.setDisposable(c.subscribe(function(){o&&u===h&&r.onNext(i),o=!1,l.dispose()},r.onError.bind(r),function(){o&&u===h&&r.onNext(i),o=!1,l.dispose()}))},function(t){s.dispose(),r.onError(t),o=!1,u++},function(){s.dispose(),o&&r.onNext(i),r.onCompleted(),o=!1,u++});return new ye(c,s)})},Ue.skipLastWithTime=function(t,e){e||(e=ke);var n=this;return new mn(function(r){var i=[];return n.subscribe(function(n){var o=e.now();for(i.push({interval:o,value:n});i.length>0&&o-i[0].interval>=t;)r.onNext(i.shift().value)},r.onError.bind(r),function(){for(var n=e.now();i.length>0&&n-i[0].interval>=t;)r.onNext(i.shift().value);r.onCompleted()})})},Ue.takeLastWithTime=function(t,e,n){return this.takeLastBufferWithTime(t,e).selectMany(function(t){return Xe(t,n)})},Ue.takeLastBufferWithTime=function(t,e){var n=this;return e||(e=ke),new mn(function(r){var i=[];return n.subscribe(function(n){var r=e.now();for(i.push({interval:r,value:n});i.length>0&&r-i[0].interval>=t;)i.shift()},r.onError.bind(r),function(){for(var n=e.now(),o=[];i.length>0;){var s=i.shift();t>=n-s.interval&&o.push(s.value)}r.onNext(o),r.onCompleted()})})},Ue.takeWithTime=function(t,e){var n=this;return e||(e=ke),new mn(function(r){var i=e.scheduleWithRelative(t,function(){r.onCompleted()});return new ye(i,n.subscribe(r))})},Ue.skipWithTime=function(t,e){var n=this;return e||(e=ke),new mn(function(r){var i=!1,o=e.scheduleWithRelative(t,function(){i=!0}),s=n.subscribe(function(t){i&&r.onNext(t)},r.onError.bind(r),r.onCompleted.bind(r));return new ye(o,s)})},Ue.skipUntilWithTime=function(t,e){e||(e=ke);var n=this,r=t instanceof Date?"scheduleWithAbsolute":"scheduleWithRelative";return new mn(function(i){var o=!1;return new ye(e[r](t,function(){o=!0}),n.subscribe(function(t){o&&i.onNext(t)},i.onError.bind(i),i.onCompleted.bind(i)))})},Ue.takeUntilWithTime=function(t,e){e||(e=ke);var n=this,r=t instanceof Date?"scheduleWithAbsolute":"scheduleWithRelative";return new mn(function(i){return new ye(e[r](t,function(){i.onCompleted()}),n.subscribe(i))})};var pn=function(t){function e(t){var e=this.source.publish(),n=e.subscribe(t),r=xe,i=this.subject.distinctUntilChanged().subscribe(function(t){t?r=e.connect():(r.dispose(),r=xe)});return new ye(n,r,i)}function n(n,r){this.source=n,this.subject=r||new gn,this.isPaused=!0,t.call(this,e)}return le(n,t),n.prototype.pause=function(){this.isPaused!==!0&&(this.isPaused=!0,this.subject.onNext(!1))},n.prototype.resume=function(){this.isPaused!==!1&&(this.isPaused=!1,this.subject.onNext(!0))},n}($e);Ue.pausable=function(t){return new pn(this,t)};var dn=function(t){function e(t){var e=[],n=!0,r=C(this.source,this.subject.distinctUntilChanged(),function(t,e){return{data:t,shouldFire:e}}).subscribe(function(r){if(r.shouldFire&&n&&t.onNext(r.data),r.shouldFire&&!n){for(;e.length>0;)t.onNext(e.shift());n=!0}else r.shouldFire||n?!r.shouldFire&&n&&(n=!1):e.push(r.data)},function(n){for(;e.length>0;)t.onNext(e.shift());t.onError(n)},function(){for(;e.length>0;)t.onNext(e.shift());t.onCompleted()});return this.subject.onNext(!1),r}function n(n,r){this.source=n,this.subject=r||new gn,this.isPaused=!0,t.call(this,e)}return le(n,t),n.prototype.pause=function(){this.isPaused!==!0&&(this.isPaused=!0,this.subject.onNext(!1))},n.prototype.resume=function(){this.isPaused!==!1&&(this.isPaused=!1,this.subject.onNext(!0))},n}($e);Ue.pausableBuffered=function(t){return new dn(this,t)},Ue.controlled=function(t){return null==t&&(t=!0),new bn(this,t)};var bn=function(t){function e(t){return this.source.subscribe(t)}function n(n,r){t.call(this,e),this.subject=new vn(r),this.source=n.multicast(this.subject).refCount()}return le(n,t),n.prototype.request=function(t){return null==t&&(t=-1),this.subject.request(t)},n}($e),vn=j.ControlledSubject=function(t){function n(t){return this.subject.subscribe(t)}function r(e){null==e&&(e=!0),t.call(this,n),this.subject=new gn,this.enableQueue=e,this.queue=e?[]:null,this.requestedCount=0,this.requestedDisposable=xe,this.error=null,this.hasFailed=!1,this.hasCompleted=!1,this.controlledDisposable=xe}return le(r,t),fe(r.prototype,Fe,{onCompleted:function(){e.call(this),this.hasCompleted=!0,this.enableQueue&&0!==this.queue.length||this.subject.onCompleted()},onError:function(t){e.call(this),this.hasFailed=!0,this.error=t,this.enableQueue&&0!==this.queue.length||this.subject.onError(t)},onNext:function(t){e.call(this);var n=!1;0===this.requestedCount?this.enableQueue&&this.queue.push(t):(-1!==this.requestedCount&&0===this.requestedCount--&&this.disposeCurrentRequest(),n=!0),n&&this.subject.onNext(t)},_processRequest:function(t){if(this.enableQueue){for(;this.queue.length>=t&&t>0;)this.subject.onNext(this.queue.shift()),t--;return 0!==this.queue.length?{numberOfItems:t,returnValue:!0}:{numberOfItems:t,returnValue:!1}}return this.hasFailed?(this.subject.onError(this.error),this.controlledDisposable.dispose(),this.controlledDisposable=xe):this.hasCompleted&&(this.subject.onCompleted(),this.controlledDisposable.dispose(),this.controlledDisposable=xe),{numberOfItems:t,returnValue:!1}},request:function(t){e.call(this),this.disposeCurrentRequest();var n=this,r=this._processRequest(t);return t=r.numberOfItems,r.returnValue?xe:(this.requestedCount=t,this.requestedDisposable=Ee(function(){n.requestedCount=0}),this.requestedDisposable)},disposeCurrentRequest:function(){this.requestedDisposable.dispose(),this.requestedDisposable=xe},dispose:function(){this.isDisposed=!0,this.error=null,this.subject.dispose(),this.requestedDisposable.dispose()}}),r}($e);Ue.pairwise=function(){var t=this;return new mn(function(e){var n,r=!1;return t.subscribe(function(t){r?e.onNext([n,t]):r=!0,n=t},e.onError.bind(e),e.onCompleted.bind(e))})},Ue.partition=function(t,e){var n=this.publish().refCount();return[n.filter(t,e),n.filter(function(n,r,i){return!t.call(e,n,r,i)})]},Ue.exclusive=function(){var t=this;return new mn(function(e){var n=!1,r=!1,i=new De,o=new ye;return o.add(i),i.setDisposable(t.subscribe(function(t){if(!n){n=!0,L(t)&&(t=an(t));var i=new De;o.add(i),i.setDisposable(t.subscribe(e.onNext.bind(e),e.onError.bind(e),function(){o.remove(i),n=!1,r&&1===o.length&&e.onCompleted()}))}},e.onError.bind(e),function(){r=!0,n||1!==o.length||e.onCompleted()})),o})},Ue.exclusiveMap=function(e,n){var r=this;return new mn(function(i){var o=0,s=!1,u=!0,c=new De,a=new ye;return a.add(c),c.setDisposable(r.subscribe(function(r){s||(s=!0,innerSubscription=new De,a.add(innerSubscription),L(r)&&(r=an(r)),innerSubscription.setDisposable(r.subscribe(function(s){var u;try{u=e.call(n,s,o++,r)}catch(c){return i.onError(c),t}i.onNext(u)},i.onError.bind(i),function(){a.remove(innerSubscription),s=!1,u&&1===a.length&&i.onCompleted()})))},i.onError.bind(i),function(){u=!0,1!==a.length||s||i.onCompleted()})),a})};var mn=j.AnonymousObservable=function(e){function n(e){return e===t?e=xe:"function"==typeof e&&(e=Ee(e)),e}function r(i){function o(t){var e=function(){try{r.setDisposable(n(i(r)))}catch(t){if(!r.fail(t))throw t}},r=new yn(t);return je.scheduleRequired()?je.schedule(e):e(),r}return this instanceof r?(e.call(this,o),t):new r(i)}return le(r,e),r}($e),yn=function(t){function e(e){t.call(this),this.observer=e,this.m=new De}le(e,t);var n=e.prototype;return n.next=function(t){var e=!1;try{this.observer.onNext(t),e=!0}catch(n){throw n}finally{e||this.dispose()}},n.error=function(t){try{this.observer.onError(t)}catch(e){throw e}finally{this.dispose()}},n.completed=function(){try{this.observer.onCompleted()}catch(t){throw t}finally{this.dispose()}},n.setDisposable=function(t){this.m.setDisposable(t)},n.getDisposable=function(){return this.m.getDisposable()},n.disposable=function(t){return arguments.length?this.getDisposable():setDisposable(t)},n.dispose=function(){t.prototype.dispose.call(this),this.m.dispose()},e}(Qe),wn=function(t,e){this.subject=t,this.observer=e};wn.prototype.dispose=function(){if(!this.subject.isDisposed&&null!==this.observer){var t=this.subject.observers.indexOf(this.observer);this.subject.observers.splice(t,1),this.observer=null}};var gn=j.Subject=function(t){function n(t){return e.call(this),this.isStopped?this.exception?(t.onError(this.exception),xe):(t.onCompleted(),xe):(this.observers.push(t),new wn(this,t))}function r(){t.call(this,n),this.isDisposed=!1,this.isStopped=!1,this.observers=[]}return le(r,t),fe(r.prototype,Fe,{hasObservers:function(){return this.observers.length>0},onCompleted:function(){if(e.call(this),!this.isStopped){var t=this.observers.slice(0);this.isStopped=!0;for(var n=0,r=t.length;r>n;n++)t[n].onCompleted();this.observers=[]}},onError:function(t){if(e.call(this),!this.isStopped){var n=this.observers.slice(0);this.isStopped=!0,this.exception=t;for(var r=0,i=n.length;i>r;r++)n[r].onError(t);this.observers=[]}},onNext:function(t){if(e.call(this),!this.isStopped)for(var n=this.observers.slice(0),r=0,i=n.length;i>r;r++)n[r].onNext(t)},dispose:function(){this.isDisposed=!0,this.observers=null}}),r.create=function(t,e){return new xn(t,e)},r}($e),En=j.AsyncSubject=function(t){function n(t){if(e.call(this),!this.isStopped)return this.observers.push(t),new wn(this,t);var n=this.exception,r=this.hasValue,i=this.value;return n?t.onError(n):r?(t.onNext(i),t.onCompleted()):t.onCompleted(),xe}function r(){t.call(this,n),this.isDisposed=!1,this.isStopped=!1,this.value=null,this.hasValue=!1,this.observers=[],this.exception=null}return le(r,t),fe(r.prototype,Fe,{hasObservers:function(){return e.call(this),this.observers.length>0},onCompleted:function(){var t,n,r;if(e.call(this),!this.isStopped){this.isStopped=!0;var i=this.observers.slice(0),o=this.value,s=this.hasValue;if(s)for(n=0,r=i.length;r>n;n++)t=i[n],t.onNext(o),t.onCompleted();else for(n=0,r=i.length;r>n;n++)i[n].onCompleted();this.observers=[]}},onError:function(t){if(e.call(this),!this.isStopped){var n=this.observers.slice(0);this.isStopped=!0,this.exception=t;for(var r=0,i=n.length;i>r;r++)n[r].onError(t);this.observers=[]}},onNext:function(t){e.call(this),this.isStopped||(this.value=t,this.hasValue=!0)},dispose:function(){this.isDisposed=!0,this.observers=null,this.exception=null,this.value=null}}),r}($e),xn=function(t){function e(t){return this.observable.subscribe(t)}function n(n,r){t.call(this,e),this.observer=n,this.observable=r}return le(n,t),fe(n.prototype,Fe,{onCompleted:function(){this.observer.onCompleted()},onError:function(t){this.observer.onError(t)},onNext:function(t){this.observer.onNext(t)}}),n}($e),Cn=j.BehaviorSubject=function(t){function n(t){if(e.call(this),!this.isStopped)return this.observers.push(t),t.onNext(this.value),new wn(this,t);var n=this.exception;return n?t.onError(n):t.onCompleted(),xe}function r(e){t.call(this,n),this.value=e,this.observers=[],this.isDisposed=!1,this.isStopped=!1,this.exception=null}return le(r,t),fe(r.prototype,Fe,{hasObservers:function(){return this.observers.length>0},onCompleted:function(){if(e.call(this),!this.isStopped){var t=this.observers.slice(0);this.isStopped=!0;for(var n=0,r=t.length;r>n;n++)t[n].onCompleted();this.observers=[]}},onError:function(t){if(e.call(this),!this.isStopped){var n=this.observers.slice(0);this.isStopped=!0,this.exception=t;for(var r=0,i=n.length;i>r;r++)n[r].onError(t);this.observers=[]}},onNext:function(t){if(e.call(this),!this.isStopped){this.value=t;for(var n=this.observers.slice(0),r=0,i=n.length;i>r;r++)n[r].onNext(t)}},dispose:function(){this.isDisposed=!0,this.observers=null,this.value=null,this.exception=null}}),r}($e),Dn=j.ReplaySubject=function(t){function n(t,e){this.subject=t,this.observer=e}function r(t){var r=new Ke(this.scheduler,t),i=new n(this,r);e.call(this),this._trim(this.scheduler.now()),this.observers.push(r);for(var o=this.q.length,s=0,u=this.q.length;u>s;s++)r.onNext(this.q[s].value);return this.hasError?(o++,r.onError(this.error)):this.isStopped&&(o++,r.onCompleted()),r.ensureActive(o),i}function i(e,n,i){this.bufferSize=null==e?Number.MAX_VALUE:e,this.windowSize=null==n?Number.MAX_VALUE:n,this.scheduler=i||je,this.q=[],this.observers=[],this.isStopped=!1,this.isDisposed=!1,this.hasError=!1,this.error=null,t.call(this,r)}return n.prototype.dispose=function(){if(this.observer.dispose(),!this.subject.isDisposed){var t=this.subject.observers.indexOf(this.observer);this.subject.observers.splice(t,1)}},le(i,t),fe(i.prototype,Fe,{hasObservers:function(){return this.observers.length>0},_trim:function(t){for(;this.q.length>this.bufferSize;)this.q.shift();for(;this.q.length>0&&t-this.q[0].interval>this.windowSize;)this.q.shift()},onNext:function(t){var n;if(e.call(this),!this.isStopped){var r=this.scheduler.now();this.q.push({interval:r,value:t}),this._trim(r);for(var i=this.observers.slice(0),o=0,s=i.length;s>o;o++)n=i[o],n.onNext(t),n.ensureActive()}},onError:function(t){var n;if(e.call(this),!this.isStopped){this.isStopped=!0,this.error=t,this.hasError=!0;var r=this.scheduler.now();this._trim(r);for(var i=this.observers.slice(0),o=0,s=i.length;s>o;o++)n=i[o],n.onError(t),n.ensureActive();this.observers=[]}},onCompleted:function(){var t;if(e.call(this),!this.isStopped){this.isStopped=!0;var n=this.scheduler.now();this._trim(n);for(var r=this.observers.slice(0),i=0,o=r.length;o>i;i++)t=r[i],t.onCompleted(),t.ensureActive();this.observers=[]}},dispose:function(){this.isDisposed=!0,this.observers=null}}),i}($e);"function"==typeof define&&"object"==typeof define.amd&&define.amd?(S.Rx=j,define(function(){return j})):N&&A?_?(A.exports=j).Rx=j:N.Rx=j:S.Rx=j}).call(this); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.lite.extras.js b/ajax/libs/rxjs/2.2.28/rx.lite.extras.js new file mode 100644 index 000000000..fe97f3206 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.lite.extras.js @@ -0,0 +1,664 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +;(function (factory) { + var objectTypes = { + 'boolean': false, + 'function': true, + 'object': true, + 'number': false, + 'string': false, + 'undefined': false + }; + + var root = (objectTypes[typeof window] && window) || this, + freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports, + freeModule = objectTypes[typeof module] && module && !module.nodeType && module, + moduleExports = freeModule && freeModule.exports === freeExports && freeExports, + freeGlobal = objectTypes[typeof global] && global; + + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) { + root = freeGlobal; + } + + // Because of build optimizers + if (typeof define === 'function' && define.amd) { + define(['rx', 'exports'], function (Rx, exports) { + root.Rx = factory(root, exports, Rx); + return root.Rx; + }); + } else if (typeof module === 'object' && module && module.exports === freeExports) { + module.exports = factory(root, module.exports, require('./rx')); + } else { + root.Rx = factory(root, {}, root.Rx); + } +}.call(this, function (root, exp, Rx, undefined) { + + // References + var Observable = Rx.Observable, + observableProto = Observable.prototype, + observableNever = Observable.never, + observableThrow = Observable.throwException, + AnonymousObservable = Rx.AnonymousObservable, + Observer = Rx.Observer, + Subject = Rx.Subject, + internals = Rx.internals, + helpers = Rx.helpers, + ScheduledObserver = internals.ScheduledObserver, + SingleAssignmentDisposable = Rx.SingleAssignmentDisposable, + CompositeDisposable = Rx.CompositeDisposable, + RefCountDisposable = Rx.RefCountDisposable, + disposableEmpty = Rx.Disposable.empty, + immediateScheduler = Rx.Scheduler.immediate, + defaultKeySerializer = helpers.defaultKeySerializer, + addRef = Rx.internals.addRef, + identity = helpers.identity, + isPromise = helpers.isPromise, + inherits = internals.inherits, + noop = helpers.noop, + observableFromPromise = Observable.fromPromise, + slice = Array.prototype.slice; + + function argsOrArray(args, idx) { + return args.length === 1 && Array.isArray(args[idx]) ? + args[idx] : + slice.call(args); + } + + var argumentOutOfRange = 'Argument out of range'; + + function ScheduledDisposable(scheduler, disposable) { + this.scheduler = scheduler; + this.disposable = disposable; + this.isDisposed = false; + } + + ScheduledDisposable.prototype.dispose = function () { + var parent = this; + this.scheduler.schedule(function () { + if (!parent.isDisposed) { + parent.isDisposed = true; + parent.disposable.dispose(); + } + }); + }; + + var CheckedObserver = (function (_super) { + inherits(CheckedObserver, _super); + + function CheckedObserver(observer) { + _super.call(this); + this._observer = observer; + this._state = 0; // 0 - idle, 1 - busy, 2 - done + } + + var CheckedObserverPrototype = CheckedObserver.prototype; + + CheckedObserverPrototype.onNext = function (value) { + this.checkAccess(); + try { + this._observer.onNext(value); + } catch (e) { + throw e; + } finally { + this._state = 0; + } + }; + + CheckedObserverPrototype.onError = function (err) { + this.checkAccess(); + try { + this._observer.onError(err); + } catch (e) { + throw e; + } finally { + this._state = 2; + } + }; + + CheckedObserverPrototype.onCompleted = function () { + this.checkAccess(); + try { + this._observer.onCompleted(); + } catch (e) { + throw e; + } finally { + this._state = 2; + } + }; + + CheckedObserverPrototype.checkAccess = function () { + if (this._state === 1) { throw new Error('Re-entrancy detected'); } + if (this._state === 2) { throw new Error('Observer completed'); } + if (this._state === 0) { this._state = 1; } + }; + + return CheckedObserver; + }(Observer)); + + /** @private */ + var ObserveOnObserver = (function (_super) { + inherits(ObserveOnObserver, _super); + + /** @private */ + function ObserveOnObserver() { + _super.apply(this, arguments); + } + + /** @private */ + ObserveOnObserver.prototype.next = function (value) { + _super.prototype.next.call(this, value); + this.ensureActive(); + }; + + /** @private */ + ObserveOnObserver.prototype.error = function (e) { + _super.prototype.error.call(this, e); + this.ensureActive(); + }; + + /** @private */ + ObserveOnObserver.prototype.completed = function () { + _super.prototype.completed.call(this); + this.ensureActive(); + }; + + return ObserveOnObserver; + })(ScheduledObserver); + + /** + * Wraps the source sequence in order to run its observer callbacks on the specified scheduler. + * + * This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects + * that require to be run on a scheduler, use subscribeOn. + * + * @param {Scheduler} scheduler Scheduler to notify observers on. + * @returns {Observable} The source sequence whose observations happen on the specified scheduler. + */ + observableProto.observeOn = function (scheduler) { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(new ObserveOnObserver(scheduler, observer)); + }); + }; + + /** + * Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used; + * see the remarks section for more information on the distinction between subscribeOn and observeOn. + + * This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer + * callbacks on a scheduler, use observeOn. + + * @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on. + * @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler. + */ + observableProto.subscribeOn = function (scheduler) { + var source = this; + return new AnonymousObservable(function (observer) { + var m = new SingleAssignmentDisposable(), d = new SerialDisposable(); + d.setDisposable(m); + m.setDisposable(scheduler.schedule(function () { + d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(observer))); + })); + return d; + }); + }; + + /** + * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime. + * + * @example + * var res = Rx.Observable.using(function () { return new AsyncSubject(); }, function (s) { return s; }); + * @param {Function} resourceFactory Factory function to obtain a resource object. + * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource. + * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object. + */ + Observable.using = function (resourceFactory, observableFactory) { + return new AnonymousObservable(function (observer) { + var disposable = disposableEmpty, resource, source; + try { + resource = resourceFactory(); + if (resource) { + disposable = resource; + } + source = observableFactory(resource); + } catch (exception) { + return new CompositeDisposable(observableThrow(exception).subscribe(observer), disposable); + } + return new CompositeDisposable(source.subscribe(observer), disposable); + }); + }; + + /** + * Propagates the observable sequence or Promise that reacts first. + * @param {Observable} rightSource Second observable sequence or Promise. + * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first. + */ + observableProto.amb = function (rightSource) { + var leftSource = this; + return new AnonymousObservable(function (observer) { + var choice, + leftChoice = 'L', rightChoice = 'R', + leftSubscription = new SingleAssignmentDisposable(), + rightSubscription = new SingleAssignmentDisposable(); + + isPromise(rightSource) && (rightSource = observableFromPromise(rightSource)); + + function choiceL() { + if (!choice) { + choice = leftChoice; + rightSubscription.dispose(); + } + } + + function choiceR() { + if (!choice) { + choice = rightChoice; + leftSubscription.dispose(); + } + } + + leftSubscription.setDisposable(leftSource.subscribe(function (left) { + choiceL(); + if (choice === leftChoice) { + observer.onNext(left); + } + }, function (err) { + choiceL(); + if (choice === leftChoice) { + observer.onError(err); + } + }, function () { + choiceL(); + if (choice === leftChoice) { + observer.onCompleted(); + } + })); + + rightSubscription.setDisposable(rightSource.subscribe(function (right) { + choiceR(); + if (choice === rightChoice) { + observer.onNext(right); + } + }, function (err) { + choiceR(); + if (choice === rightChoice) { + observer.onError(err); + } + }, function () { + choiceR(); + if (choice === rightChoice) { + observer.onCompleted(); + } + })); + + return new CompositeDisposable(leftSubscription, rightSubscription); + }); + }; + + /** + * Propagates the observable sequence or Promise that reacts first. + * + * @example + * var = Rx.Observable.amb(xs, ys, zs); + * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first. + */ + Observable.amb = function () { + var acc = observableNever(), + items = argsOrArray(arguments, 0); + function func(previous, current) { + return previous.amb(current); + } + for (var i = 0, len = items.length; i < len; i++) { + acc = func(acc, items[i]); + } + return acc; + }; + + /** + * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence. + * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates. + * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally. + */ + observableProto.onErrorResumeNext = function (second) { + if (!second) { + throw new Error('Second observable is required'); + } + return onErrorResumeNext([this, second]); + }; + + /** + * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence. + * + * @example + * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs); + * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]); + * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally. + */ + var onErrorResumeNext = Observable.onErrorResumeNext = function () { + var sources = argsOrArray(arguments, 0); + return new AnonymousObservable(function (observer) { + var pos = 0, subscription = new SerialDisposable(), + cancelable = immediateScheduler.scheduleRecursive(function (self) { + var current, d; + if (pos < sources.length) { + current = sources[pos++]; + isPromise(current) && (current = observableFromPromise(current)); + d = new SingleAssignmentDisposable(); + subscription.setDisposable(d); + d.setDisposable(current.subscribe(observer.onNext.bind(observer), function () { + self(); + }, function () { + self(); + })); + } else { + observer.onCompleted(); + } + }); + return new CompositeDisposable(subscription, cancelable); + }); + }; + + /** + * Projects each element of an observable sequence into zero or more buffers which are produced based on element count information. + * + * @example + * var res = xs.bufferWithCount(10); + * var res = xs.bufferWithCount(10, 1); + * @param {Number} count Length of each buffer. + * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count. + * @returns {Observable} An observable sequence of buffers. + */ + observableProto.bufferWithCount = function (count, skip) { + if (typeof skip !== 'number') { + skip = count; + } + return this.windowWithCount(count, skip).selectMany(function (x) { + return x.toArray(); + }).where(function (x) { + return x.length > 0; + }); + }; + + /** + * Projects each element of an observable sequence into zero or more windows which are produced based on element count information. + * + * var res = xs.windowWithCount(10); + * var res = xs.windowWithCount(10, 1); + * @param {Number} count Length of each window. + * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count. + * @returns {Observable} An observable sequence of windows. + */ + observableProto.windowWithCount = function (count, skip) { + var source = this; + if (count <= 0) { + throw new Error(argumentOutOfRange); + } + if (arguments.length === 1) { + skip = count; + } + if (skip <= 0) { + throw new Error(argumentOutOfRange); + } + return new AnonymousObservable(function (observer) { + var m = new SingleAssignmentDisposable(), + refCountDisposable = new RefCountDisposable(m), + n = 0, + q = [], + createWindow = function () { + var s = new Subject(); + q.push(s); + observer.onNext(addRef(s, refCountDisposable)); + }; + createWindow(); + m.setDisposable(source.subscribe(function (x) { + var s; + for (var i = 0, len = q.length; i < len; i++) { + q[i].onNext(x); + } + var c = n - count + 1; + if (c >= 0 && c % skip === 0) { + s = q.shift(); + s.onCompleted(); + } + n++; + if (n % skip === 0) { + createWindow(); + } + }, function (exception) { + while (q.length > 0) { + q.shift().onError(exception); + } + observer.onError(exception); + }, function () { + while (q.length > 0) { + q.shift().onCompleted(); + } + observer.onCompleted(); + })); + return refCountDisposable; + }); + }; + + /** + * Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty. + * + * var res = obs = xs.defaultIfEmpty(); + * 2 - obs = xs.defaultIfEmpty(false); + * + * @memberOf Observable# + * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null. + * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself. + */ + observableProto.defaultIfEmpty = function (defaultValue) { + var source = this; + if (defaultValue === undefined) { + defaultValue = null; + } + return new AnonymousObservable(function (observer) { + var found = false; + return source.subscribe(function (x) { + found = true; + observer.onNext(x); + }, observer.onError.bind(observer), function () { + if (!found) { + observer.onNext(defaultValue); + } + observer.onCompleted(); + }); + }); + }; + + /** + * Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer. + * Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large. + * + * @example + * var res = obs = xs.distinct(); + * 2 - obs = xs.distinct(function (x) { return x.id; }); + * 2 - obs = xs.distinct(function (x) { return x.id; }, function (x) { return x.toString(); }); + * @param {Function} [keySelector] A function to compute the comparison key for each element. + * @param {Function} [keySerializer] Used to serialize the given object into a string for object comparison. + * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence. + */ + observableProto.distinct = function (keySelector, keySerializer) { + var source = this; + keySelector || (keySelector = identity); + keySerializer || (keySerializer = defaultKeySerializer); + return new AnonymousObservable(function (observer) { + var hashSet = {}; + return source.subscribe(function (x) { + var key, serializedKey, otherKey, hasMatch = false; + try { + key = keySelector(x); + serializedKey = keySerializer(key); + } catch (exception) { + observer.onError(exception); + return; + } + for (otherKey in hashSet) { + if (serializedKey === otherKey) { + hasMatch = true; + break; + } + } + if (!hasMatch) { + hashSet[serializedKey] = null; + observer.onNext(x); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function. + * + * @example + * var res = observable.groupBy(function (x) { return x.id; }); + * 2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }); + * 3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); }); + * @param {Function} keySelector A function to extract the key for each element. + * @param {Function} [elementSelector] A function to map each source element to an element in an observable group. + * @param {Function} [keySerializer] Used to serialize the given object into a string for object comparison. + * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value. + */ + observableProto.groupBy = function (keySelector, elementSelector, keySerializer) { + return this.groupByUntil(keySelector, elementSelector, function () { + return observableNever(); + }, keySerializer); + }; + + /** + * Groups the elements of an observable sequence according to a specified key selector function. + * A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same + * key value as a reclaimed group occurs, the group will be reborn with a new lifetime request. + * + * @example + * var res = observable.groupByUntil(function (x) { return x.id; }, null, function () { return Rx.Observable.never(); }); + * 2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function () { return Rx.Observable.never(); }); + * 3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function () { return Rx.Observable.never(); }, function (x) { return x.toString(); }); + * @param {Function} keySelector A function to extract the key for each element. + * @param {Function} durationSelector A function to signal the expiration of a group. + * @param {Function} [keySerializer] Used to serialize the given object into a string for object comparison. + * @returns {Observable} + * A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value. + * If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered. + * + */ + observableProto.groupByUntil = function (keySelector, elementSelector, durationSelector, keySerializer) { + var source = this; + elementSelector || (elementSelector = identity); + keySerializer || (keySerializer = defaultKeySerializer); + return new AnonymousObservable(function (observer) { + var map = {}, + groupDisposable = new CompositeDisposable(), + refCountDisposable = new RefCountDisposable(groupDisposable); + groupDisposable.add(source.subscribe(function (x) { + var duration, durationGroup, element, fireNewMapEntry, group, key, serializedKey, md, writer, w; + try { + key = keySelector(x); + serializedKey = keySerializer(key); + } catch (e) { + for (w in map) { + map[w].onError(e); + } + observer.onError(e); + return; + } + fireNewMapEntry = false; + try { + writer = map[serializedKey]; + if (!writer) { + writer = new Subject(); + map[serializedKey] = writer; + fireNewMapEntry = true; + } + } catch (e) { + for (w in map) { + map[w].onError(e); + } + observer.onError(e); + return; + } + if (fireNewMapEntry) { + group = new GroupedObservable(key, writer, refCountDisposable); + durationGroup = new GroupedObservable(key, writer); + try { + duration = durationSelector(durationGroup); + } catch (e) { + for (w in map) { + map[w].onError(e); + } + observer.onError(e); + return; + } + observer.onNext(group); + md = new SingleAssignmentDisposable(); + groupDisposable.add(md); + var expire = function () { + if (serializedKey in map) { + delete map[serializedKey]; + writer.onCompleted(); + } + groupDisposable.remove(md); + }; + md.setDisposable(duration.take(1).subscribe(noop, function (exn) { + for (w in map) { + map[w].onError(exn); + } + observer.onError(exn); + }, function () { + expire(); + })); + } + try { + element = elementSelector(x); + } catch (e) { + for (w in map) { + map[w].onError(e); + } + observer.onError(e); + return; + } + writer.onNext(element); + }, function (ex) { + for (var w in map) { + map[w].onError(ex); + } + observer.onError(ex); + }, function () { + for (var w in map) { + map[w].onCompleted(); + } + observer.onCompleted(); + })); + return refCountDisposable; + }); + }; + + /** @private */ + var GroupedObservable = (function (_super) { + inherits(GroupedObservable, _super); + + function subscribe(observer) { + return this.underlyingObservable.subscribe(observer); + } + + /** + * @constructor + * @private + */ + function GroupedObservable(key, underlyingObservable, mergedDisposable) { + _super.call(this, subscribe); + this.key = key; + this.underlyingObservable = !mergedDisposable ? + underlyingObservable : + new AnonymousObservable(function (observer) { + return new CompositeDisposable(mergedDisposable.getDisposable(), underlyingObservable.subscribe(observer)); + }); + } + + return GroupedObservable; + }(Observable)); + + return Rx; +})); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.lite.extras.min.js b/ajax/libs/rxjs/2.2.28/rx.lite.extras.min.js new file mode 100644 index 000000000..fbd67e991 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.lite.extras.min.js @@ -0,0 +1 @@ +(function(t){var e={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},n=e[typeof window]&&window||this,r=e[typeof exports]&&exports&&!exports.nodeType&&exports,i=e[typeof module]&&module&&!module.nodeType&&module,o=(i&&i.exports===r&&r,e[typeof global]&&global);!o||o.global!==o&&o.window!==o||(n=o),"function"==typeof define&&define.amd?define(["rx","exports"],function(e,r){return n.Rx=t(n,r,e),n.Rx}):"object"==typeof module&&module&&module.exports===r?module.exports=t(n,module.exports,require("./rx")):n.Rx=t(n,{},n.Rx)}).call(this,function(t,e,n,r){function i(t,e){return 1===t.length&&Array.isArray(t[e])?t[e]:_.call(t)}function o(t,e){this.scheduler=t,this.disposable=e,this.isDisposed=!1}var s=n.Observable,u=s.prototype,c=s.never,a=s.throwException,h=n.AnonymousObservable,l=n.Observer,f=n.Subject,p=n.internals,d=n.helpers,b=p.ScheduledObserver,v=n.SingleAssignmentDisposable,m=n.CompositeDisposable,y=n.RefCountDisposable,w=n.Disposable.empty,g=n.Scheduler.immediate,E=d.defaultKeySerializer,x=n.internals.addRef,C=d.identity,D=d.isPromise,S=p.inherits,N=d.noop,A=s.fromPromise,_=Array.prototype.slice,O="Argument out of range";o.prototype.dispose=function(){var t=this;this.scheduler.schedule(function(){t.isDisposed||(t.isDisposed=!0,t.disposable.dispose())})},function(t){function e(e){t.call(this),this._observer=e,this._state=0}S(e,t);var n=e.prototype;return n.onNext=function(t){this.checkAccess();try{this._observer.onNext(t)}catch(e){throw e}finally{this._state=0}},n.onError=function(t){this.checkAccess();try{this._observer.onError(t)}catch(e){throw e}finally{this._state=2}},n.onCompleted=function(){this.checkAccess();try{this._observer.onCompleted()}catch(t){throw t}finally{this._state=2}},n.checkAccess=function(){if(1===this._state)throw Error("Re-entrancy detected");if(2===this._state)throw Error("Observer completed");0===this._state&&(this._state=1)},e}(l);var j=function(t){function e(){t.apply(this,arguments)}return S(e,t),e.prototype.next=function(e){t.prototype.next.call(this,e),this.ensureActive()},e.prototype.error=function(e){t.prototype.error.call(this,e),this.ensureActive()},e.prototype.completed=function(){t.prototype.completed.call(this),this.ensureActive()},e}(b);u.observeOn=function(t){var e=this;return new h(function(n){return e.subscribe(new j(t,n))})},u.subscribeOn=function(t){var e=this;return new h(function(n){var r=new v,i=new SerialDisposable;return i.setDisposable(r),r.setDisposable(t.schedule(function(){i.setDisposable(new o(t,e.subscribe(n)))})),i})},s.using=function(t,e){return new h(function(n){var r,i,o=w;try{r=t(),r&&(o=r),i=e(r)}catch(s){return new m(a(s).subscribe(n),o)}return new m(i.subscribe(n),o)})},u.amb=function(t){var e=this;return new h(function(n){function r(){o||(o=s,a.dispose())}function i(){o||(o=u,c.dispose())}var o,s="L",u="R",c=new v,a=new v;return D(t)&&(t=A(t)),c.setDisposable(e.subscribe(function(t){r(),o===s&&n.onNext(t)},function(t){r(),o===s&&n.onError(t)},function(){r(),o===s&&n.onCompleted()})),a.setDisposable(t.subscribe(function(t){i(),o===u&&n.onNext(t)},function(t){i(),o===u&&n.onError(t)},function(){i(),o===u&&n.onCompleted()})),new m(c,a)})},s.amb=function(){function t(t,e){return t.amb(e)}for(var e=c(),n=i(arguments,0),r=0,o=n.length;o>r;r++)e=t(e,n[r]);return e},u.onErrorResumeNext=function(t){if(!t)throw Error("Second observable is required");return R([this,t])};var R=s.onErrorResumeNext=function(){var t=i(arguments,0);return new h(function(e){var n=0,r=new SerialDisposable,i=g.scheduleRecursive(function(i){var o,s;t.length>n?(o=t[n++],D(o)&&(o=A(o)),s=new v,r.setDisposable(s),s.setDisposable(o.subscribe(e.onNext.bind(e),function(){i()},function(){i()}))):e.onCompleted()});return new m(r,i)})};u.bufferWithCount=function(t,e){return"number"!=typeof e&&(e=t),this.windowWithCount(t,e).selectMany(function(t){return t.toArray()}).where(function(t){return t.length>0})},u.windowWithCount=function(t,e){var n=this;if(0>=t)throw Error(O);if(1===arguments.length&&(e=t),0>=e)throw Error(O);return new h(function(r){var i=new v,o=new y(i),s=0,u=[],c=function(){var t=new f;u.push(t),r.onNext(x(t,o))};return c(),i.setDisposable(n.subscribe(function(n){for(var r,i=0,o=u.length;o>i;i++)u[i].onNext(n);var a=s-t+1;a>=0&&0===a%e&&(r=u.shift(),r.onCompleted()),s++,0===s%e&&c()},function(t){for(;u.length>0;)u.shift().onError(t);r.onError(t)},function(){for(;u.length>0;)u.shift().onCompleted();r.onCompleted()})),o})},u.defaultIfEmpty=function(t){var e=this;return t===r&&(t=null),new h(function(n){var r=!1;return e.subscribe(function(t){r=!0,n.onNext(t)},n.onError.bind(n),function(){r||n.onNext(t),n.onCompleted()})})},u.distinct=function(t,e){var n=this;return t||(t=C),e||(e=E),new h(function(i){var o={};return n.subscribe(function(n){var s,u,c,a=!1;try{s=t(n),u=e(s)}catch(h){return i.onError(h),r}for(c in o)if(u===c){a=!0;break}a||(o[u]=null,i.onNext(n))},i.onError.bind(i),i.onCompleted.bind(i))})},u.groupBy=function(t,e,n){return this.groupByUntil(t,e,function(){return c()},n)},u.groupByUntil=function(t,e,n,i){var o=this;return e||(e=C),i||(i=E),new h(function(s){var u={},c=new m,a=new y(c);return c.add(o.subscribe(function(o){var h,l,p,d,b,m,y,w,g,E;try{m=t(o),y=i(m)}catch(x){for(E in u)u[E].onError(x);return s.onError(x),r}d=!1;try{g=u[y],g||(g=new f,u[y]=g,d=!0)}catch(x){for(E in u)u[E].onError(x);return s.onError(x),r}if(d){b=new W(m,g,a),l=new W(m,g);try{h=n(l)}catch(x){for(E in u)u[E].onError(x);return s.onError(x),r}s.onNext(b),w=new v,c.add(w);var C=function(){y in u&&(delete u[y],g.onCompleted()),c.remove(w)};w.setDisposable(h.take(1).subscribe(N,function(t){for(E in u)u[E].onError(t);s.onError(t)},function(){C()}))}try{p=e(o)}catch(x){for(E in u)u[E].onError(x);return s.onError(x),r}g.onNext(p)},function(t){for(var e in u)u[e].onError(t);s.onError(t)},function(){for(var t in u)u[t].onCompleted();s.onCompleted()})),a})};var W=function(t){function e(t){return this.underlyingObservable.subscribe(t)}function n(n,r,i){t.call(this,e),this.key=n,this.underlyingObservable=i?new h(function(t){return new m(i.getDisposable(),r.subscribe(t))}):r}return S(n,t),n}(s);return n}); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.lite.js b/ajax/libs/rxjs/2.2.28/rx.lite.js new file mode 100644 index 000000000..0988b3648 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.lite.js @@ -0,0 +1,5852 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +;(function (undefined) { + + var objectTypes = { + 'boolean': false, + 'function': true, + 'object': true, + 'number': false, + 'string': false, + 'undefined': false + }; + + var root = (objectTypes[typeof window] && window) || this, + freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports, + freeModule = objectTypes[typeof module] && module && !module.nodeType && module, + moduleExports = freeModule && freeModule.exports === freeExports && freeExports, + freeGlobal = objectTypes[typeof global] && global; + + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) { + root = freeGlobal; + } + + var Rx = { + internals: {}, + config: { + Promise: root.Promise // Detect if promise exists + }, + helpers: { } + }; + + // Defaults + var noop = Rx.helpers.noop = function () { }, + identity = Rx.helpers.identity = function (x) { return x; }, + pluck = Rx.helpers.pluck = function (property) { return function (x) { return x[property]; }; }, + just = Rx.helpers.just = function (value) { return function () { return value; }; }, + defaultNow = Rx.helpers.defaultNow = Date.now, + defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); }, + defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); }, + defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); }, + defaultError = Rx.helpers.defaultError = function (err) { throw err; }, + isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.then === 'function' && p.then !== Rx.Observable.prototype.then; }, + asArray = Rx.helpers.asArray = function () { return Array.prototype.slice.call(arguments); }, + not = Rx.helpers.not = function (a) { return !a; }; + + // Errors + var sequenceContainsNoElements = 'Sequence contains no elements.'; + var argumentOutOfRange = 'Argument out of range'; + var objectDisposed = 'Object has been disposed'; + function checkDisposed() { if (this.isDisposed) { throw new Error(objectDisposed); } } + + // Shim in iterator support + var $iterator$ = (typeof Symbol === 'object' && Symbol.iterator) || + '_es6shim_iterator_'; + // Firefox ships a partial implementation using the name @@iterator. + // https://bugzilla.mozilla.org/show_bug.cgi?id=907077#c14 + // So use that name if we detect it. + if (root.Set && typeof new root.Set()['@@iterator'] === 'function') { + $iterator$ = '@@iterator'; + } + var doneEnumerator = { done: true, value: undefined }; + + /** `Object#toString` result shortcuts */ + var argsClass = '[object Arguments]', + arrayClass = '[object Array]', + boolClass = '[object Boolean]', + dateClass = '[object Date]', + errorClass = '[object Error]', + funcClass = '[object Function]', + numberClass = '[object Number]', + objectClass = '[object Object]', + regexpClass = '[object RegExp]', + stringClass = '[object String]'; + + var toString = Object.prototype.toString, + hasOwnProperty = Object.prototype.hasOwnProperty, + supportsArgsClass = toString.call(arguments) == argsClass, // For less -1); + } + }); + } + } + stackA.pop(); + stackB.pop(); + + return result; + } + var slice = Array.prototype.slice; + function argsOrArray(args, idx) { + return args.length === 1 && Array.isArray(args[idx]) ? + args[idx] : + slice.call(args); + } + var hasProp = {}.hasOwnProperty; + + /** @private */ + var inherits = this.inherits = Rx.internals.inherits = function (child, parent) { + function __() { this.constructor = child; } + __.prototype = parent.prototype; + child.prototype = new __(); + }; + + /** @private */ + var addProperties = Rx.internals.addProperties = function (obj) { + var sources = slice.call(arguments, 1); + for (var i = 0, len = sources.length; i < len; i++) { + var source = sources[i]; + for (var prop in source) { + obj[prop] = source[prop]; + } + } + }; + + // Rx Utils + var addRef = Rx.internals.addRef = function (xs, r) { + return new AnonymousObservable(function (observer) { + return new CompositeDisposable(r.getDisposable(), xs.subscribe(observer)); + }); + }; + + // Collection polyfills + function arrayInitialize(count, factory) { + var a = new Array(count); + for (var i = 0; i < count; i++) { + a[i] = factory(); + } + return a; + } + + // Collections + var IndexedItem = function (id, value) { + this.id = id; + this.value = value; + }; + + IndexedItem.prototype.compareTo = function (other) { + var c = this.value.compareTo(other.value); + if (c === 0) { + c = this.id - other.id; + } + return c; + }; + + // Priority Queue for Scheduling + var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) { + this.items = new Array(capacity); + this.length = 0; + }; + + var priorityProto = PriorityQueue.prototype; + priorityProto.isHigherPriority = function (left, right) { + return this.items[left].compareTo(this.items[right]) < 0; + }; + + priorityProto.percolate = function (index) { + if (index >= this.length || index < 0) { + return; + } + var parent = index - 1 >> 1; + if (parent < 0 || parent === index) { + return; + } + if (this.isHigherPriority(index, parent)) { + var temp = this.items[index]; + this.items[index] = this.items[parent]; + this.items[parent] = temp; + this.percolate(parent); + } + }; + + priorityProto.heapify = function (index) { + if (index === undefined) { + index = 0; + } + if (index >= this.length || index < 0) { + return; + } + var left = 2 * index + 1, + right = 2 * index + 2, + first = index; + if (left < this.length && this.isHigherPriority(left, first)) { + first = left; + } + if (right < this.length && this.isHigherPriority(right, first)) { + first = right; + } + if (first !== index) { + var temp = this.items[index]; + this.items[index] = this.items[first]; + this.items[first] = temp; + this.heapify(first); + } + }; + + priorityProto.peek = function () { return this.items[0].value; }; + + priorityProto.removeAt = function (index) { + this.items[index] = this.items[--this.length]; + delete this.items[this.length]; + this.heapify(); + }; + + priorityProto.dequeue = function () { + var result = this.peek(); + this.removeAt(0); + return result; + }; + + priorityProto.enqueue = function (item) { + var index = this.length++; + this.items[index] = new IndexedItem(PriorityQueue.count++, item); + this.percolate(index); + }; + + priorityProto.remove = function (item) { + for (var i = 0; i < this.length; i++) { + if (this.items[i].value === item) { + this.removeAt(i); + return true; + } + } + return false; + }; + PriorityQueue.count = 0; + /** + * Represents a group of disposable resources that are disposed together. + * @constructor + */ + var CompositeDisposable = Rx.CompositeDisposable = function () { + this.disposables = argsOrArray(arguments, 0); + this.isDisposed = false; + this.length = this.disposables.length; + }; + + var CompositeDisposablePrototype = CompositeDisposable.prototype; + + /** + * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed. + * @param {Mixed} item Disposable to add. + */ + CompositeDisposablePrototype.add = function (item) { + if (this.isDisposed) { + item.dispose(); + } else { + this.disposables.push(item); + this.length++; + } + }; + + /** + * Removes and disposes the first occurrence of a disposable from the CompositeDisposable. + * @param {Mixed} item Disposable to remove. + * @returns {Boolean} true if found; false otherwise. + */ + CompositeDisposablePrototype.remove = function (item) { + var shouldDispose = false; + if (!this.isDisposed) { + var idx = this.disposables.indexOf(item); + if (idx !== -1) { + shouldDispose = true; + this.disposables.splice(idx, 1); + this.length--; + item.dispose(); + } + + } + return shouldDispose; + }; + + /** + * Disposes all disposables in the group and removes them from the group. + */ + CompositeDisposablePrototype.dispose = function () { + if (!this.isDisposed) { + this.isDisposed = true; + var currentDisposables = this.disposables.slice(0); + this.disposables = []; + this.length = 0; + + for (var i = 0, len = currentDisposables.length; i < len; i++) { + currentDisposables[i].dispose(); + } + } + }; + + /** + * Removes and disposes all disposables from the CompositeDisposable, but does not dispose the CompositeDisposable. + */ + CompositeDisposablePrototype.clear = function () { + var currentDisposables = this.disposables.slice(0); + this.disposables = []; + this.length = 0; + for (var i = 0, len = currentDisposables.length; i < len; i++) { + currentDisposables[i].dispose(); + } + }; + + /** + * Determines whether the CompositeDisposable contains a specific disposable. + * @param {Mixed} item Disposable to search for. + * @returns {Boolean} true if the disposable was found; otherwise, false. + */ + CompositeDisposablePrototype.contains = function (item) { + return this.disposables.indexOf(item) !== -1; + }; + + /** + * Converts the existing CompositeDisposable to an array of disposables + * @returns {Array} An array of disposable objects. + */ + CompositeDisposablePrototype.toArray = function () { + return this.disposables.slice(0); + }; + + /** + * Provides a set of static methods for creating Disposables. + * + * @constructor + * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once. + */ + var Disposable = Rx.Disposable = function (action) { + this.isDisposed = false; + this.action = action || noop; + }; + + /** Performs the task of cleaning up resources. */ + Disposable.prototype.dispose = function () { + if (!this.isDisposed) { + this.action(); + this.isDisposed = true; + } + }; + + /** + * Creates a disposable object that invokes the specified action when disposed. + * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once. + * @return {Disposable} The disposable object that runs the given action upon disposal. + */ + var disposableCreate = Disposable.create = function (action) { return new Disposable(action); }; + + /** + * Gets the disposable that does nothing when disposed. + */ + var disposableEmpty = Disposable.empty = { dispose: noop }; + + var BooleanDisposable = (function () { + function BooleanDisposable (isSingle) { + this.isSingle = isSingle; + this.isDisposed = false; + this.current = null; + } + + var booleanDisposablePrototype = BooleanDisposable.prototype; + + /** + * Gets the underlying disposable. + * @return The underlying disposable. + */ + booleanDisposablePrototype.getDisposable = function () { + return this.current; + }; + + /** + * Sets the underlying disposable. + * @param {Disposable} value The new underlying disposable. + */ + booleanDisposablePrototype.setDisposable = function (value) { + if (this.current && this.isSingle) { + throw new Error('Disposable has already been assigned'); + } + + var shouldDispose = this.isDisposed, old; + if (!shouldDispose) { + old = this.current; + this.current = value; + } + if (old) { + old.dispose(); + } + if (shouldDispose && value) { + value.dispose(); + } + }; + + /** + * Disposes the underlying disposable as well as all future replacements. + */ + booleanDisposablePrototype.dispose = function () { + var old; + if (!this.isDisposed) { + this.isDisposed = true; + old = this.current; + this.current = null; + } + if (old) { + old.dispose(); + } + }; + + return BooleanDisposable; + }()); + + /** + * Represents a disposable resource which only allows a single assignment of its underlying disposable resource. + * If an underlying disposable resource has already been set, future attempts to set the underlying disposable resource will throw an Error. + */ + var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = (function (super_) { + inherits(SingleAssignmentDisposable, super_); + + function SingleAssignmentDisposable() { + super_.call(this, true); + } + + return SingleAssignmentDisposable; + }(BooleanDisposable)); + + /** + * Represents a disposable resource whose underlying disposable resource can be replaced by another disposable resource, causing automatic disposal of the previous underlying disposable resource. + */ + var SerialDisposable = Rx.SerialDisposable = (function (super_) { + inherits(SerialDisposable, super_); + + function SerialDisposable() { + super_.call(this, false); + } + + return SerialDisposable; + }(BooleanDisposable)); + + /** + * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed. + */ + var RefCountDisposable = Rx.RefCountDisposable = (function () { + + function InnerDisposable(disposable) { + this.disposable = disposable; + this.disposable.count++; + this.isInnerDisposed = false; + } + + InnerDisposable.prototype.dispose = function () { + if (!this.disposable.isDisposed) { + if (!this.isInnerDisposed) { + this.isInnerDisposed = true; + this.disposable.count--; + if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) { + this.disposable.isDisposed = true; + this.disposable.underlyingDisposable.dispose(); + } + } + } + }; + + /** + * Initializes a new instance of the RefCountDisposable with the specified disposable. + * @constructor + * @param {Disposable} disposable Underlying disposable. + */ + function RefCountDisposable(disposable) { + this.underlyingDisposable = disposable; + this.isDisposed = false; + this.isPrimaryDisposed = false; + this.count = 0; + } + + /** + * Disposes the underlying disposable only when all dependent disposables have been disposed + */ + RefCountDisposable.prototype.dispose = function () { + if (!this.isDisposed) { + if (!this.isPrimaryDisposed) { + this.isPrimaryDisposed = true; + if (this.count === 0) { + this.isDisposed = true; + this.underlyingDisposable.dispose(); + } + } + } + }; + + /** + * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable. + * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime. + */ + RefCountDisposable.prototype.getDisposable = function () { + return this.isDisposed ? disposableEmpty : new InnerDisposable(this); + }; + + return RefCountDisposable; + })(); + + var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) { + this.scheduler = scheduler; + this.state = state; + this.action = action; + this.dueTime = dueTime; + this.comparer = comparer || defaultSubComparer; + this.disposable = new SingleAssignmentDisposable(); + } + + ScheduledItem.prototype.invoke = function () { + this.disposable.setDisposable(this.invokeCore()); + }; + + ScheduledItem.prototype.compareTo = function (other) { + return this.comparer(this.dueTime, other.dueTime); + }; + + ScheduledItem.prototype.isCancelled = function () { + return this.disposable.isDisposed; + }; + + ScheduledItem.prototype.invokeCore = function () { + return this.action(this.scheduler, this.state); + }; + + /** Provides a set of static properties to access commonly used schedulers. */ + var Scheduler = Rx.Scheduler = (function () { + + function Scheduler(now, schedule, scheduleRelative, scheduleAbsolute) { + this.now = now; + this._schedule = schedule; + this._scheduleRelative = scheduleRelative; + this._scheduleAbsolute = scheduleAbsolute; + } + + function invokeRecImmediate(scheduler, pair) { + var state = pair.first, action = pair.second, group = new CompositeDisposable(), + recursiveAction = function (state1) { + action(state1, function (state2) { + var isAdded = false, isDone = false, + d = scheduler.scheduleWithState(state2, function (scheduler1, state3) { + if (isAdded) { + group.remove(d); + } else { + isDone = true; + } + recursiveAction(state3); + return disposableEmpty; + }); + if (!isDone) { + group.add(d); + isAdded = true; + } + }); + }; + recursiveAction(state); + return group; + } + + function invokeRecDate(scheduler, pair, method) { + var state = pair.first, action = pair.second, group = new CompositeDisposable(), + recursiveAction = function (state1) { + action(state1, function (state2, dueTime1) { + var isAdded = false, isDone = false, + d = scheduler[method].call(scheduler, state2, dueTime1, function (scheduler1, state3) { + if (isAdded) { + group.remove(d); + } else { + isDone = true; + } + recursiveAction(state3); + return disposableEmpty; + }); + if (!isDone) { + group.add(d); + isAdded = true; + } + }); + }; + recursiveAction(state); + return group; + } + + function invokeAction(scheduler, action) { + action(); + return disposableEmpty; + } + + var schedulerProto = Scheduler.prototype; + + /** + * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation. + * @param {Number} period Period for running the work periodically. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort). + */ + schedulerProto.schedulePeriodic = function (period, action) { + return this.schedulePeriodicWithState(null, period, function () { + action(); + }); + }; + + /** + * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation. + * @param {Mixed} state Initial state passed to the action upon the first iteration. + * @param {Number} period Period for running the work periodically. + * @param {Function} action Action to be executed, potentially updating the state. + * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort). + */ + schedulerProto.schedulePeriodicWithState = function (state, period, action) { + var s = state, id = setInterval(function () { + s = action(s); + }, period); + return disposableCreate(function () { + clearInterval(id); + }); + }; + + /** + * Schedules an action to be executed. + * @param {Function} action Action to execute. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.schedule = function (action) { + return this._schedule(action, invokeAction); + }; + + /** + * Schedules an action to be executed. + * @param state State passed to the action to be executed. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithState = function (state, action) { + return this._schedule(state, action); + }; + + /** + * Schedules an action to be executed after the specified relative due time. + * @param {Function} action Action to execute. + * @param {Number} dueTime Relative time after which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithRelative = function (dueTime, action) { + return this._scheduleRelative(action, dueTime, invokeAction); + }; + + /** + * Schedules an action to be executed after dueTime. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to be executed. + * @param {Number} dueTime Relative time after which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithRelativeAndState = function (state, dueTime, action) { + return this._scheduleRelative(state, dueTime, action); + }; + + /** + * Schedules an action to be executed at the specified absolute due time. + * @param {Function} action Action to execute. + * @param {Number} dueTime Absolute time at which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithAbsolute = function (dueTime, action) { + return this._scheduleAbsolute(action, dueTime, invokeAction); + }; + + /** + * Schedules an action to be executed at dueTime. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to be executed. + * @param {Number}dueTime Absolute time at which to execute the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleWithAbsoluteAndState = function (state, dueTime, action) { + return this._scheduleAbsolute(state, dueTime, action); + }; + + /** + * Schedules an action to be executed recursively. + * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursive = function (action) { + return this.scheduleRecursiveWithState(action, function (_action, self) { + _action(function () { + self(_action); + }); + }); + }; + + /** + * Schedules an action to be executed recursively. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithState = function (state, action) { + return this.scheduleWithState({ first: state, second: action }, function (s, p) { + return invokeRecImmediate(s, p); + }); + }; + + /** + * Schedules an action to be executed recursively after a specified relative due time. + * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified relative time. + * @param {Number}dueTime Relative time after which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithRelative = function (dueTime, action) { + return this.scheduleRecursiveWithRelativeAndState(action, dueTime, function (_action, self) { + _action(function (dt) { + self(_action, dt); + }); + }); + }; + + /** + * Schedules an action to be executed recursively after a specified relative due time. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state. + * @param {Number}dueTime Relative time after which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithRelativeAndState = function (state, dueTime, action) { + return this._scheduleRelative({ first: state, second: action }, dueTime, function (s, p) { + return invokeRecDate(s, p, 'scheduleWithRelativeAndState'); + }); + }; + + /** + * Schedules an action to be executed recursively at a specified absolute due time. + * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified absolute time. + * @param {Number}dueTime Absolute time at which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithAbsolute = function (dueTime, action) { + return this.scheduleRecursiveWithAbsoluteAndState(action, dueTime, function (_action, self) { + _action(function (dt) { + self(_action, dt); + }); + }); + }; + + /** + * Schedules an action to be executed recursively at a specified absolute due time. + * @param {Mixed} state State passed to the action to be executed. + * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state. + * @param {Number}dueTime Absolute time at which to execute the action for the first time. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + schedulerProto.scheduleRecursiveWithAbsoluteAndState = function (state, dueTime, action) { + return this._scheduleAbsolute({ first: state, second: action }, dueTime, function (s, p) { + return invokeRecDate(s, p, 'scheduleWithAbsoluteAndState'); + }); + }; + + /** Gets the current time according to the local machine's system clock. */ + Scheduler.now = defaultNow; + + /** + * Normalizes the specified TimeSpan value to a positive value. + * @param {Number} timeSpan The time span value to normalize. + * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0 + */ + Scheduler.normalize = function (timeSpan) { + if (timeSpan < 0) { + timeSpan = 0; + } + return timeSpan; + }; + + return Scheduler; + }()); + + var normalizeTime = Scheduler.normalize; + + /** + * Gets a scheduler that schedules work immediately on the current thread. + */ + var immediateScheduler = Scheduler.immediate = (function () { + + function scheduleNow(state, action) { return action(this, state); } + + function scheduleRelative(state, dueTime, action) { + var dt = normalizeTime(dt); + while (dt - this.now() > 0) { } + return action(this, state); + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); + } + + return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); + }()); + + /** + * Gets a scheduler that schedules work as soon as possible on the current thread. + */ + var currentThreadScheduler = Scheduler.currentThread = (function () { + var queue; + + function runTrampoline (q) { + var item; + while (q.length > 0) { + item = q.dequeue(); + if (!item.isCancelled()) { + // Note, do not schedule blocking work! + while (item.dueTime - Scheduler.now() > 0) { + } + if (!item.isCancelled()) { + item.invoke(); + } + } + } + } + + function scheduleNow(state, action) { + return this.scheduleWithRelativeAndState(state, 0, action); + } + + function scheduleRelative(state, dueTime, action) { + var dt = this.now() + Scheduler.normalize(dueTime), + si = new ScheduledItem(this, state, action, dt), + t; + if (!queue) { + queue = new PriorityQueue(4); + queue.enqueue(si); + try { + runTrampoline(queue); + } catch (e) { + throw e; + } finally { + queue = null; + } + } else { + queue.enqueue(si); + } + return si.disposable; + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); + } + + var currentScheduler = new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); + currentScheduler.scheduleRequired = function () { return queue === null; }; + currentScheduler.ensureTrampoline = function (action) { + if (queue === null) { + return this.schedule(action); + } else { + return action(); + } + }; + + return currentScheduler; + }()); + + var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () { + function tick(command, recurse) { + recurse(0, this._period); + try { + this._state = this._action(this._state); + } catch (e) { + this._cancel.dispose(); + throw e; + } + } + + function SchedulePeriodicRecursive(scheduler, state, period, action) { + this._scheduler = scheduler; + this._state = state; + this._period = period; + this._action = action; + } + + SchedulePeriodicRecursive.prototype.start = function () { + var d = new SingleAssignmentDisposable(); + this._cancel = d; + d.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0, this._period, tick.bind(this))); + + return d; + }; + + return SchedulePeriodicRecursive; + }()); + + + var scheduleMethod, clearMethod = noop; + (function () { + + var reNative = RegExp('^' + + String(toString) + .replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + .replace(/toString| for [^\]]+/g, '.*?') + '$' + ); + + var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' && + !reNative.test(setImmediate) && setImmediate, + clearImmediate = typeof (clearImmediate = freeGlobal && moduleExports && freeGlobal.clearImmediate) == 'function' && + !reNative.test(clearImmediate) && clearImmediate; + + function postMessageSupported () { + // Ensure not in a worker + if (!root.postMessage || root.importScripts) { return false; } + var isAsync = false, + oldHandler = root.onmessage; + // Test for async + root.onmessage = function () { isAsync = true; }; + root.postMessage('','*'); + root.onmessage = oldHandler; + + return isAsync; + } + + // Use in order, nextTick, setImmediate, postMessage, MessageChannel, script readystatechanged, setTimeout + if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') { + scheduleMethod = process.nextTick; + } else if (typeof setImmediate === 'function') { + scheduleMethod = setImmediate; + clearMethod = clearImmediate; + } else if (postMessageSupported()) { + var MSG_PREFIX = 'ms.rx.schedule' + Math.random(), + tasks = {}, + taskId = 0; + + function onGlobalPostMessage(event) { + // Only if we're a match to avoid any other global events + if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) { + var handleId = event.data.substring(MSG_PREFIX.length), + action = tasks[handleId]; + action(); + delete tasks[handleId]; + } + } + + if (root.addEventListener) { + root.addEventListener('message', onGlobalPostMessage, false); + } else { + root.attachEvent('onmessage', onGlobalPostMessage, false); + } + + scheduleMethod = function (action) { + var currentId = taskId++; + tasks[currentId] = action; + root.postMessage(MSG_PREFIX + currentId, '*'); + }; + } else if (!!root.MessageChannel) { + var channel = new root.MessageChannel(), + channelTasks = {}, + channelTaskId = 0; + + channel.port1.onmessage = function (event) { + var id = event.data, + action = channelTasks[id]; + action(); + delete channelTasks[id]; + }; + + scheduleMethod = function (action) { + var id = channelTaskId++; + channelTasks[id] = action; + channel.port2.postMessage(id); + }; + } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) { + + scheduleMethod = function (action) { + var scriptElement = root.document.createElement('script'); + scriptElement.onreadystatechange = function () { + action(); + scriptElement.onreadystatechange = null; + scriptElement.parentNode.removeChild(scriptElement); + scriptElement = null; + }; + root.document.documentElement.appendChild(scriptElement); + }; + + } else { + scheduleMethod = function (action) { return setTimeout(action, 0); }; + clearMethod = clearTimeout; + } + }()); + + /** + * Gets a scheduler that schedules work via a timed callback based upon platform. + */ + var timeoutScheduler = Scheduler.timeout = (function () { + + function scheduleNow(state, action) { + var scheduler = this, + disposable = new SingleAssignmentDisposable(); + var id = scheduleMethod(function () { + if (!disposable.isDisposed) { + disposable.setDisposable(action(scheduler, state)); + } + }); + return new CompositeDisposable(disposable, disposableCreate(function () { + clearMethod(id); + })); + } + + function scheduleRelative(state, dueTime, action) { + var scheduler = this, + dt = Scheduler.normalize(dueTime); + if (dt === 0) { + return scheduler.scheduleWithState(state, action); + } + var disposable = new SingleAssignmentDisposable(); + var id = setTimeout(function () { + if (!disposable.isDisposed) { + disposable.setDisposable(action(scheduler, state)); + } + }, dt); + return new CompositeDisposable(disposable, disposableCreate(function () { + clearTimeout(id); + })); + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); + } + + return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); + })(); + + /** + * Represents a notification to an observer. + */ + var Notification = Rx.Notification = (function () { + function Notification(kind, hasValue) { + this.hasValue = hasValue == null ? false : hasValue; + this.kind = kind; + } + + var NotificationPrototype = Notification.prototype; + + /** + * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result. + * + * @memberOf Notification + * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on.. + * @param {Function} onError Delegate to invoke for an OnError notification. + * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification. + * @returns {Any} Result produced by the observation. + */ + NotificationPrototype.accept = function (observerOrOnNext, onError, onCompleted) { + if (arguments.length === 1 && typeof observerOrOnNext === 'object') { + return this._acceptObservable(observerOrOnNext); + } + return this._accept(observerOrOnNext, onError, onCompleted); + }; + + /** + * Returns an observable sequence with a single notification. + * + * @memberOf Notification + * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on. + * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription. + */ + NotificationPrototype.toObservable = function (scheduler) { + var notification = this; + scheduler || (scheduler = immediateScheduler); + return new AnonymousObservable(function (observer) { + return scheduler.schedule(function () { + notification._acceptObservable(observer); + if (notification.kind === 'N') { + observer.onCompleted(); + } + }); + }); + }; + + return Notification; + })(); + + /** + * Creates an object that represents an OnNext notification to an observer. + * @param {Any} value The value contained in the notification. + * @returns {Notification} The OnNext notification containing the value. + */ + var notificationCreateOnNext = Notification.createOnNext = (function () { + + function _accept (onNext) { + return onNext(this.value); + } + + function _acceptObservable(observer) { + return observer.onNext(this.value); + } + + function toString () { + return 'OnNext(' + this.value + ')'; + } + + return function (value) { + var notification = new Notification('N', true); + notification.value = value; + notification._accept = _accept; + notification._acceptObservable = _acceptObservable; + notification.toString = toString; + return notification; + }; + }()); + + /** + * Creates an object that represents an OnError notification to an observer. + * @param {Any} error The exception contained in the notification. + * @returns {Notification} The OnError notification containing the exception. + */ + var notificationCreateOnError = Notification.createOnError = (function () { + + function _accept (onNext, onError) { + return onError(this.exception); + } + + function _acceptObservable(observer) { + return observer.onError(this.exception); + } + + function toString () { + return 'OnError(' + this.exception + ')'; + } + + return function (exception) { + var notification = new Notification('E'); + notification.exception = exception; + notification._accept = _accept; + notification._acceptObservable = _acceptObservable; + notification.toString = toString; + return notification; + }; + }()); + + /** + * Creates an object that represents an OnCompleted notification to an observer. + * @returns {Notification} The OnCompleted notification. + */ + var notificationCreateOnCompleted = Notification.createOnCompleted = (function () { + + function _accept (onNext, onError, onCompleted) { + return onCompleted(); + } + + function _acceptObservable(observer) { + return observer.onCompleted(); + } + + function toString () { + return 'OnCompleted()'; + } + + return function () { + var notification = new Notification('C'); + notification._accept = _accept; + notification._acceptObservable = _acceptObservable; + notification.toString = toString; + return notification; + }; + }()); + + var Enumerator = Rx.internals.Enumerator = function (next) { + this._next = next; + }; + + Enumerator.prototype.next = function () { + return this._next(); + }; + + Enumerator.prototype[$iterator$] = function () { return this; } + + var Enumerable = Rx.internals.Enumerable = function (iterator) { + this._iterator = iterator; + }; + + Enumerable.prototype[$iterator$] = function () { + return this._iterator(); + }; + + Enumerable.prototype.concat = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var e; + try { + e = sources[$iterator$](); + } catch(err) { + observer.onError(); + return; + } + + var isDisposed, + subscription = new SerialDisposable(); + var cancelable = immediateScheduler.scheduleRecursive(function (self) { + var currentItem; + if (isDisposed) { return; } + + try { + currentItem = e.next(); + } catch (ex) { + observer.onError(ex); + return; + } + + if (currentItem.done) { + observer.onCompleted(); + return; + } + + // Check if promise + var currentValue = currentItem.value; + isPromise(currentValue) && (currentValue = observableFromPromise(currentValue)); + + var d = new SingleAssignmentDisposable(); + subscription.setDisposable(d); + d.setDisposable(currentValue.subscribe( + observer.onNext.bind(observer), + observer.onError.bind(observer), + function () { self(); }) + ); + }); + + return new CompositeDisposable(subscription, cancelable, disposableCreate(function () { + isDisposed = true; + })); + }); + }; + + Enumerable.prototype.catchException = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var e; + try { + e = sources[$iterator$](); + } catch(err) { + observer.onError(); + return; + } + + var isDisposed, + lastException, + subscription = new SerialDisposable(); + var cancelable = immediateScheduler.scheduleRecursive(function (self) { + if (isDisposed) { return; } + + var currentItem; + try { + currentItem = e.next(); + } catch (ex) { + observer.onError(ex); + return; + } + + if (currentItem.done) { + if (lastException) { + observer.onError(lastException); + } else { + observer.onCompleted(); + } + return; + } + + // Check if promise + var currentValue = currentItem.value; + isPromise(currentValue) && (currentValue = observableFromPromise(currentValue)); + + var d = new SingleAssignmentDisposable(); + subscription.setDisposable(d); + d.setDisposable(currentValue.subscribe( + observer.onNext.bind(observer), + function (exn) { + lastException = exn; + self(); + }, + observer.onCompleted.bind(observer))); + }); + return new CompositeDisposable(subscription, cancelable, disposableCreate(function () { + isDisposed = true; + })); + }); + }; + + var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) { + if (repeatCount == null) { repeatCount = -1; } + return new Enumerable(function () { + var left = repeatCount; + return new Enumerator(function () { + if (left === 0) { return doneEnumerator; } + if (left > 0) { left--; } + return { done: false, value: value }; + }); + }); + }; + + var enumerableFor = Enumerable.forEach = function (source, selector, thisArg) { + selector || (selector = identity); + return new Enumerable(function () { + var index = -1; + return new Enumerator( + function () { + return ++index < source.length ? + { done: false, value: selector.call(thisArg, source[index], index, source) } : + doneEnumerator; + }); + }); + }; + + /** + * Supports push-style iteration over an observable sequence. + */ + var Observer = Rx.Observer = function () { }; + + /** + * Creates a notification callback from an observer. + * + * @param observer Observer object. + * @returns The action that forwards its input notification to the underlying observer. + */ + Observer.prototype.toNotifier = function () { + var observer = this; + return function (n) { + return n.accept(observer); + }; + }; + + /** + * Hides the identity of an observer. + + * @returns An observer that hides the identity of the specified observer. + */ + Observer.prototype.asObserver = function () { + return new AnonymousObserver(this.onNext.bind(this), this.onError.bind(this), this.onCompleted.bind(this)); + }; + + /** + * Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions. + * + * @static + * @memberOf Observer + * @param {Function} [onNext] Observer's OnNext action implementation. + * @param {Function} [onError] Observer's OnError action implementation. + * @param {Function} [onCompleted] Observer's OnCompleted action implementation. + * @returns {Observer} The observer object implemented using the given actions. + */ + var observerCreate = Observer.create = function (onNext, onError, onCompleted) { + onNext || (onNext = noop); + onError || (onError = defaultError); + onCompleted || (onCompleted = noop); + return new AnonymousObserver(onNext, onError, onCompleted); + }; + + /** + * Creates an observer from a notification callback. + * + * @static + * @memberOf Observer + * @param {Function} handler Action that handles a notification. + * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives. + */ + Observer.fromNotifier = function (handler) { + return new AnonymousObserver(function (x) { + return handler(notificationCreateOnNext(x)); + }, function (exception) { + return handler(notificationCreateOnError(exception)); + }, function () { + return handler(notificationCreateOnCompleted()); + }); + }; + + /** + * Abstract base class for implementations of the Observer class. + * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages. + */ + var AbstractObserver = Rx.internals.AbstractObserver = (function (_super) { + inherits(AbstractObserver, _super); + + /** + * Creates a new observer in a non-stopped state. + * + * @constructor + */ + function AbstractObserver() { + this.isStopped = false; + _super.call(this); + } + + /** + * Notifies the observer of a new element in the sequence. + * + * @memberOf AbstractObserver + * @param {Any} value Next element in the sequence. + */ + AbstractObserver.prototype.onNext = function (value) { + if (!this.isStopped) { + this.next(value); + } + }; + + /** + * Notifies the observer that an exception has occurred. + * + * @memberOf AbstractObserver + * @param {Any} error The error that has occurred. + */ + AbstractObserver.prototype.onError = function (error) { + if (!this.isStopped) { + this.isStopped = true; + this.error(error); + } + }; + + /** + * Notifies the observer of the end of the sequence. + */ + AbstractObserver.prototype.onCompleted = function () { + if (!this.isStopped) { + this.isStopped = true; + this.completed(); + } + }; + + /** + * Disposes the observer, causing it to transition to the stopped state. + */ + AbstractObserver.prototype.dispose = function () { + this.isStopped = true; + }; + + AbstractObserver.prototype.fail = function (e) { + if (!this.isStopped) { + this.isStopped = true; + this.error(e); + return true; + } + + return false; + }; + + return AbstractObserver; + }(Observer)); + + /** + * Class to create an Observer instance from delegate-based implementations of the on* methods. + */ + var AnonymousObserver = Rx.AnonymousObserver = (function (_super) { + inherits(AnonymousObserver, _super); + + /** + * Creates an observer from the specified OnNext, OnError, and OnCompleted actions. + * @param {Any} onNext Observer's OnNext action implementation. + * @param {Any} onError Observer's OnError action implementation. + * @param {Any} onCompleted Observer's OnCompleted action implementation. + */ + function AnonymousObserver(onNext, onError, onCompleted) { + _super.call(this); + this._onNext = onNext; + this._onError = onError; + this._onCompleted = onCompleted; + } + + /** + * Calls the onNext action. + * @param {Any} value Next element in the sequence. + */ + AnonymousObserver.prototype.next = function (value) { + this._onNext(value); + }; + + /** + * Calls the onError action. + * @param {Any} error The error that has occurred. + */ + AnonymousObserver.prototype.error = function (exception) { + this._onError(exception); + }; + + /** + * Calls the onCompleted action. + */ + AnonymousObserver.prototype.completed = function () { + this._onCompleted(); + }; + + return AnonymousObserver; + }(AbstractObserver)); + + var observableProto; + + /** + * Represents a push-style collection. + */ + var Observable = Rx.Observable = (function () { + + function Observable(subscribe) { + this._subscribe = subscribe; + } + + observableProto = Observable.prototype; + + /** + * Subscribes an observer to the observable sequence. + * + * @example + * 1 - source.subscribe(); + * 2 - source.subscribe(observer); + * 3 - source.subscribe(function (x) { console.log(x); }); + * 4 - source.subscribe(function (x) { console.log(x); }, function (err) { console.log(err); }); + * 5 - source.subscribe(function (x) { console.log(x); }, function (err) { console.log(err); }, function () { console.log('done'); }); + * @param {Mixed} [observerOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence. + * @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence. + * @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence. + * @returns {Diposable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler. + */ + observableProto.subscribe = observableProto.forEach = function (observerOrOnNext, onError, onCompleted) { + var subscriber = typeof observerOrOnNext === 'object' ? + observerOrOnNext : + observerCreate(observerOrOnNext, onError, onCompleted); + + return this._subscribe(subscriber); + }; + + return Observable; + })(); + + var ScheduledObserver = Rx.internals.ScheduledObserver = (function (_super) { + inherits(ScheduledObserver, _super); + + function ScheduledObserver(scheduler, observer) { + _super.call(this); + this.scheduler = scheduler; + this.observer = observer; + this.isAcquired = false; + this.hasFaulted = false; + this.queue = []; + this.disposable = new SerialDisposable(); + } + + ScheduledObserver.prototype.next = function (value) { + var self = this; + this.queue.push(function () { + self.observer.onNext(value); + }); + }; + + ScheduledObserver.prototype.error = function (exception) { + var self = this; + this.queue.push(function () { + self.observer.onError(exception); + }); + }; + + ScheduledObserver.prototype.completed = function () { + var self = this; + this.queue.push(function () { + self.observer.onCompleted(); + }); + }; + + ScheduledObserver.prototype.ensureActive = function () { + var isOwner = false, parent = this; + if (!this.hasFaulted && this.queue.length > 0) { + isOwner = !this.isAcquired; + this.isAcquired = true; + } + if (isOwner) { + this.disposable.setDisposable(this.scheduler.scheduleRecursive(function (self) { + var work; + if (parent.queue.length > 0) { + work = parent.queue.shift(); + } else { + parent.isAcquired = false; + return; + } + try { + work(); + } catch (ex) { + parent.queue = []; + parent.hasFaulted = true; + throw ex; + } + self(); + })); + } + }; + + ScheduledObserver.prototype.dispose = function () { + _super.prototype.dispose.call(this); + this.disposable.dispose(); + }; + + return ScheduledObserver; + }(AbstractObserver)); + + /** + * Creates a list from an observable sequence. + * @returns An observable sequence containing a single element with a list containing all the elements of the source sequence. + */ + observableProto.toArray = function () { + var self = this; + return new AnonymousObservable(function(observer) { + var arr = []; + return self.subscribe( + arr.push.bind(arr), + observer.onError.bind(observer), + function () { + observer.onNext(arr); + observer.onCompleted(); + }); + }); + }; + + /** + * Creates an observable sequence from a specified subscribe method implementation. + * + * @example + * var res = Rx.Observable.create(function (observer) { return function () { } ); + * var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } ); + * var res = Rx.Observable.create(function (observer) { } ); + * + * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable. + * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method. + */ + Observable.create = Observable.createWithDisposable = function (subscribe) { + return new AnonymousObservable(subscribe); + }; + + /** + * Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes. + * + * @example + * var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); }); + * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise. + * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function. + */ + var observableDefer = Observable.defer = function (observableFactory) { + return new AnonymousObservable(function (observer) { + var result; + try { + result = observableFactory(); + } catch (e) { + return observableThrow(e).subscribe(observer); + } + isPromise(result) && (result = observableFromPromise(result)); + return result.subscribe(observer); + }); + }; + + /** + * Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message. + * + * @example + * var res = Rx.Observable.empty(); + * var res = Rx.Observable.empty(Rx.Scheduler.timeout); + * @param {Scheduler} [scheduler] Scheduler to send the termination call on. + * @returns {Observable} An observable sequence with no elements. + */ + var observableEmpty = Observable.empty = function (scheduler) { + scheduler || (scheduler = immediateScheduler); + return new AnonymousObservable(function (observer) { + return scheduler.schedule(function () { + observer.onCompleted(); + }); + }); + }; + + /** + * Converts an array to an observable sequence, using an optional scheduler to enumerate the array. + * + * @example + * var res = Rx.Observable.fromArray([1,2,3]); + * var res = Rx.Observable.fromArray([1,2,3], Rx.Scheduler.timeout); + * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on. + * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence. + */ + var observableFromArray = Observable.fromArray = function (array, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + return new AnonymousObservable(function (observer) { + var count = 0, len = array.length; + return scheduler.scheduleRecursive(function (self) { + if (count < len) { + observer.onNext(array[count++]); + self(); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * Converts an iterable into an Observable sequence + * + * @example + * var res = Rx.Observable.fromIterable(new Map()); + * var res = Rx.Observable.fromIterable(new Set(), Rx.Scheduler.timeout); + * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on. + * @returns {Observable} The observable sequence whose elements are pulled from the given generator sequence. + */ + Observable.fromIterable = function (iterable, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + return new AnonymousObservable(function (observer) { + var iterator; + try { + iterator = iterable[$iterator$](); + } catch (e) { + observer.onError(e); + return; + } + + return scheduler.scheduleRecursive(function (self) { + var next; + try { + next = iterator.next(); + } catch (err) { + observer.onError(err); + return; + } + + if (next.done) { + observer.onCompleted(); + } else { + observer.onNext(next.value); + self(); + } + }); + }); + }; + + /** + * Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages. + * + * @example + * var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }); + * var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout); + * @param {Mixed} initialState Initial state. + * @param {Function} condition Condition to terminate generation (upon returning false). + * @param {Function} iterate Iteration step function. + * @param {Function} resultSelector Selector function for results produced in the sequence. + * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread. + * @returns {Observable} The generated sequence. + */ + Observable.generate = function (initialState, condition, iterate, resultSelector, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + return new AnonymousObservable(function (observer) { + var first = true, state = initialState; + return scheduler.scheduleRecursive(function (self) { + var hasResult, result; + try { + if (first) { + first = false; + } else { + state = iterate(state); + } + hasResult = condition(state); + if (hasResult) { + result = resultSelector(state); + } + } catch (exception) { + observer.onError(exception); + return; + } + if (hasResult) { + observer.onNext(result); + self(); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins). + * @returns {Observable} An observable sequence whose observers will never get called. + */ + var observableNever = Observable.never = function () { + return new AnonymousObservable(function () { + return disposableEmpty; + }); + }; + + /** + * This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments. + * @example + * var res = Rx.Observable.of(1,2,3); + * @returns {Observable} The observable sequence whose elements are pulled from the given arguments. + */ + Observable.of = function () { + var len = arguments.length, args = new Array(len); + for(var i = 0; i < len; i++) { args[i] = arguments[i]; } + return observableFromArray(args); + }; + + /** + * This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments. + * @example + * var res = Rx.Observable.of(1,2,3); + * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments. + * @returns {Observable} The observable sequence whose elements are pulled from the given arguments. + */ + var observableOf = Observable.ofWithScheduler = function (scheduler) { + var len = arguments.length - 1, args = new Array(len); + for(var i = 0; i < len; i++) { args[i] = arguments[i + 1]; } + return observableFromArray(args, scheduler); + }; + + /** + * Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages. + * + * @example + * var res = Rx.Observable.range(0, 10); + * var res = Rx.Observable.range(0, 10, Rx.Scheduler.timeout); + * @param {Number} start The value of the first integer in the sequence. + * @param {Number} count The number of sequential integers to generate. + * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread. + * @returns {Observable} An observable sequence that contains a range of sequential integral numbers. + */ + Observable.range = function (start, count, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + return new AnonymousObservable(function (observer) { + return scheduler.scheduleRecursiveWithState(0, function (i, self) { + if (i < count) { + observer.onNext(start + i); + self(i + 1); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages. + * + * @example + * var res = Rx.Observable.repeat(42); + * var res = Rx.Observable.repeat(42, 4); + * 3 - res = Rx.Observable.repeat(42, 4, Rx.Scheduler.timeout); + * 4 - res = Rx.Observable.repeat(42, null, Rx.Scheduler.timeout); + * @param {Mixed} value Element to repeat. + * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely. + * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate. + * @returns {Observable} An observable sequence that repeats the given element the specified number of times. + */ + Observable.repeat = function (value, repeatCount, scheduler) { + scheduler || (scheduler = currentThreadScheduler); + if (repeatCount == null) { + repeatCount = -1; + } + return observableReturn(value, scheduler).repeat(repeatCount); + }; + + /** + * Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages. + * There is an alias called 'just', and 'returnValue' for browsers 0) { + s = q.shift(); + subscribe(s); + } else { + activeCount--; + if (isStopped && activeCount === 0) { + observer.onCompleted(); + } + } + })); + }; + group.add(sources.subscribe(function (innerSource) { + if (activeCount < maxConcurrentOrOther) { + activeCount++; + subscribe(innerSource); + } else { + q.push(innerSource); + } + }, observer.onError.bind(observer), function () { + isStopped = true; + if (activeCount === 0) { + observer.onCompleted(); + } + })); + return group; + }); + }; + + /** + * Merges all the observable sequences into a single observable sequence. + * The scheduler is optional and if not specified, the immediate scheduler is used. + * + * @example + * 1 - merged = Rx.Observable.merge(xs, ys, zs); + * 2 - merged = Rx.Observable.merge([xs, ys, zs]); + * 3 - merged = Rx.Observable.merge(scheduler, xs, ys, zs); + * 4 - merged = Rx.Observable.merge(scheduler, [xs, ys, zs]); + * @returns {Observable} The observable sequence that merges the elements of the observable sequences. + */ + var observableMerge = Observable.merge = function () { + var scheduler, sources; + if (!arguments[0]) { + scheduler = immediateScheduler; + sources = slice.call(arguments, 1); + } else if (arguments[0].now) { + scheduler = arguments[0]; + sources = slice.call(arguments, 1); + } else { + scheduler = immediateScheduler; + sources = slice.call(arguments, 0); + } + if (Array.isArray(sources[0])) { + sources = sources[0]; + } + return observableFromArray(sources, scheduler).mergeObservable(); + }; + + /** + * Merges an observable sequence of observable sequences into an observable sequence. + * @returns {Observable} The observable sequence that merges the elements of the inner sequences. + */ + observableProto.mergeObservable = observableProto.mergeAll =function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var group = new CompositeDisposable(), + isStopped = false, + m = new SingleAssignmentDisposable(); + + group.add(m); + m.setDisposable(sources.subscribe(function (innerSource) { + var innerSubscription = new SingleAssignmentDisposable(); + group.add(innerSubscription); + + // Check if Promise or Observable + if (isPromise(innerSource)) { + innerSource = observableFromPromise(innerSource); + } + + innerSubscription.setDisposable(innerSource.subscribe(function (x) { + observer.onNext(x); + }, observer.onError.bind(observer), function () { + group.remove(innerSubscription); + if (isStopped && group.length === 1) { observer.onCompleted(); } + })); + }, observer.onError.bind(observer), function () { + isStopped = true; + if (group.length === 1) { observer.onCompleted(); } + })); + return group; + }); + }; + + /** + * Returns the values from the source observable sequence only after the other observable sequence produces a value. + * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence. + * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation. + */ + observableProto.skipUntil = function (other) { + var source = this; + return new AnonymousObservable(function (observer) { + var isOpen = false; + var disposables = new CompositeDisposable(source.subscribe(function (left) { + isOpen && observer.onNext(left); + }, observer.onError.bind(observer), function () { + isOpen && observer.onCompleted(); + })); + + isPromise(other) && (other = observableFromPromise(other)); + + var rightSubscription = new SingleAssignmentDisposable(); + disposables.add(rightSubscription); + rightSubscription.setDisposable(other.subscribe(function () { + isOpen = true; + rightSubscription.dispose(); + }, observer.onError.bind(observer), function () { + rightSubscription.dispose(); + })); + + return disposables; + }); + }; + + /** + * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence. + * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received. + */ + observableProto['switch'] = observableProto.switchLatest = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var hasLatest = false, + innerSubscription = new SerialDisposable(), + isStopped = false, + latest = 0, + subscription = sources.subscribe(function (innerSource) { + var d = new SingleAssignmentDisposable(), id = ++latest; + hasLatest = true; + innerSubscription.setDisposable(d); + + // Check if Promise or Observable + if (isPromise(innerSource)) { + innerSource = observableFromPromise(innerSource); + } + + d.setDisposable(innerSource.subscribe(function (x) { + if (latest === id) { + observer.onNext(x); + } + }, function (e) { + if (latest === id) { + observer.onError(e); + } + }, function () { + if (latest === id) { + hasLatest = false; + if (isStopped) { + observer.onCompleted(); + } + } + })); + }, observer.onError.bind(observer), function () { + isStopped = true; + if (!hasLatest) { + observer.onCompleted(); + } + }); + return new CompositeDisposable(subscription, innerSubscription); + }); + }; + + /** + * Returns the values from the source observable sequence until the other observable sequence produces a value. + * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence. + * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation. + */ + observableProto.takeUntil = function (other) { + var source = this; + return new AnonymousObservable(function (observer) { + isPromise(other) && (other = observableFromPromise(other)); + return new CompositeDisposable( + source.subscribe(observer), + other.subscribe(observer.onCompleted.bind(observer), observer.onError.bind(observer), noop) + ); + }); + }; + + function zipArray(second, resultSelector) { + var first = this; + return new AnonymousObservable(function (observer) { + var index = 0, len = second.length; + return first.subscribe(function (left) { + if (index < len) { + var right = second[index++], result; + try { + result = resultSelector(left, right); + } catch (e) { + observer.onError(e); + return; + } + observer.onNext(result); + } else { + observer.onCompleted(); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + } + + /** + * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index. + * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the sources. + * + * @example + * 1 - res = obs1.zip(obs2, fn); + * 1 - res = x1.zip([1,2,3], fn); + * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + observableProto.zip = function () { + if (Array.isArray(arguments[0])) { + return zipArray.apply(this, arguments); + } + var parent = this, sources = slice.call(arguments), resultSelector = sources.pop(); + sources.unshift(parent); + return new AnonymousObservable(function (observer) { + var n = sources.length, + queues = arrayInitialize(n, function () { return []; }), + isDone = arrayInitialize(n, function () { return false; }); + + function next(i) { + var res, queuedValues; + if (queues.every(function (x) { return x.length > 0; })) { + try { + queuedValues = queues.map(function (x) { return x.shift(); }); + res = resultSelector.apply(parent, queuedValues); + } catch (ex) { + observer.onError(ex); + return; + } + observer.onNext(res); + } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) { + observer.onCompleted(); + } + }; + + function done(i) { + isDone[i] = true; + if (isDone.every(function (x) { return x; })) { + observer.onCompleted(); + } + } + + var subscriptions = new Array(n); + for (var idx = 0; idx < n; idx++) { + (function (i) { + var source = sources[i], sad = new SingleAssignmentDisposable(); + isPromise(source) && (source = observableFromPromise(source)); + sad.setDisposable(source.subscribe(function (x) { + queues[i].push(x); + next(i); + }, observer.onError.bind(observer), function () { + done(i); + })); + subscriptions[i] = sad; + })(idx); + } + + return new CompositeDisposable(subscriptions); + }); + }; + /** + * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. + * @param arguments Observable sources. + * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources. + * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + Observable.zip = function () { + var args = slice.call(arguments, 0), + first = args.shift(); + return first.zip.apply(first, args); + }; + + /** + * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes. + * @param arguments Observable sources. + * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes. + */ + Observable.zipArray = function () { + var sources = argsOrArray(arguments, 0); + return new AnonymousObservable(function (observer) { + var n = sources.length, + queues = arrayInitialize(n, function () { return []; }), + isDone = arrayInitialize(n, function () { return false; }); + + function next(i) { + if (queues.every(function (x) { return x.length > 0; })) { + var res = queues.map(function (x) { return x.shift(); }); + observer.onNext(res); + } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) { + observer.onCompleted(); + return; + } + }; + + function done(i) { + isDone[i] = true; + if (isDone.every(identity)) { + observer.onCompleted(); + return; + } + } + + var subscriptions = new Array(n); + for (var idx = 0; idx < n; idx++) { + (function (i) { + subscriptions[i] = new SingleAssignmentDisposable(); + subscriptions[i].setDisposable(sources[i].subscribe(function (x) { + queues[i].push(x); + next(i); + }, observer.onError.bind(observer), function () { + done(i); + })); + })(idx); + } + + var compositeDisposable = new CompositeDisposable(subscriptions); + compositeDisposable.add(disposableCreate(function () { + for (var qIdx = 0, qLen = queues.length; qIdx < qLen; qIdx++) { + queues[qIdx] = []; + } + })); + return compositeDisposable; + }); + }; + + /** + * Hides the identity of an observable sequence. + * @returns {Observable} An observable sequence that hides the identity of the source sequence. + */ + observableProto.asObservable = function () { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(observer); + }); + }; + + /** + * Dematerializes the explicit notification values of an observable sequence as implicit notifications. + * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values. + */ + observableProto.dematerialize = function () { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(function (x) { + return x.accept(observer); + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer. + * + * var obs = observable.distinctUntilChanged(); + * var obs = observable.distinctUntilChanged(function (x) { return x.id; }); + * var obs = observable.distinctUntilChanged(function (x) { return x.id; }, function (x, y) { return x === y; }); + * + * @param {Function} [keySelector] A function to compute the comparison key for each element. If not provided, it projects the value. + * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function. + * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence. + */ + observableProto.distinctUntilChanged = function (keySelector, comparer) { + var source = this; + keySelector || (keySelector = identity); + comparer || (comparer = defaultComparer); + return new AnonymousObservable(function (observer) { + var hasCurrentKey = false, currentKey; + return source.subscribe(function (value) { + var comparerEquals = false, key; + try { + key = keySelector(value); + } catch (exception) { + observer.onError(exception); + return; + } + if (hasCurrentKey) { + try { + comparerEquals = comparer(currentKey, key); + } catch (exception) { + observer.onError(exception); + return; + } + } + if (!hasCurrentKey || !comparerEquals) { + hasCurrentKey = true; + currentKey = key; + observer.onNext(value); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence. + * This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline. + * + * @example + * var res = observable.doAction(observer); + * var res = observable.doAction(onNext); + * var res = observable.doAction(onNext, onError); + * var res = observable.doAction(onNext, onError, onCompleted); + * @param {Mixed} observerOrOnNext Action to invoke for each element in the observable sequence or an observer. + * @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function. + * @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function. + * @returns {Observable} The source sequence with the side-effecting behavior applied. + */ + observableProto['do'] = observableProto.doAction = function (observerOrOnNext, onError, onCompleted) { + var source = this, onNextFunc; + if (typeof observerOrOnNext === 'function') { + onNextFunc = observerOrOnNext; + } else { + onNextFunc = observerOrOnNext.onNext.bind(observerOrOnNext); + onError = observerOrOnNext.onError.bind(observerOrOnNext); + onCompleted = observerOrOnNext.onCompleted.bind(observerOrOnNext); + } + return new AnonymousObservable(function (observer) { + return source.subscribe(function (x) { + try { + onNextFunc(x); + } catch (e) { + observer.onError(e); + } + observer.onNext(x); + }, function (exception) { + if (!onError) { + observer.onError(exception); + } else { + try { + onError(exception); + } catch (e) { + observer.onError(e); + } + observer.onError(exception); + } + }, function () { + if (!onCompleted) { + observer.onCompleted(); + } else { + try { + onCompleted(); + } catch (e) { + observer.onError(e); + } + observer.onCompleted(); + } + }); + }); + }; + + /** + * Invokes a specified action after the source observable sequence terminates gracefully or exceptionally. + * + * @example + * var res = observable.finallyAction(function () { console.log('sequence ended'; }); + * @param {Function} finallyAction Action to invoke after the source observable sequence terminates. + * @returns {Observable} Source sequence with the action-invoking termination behavior applied. + */ + observableProto['finally'] = observableProto.finallyAction = function (action) { + var source = this; + return new AnonymousObservable(function (observer) { + var subscription; + try { + subscription = source.subscribe(observer); + } catch (e) { + action(); + throw e; + } + return disposableCreate(function () { + try { + subscription.dispose(); + } catch (e) { + throw e; + } finally { + action(); + } + }); + }); + }; + + /** + * Ignores all elements in an observable sequence leaving only the termination messages. + * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence. + */ + observableProto.ignoreElements = function () { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(noop, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Materializes the implicit notifications of an observable sequence as explicit notification values. + * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence. + */ + observableProto.materialize = function () { + var source = this; + return new AnonymousObservable(function (observer) { + return source.subscribe(function (value) { + observer.onNext(notificationCreateOnNext(value)); + }, function (e) { + observer.onNext(notificationCreateOnError(e)); + observer.onCompleted(); + }, function () { + observer.onNext(notificationCreateOnCompleted()); + observer.onCompleted(); + }); + }); + }; + + /** + * Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely. + * + * @example + * var res = repeated = source.repeat(); + * var res = repeated = source.repeat(42); + * @param {Number} [repeatCount] Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely. + * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly. + */ + observableProto.repeat = function (repeatCount) { + return enumerableRepeat(this, repeatCount).concat(); + }; + + /** + * Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely. + * + * @example + * var res = retried = retry.repeat(); + * var res = retried = retry.repeat(42); + * @param {Number} [retryCount] Number of times to retry the sequence. If not provided, retry the sequence indefinitely. + * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully. + */ + observableProto.retry = function (retryCount) { + return enumerableRepeat(this, retryCount).catchException(); + }; + + /** + * Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value. + * For aggregation behavior with no intermediate results, see Observable.aggregate. + * @example + * var res = source.scan(function (acc, x) { return acc + x; }); + * var res = source.scan(0, function (acc, x) { return acc + x; }); + * @param {Mixed} [seed] The initial accumulator value. + * @param {Function} accumulator An accumulator function to be invoked on each element. + * @returns {Observable} An observable sequence containing the accumulated values. + */ + observableProto.scan = function () { + var hasSeed = false, seed, accumulator, source = this; + if (arguments.length === 2) { + hasSeed = true; + seed = arguments[0]; + accumulator = arguments[1]; + } else { + accumulator = arguments[0]; + } + return new AnonymousObservable(function (observer) { + var hasAccumulation, accumulation, hasValue; + return source.subscribe ( + function (x) { + try { + if (!hasValue) { + hasValue = true; + } + + if (hasAccumulation) { + accumulation = accumulator(accumulation, x); + } else { + accumulation = hasSeed ? accumulator(seed, x) : x; + hasAccumulation = true; + } + } catch (e) { + observer.onError(e); + return; + } + + observer.onNext(accumulation); + }, + observer.onError.bind(observer), + function () { + if (!hasValue && hasSeed) { + observer.onNext(seed); + } + observer.onCompleted(); + } + ); + }); + }; + + /** + * Bypasses a specified number of elements at the end of an observable sequence. + * @description + * This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are + * received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed. + * @param count Number of elements to bypass at the end of the source sequence. + * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end. + */ + observableProto.skipLast = function (count) { + var source = this; + return new AnonymousObservable(function (observer) { + var q = []; + return source.subscribe(function (x) { + q.push(x); + if (q.length > count) { + observer.onNext(q.shift()); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend. + * + * var res = source.startWith(1, 2, 3); + * var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3); + * + * @memberOf Observable# + * @returns {Observable} The source sequence prepended with the specified values. + */ + observableProto.startWith = function () { + var values, scheduler, start = 0; + if (!!arguments.length && 'now' in Object(arguments[0])) { + scheduler = arguments[0]; + start = 1; + } else { + scheduler = immediateScheduler; + } + values = slice.call(arguments, start); + return enumerableFor([observableFromArray(values, scheduler), this]).concat(); + }; + + /** + * Returns a specified number of contiguous elements from the end of an observable sequence, using an optional scheduler to drain the queue. + * + * @example + * var res = source.takeLast(5); + * var res = source.takeLast(5, Rx.Scheduler.timeout); + * + * @description + * This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of + * the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed. + * @param {Number} count Number of elements to take from the end of the source sequence. + * @param {Scheduler} [scheduler] Scheduler used to drain the queue upon completion of the source sequence. + * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence. + */ + observableProto.takeLast = function (count, scheduler) { + return this.takeLastBuffer(count).selectMany(function (xs) { return observableFromArray(xs, scheduler); }); + }; + + /** + * Returns an array with the specified number of contiguous elements from the end of an observable sequence. + * + * @description + * This operator accumulates a buffer with a length enough to store count elements. Upon completion of the + * source sequence, this buffer is produced on the result sequence. + * @param {Number} count Number of elements to take from the end of the source sequence. + * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence. + */ + observableProto.takeLastBuffer = function (count) { + var source = this; + return new AnonymousObservable(function (observer) { + var q = []; + return source.subscribe(function (x) { + q.push(x); + if (q.length > count) { + q.shift(); + } + }, observer.onError.bind(observer), function () { + observer.onNext(q); + observer.onCompleted(); + }); + }); + }; + + function concatMap(selector) { + return this.map(function (x, i) { + var result = selector(x, i); + return isPromise(result) ? observableFromPromise(result) : result; + }).concatAll(); + } + + function concatMapObserver(onNext, onError, onCompleted) { + var source = this; + return new AnonymousObservable(function (observer) { + var index = 0; + + return source.subscribe( + function (x) { + observer.onNext(onNext(x, index++)); + }, + function (err) { + observer.onNext(onError(err)); + observer.completed(); + }, + function () { + observer.onNext(onCompleted()); + observer.onCompleted(); + }); + }).concatAll(); + } + + /** + * One of the Following: + * Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence. + * + * @example + * var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }); + * Or: + * Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence. + * + * var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; }); + * Or: + * Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence. + * + * var res = source.selectMany(Rx.Observable.fromArray([1,2,3])); + * @param selector A transform function to apply to each element or an observable sequence to project each element from the + * source sequence onto which could be either an observable or Promise. + * @param {Function} [resultSelector] A transform function to apply to each element of the intermediate sequence. + * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element. + */ + observableProto.selectConcat = observableProto.concatMap = function (selector, resultSelector) { + if (resultSelector) { + return this.concatMap(function (x, i) { + var selectorResult = selector(x, i), + result = isPromise(selectorResult) ? observableFromPromise(selectorResult) : selectorResult; + + return result.map(function (y) { + return resultSelector(x, y, i); + }); + }); + } + if (typeof selector === 'function') { + return concatMap.call(this, selector); + } + return concatMap.call(this, function () { + return selector; + }); + }; + + /** + * Projects each element of an observable sequence into a new form by incorporating the element's index. + * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element. + * @param {Any} [thisArg] Object to use as this when executing callback. + * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source. + */ + observableProto.select = observableProto.map = function (selector, thisArg) { + var parent = this; + return new AnonymousObservable(function (observer) { + var count = 0; + return parent.subscribe(function (value) { + var result; + try { + result = selector.call(thisArg, value, count++, parent); + } catch (exception) { + observer.onError(exception); + return; + } + observer.onNext(result); + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Retrieves the value of a specified property from all elements in the Observable sequence. + * @param {String} property The property to pluck. + * @returns {Observable} Returns a new Observable sequence of property values. + */ + observableProto.pluck = function (property) { + return this.select(function (x) { return x[property]; }); + }; + + function selectMany(selector) { + return this.select(function (x, i) { + var result = selector(x, i); + return isPromise(result) ? observableFromPromise(result) : result; + }).mergeObservable(); + } + + function selectManyObserver(onNext, onError, onCompleted) { + var source = this; + return new AnonymousObservable(function (observer) { + var index = 0; + + return source.subscribe( + function (x) { + observer.onNext(onNext(x, index++)); + }, + function (err) { + observer.onNext(onError(err)); + observer.completed(); + }, + function () { + observer.onNext(onCompleted()); + observer.onCompleted(); + }); + }).mergeAll(); + } + + /** + * One of the Following: + * Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence. + * + * @example + * var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }); + * Or: + * Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence. + * + * var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; }); + * Or: + * Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence. + * + * var res = source.selectMany(Rx.Observable.fromArray([1,2,3])); + * @param selector A transform function to apply to each element or an observable sequence to project each element from the + * source sequence onto which could be either an observable or Promise. + * @param {Function} [resultSelector] A transform function to apply to each element of the intermediate sequence. + * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element. + */ + observableProto.selectMany = observableProto.flatMap = function (selector, resultSelector) { + if (resultSelector) { + return this.selectMany(function (x, i) { + var selectorResult = selector(x, i), + result = isPromise(selectorResult) ? observableFromPromise(selectorResult) : selectorResult; + + return result.select(function (y) { + return resultSelector(x, y, i); + }); + }); + } + if (typeof selector === 'function') { + return selectMany.call(this, selector); + } + return selectMany.call(this, function () { + return selector; + }); + }; + + /** + * Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then + * transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence. + * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element. + * @param {Any} [thisArg] Object to use as this when executing callback. + * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences + * and that at any point in time produces the elements of the most recent inner observable sequence that has been received. + */ + observableProto.selectSwitch = observableProto.flatMapLatest = observableProto.switchMap = function (selector, thisArg) { + return this.select(selector, thisArg).switchLatest(); + }; + + /** + * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements. + * @param {Number} count The number of elements to skip before returning the remaining elements. + * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence. + */ + observableProto.skip = function (count) { + if (count < 0) { + throw new Error(argumentOutOfRange); + } + var observable = this; + return new AnonymousObservable(function (observer) { + var remaining = count; + return observable.subscribe(function (x) { + if (remaining <= 0) { + observer.onNext(x); + } else { + remaining--; + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements. + * The element's index is used in the logic of the predicate function. + * + * var res = source.skipWhile(function (value) { return value < 10; }); + * var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; }); + * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element. + * @param {Any} [thisArg] Object to use as this when executing callback. + * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate. + */ + observableProto.skipWhile = function (predicate, thisArg) { + var source = this; + return new AnonymousObservable(function (observer) { + var i = 0, running = false; + return source.subscribe(function (x) { + if (!running) { + try { + running = !predicate.call(thisArg, x, i++, source); + } catch (e) { + observer.onError(e); + return; + } + } + if (running) { + observer.onNext(x); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + }); + }; + + /** + * Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0). + * + * var res = source.take(5); + * var res = source.take(0, Rx.Scheduler.timeout); + * @param {Number} count The number of elements to return. + * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case 0) { + now = scheduler.now(); + d = d + p; + if (d <= now) { + d = now + p; + } + } + observer.onNext(count++); + self(d); + }); + }); + } + + /** + * Returns an observable sequence that produces a value after each period. + * + * @example + * 1 - res = Rx.Observable.interval(1000); + * 2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout); + * + * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds). + * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used. + * @returns {Observable} An observable sequence that produces a value after each period. + */ + var observableinterval = Observable.interval = function (period, scheduler) { + scheduler || (scheduler = timeoutScheduler); + return observableTimerTimeSpanAndPeriod(period, period, scheduler); + }; + + /** + * Returns an observable sequence that produces a value after dueTime has elapsed and then after each period. + * + * @example + * var res = Rx.Observable.timer(5000); + * var res = Rx.Observable.timer(5000, 1000); + * var res = Rx.Observable.timer(5000, Rx.Scheduler.timeout); + * var res = Rx.Observable.timer(5000, 1000, Rx.Scheduler.timeout); + * + * @param {Number} dueTime Relative time (specified as an integer denoting milliseconds) at which to produce the first value. + * @param {Mixed} [periodOrScheduler] Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring. + * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period. + */ + var observableTimer = Observable.timer = function (dueTime, periodOrScheduler, scheduler) { + var period; + scheduler || (scheduler = timeoutScheduler); + if (typeof periodOrScheduler === 'number') { + period = periodOrScheduler; + } else if (typeof periodOrScheduler === 'object' && 'now' in periodOrScheduler) { + scheduler = periodOrScheduler; + } + return period === undefined ? + observableTimerTimeSpan(dueTime, scheduler) : + observableTimerTimeSpanAndPeriod(dueTime, period, scheduler); + }; + + /** + * Time shifts the observable sequence by dueTime. The relative time intervals between the values are preserved. + * + * @example + * var res = Rx.Observable.delay(5000); + * var res = Rx.Observable.delay(5000, 1000, Rx.Scheduler.timeout); + * @memberOf Observable# + * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence. + * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} Time-shifted sequence. + */ + observableProto.delay = function (dueTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + var source = this; + return new AnonymousObservable(function (observer) { + var active = false, + cancelable = new SerialDisposable(), + exception = null, + q = [], + running = false, + subscription; + subscription = source.materialize().timestamp(scheduler).subscribe(function (notification) { + var d, shouldRun; + if (notification.value.kind === 'E') { + q = []; + q.push(notification); + exception = notification.value.exception; + shouldRun = !running; + } else { + q.push({ value: notification.value, timestamp: notification.timestamp + dueTime }); + shouldRun = !active; + active = true; + } + if (shouldRun) { + if (exception !== null) { + observer.onError(exception); + } else { + d = new SingleAssignmentDisposable(); + cancelable.setDisposable(d); + d.setDisposable(scheduler.scheduleRecursiveWithRelative(dueTime, function (self) { + var e, recurseDueTime, result, shouldRecurse; + if (exception !== null) { + return; + } + running = true; + do { + result = null; + if (q.length > 0 && q[0].timestamp - scheduler.now() <= 0) { + result = q.shift().value; + } + if (result !== null) { + result.accept(observer); + } + } while (result !== null); + shouldRecurse = false; + recurseDueTime = 0; + if (q.length > 0) { + shouldRecurse = true; + recurseDueTime = Math.max(0, q[0].timestamp - scheduler.now()); + } else { + active = false; + } + e = exception; + running = false; + if (e !== null) { + observer.onError(e); + } else if (shouldRecurse) { + self(recurseDueTime); + } + })); + } + } + }); + return new CompositeDisposable(subscription, cancelable); + }); + }; + + /** + * Ignores values from an observable sequence which are followed by another value before dueTime. + * + * @example + * 1 - res = source.throttle(5000); // 5 seconds + * 2 - res = source.throttle(5000, scheduler); + * + * @param {Number} dueTime Duration of the throttle period for each value (specified as an integer denoting milliseconds). + * @param {Scheduler} [scheduler] Scheduler to run the throttle timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} The throttled sequence. + */ + observableProto.throttle = function (dueTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + var source = this; + return this.throttleWithSelector(function () { return observableTimer(dueTime, scheduler); }) + }; + + /** + * Records the time interval between consecutive values in an observable sequence. + * + * @example + * 1 - res = source.timeInterval(); + * 2 - res = source.timeInterval(Rx.Scheduler.timeout); + * + * @param [scheduler] Scheduler used to compute time intervals. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence with time interval information on values. + */ + observableProto.timeInterval = function (scheduler) { + var source = this; + scheduler || (scheduler = timeoutScheduler); + return observableDefer(function () { + var last = scheduler.now(); + return source.select(function (x) { + var now = scheduler.now(), span = now - last; + last = now; + return { + value: x, + interval: span + }; + }); + }); + }; + + /** + * Records the timestamp for each value in an observable sequence. + * + * @example + * 1 - res = source.timestamp(); // produces { value: x, timestamp: ts } + * 2 - res = source.timestamp(Rx.Scheduler.timeout); + * + * @param {Scheduler} [scheduler] Scheduler used to compute timestamps. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence with timestamp information on values. + */ + observableProto.timestamp = function (scheduler) { + scheduler || (scheduler = timeoutScheduler); + return this.select(function (x) { + return { + value: x, + timestamp: scheduler.now() + }; + }); + }; + + function sampleObservable(source, sampler) { + + return new AnonymousObservable(function (observer) { + var atEnd, value, hasValue; + + function sampleSubscribe() { + if (hasValue) { + hasValue = false; + observer.onNext(value); + } + if (atEnd) { + observer.onCompleted(); + } + } + + return new CompositeDisposable( + source.subscribe(function (newValue) { + hasValue = true; + value = newValue; + }, observer.onError.bind(observer), function () { + atEnd = true; + }), + sampler.subscribe(sampleSubscribe, observer.onError.bind(observer), sampleSubscribe) + ); + }); + } + + /** + * Samples the observable sequence at each interval. + * + * @example + * 1 - res = source.sample(sampleObservable); // Sampler tick sequence + * 2 - res = source.sample(5000); // 5 seconds + * 2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds + * + * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable. + * @param {Scheduler} [scheduler] Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used. + * @returns {Observable} Sampled observable sequence. + */ + observableProto.sample = function (intervalOrSampler, scheduler) { + scheduler || (scheduler = timeoutScheduler); + if (typeof intervalOrSampler === 'number') { + return sampleObservable(this, observableinterval(intervalOrSampler, scheduler)); + } + return sampleObservable(this, intervalOrSampler); + }; + + /** + * Returns the source observable sequence or the other observable sequence if dueTime elapses. + * + * @example + * 1 - res = source.timeout(new Date()); // As a date + * 2 - res = source.timeout(5000); // 5 seconds + * 3 - res = source.timeout(new Date(), Rx.Observable.returnValue(42)); // As a date and timeout observable + * 4 - res = source.timeout(5000, Rx.Observable.returnValue(42)); // 5 seconds and timeout observable + * 5 - res = source.timeout(new Date(), Rx.Observable.returnValue(42), Rx.Scheduler.timeout); // As a date and timeout observable + * 6 - res = source.timeout(5000, Rx.Observable.returnValue(42), Rx.Scheduler.timeout); // 5 seconds and timeout observable + * + * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs. + * @param {Observable} [other] Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used. + * @param {Scheduler} [scheduler] Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} The source sequence switching to the other sequence in case of a timeout. + */ + observableProto.timeout = function (dueTime, other, scheduler) { + other || (other = observableThrow(new Error('Timeout'))); + scheduler || (scheduler = timeoutScheduler); + + var source = this, schedulerMethod = dueTime instanceof Date ? + 'scheduleWithAbsolute' : + 'scheduleWithRelative'; + + return new AnonymousObservable(function (observer) { + var id = 0, + original = new SingleAssignmentDisposable(), + subscription = new SerialDisposable(), + switched = false, + timer = new SerialDisposable(); + + subscription.setDisposable(original); + + var createTimer = function () { + var myId = id; + timer.setDisposable(scheduler[schedulerMethod](dueTime, function () { + if (id === myId) { + isPromise(other) && (other = observableFromPromise(other)); + subscription.setDisposable(other.subscribe(observer)); + } + })); + }; + + createTimer(); + + original.setDisposable(source.subscribe(function (x) { + if (!switched) { + id++; + observer.onNext(x); + createTimer(); + } + }, function (e) { + if (!switched) { + id++; + observer.onError(e); + } + }, function () { + if (!switched) { + id++; + observer.onCompleted(); + } + })); + return new CompositeDisposable(subscription, timer); + }); + }; + + /** + * Generates an observable sequence by iterating a state from an initial state until the condition fails. + * + * @example + * res = source.generateWithRelativeTime(0, + * function (x) { return return true; }, + * function (x) { return x + 1; }, + * function (x) { return x; }, + * function (x) { return 500; } + * ); + * + * @param {Mixed} initialState Initial state. + * @param {Function} condition Condition to terminate generation (upon returning false). + * @param {Function} iterate Iteration step function. + * @param {Function} resultSelector Selector function for results produced in the sequence. + * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning integer values denoting milliseconds. + * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used. + * @returns {Observable} The generated sequence. + */ + Observable.generateWithRelativeTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) { + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var first = true, + hasResult = false, + result, + state = initialState, + time; + return scheduler.scheduleRecursiveWithRelative(0, function (self) { + if (hasResult) { + observer.onNext(result); + } + try { + if (first) { + first = false; + } else { + state = iterate(state); + } + hasResult = condition(state); + if (hasResult) { + result = resultSelector(state); + time = timeSelector(state); + } + } catch (e) { + observer.onError(e); + return; + } + if (hasResult) { + self(time); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * Time shifts the observable sequence by delaying the subscription. + * + * @example + * 1 - res = source.delaySubscription(5000); // 5s + * 2 - res = source.delaySubscription(5000, Rx.Scheduler.timeout); // 5 seconds + * + * @param {Number} dueTime Absolute or relative time to perform the subscription at. + * @param {Scheduler} [scheduler] Scheduler to run the subscription delay timer on. If not specified, the timeout scheduler is used. + * @returns {Observable} Time-shifted sequence. + */ + observableProto.delaySubscription = function (dueTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + return this.delayWithSelector(observableTimer(dueTime, scheduler), function () { return observableEmpty(); }); + }; + + /** + * Time shifts the observable sequence based on a subscription delay and a delay selector function for each element. + * + * @example + * 1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(5000); }); // with selector only + * 1 - res = source.delayWithSelector(Rx.Observable.timer(2000), function (x) { return Rx.Observable.timer(x); }); // with delay and selector + * + * @param {Observable} [subscriptionDelay] Sequence indicating the delay for the subscription to the source. + * @param {Function} delayDurationSelector Selector function to retrieve a sequence indicating the delay for each given element. + * @returns {Observable} Time-shifted sequence. + */ + observableProto.delayWithSelector = function (subscriptionDelay, delayDurationSelector) { + var source = this, subDelay, selector; + if (typeof subscriptionDelay === 'function') { + selector = subscriptionDelay; + } else { + subDelay = subscriptionDelay; + selector = delayDurationSelector; + } + return new AnonymousObservable(function (observer) { + var delays = new CompositeDisposable(), atEnd = false, done = function () { + if (atEnd && delays.length === 0) { + observer.onCompleted(); + } + }, subscription = new SerialDisposable(), start = function () { + subscription.setDisposable(source.subscribe(function (x) { + var delay; + try { + delay = selector(x); + } catch (error) { + observer.onError(error); + return; + } + var d = new SingleAssignmentDisposable(); + delays.add(d); + d.setDisposable(delay.subscribe(function () { + observer.onNext(x); + delays.remove(d); + done(); + }, observer.onError.bind(observer), function () { + observer.onNext(x); + delays.remove(d); + done(); + })); + }, observer.onError.bind(observer), function () { + atEnd = true; + subscription.dispose(); + done(); + })); + }; + + if (!subDelay) { + start(); + } else { + subscription.setDisposable(subDelay.subscribe(function () { + start(); + }, observer.onError.bind(observer), function () { start(); })); + } + + return new CompositeDisposable(subscription, delays); + }); + }; + + /** + * Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled. + * + * @example + * 1 - res = source.timeoutWithSelector(Rx.Observable.timer(500)); + * 2 - res = source.timeoutWithSelector(Rx.Observable.timer(500), function (x) { return Rx.Observable.timer(200); }); + * 3 - res = source.timeoutWithSelector(Rx.Observable.timer(500), function (x) { return Rx.Observable.timer(200); }, Rx.Observable.returnValue(42)); + * + * @param {Observable} [firstTimeout] Observable sequence that represents the timeout for the first element. If not provided, this defaults to Observable.never(). + * @param {Function} [timeoutDurationSelector] Selector to retrieve an observable sequence that represents the timeout between the current element and the next element. + * @param {Observable} [other] Sequence to return in case of a timeout. If not provided, this is set to Observable.throwException(). + * @returns {Observable} The source sequence switching to the other sequence in case of a timeout. + */ + observableProto.timeoutWithSelector = function (firstTimeout, timeoutdurationSelector, other) { + if (arguments.length === 1) { + timeoutdurationSelector = firstTimeout; + var firstTimeout = observableNever(); + } + other || (other = observableThrow(new Error('Timeout'))); + var source = this; + return new AnonymousObservable(function (observer) { + var subscription = new SerialDisposable(), timer = new SerialDisposable(), original = new SingleAssignmentDisposable(); + + subscription.setDisposable(original); + + var id = 0, switched = false, setTimer = function (timeout) { + var myId = id, timerWins = function () { + return id === myId; + }; + var d = new SingleAssignmentDisposable(); + timer.setDisposable(d); + d.setDisposable(timeout.subscribe(function () { + if (timerWins()) { + subscription.setDisposable(other.subscribe(observer)); + } + d.dispose(); + }, function (e) { + if (timerWins()) { + observer.onError(e); + } + }, function () { + if (timerWins()) { + subscription.setDisposable(other.subscribe(observer)); + } + })); + }; + + setTimer(firstTimeout); + var observerWins = function () { + var res = !switched; + if (res) { + id++; + } + return res; + }; + + original.setDisposable(source.subscribe(function (x) { + if (observerWins()) { + observer.onNext(x); + var timeout; + try { + timeout = timeoutdurationSelector(x); + } catch (e) { + observer.onError(e); + return; + } + setTimer(timeout); + } + }, function (e) { + if (observerWins()) { + observer.onError(e); + } + }, function () { + if (observerWins()) { + observer.onCompleted(); + } + })); + return new CompositeDisposable(subscription, timer); + }); + }; + + /** + * Ignores values from an observable sequence which are followed by another value within a computed throttle duration. + * + * @example + * 1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(x + x); }); + * + * @param {Function} throttleDurationSelector Selector function to retrieve a sequence indicating the throttle duration for each given element. + * @returns {Observable} The throttled sequence. + */ + observableProto.throttleWithSelector = function (throttleDurationSelector) { + var source = this; + return new AnonymousObservable(function (observer) { + var value, hasValue = false, cancelable = new SerialDisposable(), id = 0, subscription = source.subscribe(function (x) { + var throttle; + try { + throttle = throttleDurationSelector(x); + } catch (e) { + observer.onError(e); + return; + } + hasValue = true; + value = x; + id++; + var currentid = id, d = new SingleAssignmentDisposable(); + cancelable.setDisposable(d); + d.setDisposable(throttle.subscribe(function () { + if (hasValue && id === currentid) { + observer.onNext(value); + } + hasValue = false; + d.dispose(); + }, observer.onError.bind(observer), function () { + if (hasValue && id === currentid) { + observer.onNext(value); + } + hasValue = false; + d.dispose(); + })); + }, function (e) { + cancelable.dispose(); + observer.onError(e); + hasValue = false; + id++; + }, function () { + cancelable.dispose(); + if (hasValue) { + observer.onNext(value); + } + observer.onCompleted(); + hasValue = false; + id++; + }); + return new CompositeDisposable(subscription, cancelable); + }); + }; + + /** + * Skips elements for the specified duration from the end of the observable source sequence, using the specified scheduler to run timers. + * + * 1 - res = source.skipLastWithTime(5000); + * 2 - res = source.skipLastWithTime(5000, scheduler); + * + * @description + * This operator accumulates a queue with a length enough to store elements received during the initial duration window. + * As more elements are received, elements older than the specified duration are taken from the queue and produced on the + * result sequence. This causes elements to be delayed with duration. + * @param {Number} duration Duration for skipping elements from the end of the sequence. + * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout + * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the end of the source sequence. + */ + observableProto.skipLastWithTime = function (duration, scheduler) { + scheduler || (scheduler = timeoutScheduler); + var source = this; + return new AnonymousObservable(function (observer) { + var q = []; + return source.subscribe(function (x) { + var now = scheduler.now(); + q.push({ interval: now, value: x }); + while (q.length > 0 && now - q[0].interval >= duration) { + observer.onNext(q.shift().value); + } + }, observer.onError.bind(observer), function () { + var now = scheduler.now(); + while (q.length > 0 && now - q[0].interval >= duration) { + observer.onNext(q.shift().value); + } + observer.onCompleted(); + }); + }); + }; + + /** + * Returns elements within the specified duration from the end of the observable source sequence, using the specified schedulers to run timers and to drain the collected elements. + * + * @example + * 1 - res = source.takeLastWithTime(5000, [optional timer scheduler], [optional loop scheduler]); + * @description + * This operator accumulates a queue with a length enough to store elements received during the initial duration window. + * As more elements are received, elements older than the specified duration are taken from the queue and produced on the + * result sequence. This causes elements to be delayed with duration. + * @param {Number} duration Duration for taking elements from the end of the sequence. + * @param {Scheduler} [timerScheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @param {Scheduler} [loopScheduler] Scheduler to drain the collected elements. If not specified, defaults to Rx.Scheduler.immediate. + * @returns {Observable} An observable sequence with the elements taken during the specified duration from the end of the source sequence. + */ + observableProto.takeLastWithTime = function (duration, timerScheduler, loopScheduler) { + return this.takeLastBufferWithTime(duration, timerScheduler).selectMany(function (xs) { return observableFromArray(xs, loopScheduler); }); + }; + + /** + * Returns an array with the elements within the specified duration from the end of the observable source sequence, using the specified scheduler to run timers. + * + * @example + * 1 - res = source.takeLastBufferWithTime(5000, [optional scheduler]); + * @description + * This operator accumulates a queue with a length enough to store elements received during the initial duration window. + * As more elements are received, elements older than the specified duration are taken from the queue and produced on the + * result sequence. This causes elements to be delayed with duration. + * @param {Number} duration Duration for taking elements from the end of the sequence. + * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @returns {Observable} An observable sequence containing a single array with the elements taken during the specified duration from the end of the source sequence. + */ + observableProto.takeLastBufferWithTime = function (duration, scheduler) { + var source = this; + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var q = []; + + return source.subscribe(function (x) { + var now = scheduler.now(); + q.push({ interval: now, value: x }); + while (q.length > 0 && now - q[0].interval >= duration) { + q.shift(); + } + }, observer.onError.bind(observer), function () { + var now = scheduler.now(), res = []; + while (q.length > 0) { + var next = q.shift(); + if (now - next.interval <= duration) { + res.push(next.value); + } + } + + observer.onNext(res); + observer.onCompleted(); + }); + }); + }; + + /** + * Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers. + * + * @example + * 1 - res = source.takeWithTime(5000, [optional scheduler]); + * @description + * This operator accumulates a queue with a length enough to store elements received during the initial duration window. + * As more elements are received, elements older than the specified duration are taken from the queue and produced on the + * result sequence. This causes elements to be delayed with duration. + * @param {Number} duration Duration for taking elements from the start of the sequence. + * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @returns {Observable} An observable sequence with the elements taken during the specified duration from the start of the source sequence. + */ + observableProto.takeWithTime = function (duration, scheduler) { + var source = this; + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var t = scheduler.scheduleWithRelative(duration, function () { + observer.onCompleted(); + }); + + return new CompositeDisposable(t, source.subscribe(observer)); + }); + }; + + /** + * Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers. + * + * @example + * 1 - res = source.skipWithTime(5000, [optional scheduler]); + * + * @description + * Specifying a zero value for duration doesn't guarantee no elements will be dropped from the start of the source sequence. + * This is a side-effect of the asynchrony introduced by the scheduler, where the action that causes callbacks from the source sequence to be forwarded + * may not execute immediately, despite the zero due time. + * + * Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the duration. + * @param {Number} duration Duration for skipping elements from the start of the sequence. + * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the start of the source sequence. + */ + observableProto.skipWithTime = function (duration, scheduler) { + var source = this; + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var open = false, + t = scheduler.scheduleWithRelative(duration, function () { open = true; }), + d = source.subscribe(function (x) { + if (open) { + observer.onNext(x); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + + return new CompositeDisposable(t, d); + }); + }; + + /** + * Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers. + * Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time. + * + * @examples + * 1 - res = source.skipUntilWithTime(new Date(), [optional scheduler]); + * 2 - res = source.skipUntilWithTime(5000, [optional scheduler]); + * @param startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped. + * @param scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @returns {Observable} An observable sequence with the elements skipped until the specified start time. + */ + observableProto.skipUntilWithTime = function (startTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + var source = this, schedulerMethod = startTime instanceof Date ? + 'scheduleWithAbsolute' : + 'scheduleWithRelative'; + return new AnonymousObservable(function (observer) { + var open = false; + + return new CompositeDisposable( + scheduler[schedulerMethod](startTime, function () { open = true; }), + source.subscribe( + function (x) { open && observer.onNext(x); }, + observer.onError.bind(observer), + observer.onCompleted.bind(observer))); + }); + }; + + /** + * Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers. + * + * @example + * 1 - res = source.takeUntilWithTime(new Date(), [optional scheduler]); + * 2 - res = source.takeUntilWithTime(5000, [optional scheduler]); + * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately. + * @param {Scheduler} scheduler Scheduler to run the timer on. + * @returns {Observable} An observable sequence with the elements taken until the specified end time. + */ + observableProto.takeUntilWithTime = function (endTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + var source = this, schedulerMethod = endTime instanceof Date ? + 'scheduleWithAbsolute' : + 'scheduleWithRelative'; + return new AnonymousObservable(function (observer) { + return new CompositeDisposable(scheduler[schedulerMethod](endTime, function () { + observer.onCompleted(); + }), source.subscribe(observer)); + }); + }; + + var PausableObservable = (function (_super) { + + inherits(PausableObservable, _super); + + function subscribe(observer) { + var conn = this.source.publish(), + subscription = conn.subscribe(observer), + connection = disposableEmpty; + + var pausable = this.subject.distinctUntilChanged().subscribe(function (b) { + if (b) { + connection = conn.connect(); + } else { + connection.dispose(); + connection = disposableEmpty; + } + }); + + return new CompositeDisposable(subscription, connection, pausable); + } + + function PausableObservable(source, subject) { + this.source = source; + this.subject = subject || new Subject(); + this.isPaused = true; + _super.call(this, subscribe); + } + + PausableObservable.prototype.pause = function () { + if (this.isPaused === true){ + return; + } + this.isPaused = true; + this.subject.onNext(false); + }; + + PausableObservable.prototype.resume = function () { + if (this.isPaused === false){ + return; + } + this.isPaused = false; + this.subject.onNext(true); + }; + + return PausableObservable; + + }(Observable)); + + /** + * Pauses the underlying observable sequence based upon the observable sequence which yields true/false. + * @example + * var pauser = new Rx.Subject(); + * var source = Rx.Observable.interval(100).pausable(pauser); + * @param {Observable} pauser The observable sequence used to pause the underlying sequence. + * @returns {Observable} The observable sequence which is paused based upon the pauser. + */ + observableProto.pausable = function (pauser) { + return new PausableObservable(this, pauser); + }; + function combineLatestSource(source, subject, resultSelector) { + return new AnonymousObservable(function (observer) { + var n = 2, + hasValue = [false, false], + hasValueAll = false, + isDone = false, + values = new Array(n); + + function next(x, i) { + values[i] = x + var res; + hasValue[i] = true; + if (hasValueAll || (hasValueAll = hasValue.every(identity))) { + try { + res = resultSelector.apply(null, values); + } catch (ex) { + observer.onError(ex); + return; + } + observer.onNext(res); + } else if (isDone) { + observer.onCompleted(); + } + } + + return new CompositeDisposable( + source.subscribe( + function (x) { + next(x, 0); + }, + observer.onError.bind(observer), + function () { + isDone = true; + observer.onCompleted(); + }), + subject.subscribe( + function (x) { + next(x, 1); + }, + observer.onError.bind(observer)) + ); + }); + } + + var PausableBufferedObservable = (function (_super) { + + inherits(PausableBufferedObservable, _super); + + function subscribe(observer) { + var q = [], previous = true; + + var subscription = + combineLatestSource( + this.source, + this.subject.distinctUntilChanged(), + function (data, shouldFire) { + return { data: data, shouldFire: shouldFire }; + }) + .subscribe( + function (results) { + if (results.shouldFire && previous) { + observer.onNext(results.data); + } + if (results.shouldFire && !previous) { + while (q.length > 0) { + observer.onNext(q.shift()); + } + previous = true; + } else if (!results.shouldFire && !previous) { + q.push(results.data); + } else if (!results.shouldFire && previous) { + previous = false; + } + + }, + function (err) { + // Empty buffer before sending error + while (q.length > 0) { + observer.onNext(q.shift()); + } + observer.onError(err); + }, + function () { + // Empty buffer before sending completion + while (q.length > 0) { + observer.onNext(q.shift()); + } + observer.onCompleted(); + } + ); + + this.subject.onNext(false); + + return subscription; + } + + function PausableBufferedObservable(source, subject) { + this.source = source; + this.subject = subject || new Subject(); + this.isPaused = true; + _super.call(this, subscribe); + } + + PausableBufferedObservable.prototype.pause = function () { + if (this.isPaused === true){ + return; + } + this.isPaused = true; + this.subject.onNext(false); + }; + + PausableBufferedObservable.prototype.resume = function () { + if (this.isPaused === false){ + return; + } + this.isPaused = false; + this.subject.onNext(true); + }; + + return PausableBufferedObservable; + + }(Observable)); + + /** + * Pauses the underlying observable sequence based upon the observable sequence which yields true/false, + * and yields the values that were buffered while paused. + * @example + * var pauser = new Rx.Subject(); + * var source = Rx.Observable.interval(100).pausableBuffered(pauser); + * @param {Observable} pauser The observable sequence used to pause the underlying sequence. + * @returns {Observable} The observable sequence which is paused based upon the pauser. + */ + observableProto.pausableBuffered = function (subject) { + return new PausableBufferedObservable(this, subject); + }; + + /** + * Attaches a controller to the observable sequence with the ability to queue. + * @example + * var source = Rx.Observable.interval(100).controlled(); + * source.request(3); // Reads 3 values + * @param {Observable} pauser The observable sequence used to pause the underlying sequence. + * @returns {Observable} The observable sequence which is paused based upon the pauser. + */ + observableProto.controlled = function (enableQueue) { + if (enableQueue == null) { enableQueue = true; } + return new ControlledObservable(this, enableQueue); + }; + var ControlledObservable = (function (_super) { + + inherits(ControlledObservable, _super); + + function subscribe (observer) { + return this.source.subscribe(observer); + } + + function ControlledObservable (source, enableQueue) { + _super.call(this, subscribe); + this.subject = new ControlledSubject(enableQueue); + this.source = source.multicast(this.subject).refCount(); + } + + ControlledObservable.prototype.request = function (numberOfItems) { + if (numberOfItems == null) { numberOfItems = -1; } + return this.subject.request(numberOfItems); + }; + + return ControlledObservable; + + }(Observable)); + + var ControlledSubject = Rx.ControlledSubject = (function (_super) { + + function subscribe (observer) { + return this.subject.subscribe(observer); + } + + inherits(ControlledSubject, _super); + + function ControlledSubject(enableQueue) { + if (enableQueue == null) { + enableQueue = true; + } + + _super.call(this, subscribe); + this.subject = new Subject(); + this.enableQueue = enableQueue; + this.queue = enableQueue ? [] : null; + this.requestedCount = 0; + this.requestedDisposable = disposableEmpty; + this.error = null; + this.hasFailed = false; + this.hasCompleted = false; + this.controlledDisposable = disposableEmpty; + } + + addProperties(ControlledSubject.prototype, Observer, { + onCompleted: function () { + checkDisposed.call(this); + this.hasCompleted = true; + + if (!this.enableQueue || this.queue.length === 0) { + this.subject.onCompleted(); + } + }, + onError: function (error) { + checkDisposed.call(this); + this.hasFailed = true; + this.error = error; + + if (!this.enableQueue || this.queue.length === 0) { + this.subject.onError(error); + } + }, + onNext: function (value) { + checkDisposed.call(this); + var hasRequested = false; + + if (this.requestedCount === 0) { + if (this.enableQueue) { + this.queue.push(value); + } + } else { + if (this.requestedCount !== -1) { + if (this.requestedCount-- === 0) { + this.disposeCurrentRequest(); + } + } + hasRequested = true; + } + + if (hasRequested) { + this.subject.onNext(value); + } + }, + _processRequest: function (numberOfItems) { + if (this.enableQueue) { + //console.log('queue length', this.queue.length); + + while (this.queue.length >= numberOfItems && numberOfItems > 0) { + //console.log('number of items', numberOfItems); + this.subject.onNext(this.queue.shift()); + numberOfItems--; + } + + if (this.queue.length !== 0) { + return { numberOfItems: numberOfItems, returnValue: true }; + } else { + return { numberOfItems: numberOfItems, returnValue: false }; + } + } + + if (this.hasFailed) { + this.subject.onError(this.error); + this.controlledDisposable.dispose(); + this.controlledDisposable = disposableEmpty; + } else if (this.hasCompleted) { + this.subject.onCompleted(); + this.controlledDisposable.dispose(); + this.controlledDisposable = disposableEmpty; + } + + return { numberOfItems: numberOfItems, returnValue: false }; + }, + request: function (number) { + checkDisposed.call(this); + this.disposeCurrentRequest(); + var self = this, + r = this._processRequest(number); + + number = r.numberOfItems; + if (!r.returnValue) { + this.requestedCount = number; + this.requestedDisposable = disposableCreate(function () { + self.requestedCount = 0; + }); + + return this.requestedDisposable + } else { + return disposableEmpty; + } + }, + disposeCurrentRequest: function () { + this.requestedDisposable.dispose(); + this.requestedDisposable = disposableEmpty; + }, + + dispose: function () { + this.isDisposed = true; + this.error = null; + this.subject.dispose(); + this.requestedDisposable.dispose(); + } + }); + + return ControlledSubject; + }(Observable)); + /** + * Returns a new observable that triggers on the second and subsequent triggerings of the input observable. + * The Nth triggering of the input observable passes the arguments from the N-1th and Nth triggering as a pair. + * The argument passed to the N-1th triggering is held in hidden internal state until the Nth triggering occurs. + * @returns {Observable} An observable that triggers on successive pairs of observations from the input observable as an array. + */ + observableProto.pairwise = function () { + var source = this; + return new AnonymousObservable(function (observer) { + var previous, hasPrevious = false; + return source.subscribe( + function (x) { + if (hasPrevious) { + observer.onNext([previous, x]); + } else { + hasPrevious = true; + } + previous = x; + }, + observer.onError.bind(observer), + observer.onCompleted.bind(observer)); + }); + }; + /** + * Returns two observables which partition the observations of the source by the given function. + * The first will trigger observations for those values for which the predicate returns true. + * The second will trigger observations for those values where the predicate returns false. + * The predicate is executed once for each subscribed observer. + * Both also propagate all error observations arising from the source and each completes + * when the source completes. + * @param {Function} predicate + * The function to determine which output Observable will trigger a particular observation. + * @returns {Array} + * An array of observables. The first triggers when the predicate returns true, + * and the second triggers when the predicate returns false. + */ + observableProto.partition = function(predicate, thisArg) { + var published = this.publish().refCount(); + return [ + published.filter(predicate, thisArg), + published.filter(function (x, i, o) { return !predicate.call(thisArg, x, i, o); }) + ]; + }; + + /* + * Performs a exclusive waiting for the first to finish before subscribing to another observable. + * Observables that come in between subscriptions will be dropped on the floor. + * @returns {Observable} A exclusive observable with only the results that happen when subscribed. + */ + observableProto.exclusive = function () { + var sources = this; + return new AnonymousObservable(function (observer) { + var hasCurrent = false, + isStopped = false, + m = new SingleAssignmentDisposable(), + g = new CompositeDisposable(); + + g.add(m); + + m.setDisposable(sources.subscribe( + function (innerSource) { + if (!hasCurrent) { + hasCurrent = true; + + isPromise(innerSource) && (innerSource = observableFromPromise(innerSource)); + + var innerSubscription = new SingleAssignmentDisposable(); + g.add(innerSubscription); + + innerSubscription.setDisposable(innerSource.subscribe( + observer.onNext.bind(observer), + observer.onError.bind(observer), + function () { + g.remove(innerSubscription); + hasCurrent = false; + if (isStopped && g.length === 1) { + observer.onCompleted(); + } + })); + } + }, + observer.onError.bind(observer), + function () { + isStopped = true; + if (!hasCurrent && g.length === 1) { + observer.onCompleted(); + } + })); + + return g; + }); + }; + /* + * Performs a exclusive map waiting for the first to finish before subscribing to another observable. + * Observables that come in between subscriptions will be dropped on the floor. + * @param {Function} selector Selector to invoke for every item in the current subscription. + * @param {Any} [thisArg] An optional context to invoke with the selector parameter. + * @returns {Observable} An exclusive observable with only the results that happen when subscribed. + */ + observableProto.exclusiveMap = function (selector, thisArg) { + var sources = this; + return new AnonymousObservable(function (observer) { + var index = 0, + hasCurrent = false, + isStopped = true, + m = new SingleAssignmentDisposable(), + g = new CompositeDisposable(); + + g.add(m); + + m.setDisposable(sources.subscribe( + function (innerSource) { + + if (!hasCurrent) { + hasCurrent = true; + + innerSubscription = new SingleAssignmentDisposable(); + g.add(innerSubscription); + + isPromise(innerSource) && (innerSource = observableFromPromise(innerSource)); + + innerSubscription.setDisposable(innerSource.subscribe( + function (x) { + var result; + try { + result = selector.call(thisArg, x, index++, innerSource); + } catch (e) { + observer.onError(e); + return; + } + + observer.onNext(result); + }, + observer.onError.bind(observer), + function () { + g.remove(innerSubscription); + hasCurrent = false; + + if (isStopped && g.length === 1) { + observer.onCompleted(); + } + })); + } + }, + observer.onError.bind(observer), + function () { + isStopped = true; + if (g.length === 1 && !hasCurrent) { + observer.onCompleted(); + } + })); + return g; + }); + }; + var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) { + inherits(AnonymousObservable, __super__); + + // Fix subscriber to check for undefined or function returned to decorate as Disposable + function fixSubscriber(subscriber) { + if (typeof subscriber === 'undefined') { + subscriber = disposableEmpty; + } else if (typeof subscriber === 'function') { + subscriber = disposableCreate(subscriber); + } + + return subscriber; + } + + function AnonymousObservable(subscribe) { + if (!(this instanceof AnonymousObservable)) { + return new AnonymousObservable(subscribe); + } + + function s(observer) { + var setDisposable = function () { + try { + autoDetachObserver.setDisposable(fixSubscriber(subscribe(autoDetachObserver))); + } catch (e) { + if (!autoDetachObserver.fail(e)) { + throw e; + } + } + }; + + var autoDetachObserver = new AutoDetachObserver(observer); + if (currentThreadScheduler.scheduleRequired()) { + currentThreadScheduler.schedule(setDisposable); + } else { + setDisposable(); + } + + return autoDetachObserver; + } + + __super__.call(this, s); + } + + return AnonymousObservable; + + }(Observable)); + + /** @private */ + var AutoDetachObserver = (function (_super) { + inherits(AutoDetachObserver, _super); + + function AutoDetachObserver(observer) { + _super.call(this); + this.observer = observer; + this.m = new SingleAssignmentDisposable(); + } + + var AutoDetachObserverPrototype = AutoDetachObserver.prototype; + + AutoDetachObserverPrototype.next = function (value) { + var noError = false; + try { + this.observer.onNext(value); + noError = true; + } catch (e) { + throw e; + } finally { + if (!noError) { + this.dispose(); + } + } + }; + + AutoDetachObserverPrototype.error = function (exn) { + try { + this.observer.onError(exn); + } catch (e) { + throw e; + } finally { + this.dispose(); + } + }; + + AutoDetachObserverPrototype.completed = function () { + try { + this.observer.onCompleted(); + } catch (e) { + throw e; + } finally { + this.dispose(); + } + }; + + AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); }; + AutoDetachObserverPrototype.getDisposable = function (value) { return this.m.getDisposable(); }; + /* @private */ + AutoDetachObserverPrototype.disposable = function (value) { + return arguments.length ? this.getDisposable() : setDisposable(value); + }; + + AutoDetachObserverPrototype.dispose = function () { + _super.prototype.dispose.call(this); + this.m.dispose(); + }; + + return AutoDetachObserver; + }(AbstractObserver)); + + /** @private */ + var InnerSubscription = function (subject, observer) { + this.subject = subject; + this.observer = observer; + }; + + /** + * @private + * @memberOf InnerSubscription + */ + InnerSubscription.prototype.dispose = function () { + if (!this.subject.isDisposed && this.observer !== null) { + var idx = this.subject.observers.indexOf(this.observer); + this.subject.observers.splice(idx, 1); + this.observer = null; + } + }; + + /** + * Represents an object that is both an observable sequence as well as an observer. + * Each notification is broadcasted to all subscribed observers. + */ + var Subject = Rx.Subject = (function (_super) { + function subscribe(observer) { + checkDisposed.call(this); + if (!this.isStopped) { + this.observers.push(observer); + return new InnerSubscription(this, observer); + } + if (this.exception) { + observer.onError(this.exception); + return disposableEmpty; + } + observer.onCompleted(); + return disposableEmpty; + } + + inherits(Subject, _super); + + /** + * Creates a subject. + * @constructor + */ + function Subject() { + _super.call(this, subscribe); + this.isDisposed = false, + this.isStopped = false, + this.observers = []; + } + + addProperties(Subject.prototype, Observer, { + /** + * Indicates whether the subject has observers subscribed to it. + * @returns {Boolean} Indicates whether the subject has observers subscribed to it. + */ + hasObservers: function () { + return this.observers.length > 0; + }, + /** + * Notifies all subscribed observers about the end of the sequence. + */ + onCompleted: function () { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + for (var i = 0, len = os.length; i < len; i++) { + os[i].onCompleted(); + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the exception. + * @param {Mixed} error The exception to send to all observers. + */ + onError: function (exception) { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + this.exception = exception; + for (var i = 0, len = os.length; i < len; i++) { + os[i].onError(exception); + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the arrival of the specified element in the sequence. + * @param {Mixed} value The value to send to all observers. + */ + onNext: function (value) { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + for (var i = 0, len = os.length; i < len; i++) { + os[i].onNext(value); + } + } + }, + /** + * Unsubscribe all observers and release resources. + */ + dispose: function () { + this.isDisposed = true; + this.observers = null; + } + }); + + /** + * Creates a subject from the specified observer and observable. + * @param {Observer} observer The observer used to send messages to the subject. + * @param {Observable} observable The observable used to subscribe to messages sent from the subject. + * @returns {Subject} Subject implemented using the given observer and observable. + */ + Subject.create = function (observer, observable) { + return new AnonymousSubject(observer, observable); + }; + + return Subject; + }(Observable)); + + /** + * Represents the result of an asynchronous operation. + * The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers. + */ + var AsyncSubject = Rx.AsyncSubject = (function (_super) { + + function subscribe(observer) { + checkDisposed.call(this); + + if (!this.isStopped) { + this.observers.push(observer); + return new InnerSubscription(this, observer); + } + + var ex = this.exception, + hv = this.hasValue, + v = this.value; + + if (ex) { + observer.onError(ex); + } else if (hv) { + observer.onNext(v); + observer.onCompleted(); + } else { + observer.onCompleted(); + } + + return disposableEmpty; + } + + inherits(AsyncSubject, _super); + + /** + * Creates a subject that can only receive one value and that value is cached for all future observations. + * @constructor + */ + function AsyncSubject() { + _super.call(this, subscribe); + + this.isDisposed = false; + this.isStopped = false; + this.value = null; + this.hasValue = false; + this.observers = []; + this.exception = null; + } + + addProperties(AsyncSubject.prototype, Observer, { + /** + * Indicates whether the subject has observers subscribed to it. + * @returns {Boolean} Indicates whether the subject has observers subscribed to it. + */ + hasObservers: function () { + checkDisposed.call(this); + return this.observers.length > 0; + }, + /** + * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any). + */ + onCompleted: function () { + var o, i, len; + checkDisposed.call(this); + if (!this.isStopped) { + this.isStopped = true; + var os = this.observers.slice(0), + v = this.value, + hv = this.hasValue; + + if (hv) { + for (i = 0, len = os.length; i < len; i++) { + o = os[i]; + o.onNext(v); + o.onCompleted(); + } + } else { + for (i = 0, len = os.length; i < len; i++) { + os[i].onCompleted(); + } + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the exception. + * @param {Mixed} error The exception to send to all observers. + */ + onError: function (exception) { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + this.exception = exception; + + for (var i = 0, len = os.length; i < len; i++) { + os[i].onError(exception); + } + + this.observers = []; + } + }, + /** + * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers. + * @param {Mixed} value The value to store in the subject. + */ + onNext: function (value) { + checkDisposed.call(this); + if (!this.isStopped) { + this.value = value; + this.hasValue = true; + } + }, + /** + * Unsubscribe all observers and release resources. + */ + dispose: function () { + this.isDisposed = true; + this.observers = null; + this.exception = null; + this.value = null; + } + }); + + return AsyncSubject; + }(Observable)); + + /** @private */ + var AnonymousSubject = (function (_super) { + inherits(AnonymousSubject, _super); + + function subscribe(observer) { + return this.observable.subscribe(observer); + } + + /** + * @private + * @constructor + */ + function AnonymousSubject(observer, observable) { + _super.call(this, subscribe); + this.observer = observer; + this.observable = observable; + } + + addProperties(AnonymousSubject.prototype, Observer, { + /** + * @private + * @memberOf AnonymousSubject# + */ + onCompleted: function () { + this.observer.onCompleted(); + }, + /** + * @private + * @memberOf AnonymousSubject# + */ + onError: function (exception) { + this.observer.onError(exception); + }, + /** + * @private + * @memberOf AnonymousSubject# + */ + onNext: function (value) { + this.observer.onNext(value); + } + }); + + return AnonymousSubject; + }(Observable)); + + /** + * Represents a value that changes over time. + * Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications. + */ + var BehaviorSubject = Rx.BehaviorSubject = (function (_super) { + function subscribe(observer) { + checkDisposed.call(this); + if (!this.isStopped) { + this.observers.push(observer); + observer.onNext(this.value); + return new InnerSubscription(this, observer); + } + var ex = this.exception; + if (ex) { + observer.onError(ex); + } else { + observer.onCompleted(); + } + return disposableEmpty; + } + + inherits(BehaviorSubject, _super); + + /** + * @constructor + * Initializes a new instance of the BehaviorSubject class which creates a subject that caches its last value and starts with the specified value. + * @param {Mixed} value Initial value sent to observers when no other value has been received by the subject yet. + */ + function BehaviorSubject(value) { + _super.call(this, subscribe); + + this.value = value, + this.observers = [], + this.isDisposed = false, + this.isStopped = false, + this.exception = null; + } + + addProperties(BehaviorSubject.prototype, Observer, { + /** + * Indicates whether the subject has observers subscribed to it. + * @returns {Boolean} Indicates whether the subject has observers subscribed to it. + */ + hasObservers: function () { + return this.observers.length > 0; + }, + /** + * Notifies all subscribed observers about the end of the sequence. + */ + onCompleted: function () { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + for (var i = 0, len = os.length; i < len; i++) { + os[i].onCompleted(); + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the exception. + * @param {Mixed} error The exception to send to all observers. + */ + onError: function (error) { + checkDisposed.call(this); + if (!this.isStopped) { + var os = this.observers.slice(0); + this.isStopped = true; + this.exception = error; + + for (var i = 0, len = os.length; i < len; i++) { + os[i].onError(error); + } + + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the arrival of the specified element in the sequence. + * @param {Mixed} value The value to send to all observers. + */ + onNext: function (value) { + checkDisposed.call(this); + if (!this.isStopped) { + this.value = value; + var os = this.observers.slice(0); + for (var i = 0, len = os.length; i < len; i++) { + os[i].onNext(value); + } + } + }, + /** + * Unsubscribe all observers and release resources. + */ + dispose: function () { + this.isDisposed = true; + this.observers = null; + this.value = null; + this.exception = null; + } + }); + + return BehaviorSubject; + }(Observable)); + + /** + * Represents an object that is both an observable sequence as well as an observer. + * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies. + */ + var ReplaySubject = Rx.ReplaySubject = (function (_super) { + + function RemovableDisposable (subject, observer) { + this.subject = subject; + this.observer = observer; + }; + + RemovableDisposable.prototype.dispose = function () { + this.observer.dispose(); + if (!this.subject.isDisposed) { + var idx = this.subject.observers.indexOf(this.observer); + this.subject.observers.splice(idx, 1); + } + }; + + function subscribe(observer) { + var so = new ScheduledObserver(this.scheduler, observer), + subscription = new RemovableDisposable(this, so); + checkDisposed.call(this); + this._trim(this.scheduler.now()); + this.observers.push(so); + + var n = this.q.length; + + for (var i = 0, len = this.q.length; i < len; i++) { + so.onNext(this.q[i].value); + } + + if (this.hasError) { + n++; + so.onError(this.error); + } else if (this.isStopped) { + n++; + so.onCompleted(); + } + + so.ensureActive(n); + return subscription; + } + + inherits(ReplaySubject, _super); + + /** + * Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler. + * @param {Number} [bufferSize] Maximum element count of the replay buffer. + * @param {Number} [windowSize] Maximum time length of the replay buffer. + * @param {Scheduler} [scheduler] Scheduler the observers are invoked on. + */ + function ReplaySubject(bufferSize, windowSize, scheduler) { + this.bufferSize = bufferSize == null ? Number.MAX_VALUE : bufferSize; + this.windowSize = windowSize == null ? Number.MAX_VALUE : windowSize; + this.scheduler = scheduler || currentThreadScheduler; + this.q = []; + this.observers = []; + this.isStopped = false; + this.isDisposed = false; + this.hasError = false; + this.error = null; + _super.call(this, subscribe); + } + + addProperties(ReplaySubject.prototype, Observer, { + /** + * Indicates whether the subject has observers subscribed to it. + * @returns {Boolean} Indicates whether the subject has observers subscribed to it. + */ + hasObservers: function () { + return this.observers.length > 0; + }, + /* @private */ + _trim: function (now) { + while (this.q.length > this.bufferSize) { + this.q.shift(); + } + while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) { + this.q.shift(); + } + }, + /** + * Notifies all subscribed observers about the arrival of the specified element in the sequence. + * @param {Mixed} value The value to send to all observers. + */ + onNext: function (value) { + var observer; + checkDisposed.call(this); + if (!this.isStopped) { + var now = this.scheduler.now(); + this.q.push({ interval: now, value: value }); + this._trim(now); + + var o = this.observers.slice(0); + for (var i = 0, len = o.length; i < len; i++) { + observer = o[i]; + observer.onNext(value); + observer.ensureActive(); + } + } + }, + /** + * Notifies all subscribed observers about the exception. + * @param {Mixed} error The exception to send to all observers. + */ + onError: function (error) { + var observer; + checkDisposed.call(this); + if (!this.isStopped) { + this.isStopped = true; + this.error = error; + this.hasError = true; + var now = this.scheduler.now(); + this._trim(now); + var o = this.observers.slice(0); + for (var i = 0, len = o.length; i < len; i++) { + observer = o[i]; + observer.onError(error); + observer.ensureActive(); + } + this.observers = []; + } + }, + /** + * Notifies all subscribed observers about the end of the sequence. + */ + onCompleted: function () { + var observer; + checkDisposed.call(this); + if (!this.isStopped) { + this.isStopped = true; + var now = this.scheduler.now(); + this._trim(now); + var o = this.observers.slice(0); + for (var i = 0, len = o.length; i < len; i++) { + observer = o[i]; + observer.onCompleted(); + observer.ensureActive(); + } + this.observers = []; + } + }, + /** + * Unsubscribe all observers and release resources. + */ + dispose: function () { + this.isDisposed = true; + this.observers = null; + } + }); + + return ReplaySubject; + }(Observable)); + + if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) { + root.Rx = Rx; + + define(function() { + return Rx; + }); + } else if (freeExports && freeModule) { + // in Node.js or RingoJS + if (moduleExports) { + (freeModule.exports = Rx).Rx = Rx; + } else { + freeExports.Rx = Rx; + } + } else { + // in a browser or Rhino + root.Rx = Rx; + } +}.call(this)); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.lite.min.js b/ajax/libs/rxjs/2.2.28/rx.lite.min.js new file mode 100644 index 000000000..34df4472a --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.lite.min.js @@ -0,0 +1,2 @@ +(function(t){function e(){if(this.isDisposed)throw Error(V)}function n(t){var e=typeof t;return t&&("function"==e||"object"==e)||!1}function r(t){var e=[];if(!n(t))return e;ue.nonEnumArgs&&t.length&&u(t)&&(t=ae.call(t));var r=ue.enumPrototypes&&"function"==typeof t,i=ue.enumErrorProps&&(t===ee||t instanceof Error);for(var o in t)r&&"prototype"==o||i&&("message"==o||"name"==o)||e.push(o);if(ue.nonEnumShadows&&t!==ne){var s=t.constructor,c=-1,a=oe.length;if(t===(s&&s.prototype))var h=t===stringProto?X:t===ee?Q:G.call(t),l=se[h];for(;a>++c;)o=oe[c],l&&l[o]||!Y.call(t,o)||e.push(o)}return e}function i(t,e,n){for(var r=-1,i=n(t),o=i.length;o>++r;){var s=i[r];if(e(t[s],s,t)===!1)break}return t}function o(t,e){return i(t,e,r)}function s(t){return"function"!=typeof t.toString&&"string"==typeof(t+"")}function u(t){return t&&"object"==typeof t?G.call(t)==F:!1}function c(t){return"function"==typeof t||!1}function a(e,n,r,i){if(e===n)return 0!==e||1/e==1/n;var h=typeof e,l=typeof n;if(e===e&&(null==e||null==n||"function"!=h&&"object"!=h&&"function"!=l&&"object"!=l))return!1;var f=G.call(e),p=G.call(n);if(f==F&&(f=J),p==F&&(p=J),f!=p)return!1;switch(f){case U:case H:return+e==+n;case K:return e!=+e?n!=+n:0==e?1/e==1/n:e==+n;case Z:case X:return e==n+""}var d=f==B;if(!d){if(f!=J||!ue.nodeClass&&(s(e)||s(n)))return!1;var b=!ue.argsObject&&u(e)?Object:e.constructor,v=!ue.argsObject&&u(n)?Object:n.constructor;if(!(b==v||Y.call(e,"constructor")&&Y.call(n,"constructor")||c(b)&&b instanceof b&&c(v)&&v instanceof v||!("constructor"in e&&"constructor"in n)))return!1}r||(r=[]),i||(i=[]);for(var m=r.length;m--;)if(r[m]==e)return i[m]==n;var y=0;if(result=!0,r.push(e),i.push(n),d){if(m=e.length,y=n.length,result=y==m)for(;y--;){var w=n[y];if(!(result=a(e[y],w,r,i)))break}}else o(n,function(n,o,s){return Y.call(s,o)?(y++,result=Y.call(e,o)&&a(e[o],n,r,i)):t}),result&&o(e,function(e,n,r){return Y.call(r,n)?result=--y>-1:t});return r.pop(),i.pop(),result}function h(t,e){return 1===t.length&&Array.isArray(t[e])?t[e]:ae.call(t)}function l(t,e){for(var n=Array(t),r=0;t>r;r++)n[r]=e();return n}function f(e,n){return new dn(function(r){var i=new Ee,o=new xe;return o.setDisposable(i),i.setDisposable(e.subscribe(r.onNext.bind(r),function(e){var i,s;try{s=n(e)}catch(u){return r.onError(u),t}T(s)&&(s=sn(s)),i=new Ee,o.setDisposable(i),i.setDisposable(s.subscribe(r))},r.onCompleted.bind(r))),o})}function p(e,n){var r=this;return new dn(function(i){var o=0,s=e.length;return r.subscribe(function(r){if(s>o){var u,c=e[o++];try{u=n(r,c)}catch(a){return i.onError(a),t}i.onNext(u)}else i.onCompleted()},i.onError.bind(i),i.onCompleted.bind(i))})}function d(t){return this.map(function(e,n){var r=t(e,n);return T(r)?sn(r):r}).concatAll()}function b(t){return this.select(function(e,n){var r=t(e,n);return T(r)?sn(r):r}).mergeObservable()}function v(t,e,n){if(t.addListener)return t.addListener(e,n),ye(function(){t.removeListener(e,n)});if(t.addEventListener)return t.addEventListener(e,n,!1),ye(function(){t.removeEventListener(e,n,!1)});throw Error("No listener found")}function m(t,e,n){var r=new be;if("function"==typeof t.item&&"number"==typeof t.length)for(var i=0,o=t.length;o>i;i++)r.add(m(t.item(i),e,n));else t&&r.add(v(t,e,n));return r}function y(t,e){var n=Se(t);return new dn(function(t){return e.scheduleWithRelative(n,function(){t.onNext(0),t.onCompleted()})})}function w(t,e,n){return t===e?new dn(function(t){return n.schedulePeriodicWithState(0,e,function(e){return t.onNext(e),e+1})}):Qe(function(){return g(n.now()+t,e,n)})}function g(t,e,n){var r=Se(e);return new dn(function(e){var i=0,o=t;return n.scheduleRecursiveWithAbsolute(o,function(t){var s;r>0&&(s=n.now(),o+=r,s>=o&&(o=s+r)),e.onNext(i++),t(o)})})}function E(t,e){return new dn(function(n){function r(){s&&(s=!1,n.onNext(o)),i&&n.onCompleted()}var i,o,s;return new be(t.subscribe(function(t){s=!0,o=t},n.onError.bind(n),function(){i=!0}),e.subscribe(r,n.onError.bind(n),r))})}function x(e,n,r){return new dn(function(i){function o(e,n){h[n]=e;var o;if(u[n]=!0,c||(c=u.every(j))){try{o=r.apply(null,h)}catch(s){return i.onError(s),t}i.onNext(o)}else a&&i.onCompleted()}var s=2,u=[!1,!1],c=!1,a=!1,h=Array(s);return new be(e.subscribe(function(t){o(t,0)},i.onError.bind(i),function(){a=!0,i.onCompleted()}),n.subscribe(function(t){o(t,1)},i.onError.bind(i)))})}var C={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},D=C[typeof window]&&window||this,S=C[typeof exports]&&exports&&!exports.nodeType&&exports,N=C[typeof module]&&module&&!module.nodeType&&module,A=N&&N.exports===S&&S,_=C[typeof global]&&global;!_||_.global!==_&&_.window!==_||(D=_);var O={internals:{},config:{Promise:D.Promise},helpers:{}},R=O.helpers.noop=function(){},j=O.helpers.identity=function(t){return t},W=(O.helpers.pluck=function(t){return function(e){return e[t]}},O.helpers.just=function(t){return function(){return t}},O.helpers.defaultNow=Date.now),k=O.helpers.defaultComparer=function(t,e){return ce(t,e)},q=O.helpers.defaultSubComparer=function(t,e){return t>e?1:e>t?-1:0},P=(O.helpers.defaultKeySerializer=function(t){return""+t},O.helpers.defaultError=function(t){throw t}),T=O.helpers.isPromise=function(t){return!!t&&"function"==typeof t.then&&t.then!==O.Observable.prototype.then};O.helpers.asArray=function(){return Array.prototype.slice.call(arguments)},O.helpers.not=function(t){return!t};var L="Argument out of range",V="Object has been disposed",z="object"==typeof Symbol&&Symbol.iterator||"_es6shim_iterator_";D.Set&&"function"==typeof(new D.Set)["@@iterator"]&&(z="@@iterator");var M,I={done:!0,value:t},F="[object Arguments]",B="[object Array]",U="[object Boolean]",H="[object Date]",Q="[object Error]",$="[object Function]",K="[object Number]",J="[object Object]",Z="[object RegExp]",X="[object String]",G=Object.prototype.toString,Y=Object.prototype.hasOwnProperty,te=G.call(arguments)==F,ee=Error.prototype,ne=Object.prototype,re=ne.propertyIsEnumerable;try{M=!(G.call(document)==J&&!({toString:0}+""))}catch(ie){M=!0}var oe=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],se={};se[B]=se[H]=se[K]={constructor:!0,toLocaleString:!0,toString:!0,valueOf:!0},se[U]=se[X]={constructor:!0,toString:!0,valueOf:!0},se[Q]=se[$]=se[Z]={constructor:!0,toString:!0},se[J]={constructor:!0};var ue={};(function(){var t=function(){this.x=1},e=[];t.prototype={valueOf:1,y:1};for(var n in new t)e.push(n);for(n in arguments);ue.enumErrorProps=re.call(ee,"message")||re.call(ee,"name"),ue.enumPrototypes=re.call(t,"prototype"),ue.nonEnumArgs=0!=n,ue.nonEnumShadows=!/valueOf/.test(e)})(1),te||(u=function(t){return t&&"object"==typeof t?Y.call(t,"callee"):!1}),c(/x/)&&(c=function(t){return"function"==typeof t&&G.call(t)==$});var ce=O.internals.isEqual=function(t,e){return a(t,e,[],[])},ae=Array.prototype.slice;({}).hasOwnProperty;var he=this.inherits=O.internals.inherits=function(t,e){function n(){this.constructor=t}n.prototype=e.prototype,t.prototype=new n},le=O.internals.addProperties=function(t){for(var e=ae.call(arguments,1),n=0,r=e.length;r>n;n++){var i=e[n];for(var o in i)t[o]=i[o]}};O.internals.addRef=function(t,e){return new dn(function(n){return new be(e.getDisposable(),t.subscribe(n))})};var fe=function(t,e){this.id=t,this.value=e};fe.prototype.compareTo=function(t){var e=this.value.compareTo(t.value);return 0===e&&(e=this.id-t.id),e};var pe=O.internals.PriorityQueue=function(t){this.items=Array(t),this.length=0},de=pe.prototype;de.isHigherPriority=function(t,e){return 0>this.items[t].compareTo(this.items[e])},de.percolate=function(t){if(!(t>=this.length||0>t)){var e=t-1>>1;if(!(0>e||e===t)&&this.isHigherPriority(t,e)){var n=this.items[t];this.items[t]=this.items[e],this.items[e]=n,this.percolate(e)}}},de.heapify=function(e){if(e===t&&(e=0),!(e>=this.length||0>e)){var n=2*e+1,r=2*e+2,i=e;if(this.length>n&&this.isHigherPriority(n,i)&&(i=n),this.length>r&&this.isHigherPriority(r,i)&&(i=r),i!==e){var o=this.items[e];this.items[e]=this.items[i],this.items[i]=o,this.heapify(i)}}},de.peek=function(){return this.items[0].value},de.removeAt=function(t){this.items[t]=this.items[--this.length],delete this.items[this.length],this.heapify()},de.dequeue=function(){var t=this.peek();return this.removeAt(0),t},de.enqueue=function(t){var e=this.length++;this.items[e]=new fe(pe.count++,t),this.percolate(e)},de.remove=function(t){for(var e=0;this.length>e;e++)if(this.items[e].value===t)return this.removeAt(e),!0;return!1},pe.count=0;var be=O.CompositeDisposable=function(){this.disposables=h(arguments,0),this.isDisposed=!1,this.length=this.disposables.length},ve=be.prototype;ve.add=function(t){this.isDisposed?t.dispose():(this.disposables.push(t),this.length++)},ve.remove=function(t){var e=!1;if(!this.isDisposed){var n=this.disposables.indexOf(t);-1!==n&&(e=!0,this.disposables.splice(n,1),this.length--,t.dispose())}return e},ve.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;var t=this.disposables.slice(0);this.disposables=[],this.length=0;for(var e=0,n=t.length;n>e;e++)t[e].dispose()}},ve.clear=function(){var t=this.disposables.slice(0);this.disposables=[],this.length=0;for(var e=0,n=t.length;n>e;e++)t[e].dispose()},ve.contains=function(t){return-1!==this.disposables.indexOf(t)},ve.toArray=function(){return this.disposables.slice(0)};var me=O.Disposable=function(t){this.isDisposed=!1,this.action=t||R};me.prototype.dispose=function(){this.isDisposed||(this.action(),this.isDisposed=!0)};var ye=me.create=function(t){return new me(t)},we=me.empty={dispose:R},ge=function(){function t(t){this.isSingle=t,this.isDisposed=!1,this.current=null}var e=t.prototype;return e.getDisposable=function(){return this.current},e.setDisposable=function(t){if(this.current&&this.isSingle)throw Error("Disposable has already been assigned");var e,n=this.isDisposed;n||(e=this.current,this.current=t),e&&e.dispose(),n&&t&&t.dispose()},e.dispose=function(){var t;this.isDisposed||(this.isDisposed=!0,t=this.current,this.current=null),t&&t.dispose()},t}(),Ee=O.SingleAssignmentDisposable=function(t){function e(){t.call(this,!0)}return he(e,t),e}(ge),xe=O.SerialDisposable=function(t){function e(){t.call(this,!1)}return he(e,t),e}(ge);O.RefCountDisposable=function(){function t(t){this.disposable=t,this.disposable.count++,this.isInnerDisposed=!1}function e(t){this.underlyingDisposable=t,this.isDisposed=!1,this.isPrimaryDisposed=!1,this.count=0}return t.prototype.dispose=function(){this.disposable.isDisposed||this.isInnerDisposed||(this.isInnerDisposed=!0,this.disposable.count--,0===this.disposable.count&&this.disposable.isPrimaryDisposed&&(this.disposable.isDisposed=!0,this.disposable.underlyingDisposable.dispose()))},e.prototype.dispose=function(){this.isDisposed||this.isPrimaryDisposed||(this.isPrimaryDisposed=!0,0===this.count&&(this.isDisposed=!0,this.underlyingDisposable.dispose()))},e.prototype.getDisposable=function(){return this.isDisposed?we:new t(this)},e}();var Ce=O.internals.ScheduledItem=function(t,e,n,r,i){this.scheduler=t,this.state=e,this.action=n,this.dueTime=r,this.comparer=i||q,this.disposable=new Ee};Ce.prototype.invoke=function(){this.disposable.setDisposable(this.invokeCore())},Ce.prototype.compareTo=function(t){return this.comparer(this.dueTime,t.dueTime)},Ce.prototype.isCancelled=function(){return this.disposable.isDisposed},Ce.prototype.invokeCore=function(){return this.action(this.scheduler,this.state)};var De=O.Scheduler=function(){function t(t,e,n,r){this.now=t,this._schedule=e,this._scheduleRelative=n,this._scheduleAbsolute=r}function e(t,e){var n=e.first,r=e.second,i=new be,o=function(e){r(e,function(e){var n=!1,r=!1,s=t.scheduleWithState(e,function(t,e){return n?i.remove(s):r=!0,o(e),we});r||(i.add(s),n=!0)})};return o(n),i}function n(t,e,n){var r=e.first,i=e.second,o=new be,s=function(e){i(e,function(e,r){var i=!1,u=!1,c=t[n].call(t,e,r,function(t,e){return i?o.remove(c):u=!0,s(e),we});u||(o.add(c),i=!0)})};return s(r),o}function r(t,e){return e(),we}var i=t.prototype;return i.schedulePeriodic=function(t,e){return this.schedulePeriodicWithState(null,t,function(){e()})},i.schedulePeriodicWithState=function(t,e,n){var r=t,i=setInterval(function(){r=n(r)},e);return ye(function(){clearInterval(i)})},i.schedule=function(t){return this._schedule(t,r)},i.scheduleWithState=function(t,e){return this._schedule(t,e)},i.scheduleWithRelative=function(t,e){return this._scheduleRelative(e,t,r)},i.scheduleWithRelativeAndState=function(t,e,n){return this._scheduleRelative(t,e,n)},i.scheduleWithAbsolute=function(t,e){return this._scheduleAbsolute(e,t,r)},i.scheduleWithAbsoluteAndState=function(t,e,n){return this._scheduleAbsolute(t,e,n)},i.scheduleRecursive=function(t){return this.scheduleRecursiveWithState(t,function(t,e){t(function(){e(t)})})},i.scheduleRecursiveWithState=function(t,n){return this.scheduleWithState({first:t,second:n},function(t,n){return e(t,n)})},i.scheduleRecursiveWithRelative=function(t,e){return this.scheduleRecursiveWithRelativeAndState(e,t,function(t,e){t(function(n){e(t,n)})})},i.scheduleRecursiveWithRelativeAndState=function(t,e,r){return this._scheduleRelative({first:t,second:r},e,function(t,e){return n(t,e,"scheduleWithRelativeAndState")})},i.scheduleRecursiveWithAbsolute=function(t,e){return this.scheduleRecursiveWithAbsoluteAndState(e,t,function(t,e){t(function(n){e(t,n)})})},i.scheduleRecursiveWithAbsoluteAndState=function(t,e,r){return this._scheduleAbsolute({first:t,second:r},e,function(t,e){return n(t,e,"scheduleWithAbsoluteAndState")})},t.now=W,t.normalize=function(t){return 0>t&&(t=0),t},t}(),Se=De.normalize,Ne=De.immediate=function(){function t(t,e){return e(this,t)}function e(t,e,n){for(var r=Se(r);r-this.now()>0;);return n(this,t)}function n(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}return new De(W,t,e,n)}(),Ae=De.currentThread=function(){function t(t){for(var e;t.length>0;)if(e=t.dequeue(),!e.isCancelled()){for(;e.dueTime-De.now()>0;);e.isCancelled()||e.invoke()}}function e(t,e){return this.scheduleWithRelativeAndState(t,0,e)}function n(e,n,r){var o=this.now()+De.normalize(n),s=new Ce(this,e,r,o);if(i)i.enqueue(s);else{i=new pe(4),i.enqueue(s);try{t(i)}catch(u){throw u}finally{i=null}}return s.disposable}function r(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}var i,o=new De(W,e,n,r);return o.scheduleRequired=function(){return null===i},o.ensureTrampoline=function(t){return null===i?this.schedule(t):t()},o}();O.internals.SchedulePeriodicRecursive=function(){function t(t,e){e(0,this._period);try{this._state=this._action(this._state)}catch(n){throw this._cancel.dispose(),n}}function e(t,e,n,r){this._scheduler=t,this._state=e,this._period=n,this._action=r}return e.prototype.start=function(){var e=new Ee;return this._cancel=e,e.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0,this._period,t.bind(this))),e},e}();var _e,Oe=R;(function(){function t(){if(!D.postMessage||D.importScripts)return!1;var t=!1,e=D.onmessage;return D.onmessage=function(){t=!0},D.postMessage("","*"),D.onmessage=e,t}function e(t){if("string"==typeof t.data&&t.data.substring(0,o.length)===o){var e=t.data.substring(o.length),n=s[e];n(),delete s[e]}}var n=RegExp("^"+(G+"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),r="function"==typeof(r=_&&A&&_.setImmediate)&&!n.test(r)&&r,i="function"==typeof(i=_&&A&&_.clearImmediate)&&!n.test(i)&&i;if("undefined"!=typeof process&&"[object process]"==={}.toString.call(process))_e=process.nextTick;else if("function"==typeof r)_e=r,Oe=i;else if(t()){var o="ms.rx.schedule"+Math.random(),s={},u=0;D.addEventListener?D.addEventListener("message",e,!1):D.attachEvent("onmessage",e,!1),_e=function(t){var e=u++;s[e]=t,D.postMessage(o+e,"*")}}else if(D.MessageChannel){var c=new D.MessageChannel,a={},h=0;c.port1.onmessage=function(t){var e=t.data,n=a[e];n(),delete a[e]},_e=function(t){var e=h++;a[e]=t,c.port2.postMessage(e)}}else"document"in D&&"onreadystatechange"in D.document.createElement("script")?_e=function(t){var e=D.document.createElement("script");e.onreadystatechange=function(){t(),e.onreadystatechange=null,e.parentNode.removeChild(e),e=null},D.document.documentElement.appendChild(e)}:(_e=function(t){return setTimeout(t,0)},Oe=clearTimeout)})();var Re=De.timeout=function(){function t(t,e){var n=this,r=new Ee,i=_e(function(){r.isDisposed||r.setDisposable(e(n,t))});return new be(r,ye(function(){Oe(i)}))}function e(t,e,n){var r=this,i=De.normalize(e);if(0===i)return r.scheduleWithState(t,n);var o=new Ee,s=setTimeout(function(){o.isDisposed||o.setDisposable(n(r,t))},i);return new be(o,ye(function(){clearTimeout(s)}))}function n(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}return new De(W,t,e,n)}(),je=O.Notification=function(){function t(t,e){this.hasValue=null==e?!1:e,this.kind=t}var e=t.prototype;return e.accept=function(t,e,n){return 1===arguments.length&&"object"==typeof t?this._acceptObservable(t):this._accept(t,e,n)},e.toObservable=function(t){var e=this;return t||(t=Ne),new dn(function(n){return t.schedule(function(){e._acceptObservable(n),"N"===e.kind&&n.onCompleted()})})},t}(),We=je.createOnNext=function(){function t(t){return t(this.value)}function e(t){return t.onNext(this.value)}function n(){return"OnNext("+this.value+")"}return function(r){var i=new je("N",!0);return i.value=r,i._accept=t,i._acceptObservable=e,i.toString=n,i}}(),ke=je.createOnError=function(){function t(t,e){return e(this.exception)}function e(t){return t.onError(this.exception)}function n(){return"OnError("+this.exception+")"}return function(r){var i=new je("E");return i.exception=r,i._accept=t,i._acceptObservable=e,i.toString=n,i}}(),qe=je.createOnCompleted=function(){function t(t,e,n){return n()}function e(t){return t.onCompleted()}function n(){return"OnCompleted()"}return function(){var r=new je("C");return r._accept=t,r._acceptObservable=e,r.toString=n,r}}(),Pe=O.internals.Enumerator=function(t){this._next=t};Pe.prototype.next=function(){return this._next()},Pe.prototype[z]=function(){return this};var Te=O.internals.Enumerable=function(t){this._iterator=t};Te.prototype[z]=function(){return this._iterator()},Te.prototype.concat=function(){var e=this;return new dn(function(n){var r;try{r=e[z]()}catch(i){return n.onError(),t}var o,s=new xe,u=Ne.scheduleRecursive(function(e){var i;if(!o){try{i=r.next()}catch(u){return n.onError(u),t}if(i.done)return n.onCompleted(),t;var c=i.value;T(c)&&(c=sn(c));var a=new Ee;s.setDisposable(a),a.setDisposable(c.subscribe(n.onNext.bind(n),n.onError.bind(n),function(){e()}))}});return new be(s,u,ye(function(){o=!0}))})},Te.prototype.catchException=function(){var e=this;return new dn(function(n){var r;try{r=e[z]()}catch(i){return n.onError(),t}var o,s,u=new xe,c=Ne.scheduleRecursive(function(e){if(!o){var i;try{i=r.next()}catch(c){return n.onError(c),t}if(i.done)return s?n.onError(s):n.onCompleted(),t;var a=i.value;T(a)&&(a=sn(a));var h=new Ee;u.setDisposable(h),h.setDisposable(a.subscribe(n.onNext.bind(n),function(t){s=t,e()},n.onCompleted.bind(n)))}});return new be(u,c,ye(function(){o=!0}))})};var Le=Te.repeat=function(t,e){return null==e&&(e=-1),new Te(function(){var n=e;return new Pe(function(){return 0===n?I:(n>0&&n--,{done:!1,value:t})})})},Ve=Te.forEach=function(t,e,n){return e||(e=j),new Te(function(){var r=-1;return new Pe(function(){return++r0&&(e=!this.isAcquired,this.isAcquired=!0),e&&this.disposable.setDisposable(this.scheduler.scheduleRecursive(function(e){var r;if(!(n.queue.length>0))return n.isAcquired=!1,t;r=n.queue.shift();try{r()}catch(i){throw n.queue=[],n.hasFaulted=!0,i}e()}))},n.prototype.dispose=function(){e.prototype.dispose.call(this),this.disposable.dispose()},n}(Fe);Ie.toArray=function(){var t=this;return new dn(function(e){var n=[];return t.subscribe(n.push.bind(n),e.onError.bind(e),function(){e.onNext(n),e.onCompleted()})})},Ue.create=Ue.createWithDisposable=function(t){return new dn(t)};var Qe=Ue.defer=function(t){return new dn(function(e){var n;try{n=t()}catch(r){return Xe(r).subscribe(e)}return T(n)&&(n=sn(n)),n.subscribe(e)})},$e=Ue.empty=function(t){return t||(t=Ne),new dn(function(e){return t.schedule(function(){e.onCompleted()})})},Ke=Ue.fromArray=function(t,e){return e||(e=Ae),new dn(function(n){var r=0,i=t.length;return e.scheduleRecursive(function(e){i>r?(n.onNext(t[r++]),e()):n.onCompleted()})})};Ue.fromIterable=function(e,n){return n||(n=Ae),new dn(function(r){var i;try{i=e[z]()}catch(o){return r.onError(o),t}return n.scheduleRecursive(function(e){var n;try{n=i.next()}catch(o){return r.onError(o),t}n.done?r.onCompleted():(r.onNext(n.value),e())})})},Ue.generate=function(e,n,r,i,o){return o||(o=Ae),new dn(function(s){var u=!0,c=e;return o.scheduleRecursive(function(e){var o,a;try{u?u=!1:c=r(c),o=n(c),o&&(a=i(c))}catch(h){return s.onError(h),t}o?(s.onNext(a),e()):s.onCompleted()})})};var Je=Ue.never=function(){return new dn(function(){return we})};Ue.of=function(){for(var t=arguments.length,e=Array(t),n=0;t>n;n++)e[n]=arguments[n];return Ke(e)},Ue.ofWithScheduler=function(t){for(var e=arguments.length-1,n=Array(e),r=0;e>r;r++)n[r]=arguments[r+1];return Ke(n,t)},Ue.range=function(t,e,n){return n||(n=Ae),new dn(function(r){return n.scheduleRecursiveWithState(0,function(n,i){e>n?(r.onNext(t+n),i(n+1)):r.onCompleted()})})},Ue.repeat=function(t,e,n){return n||(n=Ae),null==e&&(e=-1),Ze(t,n).repeat(e)};var Ze=Ue["return"]=Ue.returnValue=Ue.just=function(t,e){return e||(e=Ne),new dn(function(n){return e.schedule(function(){n.onNext(t),n.onCompleted()})})},Xe=Ue["throw"]=Ue.throwException=function(t,e){return e||(e=Ne),new dn(function(n){return e.schedule(function(){n.onError(t)})})};Ie["catch"]=Ie.catchException=function(t){return"function"==typeof t?f(this,t):Ge([this,t])};var Ge=Ue.catchException=Ue["catch"]=function(){var t=h(arguments,0);return Ve(t).catchException()};Ie.combineLatest=function(){var t=ae.call(arguments);return Array.isArray(t[0])?t[0].unshift(this):t.unshift(this),Ye.apply(this,t)};var Ye=Ue.combineLatest=function(){var e=ae.call(arguments),n=e.pop();return Array.isArray(e[0])&&(e=e[0]),new dn(function(r){function i(e){var i;if(c[e]=!0,a||(a=c.every(j))){try{i=n.apply(null,f)}catch(o){return r.onError(o),t}r.onNext(i)}else h.filter(function(t,n){return n!==e}).every(j)&&r.onCompleted()}function o(t){h[t]=!0,h.every(j)&&r.onCompleted()}for(var s=function(){return!1},u=e.length,c=l(u,s),a=!1,h=l(u,s),f=Array(u),p=Array(u),d=0;u>d;d++)(function(t){var n=e[t],s=new Ee;T(n)&&(n=sn(n)),s.setDisposable(n.subscribe(function(e){f[t]=e,i(t)},r.onError.bind(r),function(){o(t)})),p[t]=s})(d);return new be(p)})};Ie.concat=function(){var t=ae.call(arguments,0);return t.unshift(this),tn.apply(this,t)};var tn=Ue.concat=function(){var t=h(arguments,0);return Ve(t).concat()};Ie.concatObservable=Ie.concatAll=function(){return this.merge(1)},Ie.merge=function(t){if("number"!=typeof t)return en(this,t);var e=this;return new dn(function(n){var r=0,i=new be,o=!1,s=[],u=function(t){var e=new Ee;i.add(e),T(t)&&(t=sn(t)),e.setDisposable(t.subscribe(n.onNext.bind(n),n.onError.bind(n),function(){var t;i.remove(e),s.length>0?(t=s.shift(),u(t)):(r--,o&&0===r&&n.onCompleted())}))};return i.add(e.subscribe(function(e){t>r?(r++,u(e)):s.push(e)},n.onError.bind(n),function(){o=!0,0===r&&n.onCompleted()})),i})};var en=Ue.merge=function(){var t,e;return arguments[0]?arguments[0].now?(t=arguments[0],e=ae.call(arguments,1)):(t=Ne,e=ae.call(arguments,0)):(t=Ne,e=ae.call(arguments,1)),Array.isArray(e[0])&&(e=e[0]),Ke(e,t).mergeObservable()};Ie.mergeObservable=Ie.mergeAll=function(){var t=this;return new dn(function(e){var n=new be,r=!1,i=new Ee;return n.add(i),i.setDisposable(t.subscribe(function(t){var i=new Ee;n.add(i),T(t)&&(t=sn(t)),i.setDisposable(t.subscribe(function(t){e.onNext(t)},e.onError.bind(e),function(){n.remove(i),r&&1===n.length&&e.onCompleted()}))},e.onError.bind(e),function(){r=!0,1===n.length&&e.onCompleted()})),n})},Ie.skipUntil=function(t){var e=this;return new dn(function(n){var r=!1,i=new be(e.subscribe(function(t){r&&n.onNext(t)},n.onError.bind(n),function(){r&&n.onCompleted()}));T(t)&&(t=sn(t));var o=new Ee;return i.add(o),o.setDisposable(t.subscribe(function(){r=!0,o.dispose()},n.onError.bind(n),function(){o.dispose()})),i})},Ie["switch"]=Ie.switchLatest=function(){var t=this;return new dn(function(e){var n=!1,r=new xe,i=!1,o=0,s=t.subscribe(function(t){var s=new Ee,u=++o;n=!0,r.setDisposable(s),T(t)&&(t=sn(t)),s.setDisposable(t.subscribe(function(t){o===u&&e.onNext(t)},function(t){o===u&&e.onError(t)},function(){o===u&&(n=!1,i&&e.onCompleted())}))},e.onError.bind(e),function(){i=!0,n||e.onCompleted()});return new be(s,r)})},Ie.takeUntil=function(t){var e=this;return new dn(function(n){return T(t)&&(t=sn(t)),new be(e.subscribe(n),t.subscribe(n.onCompleted.bind(n),n.onError.bind(n),R))})},Ie.zip=function(){if(Array.isArray(arguments[0]))return p.apply(this,arguments);var e=this,n=ae.call(arguments),r=n.pop();return n.unshift(e),new dn(function(i){function o(n){var o,s;if(c.every(function(t){return t.length>0})){try{s=c.map(function(t){return t.shift()}),o=r.apply(e,s)}catch(u){return i.onError(u),t}i.onNext(o)}else a.filter(function(t,e){return e!==n}).every(j)&&i.onCompleted()}function s(t){a[t]=!0,a.every(function(t){return t})&&i.onCompleted()}for(var u=n.length,c=l(u,function(){return[]}),a=l(u,function(){return!1}),h=Array(u),f=0;u>f;f++)(function(t){var e=n[t],r=new Ee;T(e)&&(e=sn(e)),r.setDisposable(e.subscribe(function(e){c[t].push(e),o(t)},i.onError.bind(i),function(){s(t)})),h[t]=r})(f);return new be(h)})},Ue.zip=function(){var t=ae.call(arguments,0),e=t.shift();return e.zip.apply(e,t)},Ue.zipArray=function(){var e=h(arguments,0);return new dn(function(n){function r(e){if(s.every(function(t){return t.length>0})){var r=s.map(function(t){return t.shift()});n.onNext(r)}else if(u.filter(function(t,n){return n!==e}).every(j))return n.onCompleted(),t}function i(e){return u[e]=!0,u.every(j)?(n.onCompleted(),t):t}for(var o=e.length,s=l(o,function(){return[]}),u=l(o,function(){return!1}),c=Array(o),a=0;o>a;a++)(function(t){c[t]=new Ee,c[t].setDisposable(e[t].subscribe(function(e){s[t].push(e),r(t)},n.onError.bind(n),function(){i(t)}))})(a);var h=new be(c);return h.add(ye(function(){for(var t=0,e=s.length;e>t;t++)s[t]=[]})),h})},Ie.asObservable=function(){var t=this;return new dn(function(e){return t.subscribe(e)})},Ie.dematerialize=function(){var t=this;return new dn(function(e){return t.subscribe(function(t){return t.accept(e)},e.onError.bind(e),e.onCompleted.bind(e))})},Ie.distinctUntilChanged=function(e,n){var r=this;return e||(e=j),n||(n=k),new dn(function(i){var o,s=!1;return r.subscribe(function(r){var u,c=!1;try{u=e(r)}catch(a){return i.onError(a),t}if(s)try{c=n(o,u)}catch(a){return i.onError(a),t}s&&c||(s=!0,o=u,i.onNext(r))},i.onError.bind(i),i.onCompleted.bind(i))})},Ie["do"]=Ie.doAction=function(t,e,n){var r,i=this;return"function"==typeof t?r=t:(r=t.onNext.bind(t),e=t.onError.bind(t),n=t.onCompleted.bind(t)),new dn(function(t){return i.subscribe(function(e){try{r(e)}catch(n){t.onError(n)}t.onNext(e)},function(n){if(e){try{e(n)}catch(r){t.onError(r)}t.onError(n)}else t.onError(n)},function(){if(n){try{n()}catch(e){t.onError(e)}t.onCompleted()}else t.onCompleted()})})},Ie["finally"]=Ie.finallyAction=function(t){var e=this;return new dn(function(n){var r;try{r=e.subscribe(n)}catch(i){throw t(),i}return ye(function(){try{r.dispose()}catch(e){throw e}finally{t()}})})},Ie.ignoreElements=function(){var t=this;return new dn(function(e){return t.subscribe(R,e.onError.bind(e),e.onCompleted.bind(e))})},Ie.materialize=function(){var t=this;return new dn(function(e){return t.subscribe(function(t){e.onNext(We(t))},function(t){e.onNext(ke(t)),e.onCompleted()},function(){e.onNext(qe()),e.onCompleted()})})},Ie.repeat=function(t){return Le(this,t).concat()},Ie.retry=function(t){return Le(this,t).catchException()},Ie.scan=function(){var e,n,r=!1,i=this;return 2===arguments.length?(r=!0,e=arguments[0],n=arguments[1]):n=arguments[0],new dn(function(o){var s,u,c;return i.subscribe(function(i){try{c||(c=!0),s?u=n(u,i):(u=r?n(e,i):i,s=!0)}catch(a){return o.onError(a),t}o.onNext(u)},o.onError.bind(o),function(){!c&&r&&o.onNext(e),o.onCompleted()})})},Ie.skipLast=function(t){var e=this;return new dn(function(n){var r=[];return e.subscribe(function(e){r.push(e),r.length>t&&n.onNext(r.shift())},n.onError.bind(n),n.onCompleted.bind(n))})},Ie.startWith=function(){var t,e,n=0;return arguments.length&&"now"in Object(arguments[0])?(e=arguments[0],n=1):e=Ne,t=ae.call(arguments,n),Ve([Ke(t,e),this]).concat()},Ie.takeLast=function(t,e){return this.takeLastBuffer(t).selectMany(function(t){return Ke(t,e)})},Ie.takeLastBuffer=function(t){var e=this;return new dn(function(n){var r=[];return e.subscribe(function(e){r.push(e),r.length>t&&r.shift()},n.onError.bind(n),function(){n.onNext(r),n.onCompleted()})})},Ie.selectConcat=Ie.concatMap=function(t,e){return e?this.concatMap(function(n,r){var i=t(n,r),o=T(i)?sn(i):i;return o.map(function(t){return e(n,t,r)})}):"function"==typeof t?d.call(this,t):d.call(this,function(){return t})},Ie.select=Ie.map=function(e,n){var r=this;return new dn(function(i){var o=0;return r.subscribe(function(s){var u;try{u=e.call(n,s,o++,r)}catch(c){return i.onError(c),t}i.onNext(u)},i.onError.bind(i),i.onCompleted.bind(i))})},Ie.pluck=function(t){return this.select(function(e){return e[t]})},Ie.selectMany=Ie.flatMap=function(t,e){return e?this.selectMany(function(n,r){var i=t(n,r),o=T(i)?sn(i):i;return o.select(function(t){return e(n,t,r)})}):"function"==typeof t?b.call(this,t):b.call(this,function(){return t})},Ie.selectSwitch=Ie.flatMapLatest=Ie.switchMap=function(t,e){return this.select(t,e).switchLatest()},Ie.skip=function(t){if(0>t)throw Error(L);var e=this;return new dn(function(n){var r=t;return e.subscribe(function(t){0>=r?n.onNext(t):r--},n.onError.bind(n),n.onCompleted.bind(n)) +})},Ie.skipWhile=function(e,n){var r=this;return new dn(function(i){var o=0,s=!1;return r.subscribe(function(u){if(!s)try{s=!e.call(n,u,o++,r)}catch(c){return i.onError(c),t}s&&i.onNext(u)},i.onError.bind(i),i.onCompleted.bind(i))})},Ie.take=function(t,e){if(0>t)throw Error(L);if(0===t)return $e(e);var n=this;return new dn(function(e){var r=t;return n.subscribe(function(t){r>0&&(r--,e.onNext(t),0===r&&e.onCompleted())},e.onError.bind(e),e.onCompleted.bind(e))})},Ie.takeWhile=function(e,n){var r=this;return new dn(function(i){var o=0,s=!0;return r.subscribe(function(u){if(s){try{s=e.call(n,u,o++,r)}catch(c){return i.onError(c),t}s?i.onNext(u):i.onCompleted()}},i.onError.bind(i),i.onCompleted.bind(i))})},Ie.where=Ie.filter=function(e,n){var r=this;return new dn(function(i){var o=0;return r.subscribe(function(s){var u;try{u=e.call(n,s,o++,r)}catch(c){return i.onError(c),t}u&&i.onNext(s)},i.onError.bind(i),i.onCompleted.bind(i))})},Ue.fromCallback=function(e,n,r,i){return n||(n=Ne),function(){var o=ae.call(arguments,0);return new dn(function(s){return n.schedule(function(){function n(e){var n=e;if(i)try{n=i(arguments)}catch(r){return s.onError(r),t}else 1===n.length&&(n=n[0]);s.onNext(n),s.onCompleted()}o.push(n),e.apply(r,o)})})}},Ue.fromNodeCallback=function(e,n,r,i){return n||(n=Ne),function(){var o=ae.call(arguments,0);return new dn(function(s){return n.schedule(function(){function n(e){if(e)return s.onError(e),t;var n=ae.call(arguments,1);if(i)try{n=i(n)}catch(r){return s.onError(r),t}else 1===n.length&&(n=n[0]);s.onNext(n),s.onCompleted()}o.push(n),e.apply(r,o)})})}};var nn=D.angular&&angular.element?angular.element:D.jQuery?D.jQuery:D.Zepto?D.Zepto:null,rn=!!D.Ember&&"function"==typeof D.Ember.addListener;Ue.fromEvent=function(e,n,r){if(rn)return on(function(t){Ember.addListener(e,n,t)},function(t){Ember.removeListener(e,n,t)},r);if(nn){var i=nn(e);return on(function(t){i.on(n,t)},function(t){i.off(n,t)},r)}return new dn(function(i){return m(e,n,function(e){var n=e;if(r)try{n=r(arguments)}catch(o){return i.onError(o),t}i.onNext(n)})}).publish().refCount()};var on=Ue.fromEventPattern=function(e,n,r){return new dn(function(i){function o(e){var n=e;if(r)try{n=r(arguments)}catch(o){return i.onError(o),t}i.onNext(n)}var s=e(o);return ye(function(){n&&n(o,s)})}).publish().refCount()},sn=Ue.fromPromise=function(t){return new dn(function(e){return t.then(function(t){e.onNext(t),e.onCompleted()},function(t){e.onError(t)}),function(){t&&t.abort&&t.abort()}})};Ie.toPromise=function(t){if(t||(t=O.config.Promise),!t)throw Error("Promise type not provided nor in Rx.config.Promise");var e=this;return new t(function(t,n){var r,i=!1;e.subscribe(function(t){r=t,i=!0},function(t){n(t)},function(){i&&t(r)})})},Ue.startAsync=function(t){var e;try{e=t()}catch(n){return Xe(n)}return sn(e)},Ie.multicast=function(t,e){var n=this;return"function"==typeof t?new dn(function(r){var i=n.multicast(t());return new be(e(i).subscribe(r),i.connect())}):new un(n,t)},Ie.publish=function(t){return t?this.multicast(function(){return new mn},t):this.multicast(new mn)},Ie.share=function(){return this.publish(null).refCount()},Ie.publishLast=function(t){return t?this.multicast(function(){return new yn},t):this.multicast(new yn)},Ie.publishValue=function(t,e){return 2===arguments.length?this.multicast(function(){return new gn(e)},t):this.multicast(new gn(t))},Ie.shareValue=function(t){return this.publishValue(t).refCount()},Ie.replay=function(t,e,n,r){return t?this.multicast(function(){return new En(e,n,r)},t):this.multicast(new En(e,n,r))},Ie.shareReplay=function(t,e,n){return this.replay(null,t,e,n).refCount()};var un=O.ConnectableObservable=function(t){function e(e,n){function r(t){return i.subject.subscribe(t)}var i={subject:n,source:e.asObservable(),hasSubscription:!1,subscription:null};this.connect=function(){return i.hasSubscription||(i.hasSubscription=!0,i.subscription=new be(i.source.subscribe(i.subject),ye(function(){i.hasSubscription=!1}))),i.subscription},t.call(this,r)}return he(e,t),e.prototype.connect=function(){return this.connect()},e.prototype.refCount=function(){var t=null,e=0,n=this;return new dn(function(r){var i,o;return e++,i=1===e,o=n.subscribe(r),i&&(t=n.connect()),ye(function(){o.dispose(),e--,0===e&&t.dispose()})})},e}(Ue),cn=Ue.interval=function(t,e){return e||(e=Re),w(t,t,e)},an=Ue.timer=function(e,n,r){var i;return r||(r=Re),"number"==typeof n?i=n:"object"==typeof n&&"now"in n&&(r=n),i===t?y(e,r):w(e,i,r)};Ie.delay=function(t,e){e||(e=Re);var n=this;return new dn(function(r){var i,o=!1,s=new xe,u=null,c=[],a=!1;return i=n.materialize().timestamp(e).subscribe(function(n){var i,h;"E"===n.value.kind?(c=[],c.push(n),u=n.value.exception,h=!a):(c.push({value:n.value,timestamp:n.timestamp+t}),h=!o,o=!0),h&&(null!==u?r.onError(u):(i=new Ee,s.setDisposable(i),i.setDisposable(e.scheduleRecursiveWithRelative(t,function(t){var n,i,s,h;if(null===u){a=!0;do s=null,c.length>0&&0>=c[0].timestamp-e.now()&&(s=c.shift().value),null!==s&&s.accept(r);while(null!==s);h=!1,i=0,c.length>0?(h=!0,i=Math.max(0,c[0].timestamp-e.now())):o=!1,n=u,a=!1,null!==n?r.onError(n):h&&t(i)}}))))}),new be(i,s)})},Ie.throttle=function(t,e){return e||(e=Re),this.throttleWithSelector(function(){return an(t,e)})},Ie.timeInterval=function(t){var e=this;return t||(t=Re),Qe(function(){var n=t.now();return e.select(function(e){var r=t.now(),i=r-n;return n=r,{value:e,interval:i}})})},Ie.timestamp=function(t){return t||(t=Re),this.select(function(e){return{value:e,timestamp:t.now()}})},Ie.sample=function(t,e){return e||(e=Re),"number"==typeof t?E(this,cn(t,e)):E(this,t)},Ie.timeout=function(t,e,n){e||(e=Xe(Error("Timeout"))),n||(n=Re);var r=this,i=t instanceof Date?"scheduleWithAbsolute":"scheduleWithRelative";return new dn(function(o){var s=0,u=new Ee,c=new xe,a=!1,h=new xe;c.setDisposable(u);var l=function(){var r=s;h.setDisposable(n[i](t,function(){s===r&&(T(e)&&(e=sn(e)),c.setDisposable(e.subscribe(o)))}))};return l(),u.setDisposable(r.subscribe(function(t){a||(s++,o.onNext(t),l())},function(t){a||(s++,o.onError(t))},function(){a||(s++,o.onCompleted())})),new be(c,h)})},Ue.generateWithRelativeTime=function(e,n,r,i,o,s){return s||(s=Re),new dn(function(u){var c,a,h=!0,l=!1,f=e;return s.scheduleRecursiveWithRelative(0,function(e){l&&u.onNext(c);try{h?h=!1:f=r(f),l=n(f),l&&(c=i(f),a=o(f))}catch(s){return u.onError(s),t}l?e(a):u.onCompleted()})})},Ie.delaySubscription=function(t,e){return e||(e=Re),this.delayWithSelector(an(t,e),function(){return $e()})},Ie.delayWithSelector=function(e,n){var r,i,o=this;return"function"==typeof e?i=e:(r=e,i=n),new dn(function(e){var n=new be,s=!1,u=function(){s&&0===n.length&&e.onCompleted()},c=new xe,a=function(){c.setDisposable(o.subscribe(function(r){var o;try{o=i(r)}catch(s){return e.onError(s),t}var c=new Ee;n.add(c),c.setDisposable(o.subscribe(function(){e.onNext(r),n.remove(c),u()},e.onError.bind(e),function(){e.onNext(r),n.remove(c),u()}))},e.onError.bind(e),function(){s=!0,c.dispose(),u()}))};return r?c.setDisposable(r.subscribe(function(){a()},e.onError.bind(e),function(){a()})):a(),new be(c,n)})},Ie.timeoutWithSelector=function(e,n,r){if(1===arguments.length){n=e;var e=Je()}r||(r=Xe(Error("Timeout")));var i=this;return new dn(function(o){var s=new xe,u=new xe,c=new Ee;s.setDisposable(c);var a=0,h=!1,l=function(t){var e=a,n=function(){return a===e},i=new Ee;u.setDisposable(i),i.setDisposable(t.subscribe(function(){n()&&s.setDisposable(r.subscribe(o)),i.dispose()},function(t){n()&&o.onError(t)},function(){n()&&s.setDisposable(r.subscribe(o))}))};l(e);var f=function(){var t=!h;return t&&a++,t};return c.setDisposable(i.subscribe(function(e){if(f()){o.onNext(e);var r;try{r=n(e)}catch(i){return o.onError(i),t}l(r)}},function(t){f()&&o.onError(t)},function(){f()&&o.onCompleted()})),new be(s,u)})},Ie.throttleWithSelector=function(e){var n=this;return new dn(function(r){var i,o=!1,s=new xe,u=0,c=n.subscribe(function(n){var c;try{c=e(n)}catch(a){return r.onError(a),t}o=!0,i=n,u++;var h=u,l=new Ee;s.setDisposable(l),l.setDisposable(c.subscribe(function(){o&&u===h&&r.onNext(i),o=!1,l.dispose()},r.onError.bind(r),function(){o&&u===h&&r.onNext(i),o=!1,l.dispose()}))},function(t){s.dispose(),r.onError(t),o=!1,u++},function(){s.dispose(),o&&r.onNext(i),r.onCompleted(),o=!1,u++});return new be(c,s)})},Ie.skipLastWithTime=function(t,e){e||(e=Re);var n=this;return new dn(function(r){var i=[];return n.subscribe(function(n){var o=e.now();for(i.push({interval:o,value:n});i.length>0&&o-i[0].interval>=t;)r.onNext(i.shift().value)},r.onError.bind(r),function(){for(var n=e.now();i.length>0&&n-i[0].interval>=t;)r.onNext(i.shift().value);r.onCompleted()})})},Ie.takeLastWithTime=function(t,e,n){return this.takeLastBufferWithTime(t,e).selectMany(function(t){return Ke(t,n)})},Ie.takeLastBufferWithTime=function(t,e){var n=this;return e||(e=Re),new dn(function(r){var i=[];return n.subscribe(function(n){var r=e.now();for(i.push({interval:r,value:n});i.length>0&&r-i[0].interval>=t;)i.shift()},r.onError.bind(r),function(){for(var n=e.now(),o=[];i.length>0;){var s=i.shift();t>=n-s.interval&&o.push(s.value)}r.onNext(o),r.onCompleted()})})},Ie.takeWithTime=function(t,e){var n=this;return e||(e=Re),new dn(function(r){var i=e.scheduleWithRelative(t,function(){r.onCompleted()});return new be(i,n.subscribe(r))})},Ie.skipWithTime=function(t,e){var n=this;return e||(e=Re),new dn(function(r){var i=!1,o=e.scheduleWithRelative(t,function(){i=!0}),s=n.subscribe(function(t){i&&r.onNext(t)},r.onError.bind(r),r.onCompleted.bind(r));return new be(o,s)})},Ie.skipUntilWithTime=function(t,e){e||(e=Re);var n=this,r=t instanceof Date?"scheduleWithAbsolute":"scheduleWithRelative";return new dn(function(i){var o=!1;return new be(e[r](t,function(){o=!0}),n.subscribe(function(t){o&&i.onNext(t)},i.onError.bind(i),i.onCompleted.bind(i)))})},Ie.takeUntilWithTime=function(t,e){e||(e=Re);var n=this,r=t instanceof Date?"scheduleWithAbsolute":"scheduleWithRelative";return new dn(function(i){return new be(e[r](t,function(){i.onCompleted()}),n.subscribe(i))})};var hn=function(t){function e(t){var e=this.source.publish(),n=e.subscribe(t),r=we,i=this.subject.distinctUntilChanged().subscribe(function(t){t?r=e.connect():(r.dispose(),r=we)});return new be(n,r,i)}function n(n,r){this.source=n,this.subject=r||new mn,this.isPaused=!0,t.call(this,e)}return he(n,t),n.prototype.pause=function(){this.isPaused!==!0&&(this.isPaused=!0,this.subject.onNext(!1))},n.prototype.resume=function(){this.isPaused!==!1&&(this.isPaused=!1,this.subject.onNext(!0))},n}(Ue);Ie.pausable=function(t){return new hn(this,t)};var ln=function(t){function e(t){var e=[],n=!0,r=x(this.source,this.subject.distinctUntilChanged(),function(t,e){return{data:t,shouldFire:e}}).subscribe(function(r){if(r.shouldFire&&n&&t.onNext(r.data),r.shouldFire&&!n){for(;e.length>0;)t.onNext(e.shift());n=!0}else r.shouldFire||n?!r.shouldFire&&n&&(n=!1):e.push(r.data)},function(n){for(;e.length>0;)t.onNext(e.shift());t.onError(n)},function(){for(;e.length>0;)t.onNext(e.shift());t.onCompleted()});return this.subject.onNext(!1),r}function n(n,r){this.source=n,this.subject=r||new mn,this.isPaused=!0,t.call(this,e)}return he(n,t),n.prototype.pause=function(){this.isPaused!==!0&&(this.isPaused=!0,this.subject.onNext(!1))},n.prototype.resume=function(){this.isPaused!==!1&&(this.isPaused=!1,this.subject.onNext(!0))},n}(Ue);Ie.pausableBuffered=function(t){return new ln(this,t)},Ie.controlled=function(t){return null==t&&(t=!0),new fn(this,t)};var fn=function(t){function e(t){return this.source.subscribe(t)}function n(n,r){t.call(this,e),this.subject=new pn(r),this.source=n.multicast(this.subject).refCount()}return he(n,t),n.prototype.request=function(t){return null==t&&(t=-1),this.subject.request(t)},n}(Ue),pn=O.ControlledSubject=function(t){function n(t){return this.subject.subscribe(t)}function r(e){null==e&&(e=!0),t.call(this,n),this.subject=new mn,this.enableQueue=e,this.queue=e?[]:null,this.requestedCount=0,this.requestedDisposable=we,this.error=null,this.hasFailed=!1,this.hasCompleted=!1,this.controlledDisposable=we}return he(r,t),le(r.prototype,ze,{onCompleted:function(){e.call(this),this.hasCompleted=!0,this.enableQueue&&0!==this.queue.length||this.subject.onCompleted()},onError:function(t){e.call(this),this.hasFailed=!0,this.error=t,this.enableQueue&&0!==this.queue.length||this.subject.onError(t)},onNext:function(t){e.call(this);var n=!1;0===this.requestedCount?this.enableQueue&&this.queue.push(t):(-1!==this.requestedCount&&0===this.requestedCount--&&this.disposeCurrentRequest(),n=!0),n&&this.subject.onNext(t)},_processRequest:function(t){if(this.enableQueue){for(;this.queue.length>=t&&t>0;)this.subject.onNext(this.queue.shift()),t--;return 0!==this.queue.length?{numberOfItems:t,returnValue:!0}:{numberOfItems:t,returnValue:!1}}return this.hasFailed?(this.subject.onError(this.error),this.controlledDisposable.dispose(),this.controlledDisposable=we):this.hasCompleted&&(this.subject.onCompleted(),this.controlledDisposable.dispose(),this.controlledDisposable=we),{numberOfItems:t,returnValue:!1}},request:function(t){e.call(this),this.disposeCurrentRequest();var n=this,r=this._processRequest(t);return t=r.numberOfItems,r.returnValue?we:(this.requestedCount=t,this.requestedDisposable=ye(function(){n.requestedCount=0}),this.requestedDisposable)},disposeCurrentRequest:function(){this.requestedDisposable.dispose(),this.requestedDisposable=we},dispose:function(){this.isDisposed=!0,this.error=null,this.subject.dispose(),this.requestedDisposable.dispose()}}),r}(Ue);Ie.pairwise=function(){var t=this;return new dn(function(e){var n,r=!1;return t.subscribe(function(t){r?e.onNext([n,t]):r=!0,n=t},e.onError.bind(e),e.onCompleted.bind(e))})},Ie.partition=function(t,e){var n=this.publish().refCount();return[n.filter(t,e),n.filter(function(n,r,i){return!t.call(e,n,r,i)})]},Ie.exclusive=function(){var t=this;return new dn(function(e){var n=!1,r=!1,i=new Ee,o=new be;return o.add(i),i.setDisposable(t.subscribe(function(t){if(!n){n=!0,T(t)&&(t=sn(t));var i=new Ee;o.add(i),i.setDisposable(t.subscribe(e.onNext.bind(e),e.onError.bind(e),function(){o.remove(i),n=!1,r&&1===o.length&&e.onCompleted()}))}},e.onError.bind(e),function(){r=!0,n||1!==o.length||e.onCompleted()})),o})},Ie.exclusiveMap=function(e,n){var r=this;return new dn(function(i){var o=0,s=!1,u=!0,c=new Ee,a=new be;return a.add(c),c.setDisposable(r.subscribe(function(r){s||(s=!0,innerSubscription=new Ee,a.add(innerSubscription),T(r)&&(r=sn(r)),innerSubscription.setDisposable(r.subscribe(function(s){var u;try{u=e.call(n,s,o++,r)}catch(c){return i.onError(c),t}i.onNext(u)},i.onError.bind(i),function(){a.remove(innerSubscription),s=!1,u&&1===a.length&&i.onCompleted()})))},i.onError.bind(i),function(){u=!0,1!==a.length||s||i.onCompleted()})),a})};var dn=O.AnonymousObservable=function(e){function n(e){return e===t?e=we:"function"==typeof e&&(e=ye(e)),e}function r(i){function o(t){var e=function(){try{r.setDisposable(n(i(r)))}catch(t){if(!r.fail(t))throw t}},r=new bn(t);return Ae.scheduleRequired()?Ae.schedule(e):e(),r}return this instanceof r?(e.call(this,o),t):new r(i)}return he(r,e),r}(Ue),bn=function(t){function e(e){t.call(this),this.observer=e,this.m=new Ee}he(e,t);var n=e.prototype;return n.next=function(t){var e=!1;try{this.observer.onNext(t),e=!0}catch(n){throw n}finally{e||this.dispose()}},n.error=function(t){try{this.observer.onError(t)}catch(e){throw e}finally{this.dispose()}},n.completed=function(){try{this.observer.onCompleted()}catch(t){throw t}finally{this.dispose()}},n.setDisposable=function(t){this.m.setDisposable(t)},n.getDisposable=function(){return this.m.getDisposable()},n.disposable=function(t){return arguments.length?this.getDisposable():setDisposable(t)},n.dispose=function(){t.prototype.dispose.call(this),this.m.dispose()},e}(Fe),vn=function(t,e){this.subject=t,this.observer=e};vn.prototype.dispose=function(){if(!this.subject.isDisposed&&null!==this.observer){var t=this.subject.observers.indexOf(this.observer);this.subject.observers.splice(t,1),this.observer=null}};var mn=O.Subject=function(t){function n(t){return e.call(this),this.isStopped?this.exception?(t.onError(this.exception),we):(t.onCompleted(),we):(this.observers.push(t),new vn(this,t))}function r(){t.call(this,n),this.isDisposed=!1,this.isStopped=!1,this.observers=[]}return he(r,t),le(r.prototype,ze,{hasObservers:function(){return this.observers.length>0},onCompleted:function(){if(e.call(this),!this.isStopped){var t=this.observers.slice(0);this.isStopped=!0;for(var n=0,r=t.length;r>n;n++)t[n].onCompleted();this.observers=[]}},onError:function(t){if(e.call(this),!this.isStopped){var n=this.observers.slice(0);this.isStopped=!0,this.exception=t;for(var r=0,i=n.length;i>r;r++)n[r].onError(t);this.observers=[]}},onNext:function(t){if(e.call(this),!this.isStopped)for(var n=this.observers.slice(0),r=0,i=n.length;i>r;r++)n[r].onNext(t)},dispose:function(){this.isDisposed=!0,this.observers=null}}),r.create=function(t,e){return new wn(t,e)},r}(Ue),yn=O.AsyncSubject=function(t){function n(t){if(e.call(this),!this.isStopped)return this.observers.push(t),new vn(this,t);var n=this.exception,r=this.hasValue,i=this.value;return n?t.onError(n):r?(t.onNext(i),t.onCompleted()):t.onCompleted(),we}function r(){t.call(this,n),this.isDisposed=!1,this.isStopped=!1,this.value=null,this.hasValue=!1,this.observers=[],this.exception=null}return he(r,t),le(r.prototype,ze,{hasObservers:function(){return e.call(this),this.observers.length>0},onCompleted:function(){var t,n,r;if(e.call(this),!this.isStopped){this.isStopped=!0;var i=this.observers.slice(0),o=this.value,s=this.hasValue;if(s)for(n=0,r=i.length;r>n;n++)t=i[n],t.onNext(o),t.onCompleted();else for(n=0,r=i.length;r>n;n++)i[n].onCompleted();this.observers=[]}},onError:function(t){if(e.call(this),!this.isStopped){var n=this.observers.slice(0);this.isStopped=!0,this.exception=t;for(var r=0,i=n.length;i>r;r++)n[r].onError(t);this.observers=[]}},onNext:function(t){e.call(this),this.isStopped||(this.value=t,this.hasValue=!0)},dispose:function(){this.isDisposed=!0,this.observers=null,this.exception=null,this.value=null}}),r}(Ue),wn=function(t){function e(t){return this.observable.subscribe(t)}function n(n,r){t.call(this,e),this.observer=n,this.observable=r}return he(n,t),le(n.prototype,ze,{onCompleted:function(){this.observer.onCompleted()},onError:function(t){this.observer.onError(t)},onNext:function(t){this.observer.onNext(t)}}),n}(Ue),gn=O.BehaviorSubject=function(t){function n(t){if(e.call(this),!this.isStopped)return this.observers.push(t),t.onNext(this.value),new vn(this,t);var n=this.exception;return n?t.onError(n):t.onCompleted(),we}function r(e){t.call(this,n),this.value=e,this.observers=[],this.isDisposed=!1,this.isStopped=!1,this.exception=null}return he(r,t),le(r.prototype,ze,{hasObservers:function(){return this.observers.length>0},onCompleted:function(){if(e.call(this),!this.isStopped){var t=this.observers.slice(0);this.isStopped=!0;for(var n=0,r=t.length;r>n;n++)t[n].onCompleted();this.observers=[]}},onError:function(t){if(e.call(this),!this.isStopped){var n=this.observers.slice(0);this.isStopped=!0,this.exception=t;for(var r=0,i=n.length;i>r;r++)n[r].onError(t);this.observers=[]}},onNext:function(t){if(e.call(this),!this.isStopped){this.value=t;for(var n=this.observers.slice(0),r=0,i=n.length;i>r;r++)n[r].onNext(t)}},dispose:function(){this.isDisposed=!0,this.observers=null,this.value=null,this.exception=null}}),r}(Ue),En=O.ReplaySubject=function(t){function n(t,e){this.subject=t,this.observer=e}function r(t){var r=new He(this.scheduler,t),i=new n(this,r);e.call(this),this._trim(this.scheduler.now()),this.observers.push(r);for(var o=this.q.length,s=0,u=this.q.length;u>s;s++)r.onNext(this.q[s].value);return this.hasError?(o++,r.onError(this.error)):this.isStopped&&(o++,r.onCompleted()),r.ensureActive(o),i}function i(e,n,i){this.bufferSize=null==e?Number.MAX_VALUE:e,this.windowSize=null==n?Number.MAX_VALUE:n,this.scheduler=i||Ae,this.q=[],this.observers=[],this.isStopped=!1,this.isDisposed=!1,this.hasError=!1,this.error=null,t.call(this,r)}return n.prototype.dispose=function(){if(this.observer.dispose(),!this.subject.isDisposed){var t=this.subject.observers.indexOf(this.observer);this.subject.observers.splice(t,1)}},he(i,t),le(i.prototype,ze,{hasObservers:function(){return this.observers.length>0},_trim:function(t){for(;this.q.length>this.bufferSize;)this.q.shift();for(;this.q.length>0&&t-this.q[0].interval>this.windowSize;)this.q.shift()},onNext:function(t){var n;if(e.call(this),!this.isStopped){var r=this.scheduler.now();this.q.push({interval:r,value:t}),this._trim(r);for(var i=this.observers.slice(0),o=0,s=i.length;s>o;o++)n=i[o],n.onNext(t),n.ensureActive()}},onError:function(t){var n;if(e.call(this),!this.isStopped){this.isStopped=!0,this.error=t,this.hasError=!0;var r=this.scheduler.now();this._trim(r);for(var i=this.observers.slice(0),o=0,s=i.length;s>o;o++)n=i[o],n.onError(t),n.ensureActive();this.observers=[]}},onCompleted:function(){var t;if(e.call(this),!this.isStopped){this.isStopped=!0;var n=this.scheduler.now();this._trim(n);for(var r=this.observers.slice(0),i=0,o=r.length;o>i;i++)t=r[i],t.onCompleted(),t.ensureActive();this.observers=[]}},dispose:function(){this.isDisposed=!0,this.observers=null}}),i}(Ue);"function"==typeof define&&"object"==typeof define.amd&&define.amd?(D.Rx=O,define(function(){return O})):S&&N?A?(N.exports=O).Rx=O:S.Rx=O:D.Rx=O}).call(this); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.min.js b/ajax/libs/rxjs/2.2.28/rx.min.js new file mode 100644 index 000000000..bad2d52ff --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.min.js @@ -0,0 +1,2 @@ +(function(t){function e(){if(this.isDisposed)throw Error(k)}function n(t){var e=typeof t;return t&&("function"==e||"object"==e)||!1}function r(t){var e=[];if(!n(t))return e;ne.nonEnumArgs&&t.length&&u(t)&&(t=ie.call(t));var r=ne.enumPrototypes&&"function"==typeof t,i=ne.enumErrorProps&&(t===X||t instanceof Error);for(var o in t)r&&"prototype"==o||i&&("message"==o||"name"==o)||e.push(o);if(ne.nonEnumShadows&&t!==Z){var s=t.constructor,c=-1,a=te.length;if(t===(s&&s.prototype))var h=t===stringProto?Q:t===X?I:$.call(t),l=ee[h];for(;a>++c;)o=te[c],l&&l[o]||!K.call(t,o)||e.push(o)}return e}function i(t,e,n){for(var r=-1,i=n(t),o=i.length;o>++r;){var s=i[r];if(e(t[s],s,t)===!1)break}return t}function o(t,e){return i(t,e,r)}function s(t){return"function"!=typeof t.toString&&"string"==typeof(t+"")}function u(t){return t&&"object"==typeof t?$.call(t)==L:!1}function c(t){return"function"==typeof t||!1}function a(e,n,r,i){if(e===n)return 0!==e||1/e==1/n;var h=typeof e,l=typeof n;if(e===e&&(null==e||null==n||"function"!=h&&"object"!=h&&"function"!=l&&"object"!=l))return!1;var f=$.call(e),p=$.call(n);if(f==L&&(f=H),p==L&&(p=H),f!=p)return!1;switch(f){case z:case V:return+e==+n;case B:return e!=+e?n!=+n:0==e?1/e==1/n:e==+n;case U:case Q:return e==n+""}var d=f==M;if(!d){if(f!=H||!ne.nodeClass&&(s(e)||s(n)))return!1;var v=!ne.argsObject&&u(e)?Object:e.constructor,b=!ne.argsObject&&u(n)?Object:n.constructor;if(!(v==b||K.call(e,"constructor")&&K.call(n,"constructor")||c(v)&&v instanceof v&&c(b)&&b instanceof b||!("constructor"in e&&"constructor"in n)))return!1}r||(r=[]),i||(i=[]);for(var m=r.length;m--;)if(r[m]==e)return i[m]==n;var y=0;if(result=!0,r.push(e),i.push(n),d){if(m=e.length,y=n.length,result=y==m)for(;y--;){var w=n[y];if(!(result=a(e[y],w,r,i)))break}}else o(n,function(n,o,s){return K.call(s,o)?(y++,result=K.call(e,o)&&a(e[o],n,r,i)):t}),result&&o(e,function(e,n,r){return K.call(r,n)?result=--y>-1:t});return r.pop(),i.pop(),result}function h(t,e){return 1===t.length&&Array.isArray(t[e])?t[e]:ie.call(t)}function l(t,e){for(var n=Array(t),r=0;t>r;r++)n[r]=e();return n}function f(t,e){this.scheduler=t,this.disposable=e,this.isDisposed=!1}function p(e,n){return new nn(function(r){var i=new me,o=new ye;return o.setDisposable(i),i.setDisposable(e.subscribe(r.onNext.bind(r),function(e){var i,s;try{s=n(e)}catch(u){return r.onError(u),t}W(s)&&(s=Ue(s)),i=new me,o.setDisposable(i),i.setDisposable(s.subscribe(r))},r.onCompleted.bind(r))),o})}function d(e,n){var r=this;return new nn(function(i){var o=0,s=e.length;return r.subscribe(function(r){if(s>o){var u,c=e[o++];try{u=n(r,c)}catch(a){return i.onError(a),t}i.onNext(u)}else i.onCompleted()},i.onError.bind(i),i.onCompleted.bind(i))})}function v(t){return this.map(function(e,n){var r=t(e,n);return W(r)?Ue(r):r}).concatAll()}function b(t){return this.select(function(e,n){var r=t(e,n);return W(r)?Ue(r):r}).mergeObservable()}var m={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},y=m[typeof window]&&window||this,w=m[typeof exports]&&exports&&!exports.nodeType&&exports,g=m[typeof module]&&module&&!module.nodeType&&module,E=g&&g.exports===w&&w,x=m[typeof global]&&global;!x||x.global!==x&&x.window!==x||(y=x);var C={internals:{},config:{Promise:y.Promise},helpers:{}},D=C.helpers.noop=function(){},S=C.helpers.identity=function(t){return t},A=(C.helpers.pluck=function(t){return function(e){return e[t]}},C.helpers.just=function(t){return function(){return t}},C.helpers.defaultNow=Date.now),N=C.helpers.defaultComparer=function(t,e){return re(t,e)},_=C.helpers.defaultSubComparer=function(t,e){return t>e?1:e>t?-1:0},O=C.helpers.defaultKeySerializer=function(t){return""+t},R=C.helpers.defaultError=function(t){throw t},W=C.helpers.isPromise=function(t){return!!t&&"function"==typeof t.then&&t.then!==C.Observable.prototype.then};C.helpers.asArray=function(){return Array.prototype.slice.call(arguments)},C.helpers.not=function(t){return!t};var j="Argument out of range",k="Object has been disposed",q="object"==typeof Symbol&&Symbol.iterator||"_es6shim_iterator_";y.Set&&"function"==typeof(new y.Set)["@@iterator"]&&(q="@@iterator");var P,T={done:!0,value:t},L="[object Arguments]",M="[object Array]",z="[object Boolean]",V="[object Date]",I="[object Error]",F="[object Function]",B="[object Number]",H="[object Object]",U="[object RegExp]",Q="[object String]",$=Object.prototype.toString,K=Object.prototype.hasOwnProperty,J=$.call(arguments)==L,X=Error.prototype,Z=Object.prototype,G=Z.propertyIsEnumerable;try{P=!($.call(document)==H&&!({toString:0}+""))}catch(Y){P=!0}var te=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],ee={};ee[M]=ee[V]=ee[B]={constructor:!0,toLocaleString:!0,toString:!0,valueOf:!0},ee[z]=ee[Q]={constructor:!0,toString:!0,valueOf:!0},ee[I]=ee[F]=ee[U]={constructor:!0,toString:!0},ee[H]={constructor:!0};var ne={};(function(){var t=function(){this.x=1},e=[];t.prototype={valueOf:1,y:1};for(var n in new t)e.push(n);for(n in arguments);ne.enumErrorProps=G.call(X,"message")||G.call(X,"name"),ne.enumPrototypes=G.call(t,"prototype"),ne.nonEnumArgs=0!=n,ne.nonEnumShadows=!/valueOf/.test(e)})(1),J||(u=function(t){return t&&"object"==typeof t?K.call(t,"callee"):!1}),c(/x/)&&(c=function(t){return"function"==typeof t&&$.call(t)==F});var re=C.internals.isEqual=function(t,e){return a(t,e,[],[])},ie=Array.prototype.slice;({}).hasOwnProperty;var oe=this.inherits=C.internals.inherits=function(t,e){function n(){this.constructor=t}n.prototype=e.prototype,t.prototype=new n},se=C.internals.addProperties=function(t){for(var e=ie.call(arguments,1),n=0,r=e.length;r>n;n++){var i=e[n];for(var o in i)t[o]=i[o]}},ue=C.internals.addRef=function(t,e){return new nn(function(n){return new le(e.getDisposable(),t.subscribe(n))})},ce=function(t,e){this.id=t,this.value=e};ce.prototype.compareTo=function(t){var e=this.value.compareTo(t.value);return 0===e&&(e=this.id-t.id),e};var ae=C.internals.PriorityQueue=function(t){this.items=Array(t),this.length=0},he=ae.prototype;he.isHigherPriority=function(t,e){return 0>this.items[t].compareTo(this.items[e])},he.percolate=function(t){if(!(t>=this.length||0>t)){var e=t-1>>1;if(!(0>e||e===t)&&this.isHigherPriority(t,e)){var n=this.items[t];this.items[t]=this.items[e],this.items[e]=n,this.percolate(e)}}},he.heapify=function(e){if(e===t&&(e=0),!(e>=this.length||0>e)){var n=2*e+1,r=2*e+2,i=e;if(this.length>n&&this.isHigherPriority(n,i)&&(i=n),this.length>r&&this.isHigherPriority(r,i)&&(i=r),i!==e){var o=this.items[e];this.items[e]=this.items[i],this.items[i]=o,this.heapify(i)}}},he.peek=function(){return this.items[0].value},he.removeAt=function(t){this.items[t]=this.items[--this.length],delete this.items[this.length],this.heapify()},he.dequeue=function(){var t=this.peek();return this.removeAt(0),t},he.enqueue=function(t){var e=this.length++;this.items[e]=new ce(ae.count++,t),this.percolate(e)},he.remove=function(t){for(var e=0;this.length>e;e++)if(this.items[e].value===t)return this.removeAt(e),!0;return!1},ae.count=0;var le=C.CompositeDisposable=function(){this.disposables=h(arguments,0),this.isDisposed=!1,this.length=this.disposables.length},fe=le.prototype;fe.add=function(t){this.isDisposed?t.dispose():(this.disposables.push(t),this.length++)},fe.remove=function(t){var e=!1;if(!this.isDisposed){var n=this.disposables.indexOf(t);-1!==n&&(e=!0,this.disposables.splice(n,1),this.length--,t.dispose())}return e},fe.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;var t=this.disposables.slice(0);this.disposables=[],this.length=0;for(var e=0,n=t.length;n>e;e++)t[e].dispose()}},fe.clear=function(){var t=this.disposables.slice(0);this.disposables=[],this.length=0;for(var e=0,n=t.length;n>e;e++)t[e].dispose()},fe.contains=function(t){return-1!==this.disposables.indexOf(t)},fe.toArray=function(){return this.disposables.slice(0)};var pe=C.Disposable=function(t){this.isDisposed=!1,this.action=t||D};pe.prototype.dispose=function(){this.isDisposed||(this.action(),this.isDisposed=!0)};var de=pe.create=function(t){return new pe(t)},ve=pe.empty={dispose:D},be=function(){function t(t){this.isSingle=t,this.isDisposed=!1,this.current=null}var e=t.prototype;return e.getDisposable=function(){return this.current},e.setDisposable=function(t){if(this.current&&this.isSingle)throw Error("Disposable has already been assigned");var e,n=this.isDisposed;n||(e=this.current,this.current=t),e&&e.dispose(),n&&t&&t.dispose()},e.dispose=function(){var t;this.isDisposed||(this.isDisposed=!0,t=this.current,this.current=null),t&&t.dispose()},t}(),me=C.SingleAssignmentDisposable=function(t){function e(){t.call(this,!0)}return oe(e,t),e}(be),ye=C.SerialDisposable=function(t){function e(){t.call(this,!1)}return oe(e,t),e}(be),we=C.RefCountDisposable=function(){function t(t){this.disposable=t,this.disposable.count++,this.isInnerDisposed=!1}function e(t){this.underlyingDisposable=t,this.isDisposed=!1,this.isPrimaryDisposed=!1,this.count=0}return t.prototype.dispose=function(){this.disposable.isDisposed||this.isInnerDisposed||(this.isInnerDisposed=!0,this.disposable.count--,0===this.disposable.count&&this.disposable.isPrimaryDisposed&&(this.disposable.isDisposed=!0,this.disposable.underlyingDisposable.dispose()))},e.prototype.dispose=function(){this.isDisposed||this.isPrimaryDisposed||(this.isPrimaryDisposed=!0,0===this.count&&(this.isDisposed=!0,this.underlyingDisposable.dispose()))},e.prototype.getDisposable=function(){return this.isDisposed?ve:new t(this)},e}();f.prototype.dispose=function(){var t=this;this.scheduler.schedule(function(){t.isDisposed||(t.isDisposed=!0,t.disposable.dispose())})};var ge=C.internals.ScheduledItem=function(t,e,n,r,i){this.scheduler=t,this.state=e,this.action=n,this.dueTime=r,this.comparer=i||_,this.disposable=new me};ge.prototype.invoke=function(){this.disposable.setDisposable(this.invokeCore())},ge.prototype.compareTo=function(t){return this.comparer(this.dueTime,t.dueTime)},ge.prototype.isCancelled=function(){return this.disposable.isDisposed},ge.prototype.invokeCore=function(){return this.action(this.scheduler,this.state)};var Ee=C.Scheduler=function(){function t(t,e,n,r){this.now=t,this._schedule=e,this._scheduleRelative=n,this._scheduleAbsolute=r}function e(t,e){var n=e.first,r=e.second,i=new le,o=function(e){r(e,function(e){var n=!1,r=!1,s=t.scheduleWithState(e,function(t,e){return n?i.remove(s):r=!0,o(e),ve});r||(i.add(s),n=!0)})};return o(n),i}function n(t,e,n){var r=e.first,i=e.second,o=new le,s=function(e){i(e,function(e,r){var i=!1,u=!1,c=t[n].call(t,e,r,function(t,e){return i?o.remove(c):u=!0,s(e),ve});u||(o.add(c),i=!0)})};return s(r),o}function r(t,e){return e(),ve}var i=t.prototype;return i.catchException=i["catch"]=function(t){return new Ne(this,t)},i.schedulePeriodic=function(t,e){return this.schedulePeriodicWithState(null,t,function(){e()})},i.schedulePeriodicWithState=function(t,e,n){var r=t,i=setInterval(function(){r=n(r)},e);return de(function(){clearInterval(i)})},i.schedule=function(t){return this._schedule(t,r)},i.scheduleWithState=function(t,e){return this._schedule(t,e)},i.scheduleWithRelative=function(t,e){return this._scheduleRelative(e,t,r)},i.scheduleWithRelativeAndState=function(t,e,n){return this._scheduleRelative(t,e,n)},i.scheduleWithAbsolute=function(t,e){return this._scheduleAbsolute(e,t,r)},i.scheduleWithAbsoluteAndState=function(t,e,n){return this._scheduleAbsolute(t,e,n)},i.scheduleRecursive=function(t){return this.scheduleRecursiveWithState(t,function(t,e){t(function(){e(t)})})},i.scheduleRecursiveWithState=function(t,n){return this.scheduleWithState({first:t,second:n},function(t,n){return e(t,n)})},i.scheduleRecursiveWithRelative=function(t,e){return this.scheduleRecursiveWithRelativeAndState(e,t,function(t,e){t(function(n){e(t,n)})})},i.scheduleRecursiveWithRelativeAndState=function(t,e,r){return this._scheduleRelative({first:t,second:r},e,function(t,e){return n(t,e,"scheduleWithRelativeAndState")})},i.scheduleRecursiveWithAbsolute=function(t,e){return this.scheduleRecursiveWithAbsoluteAndState(e,t,function(t,e){t(function(n){e(t,n)})})},i.scheduleRecursiveWithAbsoluteAndState=function(t,e,r){return this._scheduleAbsolute({first:t,second:r},e,function(t,e){return n(t,e,"scheduleWithAbsoluteAndState")})},t.now=A,t.normalize=function(t){return 0>t&&(t=0),t},t}(),xe=Ee.normalize;C.internals.SchedulePeriodicRecursive=function(){function t(t,e){e(0,this._period);try{this._state=this._action(this._state)}catch(n){throw this._cancel.dispose(),n}}function e(t,e,n,r){this._scheduler=t,this._state=e,this._period=n,this._action=r}return e.prototype.start=function(){var e=new me;return this._cancel=e,e.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0,this._period,t.bind(this))),e},e}();var Ce,De=Ee.immediate=function(){function t(t,e){return e(this,t)}function e(t,e,n){for(var r=xe(r);r-this.now()>0;);return n(this,t)}function n(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}return new Ee(A,t,e,n)}(),Se=Ee.currentThread=function(){function t(t){for(var e;t.length>0;)if(e=t.dequeue(),!e.isCancelled()){for(;e.dueTime-Ee.now()>0;);e.isCancelled()||e.invoke()}}function e(t,e){return this.scheduleWithRelativeAndState(t,0,e)}function n(e,n,r){var o=this.now()+Ee.normalize(n),s=new ge(this,e,r,o);if(i)i.enqueue(s);else{i=new ae(4),i.enqueue(s);try{t(i)}catch(u){throw u}finally{i=null}}return s.disposable}function r(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}var i,o=new Ee(A,e,n,r);return o.scheduleRequired=function(){return null===i},o.ensureTrampoline=function(t){return null===i?this.schedule(t):t()},o}(),Ae=D;(function(){function t(){if(!y.postMessage||y.importScripts)return!1;var t=!1,e=y.onmessage;return y.onmessage=function(){t=!0},y.postMessage("","*"),y.onmessage=e,t}function e(t){if("string"==typeof t.data&&t.data.substring(0,o.length)===o){var e=t.data.substring(o.length),n=s[e];n(),delete s[e]}}var n=RegExp("^"+($+"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),r="function"==typeof(r=x&&E&&x.setImmediate)&&!n.test(r)&&r,i="function"==typeof(i=x&&E&&x.clearImmediate)&&!n.test(i)&&i;if("undefined"!=typeof process&&"[object process]"==={}.toString.call(process))Ce=process.nextTick;else if("function"==typeof r)Ce=r,Ae=i;else if(t()){var o="ms.rx.schedule"+Math.random(),s={},u=0;y.addEventListener?y.addEventListener("message",e,!1):y.attachEvent("onmessage",e,!1),Ce=function(t){var e=u++;s[e]=t,y.postMessage(o+e,"*")}}else if(y.MessageChannel){var c=new y.MessageChannel,a={},h=0;c.port1.onmessage=function(t){var e=t.data,n=a[e];n(),delete a[e]},Ce=function(t){var e=h++;a[e]=t,c.port2.postMessage(e)}}else"document"in y&&"onreadystatechange"in y.document.createElement("script")?Ce=function(t){var e=y.document.createElement("script");e.onreadystatechange=function(){t(),e.onreadystatechange=null,e.parentNode.removeChild(e),e=null},y.document.documentElement.appendChild(e)}:(Ce=function(t){return setTimeout(t,0)},Ae=clearTimeout)})(),Ee.timeout=function(){function t(t,e){var n=this,r=new me,i=Ce(function(){r.isDisposed||r.setDisposable(e(n,t))});return new le(r,de(function(){Ae(i)}))}function e(t,e,n){var r=this,i=Ee.normalize(e);if(0===i)return r.scheduleWithState(t,n);var o=new me,s=setTimeout(function(){o.isDisposed||o.setDisposable(n(r,t))},i);return new le(o,de(function(){clearTimeout(s)}))}function n(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}return new Ee(A,t,e,n)}();var Ne=function(t){function e(){return this._scheduler.now()}function n(t,e){return this._scheduler.scheduleWithState(t,this._wrap(e))}function r(t,e,n){return this._scheduler.scheduleWithRelativeAndState(t,e,this._wrap(n))}function i(t,e,n){return this._scheduler.scheduleWithAbsoluteAndState(t,e,this._wrap(n))}function o(o,s){this._scheduler=o,this._handler=s,this._recursiveOriginal=null,this._recursiveWrapper=null,t.call(this,e,n,r,i)}return oe(o,t),o.prototype._clone=function(t){return new o(t,this._handler)},o.prototype._wrap=function(t){var e=this;return function(n,r){try{return t(e._getRecursiveWrapper(n),r)}catch(i){if(!e._handler(i))throw i;return ve}}},o.prototype._getRecursiveWrapper=function(t){if(this._recursiveOriginal!==t){this._recursiveOriginal=t;var e=this._clone(t);e._recursiveOriginal=t,e._recursiveWrapper=e,this._recursiveWrapper=e}return this._recursiveWrapper},o.prototype.schedulePeriodicWithState=function(t,e,n){var r=this,i=!1,o=new me;return o.setDisposable(this._scheduler.schedulePeriodicWithState(t,e,function(t){if(i)return null;try{return n(t)}catch(e){if(i=!0,!r._handler(e))throw e;return o.dispose(),null}})),o},o}(Ee),_e=C.Notification=function(){function t(t,e){this.hasValue=null==e?!1:e,this.kind=t}var e=t.prototype;return e.accept=function(t,e,n){return 1===arguments.length&&"object"==typeof t?this._acceptObservable(t):this._accept(t,e,n)},e.toObservable=function(t){var e=this;return t||(t=De),new nn(function(n){return t.schedule(function(){e._acceptObservable(n),"N"===e.kind&&n.onCompleted()})})},t}(),Oe=_e.createOnNext=function(){function t(t){return t(this.value)}function e(t){return t.onNext(this.value)}function n(){return"OnNext("+this.value+")"}return function(r){var i=new _e("N",!0);return i.value=r,i._accept=t,i._acceptObservable=e,i.toString=n,i}}(),Re=_e.createOnError=function(){function t(t,e){return e(this.exception)}function e(t){return t.onError(this.exception)}function n(){return"OnError("+this.exception+")"}return function(r){var i=new _e("E");return i.exception=r,i._accept=t,i._acceptObservable=e,i.toString=n,i}}(),We=_e.createOnCompleted=function(){function t(t,e,n){return n()}function e(t){return t.onCompleted()}function n(){return"OnCompleted()"}return function(){var r=new _e("C");return r._accept=t,r._acceptObservable=e,r.toString=n,r}}(),je=C.internals.Enumerator=function(t){this._next=t};je.prototype.next=function(){return this._next()},je.prototype[q]=function(){return this};var ke=C.internals.Enumerable=function(t){this._iterator=t};ke.prototype[q]=function(){return this._iterator()},ke.prototype.concat=function(){var e=this;return new nn(function(n){var r;try{r=e[q]()}catch(i){return n.onError(),t}var o,s=new ye,u=De.scheduleRecursive(function(e){var i;if(!o){try{i=r.next()}catch(u){return n.onError(u),t}if(i.done)return n.onCompleted(),t;var c=i.value;W(c)&&(c=Ue(c));var a=new me;s.setDisposable(a),a.setDisposable(c.subscribe(n.onNext.bind(n),n.onError.bind(n),function(){e()}))}});return new le(s,u,de(function(){o=!0}))})},ke.prototype.catchException=function(){var e=this;return new nn(function(n){var r;try{r=e[q]()}catch(i){return n.onError(),t}var o,s,u=new ye,c=De.scheduleRecursive(function(e){if(!o){var i;try{i=r.next()}catch(c){return n.onError(c),t}if(i.done)return s?n.onError(s):n.onCompleted(),t;var a=i.value;W(a)&&(a=Ue(a));var h=new me;u.setDisposable(h),h.setDisposable(a.subscribe(n.onNext.bind(n),function(t){s=t,e()},n.onCompleted.bind(n)))}});return new le(u,c,de(function(){o=!0}))})};var qe=ke.repeat=function(t,e){return null==e&&(e=-1),new ke(function(){var n=e;return new je(function(){return 0===n?T:(n>0&&n--,{done:!1,value:t})})})},Pe=ke.forEach=function(t,e,n){return e||(e=S),new ke(function(){var r=-1;return new je(function(){return++r0&&(e=!this.isAcquired,this.isAcquired=!0),e&&this.disposable.setDisposable(this.scheduler.scheduleRecursive(function(e){var r;if(!(n.queue.length>0))return n.isAcquired=!1,t;r=n.queue.shift();try{r()}catch(i){throw n.queue=[],n.hasFaulted=!0,i}e()}))},n.prototype.dispose=function(){e.prototype.dispose.call(this),this.disposable.dispose()},n}(ze),Be=function(t){function e(){t.apply(this,arguments)}return oe(e,t),e.prototype.next=function(e){t.prototype.next.call(this,e),this.ensureActive()},e.prototype.error=function(e){t.prototype.error.call(this,e),this.ensureActive()},e.prototype.completed=function(){t.prototype.completed.call(this),this.ensureActive()},e}(Fe),He=C.Observable=function(){function t(t){this._subscribe=t}return Me=t.prototype,Me.subscribe=Me.forEach=function(t,e,n){var r="object"==typeof t?t:Le(t,e,n);return this._subscribe(r)},t}();Me.observeOn=function(t){var e=this;return new nn(function(n){return e.subscribe(new Be(t,n))})},Me.subscribeOn=function(t){var e=this;return new nn(function(n){var r=new me,i=new ye;return i.setDisposable(r),r.setDisposable(t.schedule(function(){i.setDisposable(new f(t,e.subscribe(n)))})),i})};var Ue=He.fromPromise=function(t){return new nn(function(e){return t.then(function(t){e.onNext(t),e.onCompleted()},function(t){e.onError(t)}),function(){t&&t.abort&&t.abort()}})};Me.toPromise=function(t){if(t||(t=C.config.Promise),!t)throw Error("Promise type not provided nor in Rx.config.Promise");var e=this;return new t(function(t,n){var r,i=!1;e.subscribe(function(t){r=t,i=!0},function(t){n(t)},function(){i&&t(r)})})},Me.toArray=function(){var t=this;return new nn(function(e){var n=[];return t.subscribe(n.push.bind(n),e.onError.bind(e),function(){e.onNext(n),e.onCompleted()})})},He.create=He.createWithDisposable=function(t){return new nn(t)},He.defer=function(t){return new nn(function(e){var n;try{n=t()}catch(r){return Xe(r).subscribe(e)}return W(n)&&(n=Ue(n)),n.subscribe(e)})};var Qe=He.empty=function(t){return t||(t=De),new nn(function(e){return t.schedule(function(){e.onCompleted()})})},$e=He.fromArray=function(t,e){return e||(e=Se),new nn(function(n){var r=0,i=t.length;return e.scheduleRecursive(function(e){i>r?(n.onNext(t[r++]),e()):n.onCompleted()})})};He.fromIterable=function(e,n){return n||(n=Se),new nn(function(r){var i;try{i=e[q]()}catch(o){return r.onError(o),t}return n.scheduleRecursive(function(e){var n;try{n=i.next()}catch(o){return r.onError(o),t}n.done?r.onCompleted():(r.onNext(n.value),e())})})},He.generate=function(e,n,r,i,o){return o||(o=Se),new nn(function(s){var u=!0,c=e;return o.scheduleRecursive(function(e){var o,a;try{u?u=!1:c=r(c),o=n(c),o&&(a=i(c))}catch(h){return s.onError(h),t}o?(s.onNext(a),e()):s.onCompleted()})})};var Ke=He.never=function(){return new nn(function(){return ve})};He.of=function(){for(var t=arguments.length,e=Array(t),n=0;t>n;n++)e[n]=arguments[n];return $e(e)},He.ofWithScheduler=function(t){for(var e=arguments.length-1,n=Array(e),r=0;e>r;r++)n[r]=arguments[r+1];return $e(n,t)},He.range=function(t,e,n){return n||(n=Se),new nn(function(r){return n.scheduleRecursiveWithState(0,function(n,i){e>n?(r.onNext(t+n),i(n+1)):r.onCompleted()})})},He.repeat=function(t,e,n){return n||(n=Se),null==e&&(e=-1),Je(t,n).repeat(e)};var Je=He["return"]=He.returnValue=He.just=function(t,e){return e||(e=De),new nn(function(n){return e.schedule(function(){n.onNext(t),n.onCompleted()})})},Xe=He["throw"]=He.throwException=function(t,e){return e||(e=De),new nn(function(n){return e.schedule(function(){n.onError(t)})})};He.using=function(t,e){return new nn(function(n){var r,i,o=ve;try{r=t(),r&&(o=r),i=e(r)}catch(s){return new le(Xe(s).subscribe(n),o)}return new le(i.subscribe(n),o)})},Me.amb=function(t){var e=this;return new nn(function(n){function r(){o||(o=s,a.dispose())}function i(){o||(o=u,c.dispose())}var o,s="L",u="R",c=new me,a=new me;return W(t)&&(t=Ue(t)),c.setDisposable(e.subscribe(function(t){r(),o===s&&n.onNext(t)},function(t){r(),o===s&&n.onError(t)},function(){r(),o===s&&n.onCompleted()})),a.setDisposable(t.subscribe(function(t){i(),o===u&&n.onNext(t)},function(t){i(),o===u&&n.onError(t)},function(){i(),o===u&&n.onCompleted()})),new le(c,a)})},He.amb=function(){function t(t,e){return t.amb(e)}for(var e=Ke(),n=h(arguments,0),r=0,i=n.length;i>r;r++)e=t(e,n[r]);return e},Me["catch"]=Me.catchException=function(t){return"function"==typeof t?p(this,t):Ze([this,t])};var Ze=He.catchException=He["catch"]=function(){var t=h(arguments,0);return Pe(t).catchException()};Me.combineLatest=function(){var t=ie.call(arguments);return Array.isArray(t[0])?t[0].unshift(this):t.unshift(this),Ge.apply(this,t)};var Ge=He.combineLatest=function(){var e=ie.call(arguments),n=e.pop();return Array.isArray(e[0])&&(e=e[0]),new nn(function(r){function i(e){var i;if(c[e]=!0,a||(a=c.every(S))){try{i=n.apply(null,f)}catch(o){return r.onError(o),t}r.onNext(i)}else h.filter(function(t,n){return n!==e}).every(S)&&r.onCompleted()}function o(t){h[t]=!0,h.every(S)&&r.onCompleted()}for(var s=function(){return!1},u=e.length,c=l(u,s),a=!1,h=l(u,s),f=Array(u),p=Array(u),d=0;u>d;d++)(function(t){var n=e[t],s=new me;W(n)&&(n=Ue(n)),s.setDisposable(n.subscribe(function(e){f[t]=e,i(t)},r.onError.bind(r),function(){o(t)})),p[t]=s})(d);return new le(p)})};Me.concat=function(){var t=ie.call(arguments,0);return t.unshift(this),Ye.apply(this,t)};var Ye=He.concat=function(){var t=h(arguments,0);return Pe(t).concat()};Me.concatObservable=Me.concatAll=function(){return this.merge(1)},Me.merge=function(t){if("number"!=typeof t)return tn(this,t);var e=this;return new nn(function(n){var r=0,i=new le,o=!1,s=[],u=function(t){var e=new me;i.add(e),W(t)&&(t=Ue(t)),e.setDisposable(t.subscribe(n.onNext.bind(n),n.onError.bind(n),function(){var t;i.remove(e),s.length>0?(t=s.shift(),u(t)):(r--,o&&0===r&&n.onCompleted())}))};return i.add(e.subscribe(function(e){t>r?(r++,u(e)):s.push(e)},n.onError.bind(n),function(){o=!0,0===r&&n.onCompleted()})),i})};var tn=He.merge=function(){var t,e;return arguments[0]?arguments[0].now?(t=arguments[0],e=ie.call(arguments,1)):(t=De,e=ie.call(arguments,0)):(t=De,e=ie.call(arguments,1)),Array.isArray(e[0])&&(e=e[0]),$e(e,t).mergeObservable()};Me.mergeObservable=Me.mergeAll=function(){var t=this;return new nn(function(e){var n=new le,r=!1,i=new me;return n.add(i),i.setDisposable(t.subscribe(function(t){var i=new me;n.add(i),W(t)&&(t=Ue(t)),i.setDisposable(t.subscribe(function(t){e.onNext(t)},e.onError.bind(e),function(){n.remove(i),r&&1===n.length&&e.onCompleted()}))},e.onError.bind(e),function(){r=!0,1===n.length&&e.onCompleted()})),n})},Me.onErrorResumeNext=function(t){if(!t)throw Error("Second observable is required");return en([this,t])};var en=He.onErrorResumeNext=function(){var t=h(arguments,0);return new nn(function(e){var n=0,r=new ye,i=De.scheduleRecursive(function(i){var o,s;t.length>n?(o=t[n++],W(o)&&(o=Ue(o)),s=new me,r.setDisposable(s),s.setDisposable(o.subscribe(e.onNext.bind(e),function(){i()},function(){i()}))):e.onCompleted()});return new le(r,i)})};Me.skipUntil=function(t){var e=this;return new nn(function(n){var r=!1,i=new le(e.subscribe(function(t){r&&n.onNext(t)},n.onError.bind(n),function(){r&&n.onCompleted()}));W(t)&&(t=Ue(t));var o=new me;return i.add(o),o.setDisposable(t.subscribe(function(){r=!0,o.dispose()},n.onError.bind(n),function(){o.dispose()})),i})},Me["switch"]=Me.switchLatest=function(){var t=this;return new nn(function(e){var n=!1,r=new ye,i=!1,o=0,s=t.subscribe(function(t){var s=new me,u=++o;n=!0,r.setDisposable(s),W(t)&&(t=Ue(t)),s.setDisposable(t.subscribe(function(t){o===u&&e.onNext(t)},function(t){o===u&&e.onError(t)},function(){o===u&&(n=!1,i&&e.onCompleted())}))},e.onError.bind(e),function(){i=!0,n||e.onCompleted()});return new le(s,r)})},Me.takeUntil=function(t){var e=this;return new nn(function(n){return W(t)&&(t=Ue(t)),new le(e.subscribe(n),t.subscribe(n.onCompleted.bind(n),n.onError.bind(n),D))})},Me.zip=function(){if(Array.isArray(arguments[0]))return d.apply(this,arguments);var e=this,n=ie.call(arguments),r=n.pop();return n.unshift(e),new nn(function(i){function o(n){var o,s;if(c.every(function(t){return t.length>0})){try{s=c.map(function(t){return t.shift()}),o=r.apply(e,s)}catch(u){return i.onError(u),t}i.onNext(o)}else a.filter(function(t,e){return e!==n}).every(S)&&i.onCompleted()}function s(t){a[t]=!0,a.every(function(t){return t})&&i.onCompleted()}for(var u=n.length,c=l(u,function(){return[]}),a=l(u,function(){return!1}),h=Array(u),f=0;u>f;f++)(function(t){var e=n[t],r=new me;W(e)&&(e=Ue(e)),r.setDisposable(e.subscribe(function(e){c[t].push(e),o(t)},i.onError.bind(i),function(){s(t)})),h[t]=r})(f);return new le(h)})},He.zip=function(){var t=ie.call(arguments,0),e=t.shift();return e.zip.apply(e,t)},He.zipArray=function(){var e=h(arguments,0);return new nn(function(n){function r(e){if(s.every(function(t){return t.length>0})){var r=s.map(function(t){return t.shift()});n.onNext(r)}else if(u.filter(function(t,n){return n!==e}).every(S))return n.onCompleted(),t}function i(e){return u[e]=!0,u.every(S)?(n.onCompleted(),t):t}for(var o=e.length,s=l(o,function(){return[]}),u=l(o,function(){return!1}),c=Array(o),a=0;o>a;a++)(function(t){c[t]=new me,c[t].setDisposable(e[t].subscribe(function(e){s[t].push(e),r(t)},n.onError.bind(n),function(){i(t)}))})(a);var h=new le(c);return h.add(de(function(){for(var t=0,e=s.length;e>t;t++)s[t]=[]})),h})},Me.asObservable=function(){var t=this;return new nn(function(e){return t.subscribe(e)})},Me.bufferWithCount=function(t,e){return"number"!=typeof e&&(e=t),this.windowWithCount(t,e).selectMany(function(t){return t.toArray()}).where(function(t){return t.length>0})},Me.dematerialize=function(){var t=this;return new nn(function(e){return t.subscribe(function(t){return t.accept(e)},e.onError.bind(e),e.onCompleted.bind(e))})},Me.distinctUntilChanged=function(e,n){var r=this;return e||(e=S),n||(n=N),new nn(function(i){var o,s=!1;return r.subscribe(function(r){var u,c=!1;try{u=e(r)}catch(a){return i.onError(a),t}if(s)try{c=n(o,u)}catch(a){return i.onError(a),t}s&&c||(s=!0,o=u,i.onNext(r))},i.onError.bind(i),i.onCompleted.bind(i))})},Me["do"]=Me.doAction=function(t,e,n){var r,i=this; +return"function"==typeof t?r=t:(r=t.onNext.bind(t),e=t.onError.bind(t),n=t.onCompleted.bind(t)),new nn(function(t){return i.subscribe(function(e){try{r(e)}catch(n){t.onError(n)}t.onNext(e)},function(n){if(e){try{e(n)}catch(r){t.onError(r)}t.onError(n)}else t.onError(n)},function(){if(n){try{n()}catch(e){t.onError(e)}t.onCompleted()}else t.onCompleted()})})},Me["finally"]=Me.finallyAction=function(t){var e=this;return new nn(function(n){var r;try{r=e.subscribe(n)}catch(i){throw t(),i}return de(function(){try{r.dispose()}catch(e){throw e}finally{t()}})})},Me.ignoreElements=function(){var t=this;return new nn(function(e){return t.subscribe(D,e.onError.bind(e),e.onCompleted.bind(e))})},Me.materialize=function(){var t=this;return new nn(function(e){return t.subscribe(function(t){e.onNext(Oe(t))},function(t){e.onNext(Re(t)),e.onCompleted()},function(){e.onNext(We()),e.onCompleted()})})},Me.repeat=function(t){return qe(this,t).concat()},Me.retry=function(t){return qe(this,t).catchException()},Me.scan=function(){var e,n,r=!1,i=this;return 2===arguments.length?(r=!0,e=arguments[0],n=arguments[1]):n=arguments[0],new nn(function(o){var s,u,c;return i.subscribe(function(i){try{c||(c=!0),s?u=n(u,i):(u=r?n(e,i):i,s=!0)}catch(a){return o.onError(a),t}o.onNext(u)},o.onError.bind(o),function(){!c&&r&&o.onNext(e),o.onCompleted()})})},Me.skipLast=function(t){var e=this;return new nn(function(n){var r=[];return e.subscribe(function(e){r.push(e),r.length>t&&n.onNext(r.shift())},n.onError.bind(n),n.onCompleted.bind(n))})},Me.startWith=function(){var t,e,n=0;return arguments.length&&"now"in Object(arguments[0])?(e=arguments[0],n=1):e=De,t=ie.call(arguments,n),Pe([$e(t,e),this]).concat()},Me.takeLast=function(t,e){return this.takeLastBuffer(t).selectMany(function(t){return $e(t,e)})},Me.takeLastBuffer=function(t){var e=this;return new nn(function(n){var r=[];return e.subscribe(function(e){r.push(e),r.length>t&&r.shift()},n.onError.bind(n),function(){n.onNext(r),n.onCompleted()})})},Me.windowWithCount=function(t,e){var n=this;if(0>=t)throw Error(j);if(1===arguments.length&&(e=t),0>=e)throw Error(j);return new nn(function(r){var i=new me,o=new we(i),s=0,u=[],c=function(){var t=new un;u.push(t),r.onNext(ue(t,o))};return c(),i.setDisposable(n.subscribe(function(n){for(var r,i=0,o=u.length;o>i;i++)u[i].onNext(n);var a=s-t+1;a>=0&&0===a%e&&(r=u.shift(),r.onCompleted()),s++,0===s%e&&c()},function(t){for(;u.length>0;)u.shift().onError(t);r.onError(t)},function(){for(;u.length>0;)u.shift().onCompleted();r.onCompleted()})),o})},Me.selectConcat=Me.concatMap=function(t,e){return e?this.concatMap(function(n,r){var i=t(n,r),o=W(i)?Ue(i):i;return o.map(function(t){return e(n,t,r)})}):"function"==typeof t?v.call(this,t):v.call(this,function(){return t})},Me.defaultIfEmpty=function(e){var n=this;return e===t&&(e=null),new nn(function(t){var r=!1;return n.subscribe(function(e){r=!0,t.onNext(e)},t.onError.bind(t),function(){r||t.onNext(e),t.onCompleted()})})},Me.distinct=function(e,n){var r=this;return e||(e=S),n||(n=O),new nn(function(i){var o={};return r.subscribe(function(r){var s,u,c,a=!1;try{s=e(r),u=n(s)}catch(h){return i.onError(h),t}for(c in o)if(u===c){a=!0;break}a||(o[u]=null,i.onNext(r))},i.onError.bind(i),i.onCompleted.bind(i))})},Me.groupBy=function(t,e,n){return this.groupByUntil(t,e,function(){return Ke()},n)},Me.groupByUntil=function(e,n,r,i){var o=this;return n||(n=S),i||(i=O),new nn(function(s){var u={},c=new le,a=new we(c);return c.add(o.subscribe(function(o){var h,l,f,p,d,v,b,m,y,w;try{v=e(o),b=i(v)}catch(g){for(w in u)u[w].onError(g);return s.onError(g),t}p=!1;try{y=u[b],y||(y=new un,u[b]=y,p=!0)}catch(g){for(w in u)u[w].onError(g);return s.onError(g),t}if(p){d=new on(v,y,a),l=new on(v,y);try{h=r(l)}catch(g){for(w in u)u[w].onError(g);return s.onError(g),t}s.onNext(d),m=new me,c.add(m);var E=function(){b in u&&(delete u[b],y.onCompleted()),c.remove(m)};m.setDisposable(h.take(1).subscribe(D,function(t){for(w in u)u[w].onError(t);s.onError(t)},function(){E()}))}try{f=n(o)}catch(g){for(w in u)u[w].onError(g);return s.onError(g),t}y.onNext(f)},function(t){for(var e in u)u[e].onError(t);s.onError(t)},function(){for(var t in u)u[t].onCompleted();s.onCompleted()})),a})},Me.select=Me.map=function(e,n){var r=this;return new nn(function(i){var o=0;return r.subscribe(function(s){var u;try{u=e.call(n,s,o++,r)}catch(c){return i.onError(c),t}i.onNext(u)},i.onError.bind(i),i.onCompleted.bind(i))})},Me.pluck=function(t){return this.select(function(e){return e[t]})},Me.selectMany=Me.flatMap=function(t,e){return e?this.selectMany(function(n,r){var i=t(n,r),o=W(i)?Ue(i):i;return o.select(function(t){return e(n,t,r)})}):"function"==typeof t?b.call(this,t):b.call(this,function(){return t})},Me.selectSwitch=Me.flatMapLatest=Me.switchMap=function(t,e){return this.select(t,e).switchLatest()},Me.skip=function(t){if(0>t)throw Error(j);var e=this;return new nn(function(n){var r=t;return e.subscribe(function(t){0>=r?n.onNext(t):r--},n.onError.bind(n),n.onCompleted.bind(n))})},Me.skipWhile=function(e,n){var r=this;return new nn(function(i){var o=0,s=!1;return r.subscribe(function(u){if(!s)try{s=!e.call(n,u,o++,r)}catch(c){return i.onError(c),t}s&&i.onNext(u)},i.onError.bind(i),i.onCompleted.bind(i))})},Me.take=function(t,e){if(0>t)throw Error(j);if(0===t)return Qe(e);var n=this;return new nn(function(e){var r=t;return n.subscribe(function(t){r>0&&(r--,e.onNext(t),0===r&&e.onCompleted())},e.onError.bind(e),e.onCompleted.bind(e))})},Me.takeWhile=function(e,n){var r=this;return new nn(function(i){var o=0,s=!0;return r.subscribe(function(u){if(s){try{s=e.call(n,u,o++,r)}catch(c){return i.onError(c),t}s?i.onNext(u):i.onCompleted()}},i.onError.bind(i),i.onCompleted.bind(i))})},Me.where=Me.filter=function(e,n){var r=this;return new nn(function(i){var o=0;return r.subscribe(function(s){var u;try{u=e.call(n,s,o++,r)}catch(c){return i.onError(c),t}u&&i.onNext(s)},i.onError.bind(i),i.onCompleted.bind(i))})},Me.exclusive=function(){var t=this;return new nn(function(e){var n=!1,r=!1,i=new me,o=new le;return o.add(i),i.setDisposable(t.subscribe(function(t){if(!n){n=!0,W(t)&&(t=Ue(t));var i=new me;o.add(i),i.setDisposable(t.subscribe(e.onNext.bind(e),e.onError.bind(e),function(){o.remove(i),n=!1,r&&1===o.length&&e.onCompleted()}))}},e.onError.bind(e),function(){r=!0,n||1!==o.length||e.onCompleted()})),o})},Me.exclusiveMap=function(e,n){var r=this;return new nn(function(i){var o=0,s=!1,u=!0,c=new me,a=new le;return a.add(c),c.setDisposable(r.subscribe(function(r){s||(s=!0,innerSubscription=new me,a.add(innerSubscription),W(r)&&(r=Ue(r)),innerSubscription.setDisposable(r.subscribe(function(s){var u;try{u=e.call(n,s,o++,r)}catch(c){return i.onError(c),t}i.onNext(u)},i.onError.bind(i),function(){a.remove(innerSubscription),s=!1,u&&1===a.length&&i.onCompleted()})))},i.onError.bind(i),function(){u=!0,1!==a.length||s||i.onCompleted()})),a})};var nn=C.AnonymousObservable=function(e){function n(e){return e===t?e=ve:"function"==typeof e&&(e=de(e)),e}function r(i){function o(t){var e=function(){try{r.setDisposable(n(i(r)))}catch(t){if(!r.fail(t))throw t}},r=new rn(t);return Se.scheduleRequired()?Se.schedule(e):e(),r}return this instanceof r?(e.call(this,o),t):new r(i)}return oe(r,e),r}(He),rn=function(t){function e(e){t.call(this),this.observer=e,this.m=new me}oe(e,t);var n=e.prototype;return n.next=function(t){var e=!1;try{this.observer.onNext(t),e=!0}catch(n){throw n}finally{e||this.dispose()}},n.error=function(t){try{this.observer.onError(t)}catch(e){throw e}finally{this.dispose()}},n.completed=function(){try{this.observer.onCompleted()}catch(t){throw t}finally{this.dispose()}},n.setDisposable=function(t){this.m.setDisposable(t)},n.getDisposable=function(){return this.m.getDisposable()},n.disposable=function(t){return arguments.length?this.getDisposable():setDisposable(t)},n.dispose=function(){t.prototype.dispose.call(this),this.m.dispose()},e}(ze),on=function(t){function e(t){return this.underlyingObservable.subscribe(t)}function n(n,r,i){t.call(this,e),this.key=n,this.underlyingObservable=i?new nn(function(t){return new le(i.getDisposable(),r.subscribe(t))}):r}return oe(n,t),n}(He),sn=function(t,e){this.subject=t,this.observer=e};sn.prototype.dispose=function(){if(!this.subject.isDisposed&&null!==this.observer){var t=this.subject.observers.indexOf(this.observer);this.subject.observers.splice(t,1),this.observer=null}};var un=C.Subject=function(t){function n(t){return e.call(this),this.isStopped?this.exception?(t.onError(this.exception),ve):(t.onCompleted(),ve):(this.observers.push(t),new sn(this,t))}function r(){t.call(this,n),this.isDisposed=!1,this.isStopped=!1,this.observers=[]}return oe(r,t),se(r.prototype,Te,{hasObservers:function(){return this.observers.length>0},onCompleted:function(){if(e.call(this),!this.isStopped){var t=this.observers.slice(0);this.isStopped=!0;for(var n=0,r=t.length;r>n;n++)t[n].onCompleted();this.observers=[]}},onError:function(t){if(e.call(this),!this.isStopped){var n=this.observers.slice(0);this.isStopped=!0,this.exception=t;for(var r=0,i=n.length;i>r;r++)n[r].onError(t);this.observers=[]}},onNext:function(t){if(e.call(this),!this.isStopped)for(var n=this.observers.slice(0),r=0,i=n.length;i>r;r++)n[r].onNext(t)},dispose:function(){this.isDisposed=!0,this.observers=null}}),r.create=function(t,e){return new cn(t,e)},r}(He);C.AsyncSubject=function(t){function n(t){if(e.call(this),!this.isStopped)return this.observers.push(t),new sn(this,t);var n=this.exception,r=this.hasValue,i=this.value;return n?t.onError(n):r?(t.onNext(i),t.onCompleted()):t.onCompleted(),ve}function r(){t.call(this,n),this.isDisposed=!1,this.isStopped=!1,this.value=null,this.hasValue=!1,this.observers=[],this.exception=null}return oe(r,t),se(r.prototype,Te,{hasObservers:function(){return e.call(this),this.observers.length>0},onCompleted:function(){var t,n,r;if(e.call(this),!this.isStopped){this.isStopped=!0;var i=this.observers.slice(0),o=this.value,s=this.hasValue;if(s)for(n=0,r=i.length;r>n;n++)t=i[n],t.onNext(o),t.onCompleted();else for(n=0,r=i.length;r>n;n++)i[n].onCompleted();this.observers=[]}},onError:function(t){if(e.call(this),!this.isStopped){var n=this.observers.slice(0);this.isStopped=!0,this.exception=t;for(var r=0,i=n.length;i>r;r++)n[r].onError(t);this.observers=[]}},onNext:function(t){e.call(this),this.isStopped||(this.value=t,this.hasValue=!0)},dispose:function(){this.isDisposed=!0,this.observers=null,this.exception=null,this.value=null}}),r}(He);var cn=function(t){function e(t){return this.observable.subscribe(t)}function n(n,r){t.call(this,e),this.observer=n,this.observable=r}return oe(n,t),se(n.prototype,Te,{onCompleted:function(){this.observer.onCompleted()},onError:function(t){this.observer.onError(t)},onNext:function(t){this.observer.onNext(t)}}),n}(He);"function"==typeof define&&"object"==typeof define.amd&&define.amd?(y.Rx=C,define(function(){return C})):w&&g?E?(g.exports=C).Rx=C:w.Rx=C:y.Rx=C}).call(this); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.testing.js b/ajax/libs/rxjs/2.2.28/rx.testing.js new file mode 100644 index 000000000..0dc3720e4 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.testing.js @@ -0,0 +1,500 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +;(function (factory) { + var objectTypes = { + 'boolean': false, + 'function': true, + 'object': true, + 'number': false, + 'string': false, + 'undefined': false + }; + + var root = (objectTypes[typeof window] && window) || this, + freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports, + freeModule = objectTypes[typeof module] && module && !module.nodeType && module, + moduleExports = freeModule && freeModule.exports === freeExports && freeExports, + freeGlobal = objectTypes[typeof global] && global; + + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) { + root = freeGlobal; + } + + // Because of build optimizers + if (typeof define === 'function' && define.amd) { + define(['rx.virtualtime', 'exports'], function (Rx, exports) { + root.Rx = factory(root, exports, Rx); + return root.Rx; + }); + } else if (typeof module === 'object' && module && module.exports === freeExports) { + module.exports = factory(root, module.exports, require('./rx.all')); + } else { + root.Rx = factory(root, {}, root.Rx); + } +}.call(this, function (root, exp, Rx, undefined) { + + // Defaults + var Observer = Rx.Observer, + Observable = Rx.Observable, + Notification = Rx.Notification, + VirtualTimeScheduler = Rx.VirtualTimeScheduler, + Disposable = Rx.Disposable, + disposableEmpty = Disposable.empty, + disposableCreate = Disposable.create, + CompositeDisposable = Rx.CompositeDisposable, + SingleAssignmentDisposable = Rx.SingleAssignmentDisposable, + slice = Array.prototype.slice, + inherits = Rx.internals.inherits, + defaultComparer = Rx.internals.isEqual; + + function argsOrArray(args, idx) { + return args.length === 1 && Array.isArray(args[idx]) ? + args[idx] : + slice.call(args); + } + + /** + * @private + * @constructor + */ + function OnNextPredicate(predicate) { + this.predicate = predicate; + }; + + /** + * @private + * @memberOf OnNextPredicate# + */ + OnNextPredicate.prototype.equals = function (other) { + if (other === this) { return true; } + if (other == null) { return false; } + if (other.kind !== 'N') { return false; } + return this.predicate(other.value); + }; + + /** + * @private + * @constructor + */ + function OnErrorPredicate(predicate) { + this.predicate = predicate; + }; + + /** + * @private + * @memberOf OnErrorPredicate# + */ + OnErrorPredicate.prototype.equals = function (other) { + if (other === this) { return true; } + if (other == null) { return false; } + if (other.kind !== 'E') { return false; } + return this.predicate(other.exception); + }; + + /** + * @static + * type Object + */ + var ReactiveTest = Rx.ReactiveTest = { + /** Default virtual time used for creation of observable sequences in unit tests. */ + created: 100, + /** Default virtual time used to subscribe to observable sequences in unit tests. */ + subscribed: 200, + /** Default virtual time used to dispose subscriptions in unit tests. */ + disposed: 1000, + + /** + * Factory method for an OnNext notification record at a given time with a given value or a predicate function. + * + * 1 - ReactiveTest.onNext(200, 42); + * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; }); + * + * @param ticks Recorded virtual time the OnNext notification occurs. + * @param value Recorded value stored in the OnNext notification or a predicate. + * @return Recorded OnNext notification. + */ + onNext: function (ticks, value) { + if (typeof value === 'function') { + return new Recorded(ticks, new OnNextPredicate(value)); + } + return new Recorded(ticks, Notification.createOnNext(value)); + }, + /** + * Factory method for an OnError notification record at a given time with a given error. + * + * 1 - ReactiveTest.onNext(200, new Error('error')); + * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; }); + * + * @param ticks Recorded virtual time the OnError notification occurs. + * @param exception Recorded exception stored in the OnError notification. + * @return Recorded OnError notification. + */ + onError: function (ticks, exception) { + if (typeof exception === 'function') { + return new Recorded(ticks, new OnErrorPredicate(exception)); + } + return new Recorded(ticks, Notification.createOnError(exception)); + }, + /** + * Factory method for an OnCompleted notification record at a given time. + * + * @param ticks Recorded virtual time the OnCompleted notification occurs. + * @return Recorded OnCompleted notification. + */ + onCompleted: function (ticks) { + return new Recorded(ticks, Notification.createOnCompleted()); + }, + /** + * Factory method for a subscription record based on a given subscription and disposal time. + * + * @param start Virtual time indicating when the subscription was created. + * @param end Virtual time indicating when the subscription was disposed. + * @return Subscription object. + */ + subscribe: function (start, end) { + return new Subscription(start, end); + } + }; + + /** + * Creates a new object recording the production of the specified value at the given virtual time. + * + * @constructor + * @param {Number} time Virtual time the value was produced on. + * @param {Mixed} value Value that was produced. + * @param {Function} comparer An optional comparer. + */ + var Recorded = Rx.Recorded = function (time, value, comparer) { + this.time = time; + this.value = value; + this.comparer = comparer || defaultComparer; + }; + + /** + * Checks whether the given recorded object is equal to the current instance. + * + * @param {Recorded} other Recorded object to check for equality. + * @returns {Boolean} true if both objects are equal; false otherwise. + */ + Recorded.prototype.equals = function (other) { + return this.time === other.time && this.comparer(this.value, other.value); + }; + + /** + * Returns a string representation of the current Recorded value. + * + * @returns {String} String representation of the current Recorded value. + */ + Recorded.prototype.toString = function () { + return this.value.toString() + '@' + this.time; + }; + + /** + * Creates a new subscription object with the given virtual subscription and unsubscription time. + * + * @constructor + * @param {Number} subscribe Virtual time at which the subscription occurred. + * @param {Number} unsubscribe Virtual time at which the unsubscription occurred. + */ + var Subscription = Rx.Subscription = function (start, end) { + this.subscribe = start; + this.unsubscribe = end || Number.MAX_VALUE; + }; + + /** + * Checks whether the given subscription is equal to the current instance. + * @param other Subscription object to check for equality. + * @returns {Boolean} true if both objects are equal; false otherwise. + */ + Subscription.prototype.equals = function (other) { + return this.subscribe === other.subscribe && this.unsubscribe === other.unsubscribe; + }; + + /** + * Returns a string representation of the current Subscription value. + * @returns {String} String representation of the current Subscription value. + */ + Subscription.prototype.toString = function () { + return '(' + this.subscribe + ', ' + this.unsubscribe === Number.MAX_VALUE ? 'Infinite' : this.unsubscribe + ')'; + }; + + /** @private */ + var MockDisposable = Rx.MockDisposable = function (scheduler) { + this.scheduler = scheduler; + this.disposes = []; + this.disposes.push(this.scheduler.clock); + }; + + /* + * @memberOf MockDisposable# + * @prviate + */ + MockDisposable.prototype.dispose = function () { + this.disposes.push(this.scheduler.clock); + }; + + /** @private */ + var MockObserver = (function (_super) { + inherits(MockObserver, _super); + + /* + * @constructor + * @prviate + */ + function MockObserver(scheduler) { + _super.call(this); + this.scheduler = scheduler; + this.messages = []; + } + + var MockObserverPrototype = MockObserver.prototype; + + /* + * @memberOf MockObserverPrototype# + * @prviate + */ + MockObserverPrototype.onNext = function (value) { + this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnNext(value))); + }; + + /* + * @memberOf MockObserverPrototype# + * @prviate + */ + MockObserverPrototype.onError = function (exception) { + this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnError(exception))); + }; + + /* + * @memberOf MockObserverPrototype# + * @prviate + */ + MockObserverPrototype.onCompleted = function () { + this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnCompleted())); + }; + + return MockObserver; + })(Observer); + + /** @private */ + var HotObservable = (function (_super) { + + function subscribe(observer) { + var observable = this; + this.observers.push(observer); + this.subscriptions.push(new Subscription(this.scheduler.clock)); + var index = this.subscriptions.length - 1; + return disposableCreate(function () { + var idx = observable.observers.indexOf(observer); + observable.observers.splice(idx, 1); + observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock); + }); + } + + inherits(HotObservable, _super); + + /** + * @private + * @constructor + */ + function HotObservable(scheduler, messages) { + _super.call(this, subscribe); + var message, notification, observable = this; + this.scheduler = scheduler; + this.messages = messages; + this.subscriptions = []; + this.observers = []; + for (var i = 0, len = this.messages.length; i < len; i++) { + message = this.messages[i]; + notification = message.value; + (function (innerNotification) { + scheduler.scheduleAbsoluteWithState(null, message.time, function () { + var obs = observable.observers.slice(0); + + for (var j = 0, jLen = obs.length; j < jLen; j++) { + innerNotification.accept(obs[j]); + } + return disposableEmpty; + }); + })(notification); + } + } + + return HotObservable; + })(Observable); + + /** @private */ + var ColdObservable = (function (_super) { + + function subscribe(observer) { + var message, notification, observable = this; + this.subscriptions.push(new Subscription(this.scheduler.clock)); + var index = this.subscriptions.length - 1; + var d = new CompositeDisposable(); + for (var i = 0, len = this.messages.length; i < len; i++) { + message = this.messages[i]; + notification = message.value; + (function (innerNotification) { + d.add(observable.scheduler.scheduleRelativeWithState(null, message.time, function () { + innerNotification.accept(observer); + return disposableEmpty; + })); + })(notification); + } + return disposableCreate(function () { + observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock); + d.dispose(); + }); + } + + inherits(ColdObservable, _super); + + /** + * @private + * @constructor + */ + function ColdObservable(scheduler, messages) { + _super.call(this, subscribe); + this.scheduler = scheduler; + this.messages = messages; + this.subscriptions = []; + } + + return ColdObservable; + })(Observable); + + /** Virtual time scheduler used for testing applications and libraries built using Reactive Extensions. */ + Rx.TestScheduler = (function (_super) { + inherits(TestScheduler, _super); + + function baseComparer(x, y) { + return x > y ? 1 : (x < y ? -1 : 0); + } + + /** @constructor */ + function TestScheduler() { + _super.call(this, 0, baseComparer); + } + + /** + * Schedules an action to be executed at the specified virtual time. + * + * @param state State passed to the action to be executed. + * @param dueTime Absolute virtual time at which to execute the action. + * @param action Action to be executed. + * @return Disposable object used to cancel the scheduled action (best effort). + */ + TestScheduler.prototype.scheduleAbsoluteWithState = function (state, dueTime, action) { + if (dueTime <= this.clock) { + dueTime = this.clock + 1; + } + return _super.prototype.scheduleAbsoluteWithState.call(this, state, dueTime, action); + }; + /** + * Adds a relative virtual time to an absolute virtual time value. + * + * @param absolute Absolute virtual time value. + * @param relative Relative virtual time value to add. + * @return Resulting absolute virtual time sum value. + */ + TestScheduler.prototype.add = function (absolute, relative) { + return absolute + relative; + }; + /** + * Converts the absolute virtual time value to a DateTimeOffset value. + * + * @param absolute Absolute virtual time value to convert. + * @return Corresponding DateTimeOffset value. + */ + TestScheduler.prototype.toDateTimeOffset = function (absolute) { + return new Date(absolute).getTime(); + }; + /** + * Converts the TimeSpan value to a relative virtual time value. + * + * @param timeSpan TimeSpan value to convert. + * @return Corresponding relative virtual time value. + */ + TestScheduler.prototype.toRelative = function (timeSpan) { + return timeSpan; + }; + /** + * Starts the test scheduler and uses the specified virtual times to invoke the factory function, subscribe to the resulting sequence, and dispose the subscription. + * + * @param create Factory method to create an observable sequence. + * @param created Virtual time at which to invoke the factory to create an observable sequence. + * @param subscribed Virtual time at which to subscribe to the created observable sequence. + * @param disposed Virtual time at which to dispose the subscription. + * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active. + */ + TestScheduler.prototype.startWithTiming = function (create, created, subscribed, disposed) { + var observer = this.createObserver(), source, subscription; + this.scheduleAbsoluteWithState(null, created, function () { + source = create(); + return disposableEmpty; + }); + this.scheduleAbsoluteWithState(null, subscribed, function () { + subscription = source.subscribe(observer); + return disposableEmpty; + }); + this.scheduleAbsoluteWithState(null, disposed, function () { + subscription.dispose(); + return disposableEmpty; + }); + this.start(); + return observer; + }; + /** + * Starts the test scheduler and uses the specified virtual time to dispose the subscription to the sequence obtained through the factory function. + * Default virtual times are used for factory invocation and sequence subscription. + * + * @param create Factory method to create an observable sequence. + * @param disposed Virtual time at which to dispose the subscription. + * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active. + */ + TestScheduler.prototype.startWithDispose = function (create, disposed) { + return this.startWithTiming(create, ReactiveTest.created, ReactiveTest.subscribed, disposed); + }; + /** + * Starts the test scheduler and uses default virtual times to invoke the factory function, to subscribe to the resulting sequence, and to dispose the subscription. + * + * @param create Factory method to create an observable sequence. + * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active. + */ + TestScheduler.prototype.startWithCreate = function (create) { + return this.startWithTiming(create, ReactiveTest.created, ReactiveTest.subscribed, ReactiveTest.disposed); + }; + /** + * Creates a hot observable using the specified timestamped notification messages either as an array or arguments. + * + * @param messages Notifications to surface through the created sequence at their specified absolute virtual times. + * @return Hot observable sequence that can be used to assert the timing of subscriptions and notifications. + */ + TestScheduler.prototype.createHotObservable = function () { + var messages = argsOrArray(arguments, 0); + return new HotObservable(this, messages); + }; + /** + * Creates a cold observable using the specified timestamped notification messages either as an array or arguments. + * + * @param messages Notifications to surface through the created sequence at their specified virtual time offsets from the sequence subscription time. + * @return Cold observable sequence that can be used to assert the timing of subscriptions and notifications. + */ + TestScheduler.prototype.createColdObservable = function () { + var messages = argsOrArray(arguments, 0); + return new ColdObservable(this, messages); + }; + /** + * Creates an observer that records received notification messages and timestamps those. + * + * @return Observer that can be used to assert the timing of received notifications. + */ + TestScheduler.prototype.createObserver = function () { + return new MockObserver(this); + }; + + return TestScheduler; + })(VirtualTimeScheduler); + + return Rx; +})); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.testing.min.js b/ajax/libs/rxjs/2.2.28/rx.testing.min.js new file mode 100644 index 000000000..9f0b63bb6 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.testing.min.js @@ -0,0 +1 @@ +(function(t){var e={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},n=e[typeof window]&&window||this,r=e[typeof exports]&&exports&&!exports.nodeType&&exports,i=e[typeof module]&&module&&!module.nodeType&&module,o=(i&&i.exports===r&&r,e[typeof global]&&global);!o||o.global!==o&&o.window!==o||(n=o),"function"==typeof define&&define.amd?define(["rx.virtualtime","exports"],function(e,r){return n.Rx=t(n,r,e),n.Rx}):"object"==typeof module&&module&&module.exports===r?module.exports=t(n,module.exports,require("./rx.all")):n.Rx=t(n,{},n.Rx)}).call(this,function(t,e,n){function r(t,e){return 1===t.length&&Array.isArray(t[e])?t[e]:d.call(t)}function i(t){this.predicate=t}function o(t){this.predicate=t}var s=n.Observer,u=n.Observable,c=n.Notification,a=n.VirtualTimeScheduler,h=n.Disposable,l=h.empty,f=h.create,p=n.CompositeDisposable,d=(n.SingleAssignmentDisposable,Array.prototype.slice),b=n.internals.inherits,v=n.internals.isEqual;i.prototype.equals=function(t){return t===this?!0:null==t?!1:"N"!==t.kind?!1:this.predicate(t.value)},o.prototype.equals=function(t){return t===this?!0:null==t?!1:"E"!==t.kind?!1:this.predicate(t.exception)};var m=n.ReactiveTest={created:100,subscribed:200,disposed:1e3,onNext:function(t,e){return"function"==typeof e?new y(t,new i(e)):new y(t,c.createOnNext(e))},onError:function(t,e){return"function"==typeof e?new y(t,new o(e)):new y(t,c.createOnError(e))},onCompleted:function(t){return new y(t,c.createOnCompleted())},subscribe:function(t,e){return new w(t,e)}},y=n.Recorded=function(t,e,n){this.time=t,this.value=e,this.comparer=n||v};y.prototype.equals=function(t){return this.time===t.time&&this.comparer(this.value,t.value)},y.prototype.toString=function(){return""+this.value+"@"+this.time};var w=n.Subscription=function(t,e){this.subscribe=t,this.unsubscribe=e||Number.MAX_VALUE};w.prototype.equals=function(t){return this.subscribe===t.subscribe&&this.unsubscribe===t.unsubscribe},w.prototype.toString=function(){return"("+this.subscribe+", "+this.unsubscribe===Number.MAX_VALUE?"Infinite":this.unsubscribe+")"};var g=n.MockDisposable=function(t){this.scheduler=t,this.disposes=[],this.disposes.push(this.scheduler.clock)};g.prototype.dispose=function(){this.disposes.push(this.scheduler.clock)};var E=function(t){function e(e){t.call(this),this.scheduler=e,this.messages=[]}b(e,t);var n=e.prototype;return n.onNext=function(t){this.messages.push(new y(this.scheduler.clock,c.createOnNext(t)))},n.onError=function(t){this.messages.push(new y(this.scheduler.clock,c.createOnError(t)))},n.onCompleted=function(){this.messages.push(new y(this.scheduler.clock,c.createOnCompleted()))},e}(s),x=function(t){function e(t){var e=this;this.observers.push(t),this.subscriptions.push(new w(this.scheduler.clock));var n=this.subscriptions.length-1;return f(function(){var r=e.observers.indexOf(t);e.observers.splice(r,1),e.subscriptions[n]=new w(e.subscriptions[n].subscribe,e.scheduler.clock)})}function n(n,r){t.call(this,e);var i,o,s=this;this.scheduler=n,this.messages=r,this.subscriptions=[],this.observers=[];for(var u=0,c=this.messages.length;c>u;u++)i=this.messages[u],o=i.value,function(t){n.scheduleAbsoluteWithState(null,i.time,function(){for(var e=s.observers.slice(0),n=0,r=e.length;r>n;n++)t.accept(e[n]);return l})}(o)}return b(n,t),n}(u),C=function(t){function e(t){var e,n,r=this;this.subscriptions.push(new w(this.scheduler.clock));for(var i=this.subscriptions.length-1,o=new p,s=0,u=this.messages.length;u>s;s++)e=this.messages[s],n=e.value,function(n){o.add(r.scheduler.scheduleRelativeWithState(null,e.time,function(){return n.accept(t),l}))}(n);return f(function(){r.subscriptions[i]=new w(r.subscriptions[i].subscribe,r.scheduler.clock),o.dispose()})}function n(n,r){t.call(this,e),this.scheduler=n,this.messages=r,this.subscriptions=[]}return b(n,t),n}(u);return n.TestScheduler=function(t){function e(t,e){return t>e?1:e>t?-1:0}function n(){t.call(this,0,e)}return b(n,t),n.prototype.scheduleAbsoluteWithState=function(e,n,r){return this.clock>=n&&(n=this.clock+1),t.prototype.scheduleAbsoluteWithState.call(this,e,n,r)},n.prototype.add=function(t,e){return t+e},n.prototype.toDateTimeOffset=function(t){return new Date(t).getTime()},n.prototype.toRelative=function(t){return t},n.prototype.startWithTiming=function(t,e,n,r){var i,o,s=this.createObserver();return this.scheduleAbsoluteWithState(null,e,function(){return i=t(),l}),this.scheduleAbsoluteWithState(null,n,function(){return o=i.subscribe(s),l}),this.scheduleAbsoluteWithState(null,r,function(){return o.dispose(),l}),this.start(),s},n.prototype.startWithDispose=function(t,e){return this.startWithTiming(t,m.created,m.subscribed,e)},n.prototype.startWithCreate=function(t){return this.startWithTiming(t,m.created,m.subscribed,m.disposed)},n.prototype.createHotObservable=function(){var t=r(arguments,0);return new x(this,t)},n.prototype.createColdObservable=function(){var t=r(arguments,0);return new C(this,t)},n.prototype.createObserver=function(){return new E(this)},n}(a),n}); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.time.js b/ajax/libs/rxjs/2.2.28/rx.time.js new file mode 100644 index 000000000..868079ce8 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.time.js @@ -0,0 +1,1166 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +;(function (factory) { + var objectTypes = { + 'boolean': false, + 'function': true, + 'object': true, + 'number': false, + 'string': false, + 'undefined': false + }; + + var root = (objectTypes[typeof window] && window) || this, + freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports, + freeModule = objectTypes[typeof module] && module && !module.nodeType && module, + moduleExports = freeModule && freeModule.exports === freeExports && freeExports, + freeGlobal = objectTypes[typeof global] && global; + + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) { + root = freeGlobal; + } + + // Because of build optimizers + if (typeof define === 'function' && define.amd) { + define(['rx', 'exports'], function (Rx, exports) { + root.Rx = factory(root, exports, Rx); + return root.Rx; + }); + } else if (typeof module === 'object' && module && module.exports === freeExports) { + module.exports = factory(root, module.exports, require('./rx')); + } else { + root.Rx = factory(root, {}, root.Rx); + } +}.call(this, function (root, exp, Rx, undefined) { + + // Refernces + var Observable = Rx.Observable, + observableProto = Observable.prototype, + AnonymousObservable = Rx.AnonymousObservable, + observableDefer = Observable.defer, + observableEmpty = Observable.empty, + observableNever = Observable.never, + observableThrow = Observable.throwException, + observableFromArray = Observable.fromArray, + timeoutScheduler = Rx.Scheduler.timeout, + SingleAssignmentDisposable = Rx.SingleAssignmentDisposable, + SerialDisposable = Rx.SerialDisposable, + CompositeDisposable = Rx.CompositeDisposable, + RefCountDisposable = Rx.RefCountDisposable, + Subject = Rx.Subject, + addRef = Rx.internals.addRef, + normalizeTime = Rx.Scheduler.normalize, + isPromise = Rx.helpers.isPromise, + observableFromPromise = Observable.fromPromise; + + function observableTimerDate(dueTime, scheduler) { + return new AnonymousObservable(function (observer) { + return scheduler.scheduleWithAbsolute(dueTime, function () { + observer.onNext(0); + observer.onCompleted(); + }); + }); + } + + function observableTimerDateAndPeriod(dueTime, period, scheduler) { + var p = normalizeTime(period); + return new AnonymousObservable(function (observer) { + var count = 0, d = dueTime; + return scheduler.scheduleRecursiveWithAbsolute(d, function (self) { + var now; + if (p > 0) { + now = scheduler.now(); + d = d + p; + if (d <= now) { + d = now + p; + } + } + observer.onNext(count++); + self(d); + }); + }); + } + + function observableTimerTimeSpan(dueTime, scheduler) { + var d = normalizeTime(dueTime); + return new AnonymousObservable(function (observer) { + return scheduler.scheduleWithRelative(d, function () { + observer.onNext(0); + observer.onCompleted(); + }); + }); + } + + function observableTimerTimeSpanAndPeriod(dueTime, period, scheduler) { + if (dueTime === period) { + return new AnonymousObservable(function (observer) { + return scheduler.schedulePeriodicWithState(0, period, function (count) { + observer.onNext(count); + return count + 1; + }); + }); + } + return observableDefer(function () { + return observableTimerDateAndPeriod(scheduler.now() + dueTime, period, scheduler); + }); + } + + /** + * Returns an observable sequence that produces a value after each period. + * + * @example + * 1 - res = Rx.Observable.interval(1000); + * 2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout); + * + * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds). + * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used. + * @returns {Observable} An observable sequence that produces a value after each period. + */ + var observableinterval = Observable.interval = function (period, scheduler) { + scheduler || (scheduler = timeoutScheduler); + return observableTimerTimeSpanAndPeriod(period, period, scheduler); + }; + + /** + * Returns an observable sequence that produces a value after dueTime has elapsed and then after each period. + * + * @example + * 1 - res = Rx.Observable.timer(new Date()); + * 2 - res = Rx.Observable.timer(new Date(), 1000); + * 3 - res = Rx.Observable.timer(new Date(), Rx.Scheduler.timeout); + * 4 - res = Rx.Observable.timer(new Date(), 1000, Rx.Scheduler.timeout); + * + * 5 - res = Rx.Observable.timer(5000); + * 6 - res = Rx.Observable.timer(5000, 1000); + * 7 - res = Rx.Observable.timer(5000, Rx.Scheduler.timeout); + * 8 - res = Rx.Observable.timer(5000, 1000, Rx.Scheduler.timeout); + * + * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value. + * @param {Mixed} [periodOrScheduler] Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring. + * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period. + */ + var observableTimer = Observable.timer = function (dueTime, periodOrScheduler, scheduler) { + var period; + scheduler || (scheduler = timeoutScheduler); + if (periodOrScheduler !== undefined && typeof periodOrScheduler === 'number') { + period = periodOrScheduler; + } else if (periodOrScheduler !== undefined && typeof periodOrScheduler === 'object') { + scheduler = periodOrScheduler; + } + if (dueTime instanceof Date && period === undefined) { + return observableTimerDate(dueTime.getTime(), scheduler); + } + if (dueTime instanceof Date && period !== undefined) { + period = periodOrScheduler; + return observableTimerDateAndPeriod(dueTime.getTime(), period, scheduler); + } + if (period === undefined) { + return observableTimerTimeSpan(dueTime, scheduler); + } + return observableTimerTimeSpanAndPeriod(dueTime, period, scheduler); + }; + + function observableDelayTimeSpan(dueTime, scheduler) { + var source = this; + return new AnonymousObservable(function (observer) { + var active = false, + cancelable = new SerialDisposable(), + exception = null, + q = [], + running = false, + subscription; + subscription = source.materialize().timestamp(scheduler).subscribe(function (notification) { + var d, shouldRun; + if (notification.value.kind === 'E') { + q = []; + q.push(notification); + exception = notification.value.exception; + shouldRun = !running; + } else { + q.push({ value: notification.value, timestamp: notification.timestamp + dueTime }); + shouldRun = !active; + active = true; + } + if (shouldRun) { + if (exception !== null) { + observer.onError(exception); + } else { + d = new SingleAssignmentDisposable(); + cancelable.setDisposable(d); + d.setDisposable(scheduler.scheduleRecursiveWithRelative(dueTime, function (self) { + var e, recurseDueTime, result, shouldRecurse; + if (exception !== null) { + return; + } + running = true; + do { + result = null; + if (q.length > 0 && q[0].timestamp - scheduler.now() <= 0) { + result = q.shift().value; + } + if (result !== null) { + result.accept(observer); + } + } while (result !== null); + shouldRecurse = false; + recurseDueTime = 0; + if (q.length > 0) { + shouldRecurse = true; + recurseDueTime = Math.max(0, q[0].timestamp - scheduler.now()); + } else { + active = false; + } + e = exception; + running = false; + if (e !== null) { + observer.onError(e); + } else if (shouldRecurse) { + self(recurseDueTime); + } + })); + } + } + }); + return new CompositeDisposable(subscription, cancelable); + }); + } + + function observableDelayDate(dueTime, scheduler) { + var self = this; + return observableDefer(function () { + var timeSpan = dueTime - scheduler.now(); + return observableDelayTimeSpan.call(self, timeSpan, scheduler); + }); + } + + /** + * Time shifts the observable sequence by dueTime. The relative time intervals between the values are preserved. + * + * @example + * 1 - res = Rx.Observable.delay(new Date()); + * 2 - res = Rx.Observable.delay(new Date(), Rx.Scheduler.timeout); + * + * 3 - res = Rx.Observable.delay(5000); + * 4 - res = Rx.Observable.delay(5000, 1000, Rx.Scheduler.timeout); + * @memberOf Observable# + * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence. + * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} Time-shifted sequence. + */ + observableProto.delay = function (dueTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + return dueTime instanceof Date ? + observableDelayDate.call(this, dueTime.getTime(), scheduler) : + observableDelayTimeSpan.call(this, dueTime, scheduler); + }; + + /** + * Ignores values from an observable sequence which are followed by another value before dueTime. + * + * @example + * 1 - res = source.throttle(5000); // 5 seconds + * 2 - res = source.throttle(5000, scheduler); + * + * @param {Number} dueTime Duration of the throttle period for each value (specified as an integer denoting milliseconds). + * @param {Scheduler} [scheduler] Scheduler to run the throttle timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} The throttled sequence. + */ + observableProto.throttle = function (dueTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + var source = this; + return this.throttleWithSelector(function () { return observableTimer(dueTime, scheduler); }) + }; + + /** + * Projects each element of an observable sequence into zero or more windows which are produced based on timing information. + * + * @example + * 1 - res = xs.windowWithTime(1000, scheduler); // non-overlapping segments of 1 second + * 2 - res = xs.windowWithTime(1000, 500 , scheduler); // segments of 1 second with time shift 0.5 seconds + * + * @param {Number} timeSpan Length of each window (specified as an integer denoting milliseconds). + * @param {Mixed} [timeShiftOrScheduler] Interval between creation of consecutive windows (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent windows. + * @param {Scheduler} [scheduler] Scheduler to run windowing timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence of windows. + */ + observableProto.windowWithTime = function (timeSpan, timeShiftOrScheduler, scheduler) { + var source = this, timeShift; + if (timeShiftOrScheduler === undefined) { + timeShift = timeSpan; + } + if (scheduler === undefined) { + scheduler = timeoutScheduler; + } + if (typeof timeShiftOrScheduler === 'number') { + timeShift = timeShiftOrScheduler; + } else if (typeof timeShiftOrScheduler === 'object') { + timeShift = timeSpan; + scheduler = timeShiftOrScheduler; + } + return new AnonymousObservable(function (observer) { + var groupDisposable, + nextShift = timeShift, + nextSpan = timeSpan, + q = [], + refCountDisposable, + timerD = new SerialDisposable(), + totalTime = 0; + groupDisposable = new CompositeDisposable(timerD), + refCountDisposable = new RefCountDisposable(groupDisposable); + + function createTimer () { + var m = new SingleAssignmentDisposable(), + isSpan = false, + isShift = false; + timerD.setDisposable(m); + if (nextSpan === nextShift) { + isSpan = true; + isShift = true; + } else if (nextSpan < nextShift) { + isSpan = true; + } else { + isShift = true; + } + var newTotalTime = isSpan ? nextSpan : nextShift, + ts = newTotalTime - totalTime; + totalTime = newTotalTime; + if (isSpan) { + nextSpan += timeShift; + } + if (isShift) { + nextShift += timeShift; + } + m.setDisposable(scheduler.scheduleWithRelative(ts, function () { + var s; + if (isShift) { + s = new Subject(); + q.push(s); + observer.onNext(addRef(s, refCountDisposable)); + } + if (isSpan) { + s = q.shift(); + s.onCompleted(); + } + createTimer(); + })); + }; + q.push(new Subject()); + observer.onNext(addRef(q[0], refCountDisposable)); + createTimer(); + groupDisposable.add(source.subscribe(function (x) { + var i, s; + for (i = 0; i < q.length; i++) { + s = q[i]; + s.onNext(x); + } + }, function (e) { + var i, s; + for (i = 0; i < q.length; i++) { + s = q[i]; + s.onError(e); + } + observer.onError(e); + }, function () { + var i, s; + for (i = 0; i < q.length; i++) { + s = q[i]; + s.onCompleted(); + } + observer.onCompleted(); + })); + return refCountDisposable; + }); + }; + + /** + * Projects each element of an observable sequence into a window that is completed when either it's full or a given amount of time has elapsed. + * @example + * 1 - res = source.windowWithTimeOrCount(5000, 50); // 5s or 50 items + * 2 - res = source.windowWithTimeOrCount(5000, 50, scheduler); //5s or 50 items + * + * @memberOf Observable# + * @param {Number} timeSpan Maximum time length of a window. + * @param {Number} count Maximum element count of a window. + * @param {Scheduler} [scheduler] Scheduler to run windowing timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence of windows. + */ + observableProto.windowWithTimeOrCount = function (timeSpan, count, scheduler) { + var source = this; + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var createTimer, + groupDisposable, + n = 0, + refCountDisposable, + s, + timerD = new SerialDisposable(), + windowId = 0; + groupDisposable = new CompositeDisposable(timerD); + refCountDisposable = new RefCountDisposable(groupDisposable); + createTimer = function (id) { + var m = new SingleAssignmentDisposable(); + timerD.setDisposable(m); + m.setDisposable(scheduler.scheduleWithRelative(timeSpan, function () { + var newId; + if (id !== windowId) { + return; + } + n = 0; + newId = ++windowId; + s.onCompleted(); + s = new Subject(); + observer.onNext(addRef(s, refCountDisposable)); + createTimer(newId); + })); + }; + s = new Subject(); + observer.onNext(addRef(s, refCountDisposable)); + createTimer(0); + groupDisposable.add(source.subscribe(function (x) { + var newId = 0, newWindow = false; + s.onNext(x); + n++; + if (n === count) { + newWindow = true; + n = 0; + newId = ++windowId; + s.onCompleted(); + s = new Subject(); + observer.onNext(addRef(s, refCountDisposable)); + } + if (newWindow) { + createTimer(newId); + } + }, function (e) { + s.onError(e); + observer.onError(e); + }, function () { + s.onCompleted(); + observer.onCompleted(); + })); + return refCountDisposable; + }); + }; + + /** + * Projects each element of an observable sequence into zero or more buffers which are produced based on timing information. + * + * @example + * 1 - res = xs.bufferWithTime(1000, scheduler); // non-overlapping segments of 1 second + * 2 - res = xs.bufferWithTime(1000, 500, scheduler; // segments of 1 second with time shift 0.5 seconds + * + * @param {Number} timeSpan Length of each buffer (specified as an integer denoting milliseconds). + * @param {Mixed} [timeShiftOrScheduler] Interval between creation of consecutive buffers (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent buffers. + * @param {Scheduler} [scheduler] Scheduler to run buffer timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence of buffers. + */ + observableProto.bufferWithTime = function (timeSpan, timeShiftOrScheduler, scheduler) { + return this.windowWithTime.apply(this, arguments).selectMany(function (x) { return x.toArray(); }); + }; + + /** + * Projects each element of an observable sequence into a buffer that is completed when either it's full or a given amount of time has elapsed. + * + * @example + * 1 - res = source.bufferWithTimeOrCount(5000, 50); // 5s or 50 items in an array + * 2 - res = source.bufferWithTimeOrCount(5000, 50, scheduler); // 5s or 50 items in an array + * + * @param {Number} timeSpan Maximum time length of a buffer. + * @param {Number} count Maximum element count of a buffer. + * @param {Scheduler} [scheduler] Scheduler to run bufferin timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence of buffers. + */ + observableProto.bufferWithTimeOrCount = function (timeSpan, count, scheduler) { + return this.windowWithTimeOrCount(timeSpan, count, scheduler).selectMany(function (x) { + return x.toArray(); + }); + }; + + /** + * Records the time interval between consecutive values in an observable sequence. + * + * @example + * 1 - res = source.timeInterval(); + * 2 - res = source.timeInterval(Rx.Scheduler.timeout); + * + * @param [scheduler] Scheduler used to compute time intervals. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence with time interval information on values. + */ + observableProto.timeInterval = function (scheduler) { + var source = this; + scheduler || (scheduler = timeoutScheduler); + return observableDefer(function () { + var last = scheduler.now(); + return source.select(function (x) { + var now = scheduler.now(), span = now - last; + last = now; + return { + value: x, + interval: span + }; + }); + }); + }; + + /** + * Records the timestamp for each value in an observable sequence. + * + * @example + * 1 - res = source.timestamp(); // produces { value: x, timestamp: ts } + * 2 - res = source.timestamp(Rx.Scheduler.timeout); + * + * @param {Scheduler} [scheduler] Scheduler used to compute timestamps. If not specified, the timeout scheduler is used. + * @returns {Observable} An observable sequence with timestamp information on values. + */ + observableProto.timestamp = function (scheduler) { + scheduler || (scheduler = timeoutScheduler); + return this.select(function (x) { + return { + value: x, + timestamp: scheduler.now() + }; + }); + }; + + function sampleObservable(source, sampler) { + + return new AnonymousObservable(function (observer) { + var atEnd, value, hasValue; + + function sampleSubscribe() { + if (hasValue) { + hasValue = false; + observer.onNext(value); + } + if (atEnd) { + observer.onCompleted(); + } + } + + return new CompositeDisposable( + source.subscribe(function (newValue) { + hasValue = true; + value = newValue; + }, observer.onError.bind(observer), function () { + atEnd = true; + }), + sampler.subscribe(sampleSubscribe, observer.onError.bind(observer), sampleSubscribe) + ); + }); + } + + /** + * Samples the observable sequence at each interval. + * + * @example + * 1 - res = source.sample(sampleObservable); // Sampler tick sequence + * 2 - res = source.sample(5000); // 5 seconds + * 2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds + * + * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable. + * @param {Scheduler} [scheduler] Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used. + * @returns {Observable} Sampled observable sequence. + */ + observableProto.sample = function (intervalOrSampler, scheduler) { + scheduler || (scheduler = timeoutScheduler); + if (typeof intervalOrSampler === 'number') { + return sampleObservable(this, observableinterval(intervalOrSampler, scheduler)); + } + return sampleObservable(this, intervalOrSampler); + }; + + /** + * Returns the source observable sequence or the other observable sequence if dueTime elapses. + * + * @example + * 1 - res = source.timeout(new Date()); // As a date + * 2 - res = source.timeout(5000); // 5 seconds + * 3 - res = source.timeout(new Date(), Rx.Observable.returnValue(42)); // As a date and timeout observable + * 4 - res = source.timeout(5000, Rx.Observable.returnValue(42)); // 5 seconds and timeout observable + * 5 - res = source.timeout(new Date(), Rx.Observable.returnValue(42), Rx.Scheduler.timeout); // As a date and timeout observable + * 6 - res = source.timeout(5000, Rx.Observable.returnValue(42), Rx.Scheduler.timeout); // 5 seconds and timeout observable + * + * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs. + * @param {Observable} [other] Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used. + * @param {Scheduler} [scheduler] Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used. + * @returns {Observable} The source sequence switching to the other sequence in case of a timeout. + */ + observableProto.timeout = function (dueTime, other, scheduler) { + other || (other = observableThrow(new Error('Timeout'))); + scheduler || (scheduler = timeoutScheduler); + + var source = this, schedulerMethod = dueTime instanceof Date ? + 'scheduleWithAbsolute' : + 'scheduleWithRelative'; + + return new AnonymousObservable(function (observer) { + var id = 0, + original = new SingleAssignmentDisposable(), + subscription = new SerialDisposable(), + switched = false, + timer = new SerialDisposable(); + + subscription.setDisposable(original); + + var createTimer = function () { + var myId = id; + timer.setDisposable(scheduler[schedulerMethod](dueTime, function () { + if (id === myId) { + isPromise(other) && (other = observableFromPromise(other)); + subscription.setDisposable(other.subscribe(observer)); + } + })); + }; + + createTimer(); + + original.setDisposable(source.subscribe(function (x) { + if (!switched) { + id++; + observer.onNext(x); + createTimer(); + } + }, function (e) { + if (!switched) { + id++; + observer.onError(e); + } + }, function () { + if (!switched) { + id++; + observer.onCompleted(); + } + })); + return new CompositeDisposable(subscription, timer); + }); + }; + + /** + * Generates an observable sequence by iterating a state from an initial state until the condition fails. + * + * @example + * res = source.generateWithAbsoluteTime(0, + * function (x) { return return true; }, + * function (x) { return x + 1; }, + * function (x) { return x; }, + * function (x) { return new Date(); } + * }); + * + * @param {Mixed} initialState Initial state. + * @param {Function} condition Condition to terminate generation (upon returning false). + * @param {Function} iterate Iteration step function. + * @param {Function} resultSelector Selector function for results produced in the sequence. + * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning Date values. + * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used. + * @returns {Observable} The generated sequence. + */ + Observable.generateWithAbsoluteTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) { + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var first = true, + hasResult = false, + result, + state = initialState, + time; + return scheduler.scheduleRecursiveWithAbsolute(scheduler.now(), function (self) { + if (hasResult) { + observer.onNext(result); + } + try { + if (first) { + first = false; + } else { + state = iterate(state); + } + hasResult = condition(state); + if (hasResult) { + result = resultSelector(state); + time = timeSelector(state); + } + } catch (e) { + observer.onError(e); + return; + } + if (hasResult) { + self(time); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * Generates an observable sequence by iterating a state from an initial state until the condition fails. + * + * @example + * res = source.generateWithRelativeTime(0, + * function (x) { return return true; }, + * function (x) { return x + 1; }, + * function (x) { return x; }, + * function (x) { return 500; } + * ); + * + * @param {Mixed} initialState Initial state. + * @param {Function} condition Condition to terminate generation (upon returning false). + * @param {Function} iterate Iteration step function. + * @param {Function} resultSelector Selector function for results produced in the sequence. + * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning integer values denoting milliseconds. + * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used. + * @returns {Observable} The generated sequence. + */ + Observable.generateWithRelativeTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) { + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var first = true, + hasResult = false, + result, + state = initialState, + time; + return scheduler.scheduleRecursiveWithRelative(0, function (self) { + if (hasResult) { + observer.onNext(result); + } + try { + if (first) { + first = false; + } else { + state = iterate(state); + } + hasResult = condition(state); + if (hasResult) { + result = resultSelector(state); + time = timeSelector(state); + } + } catch (e) { + observer.onError(e); + return; + } + if (hasResult) { + self(time); + } else { + observer.onCompleted(); + } + }); + }); + }; + + /** + * Time shifts the observable sequence by delaying the subscription. + * + * @example + * 1 - res = source.delaySubscription(5000); // 5s + * 2 - res = source.delaySubscription(5000, Rx.Scheduler.timeout); // 5 seconds + * + * @param {Number} dueTime Absolute or relative time to perform the subscription at. + * @param {Scheduler} [scheduler] Scheduler to run the subscription delay timer on. If not specified, the timeout scheduler is used. + * @returns {Observable} Time-shifted sequence. + */ + observableProto.delaySubscription = function (dueTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + return this.delayWithSelector(observableTimer(dueTime, scheduler), function () { return observableEmpty(); }); + }; + + /** + * Time shifts the observable sequence based on a subscription delay and a delay selector function for each element. + * + * @example + * 1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(5000); }); // with selector only + * 1 - res = source.delayWithSelector(Rx.Observable.timer(2000), function (x) { return Rx.Observable.timer(x); }); // with delay and selector + * + * @param {Observable} [subscriptionDelay] Sequence indicating the delay for the subscription to the source. + * @param {Function} delayDurationSelector Selector function to retrieve a sequence indicating the delay for each given element. + * @returns {Observable} Time-shifted sequence. + */ + observableProto.delayWithSelector = function (subscriptionDelay, delayDurationSelector) { + var source = this, subDelay, selector; + if (typeof subscriptionDelay === 'function') { + selector = subscriptionDelay; + } else { + subDelay = subscriptionDelay; + selector = delayDurationSelector; + } + return new AnonymousObservable(function (observer) { + var delays = new CompositeDisposable(), atEnd = false, done = function () { + if (atEnd && delays.length === 0) { + observer.onCompleted(); + } + }, subscription = new SerialDisposable(), start = function () { + subscription.setDisposable(source.subscribe(function (x) { + var delay; + try { + delay = selector(x); + } catch (error) { + observer.onError(error); + return; + } + var d = new SingleAssignmentDisposable(); + delays.add(d); + d.setDisposable(delay.subscribe(function () { + observer.onNext(x); + delays.remove(d); + done(); + }, observer.onError.bind(observer), function () { + observer.onNext(x); + delays.remove(d); + done(); + })); + }, observer.onError.bind(observer), function () { + atEnd = true; + subscription.dispose(); + done(); + })); + }; + + if (!subDelay) { + start(); + } else { + subscription.setDisposable(subDelay.subscribe(function () { + start(); + }, observer.onError.bind(observer), function () { start(); })); + } + + return new CompositeDisposable(subscription, delays); + }); + }; + + /** + * Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled. + * + * @example + * 1 - res = source.timeoutWithSelector(Rx.Observable.timer(500)); + * 2 - res = source.timeoutWithSelector(Rx.Observable.timer(500), function (x) { return Rx.Observable.timer(200); }); + * 3 - res = source.timeoutWithSelector(Rx.Observable.timer(500), function (x) { return Rx.Observable.timer(200); }, Rx.Observable.returnValue(42)); + * + * @param {Observable} [firstTimeout] Observable sequence that represents the timeout for the first element. If not provided, this defaults to Observable.never(). + * @param {Function} [timeoutDurationSelector] Selector to retrieve an observable sequence that represents the timeout between the current element and the next element. + * @param {Observable} [other] Sequence to return in case of a timeout. If not provided, this is set to Observable.throwException(). + * @returns {Observable} The source sequence switching to the other sequence in case of a timeout. + */ + observableProto.timeoutWithSelector = function (firstTimeout, timeoutdurationSelector, other) { + if (arguments.length === 1) { + timeoutdurationSelector = firstTimeout; + var firstTimeout = observableNever(); + } + other || (other = observableThrow(new Error('Timeout'))); + var source = this; + return new AnonymousObservable(function (observer) { + var subscription = new SerialDisposable(), timer = new SerialDisposable(), original = new SingleAssignmentDisposable(); + + subscription.setDisposable(original); + + var id = 0, switched = false, setTimer = function (timeout) { + var myId = id, timerWins = function () { + return id === myId; + }; + var d = new SingleAssignmentDisposable(); + timer.setDisposable(d); + d.setDisposable(timeout.subscribe(function () { + if (timerWins()) { + subscription.setDisposable(other.subscribe(observer)); + } + d.dispose(); + }, function (e) { + if (timerWins()) { + observer.onError(e); + } + }, function () { + if (timerWins()) { + subscription.setDisposable(other.subscribe(observer)); + } + })); + }; + + setTimer(firstTimeout); + var observerWins = function () { + var res = !switched; + if (res) { + id++; + } + return res; + }; + + original.setDisposable(source.subscribe(function (x) { + if (observerWins()) { + observer.onNext(x); + var timeout; + try { + timeout = timeoutdurationSelector(x); + } catch (e) { + observer.onError(e); + return; + } + setTimer(timeout); + } + }, function (e) { + if (observerWins()) { + observer.onError(e); + } + }, function () { + if (observerWins()) { + observer.onCompleted(); + } + })); + return new CompositeDisposable(subscription, timer); + }); + }; + + /** + * Ignores values from an observable sequence which are followed by another value within a computed throttle duration. + * + * @example + * 1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(x + x); }); + * + * @param {Function} throttleDurationSelector Selector function to retrieve a sequence indicating the throttle duration for each given element. + * @returns {Observable} The throttled sequence. + */ + observableProto.throttleWithSelector = function (throttleDurationSelector) { + var source = this; + return new AnonymousObservable(function (observer) { + var value, hasValue = false, cancelable = new SerialDisposable(), id = 0, subscription = source.subscribe(function (x) { + var throttle; + try { + throttle = throttleDurationSelector(x); + } catch (e) { + observer.onError(e); + return; + } + hasValue = true; + value = x; + id++; + var currentid = id, d = new SingleAssignmentDisposable(); + cancelable.setDisposable(d); + d.setDisposable(throttle.subscribe(function () { + if (hasValue && id === currentid) { + observer.onNext(value); + } + hasValue = false; + d.dispose(); + }, observer.onError.bind(observer), function () { + if (hasValue && id === currentid) { + observer.onNext(value); + } + hasValue = false; + d.dispose(); + })); + }, function (e) { + cancelable.dispose(); + observer.onError(e); + hasValue = false; + id++; + }, function () { + cancelable.dispose(); + if (hasValue) { + observer.onNext(value); + } + observer.onCompleted(); + hasValue = false; + id++; + }); + return new CompositeDisposable(subscription, cancelable); + }); + }; + + /** + * Skips elements for the specified duration from the end of the observable source sequence, using the specified scheduler to run timers. + * + * 1 - res = source.skipLastWithTime(5000); + * 2 - res = source.skipLastWithTime(5000, scheduler); + * + * @description + * This operator accumulates a queue with a length enough to store elements received during the initial duration window. + * As more elements are received, elements older than the specified duration are taken from the queue and produced on the + * result sequence. This causes elements to be delayed with duration. + * @param {Number} duration Duration for skipping elements from the end of the sequence. + * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout + * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the end of the source sequence. + */ + observableProto.skipLastWithTime = function (duration, scheduler) { + scheduler || (scheduler = timeoutScheduler); + var source = this; + return new AnonymousObservable(function (observer) { + var q = []; + return source.subscribe(function (x) { + var now = scheduler.now(); + q.push({ interval: now, value: x }); + while (q.length > 0 && now - q[0].interval >= duration) { + observer.onNext(q.shift().value); + } + }, observer.onError.bind(observer), function () { + var now = scheduler.now(); + while (q.length > 0 && now - q[0].interval >= duration) { + observer.onNext(q.shift().value); + } + observer.onCompleted(); + }); + }); + }; + + /** + * Returns elements within the specified duration from the end of the observable source sequence, using the specified schedulers to run timers and to drain the collected elements. + * + * @example + * 1 - res = source.takeLastWithTime(5000, [optional timer scheduler], [optional loop scheduler]); + * @description + * This operator accumulates a queue with a length enough to store elements received during the initial duration window. + * As more elements are received, elements older than the specified duration are taken from the queue and produced on the + * result sequence. This causes elements to be delayed with duration. + * @param {Number} duration Duration for taking elements from the end of the sequence. + * @param {Scheduler} [timerScheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @param {Scheduler} [loopScheduler] Scheduler to drain the collected elements. If not specified, defaults to Rx.Scheduler.immediate. + * @returns {Observable} An observable sequence with the elements taken during the specified duration from the end of the source sequence. + */ + observableProto.takeLastWithTime = function (duration, timerScheduler, loopScheduler) { + return this.takeLastBufferWithTime(duration, timerScheduler).selectMany(function (xs) { return observableFromArray(xs, loopScheduler); }); + }; + + /** + * Returns an array with the elements within the specified duration from the end of the observable source sequence, using the specified scheduler to run timers. + * + * @example + * 1 - res = source.takeLastBufferWithTime(5000, [optional scheduler]); + * @description + * This operator accumulates a queue with a length enough to store elements received during the initial duration window. + * As more elements are received, elements older than the specified duration are taken from the queue and produced on the + * result sequence. This causes elements to be delayed with duration. + * @param {Number} duration Duration for taking elements from the end of the sequence. + * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @returns {Observable} An observable sequence containing a single array with the elements taken during the specified duration from the end of the source sequence. + */ + observableProto.takeLastBufferWithTime = function (duration, scheduler) { + var source = this; + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var q = []; + + return source.subscribe(function (x) { + var now = scheduler.now(); + q.push({ interval: now, value: x }); + while (q.length > 0 && now - q[0].interval >= duration) { + q.shift(); + } + }, observer.onError.bind(observer), function () { + var now = scheduler.now(), res = []; + while (q.length > 0) { + var next = q.shift(); + if (now - next.interval <= duration) { + res.push(next.value); + } + } + + observer.onNext(res); + observer.onCompleted(); + }); + }); + }; + + /** + * Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers. + * + * @example + * 1 - res = source.takeWithTime(5000, [optional scheduler]); + * @description + * This operator accumulates a queue with a length enough to store elements received during the initial duration window. + * As more elements are received, elements older than the specified duration are taken from the queue and produced on the + * result sequence. This causes elements to be delayed with duration. + * @param {Number} duration Duration for taking elements from the start of the sequence. + * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @returns {Observable} An observable sequence with the elements taken during the specified duration from the start of the source sequence. + */ + observableProto.takeWithTime = function (duration, scheduler) { + var source = this; + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var t = scheduler.scheduleWithRelative(duration, function () { + observer.onCompleted(); + }); + + return new CompositeDisposable(t, source.subscribe(observer)); + }); + }; + + /** + * Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers. + * + * @example + * 1 - res = source.skipWithTime(5000, [optional scheduler]); + * + * @description + * Specifying a zero value for duration doesn't guarantee no elements will be dropped from the start of the source sequence. + * This is a side-effect of the asynchrony introduced by the scheduler, where the action that causes callbacks from the source sequence to be forwarded + * may not execute immediately, despite the zero due time. + * + * Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the duration. + * @param {Number} duration Duration for skipping elements from the start of the sequence. + * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the start of the source sequence. + */ + observableProto.skipWithTime = function (duration, scheduler) { + var source = this; + scheduler || (scheduler = timeoutScheduler); + return new AnonymousObservable(function (observer) { + var open = false, + t = scheduler.scheduleWithRelative(duration, function () { open = true; }), + d = source.subscribe(function (x) { + if (open) { + observer.onNext(x); + } + }, observer.onError.bind(observer), observer.onCompleted.bind(observer)); + + return new CompositeDisposable(t, d); + }); + }; + + /** + * Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers. + * Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time. + * + * @examples + * 1 - res = source.skipUntilWithTime(new Date(), [optional scheduler]); + * 2 - res = source.skipUntilWithTime(5000, [optional scheduler]); + * @param startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped. + * @param scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout. + * @returns {Observable} An observable sequence with the elements skipped until the specified start time. + */ + observableProto.skipUntilWithTime = function (startTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + var source = this, schedulerMethod = startTime instanceof Date ? + 'scheduleWithAbsolute' : + 'scheduleWithRelative'; + return new AnonymousObservable(function (observer) { + var open = false; + + return new CompositeDisposable( + scheduler[schedulerMethod](startTime, function () { open = true; }), + source.subscribe( + function (x) { open && observer.onNext(x); }, + observer.onError.bind(observer), + observer.onCompleted.bind(observer))); + }); + }; + + /** + * Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers. + * + * @example + * 1 - res = source.takeUntilWithTime(new Date(), [optional scheduler]); + * 2 - res = source.takeUntilWithTime(5000, [optional scheduler]); + * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately. + * @param {Scheduler} scheduler Scheduler to run the timer on. + * @returns {Observable} An observable sequence with the elements taken until the specified end time. + */ + observableProto.takeUntilWithTime = function (endTime, scheduler) { + scheduler || (scheduler = timeoutScheduler); + var source = this, schedulerMethod = endTime instanceof Date ? + 'scheduleWithAbsolute' : + 'scheduleWithRelative'; + return new AnonymousObservable(function (observer) { + return new CompositeDisposable(scheduler[schedulerMethod](endTime, function () { + observer.onCompleted(); + }), source.subscribe(observer)); + }); + }; + + return Rx; +})); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.time.min.js b/ajax/libs/rxjs/2.2.28/rx.time.min.js new file mode 100644 index 000000000..10144d7ad --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.time.min.js @@ -0,0 +1 @@ +(function(t){var e={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},n=e[typeof window]&&window||this,r=e[typeof exports]&&exports&&!exports.nodeType&&exports,i=e[typeof module]&&module&&!module.nodeType&&module,o=(i&&i.exports===r&&r,e[typeof global]&&global);!o||o.global!==o&&o.window!==o||(n=o),"function"==typeof define&&define.amd?define(["rx","exports"],function(e,r){return n.Rx=t(n,r,e),n.Rx}):"object"==typeof module&&module&&module.exports===r?module.exports=t(n,module.exports,require("./rx")):n.Rx=t(n,{},n.Rx)}).call(this,function(t,e,n,r){function i(t,e){return new p(function(n){return e.scheduleWithAbsolute(t,function(){n.onNext(0),n.onCompleted()})})}function o(t,e,n){var r=N(e);return new p(function(e){var i=0,o=t;return n.scheduleRecursiveWithAbsolute(o,function(t){var s;r>0&&(s=n.now(),o+=r,s>=o&&(o=s+r)),e.onNext(i++),t(o)})})}function s(t,e){var n=N(t);return new p(function(t){return e.scheduleWithRelative(n,function(){t.onNext(0),t.onCompleted()})})}function u(t,e,n){return t===e?new p(function(t){return n.schedulePeriodicWithState(0,e,function(e){return t.onNext(e),e+1})}):d(function(){return o(n.now()+t,e,n)})}function c(t,e){var n=this;return new p(function(r){var i,o=!1,s=new E,u=null,c=[],a=!1;return i=n.materialize().timestamp(e).subscribe(function(n){var i,h;"E"===n.value.kind?(c=[],c.push(n),u=n.value.exception,h=!a):(c.push({value:n.value,timestamp:n.timestamp+t}),h=!o,o=!0),h&&(null!==u?r.onError(u):(i=new g,s.setDisposable(i),i.setDisposable(e.scheduleRecursiveWithRelative(t,function(t){var n,i,s,h;if(null===u){a=!0;do s=null,c.length>0&&0>=c[0].timestamp-e.now()&&(s=c.shift().value),null!==s&&s.accept(r);while(null!==s);h=!1,i=0,c.length>0?(h=!0,i=Math.max(0,c[0].timestamp-e.now())):o=!1,n=u,a=!1,null!==n?r.onError(n):h&&t(i)}}))))}),new x(i,s)})}function a(t,e){var n=this;return d(function(){var r=t-e.now();return c.call(n,r,e)})}function h(t,e){return new p(function(n){function r(){s&&(s=!1,n.onNext(o)),i&&n.onCompleted()}var i,o,s;return new x(t.subscribe(function(t){s=!0,o=t},n.onError.bind(n),function(){i=!0}),e.subscribe(r,n.onError.bind(n),r))})}var l=n.Observable,f=l.prototype,p=n.AnonymousObservable,d=l.defer,b=l.empty,v=l.never,m=l.throwException,y=l.fromArray,w=n.Scheduler.timeout,g=n.SingleAssignmentDisposable,E=n.SerialDisposable,x=n.CompositeDisposable,C=n.RefCountDisposable,D=n.Subject,S=n.internals.addRef,N=n.Scheduler.normalize,A=n.helpers.isPromise,_=l.fromPromise,O=l.interval=function(t,e){return e||(e=w),u(t,t,e)},j=l.timer=function(t,e,n){var c;return n||(n=w),e!==r&&"number"==typeof e?c=e:e!==r&&"object"==typeof e&&(n=e),t instanceof Date&&c===r?i(t.getTime(),n):t instanceof Date&&c!==r?(c=e,o(t.getTime(),c,n)):c===r?s(t,n):u(t,c,n)};return f.delay=function(t,e){return e||(e=w),t instanceof Date?a.call(this,t.getTime(),e):c.call(this,t,e)},f.throttle=function(t,e){return e||(e=w),this.throttleWithSelector(function(){return j(t,e)})},f.windowWithTime=function(t,e,n){var i,o=this;return e===r&&(i=t),n===r&&(n=w),"number"==typeof e?i=e:"object"==typeof e&&(i=t,n=e),new p(function(e){function r(){var t=new g,o=!1,s=!1;l.setDisposable(t),a===c?(o=!0,s=!0):c>a?o=!0:s=!0;var p=o?a:c,d=p-f;f=p,o&&(a+=i),s&&(c+=i),t.setDisposable(n.scheduleWithRelative(d,function(){var t;s&&(t=new D,h.push(t),e.onNext(S(t,u))),o&&(t=h.shift(),t.onCompleted()),r()}))}var s,u,c=i,a=t,h=[],l=new E,f=0;return s=new x(l),u=new C(s),h.push(new D),e.onNext(S(h[0],u)),r(),s.add(o.subscribe(function(t){var e,n;for(e=0;h.length>e;e++)n=h[e],n.onNext(t)},function(t){var n,r;for(n=0;h.length>n;n++)r=h[n],r.onError(t);e.onError(t)},function(){var t,n;for(t=0;h.length>t;t++)n=h[t],n.onCompleted();e.onCompleted()})),u})},f.windowWithTimeOrCount=function(t,e,n){var r=this;return n||(n=w),new p(function(i){var o,s,u,c,a=0,h=new E,l=0;return s=new x(h),u=new C(s),o=function(e){var r=new g;h.setDisposable(r),r.setDisposable(n.scheduleWithRelative(t,function(){var t;e===l&&(a=0,t=++l,c.onCompleted(),c=new D,i.onNext(S(c,u)),o(t))}))},c=new D,i.onNext(S(c,u)),o(0),s.add(r.subscribe(function(t){var n=0,r=!1;c.onNext(t),a++,a===e&&(r=!0,a=0,n=++l,c.onCompleted(),c=new D,i.onNext(S(c,u))),r&&o(n)},function(t){c.onError(t),i.onError(t)},function(){c.onCompleted(),i.onCompleted()})),u})},f.bufferWithTime=function(){return this.windowWithTime.apply(this,arguments).selectMany(function(t){return t.toArray()})},f.bufferWithTimeOrCount=function(t,e,n){return this.windowWithTimeOrCount(t,e,n).selectMany(function(t){return t.toArray()})},f.timeInterval=function(t){var e=this;return t||(t=w),d(function(){var n=t.now();return e.select(function(e){var r=t.now(),i=r-n;return n=r,{value:e,interval:i}})})},f.timestamp=function(t){return t||(t=w),this.select(function(e){return{value:e,timestamp:t.now()}})},f.sample=function(t,e){return e||(e=w),"number"==typeof t?h(this,O(t,e)):h(this,t)},f.timeout=function(t,e,n){e||(e=m(Error("Timeout"))),n||(n=w);var r=this,i=t instanceof Date?"scheduleWithAbsolute":"scheduleWithRelative";return new p(function(o){var s=0,u=new g,c=new E,a=!1,h=new E;c.setDisposable(u);var l=function(){var r=s;h.setDisposable(n[i](t,function(){s===r&&(A(e)&&(e=_(e)),c.setDisposable(e.subscribe(o)))}))};return l(),u.setDisposable(r.subscribe(function(t){a||(s++,o.onNext(t),l())},function(t){a||(s++,o.onError(t))},function(){a||(s++,o.onCompleted())})),new x(c,h)})},l.generateWithAbsoluteTime=function(t,e,n,i,o,s){return s||(s=w),new p(function(u){var c,a,h=!0,l=!1,f=t;return s.scheduleRecursiveWithAbsolute(s.now(),function(t){l&&u.onNext(c);try{h?h=!1:f=n(f),l=e(f),l&&(c=i(f),a=o(f))}catch(s){return u.onError(s),r}l?t(a):u.onCompleted()})})},l.generateWithRelativeTime=function(t,e,n,i,o,s){return s||(s=w),new p(function(u){var c,a,h=!0,l=!1,f=t;return s.scheduleRecursiveWithRelative(0,function(t){l&&u.onNext(c);try{h?h=!1:f=n(f),l=e(f),l&&(c=i(f),a=o(f))}catch(s){return u.onError(s),r}l?t(a):u.onCompleted()})})},f.delaySubscription=function(t,e){return e||(e=w),this.delayWithSelector(j(t,e),function(){return b()})},f.delayWithSelector=function(t,e){var n,i,o=this;return"function"==typeof t?i=t:(n=t,i=e),new p(function(t){var e=new x,s=!1,u=function(){s&&0===e.length&&t.onCompleted()},c=new E,a=function(){c.setDisposable(o.subscribe(function(n){var o;try{o=i(n)}catch(s){return t.onError(s),r}var c=new g;e.add(c),c.setDisposable(o.subscribe(function(){t.onNext(n),e.remove(c),u()},t.onError.bind(t),function(){t.onNext(n),e.remove(c),u()}))},t.onError.bind(t),function(){s=!0,c.dispose(),u()}))};return n?c.setDisposable(n.subscribe(function(){a()},t.onError.bind(t),function(){a()})):a(),new x(c,e)})},f.timeoutWithSelector=function(t,e,n){if(1===arguments.length){e=t;var t=v()}n||(n=m(Error("Timeout")));var i=this;return new p(function(o){var s=new E,u=new E,c=new g;s.setDisposable(c);var a=0,h=!1,l=function(t){var e=a,r=function(){return a===e},i=new g;u.setDisposable(i),i.setDisposable(t.subscribe(function(){r()&&s.setDisposable(n.subscribe(o)),i.dispose()},function(t){r()&&o.onError(t)},function(){r()&&s.setDisposable(n.subscribe(o))}))};l(t);var f=function(){var t=!h;return t&&a++,t};return c.setDisposable(i.subscribe(function(t){if(f()){o.onNext(t);var n;try{n=e(t)}catch(i){return o.onError(i),r}l(n)}},function(t){f()&&o.onError(t)},function(){f()&&o.onCompleted()})),new x(s,u)})},f.throttleWithSelector=function(t){var e=this;return new p(function(n){var i,o=!1,s=new E,u=0,c=e.subscribe(function(e){var c;try{c=t(e)}catch(a){return n.onError(a),r}o=!0,i=e,u++;var h=u,l=new g;s.setDisposable(l),l.setDisposable(c.subscribe(function(){o&&u===h&&n.onNext(i),o=!1,l.dispose()},n.onError.bind(n),function(){o&&u===h&&n.onNext(i),o=!1,l.dispose()}))},function(t){s.dispose(),n.onError(t),o=!1,u++},function(){s.dispose(),o&&n.onNext(i),n.onCompleted(),o=!1,u++});return new x(c,s)})},f.skipLastWithTime=function(t,e){e||(e=w);var n=this;return new p(function(r){var i=[];return n.subscribe(function(n){var o=e.now();for(i.push({interval:o,value:n});i.length>0&&o-i[0].interval>=t;)r.onNext(i.shift().value)},r.onError.bind(r),function(){for(var n=e.now();i.length>0&&n-i[0].interval>=t;)r.onNext(i.shift().value);r.onCompleted()})})},f.takeLastWithTime=function(t,e,n){return this.takeLastBufferWithTime(t,e).selectMany(function(t){return y(t,n)})},f.takeLastBufferWithTime=function(t,e){var n=this;return e||(e=w),new p(function(r){var i=[];return n.subscribe(function(n){var r=e.now();for(i.push({interval:r,value:n});i.length>0&&r-i[0].interval>=t;)i.shift()},r.onError.bind(r),function(){for(var n=e.now(),o=[];i.length>0;){var s=i.shift();t>=n-s.interval&&o.push(s.value)}r.onNext(o),r.onCompleted()})})},f.takeWithTime=function(t,e){var n=this;return e||(e=w),new p(function(r){var i=e.scheduleWithRelative(t,function(){r.onCompleted()});return new x(i,n.subscribe(r))})},f.skipWithTime=function(t,e){var n=this;return e||(e=w),new p(function(r){var i=!1,o=e.scheduleWithRelative(t,function(){i=!0}),s=n.subscribe(function(t){i&&r.onNext(t)},r.onError.bind(r),r.onCompleted.bind(r));return new x(o,s)})},f.skipUntilWithTime=function(t,e){e||(e=w);var n=this,r=t instanceof Date?"scheduleWithAbsolute":"scheduleWithRelative";return new p(function(i){var o=!1;return new x(e[r](t,function(){o=!0}),n.subscribe(function(t){o&&i.onNext(t)},i.onError.bind(i),i.onCompleted.bind(i)))})},f.takeUntilWithTime=function(t,e){e||(e=w);var n=this,r=t instanceof Date?"scheduleWithAbsolute":"scheduleWithRelative";return new p(function(i){return new x(e[r](t,function(){i.onCompleted()}),n.subscribe(i))})},n}); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.virtualtime.js b/ajax/libs/rxjs/2.2.28/rx.virtualtime.js new file mode 100644 index 000000000..be9129fb9 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.virtualtime.js @@ -0,0 +1,335 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +;(function (factory) { + var objectTypes = { + 'boolean': false, + 'function': true, + 'object': true, + 'number': false, + 'string': false, + 'undefined': false + }; + + var root = (objectTypes[typeof window] && window) || this, + freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports, + freeModule = objectTypes[typeof module] && module && !module.nodeType && module, + moduleExports = freeModule && freeModule.exports === freeExports && freeExports, + freeGlobal = objectTypes[typeof global] && global; + + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) { + root = freeGlobal; + } + + // Because of build optimizers + if (typeof define === 'function' && define.amd) { + define(['rx', 'exports'], function (Rx, exports) { + root.Rx = factory(root, exports, Rx); + return root.Rx; + }); + } else if (typeof module === 'object' && module && module.exports === freeExports) { + module.exports = factory(root, module.exports, require('./rx')); + } else { + root.Rx = factory(root, {}, root.Rx); + } +}.call(this, function (root, exp, Rx, undefined) { + + // Aliases + var Scheduler = Rx.Scheduler, + PriorityQueue = Rx.internals.PriorityQueue, + ScheduledItem = Rx.internals.ScheduledItem, + SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive, + disposableEmpty = Rx.Disposable.empty, + inherits = Rx.internals.inherits, + defaultSubComparer = Rx.helpers.defaultSubComparer; + + /** Provides a set of extension methods for virtual time scheduling. */ + Rx.VirtualTimeScheduler = (function (_super) { + + function notImplemented() { + throw new Error('Not implemented'); + } + + function localNow() { + return this.toDateTimeOffset(this.clock); + } + + function scheduleNow(state, action) { + return this.scheduleAbsoluteWithState(state, this.clock, action); + } + + function scheduleRelative(state, dueTime, action) { + return this.scheduleRelativeWithState(state, this.toRelative(dueTime), action); + } + + function scheduleAbsolute(state, dueTime, action) { + return this.scheduleRelativeWithState(state, this.toRelative(dueTime - this.now()), action); + } + + function invokeAction(scheduler, action) { + action(); + return disposableEmpty; + } + + inherits(VirtualTimeScheduler, _super); + + /** + * Creates a new virtual time scheduler with the specified initial clock value and absolute time comparer. + * + * @constructor + * @param {Number} initialClock Initial value for the clock. + * @param {Function} comparer Comparer to determine causality of events based on absolute time. + */ + function VirtualTimeScheduler(initialClock, comparer) { + this.clock = initialClock; + this.comparer = comparer; + this.isEnabled = false; + this.queue = new PriorityQueue(1024); + _super.call(this, localNow, scheduleNow, scheduleRelative, scheduleAbsolute); + } + + var VirtualTimeSchedulerPrototype = VirtualTimeScheduler.prototype; + + /** + * Adds a relative time value to an absolute time value. + * @param {Number} absolute Absolute virtual time value. + * @param {Number} relative Relative virtual time value to add. + * @return {Number} Resulting absolute virtual time sum value. + */ + VirtualTimeSchedulerPrototype.add = notImplemented; + + /** + * Converts an absolute time to a number + * @param {Any} The absolute time. + * @returns {Number} The absolute time in ms + */ + VirtualTimeSchedulerPrototype.toDateTimeOffset = notImplemented; + + /** + * Converts the TimeSpan value to a relative virtual time value. + * @param {Number} timeSpan TimeSpan value to convert. + * @return {Number} Corresponding relative virtual time value. + */ + VirtualTimeSchedulerPrototype.toRelative = notImplemented; + + /** + * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be emulated using recursive scheduling. + * @param {Mixed} state Initial state passed to the action upon the first iteration. + * @param {Number} period Period for running the work periodically. + * @param {Function} action Action to be executed, potentially updating the state. + * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort). + */ + VirtualTimeSchedulerPrototype.schedulePeriodicWithState = function (state, period, action) { + var s = new SchedulePeriodicRecursive(this, state, period, action); + return s.start(); + }; + + /** + * Schedules an action to be executed after dueTime. + * @param {Mixed} state State passed to the action to be executed. + * @param {Number} dueTime Relative time after which to execute the action. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + VirtualTimeSchedulerPrototype.scheduleRelativeWithState = function (state, dueTime, action) { + var runAt = this.add(this.clock, dueTime); + return this.scheduleAbsoluteWithState(state, runAt, action); + }; + + /** + * Schedules an action to be executed at dueTime. + * @param {Number} dueTime Relative time after which to execute the action. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + VirtualTimeSchedulerPrototype.scheduleRelative = function (dueTime, action) { + return this.scheduleRelativeWithState(action, dueTime, invokeAction); + }; + + /** + * Starts the virtual time scheduler. + */ + VirtualTimeSchedulerPrototype.start = function () { + var next; + if (!this.isEnabled) { + this.isEnabled = true; + do { + next = this.getNext(); + if (next !== null) { + if (this.comparer(next.dueTime, this.clock) > 0) { + this.clock = next.dueTime; + } + next.invoke(); + } else { + this.isEnabled = false; + } + } while (this.isEnabled); + } + }; + + /** + * Stops the virtual time scheduler. + */ + VirtualTimeSchedulerPrototype.stop = function () { + this.isEnabled = false; + }; + + /** + * Advances the scheduler's clock to the specified time, running all work till that point. + * @param {Number} time Absolute time to advance the scheduler's clock to. + */ + VirtualTimeSchedulerPrototype.advanceTo = function (time) { + var next; + var dueToClock = this.comparer(this.clock, time); + if (this.comparer(this.clock, time) > 0) { + throw new Error(argumentOutOfRange); + } + if (dueToClock === 0) { + return; + } + if (!this.isEnabled) { + this.isEnabled = true; + do { + next = this.getNext(); + if (next !== null && this.comparer(next.dueTime, time) <= 0) { + if (this.comparer(next.dueTime, this.clock) > 0) { + this.clock = next.dueTime; + } + next.invoke(); + } else { + this.isEnabled = false; + } + } while (this.isEnabled); + this.clock = time; + } + }; + + /** + * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan. + * @param {Number} time Relative time to advance the scheduler's clock by. + */ + VirtualTimeSchedulerPrototype.advanceBy = function (time) { + var dt = this.add(this.clock, time); + var dueToClock = this.comparer(this.clock, dt); + if (dueToClock > 0) { + throw new Error(argumentOutOfRange); + } + if (dueToClock === 0) { + return; + } + this.advanceTo(dt); + }; + + /** + * Advances the scheduler's clock by the specified relative time. + * @param {Number} time Relative time to advance the scheduler's clock by. + */ + VirtualTimeSchedulerPrototype.sleep = function (time) { + var dt = this.add(this.clock, time); + + if (this.comparer(this.clock, dt) >= 0) { + throw new Error(argumentOutOfRange); + } + + this.clock = dt; + }; + + /** + * Gets the next scheduled item to be executed. + * @returns {ScheduledItem} The next scheduled item. + */ + VirtualTimeSchedulerPrototype.getNext = function () { + var next; + while (this.queue.length > 0) { + next = this.queue.peek(); + if (next.isCancelled()) { + this.queue.dequeue(); + } else { + return next; + } + } + return null; + }; + + /** + * Schedules an action to be executed at dueTime. + * @param {Scheduler} scheduler Scheduler to execute the action on. + * @param {Number} dueTime Absolute time at which to execute the action. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + VirtualTimeSchedulerPrototype.scheduleAbsolute = function (dueTime, action) { + return this.scheduleAbsoluteWithState(action, dueTime, invokeAction); + }; + + /** + * Schedules an action to be executed at dueTime. + * @param {Mixed} state State passed to the action to be executed. + * @param {Number} dueTime Absolute time at which to execute the action. + * @param {Function} action Action to be executed. + * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort). + */ + VirtualTimeSchedulerPrototype.scheduleAbsoluteWithState = function (state, dueTime, action) { + var self = this, + run = function (scheduler, state1) { + self.queue.remove(si); + return action(scheduler, state1); + }, + si = new ScheduledItem(self, state, run, dueTime, self.comparer); + self.queue.enqueue(si); + return si.disposable; + }; + + return VirtualTimeScheduler; + }(Scheduler)); + + /** Provides a virtual time scheduler that uses Date for absolute time and number for relative time. */ + Rx.HistoricalScheduler = (function (_super) { + inherits(HistoricalScheduler, _super); + + /** + * Creates a new historical scheduler with the specified initial clock value. + * + * @constructor + * @param {Number} initialClock Initial value for the clock. + * @param {Function} comparer Comparer to determine causality of events based on absolute time. + */ + function HistoricalScheduler(initialClock, comparer) { + var clock = initialClock == null ? 0 : initialClock; + var cmp = comparer || defaultSubComparer; + _super.call(this, clock, cmp); + } + + var HistoricalSchedulerProto = HistoricalScheduler.prototype; + + /** + * Adds a relative time value to an absolute time value. + * @param {Number} absolute Absolute virtual time value. + * @param {Number} relative Relative virtual time value to add. + * @return {Number} Resulting absolute virtual time sum value. + */ + HistoricalSchedulerProto.add = function (absolute, relative) { + return absolute + relative; + }; + + /** + * @private + */ + HistoricalSchedulerProto.toDateTimeOffset = function (absolute) { + return new Date(absolute).getTime(); + }; + + /** + * Converts the TimeSpan value to a relative virtual time value. + * + * @memberOf HistoricalScheduler + * @param {Number} timeSpan TimeSpan value to convert. + * @return {Number} Corresponding relative virtual time value. + */ + HistoricalSchedulerProto.toRelative = function (timeSpan) { + return timeSpan; + }; + + return HistoricalScheduler; + }(Rx.VirtualTimeScheduler)); + return Rx; +})); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/rx.virtualtime.min.js b/ajax/libs/rxjs/2.2.28/rx.virtualtime.min.js new file mode 100644 index 000000000..26d00bd62 --- /dev/null +++ b/ajax/libs/rxjs/2.2.28/rx.virtualtime.min.js @@ -0,0 +1 @@ +(function(t){var e={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},n=e[typeof window]&&window||this,r=e[typeof exports]&&exports&&!exports.nodeType&&exports,i=e[typeof module]&&module&&!module.nodeType&&module,o=(i&&i.exports===r&&r,e[typeof global]&&global);!o||o.global!==o&&o.window!==o||(n=o),"function"==typeof define&&define.amd?define(["rx","exports"],function(e,r){return n.Rx=t(n,r,e),n.Rx}):"object"==typeof module&&module&&module.exports===r?module.exports=t(n,module.exports,require("./rx")):n.Rx=t(n,{},n.Rx)}).call(this,function(t,e,n){var r=n.Scheduler,i=n.internals.PriorityQueue,o=n.internals.ScheduledItem,s=n.internals.SchedulePeriodicRecursive,u=n.Disposable.empty,c=n.internals.inherits,a=n.helpers.defaultSubComparer;return n.VirtualTimeScheduler=function(t){function e(){throw Error("Not implemented")}function n(){return this.toDateTimeOffset(this.clock)}function r(t,e){return this.scheduleAbsoluteWithState(t,this.clock,e)}function a(t,e,n){return this.scheduleRelativeWithState(t,this.toRelative(e),n)}function h(t,e,n){return this.scheduleRelativeWithState(t,this.toRelative(e-this.now()),n)}function l(t,e){return e(),u}function f(e,o){this.clock=e,this.comparer=o,this.isEnabled=!1,this.queue=new i(1024),t.call(this,n,r,a,h)}c(f,t);var p=f.prototype;return p.add=e,p.toDateTimeOffset=e,p.toRelative=e,p.schedulePeriodicWithState=function(t,e,n){var r=new s(this,t,e,n);return r.start()},p.scheduleRelativeWithState=function(t,e,n){var r=this.add(this.clock,e);return this.scheduleAbsoluteWithState(t,r,n)},p.scheduleRelative=function(t,e){return this.scheduleRelativeWithState(e,t,l)},p.start=function(){var t;if(!this.isEnabled){this.isEnabled=!0;do t=this.getNext(),null!==t?(this.comparer(t.dueTime,this.clock)>0&&(this.clock=t.dueTime),t.invoke()):this.isEnabled=!1;while(this.isEnabled)}},p.stop=function(){this.isEnabled=!1},p.advanceTo=function(t){var e,n=this.comparer(this.clock,t);if(this.comparer(this.clock,t)>0)throw Error(argumentOutOfRange);if(0!==n&&!this.isEnabled){this.isEnabled=!0;do e=this.getNext(),null!==e&&0>=this.comparer(e.dueTime,t)?(this.comparer(e.dueTime,this.clock)>0&&(this.clock=e.dueTime),e.invoke()):this.isEnabled=!1;while(this.isEnabled);this.clock=t}},p.advanceBy=function(t){var e=this.add(this.clock,t),n=this.comparer(this.clock,e);if(n>0)throw Error(argumentOutOfRange);0!==n&&this.advanceTo(e)},p.sleep=function(t){var e=this.add(this.clock,t);if(this.comparer(this.clock,e)>=0)throw Error(argumentOutOfRange);this.clock=e},p.getNext=function(){for(var t;this.queue.length>0;){if(t=this.queue.peek(),!t.isCancelled())return t;this.queue.dequeue()}return null},p.scheduleAbsolute=function(t,e){return this.scheduleAbsoluteWithState(e,t,l)},p.scheduleAbsoluteWithState=function(t,e,n){var r=this,i=function(t,e){return r.queue.remove(s),n(t,e)},s=new o(r,t,i,e,r.comparer);return r.queue.enqueue(s),s.disposable},f}(r),n.HistoricalScheduler=function(t){function e(e,n){var r=null==e?0:e,i=n||a;t.call(this,r,i)}c(e,t);var n=e.prototype;return n.add=function(t,e){return t+e},n.toDateTimeOffset=function(t){return new Date(t).getTime()},n.toRelative=function(t){return t},e}(n.VirtualTimeScheduler),n}); \ No newline at end of file diff --git a/ajax/libs/rxjs/2.2.28/v2.2.28.tar.gz b/ajax/libs/rxjs/2.2.28/v2.2.28.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..242a1b876a67865c86f83ab8ca75bb394806344b GIT binary patch literal 1400793 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�yGR?|W71H$_XhgvY$bn++(76;6?| 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
  • 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≦9{V0!)yF_B*-Tu z>C#cU;}!3BLOanOqp_L#g+oja%OH+etcUeH=}n#%Olb`tH_vy?z7!_tD+4P9Cb@%s zoc8uZbha+quV7Oy4g`yAibS2LBZ6v>D{t>Pfv#2`{#lW>j55ZWFd{bF=5R&;KoBmv z@=WWY#%cj%=U($3xBF0}s78(yww>t3#@x{(FdTUQ2{-%sj<}T#c;3^oXBA76RM)J$D2)`tc(90#*v-!QV3GNJW&OPK~Z7zYoCYc1>HW3mJLw$C> z9e*Ln|BDyxVqP{cUg%*~Ghhv>t{p_G=9w+76^nPXZ>n>9xY2PwJ}t+u=rlJ8FESa+ zljp+s+LLmOIz&=RS%UJBvmD3O`E%33!1m?(I%wN_I~20MH$!mD?`0_rNU!>(D_ae6 zr33D1J8IdVX!;Sw@{^-C{dkO^Eut3Nb4-mL=%$VflUqazVNu%-Q#Qa9B9(^`Yv2^) zVEYM1Zyjfo{;STR5f$V46O#L4(bZps)l@F zoslo8HgMo9bz0#SiMu3@!Gn)r;d}#xGQ`Gljd4A2RcjGcCHP(rB%0gH5Re?2>NS!b zrDG;48e0NMD`_~6m5CviK~R}bPVji2$x6}ZV_qsS4K3AdBq~ zfoOezn6LyrC)TPENylpXRe>aZkeeG@ra9gzt@fOZRM*$d$?|TT{M>GZf!opDkm@h% zf70K%14MnUDOOWP^V(4-iMji=Ar%vd> z!=sksm0Qkh$q5_;{#^M04r=zEzm`2r9lH{(P=aWt7jSIa=C>nFL=R7#s%;sjjTzP` zMOxiB&lNbtv%BHI6OmD4Bg{GK!bI?HOIV9M3%PrN4<__-ywDCQRt63sp4`B)3(PU6;x6HY}9_a^5` zm2R5S_1bOHCO$nLIL*a&OIWp?Ppfe`faddTcL^IGO8^?T5;hh>g-NbJR}UcdAJv#& zBxy1Hrkqa6Vt8hCQl{a@Xv8G*qELfPT};MB+p+2f!>HL?jm*x}SyTk+bAw#yRAGMf zlJ+%-HR+r5VkZwZiy=mz7b6wUQncIiMSB_}@%kgEN`StKswQe*2BV{{du?h0-rB2@ z9A84k6&uMa-0HGc1&uRD^m9#v!h_kMG=4tLSXD;0>}nUSaDv|DzajpZi1ODv{scJ* z?!QE#q)CV=V{i+~92@|IKzqMNVOC5gKX44bsx*MJ#4yjSmcgBq14stflNlR(k+~n; z`_kQ~+JqRLzz#_4X1p(za96N5H=|$G^|UNzmp9t}UGvp>0gdPhw|h%2G$i9@cd_Ed z@B5~B-sMUJeBTodL}W}*yR0~>7wlSE&L+k@(~S`lnPKp8H=*5o%VxY9^~2AK6c9gT zA+N8LGnidT*^;1LOjF*|`N}r;9J~p%I{f{PM?^Q85z-3hK z?k&^S;O7HE;~U4dUJW;XmiweEL!Q6P492)CM$tbSKnrw82Ju8$<1AZ8=e-j5mYsbe zXBOZ8!R`sO4a-~iHCR*O+H7`&5#$gMo|T<$Nbd&C*j(CLxF^hyg-ND2Gv3~{>11^`trM*>+M8hr6_3Hdd@i*kDGg0bK6k^NfzVyF7qjtcQ_nC?0y6uB z>sE^^H3eZ?(MRDtnaW+7XF50naSA%%7+oGLPEMho3R_*NrCmjc&(zMOTRl21-h#uOpk@T~!lQ+ZP&S98HNl(Bg^ zeZ8a!K4T&Ur6l~+R28J9I8aQn zzJty$c#V92O9Kwv+{9N^nDq?y1JzOdOscfslxL3e?B7*;_PoR-@`XJ`q>${3Z|2M~ zK6&FYh}p-BX@+SPsu|z1YM;7mgeFU8Z&JcCiv_t*t7Vmn$=CQy^1$z2qqL&YnXpI zGF@opm6Y=$V%|#XtLt5JuVzawG>Fova24^(o5K}Fun>^yxiK~JJNgf&sJ9K*VCGl1 z=v_)lu0IL+>snk%%5pn?+Wx{*Tlw@^+3tS{Df5QfL(YV=7`vTij-MD=qRH3W1?EkM zB5b=w1?(HgF{`e-?Puqtb`?Y9!iF>kC~K02?K@MXzgE|G+?3_x^LgELEsg+xepjRS zk8JMlU1S-)uP5d9KU-8aKLe?{{_p3O2183{R86(z4`yH+hU163!}$#D#LOT=c}NU0 zQvRc8Ego}$rfY9njClZ~KCNbT0<7H9rC?Ns`~T;+&%fd4+4+Az-@3OA|NH%2VA8s~ z%{e)O6x}v3>#zZCppPB+eE#{T^cOzv-`#s(?0)*`|Jl9w$>&gN_w#%A;Q8+7pMDDO zZ=mm`p9O|$hAwe~^p#uo-k;pBb%Z?A(JBQEASHnwFoGR1B z&qz`IZeKH$ckT>s>w>pOqw?Lm+k6J#kKwy_w{~qijco@6R~W!8Y6Dax=gtDkK~LSN(%v3G(J0cw2r89O!?=<_Jvksf;Jnf$X@1DcwbbHh z^nc&I>!fcnyRGemd`pslO%mp?fp!g(2MyQn-c>kxb<508ZezG|{0cKK)ur4JXKJVR z{Ir+=5r^5`8jb!R!=oK_+k$=0$D^&?ycl(*Rx{vY!AJ*Ct+lM?a7eMeM)<0wq|O9| z2Y=q9X+3zd_d5-(d^#%2gVRHr)qZh*b91~utf7a4@nJr_b7y)`AHrh&k1C%#6S&kX zWS6pnGG#skoKjF~aL52-?5iGCdf+wm)a>h7RtF8OdpYP1+QYofyCDqp*6#4ADT`OS zo6dGqV>iRMI&Cs_+6c^S5u^C6UG!UK(YL#rlU>8wF@Ow447$zRw?#_}+Y%zRMPl97 z0|U#^=&ySct;exJ*oy8RCROE!sc3cj4*o-PyicTyCa>6;xkm z`>JLM_=oZ=RpT!+z(E0sQ#%v>A>K{pyQ$uWw|1%DTn9MCre9Lw`1vV9v0TmpJIj2*&m;5ta#o7l!mF06%TMN%?46w7BQn0TQMbrsGZe z^$3d=KzlgQDAJvB_<(=xmChDDij5+U2t=}3rwSjH{iujM@v@e@??*%28PTS2)6 z`u1ROvAL-`HOo>1RI%y$Q0>y;UUxZE#qQjxp@?akHnQJz14QwGYISSt;{MhyHlUA7 zfJr?c5Jc!N7qryj)S-8~u*dBgNNIn!F(MGA|LqRS!{Gz`ch8=QwxKCEq?d9wQnjE< zSf}oOv)^oP4rf4*N9Y)-%|mPh$J_ur0qJN8qb?T?xF|7>%G~23Mv~gi2XsgX>l1*R z0bs+cizoA&>iI=n9GMHgLXB;;bk5Pu!<2p^7>LN+JvFS$0-FtO8~Co zLiK1TZ_Qq^I2Oj@MNq@;Y46uua{(*{Ao=FzApv9o00FK;gQT!0t^rAbAgQ$SVKL;b zR=Jv^%iL7pITC1snZvG<(|#?FUUJzj<^#FQ3`ppQp65SdQV)KI@ZD=Jhe&W?^pxD* zHhttb?Pb$lxpi`@6#kmSOQw)-Zy&L_!);&*a(le)0RiO06~A#R87#qE2!1mGeUO&` zI(T-Vj`ueJqWaC@ojd#mm{U}DzOe9IEYpcrZU7m21H;MBZBr-H`ly&fQ~YKB*7>`4=iB@P*qHM>ch0wY{P+uw zmW$CjbL@{sZz%=$teCcYZ!dFLx8v$$@2!gBws*0uzFp?0<#djQ9d9o$^RGvbw$*PK zZap7aRS`7uT)eF&<*ci^3tK|qz-9h$G_Ymo)5Z8zte_+vn$tMw4q+g+@;^bg?5!)h zmGxlV3!wVn*KbB)(XTO}^{jsLK!4c_%4{Mzz}J_T10W&akAkLgzZDJ8Ydbn|tTZM4 zyv$#OHJ>kz`YU($fiK%D?{^R2WZSvSpN4JxPkHgYY^q{f{mW^^Fv+(!VIBS!RwTmV zRA7k|O8-+XunrR#Y5Uf#E-wFVV;)BoDe*7h&(<_1$Z-OgW)Za=jqQYT=1q(hG}2`+-ht^hZX9|C<}l6bO;_ zAt|Vad7w4Z^}1YWxu~2_$&Geyjb?eE%NpIftLAZcn-Xio;W8ZT4)gzpgMSe{hoc%6 zqkX!Ke@o~ed81)I9^5^@i@f+acA7+p{hd2PS@X@MQWcg!^bP9)r^w@<7R5Av$`zz( zIyi*?BU4+BqSStW@D^A@cfU|qbva_GNZsbU9qWf~&qCX(P)4BJsJj$VBu3)I$|X7> z#>_7B)}5(ybL~J-qg!e8ss^=kSiTv^7mbiF?$7pTAT=tXtvr|=x=PY&*n!|Ys^A}B zcoxAZo|VUOaQpI&D>BYe%=5#T$c!U1k|*{x@fXX4;s)Sg;*A3frQb$gdlm;rBR93s zgaQMql<86(gA!MK$rwdwu_}_^iurtcF{tyI5@H5H_ZaL^L4=Qo0iGYD_CdQ>8||!W zr|WO$(#VNwUyMt2((Kkbz zB@-na6>ehlHhMB(TI9m8>$io3ZeSj7b=+{3&rm^B0|r|KqWZD} z^vVYa$g>eJ!PEB-Bv$)0sFQz>@M;NO?S2dJY89{s)j@kWQV;{&W`%!g5xI&$igO=D zfW_R&hS95n~kVP4@t8x#rLJp$kX+F#`joH#SB z!?YSQJ!qwfGh?lMNx`0WNygD0Qr|{^p@Q^8prPI@N1sy8AJ%+F+&66Psv9(V;|F}Z zzY9y)jF@$HfCGdOPWpsIuB{?5C1Tf4)Lzbm@aZOW%G zps&SIOWH4J>AoC}UeRg<&vza)dsOYYn8e5j2CPKeClyIlG5z{F`!EOr|RSsL+x?9 z@dJ40zHR-WJCw7r&r9Tmph@5)#`P4$F=u$BobT?B#E{;-gLa1oSX;aI@9(k_f9HPr z?p;Z%1sjkR$nH34cwBWhat62W{2Dm}%$;ArtI}^XU}Q`$X%44lF|UpVG)i+H*U?(- z4D(xqGMJ7X)4h+&&0U~6`1c-=n{r>@sH+V$OU-PSSIEp(fckO)?>DImjjjN=U*RR8 zR{uJ)-FN3MepL=!V3*YVTLEEEX{gN0@>N9DAu8`2GImpOj=BG^OQ5N@I$K*}vWNMk zM2)a)+j;E_knwJU{!nsLXjw}wa{0>MWY8l$K6L)+sEKm+Q?ReZR_4w(H$70|VR%{& zrnt*Fshr+=4rW=9B$(`-eYxD_e#r#P=}b`}LC4&wlz^8zn%Mx6QV$9mr#yg2O(Jmt z19{Y5;k2Vu!RPJ_BNsXjo$;%y=a;aeqq(F$lMi~^I~@4c#S7au!skT?rE?u@D4ZueUAtyCnFwS9om6k(s;+yvSt`7S4MHW~ zjBrx4L_KRr^}9NyvQ5r|PvY0OcVb&6L|n5c3Mw(`-o5)88j*ZMWbM61fUy&83?ds( zkL;)%LE9WSBF11MfqGpM0M4jriJs%5x7sb^>&yJ2j7qPam>fq`*W6HKvMR*>2u)2c z71Pite#p2)!1e3g<;9)vC&&> z@g@}D`+Z8b&5Z80$0!MsX_A&RCB$#=&jj5Uj(Fow1r`bc3Z9 zJw4i$sF~nt&dNQ~+_MmViTFO;KklEtJ!kh_iyNE2L;}mBBmNxa$_Um(9VX|lz^PNE zOr8J->PUy$PBCr+)OL6nmCiA!_BKk}j+GwO4b3(`UoOQv=aCxaKu!T+$>012tM(BpdZz%m<(!6CAio(i=2R<+ zJ8&04EP-0pM?|B|A|wJw@|u9lNn$#bfQZRm%xI zsB|j0cDUEzcBoNiIxEo#4^12?6(K3d@W8X`@EYwCE63~HkF-Ct!L9Zv#DGg zL1W~GHb3~!c+?%t4)s+R6o}8HdQj_`jE8#*oJnhDvVfV?G?Ou^I^CI&j;waf?nS%E zxj-8{rU?61ZPP9BW9>6Hst#_`liP^Fuhhk0K-sEs_`f~JqMq4QMAY4mA+MwMVl4zqhIC2Or$wQ`MQ|k1I5w%Oc+u8Hj%Ua5jm7G_Z9O=KwW$yAR!O_YHIfH14f;lR)d=2PvSL zeQ+(H`F%6cI^rE3(% z_Re0IlypVY`9gu_j~%_X8Y6TP<%8{@R@~Sw1aoCTPvXlE<#iTeC<8{BKcp3`&d$n7 z_X(FfotH0U$J= z8SwIZnx>OfGOe00O3r<);KZ@heNv~dEuhU?j@SS~3RT=MwT!VvTSL#>D~$elEG?k6 z)@QlbfWZ!O6#|M1pT&(5jbT&nQ{;_XLdA2nn#i}ZYhyL6^t}r3)%)ld@Rk{UK*&$g z0YJQ^&54|palYWax42X}->@pG7xmIeG0J0UuetW@5yDJ7Ej|N6IG=bKMhadCAfu+wKl- z|Ks-N;CE>43c}NTT8zuV-Gl9qHy`}tcW(i>?+*Tc`1ijb-aW~0|NZa3yCX|!n~Zl9 z^XuRre?L6j#B$poKe#>Iy#2e|XaE*5lWx%2;W7FL_3lOWROVR z%G6~^BT^f0ek*Loz zPrt3&uAG(4gYc1csD}M`Yj?N@MLNvNN2Lb04Fan7`SaK<;9_%gpKrlEOs+ReLS^MD z2ot&3R_`927PDD7Hh*{DD4y}t|xbu4lhd5G{m?i>lp}rJLhvb)aG54wi{?7LM6%?!u<3N>aGNo#3*WKF22hn zx(ni5^2(o0okvtCy8YIj*L&sQXqr!ZuBoC@Q^PHLV@wu~L72Wa8+rOiaH{$jOzQ8#uNh!_y)gGj~uPFz{Z64Gs-LCjZw9t@r^CEWT$m_bvb%iqLWd| z{lnh;INH|8kYE?y{vNsBlAwd8+pcRmE3Qz$`e!-%o3^HTO8)F=$=+;!nlBsndSZ_m zs`8DGmb5bCZSHb#d(#%&ygj^q=@TF)I>O&T2>bpv+GyB&8nzS!lBvOgR~;c}U=LSD z5E#w!3f+eDXATfN&)X%c9FeIr4U1@E&jdh}1<$5idNrs#zAZpv>RuHruN<%#{OP+- z73$L-a7a{)13{Dsr>!ZYp7o>KBBqF)XA_-gBj?%BJb!YH0F)zV7r0;JCPxtwsLlRQ zQd>FmwvBTd;7inJ$QlPf9VW{21@;fo5k>9rjQ=u@>W7v3uyt@;Ke(m==qnW}UL~!H zP$*gtJ~T$y@j&nZx|Z1nr~v2m39X880uu4VGSttC$P^0E$(*%jR-_s=+X}XR@RFGu zyadmzZS=+-iuVG;a%K(2BSl8`|2Y`5hvo0^zL~k_LLa`Zcj^|yyzm~4r9Yk%hy^I~ z%#8{%8wMAS)xYO6dAI3E9hQW|6D5xOQ_azynHRyD)N#>*K!=`Z5&<8 z_JJ+Y4)@|qTZpACaA^x%+CnYusb1QJw~nX7{M29VzNM9$vqdHn_tz|p`GQfW!Zlvx zf|K8SI*P28xaND~;;7ZZN-iipeU;p!9iaL>Mq{*^o9jn=kc^!UJzGr4AU@9W;kI zisP4iKl1RtElqd}*A(b-|63>6MXj<@By7F|nMg1K+nV)5({ZO&o02D{Fo&6bqqqo( zNp#titH**=IL|$l;tMLTcZ$>>*VRMUUzN%#kC5wM<>=dpS+y%n6PNn+Fz4m`8!RV$ znc)*X7iNADw3uTs1Zn5bJ_65f@XwOe1$p%4GykP{_evS}Asi@;-o?{ds`I~S1%-mZ zcV+&>J$E0X;=LGm;Ti^JzHIlXk{pmBtZ+{atbWBB)gIH``Hd;_Pa=<%xa|e zz#p5s;VhXa^({Q>IHR{}t7A)hS2lFDZMZd#i)tEMJhvK(g3IPe_S|@L`z=UV-{2yf z_}|OcR^M=ozC-Pab7fn+{QB0mwXhm=iaAdMLOxbIRkp;Qp&?$jO3 zrRBS>)SUtDO8wot^v?YN_$zcN7l(TlL7>vTik3ZJt6gmqu53OWkCA8PRyhM|HydAM z6X0|OL;n=|dQ z@Nlf|ueGnjY0-Xz@wUVxc8k>BTb_CLNh$X7EJuw^-(D6>w{4r9`5Yxq1ha{E?A!QP zXxpH%*Lajl_=foL_Pa#pj9~m^67X=`c}7gyRZ+Pi?ceg2MY(8j=h~ozJrlh(4cB;w z{FJ<9jA>1Ktb_t7RK>8Jc|#gn>C!{9eT+oGh1=8WxKkUxk+PMFG+}XX=3wSdUR^5L z&;e@XP>r0q!A6PsL_ouQ0Q{xbok_)2L8Y_^?Y8pqMrVloQeJzg@kv}6^dEp;gYmrhK*C4O8lj7T}^G$g-sblLfLBDU-3yR^8)!cUqecZ@8frDD*8`eS+{&k$oiF;_nQYs6*%Y)n$69_A*%iYWh9MtUk&t0=WFzx z>l4ze#KzjVdQ(S7TSvlo*Qhl$oXK+TMk7V#DrA#Q&qy2lz+?XQOaO8K4d4IeN;Si{ zdV=)poI8$12KgrBoAtp}8|GcVA+jS!|jc322yVciAy z)_G~eAoK*0Kq1j;DUoC%&HY76j39u}SR zJSzGcxktLW0SQ@@v7A!6CoVP;6dUQq=&V#1R%mD0zzWn99BM=?EpOx2X=z>#{)iU% z4r7+OB82E>+`IJ?{Dy8hbS9JP|_vcl&DOJMLw1#^sVXbZ*S*|(d}oq z^RecF3(q#_p97U7>UVhgK7@ACxgwnNd4R-lG-}ys#Hb*9%2>Ulq+o6t2jRjC(=IWZ zO0}}+8I4yaIvTHxHyX9vC z9`txQTc`I#rBaZbs@R~OSf!~FhReGgnr`ph@ee&S?i%sy6ob~ma8LVcn5d@#`+^bK z7B;)lcr+a>asY3EO0iS@>sYZ53rwJ8zD|IXSlplNPhgu2d|C_Z10z$`BX96d-<3#w z3yoQfx}ZWC=T`y;(5a*}LV9Z)>8++?3Py-E+RNc!;$Pm+hnE`lV-_?KoEJOEN9Qt% z&ZR=BG3lp`R^0Se`mdG>HRjc})=CZd!tgIzxV=!dU8xXpQ8M8Y|v4>kUZ2`xZU z6f*%bDDuU@VZMl*y9x<7mIbgP{>c~Ud#`Mq!?CMOOpOvTO>2K2K!>eX@8+054`raO zEfgv6I;06s9#ZC7r4@}nfv6pdm~dj`n1T((3>Ap?vVXj_4g?f-?&z>)gjn9Hs_Ev2 zqp-aE&fx?3gEF)XgfIfn@^}<=3~UJeV)X4!?^~#w_mkoOX5DinJJG(zSr_T)k%#kZ z=!6ty=ebidV`&QgY1*Gy2{2f*TY2Oyvy!ct?lJ@^evT@Q!ma0_(TZFs)bQUm8u zG$)4!h{KQrKNP7iPWGSCmxLmUw$k2FlDme^0T=E0H0J3}ujzyhL_5OjMH47~EQn zHaF}287HU=(9EYkKH8|@|l;aBW4*IL8`CKt=YdSC)XR$NcT*XN3gk%p2Y8L1v3^)@-d|R362;v zGi+)^<5LN#r`G!&$sNi)N`Q!61Q-tLQb|EA2u4oQLs?icSeHY}XTb9+L5v7Yz-_X| zg_EqYR+3T?k(7jD3!@)9l9Hd?(ae>yE*DBtDtab*8EZvJPYav*mBplh4L>-%M9C@o zj`9MXTH)!Kgs0>E5i?xLMq>qEtFIr4rD3!#*H1J>$RK>i%HXV$S=-Uw{Gl`?>BL0q3 zSSeJk5u-5`NwHt}sEXL7k14`54=L$U6fawem(6kpqGG%Rge;^x04f9xI-C-#;Iaeu z7G?*~P)maQ<^68I!_+T00R#nLyw)4Hag&ghPW#CHbE%Joqs8%Y+2FMY1rUy^&;$8g zrQuM9ES#UzG(k00g4pkhSpvz`r8;8n_M6kPDVOa98ttS!1BOTC#JmYOL_1X``DK(> zD8rMtG>0s(ZCwQ|5)^mQLeT?K>+em5q-1_#Iuu}|KuOL?EbcPW z8Hs@=4YBxmG=t5zSX!aIb7u_0ZHciRE%M4zpY_rg6JtB6nW>%B568isk+kj*aEmIh z0kV4o_{VjMU}En&L<}j6e&`G_48h+CASARbWRvHFLNnl+4KIyPYbn{)8K+9&+Q{Kq zOA1@N;o7DtqU_EShaeqO-*^i@koLx=e96s8M#8ih-0b1XC}Uw>9`z$wqpLWGIlQfJ z%!rDxN?)nDw3Dg}`6z8v&2~$?F{_hV-RSTu?M+aQuh*pw?~!sDdFh`edu2plKGRCg zlwp`COU^KHYoqTX7u#lpKbjzQR&&fXx+ZGPBP;mVL1gSVE<#U4H1}Y2fP~wNwmREJn=(JOki6 zrYl6Z5}(G_E{(1AYAh%Khl6dk!-(7(-?`J=xl>y@L*-*@hiaH_i#BO$zDx^a?b%Y? zePdZDeSUXBEz@Y8HOgJZT^{w=F|;Ex8WCMH8LjyGW*d`XR=>eWPAadPBkVpH1n99l z+(YApJSIB8Apcqp4*r`X1`-Q&=wUl*1Uwk~!EbbtuZaJ`o0fi#Np*MWcEGiN?xi#< zxP(0x5=q>21ZLtfj~>Kqv?vP8bbsWkb)S)wNjwS%GpJCd^s6Mm;zUGvQ>u_Dk4eAX z0;9gbTcmMFy0KI-+h3S8OXg~IfooQatD5m3RK!Pb7-d9Hm4b1hr39URadA)`TFX%7 ztK4pNo4fnP{m~BJ9TopsQWC+1xnJ^bVPS5Yn{?CDV$rd0DNKJ_9b3zbF1!S8U9 z_e^A=IwfwC@fj=rhI>)|^R@6F0NGdmj9iZzspc4+HJ%(lc5PnW4WP$hQtNRdn+UV2 z)#X9DHrKXdkEMcR z%y%KNby1AdX+F)5^LakWU*|{pS$>hfp#^$9!V9bXXjBbe>jgStn(+pgVgWSn&7oPR z6VqiYp26D9^@?AN76(U%IVO|6P;@!RC!>peE*P$>^Z`gQAHJPXtBcv-HB16{w5j;b zo>`}(W-z@@N5(REGR)768jE0j##H{XJcEv?ZJ-A#CME;Gr}1NbS9=DB(U~8rg4l_{ z?$D8L{6io%384IKit<0^TVI69G3peq1Ct94ljF$gL=2B^tz2zzMggbmb%)-06xd@A z^TIig$P7T9K?y3Cq-i_7Bu(!=t;5k#D%!k;^STLxomhG{c5W>e>l3K?bTNJv6V}+@ zk)|ILPf@e#zzCUH(i=>dpVu+=cl86?AJjT$_K|yLAFXs|bBE9A5>`x6-N%~y+2pJx zC|O}D?sErLRPzlRFcYxH&#uAocfAZh^Z@*F^FZ97?=@Rn>x*eH?!TQ@frH9An`61E zbHRolthR*GW{WIV+#)Sss$F%LAkp;JHoiV8psX=!`yUE38*+AudwQ{IQAQ3?oxGaS zWK4PhD)X)24t!n36;AXfmb0JW@p88MB6t1Od>|Hc&%Z5Qdv)nff_0vFf%c)2`GvsY zc6}T!&&Sh+pBiLc3ld?(W^#F1%DkpE8*XU;Fd3G_EOCsb+e$45CQZGzAGNS(qIbFcmO>pM`vY>2jctOBR1l2(u26BIYzx0 z+{gG~%`04F5qk!=bwg2^a3||XG?&Vjq@9rxiHG`q8DtC@3?GQ6Fv>mjm1$(?WMJgm z4zs*qo`nYk5w{|*$qWJe!TE@I6AkKbo6EtU(Hz^o&oYxvgf8+U7imdtmB>YjKrc#$ zb($BaIc8J$GcC=`Wml;}eaS@Rvsl2VNDnKHMrj?+MRviyz8iw&sEZ*LG|?bDY!+ zE+Wm$s3IA_WxzwHA2fZEL>hW*ks+`lZN4q@x2HBfX1kZz>2~PGjwlz?+;efmf#xlD zlny3{HKirp8SeXY+S%7CCN}lAks*{@J>{--RZbxkaI~~$dlD5^8tQEIq2?|^fVgS1 z$wi${(d|^K+2RAogKMpETZkowo^pm&<1rTFYU|784bX7MM>>^j0O(UBkf}q~PG>5k zEVB;#z>>8Wv+?p>y9@wv)Q#^tp+B%om$P(WQXVJ+2^GIsPvLzC|5gY6 zWqrbML;L-;Ny?BrgN_meA4h4mu1zFD`nd+hV7mi=`To)k8BzzO)J))cEtU-(G9-BR zNlSuzg(*uFP?k{zw8h@*)xn~2^0A&Ks((M?)N_>Th_#HcosX?M*P%Euy!N*TQ6(ld zbepy+8(6Qz{KZ*6Kl-I@YZS0+Erqjk_FZDj^vMQMY)XnMu_a7MP6$5cDEA|xFXsY` zByHgr+r=61hW7h|!NvBo^UnpeHy+65M z$>;9f>`^_xXsVObE*p%8*>}~rsoVOv%bw0lG-Dl~&gyA>Qk89-0WYgJZ1Cz#d zn7#ezqbwu+AknZNfq=Ey2p(tf**L1}X<5uR_Ojyw&i$O9>W1KP*DUl?ZoqxU&L3WN z&MNCYG(*zQ;qm3Z9vsbWlnuln4-~CsBf!J#&K>o2n7w;PhZwhf+?3^GCZy0pqya@` zsRi{Nzur>cw`cXF#0uiQZTY(zwTkhE&*&Ys%U`Kk{_3>KkGN6(ZU-znfs*!@J{+>q zXynXMm3r)t^pDf}sF=n_dP47Lr2KUss=@!O<7^=6!fWw!`$V;<2A~Q7@I@J360gi~ zsPIcIt9^t0Ug|}Ec8-XcQArq!4%fYxy}iu!Qx5pKr`p4hiv77qjq6CD8SKHYDY`h$ zX|5iY=Rl2HRr4}eUrx*E99e$o`jU|lpTa-X23gy+YJ{`8p2HZQoo}m3+v zo31A1tgE^Uw}yCXYn@{?#T1jucS!mX_z*{U!(c+*{o7830q=%R> zC$<$1tQc!wJY>01G^{KYzejYC%{$Kr(Y9{g`WmEa4ET{f$jsNhc*mP4>|!DA98H*H z|HwBMP1!^TAzlig<(Y(L)js}dQB3)uvK*r&@`s4s@1#E-2mdTKx1e5 z=SX{W!flFOOeDpgMEG94xHY2Yh5A}#+kpaRJOz8NyQ8rWqsYa6?;@)v9=1VLG2O$g z?tJp#?xaG_ve;KA9uOJ=t0psT`O~7Djmt;%tShQn`+cpQk)W}S=jtueLV69|W~C~y zy|J$v(ZhSX=$;-wL+?VY{7^m3>IM9FoKaj%Q-_ZVErw!w_JPPig3XRf0JaidCsf7E zi*iBeY6Lz!Nj$06A_mCcH?GW)Op(hY5MGpAiQZ};xrJzAXntC~)W?X#Ny*3HS?_OyQU z0^V$oPpSviWb}ufFLu88;y=c_pDGB{(0&Q67acbbKz&oHtQi28ZFOSP!S}rE#GauG zO!as$JlL=U+c@-gl0KUqfXWJdMl;kg2CvOqNXIp0$YLIl&w#zm@OB!%KmIs-$(ZyX zn&!MjMi=M_Ko}Nvya3$(_^w6W_R+Lx3EdBPAv2A+?cs*n&bT!r#o(zfg6wQi;w$EH zb(smA96=d8PILjf7!67g{^}wK%%H?K3c|V&^Tt83@9D8F#1Df)3_M+^DNleK3<^Cf zPk;;5g_!FO3NiE#Hw>$-7X%7%FHW*De#b4Mg7nSo2gO9h%DW}gCqS!%9=t?N|{4YS&yC_S739G;wR-PJL33Y3ej{x%wzO4BloNx;V&5J3t;c zvyF}6koIJz@8Em7!+q&6+3jfo40<`iMZy9HObOvE0fbqMal_}?hP#mXgidV+(bHpm z5Su?f@9J-Bm|3Ytor@X3ccKu`0Q7ojP;geyunj$=x5R?WhX;1A1Nm}anf)8Q5gYE1 zNR=~7O|$#~i|76mJ$QbQg~K%TCK!v@js0U;yH87=f=&%t3f>3`vc_;Cy$g&@HYDVF zMGDL!yX-%qA{HBW4v#rt)&aN)ln{6Kt?V|}Sj@iU z>qAVFNh&jfz{X~P%`g39S<6_4{Hr$%@x?1^;G${e1>3t*nXs?--7x?UTAbnUWU#?)>iS-`}m;c2Tx> zfuAj^DKfzK?)_oc&;Yf66+_F~1;zbXeFLeexTGT;qDD|ZRe}IvI%yisd1#;q3*A1M zDQQF!BE_RJfgza|`0ZN;*s6j(fVKHHRpT0$rd|xmVEo*Ox|+lX7-dc2Z`gyv=TRmk zQB_FxN5uA3HP>uTVy{_=LANWxsHtp5O*v#HL4R;LOiLrli~;b?Ry4+!R8wzZpBB5T zp+G;dlY+jmB#v0n19)skon>6!8=$VGX&{bGKVupv;GL<(6bFG;AS!UD)>rRjv&5vS z5GL>kRD>C!&<4MNRBL|O`Cy@ge654s3jJzUi-ft7}yn@vv_2uQ3Y zB+0wl-+lsQT$yDf;L{RNGlbs4&D>8Yjqg$rKbZ|9E7PLn6`a6N9s`j60Kh0)QsI65 z^t%jigMb-nHKU;Uls04Y4m_YQ0LxyN*-N7_(G8xJz-LTaRtzCq@sery%j`Dq!`pNs zw_P=z!nkMIxGtMtX7N;mZJtpaoH%K0Z=wNtw;;G#THrBg9Dao4waVe zR-nevQxS8NLW?uqH76XSFKpoj0v7xz@uU-TR@YWO?7xYQC9>op`_vE4dO9ha3@wwO zJV`K*PMaFe2t>T+#c|P83T$E!chBz*EzI=e1fYsJB zdP^!$)2C>^$g`syHZCl{L-qG7L1W7Es>{lvnO;!Se8&g?VW72!MJb4|9$64W-40Dy zvzMDYFSFO}cJ^`$z7#FpWt7;tyBGy=F*}GNgWU{xe}pxDIWqibf`u>a;a&rIYkqXz z9$6vFo6KT1tzMzoLv>bR{?quJ3S#YOG-wBh<2w>ROxG+eLsk`Siww9~VZ!+a zIJY@0Jr?m~*ft4Ynx?v5KMF*13ZxGE#M_)&$?fPG9@71~hL)y}NEtOr;^7*;QgYhP zW)rsyNWO1bfmL4^APrS)Y(WYW_2X#h%f$X3wXzJ15T*BkLwE|j3>;%Ic8eKZy1ILr z3DH+iMa#zzQ7xuNjWkGIPkTy}0$C{a3J@+OOylpbR%`LdY4J$5xGz>_W>tSLLsS9! zb(&2ojKYUE@N%9?JLqmET0ojLEFKTmQEs4mBgQBexvPawN~}kI!C}~e;NNI0L#;A+ zC>1&UfPm%{|H>5q$}j#^(AmHl3~AP}cJTB_(yZ06@=~9@faI{G+4y2St;QKQyJ)no z+5jIZ!zpmH)04V^RXbA*8_Ekv1;XkTv@j{=9rAX-2xpIzz$pvHYIrZ-%nrm5-+GY6f%7UeLY7$kT94SL!L8#ryZ`oj)*C>FTb)cztS&F z%T}30m5uO^@0IMYa!u|}qFK*P_D#JxhJv+Mvrs#!NpxJdH= zU_hV0jby7u^06oyJIyF|GHwyP>Y$qr z*eCX`#I&L?344}!WYL>dRw@I4LnbmU31&wJSpU!rSP%Nvz)VewP+VGBsRY85r?d04 zO%^ldH;J+2Cnc8D0g}cSwikMNj9RFdIg!M&n9vO%JOcs^4`J>3GDTk^p~C5hP$oOo_HOV29C#L7qXvBTxNpq#Zp z`au+cJ?AhoM1PRyih;yJ+F6_;u{ebb@znAZvE`vrzC^gc1l|Lv(Gf6NTOgv)73oVd z>La8PcbVO3F+)1)G!sC6Yl}$6{cLM@nAjn~H3{K>BD<9B$054>L@HOL{u>|DiGX)r z(0|k_Q{CumzpaQrPq&sR4p!Okffev8Ii)_z%?pleq z0s9Y-$MqvK2+wFrpF2Wt#D;O2FoM8bk)n~!EA4MrgJqvv71kJt?j%QBMlv|EpfE*V zys)+wg6%>{1?%pM6@Kx;v9sVtMFc6xT zhHdFzXSMaB8B?*CDQ})hgf=&l6|x~Yo<>-YThNCoyrer2__Dd_Z$R6lt$0u!?mLA{ zH@FXxu5&@ZE&RZQ$cq2aG{-;P2K|HT(lRs8&a=OC)wGq6eO4YvK*~>r{u6-HMD`CZ zW+cqeK(2y{cHvD(G=Mhpbqg%56V=HN2a=t)!aLP8E9tk7Q|O8{ohtTwUQaKMfe^Mn zrGQQT1Q=?zm>yVb1ZBifQnJ@X5oe|GiX?`}9c+`bQl>;E^PcTe0 zjG$1KCz>O{6D#CS{7=Lz#s9>?q=hyZcUbMx<$0quo#`WDU2*#E@Gc#e-*iT3A@)#k zA#qfnqtNV_I}dIbw}o0ABky#kh^TO|bBKBvD2>wdt-%hdBJBI2P}=$Y3FSPK3luFN zw}MIe2FGGf8*UC~Vr*9$gCI2>j!F;!P$90I9`HH9ez;c$R68^F9jq065M5yoU4-oo zZr>hy9FYE~>+|59)iS`iH2Zb`{(U%RgR(sPk;n|ad*~qmLOqxZKyQdkW^MvwTf};# z;B^jrr6AZhv)d$N*BwxN6AEDHAGGm6!V;3z%c>r ztFewqZS|P`OAa>uOYhcZQKt4!6tT~Wc^_KCYl+k^|E&(Xi_47P(}DkRD$ zqy$G8=^RY!7e;7`&>L0@gb-&*=>EgZ!8@M;2lc1{_I=cdrpXFbEWi9%PcK=!!kQ^@ zJzT0P;^PU^NysBfFDL_tVeGc9cWAaT6$h{npHvY!Tpc~IEsJJ+s=Ps?Ji13VL#{iD zHvvhRDv#Tp*y<`kZSD5$ICAW<>U-I^A0acl5As2zAFR&qaSrxH@CaLFPvBV!9V26* zL1!xet!`k43_g*1KA9ckHOqy5Fv_;{qrOg{o%?JcvjwyIIQy>XPPdPzHIP^OS{$_) z|9-vAz~j458u4o_30@abLwG$u%l3G9XT>=!`Bo-|n4|M~NQ3sF4Mk*LrAhlMLr1!U zSL}1zi@e@MUR{Y+$mzR#(NP3g?Z*>x3zWff)~O~ zLCYwj3$e$Q&ilvO)mNc8OkjYmb$zT6H#NC5KNaglx5n|kYg&RyY_aXlwwy|!bQlNP zlpmT3Z$vM$KQGD!#f8hBbEst?kOr)}6c_SzOa4otpDgCZ*xOw^UI1R}>RohEZy^j9 zw&M<+)oa|b_K9!?;tT&yVK_nlRGk30%=G23r{yt-wG_T5q93ypIKYC3Vgbb~s(mi6Ru+9h_$2Vb{MsmcU?ZODw8@ zh02L0O2*4MkQnw6>j?&G@s2qEaJPD5rW)m|fq$gwSq~&P7IQR=4x*fegCJqd8;GVB zV$$-qJ_b}gjRkizaL-e^_1N5GQPH21C6By(eKX+s_f80P#cJcN%9Q z9lXVXKK;7DZi5p+_%w9Z4Zs?e?i@%6tJi*TnuVvMiyr$RpMLRym*f>Jj$k%YX zoS)x`WA!BY!N|ye5SK!c*OE!}*W%#>ZNnw-l_^>bKxj?K(_vq1QA@dM$7)rrSv|XG zz+V(++1u|b*oK#^-}%}ZLoqR>?WKC(-0}9ece}-dJGr|H#T}EDLL3#bJELI5QYxba zaq@1t<^I5}%4T{Fy!pVb$KyrQP%N$b*j+m^;!Lc=8n9OJK{K@7U@x< z>K=b+ArXxti^`P&ZHL#)9@1=WMN~%#Ol8DMQ*CFo`zZ`m_<%S#oo15ssc5cDwGlxZ zg{<)O%;F!t-&VVJB}ACmwT%+tRhBp;x#41vZi4oYu+nH_SYaZz_wM@4Mp=j~U1sBO z=uccD9u8?GOC9`#Rgo=7;)eTeRr2HGK_8{b$@gYbmwX+gS9S?qLMp!;O~ycfnqJ=Y zs*Ag1VWWDQ8(+_r*D|?!Uuy&GHhXhQoKo^&Hjx;MteuzR>bM$!E~DFqkRq1yGJ6;;uMKtuOqN5WtD~Vpmjc7xAyP~hK!9#uR}>Tg5P(8+wish_ zY`pz(cZ{`Dq1+9sg%}qfV4XJqx-_)pAx{K(mBlQZEE*lql3673VnA;Mm3u7v5#3_6 ze|dJYfOcnH$sUbIB{c$q##xQ*6);vV1B08}mmd;h1NRZi^~=P7LOYeKFYn$_)aC&B zvLDI@!=*FUbwx|wB1jZx2mv^gjqJ3o_6$QaCJo%&nOmrUXE7a3`Z!L~ut$`h$dgNy zeFaH`)$DcsN-@QXbV2(Hc5hBa#Mgl9{l#!eZ}RM|U5iUrDxM=YAy zM4b=$jNSa@esCC>BY%Wa%nybi2>H&Q@|MfyI+O>#EUJ<9$5l$-HQ&=?cFm%D?PukQ zq+sP-kfx^he2wWTY9O~FE7EYnxCNF^T60JJ({7W~4sL4kW0VvcNv!@pj+~5DZhYzu z(IdLc6jRvulM9Z8U9@d=f*CCOZKGmRw};|6x=V-R@-3%Y)E{6v(X9pRYv<(b6mdmu z2kiF@?IyZgE)MB7+&KgEqszn)!i(+Ya+Zs*nM6Y)W+$;0J@wy|Z~_%9gB>r>a~HPA zd|HfE@bq3Eh_AES?;rfYDz#Bm_X2a*a<# zhnHs^homUG9(=SDLEk*4JkU8uf(?##rdbco#C$fo_q{m6+r_+WUO2p|aupk-o5(X& zO{}SDGF>g$3*3rGAxG#uj2_$yXVR@}cy%ED)504d<0k!K3#F`y^8%S?iF5PojI0Y??QWx z-t6)cFHN+w?r;g7 z%w}aHR=^G`%5zU-;}Z|YiIVyTH_Dug{$m`vSYB_WYY5GRpyr?y1M5FC<=N^CGi7p^ zm{Ri70t!6k;ewJ0=JN=YIlQJuf##GKcU}P%1*OK z-muP>xPOuT*3N#KPDXYKh0}5M7AYAexY$Ri#t5hE#R4~k>6NL->ZD`EEtrIKdh1!q)RKXvJAB=3 z{fq78XG#HI#1Bn6h#fr^ltXQrMyIAcX1LU|9u)-l7SXe`?sk3{9|c}+G}Y09lF>!a!~{9)C54K7MTWQr@o+4k zvAg}mG|abzwiG`^T~wTmemWEsO73}8aXtKOzo)^WKkbQbzOj-MdIu$3C3I4b~_9 z#u3r;1mPQ)RZZqxEvT}>q81+2O*t5PYn$qHMfVd&f2;s9knqiw7m510V((S^2zk5d zv`mM8h+n3PEwN%(1~x18q^{pw1kD99Mq<_^Z*FB+r5ex_qqQNnoe^)ez-?{%pi9PJ zJE|0%@@Gmi^jWmXHL!XiqEV}75jNIzIhfUNax+f*?O8c3FjT62^6;pwr;E_#m4G*+ zY_ITdg!g=*TM(3>ubA#y6xWaXs_F5GYWh)>=@rhGh(piH@sqQ&a#EqyvcQdbQ3a80 zNae3+7rx)73s6lR^+OIQoGTNsQ8EyY=NN9{5kB zY9|wWykfAquj`pH9t_>q@iUQR-Rz~mfz0;2BM4HrdF(LRRj0`(eN3^6qlg3RD~2C7 zp=0y9!6d=^;-@#DiRoBRzMlz?$5X+Nw|)aP*K|`l+Pur)C0O{L&@s1o=zZW~P!*F& zFPtnwq+t+|C47!#zYnbklHA%d1PL1DihK6!$ac+@QO&P^+ZskIT3OHO`WyIw0d~kL zU7zg}!}x7O|F)sk=Y4Ew-IPVZ&`u0LaWkrAaQDncOfTAD*f2$_n21by9(dmC5-`D9${m0m6x&7PARDSCavtE~rhkTBQi_I6U7#i`szx|D^unI5t`` zu&U_B({@J@Wfv!>9h+y_7dnC{01>Y$XWIBwx2@GL($-Xs$7p5@057w@0Th5c&WeVj zz@@-Z&S2W(I7IsOE$-@VQ?A^{rj3#J{$PU&Y#cgtS1vLiB^aP@ zbE6ueY~y89)e{sUs*-i!Z|de1CD6Q>6=#^)g>SOPKmm=Fote=FuHn2mQUL;aB~6=T z>!?@LA{5_LzNu!D`VC5%Pf-4U4Xc58hs_^hJ_a}cc^~$1;EqexFPdB8A8ZWJZl=df z^U_1ZSw)SDEGDa?*jgGMA&vs2>CCO0k91NU7&j7Jusa-H?}Ak7z;eQ5j9{$#9vqcz zmzBpbm2S8e4(gvj=%sK%2GPS5L6btN-;8Cd(WWEMbW8nl72_oGGNBy&UyiKG8lRaz zbsMFA&5Kr{M`z7d$#&FQwgThFQT(IW`}6Mvz=0YAvR4H9#eBk6<0>$Imm<$U-%eR| zhZxij*=398@f|}axYiwF@MrvPF{MXOOXD(%#epA0=~DN+jJsgF;UyiB8;%)Nb zh{!p%?t<%el1;EojaAX7J&tBoYu2S}s*@8^>8U0(s3`;H@rREB&&c3J=yybt8fsV&aYD~jWR zFy@?$?@?KDb2xrYsVcmhf6H2}J*_(73(q}0xd{!KAv0Rw@ zkO^$aOE!|tU*$+&Q!X$nR90<}!39<=IA`(jtfo@P77Z=WNcK zR5bij2V5aV(3_T7f2CXIx_Xe_M*odZw^eq}Z>QT0oo@d|`}Do(oqmy{&7aj8N1Kh5 zq$7{;;*ZC5GZD^rQ^2Nac2j63u9(N?lN}46%rAFf*rJh4He3BkXBo_pJ%=;j-Qarn$Djr7`9R|X6 z1rxDhD4~>|gL3YQ%#Q1s8oGqGD3PkcsFz!;;Ia^CT{V6+K+m264a1pa24=bH@nA>! z6TOI9k#x;PDh|*KZJW-&)PXBr`P(uho5pOA2z7<^m?ri)26JGVo@n+VIFg`@I1Kh1 z@wikl;VKvc$nzJp1(XTaNOc=4q9|$TS14whoS@7}-xZCUsUl{fG+Eh=Ft%<;|J=8e zn1i4N;EHMv4@GlAa7q--4#Z|p>W{X4T4`$sQ1iCBqTcH42<)d@!{d?3T%|ROz|Se8 zJag2XVvr^xz9#A|`9tU`(y`8x67xFYZf73pk-*^-=v(!q#V%Dij}agf4K2H%HV8zh zLs7gWK^zEH8h9&=#0Z79j0YY};XYAvvwwRA`H{f+V4%zH!OTEYn&trI+=iS%d$((9 zOu`7;+Fx64AeXDNlG`G-?uH_BqjN4p!~(dM8U@-GkLb4IC>SY(bb>jl_dn9>I8r)A z(nk`uMhRbHahsaO>_=c=<~8vBfEzzW1N#Hp<&qSINk7?SjZtPmWfuKOr@e`tCG50< z9=gH>c#zB>diO4{ZiE#z#XmPze@Dm`k_9jT{#LZE8Z}4vH%R4hk7heW8;JY+tT_V> z80Ck2<-i;ANAJDV&s^h(&NlecH^X=Jsjv`)%2Xk#ga;v68YncTkv9#KSf zBH6wyKEW7I$90d<1815VfthR&Jd$dANSkoJTLOcq?9f&s3czX@xbhk0baay^l{Z2` z=_QT7*%OREem8>e`)N@%VcZ2heYL7d?6jXDJ2& zWP5SUWo*_7QtD6BV@^MEeFMKEzu273`1uEMWgKxn9;|`$zJ0H+E1#7okI(0Wjel%p zn^wZ0jMD?1dRpd3-&Wx#2X_y)Ki+)skKet8!M!{9`{CdJet7pJ&o=)4_ut*wh}Y2V zy(9hF!9V_fc(_S*wm*KbffRS+cN?mrW$|ggW%op|#VFy_7~|J{eB6}fAE)(EF~zWU zXEj0y=2l~J2Y6s#Z_A35PJ2UxY6D7|vER~g+V0A>8@RQgMft$ea`vf+3^#bO`heZ4 zs}I?)2d%n~444hB0F~>$E8Dg>DW5OqI2hQk4wnav(PP?t#1>V6=fnw>Ho6_1SxsGc z+oCm$a6`|kGi>$wxT)q{D|SDJPxA75R_(*~Vm7wkXN)s$}~n$7D&4{K*YAHu8;+rD`&0+m1Ed_Npgc+mLM-`d`qMY?jr{ z1oalP^1S;I#NpgUKDlanroKEnEoQTFiliDrol(qSIzPtn<^&zJ{(ttqzQ1kbNcj0X zp90e5Cy^0EOK#fUiKSK5aa#8pJGI^G-KnY#k&uX(0u%tWrP}=N&&=%G>>CK$a*|%d zHWmr&>+Hwx~?c@4CYVS)p=eK+md%HCoR1!J0!-sdn!%e z^6A+w#~zz^p)o|18mXyiAeh|fazr-0TQtzw1Ftu>=~S0-$-)~$h%Q{w8xi)K=f8jX z?XyQ;KmKoMb@!?n)i-(@0Uj$-oY#N|)s-8h0k0e4)vtFe|M}xt;^v^z$XbxPt239v=kff9z+bw9RNhcz(rC*?^;Jy4`ao4zh@ zR}vv6pHwrIWAx#?Sj+}ip{`z47va^#j}0mHMfHzyLdsdNQ*I2?i0*OSK5MD%3|bu1 z-Y^G4TMhPw7Fol{j`m>&4YH>Z`Av~Q89XVSQNFD6Z2Fpl8O%h?0np=GOj{-oHKaD$ ziUEWz$MWUJ9A;Sh06&c*yBb@`4+xK`nk{(1DFNT;%?a8ndIf}!M$VMv;vPs2oo!Zs z^K-Aq;(nPf)BeE#7*^Rq09L~_M=={1TGy^#8$MFkHdiw&T!C3IcC{iT&-CQP{tMd5 z_((q*mkcTYgz(7mcl%_xq^7;rI~B1-dx$t{6gA0^r?#77Lq5OvMTgjsHgx0 z&m5%a>tl{XR_ozvgOmC3yqqp7=WIj6t$$!RwmcSiJ3J>h8zmxNPlYZL(4I|zO*LO! zs4XqzL>51*v<_fonEIEOdHc*k1L|UEyPfb)w-+0JcwBu2S165Ay*lWOoaXlp#OWMt z-qo4~pwSP{bOw?{2<=E)kBm%Xh;}rkbW&$W8>cZdImi5UEth2 z#$|#v!XB!@Chlmt)qL+Nwi%F(lHrq!tXS{>zx~__Z3(xh=b#^T&>3={u*QhMV$4kU zmM6|1%w%MDAHqU3{JOLDY$4D$OfmR2qo0BGwPL9TU-?K zz6YLElu32o&XaZC)V%oMb%8F`^Q`$VnLXCFdJ&eYw6MQOLU=@5gl%qAbsH&1usCITQO7Mo)Hj3&wn%ifc z4VzN&#`XOV0^2iM1hXjTw``%k+Gd{#;^PRjj9lAp=kB_s3PLHLRY=6h>dU1_j4WM0 z(cE)L84JbXqqpRA1S!s*cSF3^+GoXB#iG-e<2KjFF^o6WcdF41oiCG)->rBZS)v+r zZY`%W`=CxZ99`@WqbJRpSIMc~fzMc47)mY-WQ}%Rk3>*;YLY0{8GwtMN1@pX)AX{w z$flB2o#*rHO#x^wuM1i|l4%-Gg2_C;A0F^cZ{_pB`_>%0Gl zBe|jgby8O4?NzmG7@GQ|)q(210M#QNkcCchI_XFaV6`B&Hzds`L8??Ay{9u`*}!GF z=dC~q7>*25B(aQiN)i#qPDzL4)I!KvGx;REp@iiWd(RSA?2rn?H_Qu|p_7fe{u&@` z>joctEvP9p64|N>!OSlfGP#LY5tCL-)s``)_Pe#If+hX{whE>iwpoamLh7dhuCcat zU}dBOgIt^Sr2L$sxe#{+EC%S?V_HRL#^G+TY0t{>M#`4!xD0XxOF9LD@^YBt$3mMo zQZ{|#OP?V^hm!K!`mz@1^qzIp*Fc?U_=b6)N2LTyr9*^Nhn@uMi(tJdHm7QKYKps{ z+Q4ueveo_dBVEy8gm%@-O^H_vG*K$1w}QCzfIlHAe?WJA=vg$Y3EC|621ISf^C5)& z$i3ul;Z)8NiRkY?lXlak1VzcalP)_Isx>5N>PE{O#PT?PfJyQaq8o%EqW z)>u!9`yfJl*hy&ryo7_3e^i40TxV@nyU_-$HwJ_sCF#1x*wlY-Z-c6AEzVV8hft^v8=wrr*)bOWC(x@9t>+-o51E zJfFVCegJ{5iY5;MPZ`MhNF0TvXucKo2fPklSsFO47@N`8P$gK6pHyrf>B2H5*#}eH ze&-%q@ezz<8|V2T3~SuQMNkV(l4-}1cNDcbB!xFar%`hU&ycGD%No}&4uO=BRBuPH zX!dyH1-6zAx=HhXW`_yIUehp1gBbgRbID%JFv?2*Ik+U2uwd_sn_lmBX+DtP&7AdY zc-3z%KV6or+WjYI&0NX%(7;-C($5{uT=HkWt`WYk(ZCtY(BkJDAATzAoOq~a>Cf`( zoWxnis-dgM$Vm8of1j6-O}wKhi1QqAj3reb#~w zKgOh5MA#G7ZWhu_$g#1;iAoHY`Rm!0|FG%BHo4uOLWKLuER3*$PHs zP7OiAV47U5LIBk?rbSSVT8&5jA)!SSu`o>Bd<-)vHhm39Gcx6WlPxMr)C_FDBH1Tf zCTF)c$F{RWcQi!9by^b0 zv~g2K4It`V#yu<;gDrg`h3iC4?)?z2O>>P2B`^B(4vM=8W%BmYT zCu~a=&s=#Rw2`|wK-CN8Y-)&8btF*3os#QMnxk~8VjdKD+BeMslbXPuk01)}_0E-~ z&c!mdZoK_od0xkSWuS_Z0MhQG;2sSs6NaiAYI&munN^`v0@YW-NzgEn_L;|}+WJ(4 zQ9;|r+04c<=1*uG;cRb06=t+*ywIw2B7HT{ ztr)qSXcVn4xY7bkqA`f#k^y;x5>;Ja!`!?~5xkM#P660$y+o~#JrCS`bVul&JCm$i zG|y$X@>Yy(1adDLMsEx9F-qRn*kT+i5j68$2E347NS0!#nuvG=yK}Ni`5ue3qsF>R zg5Yy|VA7%9q1SlC(G?gQxX}w{WHWZ%`vi3Lx2}v0AwbiX23xZ6zL|rXP)*6SXeU?s zNGLNeGx{d?V%8be;()e(cLH09J8XXnxpZv;ZI0~WD@?+VO6+J%zPf`|k^GU|(J!Ki zzX5!>gco-%`2^sZ#+;seK}VWrZRnt>SBP04IZ-B_ti<#k#+njkj=e}%-Yx5d)EW@* zDRuOOSLAG@{oxQc;DfIGI=s48Xf$I)vUh-hKe{`0DWDD1Z#Ox?L)z{!t&q@=(DTjg ze6X5$kAidtb<1mC#PNy97ghO%ZO>4;nI|EOtv>WPy2G2@-L2(r?=f$`^{Rd^wcfuq zCib39wDdq5f~9Vxpa)tpL*7U?PqcI<5Q=^oX=O8QR1-{8KoPD?de0VL+?Q&Pk>A|c zoW-(V66bwPpc_R3OWERd-Kpr7P#loa4-ZgXzHN?t!eL@b9jgFZv&nEIS?g~emjpJO zOz!XhzJ6*g^nvY!+)JOMt0Z|BSAHcjrsH$1fp z=^_Eh@O#M4tKe1SSoPi-fDn_gl@mG`@RAdCWUq2B00otU?%W0Xs=f1Z+KA^caMz)S zl-B{XpdkN=K=w$9?msHT?tdi2`ib^;1hVKI#(yT5F)*xEhpc|_sw70AMdQba`OY5!)n(CnxC>$S`1 z9mcEW?lE2tJhQ_v!=%62bW3}kLA%7sZhQxl`qs(RWd7jFkcy!3H6Fc0UaPb(r)Sn< zKSE=~;Zg2l9!xfn@SKo0{_sZVuMzPJqOdL9`_IY|U%JNHOMtu60f(i)%|^XWqPx=p z2YByB5T@)Fco6m`X4??{xliAg;;2b@4+TS;8M_2Sa|~i(W)@CuW}4q}h{&*XpSmpH zJT?T`8t=fNqEG}TKYlQfh1%aE`7+puw74r-2jq2SNJh?A; z#bY}KLnbHel%tnKm+m)@rYs?3AS}o8eR(pTgj;7}3rS-cr;=3t1(Ej+Y zfk(eU$y0r|ggR$3+IPslN))hHJy*@y7G}%U(08z9XQ+TT`Avo^s$ZZbMLHXsD+X!> z;r;#4`^qekD));}IomM>!$UL`%yCg&!h^B73IO%L{E+&oXGpNhknV5w^2<-xi{s;B z71>1#)vhxZWiL!7zLUEl*Cne^aM5iaxo5=D(Y7!AnP5CBUVb;hU$uTT< zB1@M`--+7;MY7UzcD7Ky7|Q?V!+K+0f8ic4Vb9GkmLJfa_R0CGkQ={n2^4t2;+2tq z4!?!c&_T_zw4co>-G=hmF{eC64z+zz9P%G=hT*;oU3GBrWZkg{X(_4?@)z$BijG}5 z@X8%|ujDnHo+ESbb2@y}u+};(h#7845}1mC6*&1bJU;w_i(O*td--zR0id{oWQr?3 zeJ}aCxZ!}tgHF2BhBT;i(IKJgUd4pqA(Wlv)2gOp(Izn}jlKU|6gPSgs5zYUV)M*% zY|ZU-c$ON2Qmi&*<-?4U5VFOxP)qKiIehA9Lp zTd9rKT*o#2c%wJ*^@C?5GCAm1+!Pd($b6kHTej6#Ip#vsLY}PyM{s1|R~!x_x?#{w zA}p6HL5A1V58gQtoejr3HCMW7&koaWn#I!=8094q3-v>)&p`osr9#B$^S zLM~ByG9979ok-w8j?=XgA)~c-ce)>(l{MPW#{C1Ft3^PxIY9c^5c)yn$31GiGmykL zaz(b1=Qz8xq&c1$qpO?C_1$n``pT{_usgaJPQ%dE|E#-n3y5l8b3(=c}k&Xs=r1gjo-#Xc^^He1qI+zofAF2#nS9KwUpp4=%5d#kDlXanK(aarc| zb33#UJN8?WeIw*hpgade31Pj(Z_deORK^T=7}~hZ?^SrCv`j?a+YS8J&DpISKg-dm z&v5l5woF_SPrfW>H}YIqH>K(|BMKz(^kQH&7orxwYID6PrkKL`CQaPrGcJhj951UF zpsh22(lwf%SD1MqoRxsxo)3juP00LaUH8NW>nfW~v!)fM8{iv;W0*VU+JD<1=W~r* z&u&KMM<;9FfLW8hNiBACQ`_X$ftd@rGDH>{Ka8t*=qtHuq;|ydDH@F!Kb~wI4XEsl zuQPL*J(51s>bh1#sSKYh9<;$VK}AJ9c2Mq9k00Y;CEAEdMSZtFE3A_6A_*08?h*#d zXxwt#4H(R_*$gB+7+qWB8gPagruy1J>deUkqyX3Ba)uNms%}}xNUvV%$T?amWl`Y2Y zlI&b1SLwdl=FHIh*hFY(Z{3XhaXCutF$WsHGai^WWe@__DVb8zn)iIW5lmB_fHBIYyJFuJ!9~vBpUkU|MmGN<$e9 zRDK`19lLw5Zp+0x2ia&dIkHSX9lOv!C&t-ZWfG0YuReE$!s4417ct||98Ww&YOapWhx#{NhQo;}24QiHbf}!5DKq#ful~(q;VoUXa zkgo1ug{it{e>Au#q)_BkqToB!rc1ipH~YajU%(t5V4`$l0ij_*r1U zM|7zWDPV!>E|xHAD}QU#&(7h~6Q9h6c8)%Vj-WN9GiZ{*&EQ^ZVRuIhUGlCc&bv0# zh&6@7>SvQmACpRdIr%4Me8H%qO{D|tv}!}u8>7}d&U3LLVq=2>x98iT56KU;(2!05 zyDrJ~KGZ&m9(mn z=N4RRgTjxmdC}9@eyBcoH}Sp(vyQ?3L~Rs5kSXnFPwhs&dWJ%!B{v4}vyY*z#UUtzou}4QGq!!^CuL)^q{~3E zWUCw#GsEcpL)*Q6WILBG7MGo^VsR-xVlh*0VNA~c0Dl(ORMX!T+o^bmj$q7CwSoJW zrPKLdUYo?T?Pb3DxMS{qzU0h;$Zv1;QNNrye4q;E15!RWAzYn~{>>`tkl_Zxe1DJL zwVdSRC&7PxlvEP)+z#)yKl0Ri?>@c#{@1WFXQ&XDl{_j;~^DeHV3}Ke`d=j9>)#^P389|M2GS z-9wS#Nj1wy-_gz6XP{MAe|&CuFtl_<)nr@lU@Jm>#6B53xZ8%6}HD zCB~eg>)P8Ur(816=0#aWz$#i=F+pWG{(qnB^X%r2&-d?-;D7&q4+MesUVSr~f@DTF z4zhLxQXxS4T3{MDCV{=dWfzxWk=Km67G`|$km*T4AnFaO`c z-Au9jvuxU|hAwdty2`D4?@sQYH2|9%8q5R;^x z)R)c9PAe6;ot-5VgO1wCUnJQ8&5+_Z`TYpf+3C9qP>YX7jW(@iL7E$i3Jo7X~8hELQE2G&3bR?^&Yj=bAk%2n*fhShC#cxz0F!$nwAim4f3kCjx{7F zlkbi=I!{A`FcodwpAP_RX_3}Mc{xnKREU4DMRap`51t<0E5~waMKd|9pZr>mWz8IL z4|OG~Cccz_e+&?rnThzp-YxjMg(APLL+bZ>BBz@V(+l;zBs9K;`9sIolNb1kzF*+? z>#fO!X{32uV9w*~;kzm7sDC}8Ki?jS0(&t0y>d*?ULPs++M4X;$0ht*9v#4(juj-1 zSn0>2p>K30m@};8igLzIU~CVGq09)pFr*g%ek8nEPQlS(u+;$hQ3bPc=KN*?B{N_- zPYEi>Zt~%=_;Hk5)Oqd~Ep^e77p2h*-b^Ov@83)6%F}IDU>i7^d{H_t-oKv?-oWcO zoHM=I*_jT`;psVl3axJqtlGe^06*MEeA27p{rf=yEO?mK@U6ygn&aJ03Pr=W`}^Y| zOrtoxJws-$sF8jOG`*S};6#Pf!DQl~<)O%f-Hfg2FT0*%3=5{=|+S^l| z>SbvFs@QaMCP{R7)UJlI*v?J^MRe0d#ctCDaKvNT>i+)KgZ)EnK<$wLlj?dv5D|Z= zpkWP}#q17&z|GEgQrFonhOfiFz&-P`;W7Suq<2Eo&O)?fhw7WOsS}KClBdqb51e=< zi2vR8xi}%*22Ph6u5koQD|iNegRKk{EG!|ID}K{4Fpxz8f4DxCTk7pNw_uv+2)kS$Qp8>J5bfM+{9 zv-H+9b-Ad{vjsFIzKpkS-@m^di66k7Z+CWXM`HZ=3y9_d@KsX4I~~aN=-ny>y1OVY zkKW0o*GCs4`E8ZX^Tjoug}z&@(#y%!Nd6vS=D3N`uAq^(?5#@fIpLC=-Z9hXlYuFF zy;x3PhYA|>)sOPi_6!DMDt`x}a%WxEEw3jtB-(D4Od zuU3QMFn!4;aJcSAov|GrxUK zv1E&XSncS&e|xVDbWW0_Ra}VI$XRaq`l__*fu^^%+OR-7YUg>05;Fb;l)Pf0)_AsC zc)J>#zB0i_0_!CBjHyYdI)cTR_=J3xWfek}t#(CJaWdI{YFr7<^IW;k(zax?3xPskj`(@tzs+kv8FV(Y`+vAJT^E?Qc0iqJU9iDFg_P46aHW2mz zdSy=p@jgwTP2N$;XW(ig+cPZXca!Z?dC%=c&HZdUeaIgJwBXTS%_Heq0S~`54-u>3 z$rJNL#QNG!zc-ImbS`-M+B|(iJQkk4FwX=?;n`#J>{)*K=;j)pePf;p*%zLDJ$dR_ zK(%C?{=F1L_;V)|FabpsGkK6k8 z-P6g|KsG(ArqndF`~n#G;GG&DkRuA}!xhCW82oOCwGL>T`p?O!CEldl_Q2r*5tSIq z(+l_=8VWpat3OpRj9hd{5A;_;2dI3O{(16lHU9JI!!uB%zQuoDpH1Ge0U+|&Er}=Q zyKD=-uF^lB{uSH!Ce%i(#uKdZJ^u5!vl^Ct;gt|1`ForNGvbkq)pAxqQo+pxwr|qU z*>X`eJ=wY^=WuV-=1mJb;c7TI9H##TyZJJ>xdydCttoHg-yC{J zfoGUb2lsC7p^;)5+9Cohd}oI#mfx=gL;53dauXN6XdZpP%ogFjYfeh>=^6YV81r8y zK@L71yju+&x~7i)dm>~&d8B1`s~+0@GINl`6^3S$cEzqzPuM1uay&v*DOc(LSp8Y2 zHx~31n&ryyqcJLll`AKpZ)mMzTs$bp<=&n^?0S-)mS?sdryjN-;!kS$XN9|>HG*gP zMHtRFZ`s)$C|)aAAI0R^0%6i~z`e*D3l7ruhJte$1VzE=m>Fw8 zn3Q%tt~8?l5?(CAjfR$~PAhmL0u@8IxY)po2X5~e>P$xu6eosg+o_JLqek10RJ`NP zW>#8XlEm=8a$6Z}XF%g^K7qemlm9(EK#SGj0GITChhrD-^EY{o5_<4?0IISNvcv;) zThJQbt@Jj@%=DAVH^)M^x?U78D4_ft0IyWp2M-<`r1eD4==6|uSHG>{*5v!4$y|Yo zio9sOw~ao$AXz1umb$l@F%p&S2hF$vB!`v>r$GqZk|CSxv_uWI0o*nA4fzFSTNfZ# z*>wO+@buFINocbLS`0rSyefiMHLd_&l?2wHKCR9s5@LYX!W@|!B(4LHx+oUFDFVO} zFTyMfzy!>>ut8S?%WAZR1)(u+9@OI+Mwm~E)A}r>RJ8?)_BMe4c!1s4X#smosf;XY z(4`)qX&nu zgvCS%#};sa2ZA0{97Dw;G^hdy5AVSj_=_+0;RjV66b}yGzu!L`e(_D#&PNxE3KopM zX6Fr{Bz)510UwT9(Ru>U4~~l?Dt(pR49b00F+CWLOSzV45=(?3E{8=$i;lLQja9>v z%jLPV?}&|grVKYEwM_EWIOm$(ROq!Ys>nVes+nSgb|ep_mC;$+k!A5>w%@`(!!#Gt zVwqc8^tW|Ufk<%sXUt*XD79F-&953s)$LG>TP)ZFWYPlneYVFGfGW)&ipx0$nG)@W zx88#XruEbIjL*hA&r$q=CP99fRtr$Ltl^RMuzfILLwf%n+8t_O?H@jPa44*d2M_Z1 z?{iu$AV6Uwv&Tup6IIKJHMp_$Yhn#BwSIwcO274hQ50R#9Oij;U0g6|)c{!?*|ToRRP@bO@;7c>fSct0dw_UEeJ!BR-X=1h4_^@26}M>>w9M zDW7xT2M6atTr6hmk5~JEdy9B_X72`LhIc4PD&?(|h=*qzX5cFt?{tx8b%eftkWtVe zsMhYCniv_u_iNcGz)W_pdzL+r#A(oTqEe8kl>A(9nL+V}4-SL2Gy4S}_H8UewM zwJ`_~o*Ef21ZZ1anGOk<$e^m605GMZIo_F^yi*Rzmv|%+R9ss&IT1@(Nkf6j%HYxy zJP2P&w#n#S>!6mF9$N?5*eZ1bkh($zFRV96F;vTqW}5{jL{oUSz!2EC!X%zifaH88 zt2^0ibY&w{?U@LWUwJJDkRJ`*#Z^|{`eY&YU+rAeg9)&abCd{; z-XMxIDQ}Mw1Az?*HICprNk3Na&aBW|D>}kZry(%14UvdqGp-m0w}FGV4hLq&a+*Qf ziY2S!BlW)7ZpB7wyvp@ zRXqmb(^3qT16A0=ffBbW=LWe0N>yvN%wH5&`J_;!ArFP?_wQeN?hy#94AkK3+_G(8 zf}Adj3FJ!@l^#|#%{IMWufSVdksRfKPXS>mzPSw+%|kTrE&y=rg$%YpZZmq!u~wvD zU@rn&0=cRe#GmydMYw1x{b{IrS-n+@`BJs47WAdbF#(!Q0aAA9yf`^;s>Kpeps@IA znkz9I?R9n2(wRY%gFrV!$3-&Yr%bLxo!j#GQT4Y_v4(%pWm9$f*P@+2Z%NfkIjR~V z=(v_@!Jrx*6-W*Zs!P*+H5{WOR*mWiyo1dj_c~(+Z_szDw!CnK>!q-dsoB(KHjSE1 zWzD9x{g(=LLV{j9_|J6Go|b3oTnh?>XHp+4g>Nt&9xZVum7d8GW6$ zd{#xx@}iuRwkbnn6m){^>q-vuQY(jR2HfH?ay-zhIU_A5CBO<;v^E(mEk;YKkgixe z1BkK`O(QUn!m1J;YrJ;u)zm9cf}kb7b1~|r6r6;wQ>k4A>D`pXIEC;29Cn+Zv z=BS=|khEFdx=MkPk1dn793ylRl!MKndJ?t`L0DDvh>(}%P+2DxM)>aM={c=nadnl? z3JV$iwJ{t@N(U|+`Ms7|4qNfK*jJ+IVEEu*Y>r(0HiFwg7r|qB);y9O6Jjp%0U)&4 zGvMVdP1DMx7B@|3`{r2LHgW89l+>yd3utr8QX4=?p^D>N=@|P&8fxZFVZ10Lv;{QO zx+3=mFgQS|fL@d&`wfbc9vWvZ$7(VrrBl(thOHlLRb zjp%9roT3;u_HCOMRSp=-s4AuBpPC?hWGUL{_nBH<47Rt^?Ju^6DX#(?&M~OL(A?`^ z37~)0W@N5}zvQSzC4lFs^8xf>dC8^LGH;_osh5``h2n?p>zafBW0#JG_)~$9PYHZchLH zx3jZ7EI0b%czd|F{rNV!eFc1=3%ssyjyD!i$xv)@xU;iW3eQJ$At^uy3Dm81U7=|N zYU80V-EP{}S3buha3hqR|Di5?^dAs9*i$gVSV%l`01aDrp?Q| zKK37(Tb@9VTZh9VDAHmoDk?SD)(9xyr@;fj<=)=7q62UTlbgMqP+4AMf{9#=46G;oL_$b$4B)E7C75hbdgsT!-JL0F{&g2ZjLTB1C1fcGi# z2@#rniZ02()bdd)es{?-=I9vx>qsU8nto%M3ku6FTR5^A9vio4h8;7hqXwxbwT%u} zIawM)(vmc2;2>&Cjz;G+>Dg5)mw_UnRHClIoK7>eT`?%JQP|e_#+geAqsF&{|-o8;r3v7&KXhd~|z0sCdbh|Od)=*lDCzq3RfKB|$hdKDMjIDto z0TpgPL7_J%=%CZK7062%*vJI+JfFN(el$-hfK*(u*Thfr6)wGw)}x0igHZ)b8kKQd zbUE1GGX?jyhubTc0qJui1kYR0!JcfRcZNBp5k7*zF%>xQq{9ad&~UBwfJvFwc<(oT zX#v5xJiEq{!?M%GVG&Gb7XgU$-PyBC_k+r#Z3Yru_d~(*l?4`!KV8SE%zD}Z4vvap zAg~htv=wJmvwpbE!X21-7QuNIe4Yi(^Tzf8khe5j?*=szIckW&ZN@j;SXnw`W9y`bs3xP9qpn)W0kn_XD_OKg#AM;F086t-s$?~l?y9YIk>#jKyTCF@>a*D zL^V7LulAg+_8eDx9$D?VTYK1Le@CR-Fw;PBA0OG~|ekwy59O_U8Qp$iK zT~syZ+l>ieIk}m>jSUBbe61VL-d^z=b=Yw1j3ifaj@r}WEJaOyb@Xhd9l##tI)H`k zDYP0tvcg$ZGE#fQ8{E^Gn4mCHq9Hn!TdkTj6(M^%rt+3j2FD>fi%R8V#y70z4l;@J zE2npgUL7{&L)U-JrPH1WSCLO11stwzU7MuX%V8>(^eb3W_)_8%H5VZqBWN-2mJia_ zoqYhF?cjM%)`T?p@}>Kdz57b~{vjMFwbbp?GS>MMWxtRRc$TN%+57Sd+U2up>#w2b z0W91iW#Dh}lVulIU58+{M3p0xw{Ba~Ih0ss>o{vxt}Gjx~E$h6zzjC0Mhu8b1RzaNd)97Npw8eCU&UXNvzea6{c^C=`e!1ll zaIg|n9V_ohPi-%ws83w$gwhKPxPyZm2$`ELqiB>K?;9Yre*KTI`Xy zEvYVbIj-A_+)#3vqBWTQC?0OZ#k z%#WJgct^4|#nUi*BhqC-G9wDLYNuSu z^XnIM79@vyn|t0)gW)lI3Zp#2qm6=}`&dDajt7jeQbdU%-GjpU7=kDe2aDCR9~`Vwo`cCo2@95P zjyR40fy9TNWy6HWqzHvNyo8ESNZ0M`v`#(@aI_-9lH(ykU!m7mYb^ zu(ygRMevo{<13RII7_ORwDFcycuRLQQUB|)rjBh?8PNs0wl1z7dIC>^Sc5KNas5X7aZeiB;1h`NNpD+TZZ+OD{| z5O6XxsquDp%=hEL#pv11axh2Gzyb6FMGWzT@qqimleQO9aH-0AbiW3cDWM53yC{io#%1ku7 zN6AG7yOziYYVuqjQGR0iRHnAHo{20qPIYmK%Xz4Wq@Kg$)mROV<~B(NY>-ZF8_Z`Z zz7CW3?}-JAmU+(0NfKy4<-Wlda+4g>%YVb(o0dhE%W%UoHxAYlU#VFqKaP1T8nqH@ zLc6RJD`TfgtT~w^fxMoN+>!pC66u6TDpT)ZU7396Gs?!Qa)!#f@S6RUsd@AOWFY`P zD5%2Yor6{t%3BT|0KUzi~DD>|^l zIbF+#`3-R6M%L8HZdHmP=z1lP5TAaQh&Cv%Oe05#S%WC0sFgZi&b;YDeCI*9VDg!M4>K(`H^{QuIXHoa|-O_+PY?mkgq8d5^(}MQL=ooHKFFCIh6ExWCA67H0EIt8GEHx(mj+_>r%B% z02!ZUHkKO|@CO2`;tmbo@h_+OLm9U8NhPl;B46KqF5f09sws4vJR}5|4TkoT=V(7xT28y(%m{~me;sD$>Dyko_~&8yp@egpbJZy?IfqdyE9IJd6kH4iU46))aerN`-^)9eH%*ti6ikddhJS*M)C|4 z!wg@t2uh+}36=0mmYKoE;gzBMU$Oul#Cat|J}_AXf$5d_T0&SA5@M}aOy&!dg~UUz zkW3&Z3)T502y$K_nNds@5(2YVNTwLu)l#xr5GWMSIYuqo*@!~rojhc6|CWT?oUmoJ z!wDF6iuvyK@~1?JsGQ_b={Jub{Rg7>*I)nUOVutk`$T1mWvfMbr=S-%-x&k3D&i$T z6GBrU?U(zU)_;e!Vx0;LeCuS+i6;%N;O#?mkh27Y`DDn3~^s zV`0?TJ(i98H0;UiRI?@T4dWmi3@6Y#!`Ns;OeL4BKriyZ61)f%={8Yo$(aKoK7d4l z%H84Es9o0ziv=Vr*Fuv8%kf+(8+HotPWl~;kDN1?7|)W84T^8+pc|Iztd;fOx@9KS4&XVj+RlvW=fBky`A}z0p^6wO*vs_ly zC4~;Zx_5o=&A;C(nr4|d_duS_iUkV5_wWD5q2>XSex*Pw3LuZwFX=0s@CXbh@d4o1ag6Kcw0GZFrS%b{DE zaA6F9uSrq6`cX|q!Y(hiS3`n+U?v59VM!b@;|K6qk2*<2d1rvCmg0dpHuX&KI0o-T zE+*Rul(*(U~f;r={FKGd`h&?HlR+av~Emcn(7@uB)^_Q~QQtCUImYi&YF6YT#yo4%&b8&o_w6Z4TqiA}1s3x17I*FGYxg|Q-GS=)gw z!d4Aec1vKTp{JVY$@Y)TnnUuu&a>Ap`7w}*%0f2+IV}P;&FBr>^wEN}`mP1><8l~S znFcj4ZwG$-2!Qk-0F1mLGu~HEze(^Q2ZWJE2?|P1X%gXAfE)BJVA-2Id8I8Ts==!q z(vIA;#bN>DE|Y1M*V9~f3X~{HHGIl^o7HMR3O}~lRTdL- z6uKy}O?f&Of{EG7EWpTq2YMUlBe3`FV~1DBcDSV=IdZmk0MmtBG1^$pYhcBBErA9= z*=>~}&6gG%6je`8g;sMWt!!JK8ADBl&5?rv3ib#@yyw|PRu>X%Y!H}d+rUgcUJtU4fg%_q zxS^F_4j;uyls+oYcZA{I%ikS3wc!w)<@q%gZ0KzYQX>8bs^Vt}GkyN{x-Q;iEomBG zB!5BcI>HcZCn8r!(Nrb9B@?LbleM3v$$1Kd3kz@}|Nf5gnEa+_lRT>zx74&a9t400 zpfy@V$%wI@8xTX?7Ck4ES9=Gqk~hsLd9@E;GLfA($Ik7=$ViGgKol7qCLsGGtntga zmOmpRd}cQH3fNoy!g_mdlq_d5%W_e?MvsN!s=)g|;W=d_+R&VJ~wg|-l6 zZ1j{J8<Ds_Vn|83qD?R3r>U~|Yo?bgP(BmPvI2ah!5XbEUX z#Fq{6Ea|gC+oP}>HmQ6KPp)7mEkw|JyEtzX%Dp-iRvw@rqAJ`&ixTh^RAbSY=y*nj zpJY#hl%_$jN9eqFu0?p75i@IAbCPsStr8)t_JeH?kdUE=A(K;&fn@OEIeP{TpD$b0 z_`YHidtoMlpCd_z2hg6&BH*Q*)6kw2Ge}y?#}tdu0#Y?gs7VG9YsKL&M~4TaUyZ&T z`alzP4T}+r47gd~_3IiWw`*8>EaK>}O%%Q~O?kwA?y2UK-5cn{Ax>rFwrmY2bjGfr zrT8OqM#YlEaJ5{?C2fn?*y#eY?=7RSssjV$p;C;^$Y3IWoDW@{*ridU%fJXxd-o)S zry$F~HWm`MgrG}Dcdrtr`l_iY{rCjUVrtaLgX9slV>HQ7gp#iS;bO`({{CIR7SF8~ z&v}buwlbwL{k`&01^CxInH3ioIR-4Y<|(a%HZjox(yU?e#9%Gs2AVfQf?}51R`{sK zdhQk+`W-O&jm9!mCW8}h$Po_+Xjbvx>Ege0i~r8+Y+wzBEbCa?dwR}!RzIvw72WfV3i7B(^S5ja@eF3?EU%h}9X4!R%vKjQFVZBF!EX{=4&h4h>W@!fbuurgIAl6~0ewA3Igl`z1Vb@r@tr7K zew~m|YF_@%y!@SdsarP2B&w{He|#@>f0e4(w#|w1r!wO?=*N;z(03=xhcojU^{&qc;+z`%a3> zvZB2dk2>h21L(w@mFQL^CSlJUj|_SXla&~eZ52$ECYYR`V*N8cU^VEifu0&yp+srv zrQ#`5j?K=oHW|$1-#Et71s%4e7LXLa2!Ekh7ifigl@d$Lvl*QL!ZTpd@DSEs9Hyv4 zBs4g^G7SUhrt?%dasw8in3N(qTvau$MAI%5LfA$x;P$qnElqCceBubc$X4OoH3@N- zWh)$@NGwe%el#{>g%S9Bdtc95Ayr_#4;Wv`-j5_g?Ps#gaeZ8R@VcE>53=ZxWet< z_?UJCJoAG7gPxi4L|++CNSLdsB>ER2Z<^f%HY9wf4&NrEr~vMW4vNN9KZV+7AO%{0 z(JzuC>$&YI+IZqWKpxkR+#npMDYfq~yOD5=Q;ZQ5=7J23!o|}3wk=rZxiMi)G0jDq zh=ds&6uQXEm&VtEiCw6vVBIlW;g>HhKMT<)3z?w{QcbHYdRbsk+Aycvz&jsIEA;U77HnU zUssFU3t)te%PD}!AA>+GyygeArvX3C5cO|e1j-}=3)VnoqbMVggUSTaBLiGOAd8*` zfsM$pDc6c<=4BT1F?qRA{%vdRikaN|_y7d|Ku_;tHnyKC0gHKED2TEyLP@c0@~8S*d@A>_UVM zcQGryBZqbm0Oz&FbAqkwtze^-d~H_|?Z@lL_gD$K3l!4}C1K)ms_^>G^X$5~xb3^T z2wLlwDIbSY2@hfrzGDnQ?1t{{Ctt`G_L4(e5fyiH?IQQ>B9t&!VVR9w)c$X*!Qweo z5KRP0Qez&Hs4lQf3^Zb-Jv*bq>w2R?vF=2ntr(%)8Cp|6@hakV9H}LCis6PZ8vg{j zR&L*(M3Fhb9}mt(`aWZbIz+a*leU{Y*1%wYpDikbg-j60N`}i>kQjC`Yngr4ow-Fc z#z-f)M*e!>ZfR=P7&^q=Tr9uI;2>lISQ}(8J$E3ATd+xU<3k9j6spHaHv@Y=B_VEa zFHNX7rzOK4#qxE{K+L~$0wE!iO(ZBvnmtC$>P!i7NQF-O;q@qnW3Pll>Ux>mFMV5B z@ZeVb2|&^?a!~t33tuG9a_uCQC6{%zyhhuJiSCE^A=NkS`=l-?TBNDnw*p?MUK;S}5i0ABMQAJ2an(29ZSu znuNA(V^jcX_V@kQF-#SR73bR4Xg$N6T5*XFh=Yqo!dah;D&t#zJm}&yDY+8Os$4h@sg+&BmypY^M-$2p+$o!W=;E$f*r1)}&eyZ| zT1HpzD|MdSByZ;=DMdGC9b6(yn(KUunMTA`H z(VIvrnEZx9fSyy=j>2`g=sqA>ew0T(tjaez235kjP_!UC^9{inr5R~{wguhBhZKpF ztK=kDUY$QOn5>6LTLq(^tObTmAzV#nK!9%E6m-V{bEo5IF+~aBk-EHq)G<{)lAIc3 z3n3}q!#d?_w9>rfL?!_MS!G!!vt_N~a|jWMoHEe4LWb^6UZ9tca+gmom(Xt6=E6bq zJf}uL(YUHmyaK_>7GRLLUHu`VHi$lay?&h&Ies-i07Ui4jwG@ga z>w@+r?B32<5F1bG{n2nq5qa{?ti_5Ni%b$45;MFk-oT7xm&@x)%`RK`cxu`bKm?$( zrJt&20gUD6bUbsTct5tVP)+IgdFyF{GgPf+QVdespzBrxa|+xqS3awQwXN zt8tZBZZ8&120{+tM?dxJ42tGC40qw3$f}sL^b)PS^6NTmcL-e5>^aI@##I^V0w}p za8eY8G@LM!!1_rm>8N|!O?2AcNiBY~kwPJfvEPT0Q(%=Ha%-3Mh~7Wh0_c8rE5dta zO;cQAEX}yqs4&n|ZEX}!(fiw1m$$5HLHCBmOtt2%ubGoYDeQ>a4A|`%+KqI#UL8_x z*mDNx2bW1e2oJW`>sdC!CL9g5njOVjym;_7haD&rI@rY$9g%@Vt{2%<#)I3G64!0} zVsdq4b=SxP`01mE%Z1q#4{VNULs|{-W6*%FmgGYotCdpOU^omZ&&;+RFlh_7P7n+h zx451dH~>Uvv9k!u6ruYr67=c{ql9WpOBRnWP{HUf>@x!3OsT@Bti{8#R@|`3+YWp* z6G2x)!Fix_5!lAt+6B)#(GzpU=+5_S3vZU!dHvFoO{M4CAl^ip$ZBj&b(8UG9xaGg zSSWTv=V5T;mN*k{T_KN$RUe2=NXTne3h#!WYo0N~ThCcZdUmKd-hmhX%h|H6u1K3x z@+NuOQ&{QzO;IiTA}GTLidpJmf&aAU+B+4ySKKMwW1U54g3g6@8ok@)C0Uwyg*L>k zXA45!CWBpmotJn=IAB8%KFn6YPuHv<5;|Wz#DhF{$%4-vncH82$7Pwpvu+v*mS0x`EP62&y+qHn8qJlkct8FhhkqrWD?3qksyXEvVrH zD+nJwEtXpI`?fBwvif%2$U}qaAuYtJ8fswc71`+3XXQP$pG3tsF1;CFQlwu>T`2Fq zDLxsX61p8|+bv=`ig&Orp9gdoMk#+;qquM(QDd+_&~>yKg8Dit?WG-iXw;=i+dc+j zNPpJRlLVuXj+36zObr`YOW~W6^^Zo&&!ho93vZgV z5nFaFD2LWGg-&&TA>dM#9VQ6TTfolJ*yMZ?9t9q5)W!LdjOo%(13J!Y87o}e(L&>6 zR%Vx7h`!q-i{c`0i!0Zr;S8}8i9gJw!*Jr*v;7@O|14Wh5P5jIlr(>wQW6{L3r9u} zR9Vtl4?2N$nuHl24PBSQdl~9`^awG+4m(+)WM6?HZooV&&u8pz9GQm6*1Lua$!kB| ze8?*lrFmI$wwA{In`YeZtDz)sLRb#_?n|ann6<{!D$p8)ksFqNnZE#%NY!1%`hzfl z8cimm@$Q2j7k5Peh&bY#^L}dbOz5xg-v<&^bm1ftSeN!2MnvZ(h&X}i>oONg882FR zSk?Jp=&Wt5)1KE)Ec>wp$biE)mA6Rb&z`*(%|n#!7K?lqop<;!m61fxt~6|V^(2qq zYy?diG6t^TMNe+|Ezt_l6fd76wq22Iv_!Jjeb6DJM~*V92>%(=3|$c|a11P8u;5zq zSwM`{T@Elsj2@@?_AFmy82QCKIXQ2t#j*_xxh3VCfqw(C=S$TB;{;vBRM)Jydel`- zjgM7RkAgxk3x$X{^emq~zPie11$r$r+_=sP@1h=={3Y+g_aiz0RoqcM6!DQ#=>j&1 z-s^LMeCqHDCvG@63MtX%LFYP&*`h$|R=FROKV|Hl+01OOcz6D*s?^SdZmsU>`TL|}M zY4vf|Zy@IyZ%PHvvjx0}2p?%jhDO4ncY#ZQDx1wZ;bagZ4ugO$;YuXqF0>wSc5BKI zBxsa9Y4)oCxu(*o=AWNzwV)NOtmgFb1biw0b|y@^uGq(h@iRgHOwjW4DF|9MWf0K! z6T?r~jcOg-9k&tPi@GqZg`z$#BE}A4G#z35sIzNfP^jwSvH%q;;q#eM*gTyrIhkkW z3@=xc1E4CXT(lZ#2yrAl*FlTgfd2m=|Kd1y8*;EJ=)}`>M*(t{m-AM*XPFl&APN8x zk19*$e5%@3<`?d3D#xQOGa7)a&VwU2zz&mJyc4VVA0A*;%{+x;{6u5lWtx*F`l$6{5(64g76YzovX3 zw`F#PfojD`))Y9P_OjD6+Ql`z&d!TPK|zIRC3TzR>!?=KAe1<%6q!U(%Y2Ob{~K5h z#5-*M9K%c6>D;=oPo(Ku$$rt@68~UhfOe%CGtEm44QCZ}E;5)bw_@XIc#b#a4D|C;qfkLr4}q_f{hW3W#5DIylIpC0;bXqH^M>n^INqPR!&EH7-MK$ zNp+hsLN#SpPgF~BOB8;>EOHew4*nlUR_To|gg<#2C4XIKjYN;uxT})ysPSwSssFH# zp9UoW4pbOlt{~7auV=z*T*mopW9<2dqm;fBqEXuymkpkWDTa1%Wjn-JR`}guN{5}6 z#-$C5gT^Hh)$=;(Lii1@>4>i3=s^{3qnp#C_HTBWqbj^1R>}IG24g-NPu5%+V9R3L zf(FV?&Be+)1$6+-f}cE(bCs^`>?g1je)MW}Qu8LOXIHtSWlOS)R^IV49tE|sHG+bh z&>`O)l997Ns51*~-^BjpsD!hlX^5fCPk6DJrPi#sK04T7#Z^O^ZgnG{f`BE=Wgny1 zdjDAT{4awxC*>^4EQqb6Tmgj73OV2uJu(|{IKdjT`O zXK4QqwbS z#DV9L8uH3I;{zauuv#aE^j#;g#t(qcQUcD_D|0_(2J6d`H5c>yZ0Q^71=@rvOq+f$ zKTQhwSXHyLQ6)zB(&I;M2eY=%h5)^_Kh~zulZgIhcMah;uBs@AP{60|ZRBTC{eT>-R+Kcw|^lz{bY8hA7yKEXSKoBW+El2$RlF$r_-vQvCDUh3X^YNWz%_4;+?wY zw!zCrQ+WP*#8<)i;E5{*^2W{+yjc+A3Qwx~O5QHEw;BZ0^J`!gB4QEV(n!dUS7*)c zw6?dZI^rG8tFam@RlgC`Rqed!8dQM+OpuuWk=GRlj#dM-B0L^&l;u2&!%L3FLP|A< zVE808l0Ys9{OI@AyInkLmp z`9Ad`Z4YV=sY~uH_YTj0y3sNoxy%*HvIz2=bjs6P%^ZU?5%bkiZ|OdSs=_bU8CIfS zN3PrHM`|Rn`FQqLHEBkr66Y}jWTc^W2h9=E$pD~>G2DY4%XgZpa$6bGo*&vR)GLX#Z;?4WxW^dR<$@*6mPac682l zh?s%YQlUcI;1=B!A__(fA+2Ce^8E{X9Y#v4NPJ7e)+pgiC~i}|EMI^Cb6qVkOY-3R zU|@d`yKI&sG3k31v-?3<7%0T$@b6XHo6ue&F0J4VU3LX{;N?tGpL_Q}bR(>&DE_(j z`a4IlkUW3^@LR#Ua?~QazeXxcder0)Y#@B!XTupNz{q>Z9~^jt|LEL$yI9g%>p&M_ z9)!-gI|k63m5GmLXpC3wg~U5$^%#b4tu=+(P?d&9sfie8V=)TaNFz@0L|Svg>CiH( z^h(&NmA7Z`Wni_bv`We}XhJE3!V(~@8K>WY7*W7gXy~lxZNflMV;rrUsUJW0>j!}RR|%NTZPFT;DLEP;uVL049Ttn z)h?9OW8YG68nt=T4(wXcB7b0bxwumi7_RrC|A6hP{fF$4%88&8!&Z^;YCDS)uOy=y! zo!nq|H{Jb$nNsYeAUuKet9_0 z$}(Rdt42^K6f>Cik14#l#EV+c2yP?Qvi;1goW$4bx}umdm_KD#=XphJOWv(Uik8Kl zd|7r#jCJ=^n!e@Jvt5ooHt#}Xh$uBuQ`0~Y+?9>Urgw`5I(y*t#x|YmGA>zoV+hfO zD|#cse)IhIFTZ{E=^JL6 z*V?#7fId}Cp1HDQc;7ZjTDxj<`Oyl+PlpXil)uW!2Rw}p~0?XB)e&7 zx&08w5$QxU-nQ9vPVEnNHH+GyWj-&D+SW;7Oc15z6xi)W`XwOia%TaPsGbk!!;Jj) zOgA87d|{s(tpX&zCH5?vefktW6)&Xl9H`>bwXE@Kf*g!U$5hQ0Jm8doZ}jE_Z56!& z!bc-#N^)@zB!|v6tH1fV*JE+NOqXf@U;qrO>>vQE;hLkE4GgVoSFa5pscW0785XX< zEEv055t3(ma$^4lZDo9x?XDWOR?69;)NJ)r}OxIvknz|++GS+F-c#0ebodlV-MVgNF=^L?7roF3y^gD4*{ z){n6JN5<+o%6{lrb-EoJ+0sNJnBzO=qNz1qC-N9$K#{0r8~W1BwN-DfY-WBT?H&45 z#cm79lTKL``Ylvc0D@-@QuOsP$04iraJ9k7{CHkY7nO6iq2bm)FdSPR3%nhklbeka zk*}vh7YS(3CcvheFD}%U7IGqspH*51FfvU2%geld=AZ#}F|^%I_@~>84L>}tzJe>1 zMyXyMbVg3|`v&544mR&<%>vNqhi5v2NPqy*SRAd0pE%`4_yK+pZ{F%5N*^>N3^qu= zmaMUHZ+<-k9{DbCZXV+@!5U!?)nF5MwA^aGcNNfKxldSQL|`#yrhCg1=MQEwvbzsqAsT+&S$nn+=o|8wXsS$S61`k1KFsmbMoD#` ztsjIE>e(6f%Bn3c3VGiHPb$i!I&bp&O&-Wp`GglHCu`@)I&W%TeDJzJm+E=e{Flrg zYg@etOVwMFRn%7@T_neXB$6ZjDj=I+Cr}yxL_Ih7sCfQp{=83I;KwZEIvQ{dt}4Ia$q?Q@RS(fKp{$PT=2vdzIt;gr^tQ z9IX=aLc~dVyV65@T0bqH6Zfl`XIeJ{-!?np;#=Nhwr2 zyB8&R!)qHw^&HLZv(AQ1sd(f1{s)2W87+cYl=EA*&|Yn`&jj&tgjq(eZMSoGT~Y<1 zl+P+8Vr2E@QY1!}uAgY`Ii!q*;_%U1ayo((XV1GKUTf{MVyt4(Y0Gh&>*E;4o9a8& z=!VXhNyqP2ypAkU4LY}$Q<;5GCmfD0_J`4vX3eYQRPVrNEG-Nr7Y4FMyRJtfs5~`E z6zdGY#m%G8?1X80SzlyR$*RutdG@9NG?&)}tscoVjVHlmp5G8<+scfnpZF_o0$F>C zugVxj_x*d;7L@hf|HF}7QGhxrtMc}$S~d(#ebVYcbzgw$5f8{hr#PK-qz15B5ZfD) z=93^*s*m2&8L@2OvfT4lpacv@1}TzQMmi;l2xF(DLvm^%zg#1%<*HP%^NA3zVW5c5TQd!`E7k!i*tICH9IxMT~KXcI1btB{`!%wXfQ&%>gA@ys|A`U71LWmTzbHtkd!~5yFT(B9C&hgbp*`#*w0~a0!O1@=L4U5ZwyND|1J)Y@!IBARLbEM} zl!t%lAe-7YwV8ccmh_jy(v-23z>auRr=N?2CRP3UncE_7OzyB=G-8t)F>Px%MKch+ z@u?d6mbUEy$VHs|ye-=EInfR9Yd*#ShF$aEioH5l$m=3ogdA|lJ(n)V$|d);Z9fPB zgN_?tiu)>CSCd7)K<2Nb=EYf*dvw5B!kv3$sKJ6J3J*3j^WX^uICHRJY9IRJ#Us=2 zXy&EtTd#L_G=J}2@^GF{Ut>Rjz*j|+hk&OH@W53TqJMzW3bd=Q2;?&2b-g(k_gW63*;+8mO?o1xRFxr1lO z)qrJ<>lcSW%1ElWBUm(hyzv5C%Ld(~c|WtmgkrC0n503B{lU3pFJ>5JrT-jU5=&UH zcg0Pwce^wnNbqLPdN#c3H7EaUREdghoxF@71oc~~vYjV8J}XC5c!@_u4HPWBI#9|VJk z=`}bv9P1*#pgS|Bu>f3+t`dV0vIuHP`lW0C2;e5BHh0y~Rb*r&{Jy`>ORU{fkY-`q zu;;dIW7@WD+qP}np6;h@+qP}nn6`V`$b4_|{YfQ%s*+Up*3Men>%Qx}j%%EJSBXSo zawy!;jWhvXot}F*?a)Tqew|xa^=}bedWGAAm<}Ge&PMw3X*)(U`tOomOr!{?>9PI1M(6BWRc=1v8Pd zD$%D+i;1)i*v=StA@Sl-9aqO9Key zhz$lEbysc<4E7(%v|127AcL1`O9Rq}=)~sasx)(?L2U|Hn~*J7j53UC&%kJhChygL z--Esf@AJI!0%AOe!nGKkXnY%Z(9_yZQ)N>f=$HfnKRO|G2>x8CiE5JFuMp?s?9Zwc zcv{;B$b1B+^qO%n#3njJZXj-^Td>eS1LRlvg`I2-l*~95K=fLuA~9?z&9ba^*8sFM z1#V0on3%7@jRjHGKBRidKr2Q?8gZiEG<88i-}GsL)*AKh4$;;^uRNhdAz&IxtR3)|!__P?+W7$O9&t zax8eU8QdYIWywgGsamc&tWmOt^39^xdb-Dhev?)i5GTJi(Kt#$jH6X?F-WlYJu}eF zmNthpkc!I-m~%R9!HXEn!ikLjX`AZAfz~)nzskjHMvK0G&;N?n#3Hxn564E!>V+uA z&UomXz(6OnhG;cNyaLdnffOI7k17e?6^;UPcDiAxyoq$pmpf_4CUDv2z#MWefqUS( zvDY1%Y;6?q;1nKk(?OeVwo~zGm2qK0C6eP)5TNt6H@mjCJE3G^8M>d!Y6g~4+B-uS$`vky=B1LGyrtm z<2lE_j5P^1(r&@bR^qZyTghT9YI%`1$Mx{?FTh>c*@i2)QOXbGC;n2*C~>PXA;R!p zXZ;D3k~5r>Kmvd9K9yEJHO|oH*!8dDtuyImRuq#0vU*W+On^v%7FmIB=~fDvuAHX| zx}Z5AwM>`%m_Aar^P?Ut&$m0WH9x|7q+pGAY~?6`shQx;M_-E%HM%JxOK)oyIhWR& z3AyrsUlb+^-n>@XT0VONW`0U!%S*-a%g$1V>1S32;+f_j=x6JPKlk=y*6WX#367re z!X|3FfInfaVE1fwB-)*R+>{jBC4jmW+-fhBVTQ>jL62I^_NZFe z@($;6hwVnxw^ZX!?9Dt=kJXiDjb6pnwF)9zz!G(u2<#S$s;sRuvez$#+8uW&1G;L} zFI*kVg|z4IBzc<6ky@q8JZ;qRq8Vie>A-|9Y6E}6B6F~@WkN`S%JiZK)t6)-m0?nq z6Xgxw;nFJcO%U5uGT9*$y6fO$JXgG(x8XfJgNcRTJ_BcI#O}KB1L=I%(HIR!%D0jU zq1*7>n--EQFE!O}22}ZyCTFB!`vH8IE@Q2o1a&JK2NSC7$ol$qyvR z+*!#Db_OaXza?+ZFqMY)fcSL>V|dbhLGENt+8|5W-|TS;1TR6+{x)gn}@h) z%gWv-wtGoem$Z~Tdoy?E*Ocp)5aJH$JZWJ#d=)*8sr(#lwV>RY2K*jTC-lbKIheV* zS#@rENpIWpR_jaCzTLw?^_e5r_RfbNQ07pc2dzmbb|}uG(B?*k66=d?Zp>h>geIrX zhteSLv4~-~k!cwlcet^cHQr!|dgLdckNXu=V(Zj-qv|R{i7jdWgPs5fwjnL2RFBLm?VF z7l?4M?a|C7i~QvPH&;8%H4(`4mCy84?T*^H+S>tMFj8uL5*i=Qb0UhnQKJJhFnChP z;|9cUW%rHKZrBB@{c>Jp@-k3M@%N7?kx#Mc3n9AkivWu8m*@u%h}ILrkpSv67S?K| zh;K8deW#UHKSy1A9*xAmKOcmrhXTmO1K6D*axo3+g#%easWM?ByJ7*it= zs$YeV%>gVrmd{IHe>ctkeQd?~1&aYPcf%;%XmQWBv!rJ>U+>VAqZd@l@6yzoIl$3O zQf&SeCqe&Lo!VyF63b-+VFAfG5e*TI4IZ(t7I6m&HjWgPzGX zS^v&?;E?jZd67QF!oNq*ZVwVD6?a%(C?C`&JE))SG6xx_Wzz15;DVW0z2E{ahz3R$ z*fMsO83!&=Q_W5Vy;KJR++f={k9|cYN)P~{Kz@QiJ>0t5O5NBMHklHV(_&|793hN2 zuT=HoOn18_{@BEC!kTI{3$DW>?)lA|mT!Ut5oe!-S7M6Qe!5Y!p4RnT2kE5XemUFN zT9WhVx3FjNzxJ@X+nC*l4LQNY095zMg{f}hnuRH2Bb6S|_T9})jV1{!S(1=*`cKsU zNSHJ|0|t9DMJfD^QjOn|OI2$d5ImZuLJc?x9@xq;p>)ajqOh0mfmJs9LD#m|lBHSQnPK>lj{3ye?quxFwRh_dIW4G zR9qex-*>R@carfe1AN!|iwyFQD|&T=b6Bvic}xw+VAiX0tNz%+Hl0|X@vJwpsP<=l zk`JM;Fw7_Y%88pn2W<(y`}RNcGsBQf`4B75zD^H5AkKvO(_T)0FtDx*9{6tHFZs31 zLaJ#d`O@b7c2agZa_`g-eN`A{y@nmboawLfk6(6m0|=@Ww9gg;P#)z9mr&2;Oy7vu zqM*u3eE~I$HplVDSgAaTB~vB0!`DH-w5+&zbSMqrP68f{dYJ0^923&&Pyb*}A)d*9 z9Q&$`#~HMP!E_tmPmT*j>_|hJc;ktc)*dLOYC^z!tb@xw86(1hHE2*mL2Jb$^OJ9AoL#? zp>O!x#_#N^PmZ5`dL5 zx*I?rjoSmcj3@8i;Pr>A^^ZF@uMGT2Ix_Sn-njK?bB*|VnN<|+E;WmnvRLqvSoIf+ zyCT+Bnp76qf*2vo5E@8I&9b;n?NO$G_d?d|`v40{2Hq2mJxsKeX|H@5-PT1Fo=brh z@!V<<2`BR%4MGI+4&zxV(is*$9)uTBiU*_4!{nqn8X7V(tG~das{3INRM=mWHshS* zJAH8j4%EX;Yf#wP)f0V%lD0I`YUT>X>D^}D(8cNSDnx07Hb5YlV#nnq@hE z@yCa-w;InJTG#3mXgvBy4z<3WtJfNr!jr^w0@_#GfXYa`xHt94FU8;d@{e|6_!Rtp z@#yy^n~1M)eutpM#$3)o#A%d#8S#n-@}ze}W9QmYzZW*Ucy~ z@rb@`p}vS7jtJOxu_X_2JAUa*xMb^TFXGL`F09O)yxX@k`k859t>f>&mKmL01g!3K zfQz=&brjSmjI3uTl1WG*G2_;W686o)+YZ5L)e4`XJVeA^9TOUoeEaDQNLnbFk@W)m zu<^X?1xitLXM#bw#ARStAF3A&Hz8%E7PVora;`V^$3Zw`hOE8WWrm8UlWTbSWz3~t zwTd@Oq8fBsyaMqJIQRDjc@zNeTcz`Wok|P%2dgD?8xvxhWYJmC-h}h0rWp?@A{+== zD%>Q8^{Aip?o;fjZqLG^kAw9%MC6-(s$99?ZOO?<)wUu9UlPfu`bv?6oJ?8cx`K%K7&h-B6 z`{w2AuXUX1d9|Q|!*ck8 zSY@z_=JqAym|UR)yugHbf&Ac?QIW$vuDP{uOFG-^Zy(8;;&}$My+27ar=dEdEO9!| zD$%*XLKk|2GeA=eO%{J`3VEl-A^jUYbzMetBjY6{(1C{)Kr993j@ov8^rkw9xPf4k zVINR*&?ZV&zL2Kz(Q7F2797{?Oa8=-W-K`|T#_74w!r?KERR&ZXLap6TSLMGD<>&1 zHW9;{$((Mux}Cb@rI*5(3l`@0G09Ye7G9q6dCv<;PW+%dnv_#a{Z{rHt$1uX76CCe z&Bf)u^S8{FM3e%l*&-DY!iMsn915Yh@1=?-0jIBB7P^zo#^evDffb8yadhP<%P;26 zNI1}I;6V@9F@=50S)TAkeuhU5n@l7hSs?ST*)9-F5N{2HaQpRfoB`w)5m}VMNp`U# zt&aAU-6*w+W9(yFRq;<+#(k1b)kw5@K{reptd^9%mUD~KyYnaoa}gd1LJ^61oJDNb ziG6d&x|aH`qA+@|HPlnREUV$nL8HG-QY8seC4JeSs4TsPstcuyL2lYD1s8EjHUy^~ z>qrd^LP1-P*Ygp_5!#lL6oGna$KHh2d7_9Lf=v2ljjvk?wN`c__s-v`>}$%T^CuqF2w|Ev{b4g|L!R5fXmC=NeuWz3Ko-aL0>n<=2s7q zk_Tp0E-SFN_#Xj{4O)w4L|Tn%@lhE@Pu~UC`T~tPGMF(_v+51)XoL;vRBepp76E|* zF*cRwx6#+C-69f<=H;9HUsH?cz6^D8ha1n#27cR29s&l==0eA9ZSUmmHB1UH=~&%?y@h1ou(; zm?#^IC^v;z-i6moC3iNNS8!2E!(C0xrpiiuzAoY>8r(w4YAq95xkna^Ea5Q?rqR*QFbT#Su%y>V2c>+IW{B!o- zuf9LuP~R`NFM^-ew<{b)RO3S=NQ1x)x5Wvdub&qh28#x-oB;uDKWQ(BKYIsX2A?p! zgx?q6exClXRYRb!J`_E5Z?swLRRuDlU$xGcyIp_}iZ?9%4TQaOInw{Q=5=XglISn? z!}gxcy61Ef^fIb;VsT6!wj-neeo1`5jO&ywMvY`vd!zKcQk6M$>iR&Yr6J~W?EYu z9CQWIyrS%{Z|+PW%g}TyIY0nfQ5E1mY##9L(B zgzgQltY<@pitpnpl)@L_de;`B)|37A&CFRy9({!L@madB&-gq&f1=g9x}ufOV$m!P z7+)S0loBrQzh6bw9dFK9wqA#KRgGOivuWlXlzkBL(atGR+e9!* z|Hp7Wa?j~k*=sM!h3vrXO<)!-1sj=$rIYSv{@q=?0i1w+^5049io3vqYw$!ck4 zr6Xp>Jyx^(XHLqKBPRU6ht1hk|G&fLrRVM|yteUj2Xf)lNa8gtCWwjbok=rVXilJ;UF7ty_mYG&liUsd)(3h`yffztD~=dY z2R)WRpB~M4%z{py4m{x{D<|rjh!{H@Q?ge&?J#Iw7L(CW7H9Ef$;j>tV5p!`XwwR^ z+qZlWJMZ@V@#ppgt=n^)eKNPO;O2}dJN=|;?q#dD1|0(VbR@i&s*8TPg#@qPH_{$z z!|Ah%_u!#IgWtQkO^9HOJA8VE%jhT+f2W#%vUUzcMXx0Q)Pyu6b%WNIVeCyBQLi4m z7yh~|(Eup>rLfhJ1Gb2r%4x2W*GEr^d3#W{LN9=D!X?hh78Vqp6VRmw;02X#-OM(N zQ^;+gPhirw?)R-76x=G)N`T9amu50Z7Y>xVa3+m;c;L|%}Yn~uq_ASy36dELNKA~^#Ztw@v9Z?3%6M*jE10DFIpM45EZk?h< zw7o{G#P1HYy=)4ek|Ju4g#C{FJP5B#l9nR0^tP#jk0~i~&rPE|Jv0!krokwUw}1(6 zt7LESbyWQg6zC?(JNC$t$E^E_y!s##97ZK5AMPndpGI1O>mxtzEs&$TW|{JRtK z_V;nq5Ar1bju-VmgLzKBPV;)KGS}DbQJvGbPhb$Adn7W1I13PWh$!3Y`>LsIgg@pA z)ZaiA3RYOM0C*(R<9Y(dli_9F92@w=NHFylLBCSwfvNLK0&=@`;(mPpo!!et_6`N==E!f?fsnkeQio9= z^;*FVG|uxBexmJsQLRbTkDymy34Xk`wcw|E@1&uUKKW*Yu?3}+t+{COd%ny;vKXy4 zY`G|Impu`dwu**QQs1PPofFSCjcSY8y`>m5RW&uDa((Gne-JCw!-PE95T!^6N^6s9 zD_f|RDjTp=ekk(MQ!1*s65$6E|x!rK~i9$K@mt9-091*)p zw%Dah13g(jme%Rvt&u>mdmBa<2QM@OzrUffw}+P*G9~sHn#4SBGXd5<-Vi^Kqn~L~ zze5rrZ`DO2YAcFP+Or(@Dh;JCe_{r)B{#0 z(!lw`%sZI(EMujOP9~u(;k7xiFcBx6I@&0Zx^j=pPBQG`DkA8hE&w>+S_ie3ar;{S z$l)vqZ_qqklrt)8R9so}E=hHxKbNBG;BO~lW&>i{ z%dT`Pw)64F198mAk~Ibx4CWtnpDeO2Or`8?sfSyg<%Z`DKe0}|_y^!NZEtEUi8v#Q za5{nkAl(!Z{GO4UypV9;B2HXmg0zJ@jFE^0>8nDm$4yLgE}|}$D0imO*yq;=iM4C| z>Gi}t0f^TKZ1vBGguI+++y?_8pI<(#5&3qC)~wH*R-T2{Tn!K$t^RV=z@@7UhQd!e zh*(;)(SI1{nl2B6g-F&~b5d6?4Abr5ogKK%WncQnUl4#l?r*=)>iw##8w;O8nAw|9 znpMw=a+6m<_$iIiVbltMz|r94jp5?>UK;p3o~v5-mGk6q?sY(n6luzJPv0&BEhni7 zv!Sm_58eFLdL|S$p)$Fvn)>F*eNv4P2G~#Sbn0q=VY;(U_O?U|+!Z^!XGY@z*`0gm;nscJ@86=XM+gwvLT%s(rX0tugTBp4$m`suw$`z2l#8Mm5-Ev z5#SU~_iM23Qk^Ndg?9fpZ5`bR4dwLTv~{VG#3?cRA&wP=C^P?|btck%H^ueGOBzkS zv;f?13C~jG-`-ldAwUNei9#&%t?g=9Nq|Iw6)xa^r)MsG8jv3C_ba_xH&KSEn0eYY#;Z4N=(XeX6!Ed#nzyvExxHqKil=VPp#|#?B$md+zR*Ows}L>{9z&; zqx4lxy{{>n2y32Hkw`9eqOgLq?x6Fyp5U{&0?sRvHZy!#1{XBTN7FRuekL!_W!`G{ZKalXSg-` z|G=&9EcyN);ntO(k+e*M#5Q5${IZxkOB^~^>-?WgPBmQhco>JXOzCt|Rec#X))&6? z2|};UPr`1S`26vO+u;|a(l>$1OPO?!m?LWZRA^R`TLE9+UoN+_utsd)beu=I{E?wV%9Zk~M(Z7L^=ux_Q1vF4Nr%pu z+Q)~R$dzKF47W1jvTJZxvJ7G$P6tWCecx?cdLucJ;j2(+JD+&glD+6g2TLzJv*KKB zBcfGpGUkSspBuDLTc%~0)mvJF8+0Y4hL9Bd6dS9wZ&()gT!!djl?_H4UW+d=VAZqA@O%vE)Cwo zOQ~YjR{M$iJy^DLS_m5CAGy3uCF{5;{v=${TFZ@ zUOXMco3j9ep`r0sUH^N*0C%XM*mZv}k%!pev>rVn#*Zu$Asi85)Z2jm|0G-kc?ZrL z&jqGASZ1m>7PMOlZ*h!Gwnmwh0gBb}H3hSDQa6F5Vbt(WrN`DO78O}MV2U)_<}v0K zFQd0{`}cuLU?9Yz=B{X?M(fAU(aesb6`2741zbDE*G05&D*<kqIQQc@HWe?%&RUK%51-2QKh;YumN6{|2r@ zBK|kvdKd6N0j_lozQE=MY*?5z1`W6q%24`UmfwK%NiCm%{~Ne|lxt3$QW5#=(T28D zdNqJ={ps!Dc*WsM74+)VH(l~|ymfsV*}dNr2!QPO3wUp9>ifFB+BNI^YU}gs9g?AX z$$3G8J$$+i;NjUCaxP+sZ;SBR${Tu$k?LQm5!_pJab*xA6KNPZn4MLp!qbI$)el5K zDc8B|6kdW_9%V6b7Ta6>?)Z}lW=nvTVq_uFl|4aWF+X;^Bkhv`ZKu+UhrsX<^(h}! zt&g^}X5!W1jC7YsRWBSAsdZ_5ZCLI(`iyQ_$$^vA_R>4C`BpwVspS?nNe&0bx)*W} zPF=Rdh{BzY<7!JuWI%qeFY+#hCq;t~9C$?_H_>^t|HeY$V`Fv#42 z{!`=q!kCZMI~T4yyOX*I4p91ep~~VA1Qh;KM$JIPUhE3zhwZaOC?{xF>26~mPdvPl zckgqzQ)tPQe>Q&f9%GP)f8n^G#>Z*mSrE+t?@H(Sed6G&FU zl!IFCGdtvQJqk{=D;`$2<3Jhr;sEm|o-Vbt&i*+wH;bd0x4i?}j$rf_E(d=Y*o)85 z00iQ{w;vBQS`la#^R{}wO$xKW^zaSD(X|E-99)x1e7U_T!map)INMG{CVNP`Dwj{6jj z=|o64bLoe8^ILUgGc;0Z-wt4|au(y=NZ@QugFrQa4J;m({!^ic(7G(4ZU zwG#*`W7kk0A&TeXka#unL-;ntZ{b{INqoVAOsF0Ar6Le< z@(;8xfdR}l8c?Ba7)aSX$~LrIv_UF(7z4fv$bpi3IecBN0_D7$=0po_0%)`hboG{> z=iKsUt4j!uj;e5=K`D1-HJnA6e~0YcIaa2dpk|x)A89Rf=j;f9ys*pu(oYg67KKA? zn}25G(#S;ER__2A6mo^Ear(JpP%+Hb^})nbo&}ZFO)34PlQn4#r1Jhs(FNVix@1klI;{WSLvVuaNh};M#*$jMe#}@~ zL*W_XvkAq#2*2VRs#lGKSc)>-qVXa_(TDN!u6;h5+=x6Ka=qcr zeAvQF;(?iBX0+kc{~G4I0GC@^p{sN~x5R|UsTyw?(Ng_@`iRih)l}=~Uiv#lgQ;Ha z?C4b%v|BoGQWGy1W$lTkf6b+H%~ku%+qmh{v6-QLUDDLN!8oG}cBXA7KZqWkDH*m( zq_!~M$gpH}+PL=Smb)<+Z{moK>F|sgR(-E_qu)nE!FBuCp%$pOPnD2|4?hVBNu+;u zTlO$|QPA5!T>^)-D5hp2J(&)a3dlO&T6bjpHPv~4b&cMq6aharE9s1$T*yZ^tGv9d zAu*@E34BGq_L6L;P_Xhk+WF6CG8{#Aa8$4`4jz<@3O`e|Z?XQ>5pi|SxMiU{xz8zT zp;X~J{TlvvTZr7r|Kv#?SbwP0SGGAzri{nqCs#);`!`euvr=XhA;x_;}lz1>3g7*QoEhD+E)M zl7@uKIpKD7-#2yH*SjHp3G{E9k@{M+37&P;W~VT#1rL~M-$bioNfvMZ`XE&_Wo;91 z-Z`zVPGFTgx0R)l6bqIRDF|0MlPr1&kMl@}9>{C9d8F4q`^Si>KILazWtPjdD{kR{ z3f?XC7py;8k8I&`MhU}aQf?JfPCL1$;Ym|yHC%eh)5Q);&FzO4*q$JfawsO48v%k_ zI59b+A-scs7ZBU_#DnR4jwl?009Kc;92Ky!56+98Q(EX=J|eEQzH-BUVirMC zGPBg-w3YY>qPgMPkzLy*EX4&2y!f=Zn5b&)8JL(g#V^4$TEV5#A>Jin>5x`ENz#Sj z%l+{<>yCWf(0XZs;ou)XHm7uDSMT0VG_wqvzPY_VxOPO(GX6xrBF2===6gQ4;1{>x zb>MCj3P1?(ddxLKZu6%cTxjSQGja79S_rtT(1{4O%x|8MVJ!u`(AHW*>Cqc)2y-Y0 zw%w~)xNQrjM-)H?6Zzn?Fj>f;Hol$sD;|mhRl??_aFe!Grdle@ui35?bLk)#V?0Q8 zhVmn99Yi~6CCx<()UT6iy!^lTa=<4FdMEfC$_DPz`NEV44i>}*=KMUdh7LXZp=iXC zu@?C#vlECTL7eI};d{db_8iDHJDgWiI=P$mYoo73bRxtT?>w^6>H@p?3rkX2oh!oc zwwBB!ap0fkRlFOs5KztY|9%H2?FfBB)CRV7sUSUGyYbvi!p{V=Sse75^1b*mPm{X6Fy; zroH7q2k)b;N*d1bQnwGU7KS_`ohL$_wb-32ru~Ti0{)M3z4pH<*C*FZ|GRQ+jPf7l zdL!h2u3Sr@{9lx7?Gvoy!G^i$2wz|F8*ut7n`>daH^92)KbFFM-5jfm5UG~aBOKw! zLb1N*nOtE{YXg&n^yZI(uVcNmS0)NB8LeigRWc_Cm~)6%Dm*H99EehjJrQ-My@dt; zy-{EhI+r9KL(pFlx(`IQmIb55_&Cr{VEqJDlRCmcU3e1)FZKp@cE?G^#))?L;a?&O zUH_)MnW)=C9flt4^|F*?exMBHfR8Fi7WB(y9FQiBImvEnq!FuN|66q^#k&#}Rb#N><(_F%BMQ z;a|ZUKv}ut*OH3naF6-cpi(((7w!s~AQ7I`kxQU@m3@58ltC?|{wA^SCc!wI$CFGUN>2$h6uwL0Zhovv`59%*u}x&OlGkQG3xq5d zbV3cdQh^ESMqf}AfX9~0Ky@nvG2~xISHS{PumJe1EyjEW2y|m}cVugo84Qv^K38C{ z$d|obeEoSDg9hrtRc|fHza!PvMRF(a$K=l%4=9pHq?kQKCxkX| zGjwKs=#wzOGEp=}Kp37K2xsmos zU^q$@$n`1Prqz#&|0GQJ%U@r*?M@l|z?ac=%gq4cfo?W<9j)7ZyVb-L`8m^`EZHQ% z#U60z_0XlGc8(kDe%KVbaOn*LTJ>T*r z793Z!B8I(*8Aux)=Mjw`J>7`8Qbk_=8TlTp*qvkyqxwn^ZS zt zkdE2>1Df*lkAwq9IATd{$#f1``PItpuK+N1FKQ3r%2srTH4cs#$Ga9)&^$)7&V>h< zO!Pe!9ZT{zG<8L?KGJZtpFSSKgt4Bq=dw=O9H%Bx`2ClGeHfF{J7Tgg&yJaFVhPmc zubj5iaQ0=hKl(oe>{=F0hIL2SWm2hoB11adeBLAyCM8j0l&)A&mdDl}`}mt39s~XF zB2C)H1vRp7^}i=Q=K4K;&<^5DQ-|&8a^FWl$7=m8l4U`}kXBIY00FNih=*lR^ zKDMlAG`6@C!Nn4g1(l(5#1XXE5`#Z?XRFL$*Ru;s^OYw7WaZfBiQWAycBXR8?Sd&Q zTj8#Sv>k!isq=z9T|@_WbdEf>(B9>V6AP5!t-@oG)!rZ)jK?75X;domqPM_hAdn-*Qo6xb#*kEv-K#0*}mrXRKVbwGo`LQ@58aG3jQ zPH=iy;M~9qWqk)!KkcpAF=>m0`prs-t`wV2(B@A*)q$)s*=qDvEQ~q*rQ>$m6_tv* zF_T6DW!m~cTLPDnFK5o_yM^uhLq$F@h_HNV<0N#0k|p6HAJOZJ-(eK{g2*O~URy$D zmaKz{M&(&eBds%$4fXU-BM%hGL^=S9@t-uc`8C$5is4yWjXJu5TJubIJ<~|Lq z6uv?<&B&%tbs=QGvG7xYeZN701KjYe^zbVDehU;(PH8!v72GbmK+bGOa1YiR{U&(^ zBpDGbSocV^Ynq;sf@g)c9cmD{5?XK!t|Y%E4Rc0Zk`=BHL?0PX7b+s%V3|dnZ^dV3 zCs5PkdTl!tuaCa17jm8NXN=^};?zMwpIRWnq-4W_w1Z$VhoXuHQW#@+5oq~BI^ze^ERp}uGUv+?CGwt z<$q-Rz&hi*+OWjF)AcD~e@)o@R-yE0*6>kWve5pV!R@JJ_pJuBCETXc07j3}yCN2{ zRa6t5SyN>6p}5oo$+r4^bl@oa0e?_eMe7fRFh`9U$HP|NCE8C23?2YPs!FYavfN>g zPUnc#2lAd`b3l*{Q`Hl(-HHVHzOE%p@*x8{RpcSRj`dVIu_66>NtgW0JYPwM4B5VI z588O^`pszb03@OEmwj!NnlenDVej8Kwk^+5lv_%|Au&rm43xj!d z=1q*WgKs15FM=5jUYMv!{EWK3{upkWO*?>0=Bg7v_~Rx+^{}nPo}iVlf7%w;n4`)j z`-U?wxxstY3IH$Xj`;&QzZi=L0HC;s<-U6={s>KK_3Cp0s^s$$HY!-j63;H^5VrDP z#Y0QB{l<}!>5#3Kmz?9JNdq9GwX3NXR|*+;R@hvK@T&1tjM&d;xdUp(#|3_c;h+Ee zb?j9EpC7oJ)_@YTYN)!*JkZm_aQje&oGD}uWMbb8Ts6JDNwBYNa>if-FDfm*Ar5xW zx9hj|A5HoYT2;%ZLN?s8)ZP@OQllqxGN~KS2ozi}HEO+i?Ts>$8{c1&fXpa^2R@OM}6I}R435;1_uHSH! z+8@Mc!uf6;eKZzi7l1gEn_IH#@~J!Ef_yu|4@L<0)ySg7?%2!U4wF20rcO?_6_N?* z59}h7woQZakiJa7)puY;7s?~2R?r`N3g)y?yml?d{HmW*!Y_#+3?Fq+5#Bm2`Sqte zBVY9jQwMyE_#+a2pa*E}G?lgBOsrZAyrfO-i<>u1POzAN9cTK}$FGN5d()*J+MQ4^ zw)P=dl$-k+Y-FY2S8%z4#9FL*GTP-uebM+zK~p>w!=HA$)EjgBVm$`SHE$9Eg&T{LD>@XaV(jtSoggs177p)27-nWS?B$Ue zN`Oqc)z&hTja`FUD~UET*iFDn9cQ1jRBttG@&1bly+Jxi2lD`aaAo1>s`Fx*%d{94 z$K6N@#Dx#AL|-bprqz_dT{@1=Ol(JE7vb0rVe)&63#9p4-#TJ6kx^c!oknS#asHR# zX2;+5zti%AIieuY(i6|kP2b!y(zEy?FK!$SMl$GFM+wVr(xS-HQU6};j%*jXNOr=q z%+&0g;RH1?#X`H-8N6J_VAwAcA&vEk{{spn4o+J>^4$9uY(jvkV|fplYrvH*lNdq_ zHX993`i^4!U65nJ!#Xqw`AuQ9x&jo>=|mHV6)3ki(ADv`%DOeDpn%rUrR@A8 zm)+p?R^=_ZubaFC<1T%6m7V5Ia6uEMbSRWH``23}%caE)bdQ7dBDt0WDqr1xT$6`? zf2rMv*x^FeDaOBWd?zHz{FpdL`0BelttjRb$oAa zoOg%gT0e4Y*E8tJIpaQck+-4wjD&V%VN^7n;-*al-_aUf+LipVzXN@?9yi6z31nbW zw(vo2zte_(?>LcEvb?)E6=l`GSL+HSZRV4;S!X8?hCVTwF3XAbNK(oQ(!V{C=IR@M z&_3~rveIJs2-3JCv(*=DuF07WUBx12)=b)}%c3^FpKlTDLhJ4i-;oY@_QU72jQF9K zsG>W53)O|9^8lF3yr#%00zyB@^XPS)nnYq_^N!C&zLt4Le6H{<{9-A7H-a)^jswlF z=B^!xp#^OUM6q=7&jOd$ob%F1k4aZ3`zdh{sKpHr>%s=VKJlvN=cc*U(28(Ekt29u zKTkM@ovdj^S19J8#8C^P zH5dSSe(zm%eqh$rjqxemW@LOq4PE*1gr7i9nji_7qQ|XU`Vlgs*IlW*d-i?k=nfQD^7fXF;Wfk%{`!ewNmq4JD{)%R5u7 zul$Soei>(#wNT}QXkA~8JMi%6Bhh@()5(fq7h79M_y$?a2U7nfuOSaHwkVr#_#_8- zTa?MWP+g(vCtXCn z-{^x~3GdrpQI?l)URe?y>LRvie=t zOM6`1sz~0B1^Fv9l56D2D^KrJQ&CejxpM}m6t|0Q7t8x4U0$h$3F-E;A~jusSGpO+ z*X|h6sx2Yr^dhF8@CZjk5PE{v2Czgl3NST~+?`8?AbLhdK^KDPYfjyP@+AO{%Xzq= zNQn23ibJS^|F~s5{NdA%zv~F=k6^o6O5XD8pr|RQWI$PB+fsS&R-B@$nK}3r+%q39 zTmG7v*Gyr~8yojgUV-WV3HZour`YeJfS)FF;g(8ZAejmr22`z?1@tzv?J+U8EEo}; zGI&#g9SMZ}5BXq`-WE}jMktrYWTc;*m?`fqparIkesiRF>IFvAmP4V)`m5Fs|E6~| zhtlbmz=_ZDlj(ckwN6Jklb|BP0(PPLn!v{@U(TjI<4_pkVlx3$ zl+(av&^;{AnSQU?z=8AS-~kbWkaL`#BZ*e&L>xs^I0RE*WAF#gm|Bd8~%JjmJ@I{P}(z&E}_M`@(LQCsZsRro|MB-^NAwvhk=4R5$hq31^ z52=yqeo6;U@9J}pDGrBS2We?a1*T25pcr-ZiSoWL zZz^1IX)K9H#HDa1NHdakCjTO$@aA z{*G(v=_xoDK>eDdxVCa<=U1ZgH8Aef2O^_C;%zohcftJK8KjMc>k}RD5ByI~dKkpb z;X@VK$K=J2&gnL)N}7l%C|O^=yjOlI6PjNv-gJTm3~o*>sjm=R-at2$4lP^Ri%s|g zgK(dB^J*i`lDs<38kv<=7i@VCZR=1G83Dj9xw!VLB=utpdbumT;m!} z>>>@YUU9gwnhEODn$4ja;C?b>lF_4L$kS1~uro=;V0dXS1-0u~Ct3>`5VV|_F<^8E z^P6Egz!gm=UGQ9wSLCRM6?KBHu{?jFUwnb0UL5ZK-w@K(dgAN*{@1{(@+$P$u( zo6z*iVH>23aH{b{1MKJnj0dz+5rQ>)o5&|=d+XP_LXs*&F%pLz07~y#68XM>ROBbQ z;L;4p&2^A$y0|%HAJPE95eZ&yu&IsdMlPT&O{#KcxE+wUxJ`|;w zJRPMM!dmD~hMCUI<27^#gA_MekL!Ap8~(PDmLXPSZ$QHoes--oLo4mM`s8Iqvf~`WHGR`v#vmcCJ)uAr1sG9e zHU}EKB>W6K!EG-GTbJ>;%!5b**A-vYS9r{yg_kK?qsf>5g|B zV%xTzRBYR}ZQI5h+qP3(-|6`={_MUm(61mk00%QBQXw!f)hVt-4OM=D63E5d;+3;6GxX|aR>Uq$DkOdmGW+8otC?^ zEfyIkN1dN}A+R-I{( zn~j8!g@@?f&k57wG)V+;nE6$$L(7~++On#zYoXjeLD8_kgH5L&heUr$Uc$*50-^Xd zFR-pQpnR6-Lj>Wv4^2A`QSQEd@6JTXLjA^x+#jb4Z|_!J-(XyEx$wTwBsKq-ETJ^5 zSQwfN6Io-m$NctrH_{8#v~%A>h(&?HAoHTCi=s-AOgIs>Lvz@Haxou@1fbE-Q;VTl zp}%*%-iC?09gB+D?Hbh{Ekv|qG7_kV9RAH{eUTUx9{RFu4|7X34@7CTAp?QxDjYxI znSOG-0uIiB4p_*fkS(EcgT&%80e!rZ#n1e=euloF@-nV4AHyrId<+|on^}|Bk_$oM z>i8YmUT!hd)#(3XfoN$HXBmsK>jNbN0Rbt>o+s1!YMhPeCIV5<2EtEGel1BGZH_vI zDgc#-PNqCEfhr_*H4CUgqY#6NoGqE?Q(9pumcz1PVg3ZFC90XXFzN0L&6+S!FhZju zW`KJJ$%V7X26;_b22w(4vLxD~5q~AdTj$&R$Ml#8B)pN?Qm8?}i#+1cK4`spDLbP)l>>k?q0~TgzA+@lt?OH+r^iJau5|m@&Uo@R zj57PxtZd0Lj8Z$murrTFOAQs*%W+}M>;V9*#dsY%F)LFKc6}%(tzRp-W(^)=`~P{S zb8Hoar8Gm3A+cF@aZbMo9WQ1cr7mt2V6KM~Hf~&FZYtWoQ^_GgLNX>pqp z%!TsBIYW*Waw}EQ!tCr8Oqm6$M`F(Mw3EoM} zq8!c&_7NswLs^`~xcqa#wg=V;6BAeOFVGNhk&vRJ(d1$CH>UusIU3S-L~NW;k5@RDxEQsuU?FU4f>vRLoK4=Xazncnr!<=H2g#)N{ez1+P-P zlK#`Q%lSg%RhJ_a5g2G_vkUl9zaxNKyr}U&g>_o;=ZUe31`Ky&rDZ^s=x5-$P7TR|)hVK8-{#!>*ciY4sAoU6~)j zVyJp;x2Zt{YKUBz6SzdN*oRNLp$~{6w9mHifyarN_l#d-*h9&XdEaP<8cTg8sangU zD$DasEMvcf0rk?K#se$EU1yWSdks2kVY@bP;cG5S4R2wG$}yi4@`jVOmc^%5nf@a? zos~sx}eApr9_KdgN<5SRkkQAbBHxbEVyZTufD zuw-Zz0h$%Ihp@~2Fu)R;zLO%<&PbK1Q@W)wa}{q&Iq(%fgib~yX>buppj)~p+;r{e z>9rF9P)#9RQZe*UGaOt2*scl6?Z)@Pc)pP-0*dD`_Y^dCv-BwYG*VL4#d(YfSKwhp z#JUvKEXQj-C`S~HIb4se6_H#)y{_t$Jawr~&zaS*vw?md2Q=zjPa?(O zHTzp~m+A%c2LV26gY&0+ZC4coZHp>rJyoeSJyc+NXPncMD{4a`>r4j|X55JVw4XLl zZ-X2QmGVc^lMO4ieAOr-M89X<&3h0Ixr-j$)Z3h&Ek4t{kv2~K7db@r{zRi#Ab5=o zq;b1P<;Y-xNqIw8v$v<*btY_K<9MdMO$w01Dhg1g{sH(1u(R)bk#$M%>Ri*xr)hte zd+L@|TC=nOQs60-Zj1aoFXFqy-o}3yF2VN{0CDTpPuS}{hZF-@A}35eJQx#)u0Xi5Gm~2{#e+B z!HX1R%9pwv33dM3ASXskeu2$8DitphrxxaDISNifq{>#L%Z=RQO2c#&hGeyv;2@Td zGSn*fhi|cTwQR}!g%(2Yb5I3AG5jc1>t|UZCKg`*MPwmqA0UV@nnSUHc;OfWY)_tW zc=ACz&pA`$-=PTBU4aM8kR`LOJLpLYvI8Q`|18w@6I%dm!|EhWh-<|1S&<;=qdh1wxGqSU`joQ@OG)K*A z`EX};0ZaWB*`wxy0CHl`J3il!f1S!hR93W4X?+O^wU{ofy_quhLoegyaoVtDw^VN~ zCokU2K3X-|f)%)S_ihZyLgUDBlN%6+zi2I5#< z>l_DWRVPSDe>DZfv~{oh;~Gp0%@0GRVvyh5?6B1*0{mR>LYB@mm=E)&;vMj$GF_uJ zyiFBPUpXPfom2hjn#*54iq1@%5w9wK56exZZcc8JK0onT5IvBF{6_}_)!Ddaf>N&K zl2oT`bo>O|ojGBG(JV93P^}{(*chDCh-hrlN2$EynEC@?iR09W7kf`IFIV5`ueKim zPJZ3lae+R|$e(=b$N`N|y*Y#+4*!q^&8p5nKE~w|m(_SpW$rG;F3ixK6AqU33)5F_ z*f?p%z0;_I-!#5!{3m7e#|lmA#z7|6oTgkef~zgupDk2vv-q@iX^6%gU+?^7==#}M zga;Zc6vgJ82ATPi`4@8( zRJvGI;8A15{2Cn?}wG`qNG&lo_o_Km;HJfo64F zQO{fmm;LDPe|WBqNa2DHAuf7DQzyV& za@#1(vFSrtdUt^R22FsUCabM1;}x_&ZW#F2A*;JPfkphvu4!oNd}`P_1#r&sn>@9XY^;+9uIv%v^$bmUpz@K-hkUK8m7B2f6^k` zhF8Zp1@FhJ>V?CuyD))b6lUkPmF}~GTFvhjc3=~q)C?G9 z(6500%Jv{9NNF@c+9)62*AAy&S(9t?HPU>W(Qadn$ZXwZQ!nQuP1W6^ z9=EyUWoKmp_%>|4^R8fF=J;)0#IAH561k^9HWhg@<&n8-F8@{;tE|BIuinDUAAz)DMVQ{7PNm}i-ieM)l@EJTlHT-gdUi3<6iQlwQx5r>3z~+ zj)C4d85h}*Lw%owZWO?iedKMo(f|n%j4O{Wh+h&#k?8KpKCv~_v3v?rWnSRFK<;=GV()!gm0naj5E74%)?}#yJCWmS zl!~oBvVD*ywy8=jw{c4O5~IzT(siKnQ|Q;^zL-WSyo>E0SA>+v9PBvH`F?sN{pyP5T9EOaiROsNr#c8?JGQ7`tqAo5Hlbtpag$NE~EYtp~ zLSwzg|K{!!GYmq3h~R-Qv_-u}IZhJ2BvnyVGupbui)u7d`JYU870sT>I@wqIYR9tz zn)k6orTRQ&d1mNq_Ad3k&#>nOR1|L_Z5$yo@$UgkICC({amTB~?ILr$?2+2uZxh*g z_-t95ATEoOMLtL!oB?mq^Kpl#$ZjR|jBzKrFfgcY`%qJOu>^_QHoF8tyNp|f<+R852J#PGTO*vb0Sr_MUVY=0BLn}rUG=6}2U zH%?>*l=NFVAax}D`2X;_xh?u91Mxd!cT2eA?m97>6?=fTC{Z8QgL`X|X^#1ypu zr`4TY#K$Wb#~ab-hlr9#!5i5|JN!vv_SxC4W+WH98aX zKN6y$GErDt(2Hd0CT$duC6!ws;`e7X>O7)Qu1cgl;YdCW!D!=nthdO7+A$Fuy%L!X zeQQ+dOc_%s=ZkKkkt7x-0?TATv2@qo8kFlb$)Xk}4N7VY-WjpYii2qzm>RZMWkjyc z-|=cL(wcEK;Qu?*ZR~hGsrkP<-4U_m-z!V@D7@pAcbyezXvx`&q=P&V9B0~&WgjW6 z>E#f0PVp>eF^q5p8u!w7cj^sUAg%#kA@SYE-^?kmG-}vNKS1B+DYLcRiF=UGNx<%hQHILPB){q-f%h?thi1 zpqA-9U!M3MrF(P{Wq;)dV|CNH$b>6NGd1df&5IUI9ejiiewK=4AyzynqQcSV^eXH| z%K}ztR9t?&ApomHeao)|YE2!CGvMMqf^7~yjOem=f@_3~eoT(r#Q>ANESDxBlU;iW z+c@2 zRJD*MLSRu?Ysh4j0L%fKKUxVfagCjdAH~USgBrphtBl`}=UvIA+X>3;7_N-fL8m<= zHDjzq{S%(8*g(ppL#OT}wMoqG*6DxcJw;i4(GTQVj%LiloIXx)Dxyx|X1RRE%qYCP z!w0=jH7X?)bdZYVa(;HBI;f)0hF(IDm#--klUbM+e(VrUjuol!fKI3*lQFv6ce!@Z zv2ws=?>Mbi%39i|&R?nEpQh>Pn4m03&M$9?*BlY?E8Yw~iUPtKi(|eU83nCrxph#2 zZPmGLZ~oSQ!k#s?fEg>>K_u2gP_QZTuN=nT9PKZ6J#$cNMib4kjh!Xu*`^P}W9jQ2 z|D*cii6^&C%F+l6H%%Jt76^W)P%g=)sHw_O)viR4e~jHY_}2w^Gvib(lPHoHmDdw5 zuwT)Jl@rlC5n`vnhghb`!%Z<9e((pqvXiCdN+-=DX1OD~xW-FKCk4iT$N$4*P+yxp2S9~q%M*T=p z{r{`at>Qv+5jx1ag2hZE?J7DQIv^?T-YiIxo73bR!ktGS5Y;mwgs)ndWu#;BF5ViV zSdt2_Yco)UfC;XYjynp{mSR?((Rp&7=~(Utu3;e{VpCPexI(Kkp<@e-TsvK6F;H!< zTP15or&S2#dBe-T&U5xn3XKV88Vc7M%c#YksxzEkCFoiRP#iJUT+oY@z;jsyb}^cj zcA-H@syC07fanRCkd7XYnIL5wIQl}n%xi#(m~<;E8&#!L)bgtEm`pZqf*n?TEh=}8 zZV7bk5>$F4{tD64%}2jbm8NByGjjofn)4UxE8Md^U=+h6E*LmZvBVVQ$eAjZ@CT
    Yz+u98v%|DO}ocOIw~2o?F^X@=OcS1Q$(l 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

      PMVW<_m1g^HE!U_ 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%0ACf83@N}A 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%0D&~9G@oN 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�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 z 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ⅈ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%0AOu~BHSKb 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�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�%uJMKY0UPR*=$idiX5S@-cM=JsRjF&@ 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¬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 Ku^c%7z;OUUbP$37 literal 0 HcmV?d00001 diff --git a/ajax/libs/rxjs/package.json b/ajax/libs/rxjs/package.json index 1a43b8c6e..465d6a70d 100644 --- a/ajax/libs/rxjs/package.json +++ b/ajax/libs/rxjs/package.json @@ -3,7 +3,7 @@ "filename": "rx.min.js", "title": "Reactive Extensions for JavaScript (RxJS)", "description": "Library for composing asynchronous and event-based operations in JavaScript", - "version": "2.2.27", + "version": "2.2.28", "homepage": "https://github.com/Reactive-Extensions/RxJS", "author": { "name": "Cloud Programmability Team",

    5%pcna#iUGbmaIw4nOFa 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 z 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